blob: 7dc7b45b5033bae77310a58be16befdadf6abbaf [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Dustin Brownd9322482017-01-09 12:46:03 -08002 * Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**
29 * DOC: wlan_hdd_wext.c
30 *
31 * Linux Wireless Extensions Implementation
32 */
33
34#include <linux/version.h>
35#include <linux/module.h>
36#include <linux/kernel.h>
37#include <linux/init.h>
38#include <linux/wireless.h>
39#include <mac_trace.h>
40#include <wlan_hdd_includes.h>
41#include <cds_api.h>
Rajeev Kumarea95edd2017-01-11 20:49:36 -080042#include "scheduler_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080043#include <net/arp.h>
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -080044#include <cdp_txrx_cmn.h>
Manjunathappa Prakash3454fd62016-04-01 08:52:06 -070045#include <cdp_txrx_stats.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#include "sir_params.h"
47#include "csr_api.h"
48#include "csr_inside_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080049#include "sme_rrm_internal.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080050#include <ani_global.h>
51#include "dot11f.h"
52#include <wlan_hdd_wowl.h>
53#include <wlan_hdd_cfg.h>
54#include <wlan_hdd_wmm.h>
55#include "utils_api.h"
56#include "wlan_hdd_p2p.h"
57#ifdef FEATURE_WLAN_TDLS
58#include "wlan_hdd_tdls.h"
59#endif
60
61#include "cds_ieee80211_common.h"
62#include "ol_if_athvar.h"
63#include "dbglog_host.h"
64#include "wma.h"
65
66#include "wlan_hdd_power.h"
67#include "qwlan_version.h"
68#include "wlan_hdd_host_offload.h"
69
70#include <linux/wireless.h>
71#include <net/cfg80211.h>
72
73#include "wlan_hdd_misc.h"
74
75#include "qc_sap_ioctl.h"
76#include "sme_api.h"
77#include "wma_types.h"
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053078#include "qdf_trace.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079#include "wlan_hdd_assoc.h"
80#include "wlan_hdd_ioctl.h"
81#include "wlan_hdd_scan.h"
82#include "sme_power_save_api.h"
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080083#include "wlan_policy_mgr_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080084#include "wlan_hdd_conc_ut.h"
Jeff Johnson6fa1e012017-04-05 06:40:53 -070085#include "wlan_hdd_fips.h"
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070086#include "wlan_hdd_tsf.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087#include "wlan_hdd_ocb.h"
88#include "wlan_hdd_napi.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080089#include "cdp_txrx_flow_ctrl_legacy.h"
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070090#include "wlan_hdd_nan_datapath.h"
Nirav Shahbf1b0332016-05-25 14:27:39 +053091#include "wlan_hdd_stats.h"
Rajeev Kumara78a0a42016-07-13 19:28:20 -070092#ifdef WLAN_SUSPEND_RESUME_TEST
93#include "wlan_hdd_driver_ops.h"
94#include "hif.h"
Rajeev Kumar9bb2e852016-09-24 12:29:25 -070095#include "pld_common.h"
Rajeev Kumara78a0a42016-07-13 19:28:20 -070096#endif
Dhanashri Atree7d442a2016-07-14 18:20:29 -070097#include "wlan_hdd_lro.h"
yeshwanth sriram guntuka310b3ac2016-11-15 23:25:26 +053098#include "cds_utils.h"
Jeff Johnsona6ace5b2017-01-23 07:11:02 -080099#include "wlan_hdd_request_manager.h"
Naveen Rawat910726a2017-03-06 11:42:51 -0800100#include "os_if_wifi_pos.h"
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -0800101#include <cdp_txrx_stats.h>
102#include <cds_api.h>
Abhishek Singh0481d662017-04-11 18:20:11 +0530103#include <wlan_osif_priv.h>
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -0700104#include "wlan_hdd_regulatory.h"
105#include "wlan_reg_ucfg_api.h"
Abhishek Singh0481d662017-04-11 18:20:11 +0530106
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800107#define HDD_FINISH_ULA_TIME_OUT 800
108#define HDD_SET_MCBC_FILTERS_TO_FW 1
109#define HDD_DELETE_MCBC_FILTERS_FROM_FW 0
110
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800111/* To Validate Channel against the Frequency and Vice-Versa */
Srinivas Girigowda48592672017-03-25 14:58:44 -0700112static const struct ccp_freq_chan_map freq_chan_map[] = {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800113 {2412, 1}, {2417, 2}, {2422, 3}, {2427, 4}, {2432, 5}, {2437, 6},
114 {2442, 7}, {2447, 8}, {2452, 9}, {2457, 10}, {2462, 11}, {2467, 12},
115 {2472, 13}, {2484, 14}, {4920, 240}, {4940, 244}, {4960, 248},
116 {4980, 252}, {5040, 208}, {5060, 212}, {5080, 216}, {5180, 36},
117 {5200, 40}, {5220, 44}, {5240, 48}, {5260, 52}, {5280, 56},
118 {5300, 60}, {5320, 64}, {5500, 100}, {5520, 104}, {5540, 108},
119 {5560, 112}, {5580, 116}, {5600, 120}, {5620, 124}, {5640, 128},
120 {5660, 132}, {5680, 136}, {5700, 140}, {5720, 144}, {5745, 149},
121 {5765, 153}, {5785, 157}, {5805, 161}, {5825, 165}, {5852, 170},
122 {5855, 171}, {5860, 172}, {5865, 173}, {5870, 174}, {5875, 175},
123 {5880, 176}, {5885, 177}, {5890, 178}, {5895, 179}, {5900, 180},
124 {5905, 181}, {5910, 182}, {5915, 183}, {5920, 184} };
125
Srinivas Girigowdafba82a02017-03-24 21:26:35 -0700126#define FREQ_CHAN_MAP_TABLE_SIZE QDF_ARRAY_SIZE(freq_chan_map)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127
128/* Private ioctls and their sub-ioctls */
129#define WLAN_PRIV_SET_INT_GET_NONE (SIOCIWFIRSTPRIV + 0)
130#define WE_SET_11D_STATE 1
131#define WE_WOWL 2
132#define WE_SET_POWER 3
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530133/*
134 * <ioctl>
135 * setMaxAssoc - Sets the maximum number of associated stations
136 *
137 * @INPUT: 1 to 32
138 *
139 * @OUTPUT: None
140 *
141 * This IOTCL sets the maximum number of associated stations
142 *
143 * @E.g: iwpriv wlan0 setMaxAssoc <value>
144 *
145 * Supported Feature: STA
146 *
147 * Usage: Internal/External
148 *
149 * </ioctl>
150 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800151#define WE_SET_MAX_ASSOC 4
yeshwanth sriram guntukabdfe4352017-02-16 14:44:31 +0530152/*
153 * <ioctl>
154 * scan_diable - Disable scan
155 *
156 * @INPUT: set_value
157 *
158 * @OUTPUT: None
159 *
160 * This IOCTL is used to set disable scan
161 *
162 * @E.g: iwpriv wlan0 scan_disable 1
163 *
164 * Supported Feature: Scan
165 *
166 * Usage: Internal/External
167 *
168 * </ioctl>
169 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800170#define WE_SET_SCAN_DISABLE 5
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530171/*
172 * <ioctl>
173 * inactivityTO - sets the timeout value for inactivity data while
174 * in power save mode
175 *
176 * @INPUT: int1…..int255
177 *
178 * @OUTPUT: None
179 *
180 * This IOCTL set the timeout value for inactivity data in power save mode
181 *
182 * @E.g: iwpriv wlan0 inactivityTO 20
183 *
184 * Supported Feature: STA
185 *
186 * Usage: Internal/External
187 *
188 * </ioctl>
189 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800190#define WE_SET_DATA_INACTIVITY_TO 6
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530191/*
192 * <ioctl>
193 * setMaxTxPower - Dynamically sets the maximum transmission power
194 *
195 * @INPUT: Transmission power in dBm
196 *
197 * @OUTPUT: None
198 *
199 * This IOCTL dynamically sets the maximum transmission power
200 * This setting does not persist over reboots
201 *
202 * @E.g: iwpriv wlan0 setMaxTxPower <value in db)
203 *
204 * Supported Feature: STA
205 *
206 * Usage: Internal/External
207 *
208 * </ioctl>
209 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210#define WE_SET_MAX_TX_POWER 7
211#define WE_SET_HIGHER_DTIM_TRANSITION 8
212#define WE_SET_TM_LEVEL 9
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530213/*
214 * <ioctl>
215 * setphymode - Set the phymode dynamically
216 *
217 * @INPUT: 0 IEEE80211_MODE_AUTO to 22 IEEE80211_MODE_11AGN
218 *
219 * @OUTPUT: None
220 *
221 * This IOCTL sets the phymode dynamically
222 *
223 * @E.g: iwpriv wlan0 setphymode 10
224 *
225 * Supported Feature: STA
226 *
227 * Usage: Internal/External
228 *
229 * </ioctl>
230 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231#define WE_SET_PHYMODE 10
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530232/*
233 * <ioctl>
234 * nss - Set the number of spatial streams
235 *
236 * @INPUT: int1…..int3
237 *
238 * @OUTPUT: None
239 *
240 * This IOCTL sets the number of spatial streams. Supported values are 1 and 2
241 *
242 * @E.g: iwpriv wlan0 nss 2
243 *
244 * Supported Feature: STA
245 *
246 * Usage: Internal/External
247 *
248 * </ioctl>
249 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250#define WE_SET_NSS 11
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530251/*
252 * <ioctl>
253 * ldpc - Enables or disables LDPC
254 *
255 * @INPUT: 0 – Disable, 1 - Enable
256 *
257 * @OUTPUT: None
258 *
259 * This IOCTL enables or disables LDPC
260 *
261 * @E.g: iwpriv wlan0 ldpc 1
262 *
263 * Supported Feature: STA
264 *
265 * Usage: Internal/External
266 *
267 * </ioctl>
268 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800269#define WE_SET_LDPC 12
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530270/*
271 * <ioctl>
272 * tx_stbc - Enables or disables tx_stbc
273 *
274 * @INPUT: Int 0 – Disable, 1 - Enable
275 *
276 * @OUTPUT: None
277 *
278 * This IOTCL used to enables or disables tx_stbc
279 *
280 * @E.g: iwpriv wlan0 tx_stbc <value>
281 *
282 * Supported Feature: STA
283 *
284 * Usage: Internal/External
285 *
286 * </ioctl>
287 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800288#define WE_SET_TX_STBC 13
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530289/*
290 * <ioctl>
291 * rx_stbc - Set the rx_stbc parameter
292 *
293 * @INPUT: Int 0 – Disable, 1 - Enable
294 *
295 * @OUTPUT: None
296 *
297 * This IOTCL used to set rx_stbc parameter
298 *
299 * @E.g: iwpriv wlan0 rx_stbc <value>
300 *
301 * Supported Feature: STA
302 *
303 * Usage: Internal/External
304 *
305 * </ioctl>
306 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800307#define WE_SET_RX_STBC 14
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530308/*
309 * <ioctl>
310 * shortgi - Enables or disables a short-guard interval
311 *
312 * @INPUT: Int 0 – Disable, 1 - Enable
313 *
314 * @OUTPUT: None
315 *
316 * This IOCTL enables or disables a short-guard interval.
317 *
318 * @E.g: iwpriv wlan0 shortgi <value>
319 *
320 * Supported Feature: STA
321 *
322 * Usage: Internal/External
323 *
324 * </ioctl>
325 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800326#define WE_SET_SHORT_GI 15
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530327/*
328 * <ioctl>
329 * enablertscts - enables or disables rts/cts.
330 *
331 * @INPUT: 1-Enable , 0-Disable
332 *
333 * @OUTPUT: None
334 *
335 * This IOCTL enables or disables rts/cts.
336 *
337 * @E.g: iwpriv wlan0 enablertscts <value>
338 *
339 * Supported Feature: STA
340 *
341 * Usage: Internal/External
342 *
343 * </ioctl>
344 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800345#define WE_SET_RTSCTS 16
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530346/*
347 * <ioctl>
348 * chwidth - Set the channel bandwidth
349 *
350 * @INPUT: 0-20mhz to 3-160mhz
351 *
352 * @OUTPUT: None
353 *
354 * This IOTCL used to set the channel bandwidth
355 *
356 * @E.g: iwpriv wlan0 chwidth 1
357 *
358 * Supported Feature: STA
359 *
360 * Usage: Internal/External
361 *
362 * </ioctl>
363 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364#define WE_SET_CHWIDTH 17
365#define WE_SET_ANI_EN_DIS 18
366#define WE_SET_ANI_POLL_PERIOD 19
367#define WE_SET_ANI_LISTEN_PERIOD 20
368#define WE_SET_ANI_OFDM_LEVEL 21
369#define WE_SET_ANI_CCK_LEVEL 22
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530370/*
371 * <ioctl>
372 * cwmenable - Enables or disables the dynamic channel bandwidth
373 *
374 * @INPUT: 0-Disable, 1-Enable
375 *
376 * @OUTPUT: None
377 *
378 * This IOTCL used to enables or disables the dynamic channel bandwidth
379 *
380 * @E.g: iwpriv wlan0 cwmenable <value>
381 *
382 * Supported Feature: STA
383 *
384 * Usage: Internal/External
385 *
386 * </ioctl>
387 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800388#define WE_SET_DYNAMIC_BW 23
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530389/*
390 * <ioctl>
391 * txchainmask - This IOCTL sets the current Tx chain mask
392 *
393 * @INPUT: Mask Value
394 *
395 * @OUTPUT: None
396 *
397 * This IOCTL sets the current Tx chain mask
398 *
399 * @E.g: iwpriv wlan0 txchainmask 1
400 *
401 * Supported Feature: STA
402 *
403 * Usage: Internal/External
404 *
405 * </ioctl>
406 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800407#define WE_SET_TX_CHAINMASK 24
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530408/*
409 * <ioctl>
410 * rxchainmask - Sets the current Rx chain mask
411 *
412 * @INPUT: Mask Value
413 *
414 * @OUTPUT: None
415 *
416 * This IOCTL sets the current Rx chain mask. This command is the
417 * equivalent to setting in gSetRxChainmask1x1 in WCNSS_qcom_cfg.ini.
418 *
419 * @E.g: iwpriv wlan0 rxchainmask <value>
420 *
421 * Supported Feature: STA
422 *
423 * Usage: Internal/External
424 *
425 * </ioctl>
426 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800427#define WE_SET_RX_CHAINMASK 25
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530428/*
429 * <ioctl>
430 * set11NRates - Fixes the Tx data rate of the 11N mode.
431 *
432 * @INPUT: 0x1b to 0x8f
433 *
434 * @OUTPUT: None
435 *
436 * This IOCTL fixes the Tx data rate of the 11N mode.
437 *
438 * @E.g: iwpriv wlan0 set11NRates 0x85
439 *
440 * Supported Feature: STA
441 *
442 * Usage: Internal/External
443 *
444 * </ioctl>
445 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800446#define WE_SET_11N_RATE 26
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530447/*
448 * <ioctl>
449 * ampdu - Set the the maximum subframe of ampdu
450 *
451 * @INPUT: int 1 to int 63
452 *
453 * @OUTPUT: None
454 *
455 * This IOCTL sets the maximum subframe of ampdu.
456 *
457 * @E.g: iwpriv wlan0 ampdu 9
458 *
459 * Supported Feature: STA
460 *
461 * Usage: Internal/External
462 *
463 * </ioctl>
464 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800465#define WE_SET_AMPDU 27
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530466/*
467 * <ioctl>
468 * amsdu - Sets the maximum subframe of amsdu.
469 *
470 * @INPUT: int 1 to int 31
471 *
472 * @OUTPUT: None
473 *
474 * This IOCTL sets the maximum subframe of amsdu.
475 *
476 * @E.g: iwpriv wlan0 amsdu 9
477 *
478 * Supported Feature: STA
479 *
480 * Usage: Internal/External
481 *
482 * </ioctl>
483 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800484#define WE_SET_AMSDU 28
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530485/*
486 * <ioctl>
487 * txpow2g - current 2 GHz Tx power setting
488 *
489 * @INPUT: Tx power in dBm
490 *
491 * @OUTPUT: None
492 *
493 * This IOTCL used to set 2 ghz tx power
494 *
495 * @E.g: iwpriv wlan0 txpow2g
496 *
497 * Supported Feature: STA
498 *
499 * Usage: Internal/External
500 *
501 * </ioctl>
502 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800503#define WE_SET_TXPOW_2G 29
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530504/*
505 * <ioctl>
506 * txpow5g - Current 5 GHz tx power setting
507 *
508 * @INPUT: Tx power in dBm
509 *
510 * @OUTPUT: None
511 *
512 * This IOTCL used to set the 5 ghz txpower
513 *
514 * @E.g: iwpriv wlan0 txpow5g
515 *
516 * Supported Feature: STA
517 *
518 * Usage: Internal/External
519 *
520 * </ioctl>
521 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800522#define WE_SET_TXPOW_5G 30
523/* Private ioctl for firmware debug log */
524#define WE_DBGLOG_LOG_LEVEL 31
525#define WE_DBGLOG_VAP_ENABLE 32
526#define WE_DBGLOG_VAP_DISABLE 33
527#define WE_DBGLOG_MODULE_ENABLE 34
528#define WE_DBGLOG_MODULE_DISABLE 35
529#define WE_DBGLOG_MOD_LOG_LEVEL 36
530#define WE_DBGLOG_TYPE 37
531#define WE_SET_TXRX_FWSTATS 38
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530532/*
533 * <ioctl>
534 * set11ACRates - Fixes the Tx data rate of 11AC
535 *
536 * @INPUT: 0x1 to 0x9
537 *
538 * @OUTPUT: None
539 *
540 * This IOCTL fixes the Tx data rate of 11AC.
541 *
542 * @E.g: iwpriv wlan0 set11ACRates 0x9
543 *
544 * Supported Feature: STA
545 *
546 * Usage: Internal/External
547 *
548 * </ioctl>
549 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800550#define WE_SET_VHT_RATE 39
551#define WE_DBGLOG_REPORT_ENABLE 40
552#define WE_TXRX_FWSTATS_RESET 41
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530553/*
554 * <ioctl>
555 * setTxMaxPower2G - Set the maximum transmit power for the 2.4-GHz band
556 *
557 * @INPUT: Transmission power in dBm
558 *
559 * @OUTPUT: None
560 *
561 * This IOCTL sets the maximum transmit power for the 2.4-GHz band
562 * This setting does not persist over reboots
563 *
564 * @E.g: iwpriv wlan0 setTxMaxPower2G 10
565 *
566 * Supported Feature: STA
567 *
568 * Usage: Internal/External
569 *
570 * </ioctl>
571 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800572#define WE_SET_MAX_TX_POWER_2_4 42
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530573/*
574 * <ioctl>
575 * setTxMaxPower5G - Set the maximum transmit power for the 5-GHz band
576 *
577 * @INPUT: Transmission power in dBm
578 *
579 * @OUTPUT: None
580 *
581 * This IOCTL sets the maximum transmit power for the 5-GHz band
582 * This setting does not persist over reboots
583 *
584 * @E.g: iwpriv wlan0 setTxMaxPower5G 10
585 *
586 * Supported Feature: STA
587 *
588 * Usage: Internal/External
589 *
590 * </ioctl>
591 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800592#define WE_SET_MAX_TX_POWER_5_0 43
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -0800593#define WE_SET_PKTLOG 44
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800594/* Private ioctl for packet powe save */
595#define WE_PPS_PAID_MATCH 45
596#define WE_PPS_GID_MATCH 46
597#define WE_PPS_EARLY_TIM_CLEAR 47
598#define WE_PPS_EARLY_DTIM_CLEAR 48
599#define WE_PPS_EOF_PAD_DELIM 49
600#define WE_PPS_MACADDR_MISMATCH 50
601#define WE_PPS_DELIM_CRC_FAIL 51
602#define WE_PPS_GID_NSTS_ZERO 52
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530603/*
604 * <ioctl>
605 * rssi_chk - Chek the rssi
606 *
607 * @INPUT: One argument as input
608 *
609 * @OUTPUT: rssi
610 * wlan0 rssi_chk:56
611 *
612 * This IOTCL used to chek rssi
613 *
614 * @E.g: iwpriv wlan0 rssi_chk <value>
615 *
616 * Supported Feature: STA
617 *
618 * Usage: Internal/External
619 *
620 * </ioctl>
621 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800622#define WE_PPS_RSSI_CHECK 53
623#define WE_SET_SAP_AUTO_CHANNEL_SELECTION 54
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530624/*
625 * <ioctl>
626 * htsmps - Sets the htsmps
627 *
628 * @INPUT: Atleast one int argument
629 *
630 * @OUTPUT: None
631 *
632 * This IOTCL used to set htsmps
633 *
634 * @E.g: iwpriv wlan0 htsmps <value>
635 *
636 * Supported Feature: STA
637 *
638 * Usage: Internal/External
639 *
640 * </ioctl>
641 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800642#define WE_SET_HTSMPS 55
643/* Private ioctl for QPower */
644#define WE_SET_QPOWER_MAX_PSPOLL_COUNT 56
645#define WE_SET_QPOWER_MAX_TX_BEFORE_WAKE 57
646#define WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 58
647#define WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 59
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530648/*
649 * <ioctl>
650 * burst_enable - Enables or disables the burst feature
651 *
652 * @INPUT: 0-Disable, 1-Enable
653 *
654 * @OUTPUT: None
655 *
656 * This IOCTL enables or disables the burst feature.
657 *
658 * @E.g: iwpriv wlan0 burst_enable 0
659 *
660 * Supported Feature: STA
661 *
662 * Usage: Internal/External
663 *
664 * </ioctl>
665 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800666#define WE_SET_BURST_ENABLE 60
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530667/*
668 * <ioctl>
669 * burst_dur - Enables or disables the burst feature
670 *
671 * @INPUT: int 1…..int 8191 in microseconds
672 *
673 * @OUTPUT: None
674 *
675 * This IOCTL sets the burst duration.
676 *
677 * @E.g: iwpriv wlan0 burst_dur <value>
678 *
679 * Supported Feature: STA
680 *
681 * Usage: Internal/External
682 *
683 * </ioctl>
684 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800685#define WE_SET_BURST_DUR 61
686/* GTX Commands */
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530687/*
688 * <ioctl>
689 * gtxHTMcs - Set the tx HTM value
690 *
691 * @INPUT: Atleast one int orgument
692 *
693 * @OUTPUT: None
694 *
695 * This IOTCL sets htm tx value
696 *
697 * @E.g: iwpriv wlan0 gtxHTMcs <value>
698 *
699 * Supported Feature: STA
700 *
701 * Usage: Internal/External
702 *
703 * </ioctl>
704 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800705#define WE_SET_GTX_HT_MCS 62
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530706/*
707 * <ioctl>
708 * gtxVHTMcs - Set gtxVHTMcs value
709 *
710 * @INPUT: Atleast one int argument
711 *
712 * @OUTPUT: None
713 *
714 * This IOTCL used to set gtxVHTMcs value
715 *
716 * @E.g: iwpriv wlan0 gtxVHTMcs <value>
717 *
718 * Supported Feature: STA
719 *
720 * Usage: Internal/External
721 *
722 * </ioctl>
723 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800724#define WE_SET_GTX_VHT_MCS 63
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530725/*
726 * <ioctl>
727 * gtxUsrCfg - Host request for GTX mask
728 *
729 * @INPUT: Atleast one int orgument
730 *
731 * @OUTPUT: None
732 *
733 * This IOTCL used send the host request for GTX mask
734 *
735 * @E.g: iwpriv wlan0 gtxUsrCfg <value>
736 *
737 * Supported Feature: STA
738 *
739 * Usage: Internal/External
740 *
741 * </ioctl>
742 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800743#define WE_SET_GTX_USRCFG 64
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530744/*
745 * <ioctl>
746 * gtxThre - Set the tx threshold
747 *
748 * @INPUT: Atleast one int argument
749 *
750 * @OUTPUT: None
751 *
752 * This IOTCL used to set tx threshold
753 *
754 * @E.g: iwpriv wlan0 gtxThre <value>
755 *
756 * Supported Feature: STA
757 *
758 * Usage: Internal/External
759 *
760 * </ioctl>
761 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800762#define WE_SET_GTX_THRE 65
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530763/*
764 * <ioctl>
765 * gtxMargin - Set the gtxMargin
766 *
767 * @INPUT: 1 to 32
768 *
769 * @OUTPUT: None
770 *
771 * This IOTCL use dto set gtxMargin
772 *
773 * @E.g: iwpriv wlan0 gtxMargini <value>
774 *
775 * Supported Feature: STA
776 *
777 * Usage: Internal/External
778 *
779 * </ioctl>
780 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800781#define WE_SET_GTX_MARGIN 66
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530782/*
783 * <ioctl>
784 * gtxStep - Set the gtxStep
785 *
786 * @INPUT: None
787 *
788 * @OUTPUT: None
789 *
790 * This IOTCL used to sets gtxStep
791 *
792 * @E.g: iwpriv wlan0 gtxStep <value>
793 *
794 * Supported Feature: STA
795 *
796 * Usage: Internal/External
797 *
798 * </ioctl>
799 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800#define WE_SET_GTX_STEP 67
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530801/*
802 * <ioctl>
803 * gtxMinTpc - Sets the gtxMinTpc
804 *
805 * @INPUT: Atleast one int argument
806 *
807 * @OUTPUT: None
808 *
809 * This IOTCL sets the tx MinTpc
810 *
811 * @E.g: iwpriv wlan0 gtxMinTpc <value>
812 *
813 * Supported Feature: STA
814 *
815 * Usage: Internal/External
816 *
817 * </ioctl>
818 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800819#define WE_SET_GTX_MINTPC 68
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530820/*
821 * <ioctl>
822 * gtxBWMask - Sets the BW mask (20/40/80/160 Mhz)
823 *
824 * @INPUT: Mask value
825 *
826 * @OUTPUT: None
827 *
828 * This IOTCL used to set gtxBWMask
829 *
830 * @E.g: iwpriv wlan0 gtxBWMask <value>
831 *
832 * Supported Feature: STA
833 *
834 * Usage: Internal/External
835 *
836 * </ioctl>
837 */
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530838
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530839#define WE_SET_GTX_BWMASK 69
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530840/*
841 * <ioctl>
842 * setMccLatency - Sets the MCC latency value during STA-P2P concurrency
843 *
844 * @INPUT: set_value
845 *
846 * @OUTPUT: None
847 *
848 * This IOCTL is used to set the MCC latency value in milliseconds
849 * during STA-P2P concurrency.
850 *
851 * If 0ms latency is provided, then FW will set to a default.
852 * Otherwise, latency must be at least 30ms.
853 *
854 * @E.g: iwpriv wlan0 setMccLatency 40
855 *
856 *
857 * Supported Feature: Concurrency
858 *
859 * Usage: Internal/External
860 *
861 * </ioctl>
862 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800863#define WE_MCC_CONFIG_LATENCY 70
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530864
865/*
866 * <ioctl>
867 * setMccQuota- Set the quota for P2P cases
868 *
869 * @INPUT: set_value [0,100]
870 *
871 * @OUTPUT: None
872 *
873 * This IOCTL is used to set the quota in milliseconds for P2P_GO/STA.
874 *
875 * Currently used to set time quota for 2 MCC vdevs/adapters using
876 * (operating channel, quota) for each mode.
877 * The info is provided run time using iwpriv command:
878 * iwpriv <wlan0 | p2p0> setMccQuota <quota in ms>.
879 * Note: the quota provided in command is for the same mode in cmd.
880 * HDD checks if MCC mode is active, gets the second mode and its
881 * operating chan.
882 * Quota for the 2nd role is calculated as 100 - quota of first mode.
883 *
884 * @E.g: iwpriv wlan0 setMccQuota 50
885 * iwpriv p2p0 setMccQuota 50
886 *
887 * Supported Feature: Concurrency
888 *
889 * Usage: Internal/External
890 *
891 * </ioctl>
892 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800893#define WE_MCC_CONFIG_QUOTA 71
894/* Private IOCTL for debug connection issues */
895#define WE_SET_DEBUG_LOG 72
896#ifdef WE_SET_TX_POWER
897#undef WE_SET_TX_POWER
898#endif
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530899/*
900 * <ioctl>
901 * setTxPower - Set the current transmit power
902 *
903 * @INPUT: Transmission power in dBm
904 *
905 * @OUTPUT: None
906 *
907 * This IOCTL sets the current transmit power.
908 * This setting does not persist over reboots.
909 *
910 * @E.g: iwpriv wlan0 setTxPower 10
911 *
912 * Supported Feature: STA
913 *
914 * Usage: Internal/External
915 *
916 * </ioctl>
917 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918#define WE_SET_TX_POWER 74
919/* Private ioctl for earlyrx power save feature */
920#define WE_SET_EARLY_RX_ADJUST_ENABLE 75
921#define WE_SET_EARLY_RX_TGT_BMISS_NUM 76
922#define WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE 77
923#define WE_SET_EARLY_RX_SLOP_STEP 78
924#define WE_SET_EARLY_RX_INIT_SLOP 79
925#define WE_SET_EARLY_RX_ADJUST_PAUSE 80
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530926/*
927 * <ioctl>
928 * setMcRate - Set the data rate for multicast data
929 *
930 * @INPUT: 1 to 32
931 *
932 * @OUTPUT: None
933 *
934 * This IOCTL sets the data rate for multicast data. Note that this command
935 * is allowed only in STA, IBSS, or QCMobileAP mode
936 *
937 * @E.g: iwpriv wlan0 setMcRate <value>
938 *
939 * Supported Feature: STA
940 *
941 * Usage: Internal/External
942 *
943 * </ioctl>
944 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945#define WE_SET_MC_RATE 81
946#define WE_SET_EARLY_RX_DRIFT_SAMPLE 82
947/* Private ioctl for packet power save */
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530948/*
949 * <ioctl>
950 * 5g_ebt - Sets the 5g_ebt
951 *
952 * @INPUT: <value>
953 *
954 * @OUTPUT: None
955 *
956 * This IOTCL used to set 5g_ebt
957 *
958 * @E.g: iwpriv wlan0 5g_ebt <value>
959 *
960 * Supported Feature: STA
961 *
962 * Usage: Internal/External
963 *
964 * </ioctl>
965 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800966#define WE_PPS_5G_EBT 83
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530967/*
968 * <ioctl>
969 * cts_cbw - Set CTS channel BW for dynamic BW adjustment
970 *
971 * @INPUT: 20 t0 160
972 *
973 * @OUTPUT: None
974 *
975 * This IOTCL used to set CTS channel BW for dynamic BW adjustment
976 *
977 * @E.g: iwpriv wlan0 cts_cbw <value>
978 *
979 * Supported Feature: STA
980 *
981 * Usage: Internal/External
982 *
983 * </ioctl>
984 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800985#define WE_SET_CTS_CBW 84
986#define WE_DUMP_STATS 85
987#define WE_CLEAR_STATS 86
Govind Singha471e5e2015-10-12 17:11:14 +0530988/* Private sub ioctl for starting/stopping the profiling */
989#define WE_START_FW_PROFILE 87
Mukul Sharmaed92f2f2017-04-20 00:06:28 +0530990
Abhishek Singh3c507012016-12-01 11:15:42 +0530991/*
992 * <ioctl>
993 * setChanChange - Initiate channel change
994 *
995 * @INPUT: channel number to switch to.
996 *
997 * @OUTPUT: None
998 *
999 * This IOCTL is used to initiate a channel change.
1000 * If called on STA/CLI interface it will send the
1001 * ECSA action frame to the connected SAP/GO asking to
1002 * initiate the ECSA, if supported.
1003 * If called on SAP/GO interface it will initiate
1004 * ECSA and ask connected peers to move to new channel.
1005 *
1006 * @E.g: iwpriv wlan0 setChanChange <channel>
1007 * iwpriv wlan0 setChanChange 1
1008 *
1009 * Supported Feature: ECSA
1010 *
1011 * Usage: Internal/External
1012 *
1013 * </ioctl>
1014 */
Abhishek Singh1bdb1572015-10-16 16:24:19 +05301015#define WE_SET_CHANNEL 88
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05301016#define WE_SET_CONC_SYSTEM_PREF 89
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08001017#define WE_SET_TXRX_STATS 90
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001018
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08001019/*
1020 * <ioctl>
1021 * set_11ax_rate - set 11ax rates to FW
1022 *
1023 * @INPUT: rate code
1024 *
1025 * @OUTPUT: None
1026 *
1027 * This IOCTL fixes the Tx data rate of 11AX.
1028 *
1029 * @E.g: iwpriv wlan0 set_11ax_rate <rate code>
1030 *
1031 * Supported Feature: STA/SAP
1032 *
1033 * Usage: Internal
1034 *
1035 * </ioctl>
1036 */
1037#define WE_SET_11AX_RATE 91
1038
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001039/*
1040 * <ioctl>
1041 * enable_dcm - enable Dual Carrier Modulation(DCM)
1042 *
1043 * @INPUT: 0/1
1044 *
1045 * @OUTPUT: None
1046 *
1047 * This IOCTL enables/disables DCM.
1048 *
1049 * @E.g: iwpriv wlan0 enable_dcm <0/1>
1050 *
1051 * Supported Feature: STA/SAP
1052 *
1053 * Usage: Internal
1054 *
1055 * </ioctl>
1056 */
1057#define WE_SET_DCM 92
1058
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001059/*
1060 * <ioctl>
1061 * enable_range_ext - enable Range extension
1062 *
1063 * @INPUT: 0/1
1064 *
1065 * @OUTPUT: None
1066 *
1067 * This IOCTL enables/disables Range extension.
1068 *
1069 * @E.g: iwpriv wlan0 enable_range_ext <0/1>
1070 *
1071 * Supported Feature: STA/SAP
1072 *
1073 * Usage: Internal
1074 *
1075 * </ioctl>
1076 */
1077#define WE_SET_RANGE_EXT 93
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001078
Mukul Sharmaed92f2f2017-04-20 00:06:28 +05301079/*
1080 * <ioctl>
1081 * wow_ito - sets the timeout value for inactivity data while
1082 * in power save mode during wow
1083 *
1084 * @INPUT: int
1085 *
1086 * @OUTPUT: None
1087 *
1088 * This IOCTL set the timeout value for inactivity data in power save mode
1089 *
1090 * @E.g: iwpriv wlan0 wow_ito 20
1091 *
1092 * Supported Feature: STA
1093 *
1094 * Usage: External
1095 *
1096 * </ioctl>
1097*/
1098#define WE_SET_WOW_DATA_INACTIVITY_TO 94
1099
1100
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001101/* Private ioctls and their sub-ioctls */
1102#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
1103#define WE_GET_11D_STATE 1
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001104#define WE_SET_SAP_CHANNELS 3
1105#define WE_GET_WLAN_DBG 4
1106#define WE_GET_MAX_ASSOC 6
1107/* 7 is unused */
1108#define WE_GET_SAP_AUTO_CHANNEL_SELECTION 8
Nitesh Shahc87a7a82016-12-14 11:37:55 +05301109
1110/*
1111 * <ioctl>
1112 * getconcurrency - Get concurrency mode
1113 *
1114 * @INPUT: None
1115 *
1116 * @OUTPUT: It shows concurrency value
1117 * Bit 0:STA 1:SAP 2:P2P_Client 3:P2P_GO
1118 * 4:FTM 5:IBSS 6:Monitor 7:P2P_Device
1119 * 8:OCB 9:EPPING 10:QVIT 11:NDI
1120 *
1121 * This IOCTL is used to retrieve concurrency mode.
1122 *
1123 * @E.g: iwpriv wlan0 getconcurrency
1124 * wlan0 getconcurrency:5
1125 * Above value shows STA+P2P_Client
1126 *
1127 * Supported Feature: Concurrency
1128 *
1129 * Usage: Internal/External
1130 *
1131 * </ioctl>
1132 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001133#define WE_GET_CONCURRENCY_MODE 9
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301134/*
1135 * <ioctl>
1136 * get_nss - Get the number of spatial STBC streams (NSS)
1137 *
1138 * @INPUT: None
1139 *
1140 * @OUTPUT: NSS
1141 * wlan0 get_nss:2
1142 *
1143 * This IOTCL used to get the number of spatial STBC streams
1144 *
1145 * @E.g: iwpriv wlan0 get_nss
1146 *
1147 * Supported Feature: STA
1148 *
1149 * Usage: Internal/External
1150 *
1151 * </ioctl>
1152 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001153#define WE_GET_NSS 11
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301154/*
1155 * <ioctl>
1156 * get_ldpc - This IOCTL gets the low density parity check (LDPC)
1157 *
1158 * @INPUT: None
1159 *
1160 * @OUTPUT: ldpc
1161 * wlan0 get_ldpc:1
1162 *
1163 * This IOTCL used to gets the low density parity check (LDPC)
1164 *
1165 * @E.g: iwpriv wlan0 get_ldpc
1166 *
1167 * Supported Feature: STA
1168 *
1169 * Usage: Internal/External
1170 *
1171 * </ioctl>
1172 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173#define WE_GET_LDPC 12
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301174/*
1175 * <ioctl>
1176 * get_tx_stbc - Get the value of the current Tx space time block code (STBC)
1177 *
1178 * @INPUT: None
1179 *
1180 * @OUTPUT: TXSTBC
1181 * wlan0 get_tx_stbc:1
1182 *
1183 * This IOTCL get the value of the current Tx space time block code (STBC)
1184 *
1185 * @E.g: iwpriv wlan0 get_tx_stbc
1186 *
1187 * Supported Feature: STA
1188 *
1189 * Usage: Internal/External
1190 *
1191 * </ioctl>
1192 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001193#define WE_GET_TX_STBC 13
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301194/*
1195 * <ioctl>
1196 * get_rx_stbc - Gets the value of the current Rx STBC
1197 *
1198 * @INPUT: None
1199 *
1200 * @OUTPUT: Rx STBC
1201 * wlan0 get_rx_stbc:1
1202 *
1203 * This IOTCL used to get the value of the current Rx STBC
1204 *
1205 * @E.g: iwpriv wlan0 get_rx_stbc
1206 *
1207 * Supported Feature: STA
1208 *
1209 * Usage: Internal/External
1210 *
1211 * </ioctl>
1212 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213#define WE_GET_RX_STBC 14
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301214/*
1215 * <ioctl>
1216 * get_shortgi - Get the value of the current short GI setting
1217 *
1218 * @INPUT: None
1219 *
1220 * @OUTPUT: Enable/disable of shortgi
1221 * wlan0 get_shortgi:1
1222 *
1223 * This IOCTL gets the value of the current short GI setting
1224 *
1225 * @E.g: iwpriv wlan0 get_shortgi
1226 *
1227 * Supported Feature: STA
1228 *
1229 * Usage: Internal/External
1230 *
1231 * </ioctl>
1232 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001233#define WE_GET_SHORT_GI 15
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301234/*
1235 * <ioctl>
1236 * get_rtscts - Get the value of the current RTS/CTS setting.
1237 *
1238 * @INPUT: None
1239 *
1240 * @OUTPUT: Enable/disable of RTS/CTS
1241 * wlan0 get_rtscts:33
1242 *
1243 * This IOTCL get the value of the current RTS/CTS setting.
1244 *
1245 * @E.g: iwpriv wlan0 get_rtscts
1246 *
1247 * Supported Feature: STA
1248 *
1249 * Usage: Internal/External
1250 *
1251 * </ioctl>
1252 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253#define WE_GET_RTSCTS 16
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301254/*
1255 * <ioctl>
1256 * get_chwidth - Get the current channel width setting
1257 *
1258 * @INPUT: None
1259 *
1260 * @OUTPUT: channel width
1261 * wlan0 get_chwidth:0
1262 *
1263 * This IOTCL get the current channel width setting.
1264 *
1265 * @E.g: iwpriv wlan0 get_chwidth
1266 *
1267 * Supported Feature: STA
1268 *
1269 * Usage: Internal/External
1270 *
1271 * </ioctl>
1272 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001273#define WE_GET_CHWIDTH 17
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301274/*
1275 * <ioctl>
1276 * get_anienable - Get the anienable
1277 *
1278 * @INPUT: None
1279 *
1280 * @OUTPUT:
1281 * wlan0 get_anienable:0
1282 *
1283 * This IOTCL get the anienable
1284 *
1285 * @E.g: iwpriv wlan0 get_anienable
1286 *
1287 * Supported Feature: STA
1288 *
1289 * Usage: Internal/External
1290 *
1291 * </ioctl>
1292 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001293#define WE_GET_ANI_EN_DIS 18
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301294/*
1295 * <ioctl>
1296 * get_aniplen - Get the aniplen
1297 *
1298 * @INPUT: None
1299 *
1300 * @OUTPUT:
1301 * wlan0 get_aniplen:0
1302 *
1303 * This IOTCL get the aniplen
1304 *
1305 * @E.g: iwpriv wlan0 get_aniplen
1306 *
1307 * Supported Feature: STA
1308 *
1309 * Usage: Internal/External
1310 *
1311 * </ioctl>
1312 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001313#define WE_GET_ANI_POLL_PERIOD 19
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301314/*
1315 * <ioctl>
1316 * get_anilislen- Get the anilislen
1317 *
1318 * @INPUT: None
1319 *
1320 * @OUTPUT:
1321 * wlan0 get_anilislen:0
1322 *
1323 * This IOTCL used to get anilislen
1324 *
1325 * @E.g: iwpriv wlan0 get_anilislen
1326 *
1327 * Supported Feature: STA
1328 *
1329 * Usage: Internal/External
1330 *
1331 * </ioctl>
1332 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001333#define WE_GET_ANI_LISTEN_PERIOD 20
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301334/*
1335 * <ioctl>
1336 * get_aniofdmlvl - Get the OFDM level
1337 *
1338 * @INPUT: None
1339 *
1340 * @OUTPUT: OFDM
1341 * wlan0 get_aniofdmlvl:0
1342 *
1343 * This IOTCL used to get ofdm level
1344 *
1345 * @E.g: iwpriv wlan0 get_aniofdmlvl
1346 *
1347 * Supported Feature: STA
1348 *
1349 * Usage: Internal/External
1350 *
1351 * </ioctl>
1352 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001353#define WE_GET_ANI_OFDM_LEVEL 21
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301354/*
1355 * <ioctl>
1356 * get_aniccklvl - Get the cck level
1357 *
1358 * @INPUT: None
1359 *
1360 * @OUTPUT:
1361 * wlan0 get_aniccklvl:0
1362 *
1363 * This IOTCL used to get cck level
1364 *
1365 * @E.g: iwpriv wlan0 get_aniccklvl
1366 *
1367 * Supported Feature: STA
1368 *
1369 * Usage: Internal/External
1370 *
1371 * </ioctl>
1372 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001373#define WE_GET_ANI_CCK_LEVEL 22
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301374/*
1375 * <ioctl>
1376 * get_cwmenable - Get the value of the dynamic channel bandwidth setting
1377 *
1378 * @INPUT: None
1379 *
1380 * @OUTPUT: Enable/disable dynamic channel bandwidth
1381 * wlan0 get_cwmenable:0
1382 *
1383 * This IOTCL get the value of the dynamic channel bandwidth setting
1384 *
1385 * @E.g: iwpriv wlan0 get_cwmenable
1386 *
1387 * Supported Feature: STA
1388 *
1389 * Usage: Internal/External
1390 *
1391 * </ioctl>
1392 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001393#define WE_GET_DYNAMIC_BW 23
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301394/*
1395 * <ioctl>
1396 * get_txchainmask - Get the txchainmask that was set
1397 *
1398 * @INPUT: None
1399 *
1400 * @OUTPUT: txchainmask
1401 * wlan0 get_txchainmask:1
1402 *
1403 * This IOCTL gets the txchainmask that was set
1404 * This command is useful if it was previously set
1405 *
1406 * @E.g: iwpriv wlan0 get_txchainmask
1407 *
1408 * Supported Feature: STA
1409 *
1410 * Usage: Internal/External
1411 *
1412 * </ioctl>
1413 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001414#define WE_GET_TX_CHAINMASK 24
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301415/*
1416 * <ioctl>
1417 * get_rxchainmask - Get the rxchainmask that was set
1418 *
1419 * @INPUT: None
1420 *
1421 * @OUTPUT: rxchainmask
1422 * wlan0 get_rxchainmask:1
1423 *
1424 * This IOCTL gets the rxchainmask that was set
1425 * This command is useful only if it was previously set.
1426 *
1427 * @E.g: iwpriv wlan0 get_rxchainmask
1428 *
1429 * Supported Feature: STA
1430 *
1431 * Usage: Internal/External
1432 *
1433 * </ioctl>
1434 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435#define WE_GET_RX_CHAINMASK 25
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301436/*
1437 * <ioctl>
1438 * get_11nrate - Get the fixed Tx data rate
1439 *
1440 * @INPUT: None
1441 *
1442 * @OUTPUT: Using this command does not return the same value as set
1443 * wlan0 get_11nrate:0
1444 *
1445 * This IOCTL gets the fixed Tx data rate
1446 * This command is useful only if setting the fixed Tx rate.
1447 *
1448 * @E.g: iwpriv wlan0 get_11nrate
1449 *
1450 * Supported Feature: STA
1451 *
1452 * Usage: Internal/External
1453 *
1454 * </ioctl>
1455 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456#define WE_GET_11N_RATE 26
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301457/*
1458 * <ioctl>
1459 * get_ampdu - Get the maximum subframe of ampdu
1460 *
1461 * @INPUT: None
1462 *
1463 * @OUTPUT: Maximum subframe of ampdu
1464 * wlan0 get_ampdu:1
1465 *
1466 * This IOCTL gets the maximum subframe of ampdu
1467 * This command is useful only if setting ampdu.
1468 *
1469 * @E.g: iwpriv wlan0 get_ampdu
1470 *
1471 * Supported Feature: STA
1472 *
1473 * Usage: Internal/External
1474 *
1475 * </ioctl>
1476 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001477#define WE_GET_AMPDU 27
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301478/*
1479 * <ioctl>
1480 * get_amsdu - Get the maximum subframe of amsdu
1481 *
1482 * @INPUT: None
1483 *
1484 * @OUTPUT: Maximum subframe of amsdu
1485 * wlan0 get_amsdu:1
1486 *
1487 * This IOCTL gets the maximum subframe of amsdu.
1488 * This command is useful only if setting amsdu
1489 *
1490 * @E.g: iwpriv wlan0 get_amsdu
1491 *
1492 * Supported Feature: STA
1493 *
1494 * Usage: Internal/External
1495 *
1496 * </ioctl>
1497 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001498#define WE_GET_AMSDU 28
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301499/*
1500 * <ioctl>
1501 * get_txpow2g - Get the current 2 GHz Tx power setting
1502 *
1503 * @INPUT: None
1504 *
1505 * @OUTPUT: Tx Power in dbm
1506 * wlan0 get_txpow2g:0
1507 *
1508 * This IOCTL gets the current 2 GHz Tx power setting
1509 * This command is useful if setting Tx power
1510 *
1511 * @E.g: iwpriv wlan0 get_txpow2g
1512 *
1513 * Supported Feature: STA
1514 *
1515 * Usage: Internal/External
1516 *
1517 * </ioctl>
1518 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001519#define WE_GET_TXPOW_2G 29
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301520/*
1521 * <ioctl>
1522 * get_txpow5g - Get the current 5 GHz Tx power setting
1523 *
1524 * @INPUT: None
1525 *
1526 * @OUTPUT: Tx Power in dbm
1527 * wlan0 get_txpow5g:0
1528 *
1529 * This IOCTL gets the current 5 GHz Tx power setting
1530 * This command is useful if setting Tx power
1531 *
1532 * @E.g: iwpriv wlan0 get_txpow5g
1533 *
1534 * Supported Feature: STA
1535 *
1536 * Usage: Internal/External
1537 *
1538 * </ioctl>
1539 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001540#define WE_GET_TXPOW_5G 30
Rajeev Kumar1bcfd632015-12-07 11:38:51 -08001541/* 31 is unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001542#define WE_GET_PPS_PAID_MATCH 32
1543#define WE_GET_PPS_GID_MATCH 33
1544#define WE_GET_PPS_EARLY_TIM_CLEAR 34
1545#define WE_GET_PPS_EARLY_DTIM_CLEAR 35
1546#define WE_GET_PPS_EOF_PAD_DELIM 36
1547#define WE_GET_PPS_MACADDR_MISMATCH 37
1548#define WE_GET_PPS_DELIM_CRC_FAIL 38
1549#define WE_GET_PPS_GID_NSTS_ZERO 39
1550#define WE_GET_PPS_RSSI_CHECK 40
1551/* Private ioctl for QPower */
1552#define WE_GET_QPOWER_MAX_PSPOLL_COUNT 41
1553#define WE_GET_QPOWER_MAX_TX_BEFORE_WAKE 42
1554#define WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 43
1555#define WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 44
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301556/*
1557 * <ioctl>
1558 * get_burst_en - Enables or disables the burst feature
1559 *
1560 * @INPUT: None
1561 *
1562 * @OUTPUT: Enable/disable of burst feature
1563 * wlan0 get_burst_en:1
1564 *
1565 * This IOCTL enables or disables the burst feature
1566 *
1567 * @E.g: iwpriv wlan0 get_burst_en
1568 *
1569 * Supported Feature:STA
1570 *
1571 * Usage: Internal/External
1572 *
1573 * </ioctl>
1574 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001575#define WE_GET_BURST_ENABLE 45
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301576/*
1577 * <ioctl>
1578 * get_burst_dur - Get the burst duration
1579 *
1580 * @INPUT: None
1581 *
1582 * @OUTPUT: Duration in microseconds
1583 * wlan0 get_burst_dur:8160
1584 *
1585 * This IOCTL gets the burst duration
1586 * This command is useful if setting burst enable
1587 *
1588 * @E.g: iwpriv wlan0 get_burst_dur
1589 *
1590 * Supported Feature: STA
1591 *
1592 * Usage: Internal/External
1593 *
1594 * </ioctl>
1595 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001596#define WE_GET_BURST_DUR 46
1597/* GTX Commands */
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301598/*
1599 * <ioctl>
1600 * get_gtxHTMcs - Get the tx HTM
1601 *
1602 * @INPUT: None
1603 *
1604 * @OUTPUT: HTM
1605 * wlan0 get_gtxHTMcs:32896
1606 *
1607 * This IOTCL used to get HTM
1608 *
1609 * @E.g: iwpriv wlan0 get_gtxHTMcs
1610 *
1611 * Supported Feature: STA
1612 *
1613 * Usage: Internal/External
1614 *
1615 * </ioctl>
1616 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001617#define WE_GET_GTX_HT_MCS 47
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301618/*
1619 * <ioctl>
1620 * get_gtxVHTMcs - Get the VHTM
1621 *
1622 * @INPUT: None
1623 *
1624 * @OUTPUT: VHTM
1625 * wlan0 get_gtxVHTMcs:524800
1626 *
1627 * This IOTCL used to get the VHTM
1628 *
1629 * @E.g: iwpriv wlan0 get_gtxVHTMcs
1630 *
1631 * Supported Feature: STA
1632 *
1633 * Usage: Internal/External
1634 *
1635 * </ioctl>
1636 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001637#define WE_GET_GTX_VHT_MCS 48
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301638/*
1639 * <ioctl>
1640 * get_gtxUsrCfg - Get the tx cfg
1641 *
1642 * @INPUT: None
1643 *
1644 * @OUTPUT: TXCFG
1645 * wlan0 get_gtxUsrCfg:32
1646 *
1647 * This IOTCL used to get the tx cfg
1648 *
1649 * @E.g: iwpriv wlan0 get_gtxUsrCfg
1650 *
1651 * Supported Feature: STA
1652 *
1653 * Usage: Internal/External
1654 *
1655 * </ioctl>
1656 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001657#define WE_GET_GTX_USRCFG 49
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301658/*
1659 * <ioctl>
1660 * get_gtxThre - Get the tx threshold
1661 *
1662 * @INPUT: None
1663 *
1664 * @OUTPUT: Threshold
1665 * wlan0 get_gtxThre:3
1666 *
1667 * This IOCTL is used to get tx threshold
1668 *
1669 * @E.g: iwpriv wlan0 get_gtxThre
1670 *
1671 * Supported Feature: STA
1672 *
1673 * Usage: Internal/External
1674 *
1675 * </ioctl>
1676 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001677#define WE_GET_GTX_THRE 50
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301678/*
1679 * <ioctl>
1680 * get_gtxMargin - Get the tx margin
1681 *
1682 * @INPUT: None
1683 *
1684 * @OUTPUT: GTXMARGIN
1685 * wlan0 get_gtxMargin:2
1686 *
1687 * This IOCTL is used to set tx margin
1688 *
1689 * @E.g: iwpriv wlan0 get_gtxMargin
1690 *
1691 * Supported Feature: STA
1692 *
1693 * Usage: Internal/External
1694 *
1695 * </ioctl>
1696 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001697#define WE_GET_GTX_MARGIN 51
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301698/*
1699 * <ioctl>
1700 * get_gtxStep - Get the tx step
1701 *
1702 * @INPUT: None
1703 *
1704 * @OUTPUT: GTXSTEP
1705 * wlan0 get_gtxStep:0
1706 *
1707 * This IOCTL is used to get the gtx step
1708 *
1709 * @E.g: iwpriv wlan0 get_gtxStep
1710 *
1711 * Supported Feature: STA
1712 *
1713 * Usage: Internal/External
1714 *
1715 * </ioctl>
1716 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001717#define WE_GET_GTX_STEP 52
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301718/*
1719 * <ioctl>
1720 * get_gtxMinTpc - Get the tx miminum tpc
1721 *
1722 * @INPUT: None
1723 *
1724 * @OUTPUT: TPC
1725 * wlan0 get_gtxMinTpc:0
1726 *
1727 * This IOCTL is used to get tx miminum tpc
1728 *
1729 * @E.g: iwpriv wlan0 get_gtxMinTpc
1730 *
1731 * Supported Feature: STA
1732 *
1733 * Usage: Internal/External
1734 *
1735 * </ioctl>
1736 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001737#define WE_GET_GTX_MINTPC 53
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301738/*
1739 * <ioctl>
1740 * get_gtxBWMask - Get the tx BW MASK
1741 *
1742 * @INPUT: None
1743 *
1744 * @OUTPUT: MASK
1745 * wlan0 get_gtxBWMask:15
1746 *
1747 * This IOCTL is used get gtx bw mask
1748 *
1749 * @E.g: iwpriv wlan0 get_gtxBWMask
1750 *
1751 * Supported Feature: STA
1752 *
1753 * Usage: Internal/External
1754 *
1755 * </ioctl>
1756 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757#define WE_GET_GTX_BWMASK 54
1758#define WE_GET_TEMPERATURE 56
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001759#define WE_CAP_TSF 58
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07001760#define WE_GET_ROAM_SYNCH_DELAY 59
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001762/*
1763 * <ioctl>
1764 * get_dcm - Get dcm enablement value
1765 *
1766 * @INPUT: None
1767 *
1768 * @OUTPUT: 0/1
1769 * wlan0 get_dcm
1770 *
1771 * This IOCTL is used get dcm value
1772 *
1773 * Supported Feature: STA/SAP
1774 *
1775 * Usage: Internal
1776 *
1777 * </ioctl>
1778 */
1779#define WE_GET_DCM 60
1780
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001781/*
1782 * <ioctl>
1783 * get_dcm - Get range extension enablement value
1784 *
1785 * @INPUT: None
1786 *
1787 * @OUTPUT: 0/1
1788 * wlan0 get_range_ext
1789 *
1790 * This IOCTL is used get range_extension value
1791 *
1792 * Supported Feature: STA/SAP
1793 *
1794 * Usage: Internal
1795 *
1796 * </ioctl>
1797 */
1798#define WE_GET_RANGE_EXT 61
1799
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800/* Private ioctls and their sub-ioctls */
1801#define WLAN_PRIV_SET_INT_GET_INT (SIOCIWFIRSTPRIV + 2)
1802
1803/* Private ioctls and their sub-ioctls */
1804#define WLAN_PRIV_SET_CHAR_GET_NONE (SIOCIWFIRSTPRIV + 3)
1805#define WE_WOWL_ADD_PTRN 1
1806#define WE_WOWL_DEL_PTRN 2
Sreelakshmi Konamkided64d72017-02-23 10:39:26 +05301807/*
1808 * <ioctl>
1809 * neighbor - Send neighbor report request
1810 *
1811 * @INPUT: string
1812 *
1813 * @OUTPUT: None
1814 *
1815 * This IOCTL create a Neighbor report request and send it to peer
1816 *
1817 * @E.g: iwpriv wlan0 neighbor "SSID"
1818 *
1819 * Supported Feature: 11k
1820 *
1821 * Usage: Internal/External
1822 *
1823 * </ioctl>
1824 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001825#define WE_NEIGHBOR_REPORT_REQUEST 3
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301826/*
1827 * <ioctl>
1828 * set_ap_wps_ie - Set the P2P IE of the probe response
1829 *
1830 * @INPUT: string
1831 *
1832 * @OUTPUT: None
1833 *
1834 * This IOCTL sets the P2P IE of the probe response
1835 *
1836 * @E.g: iwpriv wlan0 set_ap_wps_ie abcd
1837 *
1838 * Supported Feature: STA
1839 *
1840 * Usage: Internal/External
1841 *
1842 * </ioctl>
1843 */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07001844#define WE_SET_AP_WPS_IE 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001845#define WE_SET_CONFIG 5
1846
1847/* Private ioctls and their sub-ioctls */
1848#define WLAN_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV + 4)
1849#define WE_SET_WLAN_DBG 1
1850#define WE_SET_DP_TRACE 2
1851#define WE_SET_SAP_CHANNELS 3
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05301852#define WE_SET_FW_TEST 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001853
1854/* Private ioctls and their sub-ioctls */
1855#define WLAN_PRIV_GET_CHAR_SET_NONE (SIOCIWFIRSTPRIV + 5)
1856#define WE_WLAN_VERSION 1
1857#define WE_GET_STATS 2
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301858/*
1859 * <ioctl>
1860 * getConfig - gets the values of all configurations listed in WCNSS
1861 *
1862 * @INPUT: None
1863 *
1864 * @OUTPUT: Current configuration to the sys log
1865 * wlan0 getConfig: WLAN configuration written to system log
1866 *
1867 * This IOCTL gets the values of all configurations listed in WCNSS
1868 *
1869 * @E.g: iwpriv wlan0 getConfig
1870 *
1871 * Supported Feature: STA
1872 *
1873 * Usage: Internal/External
1874 *
1875 * </ioctl>
1876 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001877#define WE_GET_CFG 3
1878#define WE_GET_WMM_STATUS 4
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301879/*
1880 * <ioctl>
1881 * getChannelList - Get the available channel list while in QCMobileAP
1882 *
1883 * @INPUT: None
1884 *
1885 * @OUTPUT: Channel list
1886 * wlan0 getChannelList:36 US 1..165
1887 *
1888 * This IOCTL gets the available channel list while in QCMobileAP
1889 *
1890 * @E.g: iwpriv wlan0 getChannelList
1891 *
1892 * Supported Feature: STA
1893 *
1894 * Usage: Internal/External
1895 *
1896 * </ioctl>
1897 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001898#define WE_GET_CHANNEL_LIST 5
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301899/*
1900 * <ioctl>
1901 * getRSSI - Get the Received Signal Strength Indicator
1902 *
1903 * @INPUT: None
1904 *
1905 * @OUTPUT: RSSI
1906 * wlan0 getRSSI:rsssi=-32
1907 *
1908 * This IOCTL gets the Received Signal Strength Indicator (RSSI)
1909 *
1910 * @E.g: iwpriv wlan0 getRSSI
1911 *
1912 * Supported Feature: STA
1913 *
1914 * Usage: Internal/External
1915 *
1916 * </ioctl>
1917 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001918#define WE_GET_RSSI 6
Dustin Brownd9322482017-01-09 12:46:03 -08001919
1920/*
1921 * <ioctl>
1922 * getSuspendStats - Get suspend/resume stats
1923 *
1924 * @INPUT: None
1925 *
1926 * @OUTPUT: character string containing formatted suspend/resume stats
1927 *
1928 * This ioctl is used to get suspend/resume stats formatted for display.
1929 * Currently it includes suspend/resume counts, wow wake up reasons, and
1930 * suspend fail reasons.
1931 *
1932 * @E.g: iwpriv wlan0 getSuspendStats
1933 * iwpriv wlan0 getSuspendStats
1934 *
1935 * Supported Feature: suspend/resume
1936 *
1937 * Usage: Internal
1938 *
1939 * </ioctl>
1940 */
1941#define WE_GET_SUSPEND_RESUME_STATS 7
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001942#ifdef FEATURE_WLAN_TDLS
Nitesh Shah5dfb99e2016-12-10 14:19:46 +05301943/*
1944 * <ioctl>
1945 * getTdlsPeers - Get all TDLS peers.
1946 *
1947 * @INPUT: None
1948 *
1949 * @OUTPUT: Returns the MAC address of all the TDLS peers
1950 * wlan0 getTdlsPeers:
1951 * MAC Id cap up RSSI
1952 * ---------------------------------
1953 * 00:0a:f5:0e:bd:18 2 Y Y -44
1954 * 00:0a:f5:bf:0e:12 0 N N 0
1955 *
1956 * This IOCTL is used to get all TDLS peers.
1957 *
1958 * @E.g: iwpriv wlan0 getTdlsPeers
1959 *
1960 * Supported Feature: TDLS
1961 *
1962 * Usage: Internal/External
1963 *
1964 * </ioctl>
1965 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001966#define WE_GET_TDLS_PEERS 8
1967#endif
1968#ifdef WLAN_FEATURE_11W
Abhishek Singh2f810492016-12-01 11:39:39 +05301969/*
1970 * <ioctl>
1971 * getPMFInfo - get the PMF info of the connected session
1972 *
1973 * @INPUT: None
1974 *
1975 * @OUTPUT:
1976 * wlan0 getPMFInfo:
1977 * BSSID E4:F4:C6:0A:E0:36, Is PMF Assoc? 0
1978 * Number of Unprotected Disassocs 0
1979 * Number of Unprotected Deauths 0
1980 *
1981 * This IOCTL is used to get the PMF stats/status of the current
1982 * connection.
1983 *
1984 * @e.g:iwpriv wlan0 getPMFInfo
1985 *
1986 * Supported Feature: PMF
1987 *
1988 * Usage: Internal/External
1989 *
1990 * </ioctl>
1991 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001992#define WE_GET_11W_INFO 9
1993#endif
1994#define WE_GET_STATES 10
Abhishek Singh49b654e2016-12-01 16:11:17 +05301995/*
1996 * <ioctl>
1997 * getIbssSTAs - get ibss sta info
1998 *
1999 * @INPUT: None
2000 *
2001 * @OUTPUT: Give the MAC of the IBSS STA
2002 * wlan0 getIbssSTAs:
2003 * 1 .8c:fd:f0:01:9c:bf
2004 *
2005 * This IOCTL is used to get ibss sta info
2006 *
2007 * @E.g: iwpriv wlan0 getIbssSTAs
2008 *
2009 * Supported Feature: IBSS
2010 *
2011 * Usage: Internal/External
2012 *
2013 * </ioctl>
2014 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002015#define WE_GET_IBSS_STA_INFO 11
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302016/*
2017 * <ioctl>
2018 * getphymode - Get the current phymode.
2019 *
2020 * @INPUT: None
2021 *
2022 * @OUTPUT: In phymode
2023 * wlan0 getphymode:AUTO MODE
2024 *
2025 * This IOCTL used to gets the current phymode.
2026 *
2027 * @E.g: iwpriv wlan0 getphymode
2028 *
2029 * Supported Feature: STA
2030 *
2031 * Usage: Internal/External
2032 *
2033 * </ioctl>
2034 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002035#define WE_GET_PHYMODE 12
Naveen Rawat910726a2017-03-06 11:42:51 -08002036
2037/*
2038 * <ioctl>
2039 * getOemDataCap - Get the oem data caps.
2040 *
2041 * @INPUT: None
2042 *
2043 * @OUTPUT: oem data capability
2044 *
2045 * This IOCTL used to gets the current oem data cap.
2046 *
2047 * @E.g: iwpriv wlan0 getOemDataCap
2048 *
2049 * Usage: Internal/External
2050 *
2051 * </ioctl>
2052 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002053#define WE_GET_OEM_DATA_CAP 13
Naveen Rawat910726a2017-03-06 11:42:51 -08002054
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302055/*
2056 * <ioctl>
2057 * getSNR - Enable SNR Monitoring
2058 *
2059 * @INPUT: None
2060 *
2061 * @OUTPUT: Signal strength/ratio
2062 * wlan0 getSNR:1
2063 *
2064 * This IOCTL is used to get ibss sta info
2065 *
2066 * @E.g: iwpriv wlan0 getSNR
2067 *
2068 * Supported Feature: STA
2069 *
2070 * Usage: Internal/External
2071 *
2072 * </ioctl>
2073 */
Naveen Rawat910726a2017-03-06 11:42:51 -08002074
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075#define WE_GET_SNR 14
Govind Singha471e5e2015-10-12 17:11:14 +05302076#define WE_LIST_FW_PROFILE 15
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002077
2078/* Private ioctls and their sub-ioctls */
2079#define WLAN_PRIV_SET_NONE_GET_NONE (SIOCIWFIRSTPRIV + 6)
Selvaraj, Sridharf7939832017-03-25 16:59:50 +05302080
2081/*
2082 * <ioctl>
2083 * reassoc - Trigger STA re-association to the connected AP
2084 *
2085 * @INPUT: None
2086 *
2087 * @OUTPUT: None
2088 *
2089 * This IOCTL is used to trigger STA reassociation to the connected AP.
2090 *
2091 * @E.g: iwpriv wlan0 reassoc
2092 *
2093 * Supported Feature: Roaming
2094 *
2095 * Usage: Internal
2096 *
2097 * </ioctl>
2098 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099#define WE_SET_REASSOC_TRIGGER 8
Abhishek Singh49b654e2016-12-01 16:11:17 +05302100/*
2101 * <ioctl>
2102 * ibssPeerInfoAll - Print the ibss peers's MAC, rate and RSSI
2103 *
2104 * @INPUT: None
2105 *
2106 * @OUTPUT: print ibss peer in info logs
2107 * pPeerInfo->numIBSSPeers = 1
2108 * PEER ADDR : 8c:fd:f0:01:9c:bf TxRate: 1 Mbps RSSI: -35
2109 *
2110 * This IOCTL is used to rint the ibss peers's MAC, rate and RSSI
2111 * in info logs
2112 *
2113 * @E.g: iwpriv wlan0 ibssPeerInfoAll
2114 *
2115 * Supported Feature: IBSS
2116 *
2117 * Usage: Internal/External
2118 *
2119 * </ioctl>
2120 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002121#define WE_IBSS_GET_PEER_INFO_ALL 10
Rajeev Kumarf4390fa2016-12-22 13:17:33 -08002122/* Sub ioctls 11 to 16 are not used */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123#define WE_GET_RECOVERY_STAT 17
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -08002124#define WE_GET_FW_PROFILE_DATA 18
yeshwanth sriram guntukabdfe4352017-02-16 14:44:31 +05302125/*
2126 * <ioctl>
2127 * stop_obss_scan - Stop obss scan
2128 *
2129 * @INPUT: None
2130 *
2131 * @OUTPUT: None
2132 *
2133 * This IOCTL is used to stop obss scan
2134 *
2135 * @E.g: iwpriv wlan0 stop_obss_scan
2136 *
2137 * Supported Feature: Scan
2138 *
2139 * Usage: Internal/External
2140 *
2141 * </ioctl>
2142 */
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -08002143#define WE_STOP_OBSS_SCAN 19
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144
2145/* Private ioctls and their sub-ioctls */
2146#define WLAN_PRIV_SET_VAR_INT_GET_NONE (SIOCIWFIRSTPRIV + 7)
2147
2148#define WE_P2P_NOA_CMD 2
Manjeet Singhf82ed072016-07-08 11:40:00 +05302149/* subcommands 3 is unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002150
Manjeet Singhf82ed072016-07-08 11:40:00 +05302151#define WE_MAC_PWR_DEBUG_CMD 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002152
2153#ifdef FEATURE_WLAN_TDLS
Nitesh Shah5dfb99e2016-12-10 14:19:46 +05302154/*
2155 * <ioctl>
2156 * setTdlsConfig - Set TDLS configuration parameters.
2157 *
2158 * @INPUT: 11 TDLS configuration parameters
2159 * @args[0]: tdls: [0..2]
2160 * @args[1]: tx_period_t: [1000..4294967295UL]
2161 * @args[2]: tx_packet_n: [0..4294967295UL]
2162 * @args[3]: [discovery_period is not used anymore]
2163 * @args[4]: discovery_tries_n: [1..100]
2164 * @args[5]: [idle_timeout is not used anymore]
2165 * @args[6]: idle_packet_n: [0..40000]
2166 * @args[7]: [rssi_hysteresis is not used anymore]
2167 * @args[8]: rssi_trigger_threshold: [-120..0]
2168 * @args[9]: rssi_teardown_threshold: [-120..0]
2169 * @args[10]: rssi_delta: [-30..0]
2170 *
2171 * @OUTPUT: None
2172 *
2173 * This IOCTL is used to set the TDLS configuration parameters.
2174 *
2175 * @E.g: iwpriv wlan0 setTdlsConfig tdls tx_period_t tx_packet_n
2176 * discovery_period discovery_tries_n idle_timeout
2177 * idle_packet_n rssi_hysteresis rssi_trigger_threshold
2178 * rssi_teardown_threshold rssi_delta
2179 * iwpriv wlan0 setTdlsConfig 1 1500 40 1 5 1 5 0 -70 -70 -10
2180 *
2181 * Supported Feature: TDLS
2182 *
2183 * Usage: Internal/External
2184 *
2185 * </ioctl>
2186 */
2187
2188
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002189#define WE_TDLS_CONFIG_PARAMS 5
2190#endif
Abhishek Singh49b654e2016-12-01 16:11:17 +05302191/*
2192 * <ioctl>
2193 * ibssPeerInfo - Print the ibss peers's MAC, rate and RSSI
2194 *
2195 * @INPUT: staid
2196 *
2197 * @OUTPUT: print ibss peer corresponding to staid in info logs
2198 * PEER ADDR : 8c:fd:f0:01:9c:bf TxRate: 1 Mbps RSSI: -35
2199 *
2200 * This IOCTL is used to print the specific ibss peers's MAC,
2201 * rate and RSSI in info logs
2202 *
2203 * @E.g: iwpriv wlan0 ibssPeerInfo <sta_id>
2204 * iwpriv wlan0 ibssPeerInfo 0
2205 *
2206 * Supported Feature: IBSS
2207 *
2208 * Usage: Internal/External
2209 *
2210 * </ioctl>
2211 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002212#define WE_IBSS_GET_PEER_INFO 6
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002213#define WE_UNIT_TEST_CMD 7
2214
2215#define WE_MTRACE_DUMP_CMD 8
2216#define WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD 9
2217
2218
2219#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
2220#define WE_LED_FLASHING_PARAM 10
2221#endif
2222
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302223/*
2224 * <ioctl>
2225 * pm_clist - Increments the index value of the concurrent connection list
2226 * and update with the input parameters provided.
2227 *
2228 * @INPUT: Following 8 arguments:
2229 * @vdev_id: vdev id
2230 * @tx_streams: TX streams
2231 * @rx_streams: RX streams
2232 * @chain_mask: Chain mask
2233 * @type: vdev_type
2234 * AP:1 STA:2 IBSS:3 Monitor:4 NAN:5 OCB:6 NDI:7
2235 * @sub_type: vdev_subtype
2236 * P2P_Device:1 P2P_Client:2 P2P_GO:3
2237 * Proxy_STA:4 Mesh:5 Mesh_11s:6
2238 * @channel: Channel
2239 * @mac: Mac id
2240 *
2241 * @OUTPUT: None
2242 *
2243 * This IOCTL is used to increments the index value of the concurrent connection
2244 * list and update with the input parameters provided.
2245 *
2246 * @E.g: iwpriv wlan0 pm_clist vdev_id tx_streams rx_streams chain_mask type
2247 * sub_type channel mac
2248 * iwpriv wlan0 pm_clist 1 2 2 1 2 3 10 1
2249 *
2250 * Supported Feature: DBS
2251 *
2252 * Usage: Internal/External
2253 *
2254 * </ioctl>
2255 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002256#define WE_POLICY_MANAGER_CLIST_CMD 11
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302257
2258/*
2259 * <ioctl>
2260 * pm_dlist - Delete the index from the concurrent connection list that is
2261 * present in the given vdev_id.
2262 *
2263 * @INPUT: delete_all, vdev_id
2264 * @delete_all: delete all indices
2265 * @vdev_id: vdev id
2266 *
2267 * @OUTPUT: None
2268 *
2269 * This IOCTL is used to delete the index from the concurrent connection list
2270 * that is present in the given vdev_id.
2271 *
2272 * @E.g: iwpriv wlan0 pm_dlist delete_all vdev_id
2273 * iwpriv wlan0 pm_dlist 0 1
2274 *
2275 * Supported Feature: DBS
2276 *
2277 * Usage: Internal/External
2278 *
2279 * </ioctl>
2280 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281#define WE_POLICY_MANAGER_DLIST_CMD 12
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302282
2283/*
2284 * <ioctl>
2285 * pm_dbs - Set dbs capability and system preference
2286 *
2287 * @INPUT: dbs, system_pref
2288 * @dbs: Value of DBS capability to be set
2289 * @system_pref: System preference
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002290 * 0:PM_THROUGHPUT 1: PM_POWERSAVE 2: PM_LATENCY
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302291 *
2292 * @OUTPUT: None
2293 *
2294 * This IOCTL is used to set dbs capability and system preference.
2295 *
2296 * @E.g: iwpriv wlan0 pm_dbs dbs system_pref
2297 * iwpriv wlan0 pm_dbs 1 0
2298 *
2299 * Supported Feature: DBS
2300 *
2301 * Usage: Internal/External
2302 *
2303 * </ioctl>
2304 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002305#define WE_POLICY_MANAGER_DBS_CMD 13
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302306
2307/*
2308 * <ioctl>
2309 * pm_pcl - Set pcl for concurrency mode.
2310 *
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002311 * @INPUT: policy_mgr_con_mode
2312 * @policy_mgr_con_mode: concurrency mode for PCL table
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302313 * 0:STA 1:SAP 2:P2P_Client 3:P2P_GO 4:IBSS
2314 *
2315 * @OUTPUT: None
2316 *
2317 * This IOCTL is used to set pcl for concurrency mode.
2318 *
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002319 * @E.g: iwpriv wlan0 pm_pcl policy_mgr_con_mode
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302320 * iwpriv wlan0 pm_pcl 0
2321 *
2322 * Supported Feature: DBS
2323 *
2324 * Usage: Internal/External
2325 *
2326 * </ioctl>
2327 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002328#define WE_POLICY_MANAGER_PCL_CMD 14
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302329
2330/*
2331 * <ioctl>
2332 * pm_cinfo - Shows the concurrent connection list.
2333 *
2334 * @INPUT: None
2335 *
2336 * @OUTPUT: None
2337 *
2338 * This IOCTL is used to show the concurrent connection list.
2339 *
2340 * @E.g: iwpriv wlan0 pm_cinfo
2341 *
2342 * Supported Feature: DBS
2343 *
2344 * Usage: Internal/External
2345 *
2346 * </ioctl>
2347 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348#define WE_POLICY_MANAGER_CINFO_CMD 15
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302349
2350/*
2351 * <ioctl>
2352 * pm_ulist - Updates the index value of the concurrent connection list
2353 * with the input parameters provided.
2354 *
2355 * @INPUT: Following 8 arguments:
2356 * @vdev_id: vdev id
2357 * @tx_streams: TX streams
2358 * @rx_streams: RX streams
2359 * @chain_mask: Chain mask
2360 * @type: vdev_type
2361 * AP:1 STA:2 IBSS:3 Monitor:4 NAN:5 OCB:6 NDI:7
2362 * @sub_type: vdev_subtype
2363 * P2P_Device:1 P2P_Client:2 P2P_GO:3
2364 * Proxy_STA:4 Mesh:5 Mesh_11s:6
2365 * @channel: Channel
2366 * @mac: Mac id
2367 *
2368 * @OUTPUT: None
2369 *
2370 * This IOCTL is used to updates the index value of the concurrent
2371 * connection list with the input parameters provided.
2372 *
2373 * @E.g: iwpriv wlan0 pm_ulist vdev_id tx_streams rx_streams chain_mask type
2374 * sub_type channel mac
2375 * iwpriv wlan0 pm_ulist 1 2 2 1 2 3 10 1
2376 *
2377 * Supported Feature: DBS
2378 *
2379 * Usage: Internal/External
2380 *
2381 * </ioctl>
2382 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002383#define WE_POLICY_MANAGER_ULIST_CMD 16
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302384
2385/*
2386 * <ioctl>
2387 * pm_query_action - Initiate actions needed on current connections as
2388 * per the channel provided.
2389 *
2390 * @INPUT: channel
2391 * @channel: Channel on which new connection will be.
2392 *
2393 * @OUTPUT: None
2394 *
2395 * This IOCTL is used to initiate actions needed on current connections
2396 * as per the channel provided.
2397 *
2398 * @E.g: iwpriv wlan0 pm_query_action channel
2399 * iwpriv wlan0 pm_query_action 6
2400 *
2401 * Supported Feature: DBS
2402 *
2403 * Usage: Internal/External
2404 *
2405 * </ioctl>
2406 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002407#define WE_POLICY_MANAGER_QUERY_ACTION_CMD 17
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302408
2409/*
2410 * <ioctl>
2411 * pm_query_allow - Checks for allowed concurrency combination
2412 *
2413 * @INPUT: mode, channel, bandwidth
2414 * @mode: new connection mode
2415 * 0:STA 1:SAP 2:P2P_Client 3:P2P_GO 4:IBSS
2416 * @channel: channel on which new connection is coming up
2417 * @bandwidth: Bandwidth requested by the connection
2418 * 0:None 1:5MHz 2:10MHz 3:20MHz
2419 * 4:40MHz 5:80MHz 6:80+80MHz 7:160MHz
2420 *
2421 * @OUTPUT: None
2422 *
2423 * This IOCTL is used to checks for allowed concurrency combination.
2424 *
2425 * @E.g: iwpriv wlan0 pm_query_allow mode channel bandwidth
2426 * iwpriv wlan0 pm_query_allow 0 6 4
2427 *
2428 * Supported Feature: DBS
2429 *
2430 * Usage: Internal/External
2431 *
2432 * </ioctl>
2433 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002434#define WE_POLICY_MANAGER_QUERY_ALLOW_CMD 18
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302435
2436/*
2437 * <ioctl>
2438 * pm_run_scenario - Create scenario with number of connections provided.
2439 *
2440 * @INPUT: num_of_conn
2441 * @num_of_conn: the number of connections (values: 1~3)
2442 *
2443 * @OUTPUT: None
2444 *
2445 * This IOCTL is used to create scenario with the number of connections
2446 * provided.
2447 *
2448 * @E.g: iwpriv wlan0 pm_run_scenario num_of_conn
2449 * iwpriv wlan0 pm_run_scenario 1
2450 *
2451 * Supported Feature: DBS
2452 *
2453 * Usage: Internal/External
2454 *
2455 * </ioctl>
2456 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457#define WE_POLICY_MANAGER_SCENARIO_CMD 19
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302458
2459/*
2460 * <ioctl>
2461 * pm_set_hw_mode - Set hardware for single/dual mac.
2462 *
2463 * @INPUT: hw_mode
2464 * 0:single mac 1:dual mac
2465 *
2466 * @OUTPUT: None
2467 *
2468 * This IOCTL is used to set hardware for single/dual mac.
2469 *
2470 * @E.g: iwpriv wlan0 pm_set_hw_mode hw_mode
2471 * iwpriv wlan0 pm_set_hw_mode 1
2472 *
2473 * Supported Feature: DBS
2474 *
2475 * Usage: Internal/External
2476 *
2477 * </ioctl>
2478 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002479#define WE_POLICY_SET_HW_MODE_CMD 20
2480
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302481/*
2482 * <ioctl>
2483 * set_scan_cfg - Set dual MAC scan config parameters.
2484 *
2485 * @INPUT: dbs, dbs_plus_agile_scan, single_mac_scan_with_dbs
2486 * @dbs: Value of DBS bit
2487 * @dbs_plus_agile_scan: Value of DBS plus agile scan bit
2488 * @single_mac_scan_with_dbs: Value of Single MAC scan with DBS
2489 *
2490 * @OUTPUT: None
2491 *
2492 * This IOCTL is used to set the dual MAC scan config.
2493 *
2494 * @E.g: iwpriv wlan0 set_scan_cfg dbs dbs_plus_agile_scan
2495 * single_mac_scan_with_dbs
2496 * iwpriv wlan0 set_scan_cfg 1 0 1
2497 *
2498 * Supported Feature: DBS
2499 *
2500 * Usage: Internal/External
2501 *
2502 * </ioctl>
2503 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002504#define WE_SET_DUAL_MAC_SCAN_CONFIG 21
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302505
2506/*
2507 * <ioctl>
2508 * set_fw_mode_cfg - Sets the dual mac FW mode config
2509 *
2510 * @INPUT: dbs, dfs
2511 * @dbs: DBS bit
2512 * @dfs: Agile DFS bit
2513 *
2514 * @OUTPUT: None
2515 *
2516 * This IOCTL is used to set the dual mac FW mode config.
2517 *
2518 * @E.g: iwpriv wlan0 set_fw_mode_cfg dbs dfs
2519 * iwpriv wlan0 set_fw_mode_cfg 1 1
2520 *
2521 * Supported Feature: DBS
2522 *
2523 * Usage: Internal/External
2524 *
2525 * </ioctl>
2526 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002527#define WE_SET_DUAL_MAC_FW_MODE_CONFIG 22
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -07002528#define WE_SET_MON_MODE_CHAN 23
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002529
2530#ifdef FEATURE_WLAN_TDLS
2531#undef MAX_VAR_ARGS
2532#define MAX_VAR_ARGS 11
2533#else
2534#undef MAX_VAR_ARGS
2535#define MAX_VAR_ARGS 9
2536#endif
2537
Jeff Johnson6fa1e012017-04-05 06:40:53 -07002538/*
2539 * <ioctl>
2540 * fips_test - Perform a FIPS test
2541 *
2542 * @INPUT: Binary representation of the following packed structure
2543 *
2544 * @OUTPUT: Binary representation of the following packed structure
2545 *
2546 * This IOCTL is used to perform FIPS certification testing
2547 *
2548 * @E.g: iwpriv wlan0 fips_test <test vector>
2549 *
2550 * iwpriv wlan0 fips_test <tbd>
2551 *
2552 * Supported Feature: FIPS
2553 *
2554 * Usage: Internal
2555 *
2556 * </ioctl>
2557 */
2558#define WLAN_PRIV_FIPS_TEST (SIOCIWFIRSTPRIV + 8)
2559
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560/* Private ioctls (with no sub-ioctls) */
2561/* note that they must be odd so that they have "get" semantics */
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302562/*
2563 * <ioctl>
2564 * addTspec - Add TSPEC for each AC
2565 *
2566 * @INPUT: 19 TSPEC params
2567 * @[arg0]: handle
2568 * @[arg1]: tid
2569 * @[arg2]: dir
2570 * @[arg3]: psb
2571 * @[arg4]: up
2572 * @[arg5]: nomMsduSize
2573 * @[arg6]: maxMsduSize
2574 * @[arg7]: minDataRate
2575 * @[arg8]: meanDataRate
2576 * @[arg9]: peakDataRate
2577 * @[arg10]: maxBurstSize
2578 * @[arg11]: minPhyRate
2579 * @[arg12]: sba
2580 * @[arg13]: minServiceIntv
2581 * @[arg14]: suspendIntv
2582 * @[arg15]: burstSizeDefn
2583 * @[arg16]: ackPolicy
2584 * @[arg17]: inactivityPeriod
2585 * @[arg18]: maxServiceIntv
2586 *
2587 * @OUTPUT: Success/Failure
2588 *
2589 * This IOCTL is used to add TSPEC for each AC.
2590 *
2591 * @E.g: iwpriv wlan0 addTspec <handle> <tid> <dir> <psb> <up> <nomMsduSize>
2592 * <maxMsduSize> <minDataRate> <meanDataRate>
2593 * <peakDataRate> <maxBurstSize> <minPhyRate>
2594 * <sba> <minServiceIntv> <suspendIntv>
2595 * <burstSizeDefn> <ackPolicy> <inactivityPeriod>
2596 * <maxServiceIntv>
2597 * iwpriv wlan0 addTspec 7001 6 2 1 6 0x80D0 0x80D0 0x14500 0x14500 0x14500
2598 * 0 0x5B8D80 0x2001 20 2000 0 0 0 2000
2599 * wlan0 addTspec:3
2600 *
2601 * Supported Feature: WMM
2602 *
2603 * Usage: Internal/External
2604 *
2605 * </ioctl>
2606 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002607#define WLAN_PRIV_ADD_TSPEC (SIOCIWFIRSTPRIV + 9)
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302608/*
2609 * <ioctl>
2610 * delTspec - Delete TSPEC entry for each AC
2611 *
2612 * @INPUT: 1 TSPEC param
2613 * @[arg0]: handle
2614 *
2615 * @OUTPUT: Success/Failure
2616 *
2617 * This IOCTL is used to delete TSPEC entry for each AC.
2618 *
2619 * @E.g: iwpriv wlan0 delTspec <handle>
2620 * iwpriv wlan0 delTspec 7001
2621 * wlan0 delTspec:16
2622 *
2623 * Supported Feature: WMM
2624 *
2625 * Usage: Internal/External
2626 *
2627 * </ioctl>
2628 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002629#define WLAN_PRIV_DEL_TSPEC (SIOCIWFIRSTPRIV + 11)
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302630/*
2631 * <ioctl>
2632 * getTspec - Get TSPEC entry for each AC
2633 *
2634 * @INPUT: 1 TSPEC param
2635 * @[arg0]: handle
2636 *
2637 * @OUTPUT: Success/Failure
2638 *
2639 * This IOCTL is used to get TSPEC entry for each AC.
2640 *
2641 * @E.g: iwpriv wlan0 getTspec <handle>
2642 * iwpriv wlan0 getTspec 7001
2643 * wlan0 delTspec:18
2644 *
2645 * Supported Feature: WMM
2646 *
2647 * Usage: Internal/External
2648 *
2649 * </ioctl>
2650 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002651#define WLAN_PRIV_GET_TSPEC (SIOCIWFIRSTPRIV + 13)
2652
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002653/* (SIOCIWFIRSTPRIV + 10) is currently unused */
2654/* (SIOCIWFIRSTPRIV + 12) is currently unused */
2655/* (SIOCIWFIRSTPRIV + 14) is currently unused */
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002656#define WLAN_PRIV_SET_NONE_GET_THREE_INT (SIOCIWFIRSTPRIV + 15)
2657#define WE_GET_TSF 1
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002658/* (SIOCIWFIRSTPRIV + 16) is currently unused */
2659/* (SIOCIWFIRSTPRIV + 17) is currently unused */
2660/* (SIOCIWFIRSTPRIV + 19) is currently unused */
2661
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002662#define WLAN_PRIV_SET_FTIES (SIOCIWFIRSTPRIV + 20)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002663
2664/* Private ioctl for setting the host offload feature */
2665#define WLAN_PRIV_SET_HOST_OFFLOAD (SIOCIWFIRSTPRIV + 18)
2666
2667/* Private ioctl to get the statistics */
2668#define WLAN_GET_WLAN_STATISTICS (SIOCIWFIRSTPRIV + 21)
2669
2670/* Private ioctl to set the Keep Alive Params */
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302671/*
2672 * <ioctl>
2673 * setKeepAlive - Set the keep alive feature
2674 *
2675 * @INPUT: 28 bytes of information in the order of packet type, time period
2676 * host IPv4 address, destination IPv4 address, destination MAC address, bssID
2677 *
2678 * @OUTPUT: None
2679 *
2680 * This IOCTL sets the keep alive feature to send either NULL
2681 * or unsolicited ARP response packets
2682 *
2683 * @E.g: iwpriv wlan0 setKeepAlive
2684 *
2685 * Supported Feature: STA
2686 *
2687 * Usage: Internal/External
2688 *
2689 * </ioctl>
2690 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002691#define WLAN_SET_KEEPALIVE_PARAMS (SIOCIWFIRSTPRIV + 22)
2692
2693#ifdef WLAN_FEATURE_PACKET_FILTERING
2694/* Private ioctl to set the packet filtering params */
2695#define WLAN_SET_PACKET_FILTER_PARAMS (SIOCIWFIRSTPRIV + 23)
2696#endif
2697
2698
2699#ifdef FEATURE_WLAN_SCAN_PNO
2700/* Private ioctl to get the statistics */
2701#define WLAN_SET_PNO (SIOCIWFIRSTPRIV + 24)
2702#endif
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302703/*
2704 * <ioctl>
2705 * SETBAND - Set the operational band
2706 *
2707 * @INPUT: 0 to Auto, 1 to 5 GHz and 2 to 2.4 GHz
2708 *
2709 * @OUTPUT: None
2710 *
2711 * This IOCTL Set the operational band If the new band is different from the
2712 * current operational band, it aborts the pending scan requests, flushes
2713 * the existing scan results, and then change * the band capability
2714 *
2715 * @E.g: iwpriv wlan0 SETBAND <value>
2716 *
2717 * Supported Feature: STA
2718 *
2719 * Usage: Internal/External
2720 *
2721 * </ioctl>
2722 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002723#define WLAN_SET_BAND_CONFIG (SIOCIWFIRSTPRIV + 25)
2724
Dustin Brown0cbc7572016-12-16 13:54:40 -08002725#define WLAN_PRIV_SET_MCBC_FILTER (SIOCIWFIRSTPRIV + 26)
Dustin Brown860566f2017-01-31 15:24:43 -08002726/* (SIOCIWFIRSTPRIV + 27) is currently unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727
2728/* Private ioctls and their sub-ioctls */
2729#define WLAN_PRIV_SET_TWO_INT_GET_NONE (SIOCIWFIRSTPRIV + 28)
2730#define WE_SET_SMPS_PARAM 1
Srinivas Girigowda6147c582016-10-18 12:26:15 -07002731#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002732#define WE_SET_FW_CRASH_INJECT 2
2733#endif
2734#define WE_DUMP_DP_TRACE_LEVEL 3
Govind Singha471e5e2015-10-12 17:11:14 +05302735/* Private sub ioctl for enabling and setting histogram interval of profiling */
2736#define WE_ENABLE_FW_PROFILE 4
2737#define WE_SET_FW_PROFILE_HIST_INTVL 5
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002738
Rajeev Kumar9bb2e852016-09-24 12:29:25 -07002739/* Private sub-ioctl for initiating WoW suspend without Apps suspend */
Rajeev Kumara78a0a42016-07-13 19:28:20 -07002740#define WE_SET_WLAN_SUSPEND 6
2741#define WE_SET_WLAN_RESUME 7
Rajeev Kumara78a0a42016-07-13 19:28:20 -07002742
Dustin Brown8d2d0f52017-04-03 17:02:08 -07002743/*
2744 * <ioctl>
2745 * log_buffer - prints host/target related communication logs via dmesg
2746 *
2747 * @INPUT: Log Id, Count
2748 *
2749 * Log Id:
2750 * 0) HTC_CREDIT_HISTORY_LOG
2751 * 1) COMMAND_LOG,
2752 * 2) COMMAND_TX_CMP_LOG,
2753 * 3) MGMT_COMMAND_LOG,
2754 * 4) MGMT_COMMAND_TX_CMP_LOG,
2755 * 5) EVENT_LOG,
2756 * 6) RX_EVENT_LOG,
2757 * 7) MGMT_EVENT_LOG
2758 *
2759 * @OUTPUT: None
2760 *
2761 * @E.g:
2762 * # print up to 10 of the most recent records from HTC Credit History
2763 * iwpriv wlan0 log_buffer 0 10
2764 * # print up to 3 of the most recent records from Event Log
2765 * iwpriv wlan0 log_buffer 5 3
2766 *
2767 * Supported Feature: WLAN Trace
2768 *
2769 * Usage: Internal/External
2770 *
2771 * </ioctl>
2772 */
2773#define WE_LOG_BUFFER 8
2774
2775enum host_target_comm_log {
2776 HTC_CREDIT_HISTORY_LOG = 0,
2777 COMMAND_LOG,
2778 COMMAND_TX_CMP_LOG,
2779 MGMT_COMMAND_LOG,
2780 MGMT_COMMAND_TX_CMP_LOG,
2781 EVENT_LOG,
2782 RX_EVENT_LOG,
2783 MGMT_EVENT_LOG
2784};
2785
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002786/* (SIOCIWFIRSTPRIV + 29) is currently unused */
2787
2788/* 802.11p IOCTL */
2789#define WLAN_SET_DOT11P_CHANNEL_SCHED (SIOCIWFIRSTPRIV + 30)
2790
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302791/*
2792 * <ioctl>
2793 * getLinkSpeed - Gets the current link speed in Mbps
2794 *
2795 * @INPUT: None
2796 *
2797 * @OUTPUT: linkspeed in mbps
2798 * wlan0 getLinkSpeed:7
2799 *
2800 * This IOCTL is used get the current link speed in Mbps
2801 *
2802 * @E.g: iwpriv wlan0 getLinkSpeed
2803 *
2804 * Supported Feature: STA
2805 *
2806 * Usage: Internal/External
2807 *
2808 * </ioctl>
2809 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810#define WLAN_GET_LINK_SPEED (SIOCIWFIRSTPRIV + 31)
2811
2812#define WLAN_STATS_INVALID 0
2813#define WLAN_STATS_RETRY_CNT 1
2814#define WLAN_STATS_MUL_RETRY_CNT 2
2815#define WLAN_STATS_TX_FRM_CNT 3
2816#define WLAN_STATS_RX_FRM_CNT 4
2817#define WLAN_STATS_FRM_DUP_CNT 5
2818#define WLAN_STATS_FAIL_CNT 6
2819#define WLAN_STATS_RTS_FAIL_CNT 7
2820#define WLAN_STATS_ACK_FAIL_CNT 8
2821#define WLAN_STATS_RTS_SUC_CNT 9
2822#define WLAN_STATS_RX_DISCARD_CNT 10
2823#define WLAN_STATS_RX_ERROR_CNT 11
2824#define WLAN_STATS_TX_BYTE_CNT 12
2825
2826#define WLAN_STATS_RX_BYTE_CNT 13
2827#define WLAN_STATS_RX_RATE 14
2828#define WLAN_STATS_TX_RATE 15
2829
2830#define WLAN_STATS_RX_UC_BYTE_CNT 16
2831#define WLAN_STATS_RX_MC_BYTE_CNT 17
2832#define WLAN_STATS_RX_BC_BYTE_CNT 18
2833#define WLAN_STATS_TX_UC_BYTE_CNT 19
2834#define WLAN_STATS_TX_MC_BYTE_CNT 20
2835#define WLAN_STATS_TX_BC_BYTE_CNT 21
2836
2837#define FILL_TLV(__p, __type, __size, __val, __tlen) do { \
2838 if ((__tlen + __size + 2) < WE_MAX_STR_LEN) { \
2839 *__p++ = __type; \
2840 *__p++ = __size; \
2841 memcpy(__p, __val, __size); \
2842 __p += __size; \
2843 __tlen += __size + 2; \
2844 } else { \
Jeff Johnson99bac312016-06-28 10:38:18 -07002845 hdd_err("FILL_TLV Failed!!!"); \
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846 } \
2847 } while (0)
2848
2849#define VERSION_VALUE_MAX_LEN 32
2850
2851#define TX_PER_TRACKING_DEFAULT_RATIO 5
2852#define TX_PER_TRACKING_MAX_RATIO 10
2853#define TX_PER_TRACKING_DEFAULT_WATERMARK 5
2854
2855#define WLAN_ADAPTER 0
2856#define P2P_ADAPTER 1
2857
2858/**
2859 * mem_alloc_copy_from_user_helper - copy from user helper
2860 * @wrqu_data: wireless extensions request data
2861 * @len: length of @wrqu_data
2862 *
2863 * Helper function to allocate buffer and copy user data.
2864 *
2865 * Return: On success return a pointer to a kernel buffer containing a
2866 * copy of the userspace data (with an additional NUL character
2867 * appended for safety). On failure return %NULL.
2868 */
2869void *mem_alloc_copy_from_user_helper(const __user void *wrqu_data, size_t len)
2870{
2871 u8 *ptr = NULL;
2872
2873 /* in order to protect the code, an extra byte is post
2874 * appended to the buffer and the null termination is added.
2875 * However, when allocating (len+1) byte of memory, we need to
2876 * make sure that there is no uint overflow when doing
2877 * addition. In theory check len < UINT_MAX protects the uint
2878 * overflow. For wlan private ioctl, the buffer size is much
2879 * less than UINT_MAX, as a good guess, now, it is assumed
2880 * that the private command buffer size is no greater than 4K
2881 * (4096 bytes). So we use 4096 as the upper boundary for now.
2882 */
2883 if (len > MAX_USER_COMMAND_SIZE) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08002884 hdd_err("Invalid length: %zu max: %u",
2885 len, MAX_USER_COMMAND_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 return NULL;
2887 }
2888
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07002889 ptr = qdf_mem_malloc(len + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002890 if (NULL == ptr) {
Jeff Johnson99bac312016-06-28 10:38:18 -07002891 hdd_err("unable to allocate memory");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002892 return NULL;
2893 }
2894
2895 if (copy_from_user(ptr, wrqu_data, len)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07002896 hdd_err("failed to copy data to user buffer");
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07002897 qdf_mem_free(ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002898 return NULL;
2899 }
2900 ptr[len] = '\0';
2901 return ptr;
2902}
2903
2904/**
2905 * hdd_priv_get_data() - Get pointer to ioctl private data
2906 * @p_priv_data: pointer to iw_point struct to be filled
2907 * @wrqu: Pointer to IOCTL Data received from userspace
2908 *
2909 * Helper function to get compatible struct iw_point passed to ioctl
2910 *
2911 * Return - 0 if p_priv_data successfully filled, error otherwise
2912 */
2913int hdd_priv_get_data(struct iw_point *p_priv_data, union iwreq_data *wrqu)
2914{
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07002915 if ((NULL == p_priv_data) || (NULL == wrqu))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07002917
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918#ifdef CONFIG_COMPAT
2919 if (is_compat_task()) {
2920 struct compat_iw_point *p_compat_priv_data;
2921
2922 /* Compat task:
2923 * typecast to compat structure and copy the members.
2924 */
2925 p_compat_priv_data = (struct compat_iw_point *)&wrqu->data;
2926
2927 p_priv_data->pointer = compat_ptr(p_compat_priv_data->pointer);
2928 p_priv_data->length = p_compat_priv_data->length;
2929 p_priv_data->flags = p_compat_priv_data->flags;
2930 } else {
2931#endif /* #ifdef CONFIG_COMPAT */
2932
2933 /* Non compat task: directly copy the structure. */
2934 memcpy(p_priv_data, &wrqu->data, sizeof(struct iw_point));
2935
2936#ifdef CONFIG_COMPAT
2937 }
2938#endif /* #ifdef CONFIG_COMPAT */
2939
2940 return 0;
2941}
2942
Jeff Johnson441e1f72017-02-07 08:50:49 -08002943static int hdd_check_wext_control(enum hdd_wext_control wext_control,
2944 struct iw_request_info *info)
2945{
2946 switch (wext_control) {
2947 default:
2948 case hdd_wext_disabled:
2949 hdd_err("Rejecting disabled ioctl %x", info->cmd);
2950 return -ENOTSUPP;
2951 case hdd_wext_deprecated:
2952 hdd_warn("Using deprecated ioctl %x", info->cmd);
2953 return 0;
2954 case hdd_wext_enabled:
2955 return 0;
2956 }
2957}
2958
2959int hdd_check_standard_wext_control(struct hdd_context_s *hdd_ctx,
2960 struct iw_request_info *info)
2961{
2962 return hdd_check_wext_control(hdd_ctx->config->standard_wext_control,
2963 info);
2964}
2965
2966int hdd_check_private_wext_control(struct hdd_context_s *hdd_ctx,
2967 struct iw_request_info *info)
2968{
2969 return hdd_check_wext_control(hdd_ctx->config->private_wext_control,
2970 info);
2971}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002972
2973/**
2974 * hdd_wlan_get_stats() - Get txrx stats in SAP mode
2975 * @pAdapter: Pointer to the hdd adapter.
2976 * @length: Size of the data copied
2977 * @buffer: Pointer to char buffer.
2978 * @buf_len: Length of the char buffer.
2979 *
2980 * This function called when the "iwpriv wlan0 get_stats" command is given.
2981 * It used to collect the txrx stats when the device is configured in SAP mode.
2982 *
2983 * Return - none
2984 */
2985void hdd_wlan_get_stats(hdd_adapter_t *pAdapter, uint16_t *length,
2986 char *buffer, uint16_t buf_len)
2987{
2988 hdd_tx_rx_stats_t *pStats = &pAdapter->hdd_stats.hddTxRxStats;
2989 uint32_t len = 0;
2990 uint32_t total_rx_pkt = 0, total_rx_dropped = 0;
2991 uint32_t total_rx_delv = 0, total_rx_refused = 0;
2992 int i = 0;
2993
2994 for (; i < NUM_CPUS; i++) {
2995 total_rx_pkt += pStats->rxPackets[i];
2996 total_rx_dropped += pStats->rxDropped[i];
2997 total_rx_delv += pStats->rxDelivered[i];
2998 total_rx_refused += pStats->rxRefused[i];
2999 }
3000
3001 len = scnprintf(buffer, buf_len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003002 "\nTransmit[%lu] - "
Mohit Khannad0b63f52017-02-18 18:05:52 -08003003 "called %u, dropped %u orphan %u,"
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003004 "\n[dropped] BK %u, BE %u, VI %u, VO %u"
3005 "\n[classified] BK %u, BE %u, VI %u, VO %u"
3006 "\n\nReceive[%lu] - "
3007 "packets %u, dropped %u, delivered %u, refused %u"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008 "\n",
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003009 qdf_system_ticks(),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010 pStats->txXmitCalled,
3011 pStats->txXmitDropped,
Mohit Khannad0b63f52017-02-18 18:05:52 -08003012 pStats->txXmitOrphaned,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013
3014 pStats->txXmitDroppedAC[SME_AC_BK],
3015 pStats->txXmitDroppedAC[SME_AC_BE],
3016 pStats->txXmitDroppedAC[SME_AC_VI],
3017 pStats->txXmitDroppedAC[SME_AC_VO],
3018
3019 pStats->txXmitClassifiedAC[SME_AC_BK],
3020 pStats->txXmitClassifiedAC[SME_AC_BE],
3021 pStats->txXmitClassifiedAC[SME_AC_VI],
3022 pStats->txXmitClassifiedAC[SME_AC_VO],
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003023 qdf_system_ticks(),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003024 total_rx_pkt, total_rx_dropped, total_rx_delv, total_rx_refused
3025 );
3026
3027 for (i = 0; i < NUM_CPUS; i++) {
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003028 if (pStats->rxPackets[i] == 0)
3029 continue;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 len += scnprintf(buffer + len, buf_len - len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003031 "Rx CPU[%d]:"
3032 "packets %u, dropped %u, delivered %u, refused %u\n",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033 i, pStats->rxPackets[i], pStats->rxDropped[i],
3034 pStats->rxDelivered[i], pStats->rxRefused[i]);
3035 }
3036
3037 len += scnprintf(buffer + len, buf_len - len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003038 "\nTX_FLOW"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039 "\nCurrent status: %s"
3040 "\ntx-flow timer start count %u"
3041 "\npause count %u, unpause count %u",
3042 (pStats->is_txflow_paused == true ? "PAUSED" : "UNPAUSED"),
3043 pStats->txflow_timer_cnt,
3044 pStats->txflow_pause_cnt,
3045 pStats->txflow_unpause_cnt);
3046
Leo Changfdb45c32016-10-28 11:09:23 -07003047 len += cdp_stats(cds_get_context(QDF_MODULE_ID_SOC),
3048 pAdapter->sessionId, &buffer[len], (buf_len - len));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003049 *length = len + 1;
3050}
3051
3052/**
Dustin Brownd9322482017-01-09 12:46:03 -08003053 * wlan_hdd_write_suspend_resume_stats() - Writes suspend/resume stats to buffer
3054 * @hdd_ctx: The Hdd context owning the stats to be written
3055 * @buffer: The char buffer to write to
3056 * @max_len: The maximum number of chars to write
3057 *
3058 * This assumes hdd_ctx has already been validated, and buffer is not NULL.
3059 *
3060 * Return - length of written content, negative number on error
3061 */
3062static int wlan_hdd_write_suspend_resume_stats(hdd_context_t *hdd_ctx,
3063 char *buffer, uint16_t max_len)
3064{
3065 QDF_STATUS status;
3066 struct suspend_resume_stats *sr_stats;
3067 struct sir_wake_lock_stats wow_stats;
3068
3069 sr_stats = &hdd_ctx->suspend_resume_stats;
3070
3071 status = wma_get_wakelock_stats(&wow_stats);
3072 if (QDF_IS_STATUS_ERROR(status)) {
3073 hdd_err("Failed to get WoW stats");
3074 return qdf_status_to_os_return(status);
3075 }
3076
3077 return scnprintf(buffer, max_len,
3078 "\n"
3079 "Suspends: %u\n"
3080 "Resumes: %u\n"
3081 "\n"
3082 "Suspend Fail Reasons\n"
3083 "\tIPA: %u\n"
3084 "\tRadar: %u\n"
3085 "\tRoam: %u\n"
3086 "\tScan: %u\n"
3087 "\tInitial Wakeup: %u\n"
3088 "\n"
3089 "WoW Wake Reasons\n"
3090 "\tunicast: %u\n"
3091 "\tbroadcast: %u\n"
3092 "\tIPv4 multicast: %u\n"
3093 "\tIPv6 multicast: %u\n"
3094 "\tIPv6 multicast RA: %u\n"
3095 "\tIPv6 multicast NS: %u\n"
3096 "\tIPv6 multicast NA: %u\n"
3097 "\tICMPv4: %u\n"
3098 "\tICMPv6: %u\n"
3099 "\tRSSI Breach: %u\n"
3100 "\tLow RSSI: %u\n"
3101 "\tG-Scan: %u\n"
3102 "\tPNO Complete: %u\n"
3103 "\tPNO Match: %u\n",
3104 sr_stats->suspends,
3105 sr_stats->resumes,
3106 sr_stats->suspend_fail[SUSPEND_FAIL_IPA],
3107 sr_stats->suspend_fail[SUSPEND_FAIL_RADAR],
3108 sr_stats->suspend_fail[SUSPEND_FAIL_ROAM],
3109 sr_stats->suspend_fail[SUSPEND_FAIL_SCAN],
3110 sr_stats->suspend_fail[SUSPEND_FAIL_INITIAL_WAKEUP],
3111 wow_stats.wow_ucast_wake_up_count,
3112 wow_stats.wow_bcast_wake_up_count,
3113 wow_stats.wow_ipv4_mcast_wake_up_count,
3114 wow_stats.wow_ipv6_mcast_wake_up_count,
3115 wow_stats.wow_ipv6_mcast_ra_stats,
3116 wow_stats.wow_ipv6_mcast_ns_stats,
3117 wow_stats.wow_ipv6_mcast_na_stats,
3118 wow_stats.wow_icmpv4_count,
3119 wow_stats.wow_icmpv6_count,
3120 wow_stats.wow_rssi_breach_wake_up_count,
3121 wow_stats.wow_low_rssi_wake_up_count,
3122 wow_stats.wow_gscan_wake_up_count,
3123 wow_stats.wow_pno_complete_wake_up_count,
3124 wow_stats.wow_pno_match_wake_up_count);
3125}
3126
3127/**
Govind Singha471e5e2015-10-12 17:11:14 +05303128 * hdd_wlan_list_fw_profile() - Get fw profiling points
3129 * @length: Size of the data copied
3130 * @buffer: Pointer to char buffer.
3131 * @buf_len: Length of the char buffer.
3132 *
3133 * This function called when the "iwpriv wlan0 listProfile" command is given.
3134 * It is used to get the supported profiling points in FW.
3135 *
3136 * Return - none
3137 */
3138void hdd_wlan_list_fw_profile(uint16_t *length,
3139 char *buffer, uint16_t buf_len)
3140{
3141 uint32_t len = 0;
3142
3143 len = scnprintf(buffer, buf_len,
3144 "PROF_CPU_IDLE: %u\n"
3145 "PROF_PPDU_PROC: %u\n"
3146 "PROF_PPDU_POST: %u\n"
3147 "PROF_HTT_TX_INPUT: %u\n"
3148 "PROF_MSDU_ENQ: %u\n"
3149 "PROF_PPDU_POST_HAL: %u\n"
3150 "PROF_COMPUTE_TX_TIME: %u\n",
3151 PROF_CPU_IDLE,
3152 PROF_PPDU_PROC,
3153 PROF_PPDU_POST,
3154 PROF_HTT_TX_INPUT,
3155 PROF_MSDU_ENQ,
3156 PROF_PPDU_POST_HAL,
3157 PROF_COMPUTE_TX_TIME);
3158
3159 *length = len + 1;
3160}
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003161/**
3162 * hdd_display_stats_help() - print statistics help
3163 *
3164 * Return: none
3165 */
3166void hdd_display_stats_help(void)
3167{
3168 hdd_err("iwpriv wlan0 dumpStats [option] - dump statistics");
3169 hdd_err("iwpriv wlan0 clearStats [option] - clear statistics");
3170 hdd_err("options:");
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003171 hdd_err(" 1 -- TXRX PATH statistics");
3172 hdd_err(" 2 -- TXRX HIST statistics");
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003173 hdd_err(" 3 -- TSO statistics");
3174 hdd_err(" 4 -- Network queue statistics");
3175 hdd_err(" 5 -- Flow control statistics");
3176 hdd_err(" 6 -- Per Layer statistics");
3177 hdd_err(" 7 -- Copy engine interrupt statistics");
3178 hdd_err(" 8 -- LRO statistics");
3179 hdd_err(" 9 -- NAPI statistics");
3180}
Govind Singha471e5e2015-10-12 17:11:14 +05303181
3182/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003183 * hdd_wlan_dump_stats() - display dump Stats
3184 * @adapter: adapter handle
3185 * @value: value from user
3186 *
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003187 * Return: 0 => success, error code on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003188 */
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003189int hdd_wlan_dump_stats(hdd_adapter_t *adapter, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003190{
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003191 int ret = 0;
3192 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003193 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
3194
3195 switch (value) {
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003196 case CDP_TXRX_HIST_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197 wlan_hdd_display_tx_rx_histogram(hdd_ctx);
3198 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003199 case CDP_HDD_NETIF_OPER_HISTORY:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200 wlan_hdd_display_netif_queue_history(hdd_ctx);
3201 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003202 case CDP_HIF_STATS:
Nirav Shahbf1b0332016-05-25 14:27:39 +05303203 hdd_display_hif_stats();
3204 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003205 case CDP_LRO_STATS:
Dhanashri Atree7d442a2016-07-14 18:20:29 -07003206 hdd_lro_display_stats(hdd_ctx);
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003207 case CDP_NAPI_STATS:
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003208 if (hdd_display_napi_stats()) {
3209 hdd_err("error displaying napi stats");
3210 ret = EFAULT;
3211 }
Dhanashri Atree7d442a2016-07-14 18:20:29 -07003212 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003213 default:
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003214 status = cdp_display_stats(cds_get_context(QDF_MODULE_ID_SOC),
3215 value);
3216 if (status == QDF_STATUS_E_INVAL) {
3217 hdd_display_stats_help();
3218 ret = EINVAL;
3219 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220 break;
3221 }
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003222 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223}
3224
3225/**
3226 * hdd_wlan_get_version() - Get driver version information
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303227 * @hdd_ctx: Global HDD context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 * @wrqu: Pointer to IOCTL REQUEST Data.
3229 * @extra: Pointer to destination buffer
3230 *
3231 * This function is used to get Wlan Driver, Firmware, & Hardware
3232 * Version information. If @wrqu and @extra are specified, then the
3233 * version string is returned. Otherwise it is simply printed to the
3234 * kernel log.
3235 *
3236 * Return: none
3237 */
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303238void hdd_wlan_get_version(hdd_context_t *hdd_ctx, union iwreq_data *wrqu,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003239 char *extra)
3240{
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303241 tSirVersionString wcnss_sw_version;
3242 const char *swversion;
3243 const char *hwversion;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003244 uint32_t msp_id = 0, mspid = 0, siid = 0, crmid = 0, sub_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003245
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303246 if (!hdd_ctx) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003247 hdd_err("Invalid context, HDD context is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003248 goto error;
3249 }
3250
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303251 snprintf(wcnss_sw_version, sizeof(wcnss_sw_version), "%08x",
3252 hdd_ctx->target_fw_version);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003253
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303254 swversion = wcnss_sw_version;
3255 msp_id = (hdd_ctx->target_fw_version & 0xf0000000) >> 28;
3256 mspid = (hdd_ctx->target_fw_version & 0xf000000) >> 24;
3257 siid = (hdd_ctx->target_fw_version & 0xf00000) >> 20;
3258 crmid = hdd_ctx->target_fw_version & 0x7fff;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003259 sub_id = (hdd_ctx->target_fw_vers_ext & 0xf0000000) >> 28;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003260
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303261 hwversion = hdd_ctx->target_hw_name;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003262
3263 if (wrqu && extra) {
3264 wrqu->data.length =
3265 scnprintf(extra, WE_MAX_STR_LEN,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003266 "Host SW:%s, FW:%d.%d.%d.%d.%d, HW:%s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003267 QWLAN_VERSIONSTR,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003268 msp_id, mspid, siid, crmid,
3269 sub_id, hwversion);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003270 } else {
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003271 pr_info("Host SW:%s, FW:%d.%d.%d.%d.%d, HW:%s\n",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003272 QWLAN_VERSIONSTR,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003273 msp_id, mspid, siid, crmid, sub_id, hwversion);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003274 }
3275error:
3276 return;
3277}
3278
3279/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003280 * hdd_wlan_get_ibss_mac_addr_from_staid() - Get IBSS MAC address
3281 * @pAdapter: Adapter upon which the IBSS client is active
3282 * @staIdx: Station index of the IBSS peer
3283 *
3284 * Return: a pointer to the MAC address of the IBSS peer if the peer is
3285 * found, otherwise %NULL.
3286 */
3287struct qdf_mac_addr *
3288hdd_wlan_get_ibss_mac_addr_from_staid(hdd_adapter_t *pAdapter,
3289 uint8_t staIdx)
3290{
3291 uint8_t idx;
3292 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3293
Naveen Rawatc45d1622016-07-05 12:20:09 -07003294 for (idx = 0; idx < MAX_PEERS; idx++) {
Naveen Rawatac027cb2017-04-27 15:02:42 -07003295 if (HDD_WLAN_INVALID_STA_ID !=
3296 pHddStaCtx->conn_info.staId[idx] &&
3297 staIdx == pHddStaCtx->conn_info.staId[idx]) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003298 return &pHddStaCtx->conn_info.peerMacAddress[idx];
3299 }
3300 }
3301 return NULL;
3302}
3303
3304/**
3305 * hdd_wlan_get_ibss_peer_info() - Print IBSS peer information
3306 * @pAdapter: Adapter upon which the IBSS client is active
3307 * @staIdx: Station index of the IBSS peer
3308 *
3309 * Return: QDF_STATUS_STATUS if the peer was found and displayed,
3310 * otherwise an appropriate QDF_STATUS_E_* failure code.
3311 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003312static QDF_STATUS hdd_wlan_get_ibss_peer_info(hdd_adapter_t *pAdapter,
3313 uint8_t staIdx)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003314{
3315 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3316 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
3317 hdd_station_ctx_t *pStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003318 tSirPeerInfoRspParams *pPeerInfo = &pStaCtx->ibss_peer_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003319
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003320 INIT_COMPLETION(pAdapter->ibss_peer_info_comp);
Prakash Dhavali4c2a9fe2016-12-02 16:01:08 -08003321 status = sme_request_ibss_peer_info(hHal, pAdapter,
3322 hdd_get_ibss_peer_info_cb,
3323 false, staIdx);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003324
3325 if (QDF_STATUS_SUCCESS == status) {
3326 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003327
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003328 rc = wait_for_completion_timeout
3329 (&pAdapter->ibss_peer_info_comp,
3330 msecs_to_jiffies(IBSS_PEER_INFO_REQ_TIMOEUT));
3331 if (!rc) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003332 hdd_err("failed wait on ibss_peer_info_comp");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003333 return QDF_STATUS_E_FAILURE;
3334 }
3335
3336 /** Print the peer info */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003337 hdd_debug("pPeerInfo->numIBSSPeers = %d ", pPeerInfo->numPeers);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003338 {
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003339 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
3340 uint32_t tx_rate = pPeerInfo->peerInfoParams[0].txRate;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003341
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003342 qdf_mem_copy(mac_addr, pPeerInfo->peerInfoParams[0].
3343 mac_addr, sizeof(mac_addr));
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003344 hdd_debug("PEER ADDR : %pM TxRate: %d Mbps RSSI: %d",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003345 mac_addr, (int)tx_rate,
3346 (int)pPeerInfo->peerInfoParams[0].rssi);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003347 }
3348 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07003349 hdd_warn("Warning: sme_request_ibss_peer_info Request failed");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003350 }
3351
3352 return status;
3353}
3354
3355/**
3356 * hdd_wlan_get_ibss_peer_info_all() - Print all IBSS peers
3357 * @pAdapter: Adapter upon which the IBSS clients are active
3358 *
3359 * Return: QDF_STATUS_STATUS if the peer information was retrieved and
3360 * displayed, otherwise an appropriate QDF_STATUS_E_* failure code.
3361 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003362static QDF_STATUS hdd_wlan_get_ibss_peer_info_all(hdd_adapter_t *pAdapter)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003363{
3364 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3365 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
3366 hdd_station_ctx_t *pStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003367 tSirPeerInfoRspParams *pPeerInfo = &pStaCtx->ibss_peer_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003368 int i;
3369
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003370 INIT_COMPLETION(pAdapter->ibss_peer_info_comp);
Prakash Dhavali4c2a9fe2016-12-02 16:01:08 -08003371 status = sme_request_ibss_peer_info(hHal, pAdapter,
3372 hdd_get_ibss_peer_info_cb,
3373 true, 0xFF);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003374
3375 if (QDF_STATUS_SUCCESS == status) {
3376 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003377
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003378 rc = wait_for_completion_timeout
3379 (&pAdapter->ibss_peer_info_comp,
3380 msecs_to_jiffies(IBSS_PEER_INFO_REQ_TIMOEUT));
3381 if (!rc) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003382 hdd_err("failed wait on ibss_peer_info_comp");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003383 return QDF_STATUS_E_FAILURE;
3384 }
3385
3386 /** Print the peer info */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003387 hdd_debug("pPeerInfo->numIBSSPeers = %d ",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003388 (int)pPeerInfo->numPeers);
3389 for (i = 0; i < pPeerInfo->numPeers; i++) {
3390 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
3391 uint32_t tx_rate;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003392
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003393 tx_rate = pPeerInfo->peerInfoParams[i].txRate;
3394 qdf_mem_copy(mac_addr,
3395 pPeerInfo->peerInfoParams[i].mac_addr,
3396 sizeof(mac_addr));
3397
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003398 hdd_debug(" PEER ADDR : %pM TxRate: %d Mbps RSSI: %d",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003399 mac_addr, (int)tx_rate,
3400 (int)pPeerInfo->peerInfoParams[i].rssi);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003401 }
3402 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07003403 hdd_warn("Warning: sme_request_ibss_peer_info Request failed");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003404 }
3405
3406 return status;
3407}
3408
3409/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 * hdd_wlan_get_freq() - Convert channel to frequency
3411 * @channel: channel to be converted
3412 * @pfreq: where to store the frequency
3413 *
3414 * Return: 1 on success, otherwise a negative errno
3415 */
3416int hdd_wlan_get_freq(uint32_t channel, uint32_t *pfreq)
3417{
3418 int i;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003419
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420 if (channel > 0) {
3421 for (i = 0; i < FREQ_CHAN_MAP_TABLE_SIZE; i++) {
3422 if (channel == freq_chan_map[i].chan) {
3423 *pfreq = freq_chan_map[i].freq;
3424 return 1;
3425 }
3426 }
3427 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003428 hdd_err("Invalid channel no=%d!!", channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003429 return -EINVAL;
3430}
3431
3432/**
3433 * hdd_is_auth_type_rsn() - RSN authentication type check
3434 * @authType: authentication type to be checked
3435 *
3436 * Return: true if @authType is an RSN authentication type,
3437 * false if it is not
3438 */
3439static bool hdd_is_auth_type_rsn(eCsrAuthType authType)
3440{
3441 bool rsnType = false;
3442 /* is the authType supported? */
3443 switch (authType) {
3444 case eCSR_AUTH_TYPE_NONE: /* never used */
3445 rsnType = false;
3446 break;
3447 /* MAC layer authentication types */
3448 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3449 rsnType = false;
3450 break;
3451 case eCSR_AUTH_TYPE_SHARED_KEY:
3452 rsnType = false;
3453 break;
3454 case eCSR_AUTH_TYPE_AUTOSWITCH:
3455 rsnType = false;
3456 break;
3457
3458 /* Upper layer authentication types */
3459 case eCSR_AUTH_TYPE_WPA:
3460 rsnType = true;
3461 break;
3462 case eCSR_AUTH_TYPE_WPA_PSK:
3463 rsnType = true;
3464 break;
3465 case eCSR_AUTH_TYPE_WPA_NONE:
3466 rsnType = true;
3467 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003468 case eCSR_AUTH_TYPE_FT_RSN:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 case eCSR_AUTH_TYPE_RSN:
3470 rsnType = true;
3471 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472 case eCSR_AUTH_TYPE_FT_RSN_PSK:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003473 case eCSR_AUTH_TYPE_RSN_PSK:
3474#ifdef WLAN_FEATURE_11W
3475 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
3476 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
3477#endif
3478 rsnType = true;
3479 break;
3480 /* case eCSR_AUTH_TYPE_FAILED: */
3481 case eCSR_AUTH_TYPE_UNKNOWN:
3482 rsnType = false;
3483 break;
3484 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07003485 hdd_err("unknown authType %d, treat as open",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003486 authType);
3487 rsnType = false;
3488 break;
3489 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003490 hdd_debug("called with authType: %d, returned: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491 authType, rsnType);
3492 return rsnType;
3493}
3494
Jeff Johnsona5444942017-01-23 13:11:08 -08003495struct rssi_priv {
3496 int8_t rssi;
3497};
3498
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003499/**
3500 * hdd_get_rssi_cb() - "Get RSSI" callback function
3501 * @rssi: Current RSSI of the station
Jeff Johnsona5444942017-01-23 13:11:08 -08003502 * @sta_id: ID of the station
3503 * @context: opaque context originally passed to SME. HDD always passes
3504 * a cookie for the request context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003505 *
3506 * Return: None
3507 */
Jeff Johnsona5444942017-01-23 13:11:08 -08003508static void hdd_get_rssi_cb(int8_t rssi, uint32_t sta_id, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509{
Jeff Johnsona5444942017-01-23 13:11:08 -08003510 struct hdd_request *request;
3511 struct rssi_priv *priv;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512
Jeff Johnsona5444942017-01-23 13:11:08 -08003513 request = hdd_request_get(context);
3514 if (!request) {
3515 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 return;
3517 }
3518
Jeff Johnsona5444942017-01-23 13:11:08 -08003519 priv = hdd_request_priv(request);
3520 priv->rssi = rssi;
3521 hdd_request_complete(request);
3522 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523}
3524
3525/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526 * wlan_hdd_get_rssi() - Get the current RSSI
3527 * @pAdapter: adapter upon which the measurement is requested
3528 * @rssi_value: pointer to where the RSSI should be returned
3529 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303530 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303532QDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 hdd_context_t *pHddCtx;
3535 hdd_station_ctx_t *pHddStaCtx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303536 QDF_STATUS hstatus;
Jeff Johnsona5444942017-01-23 13:11:08 -08003537 int ret;
3538 void *cookie;
3539 struct hdd_request *request;
3540 struct rssi_priv *priv;
3541 static const struct hdd_request_params params = {
3542 .priv_size = sizeof(*priv),
3543 .timeout_ms = WLAN_WAIT_TIME_STATS,
3544 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545
3546 if (NULL == pAdapter) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003547 hdd_err("Invalid context, pAdapter");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303548 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549 }
Hanumanth Reddy Pothula2a8a7402017-07-03 14:06:11 +05303550 if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
Prashanth Bhatta9e143052015-12-04 11:56:47 -08003551 hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
3552 cds_get_driver_state());
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 /* return a cached value */
3554 *rssi_value = pAdapter->rssi;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303555 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 }
3557
3558 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3559 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3560
3561 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003562 hdd_debug("Not associated!, rssi on disconnect %d",
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05303563 pAdapter->rssi_on_disconnect);
3564 *rssi_value = pAdapter->rssi_on_disconnect;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303565 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 }
3567
3568 if (pHddStaCtx->hdd_ReassocScenario) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003569 hdd_debug("Roaming in progress, return cached RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003570 *rssi_value = pAdapter->rssi;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303571 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003572 }
3573
Jeff Johnsona5444942017-01-23 13:11:08 -08003574 request = hdd_request_alloc(&params);
3575 if (!request) {
3576 hdd_err("Request allocation failure, return cached RSSI");
3577 *rssi_value = pAdapter->rssi;
3578 return QDF_STATUS_SUCCESS;
3579 }
3580 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003581
3582 hstatus = sme_get_rssi(pHddCtx->hHal, hdd_get_rssi_cb,
3583 pHddStaCtx->conn_info.staId[0],
3584 pHddStaCtx->conn_info.bssId, pAdapter->rssi,
Jeff Johnsona5444942017-01-23 13:11:08 -08003585 cookie, pHddCtx->pcds_context);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303586 if (QDF_STATUS_SUCCESS != hstatus) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003587 hdd_err("Unable to retrieve RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588 /* we'll returned a cached value below */
3589 } else {
3590 /* request was sent -- wait for the response */
Jeff Johnsona5444942017-01-23 13:11:08 -08003591 ret = hdd_request_wait_for_response(request);
3592 if (ret) {
3593 hdd_warn("SME timed out while retrieving RSSI");
3594 /* we'll returned a cached value below */
3595 } else {
3596 /* update the adapter with the fresh results */
3597 priv = hdd_request_priv(request);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +05303598 /*
3599 * update rssi only if its valid else return previous
3600 * valid rssi.
3601 */
3602 if (priv->rssi)
3603 pAdapter->rssi = priv->rssi;
3604
3605 /*
3606 * for new connection there might be no valid previous
3607 * RSSI.
3608 */
3609 if (!pAdapter->rssi) {
3610 hdd_get_rssi_snr_by_bssid(pAdapter,
3611 pHddStaCtx->conn_info.bssId.bytes,
3612 &pAdapter->rssi, NULL);
3613 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003614 }
3615 }
3616
Jeff Johnsona5444942017-01-23 13:11:08 -08003617 /*
3618 * either we never sent a request, we sent a request and
3619 * received a response or we sent a request and timed out.
3620 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621 */
Jeff Johnsona5444942017-01-23 13:11:08 -08003622 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623
3624 *rssi_value = pAdapter->rssi;
3625
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303626 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003627}
3628
Jeff Johnson002cb972017-01-23 14:59:07 -08003629struct snr_priv {
3630 int8_t snr;
3631};
3632
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633/**
Jeff Johnson8eaff302017-01-23 11:03:31 -08003634 * hdd_get_snr_cb() - "Get SNR" callback function
3635 * @snr: Current SNR of the station
Jeff Johnson002cb972017-01-23 14:59:07 -08003636 * @sta_id: ID of the station
3637 * @context: opaque context originally passed to SME. HDD always passes
3638 * a cookie for the request context
Jeff Johnson8eaff302017-01-23 11:03:31 -08003639 *
3640 * Return: None
3641 */
Jeff Johnson002cb972017-01-23 14:59:07 -08003642static void hdd_get_snr_cb(int8_t snr, uint32_t sta_id, void *context)
Jeff Johnson8eaff302017-01-23 11:03:31 -08003643{
Jeff Johnson002cb972017-01-23 14:59:07 -08003644 struct hdd_request *request;
3645 struct snr_priv *priv;
Jeff Johnson8eaff302017-01-23 11:03:31 -08003646
Jeff Johnson002cb972017-01-23 14:59:07 -08003647 request = hdd_request_get(context);
3648 if (!request) {
3649 hdd_err("Obsolete request");
Jeff Johnson8eaff302017-01-23 11:03:31 -08003650 return;
3651 }
3652
Jeff Johnson002cb972017-01-23 14:59:07 -08003653 /* propagate response back to requesting thread */
3654 priv = hdd_request_priv(request);
3655 priv->snr = snr;
3656 hdd_request_complete(request);
3657 hdd_request_put(request);
Jeff Johnson8eaff302017-01-23 11:03:31 -08003658}
3659
3660/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661 * wlan_hdd_get_snr() - Get the current SNR
3662 * @pAdapter: adapter upon which the measurement is requested
3663 * @snr: pointer to where the SNR should be returned
3664 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303665 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003666 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303667QDF_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, int8_t *snr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 hdd_context_t *pHddCtx;
3670 hdd_station_ctx_t *pHddStaCtx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303671 QDF_STATUS hstatus;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003672 int valid;
Jeff Johnson002cb972017-01-23 14:59:07 -08003673 int ret;
3674 void *cookie;
3675 struct hdd_request *request;
3676 struct snr_priv *priv;
3677 static const struct hdd_request_params params = {
3678 .priv_size = sizeof(*priv),
3679 .timeout_ms = WLAN_WAIT_TIME_STATS,
3680 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303682 ENTER();
3683
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003685 hdd_err("Invalid context, pAdapter");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303686 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687 }
3688
3689 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3690
3691 valid = wlan_hdd_validate_context(pHddCtx);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303692 if (0 != valid)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303693 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003694
3695 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3696
Jeff Johnson002cb972017-01-23 14:59:07 -08003697 request = hdd_request_alloc(&params);
3698 if (!request) {
3699 hdd_err("Request allocation failure");
3700 return QDF_STATUS_E_FAULT;
3701 }
3702 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703
3704 hstatus = sme_get_snr(pHddCtx->hHal, hdd_get_snr_cb,
3705 pHddStaCtx->conn_info.staId[0],
Jeff Johnson002cb972017-01-23 14:59:07 -08003706 pHddStaCtx->conn_info.bssId, cookie);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303707 if (QDF_STATUS_SUCCESS != hstatus) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003708 hdd_err("Unable to retrieve RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003709 /* we'll returned a cached value below */
3710 } else {
3711 /* request was sent -- wait for the response */
Jeff Johnson002cb972017-01-23 14:59:07 -08003712 ret = hdd_request_wait_for_response(request);
3713 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003714 hdd_err("SME timed out while retrieving SNR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 /* we'll now returned a cached value below */
Jeff Johnson002cb972017-01-23 14:59:07 -08003716 } else {
3717 /* update the adapter with the fresh results */
3718 priv = hdd_request_priv(request);
3719 pAdapter->snr = priv->snr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003720 }
3721 }
3722
Jeff Johnson002cb972017-01-23 14:59:07 -08003723 /*
3724 * either we never sent a request, we sent a request and
3725 * received a response or we sent a request and timed out.
3726 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003727 */
Jeff Johnson002cb972017-01-23 14:59:07 -08003728 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729
3730 *snr = pAdapter->snr;
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303731 EXIT();
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733}
3734
Jeff Johnsone50427c2017-01-26 10:54:49 -08003735struct linkspeed_priv {
3736 tSirLinkSpeedInfo linkspeed_info;
3737};
3738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739static void
Jeff Johnsone50427c2017-01-26 10:54:49 -08003740hdd_get_link_speed_cb(tSirLinkSpeedInfo *linkspeed_info, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003741{
Jeff Johnsone50427c2017-01-26 10:54:49 -08003742 struct hdd_request *request;
3743 struct linkspeed_priv *priv;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003744
Jeff Johnsone50427c2017-01-26 10:54:49 -08003745 if (!linkspeed_info) {
3746 hdd_err("NULL linkspeed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003747 return;
3748 }
3749
Jeff Johnsone50427c2017-01-26 10:54:49 -08003750 request = hdd_request_get(context);
3751 if (!request) {
3752 hdd_err("Obsolete request");
3753 return;
3754 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755
Jeff Johnsone50427c2017-01-26 10:54:49 -08003756 priv = hdd_request_priv(request);
3757 priv->linkspeed_info = *linkspeed_info;
3758 hdd_request_complete(request);
3759 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760}
3761
Jeff Johnsone50427c2017-01-26 10:54:49 -08003762int wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *adapter,
3763 struct qdf_mac_addr *mac_address,
3764 uint32_t *linkspeed)
3765{
3766 int ret;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303767 QDF_STATUS status;
Jeff Johnsone50427c2017-01-26 10:54:49 -08003768 void *cookie;
3769 tSirLinkSpeedInfo *linkspeed_info;
3770 struct hdd_request *request;
3771 struct linkspeed_priv *priv;
3772 static const struct hdd_request_params params = {
3773 .priv_size = sizeof(*priv),
3774 .timeout_ms = WLAN_WAIT_TIME_STATS,
3775 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003776
Jeff Johnsone50427c2017-01-26 10:54:49 -08003777 if ((!adapter) || (!linkspeed)) {
3778 hdd_err("NULL argument");
3779 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781
Jeff Johnsone50427c2017-01-26 10:54:49 -08003782 request = hdd_request_alloc(&params);
3783 if (!request) {
3784 hdd_err("Request allocation failure");
3785 ret = -ENOMEM;
3786 goto return_cached_value;
3787 }
3788
3789 cookie = hdd_request_cookie(request);
3790 priv = hdd_request_priv(request);
3791
3792 linkspeed_info = &priv->linkspeed_info;
3793 qdf_copy_macaddr(&linkspeed_info->peer_macaddr, mac_address);
3794 status = sme_get_link_speed(WLAN_HDD_GET_HAL_CTX(adapter),
3795 linkspeed_info,
3796 cookie, hdd_get_link_speed_cb);
3797 if (QDF_IS_STATUS_ERROR(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003798 hdd_err("Unable to retrieve statistics for link speed");
Jeff Johnsone50427c2017-01-26 10:54:49 -08003799 ret = qdf_status_to_os_return(status);
3800 goto cleanup;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003801 }
Jeff Johnsone50427c2017-01-26 10:54:49 -08003802 ret = hdd_request_wait_for_response(request);
3803 if (ret) {
3804 hdd_err("SME timed out while retrieving link speed");
3805 goto cleanup;
3806 }
3807 adapter->estimated_linkspeed = linkspeed_info->estLinkSpeed;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003808
Jeff Johnsone50427c2017-01-26 10:54:49 -08003809cleanup:
3810 /*
3811 * either we never sent a request, we sent a request and
3812 * received a response or we sent a request and timed out.
3813 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 */
Jeff Johnsone50427c2017-01-26 10:54:49 -08003815 hdd_request_put(request);
3816
3817return_cached_value:
3818 *linkspeed = adapter->estimated_linkspeed;
3819
3820 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003821}
3822
3823/**
3824 * wlan_hdd_get_link_speed() - get link speed
3825 * @pAdapter: pointer to the adapter
3826 * @link_speed: pointer to link speed
3827 *
3828 * This function fetches per bssid link speed.
3829 *
3830 * Return: if associated, link speed shall be returned.
3831 * if not associated, link speed of 0 is returned.
3832 * On error, error number will be returned.
3833 */
3834int wlan_hdd_get_link_speed(hdd_adapter_t *sta_adapter, uint32_t *link_speed)
3835{
3836 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(sta_adapter);
3837 hdd_station_ctx_t *hdd_stactx =
3838 WLAN_HDD_GET_STATION_CTX_PTR(sta_adapter);
3839 int ret;
3840
3841 ret = wlan_hdd_validate_context(hddctx);
Abhishek Singh23edd1c2016-05-05 11:56:06 +05303842 if (ret)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003844
Nitesh Shah4e2d5eb2016-09-06 19:45:13 +05303845 /* Linkspeed is allowed only for P2P mode */
3846 if (sta_adapter->device_mode != QDF_P2P_CLIENT_MODE) {
3847 hdd_err("Link Speed is not allowed in Device mode %s(%d)",
3848 hdd_device_mode_to_string(sta_adapter->device_mode),
3849 sta_adapter->device_mode);
3850 return -ENOTSUPP;
3851 }
3852
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003853 if (eConnectionState_Associated != hdd_stactx->conn_info.connState) {
3854 /* we are not connected so we don't have a classAstats */
3855 *link_speed = 0;
3856 } else {
Anurag Chouhan6d760662016-02-20 16:05:43 +05303857 struct qdf_mac_addr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003858
Anurag Chouhanc5548422016-02-24 18:33:27 +05303859 qdf_copy_macaddr(&bssid, &hdd_stactx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860
Jeff Johnsone50427c2017-01-26 10:54:49 -08003861 ret = wlan_hdd_get_linkspeed_for_peermac(sta_adapter, &bssid,
3862 link_speed);
3863 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003864 hdd_err("Unable to retrieve SME linkspeed");
Jeff Johnsone50427c2017-01-26 10:54:49 -08003865 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 /* linkspeed in units of 500 kbps */
3868 *link_speed = (*link_speed) / 500;
3869 }
3870 return 0;
3871}
3872
3873/**
3874 * hdd_statistics_cb() - "Get statistics" callback function
3875 * @pStats: statistics payload
3876 * @pContext: opaque context originally passed to SME. HDD always passes
3877 * a pointer to an adapter
3878 *
3879 * Return: None
3880 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003881static void hdd_statistics_cb(void *pStats, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882{
3883 hdd_adapter_t *pAdapter = (hdd_adapter_t *) pContext;
3884 hdd_stats_t *pStatsCache = NULL;
3885 hdd_wext_state_t *pWextState;
Anurag Chouhance0dc992016-02-16 18:18:03 +05303886 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003887
3888 tCsrSummaryStatsInfo *pSummaryStats = NULL;
3889 tCsrGlobalClassAStatsInfo *pClassAStats = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003890 tCsrGlobalClassDStatsInfo *pClassDStats = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891
3892 if (pAdapter != NULL)
3893 pStatsCache = &pAdapter->hdd_stats;
3894
3895 pSummaryStats = (tCsrSummaryStatsInfo *) pStats;
3896 pClassAStats = (tCsrGlobalClassAStatsInfo *) (pSummaryStats + 1);
Jeff Johnsonf2dac4f2017-03-16 11:41:31 -07003897 pClassDStats = (tCsrGlobalClassDStatsInfo *) (pClassAStats + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003898
3899 if (pStatsCache != NULL) {
3900 /* copy the stats into the cache we keep in the
3901 * adapter instance structure
3902 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303903 qdf_mem_copy(&pStatsCache->summary_stat, pSummaryStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904 sizeof(pStatsCache->summary_stat));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303905 qdf_mem_copy(&pStatsCache->ClassA_stat, pClassAStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 sizeof(pStatsCache->ClassA_stat));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303907 qdf_mem_copy(&pStatsCache->ClassD_stat, pClassDStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 sizeof(pStatsCache->ClassD_stat));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909 }
3910
3911 if (pAdapter) {
3912 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303913 qdf_status = qdf_event_set(&pWextState->hdd_qdf_event);
Anurag Chouhance0dc992016-02-16 18:18:03 +05303914 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003915 hdd_err("qdf_event_set failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916 return;
3917 }
3918 }
3919}
3920
3921/**
3922 * hdd_clear_roam_profile_ie() - Clear Roam Profile IEs
3923 * @pAdapter: adapter who's IEs are to be cleared
3924 *
3925 * Return: None
3926 */
3927void hdd_clear_roam_profile_ie(hdd_adapter_t *pAdapter)
3928{
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07003929 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -07003930
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07003931 ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003932
3933 /* clear WPA/RSN/WSC IE information in the profile */
3934 pWextState->roamProfile.nWPAReqIELength = 0;
3935 pWextState->roamProfile.pWPAReqIE = (uint8_t *) NULL;
3936 pWextState->roamProfile.nRSNReqIELength = 0;
3937 pWextState->roamProfile.pRSNReqIE = (uint8_t *) NULL;
3938
3939#ifdef FEATURE_WLAN_WAPI
3940 pWextState->roamProfile.nWAPIReqIELength = 0;
3941 pWextState->roamProfile.pWAPIReqIE = (uint8_t *) NULL;
3942#endif
3943
3944 pWextState->roamProfile.bWPSAssociation = false;
3945 pWextState->roamProfile.bOSENAssociation = false;
3946 pWextState->roamProfile.pAddIEScan = (uint8_t *) NULL;
3947 pWextState->roamProfile.nAddIEScanLength = 0;
3948 pWextState->roamProfile.pAddIEAssoc = (uint8_t *) NULL;
3949 pWextState->roamProfile.nAddIEAssocLength = 0;
3950
3951 pWextState->roamProfile.EncryptionType.numEntries = 1;
3952 pWextState->roamProfile.EncryptionType.encryptionType[0]
3953 = eCSR_ENCRYPT_TYPE_NONE;
3954
3955 pWextState->roamProfile.mcEncryptionType.numEntries = 1;
3956 pWextState->roamProfile.mcEncryptionType.encryptionType[0]
3957 = eCSR_ENCRYPT_TYPE_NONE;
3958
3959 pWextState->roamProfile.AuthType.numEntries = 1;
3960 pWextState->roamProfile.AuthType.authType[0] =
3961 eCSR_AUTH_TYPE_OPEN_SYSTEM;
3962
Abhishek Singh3c9910e2017-01-06 17:56:47 +05303963 qdf_mem_zero(pWextState->roamProfile.bssid_hint.bytes,
3964 QDF_MAC_ADDR_SIZE);
3965
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966#ifdef WLAN_FEATURE_11W
3967 pWextState->roamProfile.MFPEnabled = false;
3968 pWextState->roamProfile.MFPRequired = 0;
3969 pWextState->roamProfile.MFPCapable = 0;
3970#endif
3971
3972 pWextState->authKeyMgmt = 0;
3973
Yingying Tang3cc6b792016-10-20 17:00:37 +08003974 qdf_mem_zero(pWextState->roamProfile.Keys.KeyLength, CSR_MAX_NUM_KEY);
3975
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003976#ifdef FEATURE_WLAN_WAPI
3977 pAdapter->wapi_info.wapiAuthMode = WAPI_AUTH_MODE_OPEN;
3978 pAdapter->wapi_info.nWapiMode = 0;
3979#endif
3980
Anurag Chouhanc5548422016-02-24 18:33:27 +05303981 qdf_zero_macaddr(&pWextState->req_bssId);
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07003982 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983}
3984
3985/**
3986 * wlan_hdd_get_vendor_oui_ie_ptr() - Find a vendor OUI
3987 * @oui: The OUI that is being searched for
3988 * @oui_size: The length of @oui
3989 * @ie: The set of IEs within which we're trying to find @oui
3990 * @ie_len: The length of @ie
3991 *
3992 * This function will scan the IEs contained within @ie looking for @oui.
3993 *
3994 * Return: Pointer to @oui embedded within @ie if it is present, NULL
3995 * if @oui is not present within @ie.
3996 */
3997uint8_t *wlan_hdd_get_vendor_oui_ie_ptr(uint8_t *oui, uint8_t oui_size,
3998 uint8_t *ie, int ie_len)
3999{
4000 int left = ie_len;
4001 uint8_t *ptr = ie;
4002 uint8_t elem_id, elem_len;
4003 uint8_t eid = 0xDD;
4004
4005 if (NULL == ie || 0 == ie_len)
4006 return NULL;
4007
4008 while (left >= 2) {
4009 elem_id = ptr[0];
4010 elem_len = ptr[1];
4011 left -= 2;
4012 if (elem_len > left) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004013 hdd_err("Invalid IEs eid: %d elem_len: %d left: %d",
4014 eid, elem_len, left);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004015 return NULL;
4016 }
SaidiReddy Yenugaecb273b2017-05-26 18:34:23 +05304017 if ((elem_id == eid) && (elem_len >= oui_size)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004018 if (memcmp(&ptr[2], oui, oui_size) == 0)
4019 return ptr;
4020 }
4021
4022 left -= elem_len;
4023 ptr += (elem_len + 2);
4024 }
4025 return NULL;
4026}
4027
4028/**
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304029 * hdd_get_ldpc() - Get adapter LDPC
4030 * @adapter: adapter being queried
4031 * @value: where to store the value
4032 *
4033 * Return: 0 on success, negative errno on failure
4034 */
4035int hdd_get_ldpc(hdd_adapter_t *adapter, int *value)
4036{
4037 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4038 int ret;
4039
4040 ENTER();
4041 ret = sme_get_ht_config(hal, adapter->sessionId,
4042 WNI_CFG_HT_CAP_INFO_ADVANCE_CODING);
4043 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004044 hdd_err("Failed to get LDPC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304045 } else {
4046 *value = ret;
4047 ret = 0;
4048 }
4049 return ret;
4050}
4051
4052/**
4053 * hdd_set_ldpc() - Set adapter LDPC
4054 * @adapter: adapter being modified
4055 * @value: new LDPC value
4056 *
4057 * Return: 0 on success, negative errno on failure
4058 */
4059int hdd_set_ldpc(hdd_adapter_t *adapter, int value)
4060{
4061 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4062 int ret;
4063
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004064 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304065 if (value) {
4066 /* make sure HT capabilities allow this */
4067 QDF_STATUS status;
4068 uint32_t cfg_value;
4069 union {
4070 uint16_t cfg_value16;
4071 tSirMacHTCapabilityInfo ht_cap_info;
4072 } u;
4073
4074 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4075 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004076 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304077 return -EIO;
4078 }
4079 u.cfg_value16 = cfg_value & 0xFFFF;
4080 if (!u.ht_cap_info.advCodingCap) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004081 hdd_err("LDCP not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304082 return -EINVAL;
4083 }
4084 }
4085
4086 ret = sme_update_ht_config(hal, adapter->sessionId,
4087 WNI_CFG_HT_CAP_INFO_ADVANCE_CODING,
4088 value);
4089 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004090 hdd_err("Failed to set LDPC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304091
4092 return ret;
4093}
4094
4095/**
4096 * hdd_get_tx_stbc() - Get adapter TX STBC
4097 * @adapter: adapter being queried
4098 * @value: where to store the value
4099 *
4100 * Return: 0 on success, negative errno on failure
4101 */
4102int hdd_get_tx_stbc(hdd_adapter_t *adapter, int *value)
4103{
4104 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4105 int ret;
4106
4107 ENTER();
4108 ret = sme_get_ht_config(hal, adapter->sessionId,
4109 WNI_CFG_HT_CAP_INFO_TX_STBC);
4110 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004111 hdd_err("Failed to get TX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304112 } else {
4113 *value = ret;
4114 ret = 0;
4115 }
4116
4117 return ret;
4118}
4119
4120/**
4121 * hdd_set_tx_stbc() - Set adapter TX STBC
4122 * @adapter: adapter being modified
4123 * @value: new TX STBC value
4124 *
4125 * Return: 0 on success, negative errno on failure
4126 */
4127int hdd_set_tx_stbc(hdd_adapter_t *adapter, int value)
4128{
4129 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4130 int ret;
4131
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004132 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304133 if (value) {
4134 /* make sure HT capabilities allow this */
4135 QDF_STATUS status;
4136 uint32_t cfg_value;
4137 union {
4138 uint16_t cfg_value16;
4139 tSirMacHTCapabilityInfo ht_cap_info;
4140 } u;
4141
4142 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4143 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004144 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304145 return -EIO;
4146 }
4147 u.cfg_value16 = cfg_value & 0xFFFF;
4148 if (!u.ht_cap_info.txSTBC) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004149 hdd_err("TX STBC not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304150 return -EINVAL;
4151 }
4152 }
4153 ret = sme_update_ht_config(hal, adapter->sessionId,
4154 WNI_CFG_HT_CAP_INFO_TX_STBC,
4155 value);
4156 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004157 hdd_err("Failed to set TX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304158
4159 return ret;
4160}
4161
4162/**
4163 * hdd_get_rx_stbc() - Get adapter RX STBC
4164 * @adapter: adapter being queried
4165 * @value: where to store the value
4166 *
4167 * Return: 0 on success, negative errno on failure
4168 */
4169int hdd_get_rx_stbc(hdd_adapter_t *adapter, int *value)
4170{
4171 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4172 int ret;
4173
4174 ENTER();
4175 ret = sme_get_ht_config(hal, adapter->sessionId,
4176 WNI_CFG_HT_CAP_INFO_RX_STBC);
4177 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004178 hdd_err("Failed to get RX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304179 } else {
4180 *value = ret;
4181 ret = 0;
4182 }
4183
4184 return ret;
4185}
4186
4187/**
4188 * hdd_set_rx_stbc() - Set adapter RX STBC
4189 * @adapter: adapter being modified
4190 * @value: new RX STBC value
4191 *
4192 * Return: 0 on success, negative errno on failure
4193 */
4194int hdd_set_rx_stbc(hdd_adapter_t *adapter, int value)
4195{
4196 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4197 int ret;
4198
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004199 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304200 if (value) {
4201 /* make sure HT capabilities allow this */
4202 QDF_STATUS status;
4203 uint32_t cfg_value;
4204 union {
4205 uint16_t cfg_value16;
4206 tSirMacHTCapabilityInfo ht_cap_info;
4207 } u;
4208
4209 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4210 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004211 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304212 return -EIO;
4213 }
4214 u.cfg_value16 = cfg_value & 0xFFFF;
4215 if (!u.ht_cap_info.rxSTBC) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004216 hdd_warn("RX STBC not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304217 return -EINVAL;
4218 }
4219 }
4220 ret = sme_update_ht_config(hal, adapter->sessionId,
4221 WNI_CFG_HT_CAP_INFO_RX_STBC,
4222 value);
4223 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004224 hdd_err("Failed to set RX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304225
4226 return ret;
4227}
4228
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08004229int hdd_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate)
4230{
4231 int set_value;
4232
4233 if (sme_is_feature_supported_by_fw(DOT11AX))
4234 set_value = WMI_ASSEMBLE_RATECODE_V1(rate, nss, preamble);
4235 else
4236 set_value = (preamble << 6) | (nss << 4) | rate;
4237
4238 return set_value;
4239}
4240
4241int hdd_set_11ax_rate(hdd_adapter_t *adapter, int set_value,
4242 struct sap_Config *sap_config)
4243{
4244 uint8_t preamble = 0, nss = 0, rix = 0;
4245 int ret;
4246
4247 if (!sap_config) {
4248 if (!sme_is_feature_supported_by_fw(DOT11AX)) {
4249 hdd_err("Target does not support 11ax");
4250 return -EIO;
4251 }
4252 } else if (sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax &&
4253 sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax_ONLY) {
4254 hdd_err("Invalid hw mode, SAP hw_mode= 0x%x, ch = %d",
4255 sap_config->SapHw_mode, sap_config->channel);
4256 return -EIO;
4257 }
4258
4259 if (set_value != 0xff) {
4260 rix = RC_2_RATE_IDX_11AX(set_value);
4261 preamble = WMI_RATE_PREAMBLE_HE;
4262 nss = HT_RC_2_STREAMS_11AX(set_value);
4263
4264 set_value = hdd_assemble_rate_code(preamble, nss, rix);
4265 }
4266
4267 hdd_notice("SET_11AX_RATE val %d rix %d preamble %x nss %d",
4268 set_value, rix, preamble, nss);
4269
4270 ret = wma_cli_set_command(adapter->sessionId,
4271 WMI_VDEV_PARAM_FIXED_RATE,
4272 set_value, VDEV_CMD);
4273
4274 return ret;
4275}
4276
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304277/**
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -08004278 * hdd_get_aid_rc() - Get AID and rate code passed from user
4279 * @aid: pointer to AID
4280 * @rc: pointer to rate code
4281 * @set_value: value passed from user
4282 *
4283 * If target is 11ax capable, set_value will have AID left shifted 16 bits
4284 * and 16 bits for rate code. If the target is not 11ax capable, rate code
4285 * will only be 8 bits.
4286 *
4287 * Return: None
4288 */
4289static void hdd_get_aid_rc(uint8_t *aid, uint16_t *rc, int set_value)
4290{
4291 uint8_t rc_bits;
4292
4293 if (sme_is_feature_supported_by_fw(DOT11AX))
4294 rc_bits = 16;
4295 else
4296 rc_bits = 8;
4297
4298 *aid = set_value >> rc_bits;
4299 *rc = set_value & ((1 << (rc_bits + 1)) - 1);
4300}
4301
4302int hdd_set_peer_rate(hdd_adapter_t *adapter, int set_value)
4303{
4304 uint8_t aid, *peer_mac;
4305 uint16_t rc;
4306 QDF_STATUS status;
4307
4308 if (adapter->device_mode != QDF_SAP_MODE) {
4309 hdd_err("Invalid devicde mode - %d", adapter->device_mode);
4310 return -EINVAL;
4311 }
4312
4313 hdd_get_aid_rc(&aid, &rc, set_value);
4314
4315 if ((adapter->aStaInfo[aid].isUsed) &&
4316 (OL_TXRX_PEER_STATE_CONN == adapter->aStaInfo[aid].tlSTAState)) {
4317 peer_mac =
4318 (uint8_t *)&(adapter->aStaInfo[aid].macAddrSTA.bytes[0]);
4319 hdd_info("Peer AID: %d MAC_ADDR: "MAC_ADDRESS_STR,
4320 aid, MAC_ADDR_ARRAY(peer_mac));
4321 } else {
4322 hdd_err("No matching peer found for AID: %d", aid);
4323 return -EINVAL;
4324 }
4325
4326 status = sme_set_peer_param(peer_mac, WMI_PEER_PARAM_FIXED_RATE,
4327 rc, adapter->sessionId);
4328 if (status != QDF_STATUS_SUCCESS) {
4329 hdd_err("Failed to set peer fixed rate - status: %d", status);
4330 return -EIO;
4331 }
4332
4333 return 0;
4334}
4335
4336/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004337 * __iw_set_commit() - SIOCSIWCOMMIT ioctl handler
4338 * @dev: device upon which the ioctl was received
4339 * @info: ioctl request information
4340 * @wrqu: ioctl request data
4341 * @extra: ioctl extra data
4342 *
4343 * Return: 0 on success, non-zero on error
4344 */
4345static int __iw_set_commit(struct net_device *dev, struct iw_request_info *info,
4346 union iwreq_data *wrqu, char *extra)
4347{
4348 hdd_adapter_t *adapter;
4349 hdd_context_t *hdd_ctx;
4350 int ret;
4351
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004352 ENTER_DEV(dev);
4353
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4355 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4356 ret = wlan_hdd_validate_context(hdd_ctx);
4357 if (0 != ret)
4358 return ret;
4359
Jeff Johnson441e1f72017-02-07 08:50:49 -08004360 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4361 if (0 != ret)
4362 return ret;
4363
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004364 /* Do nothing for now */
4365 return 0;
4366}
4367
4368/**
4369 * iw_set_commit() - SSR wrapper function for __iw_set_commit
4370 * @dev: pointer to net_device
4371 * @info: pointer to iw_request_info
4372 * @wrqu: pointer to iwreq_data
4373 * @extra: extra
4374 *
4375 * Return: 0 on success, error number otherwise
4376 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07004377static int iw_set_commit(struct net_device *dev, struct iw_request_info *info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 union iwreq_data *wrqu, char *extra)
4379{
4380 int ret;
4381
4382 cds_ssr_protect(__func__);
4383 ret = __iw_set_commit(dev, info, wrqu, extra);
4384 cds_ssr_unprotect(__func__);
4385
4386 return ret;
4387}
4388
4389/**
4390 * __iw_get_name() - SIOCGIWNAME ioctl handler
4391 * @dev: device upon which the ioctl was received
4392 * @info: ioctl request information
4393 * @wrqu: ioctl request data
4394 * @extra: ioctl extra data
4395 *
4396 * Return: 0 on success, non-zero on error
4397 */
4398static int __iw_get_name(struct net_device *dev,
4399 struct iw_request_info *info, char *wrqu, char *extra)
4400{
4401 hdd_adapter_t *adapter;
4402 hdd_context_t *hdd_ctx;
4403 int ret;
4404
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004405 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004406
4407 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4408 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4409 ret = wlan_hdd_validate_context(hdd_ctx);
4410 if (0 != ret)
4411 return ret;
4412
Jeff Johnson441e1f72017-02-07 08:50:49 -08004413 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4414 if (0 != ret)
4415 return ret;
4416
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 strlcpy(wrqu, "Qcom:802.11n", IFNAMSIZ);
4418 EXIT();
4419 return 0;
4420}
4421
4422/**
4423 * __iw_get_name() - SSR wrapper for __iw_get_name
4424 * @dev: pointer to net_device
4425 * @info: pointer to iw_request_info
4426 * @wrqu: pointer to iwreq_data
4427 * @extra: extra
4428 *
4429 * Return: 0 on success, error number otherwise
4430 */
4431static int iw_get_name(struct net_device *dev,
4432 struct iw_request_info *info,
4433 char *wrqu, char *extra)
4434{
4435 int ret;
4436
4437 cds_ssr_protect(__func__);
4438 ret = __iw_get_name(dev, info, wrqu, extra);
4439 cds_ssr_unprotect(__func__);
4440
4441 return ret;
4442}
4443
4444/**
4445 * __iw_set_mode() - ioctl handler
4446 * @dev: device upon which the ioctl was received
4447 * @info: ioctl request information
4448 * @wrqu: ioctl request data
4449 * @extra: ioctl extra data
4450 *
4451 * Return: 0 on success, non-zero on error
4452 */
4453static int __iw_set_mode(struct net_device *dev,
4454 struct iw_request_info *info,
4455 union iwreq_data *wrqu, char *extra)
4456{
4457 hdd_wext_state_t *pWextState;
4458 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4459 hdd_context_t *hdd_ctx;
4460 tCsrRoamProfile *pRoamProfile;
4461 eCsrRoamBssType LastBSSType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004462 struct hdd_config *pConfig;
4463 struct wireless_dev *wdev;
4464 int ret;
4465
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004466 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004467
4468 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4469 ret = wlan_hdd_validate_context(hdd_ctx);
4470 if (0 != ret)
4471 return ret;
4472
Jeff Johnson441e1f72017-02-07 08:50:49 -08004473 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4474 if (0 != ret)
4475 return ret;
4476
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4478 wdev = dev->ieee80211_ptr;
4479 pRoamProfile = &pWextState->roamProfile;
4480 LastBSSType = pRoamProfile->BSSType;
4481
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004482 hdd_debug("Old Bss type = %d", LastBSSType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483
4484 switch (wrqu->mode) {
4485 case IW_MODE_ADHOC:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004486 hdd_debug("Setting AP Mode as IW_MODE_ADHOC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004487 pRoamProfile->BSSType = eCSR_BSS_TYPE_START_IBSS;
4488 /* Set the phymode correctly for IBSS. */
4489 pConfig = (WLAN_HDD_GET_CTX(pAdapter))->config;
4490 pWextState->roamProfile.phyMode =
4491 hdd_cfg_xlate_to_csr_phy_mode(pConfig->dot11Mode);
Krunal Sonif07bb382016-03-10 13:02:11 -08004492 pAdapter->device_mode = QDF_IBSS_MODE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004493 wdev->iftype = NL80211_IFTYPE_ADHOC;
4494 break;
4495 case IW_MODE_INFRA:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004496 hdd_debug("Setting AP Mode as IW_MODE_INFRA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 pRoamProfile->BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
4498 wdev->iftype = NL80211_IFTYPE_STATION;
4499 break;
4500 case IW_MODE_AUTO:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004501 hdd_debug("Setting AP Mode as IW_MODE_AUTO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004502 pRoamProfile->BSSType = eCSR_BSS_TYPE_ANY;
4503 break;
4504 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07004505 hdd_err("Unknown AP Mode value %d", wrqu->mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004506 return -EOPNOTSUPP;
4507 }
4508
4509 if (LastBSSType != pRoamProfile->BSSType) {
4510 /* the BSS mode changed. We need to issue disconnect
4511 * if connected or in IBSS disconnect state
4512 */
Jeff Johnson9eeed0a2016-10-03 15:04:57 -07004513 if (hdd_conn_is_connected
4514 (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 || (eCSR_BSS_TYPE_START_IBSS == LastBSSType)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304516 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004517 /* need to issue a disconnect to CSR. */
4518 INIT_COMPLETION(pAdapter->disconnect_comp_var);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304519 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004520 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
4521 pAdapter->sessionId,
4522 eCSR_DISCONNECT_REASON_IBSS_LEAVE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304523 if (QDF_STATUS_SUCCESS == qdf_status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004524 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004525
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004526 rc = wait_for_completion_timeout(&pAdapter->
4527 disconnect_comp_var,
4528 msecs_to_jiffies
4529 (WLAN_WAIT_TIME_DISCONNECT));
4530 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004531 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004532 }
4533 }
4534 }
4535
4536 EXIT();
4537 return 0;
4538}
4539
4540/**
4541 * iw_set_mode() - SSR wrapper for __iw_set_mode()
4542 * @dev: pointer to net_device
4543 * @info: pointer to iw_request_info
4544 * @wrqu: pointer to iwreq_data
4545 * @extra: pointer to extra ioctl payload
4546 *
4547 * Return: 0 on success, error number otherwise
4548 */
4549static int iw_set_mode(struct net_device *dev, struct iw_request_info *info,
4550 union iwreq_data *wrqu, char *extra)
4551{
4552 int ret;
4553
4554 cds_ssr_protect(__func__);
4555 ret = __iw_set_mode(dev, info, wrqu, extra);
4556 cds_ssr_unprotect(__func__);
4557
4558 return ret;
4559}
4560
4561/**
4562 * __iw_get_mode() - SIOCGIWMODE ioctl handler
4563 * @dev: device upon which the ioctl was received
4564 * @info: ioctl request information
4565 * @wrqu: ioctl request data
4566 * @extra: ioctl extra data
4567 *
4568 * Return: 0 on success, non-zero on error
4569 */
4570static int
4571__iw_get_mode(struct net_device *dev, struct iw_request_info *info,
4572 union iwreq_data *wrqu, char *extra)
4573{
4574 hdd_wext_state_t *pWextState;
4575 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4576 hdd_context_t *hdd_ctx;
4577 int ret;
4578
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004579 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580
4581 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4582 ret = wlan_hdd_validate_context(hdd_ctx);
4583 if (0 != ret)
4584 return ret;
4585
Jeff Johnson441e1f72017-02-07 08:50:49 -08004586 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4587 if (0 != ret)
4588 return ret;
4589
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004590 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4591
4592 switch (pWextState->roamProfile.BSSType) {
4593 case eCSR_BSS_TYPE_INFRASTRUCTURE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004594 hdd_debug("returns IW_MODE_INFRA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004595 wrqu->mode = IW_MODE_INFRA;
4596 break;
4597 case eCSR_BSS_TYPE_IBSS:
4598 case eCSR_BSS_TYPE_START_IBSS:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004599 hdd_debug("returns IW_MODE_ADHOC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004600 wrqu->mode = IW_MODE_ADHOC;
4601 break;
4602 case eCSR_BSS_TYPE_ANY:
4603 default:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004604 hdd_debug("returns IW_MODE_AUTO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605 wrqu->mode = IW_MODE_AUTO;
4606 break;
4607 }
4608
4609 EXIT();
4610 return 0;
4611}
4612
4613/**
4614 * iw_get_mode() - SSR wrapper for __iw_get_mode()
4615 * @dev: pointer to net_device
4616 * @info: pointer to iw_request_info
4617 * @wrqu: pointer to iwreq_data
4618 * @extra: pointer to extra ioctl payload
4619 *
4620 * Return: 0 on success, error number otherwise
4621 */
4622static int iw_get_mode(struct net_device *dev, struct iw_request_info *info,
4623 union iwreq_data *wrqu, char *extra)
4624{
4625 int ret;
4626
4627 cds_ssr_protect(__func__);
4628 ret = __iw_get_mode(dev, info, wrqu, extra);
4629 cds_ssr_unprotect(__func__);
4630
4631 return ret;
4632}
4633
4634/**
4635 * __iw_set_freq() - SIOCSIWFREQ ioctl handler
4636 * @dev: device upon which the ioctl was received
4637 * @info: ioctl request information
4638 * @wrqu: ioctl request data
4639 * @extra: ioctl extra data
4640 *
4641 * Return: 0 on success, non-zero on error
4642 */
4643static int __iw_set_freq(struct net_device *dev, struct iw_request_info *info,
4644 union iwreq_data *wrqu, char *extra)
4645{
4646 uint32_t numChans = 0;
4647 uint8_t validChan[WNI_CFG_VALID_CHANNEL_LIST_LEN];
4648 uint32_t indx = 0;
4649 int ret;
4650 hdd_wext_state_t *pWextState;
4651 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4652 hdd_context_t *hdd_ctx;
4653 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4654 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4655 tCsrRoamProfile *pRoamProfile;
4656
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004657 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004658
4659 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4660 ret = wlan_hdd_validate_context(hdd_ctx);
4661 if (0 != ret)
4662 return ret;
4663
Jeff Johnson441e1f72017-02-07 08:50:49 -08004664 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4665 if (0 != ret)
4666 return ret;
4667
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004668 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4669
4670 pRoamProfile = &pWextState->roamProfile;
4671
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004672 /* Link is up then return cant set channel */
4673 if (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState ||
4674 eConnectionState_Associated == pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004675 hdd_debug("IBSS Associated");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676 return -EOPNOTSUPP;
4677 }
4678
4679 /* Settings by Frequency as input */
4680 if ((wrqu->freq.e == 1) && (wrqu->freq.m >= (uint32_t) 2.412e8) &&
4681 (wrqu->freq.m <= (uint32_t) 5.825e8)) {
4682 uint32_t freq = wrqu->freq.m / 100000;
4683
4684 while ((indx < FREQ_CHAN_MAP_TABLE_SIZE)
4685 && (freq != freq_chan_map[indx].freq))
4686 indx++;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004687 if (indx >= FREQ_CHAN_MAP_TABLE_SIZE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004689
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690 wrqu->freq.e = 0;
4691 wrqu->freq.m = freq_chan_map[indx].chan;
4692
4693 }
4694
4695 if (wrqu->freq.e == 0) {
4696 if ((wrqu->freq.m < WNI_CFG_CURRENT_CHANNEL_STAMIN) ||
4697 (wrqu->freq.m > WNI_CFG_CURRENT_CHANNEL_STAMAX)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004698 hdd_debug("Channel %d is not in range[%d to %d]",
Jeff Johnson99bac312016-06-28 10:38:18 -07004699 wrqu->freq.m,
4700 WNI_CFG_CURRENT_CHANNEL_STAMIN,
4701 WNI_CFG_CURRENT_CHANNEL_STAMAX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702 return -EINVAL;
4703 }
4704
4705 numChans = WNI_CFG_VALID_CHANNEL_LIST_LEN;
4706
4707 if (sme_cfg_get_str(hHal, WNI_CFG_VALID_CHANNEL_LIST,
4708 validChan, &numChans) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304709 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004710 hdd_err("WNI_CFG_VALID_CHANNEL_LIST failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004711 return -EIO;
4712 }
4713
4714 for (indx = 0; indx < numChans; indx++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004715 if (wrqu->freq.m == validChan[indx])
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 }
4718 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719 return -EINVAL;
4720 }
4721
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004722 if (indx >= numChans)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004724
4725 /* Set the Operational Channel */
4726 numChans = pRoamProfile->ChannelInfo.numOfChannels = 1;
4727 pHddStaCtx->conn_info.operationChannel = wrqu->freq.m;
4728 pRoamProfile->ChannelInfo.ChannelList =
4729 &pHddStaCtx->conn_info.operationChannel;
4730
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004731 hdd_debug("pRoamProfile->operationChannel = %d", wrqu->freq.m);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732
4733 EXIT();
4734
4735 return ret;
4736}
4737
4738/**
4739 * iw_set_freq() - SSR wrapper for __iw_set_freq()
4740 * @dev: pointer to net_device
4741 * @info: pointer to iw_request_info
4742 * @wrqu: pointer to iwreq_data
4743 * @extra: pointer to extra ioctl payload
4744 *
4745 * Return: 0 on success, error number otherwise
4746 */
4747static int iw_set_freq(struct net_device *dev, struct iw_request_info *info,
4748 union iwreq_data *wrqu, char *extra)
4749{
4750 int ret;
4751
4752 cds_ssr_protect(__func__);
4753 ret = __iw_set_freq(dev, info, wrqu, extra);
4754 cds_ssr_unprotect(__func__);
4755
4756 return ret;
4757}
4758
4759/**
4760 * __iw_get_freq() - SIOCGIWFREQ ioctl handler
4761 * @dev: device upon which the ioctl was received
4762 * @info: ioctl request information
4763 * @wrqu: ioctl request data
4764 * @extra: ioctl extra data
4765 *
4766 * Return: 0 on success, non-zero on error
4767 */
4768static int __iw_get_freq(struct net_device *dev, struct iw_request_info *info,
4769 struct iw_freq *fwrq, char *extra)
4770{
4771 uint32_t status = false, channel = 0, freq = 0;
4772 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4773 tHalHandle hHal;
4774 hdd_wext_state_t *pWextState;
4775 tCsrRoamProfile *pRoamProfile;
4776 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4777 hdd_context_t *hdd_ctx;
4778 int ret;
4779
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004780 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004781
4782 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4783 ret = wlan_hdd_validate_context(hdd_ctx);
4784 if (0 != ret)
4785 return ret;
4786
Jeff Johnson441e1f72017-02-07 08:50:49 -08004787 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4788 if (0 != ret)
4789 return ret;
4790
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004791 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4792 hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4793
4794 pRoamProfile = &pWextState->roamProfile;
4795
4796 if (pHddStaCtx->conn_info.connState == eConnectionState_Associated) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004797 if (sme_get_operation_channel(hHal, &channel,
4798 pAdapter->sessionId) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07004799 hdd_err("failed to get operating channel %u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004800 pAdapter->sessionId);
4801 return -EIO;
Jeff Johnson68755312017-02-10 11:46:55 -08004802 }
Jeff Johnson68755312017-02-10 11:46:55 -08004803 status = hdd_wlan_get_freq(channel, &freq);
4804 if (true == status) {
4805 /* Set Exponent parameter as 6 (MHZ)
4806 * in struct iw_freq iwlist & iwconfig
4807 * command shows frequency into proper
4808 * format (2.412 GHz instead of 246.2
4809 * MHz)
4810 */
4811 fwrq->m = freq;
4812 fwrq->e = MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004813 }
4814 } else {
4815 /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
4816 * iwlist & iwconfig command shows frequency into proper
4817 * format (2.412 GHz instead of 246.2 MHz)
4818 */
4819 fwrq->m = 0;
4820 fwrq->e = MHZ;
4821 }
4822 return 0;
4823}
4824
4825/**
4826 * iw_get_freq() - SSR wrapper for __iw_get_freq()
4827 * @dev: pointer to net_device
4828 * @info: pointer to iw_request_info
4829 * @fwrq: pointer to frequency data
4830 * @extra: pointer to extra ioctl payload
4831 *
4832 * Return: 0 on success, error number otherwise
4833 */
4834static int iw_get_freq(struct net_device *dev, struct iw_request_info *info,
4835 struct iw_freq *fwrq, char *extra)
4836{
4837 int ret;
4838
4839 cds_ssr_protect(__func__);
4840 ret = __iw_get_freq(dev, info, fwrq, extra);
4841 cds_ssr_unprotect(__func__);
4842
4843 return ret;
4844}
4845
4846/**
4847 * __iw_get_tx_power() - SIOCGIWTXPOW ioctl handler
4848 * @dev: device upon which the ioctl was received
4849 * @info: ioctl request information
4850 * @wrqu: ioctl request data
4851 * @extra: ioctl extra data
4852 *
4853 * Return: 0 on success, non-zero on error
4854 */
4855static int __iw_get_tx_power(struct net_device *dev,
4856 struct iw_request_info *info,
4857 union iwreq_data *wrqu, char *extra)
4858{
4859
4860 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4861 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4862 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4863 int ret;
4864
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004865 ENTER_DEV(dev);
4866
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004867 ret = wlan_hdd_validate_context(hdd_ctx);
4868 if (0 != ret)
4869 return ret;
4870
Jeff Johnson441e1f72017-02-07 08:50:49 -08004871 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4872 if (0 != ret)
4873 return ret;
4874
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004875 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
4876 wrqu->txpower.value = 0;
4877 return 0;
4878 }
4879 wlan_hdd_get_class_astats(pAdapter);
4880 wrqu->txpower.value = pAdapter->hdd_stats.ClassA_stat.max_pwr;
4881
4882 return 0;
4883}
4884
4885/**
4886 * iw_get_tx_power() - SSR wrapper for __iw_get_tx_power()
4887 * @dev: pointer to net_device
4888 * @info: pointer to iw_request_info
4889 * @wrqu: pointer to iwreq_data
4890 * @extra: pointer to extra ioctl payload
4891 *
4892 * Return: 0 on success, error number otherwise
4893 */
4894static int iw_get_tx_power(struct net_device *dev,
4895 struct iw_request_info *info,
4896 union iwreq_data *wrqu, char *extra)
4897{
4898 int ret;
4899
4900 cds_ssr_protect(__func__);
4901 ret = __iw_get_tx_power(dev, info, wrqu, extra);
4902 cds_ssr_unprotect(__func__);
4903
4904 return ret;
4905}
4906
4907/**
4908 * __iw_set_tx_power() - SIOCSIWTXPOW ioctl handler
4909 * @dev: device upon which the ioctl was received
4910 * @info: ioctl request information
4911 * @wrqu: ioctl request data
4912 * @extra: ioctl extra data
4913 *
4914 * Return: 0 on success, non-zero on error
4915 */
4916static int __iw_set_tx_power(struct net_device *dev,
4917 struct iw_request_info *info,
4918 union iwreq_data *wrqu, char *extra)
4919{
4920 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4921 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4922 hdd_context_t *hdd_ctx;
4923 int ret;
4924
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004925 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004926
4927 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4928 ret = wlan_hdd_validate_context(hdd_ctx);
4929 if (0 != ret)
4930 return ret;
4931
Jeff Johnson441e1f72017-02-07 08:50:49 -08004932 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4933 if (0 != ret)
4934 return ret;
4935
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004936 if (sme_cfg_set_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304937 wrqu->txpower.value) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004938 hdd_err("WNI_CFG_CURRENT_TX_POWER_LEVEL failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004939 return -EIO;
4940 }
4941
4942 EXIT();
4943
4944 return 0;
4945}
4946
4947/**
4948 * iw_set_tx_power() - SSR wrapper for __iw_set_tx_power()
4949 * @dev: pointer to net_device
4950 * @info: pointer to iw_request_info
4951 * @wrqu: pointer to iwreq_data
4952 * @extra: pointer to extra ioctl payload
4953 *
4954 * Return: 0 on success, error number otherwise
4955 */
4956static int iw_set_tx_power(struct net_device *dev,
4957 struct iw_request_info *info,
4958 union iwreq_data *wrqu, char *extra)
4959{
4960 int ret;
4961
4962 cds_ssr_protect(__func__);
4963 ret = __iw_set_tx_power(dev, info, wrqu, extra);
4964 cds_ssr_unprotect(__func__);
4965
4966 return ret;
4967}
4968
4969/**
4970 * __iw_get_bitrate() - SIOCGIWRATE ioctl handler
4971 * @dev: device upon which the ioctl was received
4972 * @info: ioctl request information
4973 * @wrqu: ioctl request data
4974 * @extra: ioctl extra data
4975 *
4976 * Return: 0 on success, non-zero on error
4977 */
4978static int __iw_get_bitrate(struct net_device *dev,
4979 struct iw_request_info *info,
4980 union iwreq_data *wrqu, char *extra)
4981{
Jeff Johnsonf25ac102017-02-07 09:16:02 -08004982 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004983 hdd_wext_state_t *pWextState;
4984 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4985 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4986 hdd_context_t *hdd_ctx;
4987 int ret;
4988
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004989 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990
4991 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4992 ret = wlan_hdd_validate_context(hdd_ctx);
4993 if (0 != ret)
4994 return ret;
4995
Jeff Johnson441e1f72017-02-07 08:50:49 -08004996 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4997 if (0 != ret)
4998 return ret;
4999
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005000 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
5001 wrqu->bitrate.value = 0;
5002 } else {
5003 status =
5004 sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
5005 eCSR_HDD,
5006 SME_SUMMARY_STATS |
5007 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -08005008 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07005009 hdd_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005010 pHddStaCtx->conn_info.staId[0],
5011 pAdapter, pAdapter->sessionId);
5012
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305013 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005014 hdd_err("Unable to retrieve statistics");
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005015 return qdf_status_to_os_return(status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016 }
5017
5018 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5019
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005020 status =
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305021 qdf_wait_single_event(&pWextState->hdd_qdf_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 WLAN_WAIT_TIME_STATS);
5023
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005024 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005025 hdd_err("SME timeout while retrieving statistics");
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005026 return qdf_status_to_os_return(status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005027 }
5028
5029 wrqu->bitrate.value =
5030 pAdapter->hdd_stats.ClassA_stat.tx_rate * 500 * 1000;
5031 }
5032
5033 EXIT();
5034
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005035 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005036}
5037
5038/**
5039 * iw_get_bitrate() - SSR wrapper for __iw_get_bitrate()
5040 * @dev: pointer to net_device
5041 * @info: pointer to iw_request_info
5042 * @wrqu: pointer to iwreq_data
5043 * @extra: pointer to extra ioctl payload
5044 *
5045 * Return: 0 on success, error number otherwise
5046 */
5047static int iw_get_bitrate(struct net_device *dev,
5048 struct iw_request_info *info,
5049 union iwreq_data *wrqu, char *extra)
5050{
5051 int ret;
5052
5053 cds_ssr_protect(__func__);
5054 ret = __iw_get_bitrate(dev, info, wrqu, extra);
5055 cds_ssr_unprotect(__func__);
5056
5057 return ret;
5058}
5059
5060/**
5061 * __iw_set_bitrate() - SIOCSIWRATE ioctl handler
5062 * @dev: device upon which the ioctl was received
5063 * @info: ioctl request information
5064 * @wrqu: ioctl request data
5065 * @extra: ioctl extra data
5066 *
5067 * Return: 0 on success, non-zero on error
5068 */
5069static int __iw_set_bitrate(struct net_device *dev,
5070 struct iw_request_info *info,
5071 union iwreq_data *wrqu, char *extra)
5072{
5073 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5074 hdd_wext_state_t *pWextState;
5075 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
5076 uint8_t supp_rates[WNI_CFG_SUPPORTED_RATES_11A_LEN];
5077 uint32_t a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
5078 uint32_t b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
5079 uint32_t i, rate;
5080 uint32_t valid_rate = false, active_phy_mode = 0;
5081 hdd_context_t *hdd_ctx;
5082 int ret;
5083
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005084 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005085
5086 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5087 ret = wlan_hdd_validate_context(hdd_ctx);
5088 if (0 != ret)
5089 return ret;
5090
Jeff Johnson441e1f72017-02-07 08:50:49 -08005091 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5092 if (0 != ret)
5093 return ret;
5094
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005095 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5096
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005097 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005098 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099
5100 rate = wrqu->bitrate.value;
5101
5102 if (rate == -1) {
5103 rate = WNI_CFG_FIXED_RATE_AUTO;
5104 valid_rate = true;
5105 } else if (sme_cfg_get_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
5106 WNI_CFG_DOT11_MODE,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305107 &active_phy_mode) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005108 if (active_phy_mode == WNI_CFG_DOT11_MODE_11A
5109 || active_phy_mode == WNI_CFG_DOT11_MODE_11G
5110 || active_phy_mode == WNI_CFG_DOT11_MODE_11B) {
5111 if ((sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
5112 WNI_CFG_SUPPORTED_RATES_11A, supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305113 &a_len) == QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005114 &&
5115 (sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
5116 WNI_CFG_SUPPORTED_RATES_11B, supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305117 &b_len) == QDF_STATUS_SUCCESS)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005118 for (i = 0; i < (b_len + a_len); ++i) {
5119 /* supported rates returned is double
5120 * the actual rate so we divide it by 2
5121 */
5122 if ((supp_rates[i] & 0x7F) / 2 ==
5123 rate) {
5124 valid_rate = true;
5125 rate = i +
5126 WNI_CFG_FIXED_RATE_1MBPS;
5127 break;
5128 }
5129 }
5130 }
5131 }
5132 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005133 if (valid_rate != true)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005135
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 if (sme_cfg_set_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305137 WNI_CFG_FIXED_RATE, rate) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005138 hdd_err("failed to set ini parameter, WNI_CFG_FIXED_RATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005139 return -EIO;
5140 }
5141 return 0;
5142}
5143
5144/**
5145 * iw_set_bitrate() - SSR wrapper for __iw_set_bitrate()
5146 * @dev: pointer to net_device
5147 * @info: pointer to iw_request_info
5148 * @wrqu: pointer to iwreq_data
5149 * @extra: pointer to extra ioctl payload
5150 *
5151 * Return: 0 on success, error number otherwise
5152 */
5153static int iw_set_bitrate(struct net_device *dev,
5154 struct iw_request_info *info,
5155 union iwreq_data *wrqu, char *extra)
5156{
5157 int ret;
5158
5159 cds_ssr_protect(__func__);
5160 ret = __iw_set_bitrate(dev, info, wrqu, extra);
5161 cds_ssr_unprotect(__func__);
5162
5163 return ret;
5164}
5165
5166/**
5167 * __iw_set_genie() - SIOCSIWGENIE ioctl handler
5168 * @dev: device upon which the ioctl was received
5169 * @info: ioctl request information
5170 * @wrqu: ioctl request data
5171 * @extra: ioctl extra data
5172 *
5173 * Return: 0 on success, non-zero on error
5174 */
5175static int __iw_set_genie(struct net_device *dev,
5176 struct iw_request_info *info,
5177 union iwreq_data *wrqu, char *extra)
5178{
5179 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5180 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5181 uint8_t *genie = NULL;
5182 uint8_t *base_genie = NULL;
5183 uint16_t remLen;
5184 hdd_context_t *hdd_ctx;
5185 int ret;
5186
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005187 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005188
5189 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5190 ret = wlan_hdd_validate_context(hdd_ctx);
5191 if (0 != ret)
5192 return ret;
5193
Jeff Johnson441e1f72017-02-07 08:50:49 -08005194 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5195 if (0 != ret)
5196 return ret;
5197
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005198 if (!wrqu->data.length) {
5199 hdd_clear_roam_profile_ie(pAdapter);
5200 EXIT();
5201 return 0;
5202 }
5203
5204 base_genie = mem_alloc_copy_from_user_helper(wrqu->data.pointer,
5205 wrqu->data.length);
5206 if (NULL == base_genie) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005207 hdd_err("mem_alloc_copy_from_user_helper fail");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005208 return -ENOMEM;
5209 }
5210
5211 genie = base_genie;
5212
5213 remLen = wrqu->data.length;
5214
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005215 hdd_debug("iw_set_genie ioctl IE[0x%X], LEN[%d]", genie[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005216 genie[1]);
5217
5218 /* clear any previous genIE before this call */
5219 memset(&pWextState->genIE, 0, sizeof(pWextState->genIE));
5220
5221 while (remLen >= 2) {
5222 uint16_t eLen = 0;
5223 uint8_t elementId;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005224
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 elementId = *genie++;
5226 eLen = *genie++;
5227 remLen -= 2;
5228
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005229 hdd_debug("IE[0x%X], LEN[%d]", elementId, eLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005230
5231 switch (elementId) {
5232 case IE_EID_VENDOR:
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005233 /* should have at least OUI */
5234 if ((IE_LEN_SIZE + IE_EID_SIZE + IE_VENDOR_OUI_SIZE) > eLen) {
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305235 ret = -EINVAL;
5236 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005237 }
5238
5239 if (0 == memcmp(&genie[0], "\x00\x50\xf2\x04", 4)) {
5240 uint16_t curGenIELen = pWextState->genIE.length;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005241
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005242 hdd_debug("Set WPS OUI(%02x %02x %02x %02x) IE(len %d)",
Jeff Johnson99bac312016-06-28 10:38:18 -07005243 genie[0], genie[1], genie[2],
5244 genie[3], eLen + 2);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005245
5246 if (SIR_MAC_MAX_IE_LENGTH <
5247 (pWextState->genIE.length + eLen)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005248 hdd_err("genIE. Need bigger buffer space");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305249 QDF_ASSERT(0);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305250 ret = -ENOMEM;
5251 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005252 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005253 /* save to Additional IE; it should be
5254 * accumulated to handle WPS IE + other IE
5255 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 memcpy(pWextState->genIE.addIEdata +
5257 curGenIELen, genie - 2, eLen + 2);
5258 pWextState->genIE.length += eLen + 2;
5259 } else if (0 == memcmp(&genie[0], "\x00\x50\xf2", 3)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005260 hdd_debug("Set WPA IE (len %d)", eLen + 2);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305261 if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005262 hdd_err("genIE, Need bigger buffer space");
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305263 ret = -EINVAL;
5264 QDF_ASSERT(0);
5265 goto exit;
5266 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005267 memset(pWextState->WPARSNIE, 0,
5268 MAX_WPA_RSN_IE_LEN);
5269 memcpy(pWextState->WPARSNIE, genie - 2,
5270 (eLen + 2));
5271 pWextState->roamProfile.pWPAReqIE =
5272 pWextState->WPARSNIE;
5273 pWextState->roamProfile.nWPAReqIELength =
5274 eLen + 2;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005275 } else {
5276 /* any vendorId except WPA IE should
5277 * be accumulated to genIE
5278 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005279 uint16_t curGenIELen = pWextState->genIE.length;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005280
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005281 hdd_debug("Set OUI(%02x %02x %02x %02x) IE(len %d)",
Jeff Johnson99bac312016-06-28 10:38:18 -07005282 genie[0], genie[1], genie[2],
5283 genie[3], eLen + 2);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005284
5285 if (SIR_MAC_MAX_IE_LENGTH <
5286 (pWextState->genIE.length + eLen)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005287 hdd_err("genIE. Need bigger buffer space");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305288 QDF_ASSERT(0);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305289 ret = -ENOMEM;
5290 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005291 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005292 /* save to Additional IE; it should be
5293 * accumulated to handle WPS IE + other IE
5294 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005295 memcpy(pWextState->genIE.addIEdata +
5296 curGenIELen, genie - 2, eLen + 2);
5297 pWextState->genIE.length += eLen + 2;
5298 }
5299 break;
5300 case DOT11F_EID_RSN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005301 hdd_debug("Set RSN IE (len %d)", eLen + 2);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305302 if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005303 hdd_err("genIE, Need bigger buffer space");
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305304 ret = -EINVAL;
5305 QDF_ASSERT(0);
5306 goto exit;
5307 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005308 memset(pWextState->WPARSNIE, 0, MAX_WPA_RSN_IE_LEN);
5309 memcpy(pWextState->WPARSNIE, genie - 2, (eLen + 2));
5310 pWextState->roamProfile.pRSNReqIE =
5311 pWextState->WPARSNIE;
5312 pWextState->roamProfile.nRSNReqIELength = eLen + 2;
5313 break;
5314
5315 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07005316 hdd_err("Set UNKNOWN IE %X", elementId);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305317 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005318 }
5319 genie += eLen;
5320 remLen -= eLen;
5321 }
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305322exit:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005323 EXIT();
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07005324 qdf_mem_free(base_genie);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305325 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005326}
5327
5328/**
5329 * iw_set_genie() - SSR wrapper for __iw_set_genie()
5330 * @dev: pointer to net_device
5331 * @info: pointer to iw_request_info
5332 * @wrqu: pointer to iwreq_data
5333 * @extra: pointer to extra ioctl payload
5334 *
5335 * Return: 0 on success, error number otherwise
5336 */
5337static int iw_set_genie(struct net_device *dev,
5338 struct iw_request_info *info,
5339 union iwreq_data *wrqu, char *extra)
5340{
5341 int ret;
5342
5343 cds_ssr_protect(__func__);
5344 ret = __iw_set_genie(dev, info, wrqu, extra);
5345 cds_ssr_unprotect(__func__);
5346
5347 return ret;
5348}
5349
5350/**
5351 * __iw_get_genie() - SIOCGIWGENIE ioctl handler
5352 * @dev: device upon which the ioctl was received
5353 * @info: ioctl request information
5354 * @wrqu: ioctl request data
5355 * @extra: ioctl extra data
5356 *
5357 * Return: 0 on success, non-zero on error
5358 */
5359static int __iw_get_genie(struct net_device *dev,
5360 struct iw_request_info *info,
5361 union iwreq_data *wrqu, char *extra)
5362{
5363 hdd_wext_state_t *pWextState;
5364 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5365 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305366 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005367 uint32_t length = DOT11F_IE_RSN_MAX_LEN;
5368 uint8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
5369 hdd_context_t *hdd_ctx;
5370 int ret;
5371
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005372 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005373
5374 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5375 ret = wlan_hdd_validate_context(hdd_ctx);
5376 if (0 != ret)
5377 return ret;
5378
Jeff Johnson441e1f72017-02-07 08:50:49 -08005379 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5380 if (0 != ret)
5381 return ret;
5382
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005383 hdd_debug("getGEN_IE ioctl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005384
5385 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5386
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005387 if (pHddStaCtx->conn_info.connState == eConnectionState_NotConnected)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005388 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005389
5390 /* Return something ONLY if we are associated with an RSN or
5391 * WPA network
5392 */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005393 if (!hdd_is_auth_type_rsn(pWextState->roamProfile.negotiatedAuthType))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005394 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005395
5396 /* Actually retrieve the RSN IE from CSR. (We previously sent
5397 * it down in the CSR Roam Profile.)
5398 */
5399 status = csr_roam_get_wpa_rsn_req_ie(WLAN_HDD_GET_HAL_CTX(pAdapter),
5400 pAdapter->sessionId,
5401 &length, genIeBytes);
Manjeet Singhfde0c042016-09-03 12:08:09 +05305402 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005403 hdd_err("Failed to get WPA-RSN IE data status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005404 return -EFAULT;
5405 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005406 wrqu->data.length = length;
Manjeet Singhfde0c042016-09-03 12:08:09 +05305407 if (length > DOT11F_IE_RSN_MAX_LEN) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005408 hdd_err("Invalid buffer length: %d", length);
Manjeet Singhfde0c042016-09-03 12:08:09 +05305409 return -E2BIG;
5410 }
5411 qdf_mem_copy(extra, (void *)genIeBytes, length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005412
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005413 hdd_debug("RSN IE of %d bytes returned",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005414 wrqu->data.length);
5415
5416 EXIT();
5417
5418 return 0;
5419}
5420
5421/**
5422 * iw_get_genie() - SSR wrapper for __iw_get_genie()
5423 * @dev: pointer to net_device
5424 * @info: pointer to iw_request_info
5425 * @wrqu: pointer to iwreq_data
5426 * @extra: pointer to extra ioctl payload
5427 *
5428 * Return: 0 on success, error number otherwise
5429 */
5430static int iw_get_genie(struct net_device *dev,
5431 struct iw_request_info *info,
5432 union iwreq_data *wrqu, char *extra)
5433{
5434 int ret;
5435
5436 cds_ssr_protect(__func__);
5437 ret = __iw_get_genie(dev, info, wrqu, extra);
5438 cds_ssr_unprotect(__func__);
5439
5440 return ret;
5441}
5442
5443/**
5444 * __iw_get_encode() - SIOCGIWENCODE ioctl handler
5445 * @dev: device upon which the ioctl was received
5446 * @info: ioctl request information
5447 * @wrqu: ioctl request data
5448 * @extra: ioctl extra data
5449 *
5450 * Return: 0 on success, non-zero on error
5451 */
5452static int __iw_get_encode(struct net_device *dev,
5453 struct iw_request_info *info,
5454 struct iw_point *dwrq, char *extra)
5455{
5456 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5457 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5458 tCsrRoamProfile *pRoamProfile = &(pWextState->roamProfile);
5459 int keyId;
5460 eCsrAuthType authType = eCSR_AUTH_TYPE_NONE;
5461 int i;
5462 hdd_context_t *hdd_ctx;
5463 int ret;
5464
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005465 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005466
5467 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5468 ret = wlan_hdd_validate_context(hdd_ctx);
5469 if (0 != ret)
5470 return ret;
5471
Jeff Johnson441e1f72017-02-07 08:50:49 -08005472 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5473 if (0 != ret)
5474 return ret;
5475
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005476 keyId = pRoamProfile->Keys.defaultIndex;
5477
5478 if (keyId < 0 || keyId >= MAX_WEP_KEYS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005479 hdd_err("Invalid keyId: %d", keyId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005480 return -EINVAL;
5481 }
5482
5483 if (pRoamProfile->Keys.KeyLength[keyId] > 0) {
5484 dwrq->flags |= IW_ENCODE_ENABLED;
5485 dwrq->length = pRoamProfile->Keys.KeyLength[keyId];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305486 qdf_mem_copy(extra, &(pRoamProfile->Keys.KeyMaterial[keyId][0]),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005487 pRoamProfile->Keys.KeyLength[keyId]);
5488
5489 dwrq->flags |= (keyId + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005490 } else {
5491 dwrq->flags |= IW_ENCODE_DISABLED;
5492 }
5493
5494 for (i = 0; i < MAX_WEP_KEYS; i++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005495 if (pRoamProfile->Keys.KeyLength[i] == 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005496 continue;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005497 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005498 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005499 }
5500
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005501 if (MAX_WEP_KEYS == i)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005502 dwrq->flags |= IW_ENCODE_NOKEY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005503
5504 authType =
5505 ((hdd_station_ctx_t *) WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->
5506 conn_info.authType;
5507
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005508 if (eCSR_AUTH_TYPE_OPEN_SYSTEM == authType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005509 dwrq->flags |= IW_ENCODE_OPEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005510 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005511 dwrq->flags |= IW_ENCODE_RESTRICTED;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005512
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005513 EXIT();
5514 return 0;
5515}
5516
5517/**
5518 * iw_get_encode() - SSR wrapper for __iw_get_encode()
5519 * @dev: pointer to net_device
5520 * @info: pointer to iw_request_info
5521 * @dwrq: pointer to encoding information
5522 * @extra: pointer to extra ioctl payload
5523 *
5524 * Return: 0 on success, error number otherwise
5525 */
5526static int iw_get_encode(struct net_device *dev, struct iw_request_info *info,
5527 struct iw_point *dwrq, char *extra)
5528{
5529 int ret;
5530
5531 cds_ssr_protect(__func__);
5532 ret = __iw_get_encode(dev, info, dwrq, extra);
5533 cds_ssr_unprotect(__func__);
5534
5535 return ret;
5536}
5537
5538/**
5539 * __iw_get_rts_threshold() - SIOCGIWRTS ioctl handler
5540 * @dev: device upon which the ioctl was received
5541 * @info: ioctl request information
5542 * @wrqu: ioctl request data
5543 * @extra: ioctl extra data
5544 *
5545 * Return: 0 on success, non-zero on error
5546 */
5547static int __iw_get_rts_threshold(struct net_device *dev,
5548 struct iw_request_info *info,
5549 union iwreq_data *wrqu, char *extra)
5550{
Jeff Johnson5b907622017-02-07 10:00:37 -08005551 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5552 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
5553 uint32_t threshold = 0;
5554 hdd_context_t *hdd_ctx;
5555 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005556
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005557 ENTER_DEV(dev);
5558
Jeff Johnson5b907622017-02-07 10:00:37 -08005559 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5560 ret = wlan_hdd_validate_context(hdd_ctx);
5561 if (0 != ret)
5562 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005563
Jeff Johnson441e1f72017-02-07 08:50:49 -08005564 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5565 if (0 != ret)
5566 return ret;
5567
Jeff Johnson5b907622017-02-07 10:00:37 -08005568 if (QDF_STATUS_SUCCESS !=
5569 sme_cfg_get_int(hal, WNI_CFG_RTS_THRESHOLD, &threshold)) {
5570 hdd_warn("failed to get ini parameter, WNI_CFG_RTS_THRESHOLD");
5571 return -EIO;
5572 }
5573 wrqu->rts.value = threshold;
5574
5575 hdd_notice("Rts-Threshold=%d!!", wrqu->rts.value);
5576
5577 EXIT();
5578
5579 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005580}
5581
5582/**
5583 * __iw_set_rts_threshold() - SIOCSIWRTS ioctl handler
5584 * @dev: device upon which the ioctl was received
5585 * @info: ioctl request information
5586 * @wrqu: ioctl request data
5587 * @extra: ioctl extra data
5588 *
5589 * Return: 0 on success, non-zero on error
5590 */
5591static int __iw_set_rts_threshold(struct net_device *dev,
5592 struct iw_request_info *info,
5593 union iwreq_data *wrqu, char *extra)
5594{
5595 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5596 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5597 hdd_context_t *hdd_ctx;
5598 int ret;
5599
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005600 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005601
5602 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5603 ret = wlan_hdd_validate_context(hdd_ctx);
5604 if (0 != ret)
5605 return ret;
5606
Jeff Johnson441e1f72017-02-07 08:50:49 -08005607 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5608 if (0 != ret)
5609 return ret;
5610
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005611 if (wrqu->rts.value < WNI_CFG_RTS_THRESHOLD_STAMIN
5612 || wrqu->rts.value > WNI_CFG_RTS_THRESHOLD_STAMAX) {
5613 return -EINVAL;
5614 }
5615
5616 if (sme_cfg_set_int(hHal, WNI_CFG_RTS_THRESHOLD, wrqu->rts.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305617 QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005618 hdd_err("failed to set ini parameter, WNI_CFG_RTS_THRESHOLD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 return -EIO;
5620 }
5621
5622 EXIT();
5623
5624 return 0;
5625}
5626
5627/**
5628 * iw_get_rts_threshold() - SSR wrapper for __iw_get_rts_threshold()
5629 * @dev: pointer to net_device
5630 * @info: pointer to iw_request_info
5631 * @wrqu: pointer to iwreq_data
5632 * @extra: pointer to extra ioctl payload
5633 *
5634 * Return: 0 on success, error number otherwise
5635 */
Jeff Johnson5b907622017-02-07 10:00:37 -08005636int iw_get_rts_threshold(struct net_device *dev,
5637 struct iw_request_info *info,
5638 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005639{
5640 int ret;
5641
5642 cds_ssr_protect(__func__);
5643 ret = __iw_get_rts_threshold(dev, info, wrqu, extra);
5644 cds_ssr_unprotect(__func__);
5645
5646 return ret;
5647}
5648
5649/**
5650 * iw_set_rts_threshold() - SSR wrapper for __iw_set_rts_threshold()
5651 * @dev: pointer to net_device
5652 * @info: pointer to iw_request_info
5653 * @wrqu: pointer to iwreq_data
5654 * @extra: pointer to extra ioctl payload
5655 *
5656 * Return: 0 on success, error number otherwise
5657 */
5658static int iw_set_rts_threshold(struct net_device *dev,
5659 struct iw_request_info *info,
5660 union iwreq_data *wrqu, char *extra)
5661{
5662 int ret;
5663
5664 cds_ssr_protect(__func__);
5665 ret = __iw_set_rts_threshold(dev, info, wrqu, extra);
5666 cds_ssr_unprotect(__func__);
5667
5668 return ret;
5669}
5670
5671/**
5672 * __iw_get_frag_threshold() - SIOCGIWFRAG ioctl handler
5673 * @dev: device upon which the ioctl was received
5674 * @info: ioctl request information
5675 * @wrqu: ioctl request data
5676 * @extra: ioctl extra data
5677 *
5678 * Return: 0 on success, non-zero on error
5679 */
5680static int __iw_get_frag_threshold(struct net_device *dev,
5681 struct iw_request_info *info,
5682 union iwreq_data *wrqu, char *extra)
5683{
Jeff Johnson5b907622017-02-07 10:00:37 -08005684 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5685 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
5686 uint32_t threshold = 0;
5687 hdd_context_t *hdd_ctx;
5688 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005689
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005690 ENTER_DEV(dev);
5691
Jeff Johnson5b907622017-02-07 10:00:37 -08005692 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5693 ret = wlan_hdd_validate_context(hdd_ctx);
5694 if (0 != ret)
5695 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005696
Jeff Johnson441e1f72017-02-07 08:50:49 -08005697 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5698 if (0 != ret)
5699 return ret;
5700
Jeff Johnson5b907622017-02-07 10:00:37 -08005701 if (sme_cfg_get_int(hal, WNI_CFG_FRAGMENTATION_THRESHOLD, &threshold)
5702 != QDF_STATUS_SUCCESS) {
5703 hdd_warn("failed to get ini parameter, WNI_CFG_FRAGMENTATION_THRESHOLD");
5704 return -EIO;
5705 }
5706 wrqu->frag.value = threshold;
5707
5708 hdd_notice("Frag-Threshold=%d!!", wrqu->frag.value);
5709
5710 EXIT();
5711
5712 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005713}
5714
5715/**
5716 * iw_get_frag_threshold() - SSR wrapper for __iw_get_frag_threshold()
5717 * @dev: pointer to net_device
5718 * @info: pointer to iw_request_info
5719 * @wrqu: pointer to iwreq_data
5720 * @extra: pointer to extra ioctl payload
5721 *
5722 * Return: 0 on success, error number otherwise
5723 */
Jeff Johnson5b907622017-02-07 10:00:37 -08005724int iw_get_frag_threshold(struct net_device *dev,
5725 struct iw_request_info *info,
5726 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005727{
5728 int ret;
5729
5730 cds_ssr_protect(__func__);
5731 ret = __iw_get_frag_threshold(dev, info, wrqu, extra);
5732 cds_ssr_unprotect(__func__);
5733
5734 return ret;
5735}
5736
5737/**
5738 * __iw_set_frag_threshold() - SIOCSIWFRAG ioctl handler
5739 * @dev: device upon which the ioctl was received
5740 * @info: ioctl request information
5741 * @wrqu: ioctl request data
5742 * @extra: ioctl extra data
5743 *
5744 * Return: 0 on success, non-zero on error
5745 */
5746static int __iw_set_frag_threshold(struct net_device *dev,
5747 struct iw_request_info *info,
5748 union iwreq_data *wrqu, char *extra)
5749{
5750 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5751 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5752 hdd_context_t *hdd_ctx;
5753 int ret;
5754
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005755 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005756
5757 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5758 ret = wlan_hdd_validate_context(hdd_ctx);
5759 if (0 != ret)
5760 return ret;
5761
Jeff Johnson441e1f72017-02-07 08:50:49 -08005762 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5763 if (0 != ret)
5764 return ret;
5765
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005766 if (wrqu->frag.value < WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN
5767 || wrqu->frag.value > WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX) {
5768 return -EINVAL;
5769 }
5770
5771 if (sme_cfg_set_int
5772 (hHal, WNI_CFG_FRAGMENTATION_THRESHOLD, wrqu->frag.value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305773 != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005774 hdd_err("WNI_CFG_FRAGMENTATION_THRESHOLD failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005775 return -EIO;
5776 }
5777
5778 EXIT();
5779
5780 return 0;
5781}
5782
5783/**
5784 * iw_set_frag_threshold() - SSR wrapper for __iw_set_frag_threshold()
5785 * @dev: pointer to net_device
5786 * @info: pointer to iw_request_info
5787 * @wrqu: pointer to iwreq_data
5788 * @extra: pointer to extra ioctl payload
5789 *
5790 * Return: 0 on success, error number otherwise
5791 */
5792static int iw_set_frag_threshold(struct net_device *dev,
5793 struct iw_request_info *info,
5794 union iwreq_data *wrqu, char *extra)
5795{
5796 int ret;
5797
5798 cds_ssr_protect(__func__);
5799 ret = __iw_set_frag_threshold(dev, info, wrqu, extra);
5800 cds_ssr_unprotect(__func__);
5801
5802 return ret;
5803}
5804
5805/**
5806 * __iw_get_power_mode() - SIOCGIWPOWER ioctl handler
5807 * @dev: device upon which the ioctl was received
5808 * @info: ioctl request information
5809 * @wrqu: ioctl request data
5810 * @extra: ioctl extra data
5811 *
5812 * Return: 0 on success, non-zero on error
5813 */
5814static int __iw_get_power_mode(struct net_device *dev,
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005815 struct iw_request_info *info,
5816 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005817{
5818 hdd_adapter_t *adapter;
5819 hdd_context_t *hdd_ctx;
5820 int ret;
5821
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005822 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005823
5824 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5825 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5826 ret = wlan_hdd_validate_context(hdd_ctx);
5827 if (0 != ret)
5828 return ret;
5829
Jeff Johnson441e1f72017-02-07 08:50:49 -08005830 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5831 if (0 != ret)
5832 return ret;
5833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005834 return -EOPNOTSUPP;
5835}
5836
5837/**
5838 * iw_get_power_mode() - SSR wrapper function for __iw_get_power_mode
5839 * @dev: pointer to net_device
5840 * @info: pointer to iw_request_info
5841 * @wrqu: pointer to iwreq_data
5842 * @extra: extra
5843 *
5844 * Return: 0 on success, error number otherwise
5845 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005846static int iw_get_power_mode(struct net_device *dev,
5847 struct iw_request_info *info,
5848 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005849{
5850 int ret;
5851
5852 cds_ssr_protect(__func__);
5853 ret = __iw_get_power_mode(dev, info, wrqu, extra);
5854 cds_ssr_unprotect(__func__);
5855
5856 return ret;
5857}
5858
5859/**
5860 * __iw_set_power_mode() - SIOCSIWPOWER ioctl handler
5861 * @dev: device upon which the ioctl was received
5862 * @info: ioctl request information
5863 * @wrqu: ioctl request data
5864 * @extra: ioctl extra data
5865 *
5866 * Return: 0 on success, non-zero on error
5867 */
5868static int __iw_set_power_mode(struct net_device *dev,
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005869 struct iw_request_info *info,
5870 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005871{
5872 hdd_adapter_t *adapter;
5873 hdd_context_t *hdd_ctx;
5874 int ret;
5875
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005876 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005877
5878 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5879 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5880 ret = wlan_hdd_validate_context(hdd_ctx);
5881 if (0 != ret)
5882 return ret;
5883
Jeff Johnson441e1f72017-02-07 08:50:49 -08005884 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5885 if (0 != ret)
5886 return ret;
5887
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005888 return -EOPNOTSUPP;
5889}
5890
5891/**
5892 * iw_set_power_mode() - SSR wrapper function for __iw_set_power_mode
5893 * @dev: pointer to net_device
5894 * @info: pointer to iw_request_info
5895 * @wrqu: pointer to iwreq_data
5896 * @extra: extra
5897 *
5898 * Return: 0 on success, error number otherwise
5899 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005900static int iw_set_power_mode(struct net_device *dev,
5901 struct iw_request_info *info,
5902 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005903{
5904 int ret;
5905
5906 cds_ssr_protect(__func__);
5907 ret = __iw_set_power_mode(dev, info, wrqu, extra);
5908 cds_ssr_unprotect(__func__);
5909
5910 return ret;
5911}
5912
5913/**
5914 * __iw_get_range() - SIOCGIWRANGE ioctl handler
5915 * @dev: device upon which the ioctl was received
5916 * @info: ioctl request information
5917 * @wrqu: ioctl request data
5918 * @extra: ioctl extra data
5919 *
5920 * Return: 0 on success, non-zero on error
5921 */
5922static int __iw_get_range(struct net_device *dev, struct iw_request_info *info,
5923 union iwreq_data *wrqu, char *extra)
5924{
5925 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5926 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5927 struct iw_range *range = (struct iw_range *)extra;
5928
5929 uint8_t channels[WNI_CFG_VALID_CHANNEL_LIST_LEN];
5930
5931 uint32_t num_channels = sizeof(channels);
5932 uint8_t supp_rates[WNI_CFG_SUPPORTED_RATES_11A_LEN];
5933 uint32_t a_len;
5934 uint32_t b_len;
5935 uint32_t active_phy_mode = 0;
5936 uint8_t index = 0, i;
5937 hdd_context_t *hdd_ctx;
5938 int ret;
5939
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005940 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005941
5942 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5943 ret = wlan_hdd_validate_context(hdd_ctx);
5944 if (0 != ret)
5945 return ret;
5946
Jeff Johnson441e1f72017-02-07 08:50:49 -08005947 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5948 if (0 != ret)
5949 return ret;
5950
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005951 wrqu->data.length = sizeof(struct iw_range);
5952 memset(range, 0, sizeof(struct iw_range));
5953
5954
5955 /*Get the phy mode */
5956 if (sme_cfg_get_int(hHal,
5957 WNI_CFG_DOT11_MODE,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305958 &active_phy_mode) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005959 hdd_debug("active_phy_mode = %d", active_phy_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005960
5961 if (active_phy_mode == WNI_CFG_DOT11_MODE_11A
5962 || active_phy_mode == WNI_CFG_DOT11_MODE_11G) {
5963 /*Get the supported rates for 11G band */
5964 a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
5965 if (sme_cfg_get_str(hHal,
5966 WNI_CFG_SUPPORTED_RATES_11A,
5967 supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305968 &a_len) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005969 if (a_len > WNI_CFG_SUPPORTED_RATES_11A_LEN)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005970 a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005971
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005972 for (i = 0; i < a_len; i++) {
5973 range->bitrate[i] =
5974 ((supp_rates[i] & 0x7F) / 2) *
5975 1000000;
5976 }
5977 range->num_bitrates = a_len;
5978 } else {
5979 return -EIO;
5980 }
5981 } else if (active_phy_mode == WNI_CFG_DOT11_MODE_11B) {
5982 /*Get the supported rates for 11B band */
5983 b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
5984 if (sme_cfg_get_str(hHal,
5985 WNI_CFG_SUPPORTED_RATES_11B,
5986 supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305987 &b_len) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005988 if (b_len > WNI_CFG_SUPPORTED_RATES_11B_LEN)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005989 b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005991 for (i = 0; i < b_len; i++) {
5992 range->bitrate[i] =
5993 ((supp_rates[i] & 0x7F) / 2) *
5994 1000000;
5995 }
5996 range->num_bitrates = b_len;
5997 } else {
5998 return -EIO;
5999 }
6000 }
6001 }
6002
6003 range->max_rts = WNI_CFG_RTS_THRESHOLD_STAMAX;
6004 range->min_frag = WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN;
6005 range->max_frag = WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX;
6006
6007 range->encoding_size[0] = 5;
6008 range->encoding_size[1] = 13;
6009 range->num_encoding_sizes = 2;
6010 range->max_encoding_tokens = MAX_WEP_KEYS;
6011
6012 /* we support through Wireless Extensions 22 */
6013 range->we_version_compiled = WIRELESS_EXT;
6014 range->we_version_source = 22;
6015
6016 /*Supported Channels and Frequencies */
6017 if (sme_cfg_get_str
6018 ((hHal), WNI_CFG_VALID_CHANNEL_LIST, channels,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306019 &num_channels) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006020 hdd_err("Failed to get ini parameter, WNI_CFG_VALID_CHANNEL_LIST");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006021 return -EIO;
6022 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006023 if (num_channels > IW_MAX_FREQUENCIES)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006024 num_channels = IW_MAX_FREQUENCIES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006025
6026 range->num_channels = num_channels;
6027 range->num_frequency = num_channels;
6028
6029 for (index = 0; index < num_channels; index++) {
6030 uint32_t frq_indx = 0;
6031
6032 range->freq[index].i = channels[index];
6033 while (frq_indx < FREQ_CHAN_MAP_TABLE_SIZE) {
6034 if (channels[index] == freq_chan_map[frq_indx].chan) {
6035 range->freq[index].m =
6036 freq_chan_map[frq_indx].freq * 100000;
6037 range->freq[index].e = 1;
6038 break;
6039 }
6040 frq_indx++;
6041 }
6042 }
6043
6044 /* Event capability (kernel + driver) */
6045 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6046 IW_EVENT_CAPA_MASK(SIOCGIWAP) |
6047 IW_EVENT_CAPA_MASK(SIOCGIWSCAN));
6048 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6049
6050 /*Encryption capability */
6051 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6052 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6053
6054 /* Txpower capability */
6055 range->txpower_capa = IW_TXPOW_MWATT;
6056
6057 /*Scanning capability */
6058#if WIRELESS_EXT >= 22
6059 range->scan_capa =
6060 IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE | IW_SCAN_CAPA_CHANNEL;
6061#endif
6062
6063 EXIT();
6064 return 0;
6065}
6066
6067/**
6068 * iw_get_range() - SSR wrapper for __iw_get_range()
6069 * @dev: pointer to net_device
6070 * @info: pointer to iw_request_info
6071 * @wrqu: pointer to iwreq_data
6072 * @extra: pointer to extra ioctl payload
6073 *
6074 * Return: 0 on success, error number otherwise
6075 */
6076static int iw_get_range(struct net_device *dev, struct iw_request_info *info,
6077 union iwreq_data *wrqu, char *extra)
6078{
6079 int ret;
6080
6081 cds_ssr_protect(__func__);
6082 ret = __iw_get_range(dev, info, wrqu, extra);
6083 cds_ssr_unprotect(__func__);
6084
6085 return ret;
6086}
6087
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006088struct class_a_stats {
6089 tCsrGlobalClassAStatsInfo class_a_stats;
6090};
6091
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006092/**
6093 * hdd_get_class_a_statistics_cb() - Get Class A stats callback function
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006094 * @stats: pointer to Class A stats
6095 * @context: user context originally registered with SME (always the
6096 * cookie from the request context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006097 *
6098 * Return: None
6099 */
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006100static void hdd_get_class_a_statistics_cb(void *stats, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006101{
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006102 struct hdd_request *request;
6103 struct class_a_stats *priv;
6104 tCsrGlobalClassAStatsInfo *returned_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006105
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006106 ENTER();
6107 if ((NULL == stats) || (NULL == context)) {
6108 hdd_err("Bad param, stats [%p] context [%p]",
6109 stats, context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006110 return;
6111 }
6112
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006113 request = hdd_request_get(context);
6114 if (!request) {
6115 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006116 return;
6117 }
6118
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006119 returned_stats = stats;
6120 priv = hdd_request_priv(request);
6121 priv->class_a_stats = *returned_stats;
6122 hdd_request_complete(request);
6123 hdd_request_put(request);
6124 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006125}
6126
6127/**
6128 * wlan_hdd_get_class_astats() - Get Class A statistics
6129 * @pAdapter: adapter for which statistics are desired
6130 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306131 * Return: QDF_STATUS_SUCCESS if adapter's Class A statistics were updated
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006132 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306133QDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006134{
6135 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306136 QDF_STATUS hstatus;
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006137 int ret;
6138 void *cookie;
6139 struct hdd_request *request;
6140 struct class_a_stats *priv;
6141 static const struct hdd_request_params params = {
6142 .priv_size = sizeof(*priv),
6143 .timeout_ms = WLAN_WAIT_TIME_STATS,
6144 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006145
6146 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006147 hdd_err("pAdapter is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306148 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006149 }
Hanumanth Reddy Pothula2a8a7402017-07-03 14:06:11 +05306150 if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006151 hdd_debug("Recovery in Progress. State: 0x%x Ignore!!!",
Prashanth Bhatta9e143052015-12-04 11:56:47 -08006152 cds_get_driver_state());
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306153 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006154 }
6155
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006156 request = hdd_request_alloc(&params);
6157 if (!request) {
6158 hdd_err("Request allocation failure");
6159 return QDF_STATUS_E_NOMEM;
6160 }
6161 cookie = hdd_request_cookie(request);
6162
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006163 /* query only for Class A statistics (which include link speed) */
6164 hstatus = sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
6165 eCSR_HDD, SME_GLOBAL_CLASSA_STATS,
6166 hdd_get_class_a_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006167 pHddStaCtx->conn_info.staId[0],
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006168 cookie, pAdapter->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306169 if (QDF_STATUS_SUCCESS != hstatus) {
Archana Ramachandran31b5b652016-09-21 15:37:58 -07006170 hdd_warn("Unable to retrieve Class A statistics");
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006171 goto return_cached_results;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006172 }
6173
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006174 /* request was sent -- wait for the response */
6175 ret = hdd_request_wait_for_response(request);
6176 if (ret) {
6177 hdd_warn("SME timed out while retrieving Class A statistics");
6178 goto return_cached_results;
6179 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006180
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006181 /* update the adapter with the fresh results */
6182 priv = hdd_request_priv(request);
6183 pAdapter->hdd_stats.ClassA_stat = priv->class_a_stats;
6184
6185return_cached_results:
6186 /*
6187 * either we never sent a request, we sent a request and
6188 * received a response or we sent a request and timed out.
6189 * regardless we are done with the request.
6190 */
6191 hdd_request_put(request);
6192
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306193 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006194}
6195
Jeff Johnsondda167c2017-01-23 10:37:57 -08006196struct station_stats {
6197 tCsrSummaryStatsInfo summary_stats;
6198 tCsrGlobalClassAStatsInfo class_a_stats;
6199 struct csr_per_chain_rssi_stats_info per_chain_rssi_stats;
6200};
6201
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006202/**
6203 * hdd_get_station_statistics_cb() - Get stats callback function
Jeff Johnsondda167c2017-01-23 10:37:57 -08006204 * @stats: pointer to combined station stats
6205 * @context: user context originally registered with SME (always the
6206 * cookie from the request context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006207 *
6208 * Return: None
6209 */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006210static void hdd_get_station_statistics_cb(void *stats, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006211{
Jeff Johnsondda167c2017-01-23 10:37:57 -08006212 struct hdd_request *request;
6213 struct station_stats *priv;
6214 tCsrSummaryStatsInfo *summary_stats;
6215 tCsrGlobalClassAStatsInfo *class_a_stats;
Himanshu Agarwal37e42412016-07-21 14:35:09 +05306216 struct csr_per_chain_rssi_stats_info *per_chain_rssi_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006217
Jeff Johnsondda167c2017-01-23 10:37:57 -08006218 if ((NULL == stats) || (NULL == context)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006219 hdd_err("Bad param, pStats [%p] pContext [%p]",
Jeff Johnsondda167c2017-01-23 10:37:57 -08006220 stats, context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006221 return;
6222 }
6223
Jeff Johnsondda167c2017-01-23 10:37:57 -08006224 request = hdd_request_get(context);
6225 if (!request) {
6226 hdd_err("Obsolete request");
6227 return;
6228 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006229
Jeff Johnsondda167c2017-01-23 10:37:57 -08006230 summary_stats = (tCsrSummaryStatsInfo *) stats;
6231 class_a_stats = (tCsrGlobalClassAStatsInfo *) (summary_stats + 1);
Himanshu Agarwal37e42412016-07-21 14:35:09 +05306232 per_chain_rssi_stats = (struct csr_per_chain_rssi_stats_info *)
Jeff Johnsondda167c2017-01-23 10:37:57 -08006233 (class_a_stats + 1);
6234 priv = hdd_request_priv(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006235
6236 /* copy over the stats. do so as a struct copy */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006237 priv->summary_stats = *summary_stats;
6238 priv->class_a_stats = *class_a_stats;
6239 priv->per_chain_rssi_stats = *per_chain_rssi_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006240
Jeff Johnsondda167c2017-01-23 10:37:57 -08006241 hdd_request_complete(request);
6242 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006243}
6244
6245/**
6246 * wlan_hdd_get_station_stats() - Get station statistics
6247 * @pAdapter: adapter for which statistics are desired
6248 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306249 * Return: QDF_STATUS_SUCCESS if adapter's statistics were updated
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006250 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306251QDF_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006252{
6253 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Dustin Brown0f5260d2017-06-12 16:17:38 -07006254 QDF_STATUS status;
6255 int errno;
Jeff Johnsondda167c2017-01-23 10:37:57 -08006256 void *cookie;
6257 struct hdd_request *request;
6258 struct station_stats *priv;
6259 static const struct hdd_request_params params = {
6260 .priv_size = sizeof(*priv),
6261 .timeout_ms = WLAN_WAIT_TIME_STATS,
6262 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006263
6264 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006265 hdd_err("pAdapter is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306266 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006267 }
6268
Jeff Johnsondda167c2017-01-23 10:37:57 -08006269 request = hdd_request_alloc(&params);
6270 if (!request) {
6271 hdd_err("Request allocation failure");
6272 return QDF_STATUS_E_NOMEM;
6273 }
6274 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006275
6276 /* query only for Summary & Class A statistics */
Dustin Brown0f5260d2017-06-12 16:17:38 -07006277 status = sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
6278 eCSR_HDD,
6279 SME_SUMMARY_STATS |
6280 SME_GLOBAL_CLASSA_STATS |
6281 SME_PER_CHAIN_RSSI_STATS,
6282 hdd_get_station_statistics_cb,
Dustin Brown0f5260d2017-06-12 16:17:38 -07006283 pHddStaCtx->conn_info.staId[0],
6284 cookie,
6285 pAdapter->sessionId);
6286 if (QDF_IS_STATUS_ERROR(status)) {
6287 hdd_err("Failed to retrieve statistics, status %d", status);
6288 goto put_request;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006289 }
6290
Dustin Brown0f5260d2017-06-12 16:17:38 -07006291 /* request was sent -- wait for the response */
6292 errno = hdd_request_wait_for_response(request);
6293 if (errno) {
6294 hdd_err("Failed to wait for statistics, errno %d", errno);
6295 goto put_request;
6296 }
6297
6298 /* update the adapter with the fresh results */
6299 priv = hdd_request_priv(request);
6300 pAdapter->hdd_stats.summary_stat = priv->summary_stats;
6301 pAdapter->hdd_stats.ClassA_stat = priv->class_a_stats;
6302 pAdapter->hdd_stats.per_chain_rssi_stats = priv->per_chain_rssi_stats;
6303
6304put_request:
Jeff Johnsondda167c2017-01-23 10:37:57 -08006305 /*
6306 * either we never sent a request, we sent a request and
6307 * received a response or we sent a request and timed out.
6308 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006309 */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006310 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006311
6312 /* either callback updated pAdapter stats or it has cached data */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306313 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006314}
6315
6316/**
6317 * iw_get_linkspeed() - Get current link speed ioctl
6318 * @dev: device upon which the ioctl was received
6319 * @info: ioctl request information
6320 * @wrqu: ioctl request data
6321 * @extra: extra ioctl buffer
6322 *
6323 * Return: 0 on success, non-zero on error
6324 */
6325static int __iw_get_linkspeed(struct net_device *dev,
6326 struct iw_request_info *info,
6327 union iwreq_data *wrqu, char *extra)
6328{
6329 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6330 char *pLinkSpeed = (char *)extra;
6331 int len = sizeof(uint32_t) + 1;
6332 uint32_t link_speed = 0;
6333 hdd_context_t *hdd_ctx;
Jeff Johnson441e1f72017-02-07 08:50:49 -08006334 int ret;
6335 int rc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006336
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08006337 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05306338
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006339 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Jeff Johnson441e1f72017-02-07 08:50:49 -08006340 ret = wlan_hdd_validate_context(hdd_ctx);
6341 if (0 != ret)
6342 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006343
Jeff Johnson441e1f72017-02-07 08:50:49 -08006344 ret = hdd_check_private_wext_control(hdd_ctx, info);
6345 if (0 != ret)
6346 return ret;
6347
6348 ret = wlan_hdd_get_link_speed(pAdapter, &link_speed);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006349 if (0 != ret)
Jeff Johnson441e1f72017-02-07 08:50:49 -08006350 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006351
6352 wrqu->data.length = len;
6353 /* return the linkspeed as a string */
6354 rc = snprintf(pLinkSpeed, len, "%u", link_speed);
6355 if ((rc < 0) || (rc >= len)) {
6356 /* encoding or length error? */
Jeff Johnson99bac312016-06-28 10:38:18 -07006357 hdd_err("Unable to encode link speed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006358 return -EIO;
6359 }
6360
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05306361 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006362 /* a value is being successfully returned */
6363 return 0;
6364}
6365
6366static int iw_get_linkspeed(struct net_device *dev,
6367 struct iw_request_info *info,
6368 union iwreq_data *wrqu, char *extra)
6369{
6370 int ret;
6371
6372 cds_ssr_protect(__func__);
6373 ret = __iw_get_linkspeed(dev, info, wrqu, extra);
6374 cds_ssr_unprotect(__func__);
6375
6376 return ret;
6377}
6378
6379/**
6380 * wlan_hdd_change_country_code_callback() - Change country code callback
6381 * @context: opaque context originally passed to SME. All functions
6382 * which use this callback pass the adapter upon which the country
6383 * code change is active
6384 *
6385 * This function is registered as the callback function when
6386 * sme_change_country_code() is invoked. Callers of
6387 * sme_change_country_code() subsequently wait for the adapter's
6388 * @change_country_code completion variable, so all this function
6389 * needs to do is set that completion variable so that execution can
6390 * continue.
6391 *
6392 * Return: none
6393 */
6394void wlan_hdd_change_country_code_callback(void *context)
6395{
6396
6397 hdd_adapter_t *adapter = context;
6398
6399 if (adapter && (WLAN_HDD_ADAPTER_MAGIC == adapter->magic))
6400 complete(&adapter->change_country_code);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006401}
6402
6403/**
6404 * __iw_set_nick() - SIOCSIWNICKN ioctl handler
6405 * @dev: device upon which the ioctl was received
6406 * @info: ioctl request information
6407 * @wrqu: ioctl request data
6408 * @extra: ioctl extra data
6409 *
6410 * Return: 0 on success, non-zero on error
6411 */
6412static int __iw_set_nick(struct net_device *dev,
6413 struct iw_request_info *info,
6414 union iwreq_data *wrqu, char *extra)
6415{
6416 hdd_adapter_t *adapter;
6417 hdd_context_t *hdd_ctx;
6418 int ret;
6419
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006420 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006421
6422 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6423 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6424 ret = wlan_hdd_validate_context(hdd_ctx);
6425 if (0 != ret)
6426 return ret;
6427
Jeff Johnson441e1f72017-02-07 08:50:49 -08006428 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6429 if (0 != ret)
6430 return ret;
6431
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006432 return 0;
6433}
6434
6435/**
6436 * iw_set_nick() - SSR wrapper for __iw_set_nick
6437 * @dev: pointer to net_device
6438 * @info: pointer to iw_request_info
6439 * @wrqu: pointer to iwreq_data
6440 * @extra: extra
6441 *
6442 * Return: 0 on success, error number otherwise
6443 */
6444static int iw_set_nick(struct net_device *dev,
6445 struct iw_request_info *info,
6446 union iwreq_data *wrqu, char *extra)
6447{
6448 int ret;
6449
6450 cds_ssr_protect(__func__);
6451 ret = __iw_set_nick(dev, info, wrqu, extra);
6452 cds_ssr_unprotect(__func__);
6453
6454 return ret;
6455}
6456
6457/**
6458 * __iw_get_nick() - SIOCGIWNICKN ioctl handler
6459 * @dev: device upon which the ioctl was received
6460 * @info: ioctl request information
6461 * @wrqu: ioctl request data
6462 * @extra: ioctl extra data
6463 *
6464 * Return: 0 on success, non-zero on error
6465 */
6466static int __iw_get_nick(struct net_device *dev,
6467 struct iw_request_info *info,
6468 union iwreq_data *wrqu, char *extra)
6469{
6470 hdd_adapter_t *adapter;
6471 hdd_context_t *hdd_ctx;
6472 int ret;
6473
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006474 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006475
6476 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6477 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6478 ret = wlan_hdd_validate_context(hdd_ctx);
6479 if (0 != ret)
6480 return ret;
6481
Jeff Johnson441e1f72017-02-07 08:50:49 -08006482 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6483 if (0 != ret)
6484 return ret;
6485
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006486 return 0;
6487}
6488
6489/**
6490 * iw_get_nick() - SSR wrapper for __iw_get_nick
6491 * @dev: pointer to net_device
6492 * @info: pointer to iw_request_info
6493 * @wrqu: pointer to iwreq_data
6494 * @extra: extra
6495 *
6496 * Return: 0 on success, error number otherwise
6497 */
6498static int iw_get_nick(struct net_device *dev,
6499 struct iw_request_info *info,
6500 union iwreq_data *wrqu, char *extra)
6501{
6502 int ret;
6503
6504 cds_ssr_protect(__func__);
6505 ret = __iw_get_nick(dev, info, wrqu, extra);
6506 cds_ssr_unprotect(__func__);
6507
6508 return ret;
6509}
6510
6511/**
6512 * __iw_set_encode() - SIOCSIWENCODE ioctl handler
6513 * @dev: device upon which the ioctl was received
6514 * @info: ioctl request information
6515 * @wrqu: ioctl request data
6516 * @extra: ioctl extra data
6517 *
6518 * Return: 0 on success, non-zero on error
6519 */
6520static int __iw_set_encode(struct net_device *dev, struct iw_request_info *info,
6521 union iwreq_data *wrqu, char *extra)
6522{
6523 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6524 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
6525 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6526 hdd_context_t *hdd_ctx;
6527 struct iw_point *encoderq = &(wrqu->encoding);
6528 uint32_t keyId;
6529 uint8_t key_length;
6530 eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
6531 bool fKeyPresent = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306532 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006533 int ret;
6534
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006535 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006536
6537 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6538 ret = wlan_hdd_validate_context(hdd_ctx);
6539 if (0 != ret)
6540 return ret;
6541
Jeff Johnson441e1f72017-02-07 08:50:49 -08006542 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6543 if (0 != ret)
6544 return ret;
6545
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006546 keyId = encoderq->flags & IW_ENCODE_INDEX;
6547
6548 if (keyId) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006549 if (keyId > MAX_WEP_KEYS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006550 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006551
6552 fKeyPresent = 1;
6553 keyId--;
6554 } else {
6555 fKeyPresent = 0;
6556 }
6557
6558 if (wrqu->data.flags & IW_ENCODE_DISABLED) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006559 hdd_debug("****iwconfig wlan0 key off*****");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006560 if (!fKeyPresent) {
Yingying Tang3cc6b792016-10-20 17:00:37 +08006561 qdf_mem_zero(pWextState->roamProfile.Keys.KeyLength,
6562 CSR_MAX_NUM_KEY);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006563 }
6564 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
6565 pWextState->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
6566 pWextState->roamProfile.EncryptionType.encryptionType[0] =
6567 eCSR_ENCRYPT_TYPE_NONE;
6568 pWextState->roamProfile.mcEncryptionType.encryptionType[0] =
6569 eCSR_ENCRYPT_TYPE_NONE;
6570
6571 pHddStaCtx->conn_info.ucEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
6572 pHddStaCtx->conn_info.mcEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
6573
6574 if (eConnectionState_Associated ==
6575 pHddStaCtx->conn_info.connState) {
6576 INIT_COMPLETION(pAdapter->disconnect_comp_var);
6577 status =
6578 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
6579 pAdapter->sessionId,
6580 eCSR_DISCONNECT_REASON_UNSPECIFIED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306581 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006582 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006583
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006584 rc = wait_for_completion_timeout(&pAdapter->
6585 disconnect_comp_var,
6586 msecs_to_jiffies
6587 (WLAN_WAIT_TIME_DISCONNECT));
6588 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006589 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006590 }
6591 }
6592
6593 return status;
6594
6595 }
6596
6597 if (wrqu->data.flags & (IW_ENCODE_OPEN | IW_ENCODE_RESTRICTED)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006598 hdd_debug("iwconfig wlan0 key on");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006599
6600 pHddStaCtx->conn_info.authType =
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006601 (encoderq->flags & IW_ENCODE_RESTRICTED) ?
6602 eCSR_AUTH_TYPE_SHARED_KEY :
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006603 eCSR_AUTH_TYPE_OPEN_SYSTEM;
6604
6605 }
6606
6607 if (wrqu->data.length > 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006608 hdd_debug("wrqu->data.length : %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006609
6610 key_length = wrqu->data.length;
6611
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006612 /* IW_ENCODING_TOKEN_MAX is the value that is set
6613 * for wrqu->data.length by iwconfig.c
6614 * when 'iwconfig wlan0 key on' is issued.
6615 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006616
6617 if (5 == key_length) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006618 hdd_debug("Call with WEP40,key_len=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006619 key_length);
6620
6621 if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt)
6622 && (eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6623 pHddStaCtx->conn_info.authType)) {
6624 encryptionType = eCSR_ENCRYPT_TYPE_WEP40;
6625 } else {
6626 encryptionType =
6627 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
6628 }
6629 } else if (13 == key_length) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006630 hdd_debug("Call with WEP104,key_len:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006631 key_length);
6632
6633 if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt)
6634 && (eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6635 pHddStaCtx->conn_info.authType)) {
6636 encryptionType = eCSR_ENCRYPT_TYPE_WEP104;
6637 } else {
6638 encryptionType =
6639 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
6640 }
6641 } else {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006642 hdd_err("Invalid WEP key length :%d", key_length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006643 return -EINVAL;
6644 }
6645
6646 pHddStaCtx->conn_info.ucEncryptionType = encryptionType;
6647 pHddStaCtx->conn_info.mcEncryptionType = encryptionType;
6648 pWextState->roamProfile.EncryptionType.numEntries = 1;
6649 pWextState->roamProfile.EncryptionType.encryptionType[0] =
6650 encryptionType;
6651 pWextState->roamProfile.mcEncryptionType.numEntries = 1;
6652 pWextState->roamProfile.mcEncryptionType.encryptionType[0] =
6653 encryptionType;
6654
6655 if ((eConnectionState_NotConnected ==
6656 pHddStaCtx->conn_info.connState)
6657 &&
6658 ((eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6659 pHddStaCtx->conn_info.authType)
6660 || (eCSR_AUTH_TYPE_SHARED_KEY ==
6661 pHddStaCtx->conn_info.authType))) {
6662
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306663 qdf_mem_copy(&pWextState->roamProfile.Keys.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006664 KeyMaterial[keyId][0], extra, key_length);
6665
6666 pWextState->roamProfile.Keys.KeyLength[keyId] =
6667 (uint8_t) key_length;
6668 pWextState->roamProfile.Keys.defaultIndex =
6669 (uint8_t) keyId;
6670
6671 return status;
6672 }
6673 }
6674
6675 return 0;
6676}
6677
6678/**
6679 * iw_set_encode() - SSR wrapper for __iw_set_encode()
6680 * @dev: pointer to net_device
6681 * @info: pointer to iw_request_info
6682 * @wrqu: pointer to iwreq_data
6683 * @extra: pointer to extra ioctl payload
6684 *
6685 * Return: 0 on success, error number otherwise
6686 */
6687static int iw_set_encode(struct net_device *dev, struct iw_request_info *info,
6688 union iwreq_data *wrqu, char *extra)
6689{
6690 int ret;
6691
6692 cds_ssr_protect(__func__);
6693 ret = __iw_set_encode(dev, info, wrqu, extra);
6694 cds_ssr_unprotect(__func__);
6695
6696 return ret;
6697}
6698
6699/**
6700 * __iw_get_encodeext() - SIOCGIWENCODEEXT ioctl handler
6701 * @dev: device upon which the ioctl was received
6702 * @info: ioctl request information
6703 * @wrqu: ioctl request data
6704 * @extra: ioctl extra data
6705 *
6706 * Return: 0 on success, non-zero on error
6707 */
6708static int __iw_get_encodeext(struct net_device *dev,
6709 struct iw_request_info *info,
6710 struct iw_point *dwrq, char *extra)
6711{
6712 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6713 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6714 tCsrRoamProfile *pRoamProfile = &(pWextState->roamProfile);
6715 int keyId;
6716 eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
6717 eCsrAuthType authType = eCSR_AUTH_TYPE_NONE;
6718 int i, ret;
6719 hdd_context_t *hdd_ctx;
6720
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006721 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006722
6723 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6724 ret = wlan_hdd_validate_context(hdd_ctx);
6725 if (0 != ret)
6726 return ret;
6727
Jeff Johnson441e1f72017-02-07 08:50:49 -08006728 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6729 if (0 != ret)
6730 return ret;
6731
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006732 keyId = pRoamProfile->Keys.defaultIndex;
6733
6734 if (keyId < 0 || keyId >= MAX_WEP_KEYS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006735 hdd_err("Invalid keyId: %d", keyId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006736 return -EINVAL;
6737 }
6738
6739 if (pRoamProfile->Keys.KeyLength[keyId] > 0) {
6740 dwrq->flags |= IW_ENCODE_ENABLED;
6741 dwrq->length = pRoamProfile->Keys.KeyLength[keyId];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306742 qdf_mem_copy(extra, &(pRoamProfile->Keys.KeyMaterial[keyId][0]),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006743 pRoamProfile->Keys.KeyLength[keyId]);
6744 } else {
6745 dwrq->flags |= IW_ENCODE_DISABLED;
6746 }
6747
6748 for (i = 0; i < MAX_WEP_KEYS; i++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006749 if (pRoamProfile->Keys.KeyLength[i] == 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006750 continue;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006751 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006752 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006753 }
6754
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006755 if (MAX_WEP_KEYS == i)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006756 dwrq->flags |= IW_ENCODE_NOKEY;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006757 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006758 dwrq->flags |= IW_ENCODE_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006759
6760 encryptionType = pRoamProfile->EncryptionType.encryptionType[0];
6761
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006762 if (eCSR_ENCRYPT_TYPE_NONE == encryptionType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006763 dwrq->flags |= IW_ENCODE_DISABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006764
6765 authType = (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.authType;
6766
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006767 if (IW_AUTH_ALG_OPEN_SYSTEM == authType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006768 dwrq->flags |= IW_ENCODE_OPEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006769 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006770 dwrq->flags |= IW_ENCODE_RESTRICTED;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006771
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006772 EXIT();
6773 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006774}
6775
6776/**
6777 * iw_get_encodeext() - SSR wrapper for __iw_get_encodeext()
6778 * @dev: pointer to net_device
6779 * @info: pointer to iw_request_info
6780 * @dwrq: pointer to encoding information
6781 * @extra: pointer to extra ioctl payload
6782 *
6783 * Return: 0 on success, error number otherwise
6784 */
6785static int iw_get_encodeext(struct net_device *dev,
6786 struct iw_request_info *info,
6787 struct iw_point *dwrq, char *extra)
6788{
6789 int ret;
6790
6791 cds_ssr_protect(__func__);
6792 ret = __iw_get_encodeext(dev, info, dwrq, extra);
6793 cds_ssr_unprotect(__func__);
6794
6795 return ret;
6796}
6797
6798/**
6799 * __iw_set_encodeext() - SIOCSIWENCODEEXT ioctl handler
6800 * @dev: device upon which the ioctl was received
6801 * @info: ioctl request information
6802 * @wrqu: ioctl request data
6803 * @extra: ioctl extra data
6804 *
6805 * Return: 0 on success, non-zero on error
6806 */
6807static int __iw_set_encodeext(struct net_device *dev,
6808 struct iw_request_info *info,
6809 union iwreq_data *wrqu, char *extra)
6810{
6811 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6812 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
6813 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6814 hdd_context_t *hdd_ctx;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306815 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006816 tCsrRoamProfile *pRoamProfile = &pWextState->roamProfile;
6817 int ret;
6818 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6819 int key_index;
6820 struct iw_point *encoding = &wrqu->encoding;
6821 tCsrRoamSetKey setKey;
6822 uint32_t roamId = 0xFF;
6823
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006824 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006825
6826 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6827 ret = wlan_hdd_validate_context(hdd_ctx);
6828 if (0 != ret)
6829 return ret;
6830
Jeff Johnson441e1f72017-02-07 08:50:49 -08006831 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6832 if (0 != ret)
6833 return ret;
6834
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006835 key_index = encoding->flags & IW_ENCODE_INDEX;
6836
6837 if (key_index > 0) {
6838
6839 /*Convert from 1-based to 0-based keying */
6840 key_index--;
6841 }
6842 if (!ext->key_len) {
6843
6844 /*Set the encrytion type to NONE */
6845 pRoamProfile->EncryptionType.encryptionType[0] =
6846 eCSR_ENCRYPT_TYPE_NONE;
6847 return ret;
6848 }
6849
6850 if (eConnectionState_NotConnected == pHddStaCtx->conn_info.connState &&
6851 (IW_ENCODE_ALG_WEP == ext->alg)) {
6852 if (IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) {
6853
Jeff Johnson99bac312016-06-28 10:38:18 -07006854 hdd_err("Invalid Configuration");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006855 return -EINVAL;
Jeff Johnson68755312017-02-10 11:46:55 -08006856 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006857
Jeff Johnson68755312017-02-10 11:46:55 -08006858 /*Static wep, update the roam profile with the keys */
6859 if (ext->key_len &&
6860 (ext->key_len <= eCSR_SECURITY_WEP_KEYSIZE_MAX_BYTES) &&
6861 key_index < CSR_MAX_NUM_KEY) {
6862 qdf_mem_copy(&pRoamProfile->Keys.
6863 KeyMaterial[key_index][0],
6864 ext->key, ext->key_len);
6865 pRoamProfile->Keys.KeyLength[key_index] =
6866 (uint8_t) ext->key_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006867
Jeff Johnson68755312017-02-10 11:46:55 -08006868 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
6869 pRoamProfile->Keys.defaultIndex =
6870 (uint8_t) key_index;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006871 }
6872 return ret;
6873 }
6874
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306875 qdf_mem_zero(&setKey, sizeof(tCsrRoamSetKey));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006876
6877 setKey.keyId = key_index;
6878 setKey.keyLength = ext->key_len;
6879
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006880 if (ext->key_len <= CSR_MAX_KEY_LEN)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306881 qdf_mem_copy(&setKey.Key[0], ext->key, ext->key_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006882
6883 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
6884 /*Key direction for group is RX only */
6885 setKey.keyDirection = eSIR_RX_ONLY;
Anurag Chouhanc5548422016-02-24 18:33:27 +05306886 qdf_set_macaddr_broadcast(&setKey.peerMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006887 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006888 setKey.keyDirection = eSIR_TX_RX;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306889 qdf_mem_copy(setKey.peerMac.bytes, ext->addr.sa_data,
Anurag Chouhan6d760662016-02-20 16:05:43 +05306890 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006891 }
6892
6893 /*For supplicant pae role is zero */
6894 setKey.paeRole = 0;
6895
6896 switch (ext->alg) {
6897 case IW_ENCODE_ALG_NONE:
6898 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
6899 break;
6900
6901 case IW_ENCODE_ALG_WEP:
6902 setKey.encType =
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006903 (ext->key_len == 5) ? eCSR_ENCRYPT_TYPE_WEP40 :
6904 eCSR_ENCRYPT_TYPE_WEP104;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006905 break;
6906
6907 case IW_ENCODE_ALG_TKIP:
6908 {
6909 uint8_t *pKey = &setKey.Key[0];
6910
6911 setKey.encType = eCSR_ENCRYPT_TYPE_TKIP;
6912
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306913 qdf_mem_zero(pKey, CSR_MAX_KEY_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006914
6915 /* Supplicant sends the 32bytes key in this order
6916 * |--------------|----------|----------|
6917 * | Tk1 | TX MIC | RX MIC |
6918 * |--------------|----------|----------|
6919 * <---16bytes---><--8bytes--><--8bytes-->
6920 *
6921 *
6922 * Sme expects the 32 bytes key to be in the below order
6923 * |--------------|----------|----------|
6924 * | Tk1 | RX MIC | TX MIC |
6925 * |--------------|----------|----------|
6926 * <---16bytes---><--8bytes--><--8bytes-->
6927 */
6928
6929 /* Copy the Temporal Key 1 (TK1) */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306930 qdf_mem_copy(pKey, ext->key, 16);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006931
6932 /* Copy the rx mic first */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306933 qdf_mem_copy(&pKey[16], &ext->key[24], 8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006934
6935 /* Copy the tx mic */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306936 qdf_mem_copy(&pKey[24], &ext->key[16], 8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006937
6938 }
6939 break;
6940
6941 case IW_ENCODE_ALG_CCMP:
6942 setKey.encType = eCSR_ENCRYPT_TYPE_AES;
6943 break;
6944
6945#ifdef FEATURE_WLAN_ESE
6946#define IW_ENCODE_ALG_KRK 6
6947 case IW_ENCODE_ALG_KRK:
6948 setKey.encType = eCSR_ENCRYPT_TYPE_KRK;
6949 break;
6950#endif /* FEATURE_WLAN_ESE */
6951
6952 default:
6953 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
6954 break;
6955 }
6956
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006957 hdd_debug("cipher_alg:%d key_len:%d EncryptionType:%d",
Jeff Johnson99bac312016-06-28 10:38:18 -07006958 (int)ext->alg, (int)ext->key_len, setKey.encType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006959
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006960 /* The supplicant may attempt to set the PTK once
6961 * pre-authentication is done. Save the key in the UMAC and
6962 * include it in the ADD BSS request
6963 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306964 qdf_ret_status = sme_ft_update_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006965 pAdapter->sessionId, &setKey);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306966 if (qdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006967 hdd_debug("Update PreAuth Key success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006968 return 0;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306969 } else if (qdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_FAILED) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006970 hdd_err("Update PreAuth Key failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006971 return -EINVAL;
6972 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006973
6974 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;
6975
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306976 qdf_ret_status = sme_roam_set_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006977 pAdapter->sessionId,
6978 &setKey, &roamId);
6979
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306980 if (qdf_ret_status != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006981 hdd_err("[%4d] sme_roam_set_key returned ERROR status= %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306982 __LINE__, qdf_ret_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006983
6984 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
6985 }
6986
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306987 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988}
6989
6990/**
6991 * iw_set_encodeext() - SSR wrapper for __iw_set_encodeext()
6992 * @dev: pointer to net_device
6993 * @info: pointer to iw_request_info
6994 * @wrqu: pointer to iwreq_data
6995 * @extra: pointer to extra ioctl payload
6996 *
6997 * Return: 0 on success, error number otherwise
6998 */
6999static int iw_set_encodeext(struct net_device *dev,
7000 struct iw_request_info *info,
7001 union iwreq_data *wrqu, char *extra)
7002{
7003 int ret;
7004
7005 cds_ssr_protect(__func__);
7006 ret = __iw_set_encodeext(dev, info, wrqu, extra);
7007 cds_ssr_unprotect(__func__);
7008
7009 return ret;
7010}
7011
7012/**
7013 * __iw_set_retry() - SIOCSIWRETRY ioctl handler
7014 * @dev: device upon which the ioctl was received
7015 * @info: ioctl request information
7016 * @wrqu: ioctl request data
7017 * @extra: ioctl extra data
7018 *
7019 * Return: 0 on success, non-zero on error
7020 */
7021static int __iw_set_retry(struct net_device *dev, struct iw_request_info *info,
7022 union iwreq_data *wrqu, char *extra)
7023{
7024 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7025 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7026 hdd_context_t *hdd_ctx;
7027 int ret;
7028
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007029 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007030
7031 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7032 ret = wlan_hdd_validate_context(hdd_ctx);
7033 if (0 != ret)
7034 return ret;
7035
Jeff Johnson441e1f72017-02-07 08:50:49 -08007036 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7037 if (0 != ret)
7038 return ret;
7039
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007040 if (wrqu->retry.value < WNI_CFG_LONG_RETRY_LIMIT_STAMIN ||
7041 wrqu->retry.value > WNI_CFG_LONG_RETRY_LIMIT_STAMAX) {
7042
Jeff Johnson99bac312016-06-28 10:38:18 -07007043 hdd_err("Invalid Retry-Limit=%d!!", wrqu->retry.value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007044
7045 return -EINVAL;
7046 }
7047
7048 if (wrqu->retry.flags & IW_RETRY_LIMIT) {
7049
7050 if ((wrqu->retry.flags & IW_RETRY_LONG)) {
7051 if (sme_cfg_set_int (hHal, WNI_CFG_LONG_RETRY_LIMIT,
7052 wrqu->retry.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307053 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007054 hdd_err("WNI_CFG_LONG_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007055 return -EIO;
7056 }
7057 } else if ((wrqu->retry.flags & IW_RETRY_SHORT)) {
7058 if (sme_cfg_set_int (hHal, WNI_CFG_SHORT_RETRY_LIMIT,
7059 wrqu->retry.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307060 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007061 hdd_err("WNI_CFG_SHORT_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007062 return -EIO;
7063 }
7064 }
7065 } else {
7066 return -EOPNOTSUPP;
7067 }
7068
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007069 hdd_debug("Set Retry-Limit=%d!!", wrqu->retry.value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007070
7071 EXIT();
7072
7073 return 0;
7074
7075}
7076
7077/**
7078 * iw_set_retry() - SSR wrapper for __iw_set_retry()
7079 * @dev: pointer to net_device
7080 * @info: pointer to iw_request_info
7081 * @wrqu: pointer to iwreq_data
7082 * @extra: pointer to extra ioctl payload
7083 *
7084 * Return: 0 on success, error number otherwise
7085 */
7086static int iw_set_retry(struct net_device *dev, struct iw_request_info *info,
7087 union iwreq_data *wrqu, char *extra)
7088{
7089 int ret;
7090
7091 cds_ssr_protect(__func__);
7092 ret = __iw_set_retry(dev, info, wrqu, extra);
7093 cds_ssr_unprotect(__func__);
7094
7095 return ret;
7096}
7097
7098/**
7099 * __iw_get_retry() - SIOCGIWRETRY ioctl handler
7100 * @dev: device upon which the ioctl was received
7101 * @info: ioctl request information
7102 * @wrqu: ioctl request data
7103 * @extra: ioctl extra data
7104 *
7105 * Return: 0 on success, non-zero on error
7106 */
7107static int __iw_get_retry(struct net_device *dev, struct iw_request_info *info,
7108 union iwreq_data *wrqu, char *extra)
7109{
7110 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7111 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7112 uint32_t retry = 0;
7113 hdd_context_t *hdd_ctx;
7114 int ret;
7115
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007116 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007117
7118 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7119 ret = wlan_hdd_validate_context(hdd_ctx);
7120 if (0 != ret)
7121 return ret;
7122
Jeff Johnson441e1f72017-02-07 08:50:49 -08007123 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7124 if (0 != ret)
7125 return ret;
7126
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007127 if ((wrqu->retry.flags & IW_RETRY_LONG)) {
7128 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7129
7130 if (sme_cfg_get_int(hHal, WNI_CFG_LONG_RETRY_LIMIT, &retry) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307131 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007132 hdd_err("WNI_CFG_LONG_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007133 return -EIO;
7134 }
7135
7136 wrqu->retry.value = retry;
7137 } else if ((wrqu->retry.flags & IW_RETRY_SHORT)) {
7138 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_SHORT;
7139
7140 if (sme_cfg_get_int(hHal, WNI_CFG_SHORT_RETRY_LIMIT, &retry) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307141 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007142 hdd_err("WNI_CFG_SHORT_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007143 return -EIO;
7144 }
7145
7146 wrqu->retry.value = retry;
7147 } else {
7148 return -EOPNOTSUPP;
7149 }
7150
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007151 hdd_debug("Retry-Limit=%d!!", retry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007152
7153 EXIT();
7154
7155 return 0;
7156}
7157
7158/**
7159 * iw_get_retry() - SSR wrapper for __iw_get_retry()
7160 * @dev: pointer to net_device
7161 * @info: pointer to iw_request_info
7162 * @wrqu: pointer to iwreq_data
7163 * @extra: pointer to extra ioctl payload
7164 *
7165 * Return: 0 on success, error number otherwise
7166 */
7167static int iw_get_retry(struct net_device *dev, struct iw_request_info *info,
7168 union iwreq_data *wrqu, char *extra)
7169{
7170 int ret;
7171
7172 cds_ssr_protect(__func__);
7173 ret = __iw_get_retry(dev, info, wrqu, extra);
7174 cds_ssr_unprotect(__func__);
7175
7176 return ret;
7177}
7178
7179/**
7180 * __iw_set_mlme() - SIOCSIWMLME ioctl handler
7181 * @dev: device upon which the ioctl was received
7182 * @info: ioctl request information
7183 * @wrqu: ioctl request data
7184 * @extra: ioctl extra data
7185 *
7186 * Return: 0 on success, non-zero on error
7187 */
7188static int __iw_set_mlme(struct net_device *dev,
7189 struct iw_request_info *info,
7190 union iwreq_data *wrqu, char *extra)
7191{
7192 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7193 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
7194 struct iw_mlme *mlme = (struct iw_mlme *)extra;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307195 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007196 hdd_context_t *hdd_ctx;
7197 int ret;
7198
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007199 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007200
7201 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7202 ret = wlan_hdd_validate_context(hdd_ctx);
7203 if (0 != ret)
7204 return ret;
7205
Jeff Johnson441e1f72017-02-07 08:50:49 -08007206 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7207 if (0 != ret)
7208 return ret;
7209
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007210 /* reason_code is unused. By default it is set to
7211 * eCSR_DISCONNECT_REASON_UNSPECIFIED
7212 */
7213 switch (mlme->cmd) {
7214 case IW_MLME_DISASSOC:
7215 case IW_MLME_DEAUTH:
7216
7217 if (pHddStaCtx->conn_info.connState ==
7218 eConnectionState_Associated) {
7219 eCsrRoamDisconnectReason reason =
7220 eCSR_DISCONNECT_REASON_UNSPECIFIED;
7221
7222 if (mlme->reason_code == HDD_REASON_MICHAEL_MIC_FAILURE)
7223 reason = eCSR_DISCONNECT_REASON_MIC_ERROR;
7224
7225 INIT_COMPLETION(pAdapter->disconnect_comp_var);
7226 status =
7227 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
7228 pAdapter->sessionId, reason);
7229
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307230 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007231 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007232
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007233 rc = wait_for_completion_timeout(&pAdapter->
7234 disconnect_comp_var,
7235 msecs_to_jiffies
7236 (WLAN_WAIT_TIME_DISCONNECT));
7237 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007238 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007239 } else
Jeff Johnson99bac312016-06-28 10:38:18 -07007240 hdd_err("%d Command Disassociate/Deauthenticate : csr_roam_disconnect failure returned %d",
7241 (int)mlme->cmd, (int)status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007242
7243 /* Resetting authKeyMgmt */
7244 (WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter))->authKeyMgmt =
7245 0;
7246
Jeff Johnson99bac312016-06-28 10:38:18 -07007247 hdd_notice("Disabling queues");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007248 wlan_hdd_netif_queue_control(pAdapter,
Himanshu Agarwal865201d2017-04-12 15:45:31 +05307249 WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007250 WLAN_CONTROL_PATH);
7251
7252 } else {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007253 hdd_warn("%d Command Disassociate/Deauthenticate called but station is not in associated state",
Jeff Johnson99bac312016-06-28 10:38:18 -07007254 (int)mlme->cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007255 }
7256 break;
7257 default:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007258 hdd_err("Unexpected cmd: %d", (int)mlme->cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007259 return -EINVAL;
7260 } /* end of switch */
7261
7262 EXIT();
7263
7264 return status;
7265
7266}
7267
7268/**
7269 * iw_set_mlme() - SSR wrapper for __iw_set_mlme()
7270 * @dev: pointer to net_device
7271 * @info: pointer to iw_request_info
7272 * @wrqu: pointer to iwreq_data
7273 * @extra: pointer to extra ioctl payload
7274 *
7275 * Return: 0 on success, error number otherwise
7276 */
7277static int iw_set_mlme(struct net_device *dev, struct iw_request_info *info,
7278 union iwreq_data *wrqu, char *extra)
7279{
7280 int ret;
7281
7282 cds_ssr_protect(__func__);
7283 ret = __iw_set_mlme(dev, info, wrqu, extra);
7284 cds_ssr_unprotect(__func__);
7285
7286 return ret;
7287}
7288
7289/**
7290 * wlan_hdd_update_phymode() - handle change in PHY mode
7291 * @net: device upon which PHY mode change was received
7292 * @hal: umac handle for the driver
7293 * @new_phymode: new PHY mode for the device
7294 * @phddctx: pointer to the HDD context
7295 *
7296 * This function is called when the device is set to a new PHY mode.
7297 * It takes a holistic look at the desired PHY mode along with the
7298 * configured capabilities of the driver and the reported capabilities
7299 * of the hardware in order to correctly configure all PHY-related
7300 * parameters.
7301 *
7302 * Return: 0 on success, negative errno value on error
7303 */
7304int wlan_hdd_update_phymode(struct net_device *net, tHalHandle hal,
7305 int new_phymode, hdd_context_t *phddctx)
7306{
7307#ifdef QCA_HT_2040_COEX
7308 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(net);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307309 QDF_STATUS halStatus = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007310#endif
7311 bool band_24 = false, band_5g = false;
7312 bool ch_bond24 = false, ch_bond5g = false;
7313 tSmeConfigParams smeconfig;
7314 uint32_t chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007315 uint32_t vhtchanwidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007316 eCsrPhyMode phymode = -EIO, old_phymode;
Srinivas Girigowda2fb677c2017-03-25 15:35:34 -07007317 enum hdd_dot11_mode hdd_dot11mode = phddctx->config->dot11Mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007318 eCsrBand curr_band = eCSR_BAND_ALL;
7319
7320 old_phymode = sme_get_phy_mode(hal);
7321
7322 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
7323 sme_get_cb_phy_state_from_cb_ini_value(phddctx->config->
7324 nChannelBondingMode24GHz))
7325 ch_bond24 = true;
7326
7327 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
7328 sme_get_cb_phy_state_from_cb_ini_value(phddctx->config->
7329 nChannelBondingMode5GHz))
7330 ch_bond5g = true;
7331
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007332 if (phddctx->config->nBandCapability == eCSR_BAND_ALL)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007333 band_24 = band_5g = true;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007334 else if (phddctx->config->nBandCapability == eCSR_BAND_24)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007335 band_24 = true;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007336 else if (phddctx->config->nBandCapability == eCSR_BAND_5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007337 band_5g = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338
7339 vhtchanwidth = phddctx->config->vhtChannelWidth;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007340 hdd_debug("ch_bond24=%d ch_bond5g=%d band_24=%d band_5g=%d VHT_ch_width=%u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007341 ch_bond24, ch_bond5g, band_24, band_5g, vhtchanwidth);
7342
7343 switch (new_phymode) {
7344 case IEEE80211_MODE_AUTO:
7345 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007346 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_AUTO) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007347 phymode = eCSR_DOT11_MODE_AUTO;
7348 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7349 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7350 curr_band = eCSR_BAND_ALL;
7351 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7352 } else {
7353 sme_set_phy_mode(hal, old_phymode);
7354 return -EIO;
7355 }
7356 break;
7357 case IEEE80211_MODE_11A:
7358 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11a);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007359 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007360 phymode = eCSR_DOT11_MODE_11a;
7361 hdd_dot11mode = eHDD_DOT11_MODE_11a;
7362 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7363 curr_band = eCSR_BAND_5G;
7364 } else {
7365 sme_set_phy_mode(hal, old_phymode);
7366 return -EIO;
7367 }
7368 break;
7369 case IEEE80211_MODE_11B:
7370 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11b);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007371 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007372 phymode = eCSR_DOT11_MODE_11b;
7373 hdd_dot11mode = eHDD_DOT11_MODE_11b;
7374 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7375 curr_band = eCSR_BAND_24;
7376 } else {
7377 sme_set_phy_mode(hal, old_phymode);
7378 return -EIO;
7379 }
7380 break;
7381 case IEEE80211_MODE_11G:
7382 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11g);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007383 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007384 phymode = eCSR_DOT11_MODE_11g;
7385 hdd_dot11mode = eHDD_DOT11_MODE_11g;
7386 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7387 curr_band = eCSR_BAND_24;
7388 } else {
7389 sme_set_phy_mode(hal, old_phymode);
7390 return -EIO;
7391 }
7392 break;
7393 /* UMAC doesnt have option to set MODE_11NA/MODE_11NG as phymode
7394 * so setting phymode as eCSR_DOT11_MODE_11n and updating the band
7395 * and channel bonding in configuration to reflect MODE_11NA/MODE_11NG
7396 */
7397 case IEEE80211_MODE_11NA_HT20:
7398 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007399 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007400 phymode = eCSR_DOT11_MODE_11n;
7401 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7402 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7403 curr_band = eCSR_BAND_5G;
7404 } else {
7405 sme_set_phy_mode(hal, old_phymode);
7406 return -EIO;
7407 }
7408 break;
7409 case IEEE80211_MODE_11NA_HT40:
7410 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007411 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007412 phymode = eCSR_DOT11_MODE_11n;
7413 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7414 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7415 curr_band = eCSR_BAND_5G;
7416 } else {
7417 sme_set_phy_mode(hal, old_phymode);
7418 return -EIO;
7419 }
7420 break;
7421 case IEEE80211_MODE_11NG_HT20:
7422 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007423 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007424 phymode = eCSR_DOT11_MODE_11n;
7425 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7426 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7427 curr_band = eCSR_BAND_24;
7428 } else {
7429 sme_set_phy_mode(hal, old_phymode);
7430 return -EIO;
7431 }
7432 break;
7433 case IEEE80211_MODE_11NG_HT40:
7434 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007435 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007436 phymode = eCSR_DOT11_MODE_11n;
7437 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7438 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7439 curr_band = eCSR_BAND_24;
7440 } else {
7441 sme_set_phy_mode(hal, old_phymode);
7442 return -EIO;
7443 }
7444 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007445 case IEEE80211_MODE_11AC_VHT20:
7446 case IEEE80211_MODE_11AC_VHT40:
7447 case IEEE80211_MODE_11AC_VHT80:
7448 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11ac);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007449 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007450 phymode = eCSR_DOT11_MODE_11ac;
7451 hdd_dot11mode = eHDD_DOT11_MODE_11ac;
7452 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7453 curr_band = eCSR_BAND_5G;
7454 } else {
7455 sme_set_phy_mode(hal, old_phymode);
7456 return -EIO;
7457 }
7458 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007459 case IEEE80211_MODE_2G_AUTO:
7460 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007461 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007462 phymode = eCSR_DOT11_MODE_AUTO;
7463 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7464 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7465 curr_band = eCSR_BAND_24;
7466 } else {
7467 sme_set_phy_mode(hal, old_phymode);
7468 return -EIO;
7469 }
7470 break;
7471 case IEEE80211_MODE_5G_AUTO:
7472 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007473 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007474 phymode = eCSR_DOT11_MODE_AUTO;
7475 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7476 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7477 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7478 curr_band = eCSR_BAND_5G;
7479 } else {
7480 sme_set_phy_mode(hal, old_phymode);
7481 return -EIO;
7482 }
7483 break;
7484 case IEEE80211_MODE_11AGN:
7485 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007486 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_AUTO) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007487 phymode = eCSR_DOT11_MODE_11n;
7488 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7489 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7490 curr_band = eCSR_BAND_ALL;
7491 } else {
7492 sme_set_phy_mode(hal, old_phymode);
7493 return -EIO;
7494 }
7495 break;
7496 default:
7497 return -EIO;
7498 }
7499
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007500 switch (new_phymode) {
7501 case IEEE80211_MODE_11AC_VHT20:
7502 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7503 vhtchanwidth = eHT_CHANNEL_WIDTH_20MHZ;
7504 break;
7505 case IEEE80211_MODE_11AC_VHT40:
7506 vhtchanwidth = eHT_CHANNEL_WIDTH_40MHZ;
7507 break;
7508 case IEEE80211_MODE_11AC_VHT80:
7509 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7510 break;
7511 default:
7512 vhtchanwidth = phddctx->config->vhtChannelWidth;
7513 break;
7514 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007515
7516 if (phymode != -EIO) {
7517 sme_get_config_param(hal, &smeconfig);
7518 smeconfig.csrConfig.phyMode = phymode;
7519#ifdef QCA_HT_2040_COEX
7520 if (phymode == eCSR_DOT11_MODE_11n &&
7521 chwidth == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
7522 smeconfig.csrConfig.obssEnabled = false;
7523 halStatus = sme_set_ht2040_mode(hal,
7524 pAdapter->sessionId,
7525 eHT_CHAN_HT20, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307526 if (halStatus == QDF_STATUS_E_FAILURE) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007527 hdd_err("Failed to disable OBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007528 return -EIO;
7529 }
7530 } else if (phymode == eCSR_DOT11_MODE_11n &&
7531 chwidth == WNI_CFG_CHANNEL_BONDING_MODE_ENABLE) {
7532 smeconfig.csrConfig.obssEnabled = true;
7533 halStatus = sme_set_ht2040_mode(hal,
7534 pAdapter->sessionId,
7535 eHT_CHAN_HT20, true);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307536 if (halStatus == QDF_STATUS_E_FAILURE) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007537 hdd_err("Failed to enable OBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007538 return -EIO;
7539 }
7540 }
7541#endif
7542 smeconfig.csrConfig.eBand = curr_band;
7543 smeconfig.csrConfig.bandCapability = curr_band;
7544 if (curr_band == eCSR_BAND_24)
7545 smeconfig.csrConfig.Is11hSupportEnabled = 0;
7546 else
7547 smeconfig.csrConfig.Is11hSupportEnabled =
7548 phddctx->config->Is11hSupportEnabled;
7549 if (curr_band == eCSR_BAND_24)
7550 smeconfig.csrConfig.channelBondingMode24GHz = chwidth;
7551 else if (curr_band == eCSR_BAND_24)
7552 smeconfig.csrConfig.channelBondingMode5GHz = chwidth;
7553 else {
7554 smeconfig.csrConfig.channelBondingMode24GHz = chwidth;
7555 smeconfig.csrConfig.channelBondingMode5GHz = chwidth;
7556 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007557 smeconfig.csrConfig.nVhtChannelWidth = vhtchanwidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007558 sme_update_config(hal, &smeconfig);
7559
7560 phddctx->config->dot11Mode = hdd_dot11mode;
7561 phddctx->config->nBandCapability = curr_band;
7562 phddctx->config->nChannelBondingMode24GHz =
7563 smeconfig.csrConfig.channelBondingMode24GHz;
7564 phddctx->config->nChannelBondingMode5GHz =
7565 smeconfig.csrConfig.channelBondingMode5GHz;
7566 phddctx->config->vhtChannelWidth = vhtchanwidth;
Krunal Sonidf0f8742016-09-26 14:56:31 -07007567 if (hdd_update_config_cfg(phddctx) == false) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007568 hdd_err("could not update config_dat");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007569 return -EIO;
7570 }
7571 if (phddctx->config->nChannelBondingMode5GHz)
Srinivas Girigowda11c28e02017-06-27 20:06:21 -07007572 phddctx->wiphy->bands[HDD_NL80211_BAND_5GHZ]->ht_cap.cap
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007573 |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7574 else
Srinivas Girigowda11c28e02017-06-27 20:06:21 -07007575 phddctx->wiphy->bands[HDD_NL80211_BAND_5GHZ]->ht_cap.cap
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007576 &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7577
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007578 hdd_debug("New_Phymode= %d ch_bonding=%d band=%d VHT_ch_width=%u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007579 phymode, chwidth, curr_band, vhtchanwidth);
7580 }
7581
7582 return 0;
7583}
7584
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007585struct temperature_priv {
7586 int temperature;
7587};
7588
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007589/**
7590 * hdd_get_temperature_cb() - "Get Temperature" callback function
7591 * @temperature: measured temperature
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007592 * @context: callback context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007593 *
7594 * This function is passed to sme_get_temperature() as the callback
7595 * function to be invoked when the temperature measurement is
7596 * available.
7597 *
7598 * Return: None
7599 */
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007600static void hdd_get_temperature_cb(int temperature, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007601{
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007602 struct hdd_request *request;
7603 struct temperature_priv *priv;
7604
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007605 ENTER();
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007606
7607 request = hdd_request_get(context);
7608 if (!request) {
7609 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007610 return;
7611 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007612
7613 priv = hdd_request_priv(request);
7614 priv->temperature = temperature;
7615 hdd_request_complete(request);
7616 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007617 EXIT();
7618}
7619
7620/**
7621 * wlan_hdd_get_temperature() - get current device temperature
7622 * @pAdapter: device upon which the request was made
7623 * @temperature: pointer to where the temperature is to be returned
7624 *
7625 * Return: 0 if a temperature value (either current or cached) was
7626 * returned, otherwise a negative errno is returned.
7627 *
7628 */
7629int wlan_hdd_get_temperature(hdd_adapter_t *pAdapter, int *temperature)
7630{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307631 QDF_STATUS status;
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007632 int ret;
7633 void *cookie;
7634 struct hdd_request *request;
7635 struct temperature_priv *priv;
7636 static const struct hdd_request_params params = {
7637 .priv_size = sizeof(*priv),
7638 .timeout_ms = WLAN_WAIT_TIME_STATS,
7639 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007640
7641 ENTER();
7642 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007643 hdd_err("pAdapter is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007644 return -EPERM;
7645 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007646
7647 request = hdd_request_alloc(&params);
7648 if (!request) {
7649 hdd_err("Request allocation failure");
7650 return -ENOMEM;
7651 }
7652 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007653 status = sme_get_temperature(WLAN_HDD_GET_HAL_CTX(pAdapter),
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007654 cookie, hdd_get_temperature_cb);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307655 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007656 hdd_err("Unable to retrieve temperature");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007657 } else {
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007658 ret = hdd_request_wait_for_response(request);
7659 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007660 hdd_err("SME timed out while retrieving temperature");
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007661 } else {
7662 /* update the adapter with the fresh results */
7663 priv = hdd_request_priv(request);
7664 if (priv->temperature)
7665 pAdapter->temperature = priv->temperature;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007666 }
7667 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007668
7669 /*
7670 * either we never sent a request, we sent a request and
7671 * received a response or we sent a request and timed out.
7672 * regardless we are done with the request.
7673 */
7674 hdd_request_put(request);
7675
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007676 *temperature = pAdapter->temperature;
7677 EXIT();
7678 return 0;
7679}
7680
7681/**
7682 * iw_setint_getnone() - Generic "set integer" private ioctl handler
7683 * @dev: device upon which the ioctl was received
7684 * @info: ioctl request information
7685 * @wrqu: ioctl request data
7686 * @extra: ioctl extra data
7687 *
7688 * Return: 0 on success, non-zero on error
7689 */
7690static int __iw_setint_getnone(struct net_device *dev,
7691 struct iw_request_info *info,
7692 union iwreq_data *wrqu, char *extra)
7693{
7694 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7695 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7696 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007697 hdd_context_t *hdd_ctx;
7698 tSmeConfigParams smeConfig;
7699 int *value = (int *)extra;
7700 int sub_cmd = value[0];
7701 int set_value = value[1];
7702 int ret;
7703 int enable_pbm, enable_mp;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307704 QDF_STATUS status;
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08007705 void *soc = NULL;
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08007706 struct cdp_pdev *pdev = NULL;
7707 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007708
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08007709 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05307710
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007711 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7712 ret = wlan_hdd_validate_context(hdd_ctx);
7713 if (0 != ret)
7714 return ret;
7715
Jeff Johnson441e1f72017-02-07 08:50:49 -08007716 ret = hdd_check_private_wext_control(hdd_ctx, info);
7717 if (0 != ret)
7718 return ret;
7719
Jeff Johnson441e1f72017-02-07 08:50:49 -08007720 memset(&smeConfig, 0x00, sizeof(smeConfig));
7721
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007722 switch (sub_cmd) {
7723 case WE_SET_11D_STATE:
7724 {
7725 if ((ENABLE_11D == set_value)
7726 || (DISABLE_11D == set_value)) {
7727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007728 sme_get_config_param(hHal, &smeConfig);
7729 smeConfig.csrConfig.Is11dSupportEnabled =
7730 (bool) set_value;
7731
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007732 hdd_debug("11D state=%d!!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007733 smeConfig.csrConfig.
7734 Is11dSupportEnabled);
7735
7736 sme_update_config(hHal, &smeConfig);
7737 } else {
7738 return -EINVAL;
7739 }
7740 break;
7741 }
7742
7743 case WE_WOWL:
7744 {
7745 switch (set_value) {
7746 case 0x00:
7747 hdd_exit_wowl(pAdapter);
7748 break;
7749 case 0x01:
7750 case 0x02:
7751 case 0x03:
7752 enable_mp = (set_value & 0x01) ? 1 : 0;
7753 enable_pbm = (set_value & 0x02) ? 1 : 0;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007754 hdd_debug("magic packet ? = %s pattern byte matching ? = %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007755 (enable_mp ? "YES" : "NO"),
7756 (enable_pbm ? "YES" : "NO"));
7757 hdd_enter_wowl(pAdapter, enable_mp, enable_pbm);
7758 break;
7759 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07007760 hdd_err("Invalid arg %d in WE_WOWL IOCTL",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007761 set_value);
7762 ret = -EINVAL;
7763 break;
7764 }
7765
7766 break;
7767 }
7768 case WE_SET_POWER:
7769 {
7770 switch (set_value) {
7771 case 1:
7772 /* Enable PowerSave */
7773 sme_ps_enable_disable(hHal, pAdapter->sessionId,
7774 SME_PS_ENABLE);
7775 break;
7776 case 2:
7777 /* Disable PowerSave */
7778 sme_ps_enable_disable(hHal, pAdapter->sessionId,
7779 SME_PS_DISABLE);
7780 break;
7781 case 3: /* Enable UASPD */
7782 sme_ps_uapsd_enable(hHal, pAdapter->sessionId);
7783 break;
7784 case 4: /* Disable UASPD */
7785 sme_ps_uapsd_disable(hHal, pAdapter->sessionId);
7786 break;
7787 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07007788 hdd_err("Invalid arg %d in WE_SET_POWER IOCTL",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007789 set_value);
7790 ret = -EINVAL;
7791 break;
7792 }
7793 break;
7794 }
7795
7796 case WE_SET_MAX_ASSOC:
7797 {
7798 if ((WNI_CFG_ASSOC_STA_LIMIT_STAMIN > set_value) ||
7799 (WNI_CFG_ASSOC_STA_LIMIT_STAMAX < set_value)) {
7800 ret = -EINVAL;
7801 } else if (sme_cfg_set_int(hHal, WNI_CFG_ASSOC_STA_LIMIT,
7802 set_value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307803 != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007804 hdd_err("WNI_CFG_ASSOC_STA_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007805 ret = -EIO;
7806 }
7807 break;
7808 }
7809
7810 case WE_SET_SAP_AUTO_CHANNEL_SELECTION:
7811 if (set_value == 0 || set_value == 1)
7812 (WLAN_HDD_GET_CTX(pAdapter))->config->force_sap_acs =
7813 set_value;
7814 else
7815 ret = -EINVAL;
7816 break;
7817
7818 case WE_SET_DATA_INACTIVITY_TO:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007819 if ((set_value < CFG_DATA_INACTIVITY_TIMEOUT_MIN) ||
7820 (set_value > CFG_DATA_INACTIVITY_TIMEOUT_MAX) ||
7821 (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
7822 WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307823 set_value) == QDF_STATUS_E_FAILURE)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007824 hdd_err("WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007825 ret = -EINVAL;
7826 }
7827 break;
Mukul Sharmaed92f2f2017-04-20 00:06:28 +05307828 case WE_SET_WOW_DATA_INACTIVITY_TO:
7829 if (!hHal)
7830 return -EINVAL;
7831
7832 if ((set_value < CFG_WOW_DATA_INACTIVITY_TIMEOUT_MIN) ||
7833 (set_value > CFG_WOW_DATA_INACTIVITY_TIMEOUT_MAX) ||
7834 (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
7835 WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
7836 set_value) == QDF_STATUS_E_FAILURE)) {
7837 hdd_err("WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT fail");
7838 ret = -EINVAL;
7839 }
7840 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007841 case WE_SET_MC_RATE:
7842 {
7843 ret = wlan_hdd_set_mc_rate(pAdapter, set_value);
7844 break;
7845 }
7846 case WE_SET_TX_POWER:
7847 {
Anurag Chouhan6d760662016-02-20 16:05:43 +05307848 struct qdf_mac_addr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007849
Anurag Chouhanc5548422016-02-24 18:33:27 +05307850 qdf_copy_macaddr(&bssid, &pHddStaCtx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007851 if (sme_set_tx_power
7852 (hHal, pAdapter->sessionId, bssid,
7853 pAdapter->device_mode,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307854 set_value) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007855 hdd_err("Setting tx power failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007856 return -EIO;
7857 }
7858 break;
7859 }
7860 case WE_SET_MAX_TX_POWER:
7861 {
Anurag Chouhan6d760662016-02-20 16:05:43 +05307862 struct qdf_mac_addr bssid;
7863 struct qdf_mac_addr selfMac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007864
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007865
7866 hdd_debug("Setting maximum tx power %d dBm",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007867 set_value);
Anurag Chouhanc5548422016-02-24 18:33:27 +05307868 qdf_copy_macaddr(&bssid, &pHddStaCtx->conn_info.bssId);
7869 qdf_copy_macaddr(&selfMac, &pHddStaCtx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007870
7871 if (sme_set_max_tx_power(hHal, bssid, selfMac, set_value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307872 != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007873 hdd_err("Setting maximum tx power failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007874 return -EIO;
7875 }
7876
7877 break;
7878 }
7879 case WE_SET_MAX_TX_POWER_2_4:
7880 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007881 hdd_debug("Setting maximum tx power %d dBm for 2.4 GHz band",
Jeff Johnson99bac312016-06-28 10:38:18 -07007882 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007883 if (sme_set_max_tx_power_per_band(eCSR_BAND_24, set_value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307884 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007885 hdd_err("Setting max tx power failed for 2.4 GHz band");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007886 return -EIO;
7887 }
7888
7889 break;
7890 }
7891 case WE_SET_MAX_TX_POWER_5_0:
7892 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007893 hdd_debug("Setting maximum tx power %d dBm for 5.0 GHz band",
Jeff Johnson99bac312016-06-28 10:38:18 -07007894 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007895 if (sme_set_max_tx_power_per_band(eCSR_BAND_5G, set_value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307896 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007897 hdd_err("Setting max tx power failed for 5.0 GHz band");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007898 return -EIO;
7899 }
7900
7901 break;
7902 }
7903 case WE_SET_HIGHER_DTIM_TRANSITION:
7904 {
7905 if (!((set_value == false) || (set_value == true))) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007906 hdd_err("Dynamic DTIM Incorrect data:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007907 set_value);
7908 ret = -EINVAL;
7909 } else {
7910 if (pAdapter->higherDtimTransition != set_value) {
7911 pAdapter->higherDtimTransition =
7912 set_value;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007913 hdd_debug("higherDtimTransition set to :%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007914 pAdapter->higherDtimTransition);
7915 }
7916 }
7917
7918 break;
7919 }
7920
7921 case WE_SET_TM_LEVEL:
7922 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007923 hdd_debug("Set Thermal Mitigation Level %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007924 (void)sme_set_thermal_level(hHal, set_value);
7925 break;
7926 }
7927
7928 case WE_SET_PHYMODE:
7929 {
7930 hdd_context_t *phddctx = WLAN_HDD_GET_CTX(pAdapter);
7931
7932 ret =
7933 wlan_hdd_update_phymode(dev, hHal, set_value,
7934 phddctx);
7935 break;
7936 }
7937
7938 case WE_SET_NSS:
7939 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007940 hdd_debug("Set NSS = %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007941 if ((set_value > 2) || (set_value <= 0)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007942 hdd_err("NSS greater than 2 not supported");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007943 ret = -EINVAL;
7944 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307945 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007946 hdd_update_nss(WLAN_HDD_GET_CTX(pAdapter),
7947 set_value))
7948 ret = -EINVAL;
7949 }
7950 break;
7951 }
7952
7953 case WE_SET_GTX_HT_MCS:
7954 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007955 hdd_debug("WMI_VDEV_PARAM_GTX_HT_MCS %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007956 ret = wma_cli_set_command(pAdapter->sessionId,
7957 WMI_VDEV_PARAM_GTX_HT_MCS,
7958 set_value, GTX_CMD);
7959 break;
7960 }
7961
7962 case WE_SET_GTX_VHT_MCS:
7963 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007964 hdd_debug("WMI_VDEV_PARAM_GTX_VHT_MCS %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007965 set_value);
7966 ret = wma_cli_set_command(pAdapter->sessionId,
7967 WMI_VDEV_PARAM_GTX_VHT_MCS,
7968 set_value, GTX_CMD);
7969 break;
7970 }
7971
7972 case WE_SET_GTX_USRCFG:
7973 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007974 hdd_debug("WMI_VDEV_PARAM_GTX_USR_CFG %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007975 set_value);
7976 ret = wma_cli_set_command(pAdapter->sessionId,
7977 WMI_VDEV_PARAM_GTX_USR_CFG,
7978 set_value, GTX_CMD);
7979 break;
7980 }
7981
7982 case WE_SET_GTX_THRE:
7983 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007984 hdd_debug("WMI_VDEV_PARAM_GTX_THRE %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007985 ret = wma_cli_set_command(pAdapter->sessionId,
7986 WMI_VDEV_PARAM_GTX_THRE,
7987 set_value, GTX_CMD);
7988 break;
7989 }
7990
7991 case WE_SET_GTX_MARGIN:
7992 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007993 hdd_debug("WMI_VDEV_PARAM_GTX_MARGIN %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007994 ret = wma_cli_set_command(pAdapter->sessionId,
7995 WMI_VDEV_PARAM_GTX_MARGIN,
7996 set_value, GTX_CMD);
7997 break;
7998 }
7999
8000 case WE_SET_GTX_STEP:
8001 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008002 hdd_debug("WMI_VDEV_PARAM_GTX_STEP %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008003 ret = wma_cli_set_command(pAdapter->sessionId,
8004 WMI_VDEV_PARAM_GTX_STEP,
8005 set_value, GTX_CMD);
8006 break;
8007 }
8008
8009 case WE_SET_GTX_MINTPC:
8010 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008011 hdd_debug("WMI_VDEV_PARAM_GTX_MINTPC %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008012 ret = wma_cli_set_command(pAdapter->sessionId,
8013 WMI_VDEV_PARAM_GTX_MINTPC,
8014 set_value, GTX_CMD);
8015 break;
8016 }
8017
8018 case WE_SET_GTX_BWMASK:
8019 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008020 hdd_debug("WMI_VDEV_PARAM_GTX_BWMASK %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008021 ret = wma_cli_set_command(pAdapter->sessionId,
8022 WMI_VDEV_PARAM_GTX_BW_MASK,
8023 set_value, GTX_CMD);
8024 break;
8025 }
8026
8027 case WE_SET_LDPC:
8028 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308029 ret = hdd_set_ldpc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008030 break;
8031 }
8032
8033 case WE_SET_TX_STBC:
8034 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308035 ret = hdd_set_tx_stbc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008036 break;
8037 }
8038
8039 case WE_SET_RX_STBC:
8040 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308041 ret = hdd_set_rx_stbc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008042 break;
8043 }
8044
8045 case WE_SET_SHORT_GI:
8046 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008047 hdd_debug("WMI_VDEV_PARAM_SGI val %d", set_value);
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008048 /*
8049 * wma_cli_set_command should be called instead of
8050 * sme_update_ht_config since SGI is used for HT/HE.
8051 * This should be refactored.
8052 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008053 ret = sme_update_ht_config(hHal, pAdapter->sessionId,
8054 WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ,
8055 set_value);
8056 if (ret)
Jeff Johnson99bac312016-06-28 10:38:18 -07008057 hdd_err("Failed to set ShortGI value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008058 break;
8059 }
8060
8061 case WE_SET_RTSCTS:
8062 {
8063 uint32_t value;
8064
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008065 hdd_debug("WMI_VDEV_PARAM_ENABLE_RTSCTS val 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008066 set_value);
8067
8068 if ((set_value & HDD_RTSCTS_EN_MASK) ==
8069 HDD_RTSCTS_ENABLE)
8070 value =
8071 (WLAN_HDD_GET_CTX(pAdapter))->config->
8072 RTSThreshold;
8073 else if (((set_value & HDD_RTSCTS_EN_MASK) == 0)
8074 || ((set_value & HDD_RTSCTS_EN_MASK) ==
8075 HDD_CTS_ENABLE))
8076 value = WNI_CFG_RTS_THRESHOLD_STAMAX;
8077 else
8078 return -EIO;
8079
8080 ret = wma_cli_set_command(pAdapter->sessionId,
8081 WMI_VDEV_PARAM_ENABLE_RTSCTS,
8082 set_value, VDEV_CMD);
8083 if (!ret) {
8084 if (sme_cfg_set_int
8085 (hHal, WNI_CFG_RTS_THRESHOLD, value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308086 QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008087 hdd_err("FAILED TO SET RTSCTS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008088 return -EIO;
8089 }
8090 }
8091
8092 break;
8093 }
8094
8095 case WE_SET_CHWIDTH:
8096 {
8097 bool chwidth = false;
8098 hdd_context_t *phddctx = WLAN_HDD_GET_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008099
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008100 /*updating channel bonding only on 5Ghz */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008101 hdd_debug("WMI_VDEV_PARAM_CHWIDTH val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008102 set_value);
8103 if (set_value > eHT_CHANNEL_WIDTH_80MHZ) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008104 hdd_err("Invalid channel width 0->20 1->40 2->80");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008105 return -EINVAL;
8106 }
8107
8108 if ((WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
8109 csr_convert_cb_ini_value_to_phy_cb_state(phddctx->config->
8110 nChannelBondingMode5GHz)))
8111 chwidth = true;
8112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008113 sme_get_config_param(hHal, &smeConfig);
8114 switch (set_value) {
8115 case eHT_CHANNEL_WIDTH_20MHZ:
8116 smeConfig.csrConfig.channelBondingMode5GHz =
8117 WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
8118 break;
8119 case eHT_CHANNEL_WIDTH_40MHZ:
8120 if (chwidth)
8121 smeConfig.csrConfig.
8122 channelBondingMode5GHz =
8123 phddctx->config->
8124 nChannelBondingMode5GHz;
8125 else
8126 return -EINVAL;
8127
8128 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008129 case eHT_CHANNEL_WIDTH_80MHZ:
8130 if (chwidth)
8131 smeConfig.csrConfig.
8132 channelBondingMode5GHz =
8133 phddctx->config->
8134 nChannelBondingMode5GHz;
8135 else
8136 return -EINVAL;
8137
8138 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008139
8140 default:
8141 return -EINVAL;
8142 }
8143
8144 ret = wma_cli_set_command(pAdapter->sessionId,
8145 WMI_VDEV_PARAM_CHWIDTH,
8146 set_value, VDEV_CMD);
8147 if (!ret)
8148 sme_update_config(hHal, &smeConfig);
8149
8150 break;
8151 }
8152
8153 case WE_SET_ANI_EN_DIS:
8154 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008155 hdd_debug("WMI_PDEV_PARAM_ANI_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008156 set_value);
8157 ret = wma_cli_set_command(pAdapter->sessionId,
8158 WMI_PDEV_PARAM_ANI_ENABLE,
8159 set_value, PDEV_CMD);
8160 break;
8161 }
8162
8163 case WE_SET_ANI_POLL_PERIOD:
8164 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008165 hdd_debug("WMI_PDEV_PARAM_ANI_POLL_PERIOD val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008166 set_value);
8167 ret = wma_cli_set_command(pAdapter->sessionId,
8168 WMI_PDEV_PARAM_ANI_POLL_PERIOD,
8169 set_value, PDEV_CMD);
8170 break;
8171 }
8172
8173 case WE_SET_ANI_LISTEN_PERIOD:
8174 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008175 hdd_debug("WMI_PDEV_PARAM_ANI_LISTEN_PERIOD val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008176 set_value);
8177 ret = wma_cli_set_command(pAdapter->sessionId,
8178 WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
8179 set_value, PDEV_CMD);
8180 break;
8181 }
8182
8183 case WE_SET_ANI_OFDM_LEVEL:
8184 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008185 hdd_debug("WMI_PDEV_PARAM_ANI_OFDM_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008186 set_value);
8187 ret = wma_cli_set_command(pAdapter->sessionId,
8188 WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
8189 set_value, PDEV_CMD);
8190 break;
8191 }
8192
8193 case WE_SET_ANI_CCK_LEVEL:
8194 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008195 hdd_debug("WMI_PDEV_PARAM_ANI_CCK_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008196 set_value);
8197 ret = wma_cli_set_command(pAdapter->sessionId,
8198 WMI_PDEV_PARAM_ANI_CCK_LEVEL,
8199 set_value, PDEV_CMD);
8200 break;
8201 }
8202
8203 case WE_SET_DYNAMIC_BW:
8204 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008205 hdd_debug("WMI_PDEV_PARAM_DYNAMIC_BW val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008206 set_value);
8207 ret = wma_cli_set_command(pAdapter->sessionId,
8208 WMI_PDEV_PARAM_DYNAMIC_BW,
8209 set_value, PDEV_CMD);
8210 break;
8211 }
8212
8213 case WE_SET_CTS_CBW:
8214 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008215 hdd_debug("WE_SET_CTS_CBW val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008216 ret = wma_cli_set_command(pAdapter->sessionId,
8217 WMI_PDEV_PARAM_CTS_CBW,
8218 set_value, PDEV_CMD);
8219 break;
8220 }
8221
8222 case WE_SET_11N_RATE:
8223 {
8224 uint8_t preamble = 0, nss = 0, rix = 0;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008225
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008226 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008227 set_value);
8228
8229 if (set_value != 0xff) {
8230 rix = RC_2_RATE_IDX(set_value);
8231 if (set_value & 0x80) {
8232 preamble = WMI_RATE_PREAMBLE_HT;
8233 nss = HT_RC_2_STREAMS(set_value) - 1;
8234 } else {
8235 nss = 0;
8236 rix = RC_2_RATE_IDX(set_value);
8237 if (set_value & 0x10) {
8238 preamble =
8239 WMI_RATE_PREAMBLE_CCK;
8240 if (rix != 0x3)
8241 /* Enable Short
8242 * preamble always for
8243 * CCK except 1mbps
8244 */
8245 rix |= 0x4;
8246 } else {
8247 preamble =
8248 WMI_RATE_PREAMBLE_OFDM;
8249 }
8250 }
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008251 set_value = hdd_assemble_rate_code(preamble, nss, rix);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008252 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008253 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008254 set_value, rix, preamble, nss);
8255
8256 ret = wma_cli_set_command(pAdapter->sessionId,
8257 WMI_VDEV_PARAM_FIXED_RATE,
8258 set_value, VDEV_CMD);
8259 break;
8260 }
8261
8262 case WE_SET_VHT_RATE:
8263 {
8264 uint8_t preamble = 0, nss = 0, rix = 0;
8265
8266 if (set_value != 0xff) {
8267 rix = RC_2_RATE_IDX_11AC(set_value);
8268 preamble = WMI_RATE_PREAMBLE_VHT;
8269 nss = HT_RC_2_STREAMS_11AC(set_value) - 1;
8270
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008271 set_value = hdd_assemble_rate_code(preamble, nss, rix);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008272 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008273 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008274 set_value, rix, preamble, nss);
8275 ret = wma_cli_set_command(pAdapter->sessionId,
8276 WMI_VDEV_PARAM_FIXED_RATE,
8277 set_value, VDEV_CMD);
8278 break;
8279 }
8280
8281 case WE_SET_AMPDU:
8282 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008283 hdd_debug("SET AMPDU val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008284 ret = wma_cli_set_command(pAdapter->sessionId,
8285 GEN_VDEV_PARAM_AMPDU,
8286 set_value, GEN_CMD);
8287 break;
8288 }
8289
8290 case WE_SET_AMSDU:
8291 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008292 hdd_debug("SET AMSDU val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008293 ret = wma_cli_set_command(pAdapter->sessionId,
8294 GEN_VDEV_PARAM_AMSDU,
8295 set_value, GEN_CMD);
Deepak Dhamdhere612392c2016-08-28 02:56:51 -07008296 /* Update the stored ini value */
8297 if (!ret)
8298 hdd_ctx->config->max_amsdu_num = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008299 break;
8300 }
8301
8302 case WE_SET_BURST_ENABLE:
8303 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008304 hdd_debug("SET Burst enable val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008305 if ((set_value == 0) || (set_value == 1)) {
8306 ret = wma_cli_set_command(pAdapter->sessionId,
8307 WMI_PDEV_PARAM_BURST_ENABLE,
8308 set_value, PDEV_CMD);
8309 } else
8310 ret = -EINVAL;
8311 break;
8312 }
8313 case WE_SET_BURST_DUR:
8314 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008315 hdd_debug("SET Burst duration val %d", set_value);
Jeff Johnsonda5ee772016-08-04 17:18:47 -07008316 if ((set_value > 0) && (set_value <= 102400))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008317 ret = wma_cli_set_command(pAdapter->sessionId,
8318 WMI_PDEV_PARAM_BURST_DUR,
8319 set_value, PDEV_CMD);
8320 else
8321 ret = -EINVAL;
8322 break;
8323 }
8324
8325 case WE_SET_TX_CHAINMASK:
8326 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008327 hdd_debug("WMI_PDEV_PARAM_TX_CHAIN_MASK val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008328 set_value);
8329 ret = wma_cli_set_command(pAdapter->sessionId,
8330 WMI_PDEV_PARAM_TX_CHAIN_MASK,
8331 set_value, PDEV_CMD);
8332 break;
8333 }
8334
8335 case WE_SET_RX_CHAINMASK:
8336 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008337 hdd_debug("WMI_PDEV_PARAM_RX_CHAIN_MASK val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008338 set_value);
8339 ret = wma_cli_set_command(pAdapter->sessionId,
8340 WMI_PDEV_PARAM_RX_CHAIN_MASK,
8341 set_value, PDEV_CMD);
8342 break;
8343 }
8344
8345 case WE_SET_TXPOW_2G:
8346 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008347 hdd_debug("WMI_PDEV_PARAM_TXPOWER_LIMIT2G val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008348 set_value);
8349 ret = wma_cli_set_command(pAdapter->sessionId,
8350 WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
8351 set_value, PDEV_CMD);
8352 break;
8353 }
8354
8355 case WE_SET_TXPOW_5G:
8356 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008357 hdd_debug("WMI_PDEV_PARAM_TXPOWER_LIMIT5G val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008358 set_value);
8359 ret = wma_cli_set_command(pAdapter->sessionId,
8360 WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
8361 set_value, PDEV_CMD);
8362 break;
8363 }
8364
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008365 /* Firmware debug log */
8366 case WE_DBGLOG_LOG_LEVEL:
8367 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008368 hdd_debug("WE_DBGLOG_LOG_LEVEL val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008369 hdd_ctx->fw_log_settings.dl_loglevel = set_value;
8370 ret = wma_cli_set_command(pAdapter->sessionId,
8371 WMI_DBGLOG_LOG_LEVEL,
8372 set_value, DBG_CMD);
8373 break;
8374 }
8375
8376 case WE_DBGLOG_VAP_ENABLE:
8377 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008378 hdd_debug("WE_DBGLOG_VAP_ENABLE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008379 ret = wma_cli_set_command(pAdapter->sessionId,
8380 WMI_DBGLOG_VAP_ENABLE,
8381 set_value, DBG_CMD);
8382 break;
8383 }
8384
8385 case WE_DBGLOG_VAP_DISABLE:
8386 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008387 hdd_debug("WE_DBGLOG_VAP_DISABLE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008388 ret = wma_cli_set_command(pAdapter->sessionId,
8389 WMI_DBGLOG_VAP_DISABLE,
8390 set_value, DBG_CMD);
8391 break;
8392 }
8393
8394 case WE_DBGLOG_MODULE_ENABLE:
8395 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008396 hdd_debug("WE_DBGLOG_MODULE_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008397 set_value);
8398 hdd_ctx->fw_log_settings.enable = set_value;
8399 ret = wma_cli_set_command(pAdapter->sessionId,
8400 WMI_DBGLOG_MODULE_ENABLE,
8401 set_value, DBG_CMD);
8402 break;
8403 }
8404
8405 case WE_DBGLOG_MODULE_DISABLE:
8406 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008407 hdd_debug("WE_DBGLOG_MODULE_DISABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008408 set_value);
8409 hdd_ctx->fw_log_settings.enable = set_value;
8410 ret = wma_cli_set_command(pAdapter->sessionId,
8411 WMI_DBGLOG_MODULE_DISABLE,
8412 set_value, DBG_CMD);
8413 break;
8414 }
8415 case WE_DBGLOG_MOD_LOG_LEVEL:
8416 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008417 hdd_debug("WE_DBGLOG_MOD_LOG_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008418 set_value);
8419
8420 if (hdd_ctx->fw_log_settings.index >= MAX_MOD_LOGLEVEL)
8421 hdd_ctx->fw_log_settings.index = 0;
8422
8423 hdd_ctx->fw_log_settings.
8424 dl_mod_loglevel[hdd_ctx->fw_log_settings.index] =
8425 set_value;
8426 hdd_ctx->fw_log_settings.index++;
8427
8428 ret = wma_cli_set_command(pAdapter->sessionId,
8429 WMI_DBGLOG_MOD_LOG_LEVEL,
8430 set_value, DBG_CMD);
8431 break;
8432 }
8433
8434 case WE_DBGLOG_TYPE:
8435 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008436 hdd_debug("WE_DBGLOG_TYPE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008437 hdd_ctx->fw_log_settings.dl_type = set_value;
8438 ret = wma_cli_set_command(pAdapter->sessionId,
8439 WMI_DBGLOG_TYPE,
8440 set_value, DBG_CMD);
8441 break;
8442 }
8443 case WE_DBGLOG_REPORT_ENABLE:
8444 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008445 hdd_debug("WE_DBGLOG_REPORT_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008446 set_value);
8447 hdd_ctx->fw_log_settings.dl_report = set_value;
8448 ret = wma_cli_set_command(pAdapter->sessionId,
8449 WMI_DBGLOG_REPORT_ENABLE,
8450 set_value, DBG_CMD);
8451 break;
8452 }
8453
8454 case WE_SET_TXRX_FWSTATS:
8455 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008456 hdd_debug("WE_SET_TXRX_FWSTATS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008457 ret = wma_cli_set_command(pAdapter->sessionId,
8458 WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID,
8459 set_value, VDEV_CMD);
8460 break;
8461 }
8462
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008463 case WE_SET_TXRX_STATS:
8464 {
8465 hdd_notice("WE_SET_TXRX_STATS val %d", set_value);
8466 ret = cds_get_datapath_handles(&soc, &pdev, &vdev,
8467 pAdapter->sessionId);
8468
Venkata Sharath Chandra Manchalabcdfdb12017-03-29 19:25:45 -07008469 if (ret != 0) {
8470 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
8471 "Invalid handles");
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008472 break;
Venkata Sharath Chandra Manchalabcdfdb12017-03-29 19:25:45 -07008473 }
8474 ret = cdp_txrx_stats(soc, vdev, set_value);
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008475 break;
8476 }
8477
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008478 case WE_TXRX_FWSTATS_RESET:
8479 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008480 hdd_debug("WE_TXRX_FWSTATS_RESET val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008481 ret = wma_cli_set_command(pAdapter->sessionId,
8482 WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
8483 set_value, VDEV_CMD);
8484 break;
8485 }
8486
8487 case WE_DUMP_STATS:
8488 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008489 hdd_debug("WE_DUMP_STATS val %d", set_value);
Mohit Khanna3e2115b2016-10-11 13:18:29 -07008490 ret = hdd_wlan_dump_stats(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008491 break;
8492 }
8493
8494 case WE_CLEAR_STATS:
8495 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008496 hdd_debug("WE_CLEAR_STATS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008497 switch (set_value) {
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008498 case CDP_HDD_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008499 memset(&pAdapter->stats, 0, sizeof(pAdapter->stats));
8500 memset(&pAdapter->hdd_stats, 0,
8501 sizeof(pAdapter->hdd_stats));
8502 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008503 case CDP_TXRX_HIST_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008504 wlan_hdd_clear_tx_rx_histogram(hdd_ctx);
8505 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008506 case CDP_HDD_NETIF_OPER_HISTORY:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008507 wlan_hdd_clear_netif_queue_history(hdd_ctx);
8508 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008509 case CDP_HIF_STATS:
Nirav Shahbf1b0332016-05-25 14:27:39 +05308510 hdd_clear_hif_stats();
8511 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008512 default:
Leo Changfdb45c32016-10-28 11:09:23 -07008513 cdp_clear_stats(cds_get_context(QDF_MODULE_ID_SOC),
8514 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008515 }
8516 break;
8517 }
8518
8519 case WE_PPS_PAID_MATCH:
8520 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008521 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008522 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008523
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008524 hdd_debug("WMI_VDEV_PPS_PAID_MATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008525 set_value);
8526 ret = wma_cli_set_command(pAdapter->sessionId,
8527 WMI_VDEV_PPS_PAID_MATCH,
8528 set_value, PPS_CMD);
8529 break;
8530 }
8531
8532 case WE_PPS_GID_MATCH:
8533 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008534 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008535 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008536 hdd_debug("WMI_VDEV_PPS_GID_MATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008537 set_value);
8538 ret = wma_cli_set_command(pAdapter->sessionId,
8539 WMI_VDEV_PPS_GID_MATCH,
8540 set_value, PPS_CMD);
8541 break;
8542 }
8543
8544 case WE_PPS_EARLY_TIM_CLEAR:
8545 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008546 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008547 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008548 hdd_debug(" WMI_VDEV_PPS_EARLY_TIM_CLEAR val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008549 set_value);
8550 ret = wma_cli_set_command(pAdapter->sessionId,
8551 WMI_VDEV_PPS_EARLY_TIM_CLEAR,
8552 set_value, PPS_CMD);
8553 break;
8554 }
8555
8556 case WE_PPS_EARLY_DTIM_CLEAR:
8557 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008558 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008559 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008560 hdd_debug("WMI_VDEV_PPS_EARLY_DTIM_CLEAR val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008561 set_value);
8562 ret = wma_cli_set_command(pAdapter->sessionId,
8563 WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
8564 set_value, PPS_CMD);
8565 break;
8566 }
8567
8568 case WE_PPS_EOF_PAD_DELIM:
8569 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008570 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008571 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008572 hdd_debug("WMI_VDEV_PPS_EOF_PAD_DELIM val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008573 set_value);
8574 ret = wma_cli_set_command(pAdapter->sessionId,
8575 WMI_VDEV_PPS_EOF_PAD_DELIM,
8576 set_value, PPS_CMD);
8577 break;
8578 }
8579
8580 case WE_PPS_MACADDR_MISMATCH:
8581 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008582 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008583 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008584 hdd_debug("WMI_VDEV_PPS_MACADDR_MISMATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008585 set_value);
8586 ret = wma_cli_set_command(pAdapter->sessionId,
8587 WMI_VDEV_PPS_MACADDR_MISMATCH,
8588 set_value, PPS_CMD);
8589 break;
8590 }
8591
8592 case WE_PPS_DELIM_CRC_FAIL:
8593 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008594 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008595 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008596 hdd_debug("WMI_VDEV_PPS_DELIM_CRC_FAIL val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008597 set_value);
8598 ret = wma_cli_set_command(pAdapter->sessionId,
8599 WMI_VDEV_PPS_DELIM_CRC_FAIL,
8600 set_value, PPS_CMD);
8601 break;
8602 }
8603
8604 case WE_PPS_GID_NSTS_ZERO:
8605 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008606 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008607 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008608 hdd_debug("WMI_VDEV_PPS_GID_NSTS_ZERO val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008609 set_value);
8610 ret = wma_cli_set_command(pAdapter->sessionId,
8611 WMI_VDEV_PPS_GID_NSTS_ZERO,
8612 set_value, PPS_CMD);
8613 break;
8614 }
8615
8616 case WE_PPS_RSSI_CHECK:
8617 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008618 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008619 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008620 hdd_debug("WMI_VDEV_PPS_RSSI_CHECK val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008621 set_value);
8622 ret = wma_cli_set_command(pAdapter->sessionId,
8623 WMI_VDEV_PPS_RSSI_CHECK,
8624 set_value, PPS_CMD);
8625 break;
8626 }
8627
8628 case WE_PPS_5G_EBT:
8629 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008630 if (pAdapter->device_mode != QDF_STA_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008631 return -EINVAL;
8632
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008633 hdd_debug("WMI_VDEV_PPS_5G_EBT val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008634 ret = wma_cli_set_command(pAdapter->sessionId,
8635 WMI_VDEV_PPS_5G_EBT,
8636 set_value, PPS_CMD);
8637 break;
8638 }
8639
8640 case WE_SET_HTSMPS:
8641 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008642 hdd_debug("WE_SET_HTSMPS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008643 ret = wma_cli_set_command(pAdapter->sessionId,
8644 WMI_STA_SMPS_FORCE_MODE_CMDID,
8645 set_value, VDEV_CMD);
8646 break;
8647 }
8648
8649 case WE_SET_QPOWER_MAX_PSPOLL_COUNT:
8650 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008651 hdd_debug("WE_SET_QPOWER_MAX_PSPOLL_COUNT val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008652 set_value);
8653 ret = wma_cli_set_command(pAdapter->sessionId,
8654 WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
8655 set_value, QPOWER_CMD);
8656 break;
8657 }
8658
8659 case WE_SET_QPOWER_MAX_TX_BEFORE_WAKE:
8660 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008661 hdd_debug("WE_SET_QPOWER_MAX_TX_BEFORE_WAKE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008662 set_value);
8663 ret = wma_cli_set_command(
8664 pAdapter->sessionId,
8665 WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
8666 set_value, QPOWER_CMD);
8667 break;
8668 }
8669
8670 case WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
8671 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008672 hdd_debug("WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008673 set_value);
8674 ret = wma_cli_set_command(
8675 pAdapter->sessionId,
8676 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
8677 set_value, QPOWER_CMD);
8678 break;
8679 }
8680
8681 case WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
8682 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008683 hdd_debug("WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008684 set_value);
8685 ret = wma_cli_set_command(
8686 pAdapter->sessionId,
8687 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
8688 set_value, QPOWER_CMD);
8689 break;
8690 }
8691
8692 case WE_MCC_CONFIG_LATENCY:
8693 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08008694 wlan_hdd_set_mcc_latency(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008695 break;
8696 }
8697
8698 case WE_MCC_CONFIG_QUOTA:
8699 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008700 hdd_debug("iwpriv cmd to set MCC quota with val %dms",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008701 set_value);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08008702 ret = wlan_hdd_set_mcc_p2p_quota(pAdapter,
8703 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008704 break;
8705 }
8706 case WE_SET_DEBUG_LOG:
8707 {
8708 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Nirav Shah1da77682016-05-03 20:16:39 +05308709
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008710 hdd_ctx->config->gEnableDebugLog = set_value;
8711 sme_update_connect_debug(hdd_ctx->hHal, set_value);
8712 break;
8713 }
8714 case WE_SET_EARLY_RX_ADJUST_ENABLE:
8715 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008716 hdd_debug("SET early_rx enable val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008717 if ((set_value == 0) || (set_value == 1))
8718 ret = wma_cli_set_command(
8719 pAdapter->sessionId,
8720 WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
8721 set_value, VDEV_CMD);
8722 else
8723 ret = -EINVAL;
8724 break;
8725 }
8726 case WE_SET_EARLY_RX_TGT_BMISS_NUM:
8727 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008728 hdd_debug("SET early_rx bmiss val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008729 ret = wma_cli_set_command(pAdapter->sessionId,
8730 WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
8731 set_value, VDEV_CMD);
8732 break;
8733 }
8734 case WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE:
8735 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008736 hdd_debug("SET early_rx bmiss sample cycle %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008737 set_value);
8738 ret = wma_cli_set_command(
8739 pAdapter->sessionId,
8740 WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
8741 set_value, VDEV_CMD);
8742 break;
8743 }
8744 case WE_SET_EARLY_RX_SLOP_STEP:
8745 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008746 hdd_debug("SET early_rx bmiss slop step val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008747 set_value);
8748 ret = wma_cli_set_command(pAdapter->sessionId,
8749 WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP,
8750 set_value, VDEV_CMD);
8751 break;
8752 }
8753 case WE_SET_EARLY_RX_INIT_SLOP:
8754 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008755 hdd_debug("SET early_rx init slop step val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008756 set_value);
8757 ret = wma_cli_set_command(pAdapter->sessionId,
8758 WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP,
8759 set_value, VDEV_CMD);
8760 break;
8761 }
8762 case WE_SET_EARLY_RX_ADJUST_PAUSE:
8763 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008764 hdd_debug("SET early_rx adjust pause %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008765 if ((set_value == 0) || (set_value == 1))
8766 ret = wma_cli_set_command(
8767 pAdapter->sessionId,
8768 WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
8769 set_value, VDEV_CMD);
8770 else
8771 ret = -EINVAL;
8772 break;
8773 }
8774 case WE_SET_EARLY_RX_DRIFT_SAMPLE:
8775 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008776 hdd_debug("SET early_rx drift sample %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008777 ret = wma_cli_set_command(pAdapter->sessionId,
8778 WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE,
8779 set_value, VDEV_CMD);
8780 break;
8781 }
8782 case WE_SET_SCAN_DISABLE:
8783 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008784 hdd_debug("SET SCAN DISABLE %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008785 sme_set_scan_disable(WLAN_HDD_GET_HAL_CTX(pAdapter), set_value);
8786 break;
8787 }
Govind Singha471e5e2015-10-12 17:11:14 +05308788 case WE_START_FW_PROFILE:
8789 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008790 hdd_debug("WE_START_FW_PROFILE %d", set_value);
Govind Singha471e5e2015-10-12 17:11:14 +05308791 ret = wma_cli_set_command(pAdapter->sessionId,
8792 WMI_WLAN_PROFILE_TRIGGER_CMDID,
8793 set_value, DBG_CMD);
8794 break;
8795 }
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308796 case WE_SET_CHANNEL:
8797 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008798 hdd_debug("Set Channel %d Session ID %d mode %d", set_value,
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308799 pAdapter->sessionId, pAdapter->device_mode);
8800
Krunal Sonif07bb382016-03-10 13:02:11 -08008801 if ((QDF_STA_MODE == pAdapter->device_mode) ||
8802 (QDF_P2P_CLIENT_MODE == pAdapter->device_mode)) {
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308803
8804 status = sme_ext_change_channel(hHal,
8805 set_value, pAdapter->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308806 if (status != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008807 hdd_err("Error in change channel status %d",
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308808 status);
8809 ret = -EINVAL;
8810 }
8811 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07008812 hdd_err("change channel not supported for device mode %d",
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308813 pAdapter->device_mode);
8814 ret = -EINVAL;
8815 }
8816 break;
8817 }
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308818 case WE_SET_CONC_SYSTEM_PREF:
8819 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008820 hdd_debug("New preference: %d", set_value);
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308821 if (!((set_value >= CFG_CONC_SYSTEM_PREF_MIN) &&
8822 (set_value <= CFG_CONC_SYSTEM_PREF_MAX))) {
8823 hdd_err("Invalid system preference %d", set_value);
8824 return -EINVAL;
8825 }
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308826
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308827 /* hdd_ctx, hdd_ctx->config are already checked for null */
8828 hdd_ctx->config->conc_system_pref = set_value;
8829 break;
8830 }
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008831 case WE_SET_11AX_RATE:
8832 ret = hdd_set_11ax_rate(pAdapter, set_value, NULL);
8833 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07008834 case WE_SET_DCM:
8835 hdd_notice("Set WMI_VDEV_PARAM_HE_DCM: %d", set_value);
8836 ret = wma_cli_set_command(pAdapter->sessionId,
8837 WMI_VDEV_PARAM_HE_DCM, set_value,
8838 VDEV_CMD);
8839 break;
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07008840 case WE_SET_RANGE_EXT:
8841 hdd_notice("Set WMI_VDEV_PARAM_HE_RANGE_EXT: %d", set_value);
8842 ret = wma_cli_set_command(pAdapter->sessionId,
8843 WMI_VDEV_PARAM_HE_RANGE_EXT,
8844 set_value, VDEV_CMD);
8845 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008846 default:
8847 {
Jeff Johnson99bac312016-06-28 10:38:18 -07008848 hdd_err("Invalid sub command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008849 sub_cmd);
8850 ret = -EINVAL;
8851 break;
8852 }
8853 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05308854 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008855 return ret;
8856}
8857
8858static int iw_setint_getnone(struct net_device *dev,
8859 struct iw_request_info *info,
8860 union iwreq_data *wrqu,
8861 char *extra)
8862{
8863 int ret;
8864
8865 cds_ssr_protect(__func__);
8866 ret = __iw_setint_getnone(dev, info, wrqu, extra);
8867 cds_ssr_unprotect(__func__);
8868
8869 return ret;
8870}
8871
8872/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07008873 * __iw_setnone_get_threeint() - return three value to up layer.
8874 *
8875 * @dev: pointer of net_device of this wireless card
8876 * @info: meta data about Request sent
8877 * @wrqu: include request info
8878 * @extra: buf used for in/Output
8879 *
8880 * Return: execute result
8881 */
8882static int __iw_setnone_get_threeint(struct net_device *dev,
8883 struct iw_request_info *info,
8884 union iwreq_data *wrqu, char *extra)
8885{
8886 int ret = 0; /* success */
8887 uint32_t *value = (int *)extra;
8888 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
8889 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
8890
8891 ENTER_DEV(dev);
8892 ret = wlan_hdd_validate_context(hdd_ctx);
8893 if (0 != ret)
8894 return ret;
8895
Jeff Johnson441e1f72017-02-07 08:50:49 -08008896 ret = hdd_check_private_wext_control(hdd_ctx, info);
8897 if (0 != ret)
8898 return ret;
8899
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008900 hdd_debug("param = %d", value[0]);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07008901 switch (value[0]) {
8902 case WE_GET_TSF:
8903 ret = hdd_indicate_tsf(adapter, value, 3);
8904 break;
8905 default:
8906 hdd_err("Invalid IOCTL get_value command %d", value[0]);
8907 break;
8908 }
8909 return ret;
8910}
8911
8912/**
8913 * iw_setnone_get_threeint() - return three value to up layer.
8914 *
8915 * @dev: pointer of net_device of this wireless card
8916 * @info: meta data about Request sent
8917 * @wrqu: include request info
8918 * @extra: buf used for in/Output
8919 *
8920 * Return: execute result
8921 */
8922static int iw_setnone_get_threeint(struct net_device *dev,
8923 struct iw_request_info *info,
8924 union iwreq_data *wrqu, char *extra)
8925{
8926 int ret;
8927
8928 cds_ssr_protect(__func__);
8929 ret = __iw_setnone_get_threeint(dev, info, wrqu, extra);
8930 cds_ssr_unprotect(__func__);
8931
8932 return ret;
8933}
8934
8935/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008936 * iw_setchar_getnone() - Generic "set string" private ioctl handler
8937 * @dev: device upon which the ioctl was received
8938 * @info: ioctl request information
8939 * @wrqu: ioctl request data
8940 * @extra: ioctl extra data
8941 *
8942 * Return: 0 on success, non-zero on error
8943 */
8944static int __iw_setchar_getnone(struct net_device *dev,
8945 struct iw_request_info *info,
8946 union iwreq_data *wrqu, char *extra)
8947{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308948 QDF_STATUS vstatus;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008949 int sub_cmd;
8950 int ret;
8951 char *pBuffer = NULL;
8952 hdd_adapter_t *pAdapter = (netdev_priv(dev));
8953 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008954 struct hdd_config *pConfig = hdd_ctx->config;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008955 struct iw_point s_priv_data;
8956
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08008957 ENTER_DEV(dev);
8958
Mukul Sharma34777c62015-11-02 20:22:30 +05308959 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008960 hdd_err("permission check failed");
Mukul Sharma34777c62015-11-02 20:22:30 +05308961 return -EPERM;
8962 }
8963
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008964 ret = wlan_hdd_validate_context(hdd_ctx);
8965 if (0 != ret)
8966 return ret;
8967
Jeff Johnson441e1f72017-02-07 08:50:49 -08008968 ret = hdd_check_private_wext_control(hdd_ctx, info);
8969 if (0 != ret)
8970 return ret;
8971
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008972 /* helper function to get iwreq_data with compat handling. */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008973 if (hdd_priv_get_data(&s_priv_data, wrqu))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008974 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008975
8976 /* make sure all params are correctly passed to function */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008977 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008978 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008979
8980 sub_cmd = s_priv_data.flags;
8981
8982 /* ODD number is used for set, copy data using copy_from_user */
8983 pBuffer = mem_alloc_copy_from_user_helper(s_priv_data.pointer,
8984 s_priv_data.length);
8985 if (NULL == pBuffer) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008986 hdd_err("mem_alloc_copy_from_user_helper fail");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008987 return -ENOMEM;
8988 }
8989
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008990 hdd_debug("Received length: %d data: %s",
8991 s_priv_data.length, pBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008992
8993 switch (sub_cmd) {
8994 case WE_WOWL_ADD_PTRN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008995 hdd_debug("ADD_PTRN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008996 hdd_add_wowl_ptrn(pAdapter, pBuffer);
8997 break;
8998 case WE_WOWL_DEL_PTRN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008999 hdd_debug("DEL_PTRN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009000 hdd_del_wowl_ptrn(pAdapter, pBuffer);
9001 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009002 case WE_NEIGHBOR_REPORT_REQUEST:
9003 {
9004 tRrmNeighborReq neighborReq;
9005 tRrmNeighborRspCallbackInfo callbackInfo;
9006
9007 if (pConfig->fRrmEnable) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009008 hdd_debug("Neighbor Request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009009 neighborReq.no_ssid =
9010 (s_priv_data.length - 1) ? false : true;
9011 if (!neighborReq.no_ssid) {
9012 neighborReq.ssid.length =
9013 (s_priv_data.length - 1) >
9014 32 ? 32 : (s_priv_data.length - 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309015 qdf_mem_copy(neighborReq.ssid.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009016 pBuffer,
9017 neighborReq.ssid.length);
9018 }
9019
9020 callbackInfo.neighborRspCallback = NULL;
9021 callbackInfo.neighborRspCallbackContext = NULL;
9022 callbackInfo.timeout = 5000; /* 5 seconds */
9023 sme_neighbor_report_request(WLAN_HDD_GET_HAL_CTX
9024 (pAdapter),
9025 pAdapter->sessionId,
9026 &neighborReq,
9027 &callbackInfo);
9028 } else {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009029 hdd_err("Ignoring neighbor request as RRM not enabled");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009030 ret = -EINVAL;
9031 }
9032 }
9033 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009034 case WE_SET_AP_WPS_IE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009035 hdd_debug("Received WE_SET_AP_WPS_IE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009036 sme_update_p2p_ie(WLAN_HDD_GET_HAL_CTX(pAdapter), pBuffer,
9037 s_priv_data.length);
9038 break;
9039 case WE_SET_CONFIG:
9040 vstatus = hdd_execute_global_config_command(hdd_ctx, pBuffer);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009041 if (QDF_STATUS_SUCCESS != vstatus)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009042 ret = -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009043
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009044 break;
9045 default:
9046 {
Jeff Johnson99bac312016-06-28 10:38:18 -07009047 hdd_err("Invalid sub command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009048 sub_cmd);
9049 ret = -EINVAL;
9050 break;
9051 }
9052 }
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07009053 qdf_mem_free(pBuffer);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309054 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009055 return ret;
9056}
9057
9058static int iw_setchar_getnone(struct net_device *dev,
9059 struct iw_request_info *info,
9060 union iwreq_data *wrqu, char *extra)
9061{
9062 int ret;
9063
9064 cds_ssr_protect(__func__);
9065 ret = __iw_setchar_getnone(dev, info, wrqu, extra);
9066 cds_ssr_unprotect(__func__);
9067
9068 return ret;
9069}
9070
9071/**
9072 * iw_setnone_getint() - Generic "get integer" private ioctl handler
9073 * @dev: device upon which the ioctl was received
9074 * @info: ioctl request information
9075 * @wrqu: ioctl request data
9076 * @extra: ioctl extra data
9077 *
9078 * Return: 0 on success, non-zero on error
9079 */
9080static int __iw_setnone_getint(struct net_device *dev,
9081 struct iw_request_info *info,
9082 union iwreq_data *wrqu, char *extra)
9083{
9084 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9085 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
9086 int *value = (int *)extra;
9087 int ret;
9088 tSmeConfigParams smeConfig;
9089 hdd_context_t *hdd_ctx;
9090
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009091 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309092
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009093 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9094 ret = wlan_hdd_validate_context(hdd_ctx);
9095 if (0 != ret)
9096 return ret;
9097
Jeff Johnson441e1f72017-02-07 08:50:49 -08009098 ret = hdd_check_private_wext_control(hdd_ctx, info);
9099 if (0 != ret)
9100 return ret;
9101
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009102 switch (value[0]) {
9103 case WE_GET_11D_STATE:
9104 {
9105 sme_get_config_param(hHal, &smeConfig);
9106
9107 *value = smeConfig.csrConfig.Is11dSupportEnabled;
9108
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009109 hdd_debug("11D state=%d!!", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009110
9111 break;
9112 }
9113
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009114 case WE_GET_WLAN_DBG:
9115 {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309116 qdf_trace_display();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009117 *value = 0;
9118 break;
9119 }
9120 case WE_GET_MAX_ASSOC:
9121 {
9122 if (sme_cfg_get_int
9123 (hHal, WNI_CFG_ASSOC_STA_LIMIT,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309124 (uint32_t *) value) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009125 hdd_err("WNI_CFG_ASSOC_STA_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009126 ret = -EIO;
9127 }
9128 break;
9129 }
9130 case WE_GET_SAP_AUTO_CHANNEL_SELECTION:
9131 *value = (WLAN_HDD_GET_CTX(
9132 pAdapter))->config->force_sap_acs;
9133 break;
9134
9135 case WE_GET_CONCURRENCY_MODE:
9136 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08009137 *value = policy_mgr_get_concurrency_mode(hdd_ctx->hdd_psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009138
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009139 hdd_debug("concurrency mode=%d", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009140 break;
9141 }
9142
9143 case WE_GET_NSS:
9144 {
9145 sme_get_config_param(hHal, &smeConfig);
9146 *value = (smeConfig.csrConfig.enable2x2 == 0) ? 1 : 2;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009147 hdd_debug("GET_NSS: Current NSS:%d", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009148 break;
9149 }
9150
9151 case WE_GET_GTX_HT_MCS:
9152 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009153 hdd_debug("GET WMI_VDEV_PARAM_GTX_HT_MCS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009154 *value = wma_cli_get_command(pAdapter->sessionId,
9155 WMI_VDEV_PARAM_GTX_HT_MCS,
9156 GTX_CMD);
9157 break;
9158 }
9159
9160 case WE_GET_GTX_VHT_MCS:
9161 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009162 hdd_debug("GET WMI_VDEV_PARAM_GTX_VHT_MCS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009163 *value = wma_cli_get_command(pAdapter->sessionId,
9164 WMI_VDEV_PARAM_GTX_VHT_MCS,
9165 GTX_CMD);
9166 break;
9167 }
9168
9169 case WE_GET_GTX_USRCFG:
9170 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009171 hdd_debug("GET WMI_VDEV_PARAM_GTX_USR_CFG");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009172 *value = wma_cli_get_command(pAdapter->sessionId,
9173 WMI_VDEV_PARAM_GTX_USR_CFG,
9174 GTX_CMD);
9175 break;
9176 }
9177
9178 case WE_GET_GTX_THRE:
9179 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009180 hdd_debug("GET WMI_VDEV_PARAM_GTX_THRE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009181 *value = wma_cli_get_command(pAdapter->sessionId,
9182 WMI_VDEV_PARAM_GTX_THRE,
9183 GTX_CMD);
9184 break;
9185 }
9186
9187 case WE_GET_GTX_MARGIN:
9188 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009189 hdd_debug("GET WMI_VDEV_PARAM_GTX_MARGIN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009190 *value = wma_cli_get_command(pAdapter->sessionId,
9191 WMI_VDEV_PARAM_GTX_MARGIN,
9192 GTX_CMD);
9193 break;
9194 }
9195
9196 case WE_GET_GTX_STEP:
9197 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009198 hdd_debug("GET WMI_VDEV_PARAM_GTX_STEP");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009199 *value = wma_cli_get_command(pAdapter->sessionId,
9200 WMI_VDEV_PARAM_GTX_STEP,
9201 GTX_CMD);
9202 break;
9203 }
9204
9205 case WE_GET_GTX_MINTPC:
9206 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009207 hdd_debug("GET WMI_VDEV_PARAM_GTX_MINTPC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009208 *value = wma_cli_get_command(pAdapter->sessionId,
9209 WMI_VDEV_PARAM_GTX_MINTPC,
9210 GTX_CMD);
9211 break;
9212 }
9213
9214 case WE_GET_GTX_BWMASK:
9215 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009216 hdd_debug("GET WMI_VDEV_PARAM_GTX_BW_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009217 *value = wma_cli_get_command(pAdapter->sessionId,
9218 WMI_VDEV_PARAM_GTX_BW_MASK,
9219 GTX_CMD);
9220 break;
9221 }
9222
9223 case WE_GET_LDPC:
9224 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309225 ret = hdd_get_ldpc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009226 break;
9227 }
9228
9229 case WE_GET_TX_STBC:
9230 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309231 ret = hdd_get_tx_stbc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009232 break;
9233 }
9234
9235 case WE_GET_RX_STBC:
9236 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309237 ret = hdd_get_rx_stbc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009238 break;
9239 }
9240
9241 case WE_GET_SHORT_GI:
9242 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009243 hdd_debug("GET WMI_VDEV_PARAM_SGI");
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009244 *value = wma_cli_get_command(pAdapter->sessionId,
9245 WMI_VDEV_PARAM_SGI,
9246 VDEV_CMD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009247 break;
9248 }
9249
9250 case WE_GET_RTSCTS:
9251 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009252 hdd_debug("GET WMI_VDEV_PARAM_ENABLE_RTSCTS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009253 *value = wma_cli_get_command(pAdapter->sessionId,
9254 WMI_VDEV_PARAM_ENABLE_RTSCTS,
9255 VDEV_CMD);
9256 break;
9257 }
9258
9259 case WE_GET_CHWIDTH:
9260 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009261 hdd_debug("GET WMI_VDEV_PARAM_CHWIDTH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009262 *value = wma_cli_get_command(pAdapter->sessionId,
9263 WMI_VDEV_PARAM_CHWIDTH,
9264 VDEV_CMD);
9265 break;
9266 }
9267
9268 case WE_GET_ANI_EN_DIS:
9269 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009270 hdd_debug("GET WMI_PDEV_PARAM_ANI_ENABLE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009271 *value = wma_cli_get_command(pAdapter->sessionId,
9272 WMI_PDEV_PARAM_ANI_ENABLE,
9273 PDEV_CMD);
9274 break;
9275 }
9276
9277 case WE_GET_ANI_POLL_PERIOD:
9278 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009279 hdd_debug("GET WMI_PDEV_PARAM_ANI_POLL_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009280 *value = wma_cli_get_command(pAdapter->sessionId,
9281 WMI_PDEV_PARAM_ANI_POLL_PERIOD,
9282 PDEV_CMD);
9283 break;
9284 }
9285
9286 case WE_GET_ANI_LISTEN_PERIOD:
9287 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009288 hdd_debug("GET WMI_PDEV_PARAM_ANI_LISTEN_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009289 *value = wma_cli_get_command(pAdapter->sessionId,
9290 WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
9291 PDEV_CMD);
9292 break;
9293 }
9294
9295 case WE_GET_ANI_OFDM_LEVEL:
9296 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009297 hdd_debug("GET WMI_PDEV_PARAM_ANI_OFDM_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009298 *value = wma_cli_get_command(pAdapter->sessionId,
9299 WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
9300 PDEV_CMD);
9301 break;
9302 }
9303
9304 case WE_GET_ANI_CCK_LEVEL:
9305 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009306 hdd_debug("GET WMI_PDEV_PARAM_ANI_CCK_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009307 *value = wma_cli_get_command(pAdapter->sessionId,
9308 WMI_PDEV_PARAM_ANI_CCK_LEVEL,
9309 PDEV_CMD);
9310 break;
9311 }
9312
9313 case WE_GET_DYNAMIC_BW:
9314 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009315 hdd_debug("GET WMI_PDEV_PARAM_ANI_CCK_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009316 *value = wma_cli_get_command(pAdapter->sessionId,
9317 WMI_PDEV_PARAM_DYNAMIC_BW,
9318 PDEV_CMD);
9319 break;
9320 }
9321
9322 case WE_GET_11N_RATE:
9323 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009324 hdd_debug("GET WMI_VDEV_PARAM_FIXED_RATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009325 *value = wma_cli_get_command(pAdapter->sessionId,
9326 WMI_VDEV_PARAM_FIXED_RATE,
9327 VDEV_CMD);
9328 break;
9329 }
9330
9331 case WE_GET_AMPDU:
9332 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009333 hdd_debug("GET AMPDU");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009334 *value = wma_cli_get_command(pAdapter->sessionId,
9335 GEN_VDEV_PARAM_AMPDU,
9336 GEN_CMD);
9337 break;
9338 }
9339
9340 case WE_GET_AMSDU:
9341 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009342 hdd_debug("GET AMSDU");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009343 *value = wma_cli_get_command(pAdapter->sessionId,
9344 GEN_VDEV_PARAM_AMSDU,
9345 GEN_CMD);
9346 break;
9347 }
9348
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07009349 case WE_GET_ROAM_SYNCH_DELAY:
9350 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009351 hdd_debug("GET ROAM SYNCH DELAY");
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07009352 *value = wma_cli_get_command(pAdapter->sessionId,
9353 GEN_VDEV_ROAM_SYNCH_DELAY,
9354 GEN_CMD);
9355 break;
9356 }
9357
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009358 case WE_GET_BURST_ENABLE:
9359 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009360 hdd_debug("GET Burst enable value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009361 *value = wma_cli_get_command(pAdapter->sessionId,
9362 WMI_PDEV_PARAM_BURST_ENABLE,
9363 PDEV_CMD);
9364 break;
9365 }
9366 case WE_GET_BURST_DUR:
9367 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009368 hdd_debug("GET Burst Duration value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009369 *value = wma_cli_get_command(pAdapter->sessionId,
9370 WMI_PDEV_PARAM_BURST_DUR,
9371 PDEV_CMD);
9372 break;
9373 }
9374
9375 case WE_GET_TX_CHAINMASK:
9376 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009377 hdd_debug("GET WMI_PDEV_PARAM_TX_CHAIN_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009378 *value = wma_cli_get_command(pAdapter->sessionId,
9379 WMI_PDEV_PARAM_TX_CHAIN_MASK,
9380 PDEV_CMD);
9381 break;
9382 }
9383
9384 case WE_GET_RX_CHAINMASK:
9385 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009386 hdd_debug("GET WMI_PDEV_PARAM_RX_CHAIN_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009387 *value = wma_cli_get_command(pAdapter->sessionId,
9388 WMI_PDEV_PARAM_RX_CHAIN_MASK,
9389 PDEV_CMD);
9390 break;
9391 }
9392
9393 case WE_GET_TXPOW_2G:
9394 {
9395 uint32_t txpow2g = 0;
9396 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009397
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009398 hdd_debug("GET WMI_PDEV_PARAM_TXPOWER_LIMIT2G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009399 *value = wma_cli_get_command(pAdapter->sessionId,
9400 WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
9401 PDEV_CMD);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309402 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009403 sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
9404 &txpow2g)) {
9405 return -EIO;
9406 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009407 hdd_debug("2G tx_power %d", txpow2g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009408 break;
9409 }
9410
9411 case WE_GET_TXPOW_5G:
9412 {
9413 uint32_t txpow5g = 0;
9414 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009415
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009416 hdd_debug("GET WMI_PDEV_PARAM_TXPOWER_LIMIT5G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417 *value = wma_cli_get_command(pAdapter->sessionId,
9418 WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
9419 PDEV_CMD);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309420 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009421 sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
9422 &txpow5g)) {
9423 return -EIO;
9424 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009425 hdd_debug("5G tx_power %d", txpow5g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009426 break;
9427 }
9428
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009429 case WE_GET_PPS_PAID_MATCH:
9430 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009431 hdd_debug("GET WMI_VDEV_PPS_PAID_MATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009432 *value = wma_cli_get_command(pAdapter->sessionId,
9433 WMI_VDEV_PPS_PAID_MATCH,
9434 PPS_CMD);
9435 break;
9436 }
9437
9438 case WE_GET_PPS_GID_MATCH:
9439 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009440 hdd_debug("GET WMI_VDEV_PPS_GID_MATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009441 *value = wma_cli_get_command(pAdapter->sessionId,
9442 WMI_VDEV_PPS_GID_MATCH,
9443 PPS_CMD);
9444 break;
9445 }
9446
9447 case WE_GET_PPS_EARLY_TIM_CLEAR:
9448 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009449 hdd_debug("GET WMI_VDEV_PPS_EARLY_TIM_CLEAR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009450 *value = wma_cli_get_command(pAdapter->sessionId,
9451 WMI_VDEV_PPS_EARLY_TIM_CLEAR,
9452 PPS_CMD);
9453 break;
9454 }
9455
9456 case WE_GET_PPS_EARLY_DTIM_CLEAR:
9457 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009458 hdd_debug("GET WMI_VDEV_PPS_EARLY_DTIM_CLEAR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009459 *value = wma_cli_get_command(pAdapter->sessionId,
9460 WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
9461 PPS_CMD);
9462 break;
9463 }
9464
9465 case WE_GET_PPS_EOF_PAD_DELIM:
9466 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009467 hdd_debug("GET WMI_VDEV_PPS_EOF_PAD_DELIM");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009468 *value = wma_cli_get_command(pAdapter->sessionId,
9469 WMI_VDEV_PPS_EOF_PAD_DELIM,
9470 PPS_CMD);
9471 break;
9472 }
9473
9474 case WE_GET_PPS_MACADDR_MISMATCH:
9475 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009476 hdd_debug("GET WMI_VDEV_PPS_MACADDR_MISMATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009477 *value = wma_cli_get_command(pAdapter->sessionId,
9478 WMI_VDEV_PPS_MACADDR_MISMATCH,
9479 PPS_CMD);
9480 break;
9481 }
9482
9483 case WE_GET_PPS_DELIM_CRC_FAIL:
9484 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009485 hdd_debug("GET WMI_VDEV_PPS_DELIM_CRC_FAIL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009486 *value = wma_cli_get_command(pAdapter->sessionId,
9487 WMI_VDEV_PPS_DELIM_CRC_FAIL,
9488 PPS_CMD);
9489 break;
9490 }
9491
9492 case WE_GET_PPS_GID_NSTS_ZERO:
9493 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009494 hdd_debug("GET WMI_VDEV_PPS_GID_NSTS_ZERO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009495 *value = wma_cli_get_command(pAdapter->sessionId,
9496 WMI_VDEV_PPS_GID_NSTS_ZERO,
9497 PPS_CMD);
9498 break;
9499 }
9500
9501 case WE_GET_PPS_RSSI_CHECK:
9502 {
9503
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009504 hdd_debug("GET WMI_VDEV_PPS_RSSI_CHECK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009505 *value = wma_cli_get_command(pAdapter->sessionId,
9506 WMI_VDEV_PPS_RSSI_CHECK,
9507 PPS_CMD);
9508 break;
9509 }
9510
9511 case WE_GET_QPOWER_MAX_PSPOLL_COUNT:
9512 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009513 hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009514 *value = wma_cli_get_command(pAdapter->sessionId,
9515 WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
9516 QPOWER_CMD);
9517 break;
9518 }
9519
9520 case WE_GET_QPOWER_MAX_TX_BEFORE_WAKE:
9521 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009522 hdd_debug("WE_GET_QPOWER_MAX_TX_BEFORE_WAKE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009523 *value = wma_cli_get_command(pAdapter->sessionId,
9524 WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
9525 QPOWER_CMD);
9526 break;
9527 }
9528
9529 case WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
9530 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009531 hdd_debug("WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009532 *value = wma_cli_get_command(pAdapter->sessionId,
9533 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
9534 QPOWER_CMD);
9535 break;
9536 }
9537
9538 case WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
9539 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009540 hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009541 *value = wma_cli_get_command(pAdapter->sessionId,
9542 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
9543 QPOWER_CMD);
9544 break;
9545 }
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07009546 case WE_CAP_TSF:
9547 ret = hdd_capture_tsf(pAdapter, (uint32_t *)value, 1);
9548 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009549 case WE_GET_TEMPERATURE:
9550 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009551 hdd_debug("WE_GET_TEMPERATURE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009552 ret = wlan_hdd_get_temperature(pAdapter, value);
9553 break;
9554 }
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07009555 case WE_GET_DCM:
9556 hdd_notice("GET WMI_VDEV_PARAM_HE_DCM");
9557 *value = wma_cli_get_command(pAdapter->sessionId,
9558 WMI_VDEV_PARAM_HE_DCM,
9559 VDEV_CMD);
9560 break;
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07009561 case WE_GET_RANGE_EXT:
9562 hdd_notice("GET WMI_VDEV_PARAM_HE_RANGE_EXT");
9563 *value = wma_cli_get_command(pAdapter->sessionId,
9564 WMI_VDEV_PARAM_HE_RANGE_EXT,
9565 VDEV_CMD);
9566 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009567 default:
9568 {
Jeff Johnson99bac312016-06-28 10:38:18 -07009569 hdd_err("Invalid IOCTL get_value command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009570 value[0]);
9571 break;
9572 }
9573 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309574 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009575 return ret;
9576}
9577
9578static int iw_setnone_getint(struct net_device *dev,
9579 struct iw_request_info *info,
9580 union iwreq_data *wrqu, char *extra)
9581{
9582 int ret;
9583
9584 cds_ssr_protect(__func__);
9585 ret = __iw_setnone_getint(dev, info, wrqu, extra);
9586 cds_ssr_unprotect(__func__);
9587
9588 return ret;
9589}
9590
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05309591static int hdd_set_fwtest(int argc, int cmd, int value)
9592{
9593 struct set_fwtest_params *fw_test;
9594
9595 /* check for max number of arguments */
9596 if (argc > (WMA_MAX_NUM_ARGS) ||
9597 argc != HDD_FWTEST_PARAMS) {
9598 hdd_err("Too Many args %d", argc);
9599 return -EINVAL;
9600 }
9601 /*
9602 * check if number of arguments are 3 then, check
9603 * then set the default value for sounding interval.
9604 */
9605 if (HDD_FWTEST_PARAMS == argc) {
9606 if (HDD_FWTEST_SU_PARAM_ID == cmd && 0 == value)
9607 value = HDD_FWTEST_SU_DEFAULT_VALUE;
9608 if (HDD_FWTEST_MU_PARAM_ID == cmd && 0 == value)
9609 value = HDD_FWTEST_MU_DEFAULT_VALUE;
9610 }
9611 /* check sounding interval value should not exceed to max */
9612 if (value > HDD_FWTEST_MAX_VALUE) {
9613 hdd_err("Invalid arguments value should not exceed max: %d",
9614 value);
9615 return -EINVAL;
9616 }
9617 fw_test = qdf_mem_malloc(sizeof(*fw_test));
9618 if (NULL == fw_test) {
9619 hdd_err("qdf_mem_malloc failed for fw_test");
9620 return -ENOMEM;
9621 }
9622 fw_test->arg = cmd;
9623 fw_test->value = value;
9624 if (QDF_STATUS_SUCCESS != sme_set_fw_test(fw_test)) {
9625 qdf_mem_free(fw_test);
9626 hdd_err("Not able to post FW_TEST_CMD message to WMA");
9627 return -EINVAL;
9628 }
9629 return 0;
9630}
9631
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009632/**
9633 * iw_set_three_ints_getnone() - Generic "set 3 params" private ioctl handler
9634 * @dev: device upon which the ioctl was received
9635 * @info: ioctl request information
9636 * @wrqu: ioctl request data
9637 * @extra: ioctl extra data
9638 *
9639 * Return: 0 on success, non-zero on error
9640 */
9641static int __iw_set_three_ints_getnone(struct net_device *dev,
9642 struct iw_request_info *info,
9643 union iwreq_data *wrqu, char *extra)
9644{
9645 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9646 int *value = (int *)extra;
9647 int sub_cmd = value[0];
9648 int ret;
9649 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9650
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009651 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309652
Rajeev Kumar2cce8a82016-04-14 15:10:41 -07009653 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07009654 hdd_err("permission check failed");
Rajeev Kumar2cce8a82016-04-14 15:10:41 -07009655 return -EPERM;
9656 }
9657
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009658 ret = wlan_hdd_validate_context(hdd_ctx);
9659 if (0 != ret)
9660 return ret;
9661
Jeff Johnson441e1f72017-02-07 08:50:49 -08009662 ret = hdd_check_private_wext_control(hdd_ctx, info);
9663 if (0 != ret)
9664 return ret;
9665
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009666 switch (sub_cmd) {
9667
9668 case WE_SET_WLAN_DBG:
Dustin Brown36e2e5c2017-05-16 15:41:37 -07009669 qdf_print_set_category_verbose(qdf_get_pidx(), value[1],
9670 value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009671 break;
9672 case WE_SET_DP_TRACE:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309673 qdf_dp_trace_set_value(value[1], value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009674 break;
9675
9676 /* value[3] the acs band is not required as start and end channels are
9677 * enough but this cmd is maintained under set three ints for historic
9678 * reasons.
9679 */
9680 case WE_SET_SAP_CHANNELS:
9681 if (wlan_hdd_validate_operation_channel(pAdapter, value[1]) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309682 QDF_STATUS_SUCCESS ||
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009683 wlan_hdd_validate_operation_channel(pAdapter,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309684 value[2]) != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009685 ret = -EINVAL;
9686 } else {
9687 hdd_ctx->config->force_sap_acs_st_ch = value[1];
9688 hdd_ctx->config->force_sap_acs_end_ch = value[2];
9689 }
9690 break;
9691 case WE_SET_DUAL_MAC_SCAN_CONFIG:
9692 hdd_debug("Ioctl to set dual mac scan config");
9693 if (hdd_ctx->config->dual_mac_feature_disable) {
9694 hdd_err("Dual mac feature is disabled from INI");
9695 return -EPERM;
9696 }
9697 hdd_debug("%d %d %d", value[1], value[2], value[3]);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08009698 policy_mgr_set_dual_mac_scan_config(hdd_ctx->hdd_psoc,
9699 value[1], value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009700 break;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05309701 case WE_SET_FW_TEST:
9702 {
9703 ret = hdd_set_fwtest(value[1], value[2], value[3]);
9704 if (ret) {
9705 hdd_err("Not able to set fwtest %d", ret);
9706 return ret;
9707 }
9708 }
9709 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009710 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07009711 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009712 break;
9713
9714 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309715 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009716 return ret;
9717}
9718
9719int iw_set_three_ints_getnone(struct net_device *dev,
9720 struct iw_request_info *info,
9721 union iwreq_data *wrqu, char *extra)
9722{
9723 int ret;
9724
9725 cds_ssr_protect(__func__);
9726 ret = __iw_set_three_ints_getnone(dev, info, wrqu, extra);
9727 cds_ssr_unprotect(__func__);
9728
9729 return ret;
9730}
9731
9732/**
9733 * hdd_connection_state_string() - Get connection state string
9734 * @connection_state: enum to be converted to a string
9735 *
9736 * Return: the string equivalent of @connection_state
9737 */
9738static const char *
9739hdd_connection_state_string(eConnectionState connection_state)
9740{
9741 switch (connection_state) {
9742 CASE_RETURN_STRING(eConnectionState_NotConnected);
9743 CASE_RETURN_STRING(eConnectionState_Connecting);
9744 CASE_RETURN_STRING(eConnectionState_Associated);
9745 CASE_RETURN_STRING(eConnectionState_IbssDisconnected);
9746 CASE_RETURN_STRING(eConnectionState_IbssConnected);
9747 CASE_RETURN_STRING(eConnectionState_Disconnecting);
9748 default:
9749 return "UNKNOWN";
9750 }
9751}
9752
Naveen Rawat910726a2017-03-06 11:42:51 -08009753#if defined(FEATURE_OEM_DATA_SUPPORT)
9754/**
9755 * iw_get_oem_data_cap_wrapper() - wrapper function to call legacy or new
9756 * wifi_pos api to get oem data caps
9757 * @dev: net device upon which the request was received
9758 * @info: ioctl request information
9759 * @wrqu: ioctl request data
9760 * @extra: ioctl data payload
9761 *
9762 * Return: 0 for success, negative errno value on failure
9763 */
9764static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9765 struct iw_request_info *info,
9766 union iwreq_data *wrqu, char *extra)
9767{
9768 return iw_get_oem_data_cap(dev, info, wrqu, extra);
9769}
9770#elif defined(WIFI_POS_CONVERGED)
9771static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9772 struct iw_request_info *info,
9773 union iwreq_data *wrqu, char *extra)
9774{
9775 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
9776 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
9777
9778 return os_if_wifi_pos_populate_caps(hdd_ctx->hdd_psoc,
9779 (struct wifi_pos_driver_caps *)extra);
9780}
9781#else
9782static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9783 struct iw_request_info *info,
9784 union iwreq_data *wrqu, char *extra)
9785{
9786 return -ENOTSUPP;
9787}
9788#endif
9789
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009790/**
9791 * iw_get_char_setnone() - Generic "get string" private ioctl handler
9792 * @dev: device upon which the ioctl was received
9793 * @info: ioctl request information
9794 * @wrqu: ioctl request data
9795 * @extra: ioctl extra data
9796 *
9797 * Return: 0 on success, non-zero on error
9798 */
9799static int __iw_get_char_setnone(struct net_device *dev,
9800 struct iw_request_info *info,
9801 union iwreq_data *wrqu, char *extra)
9802{
9803 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9804 int sub_cmd = wrqu->data.flags;
9805 hdd_context_t *hdd_ctx;
9806 int ret;
9807#ifdef WLAN_FEATURE_11W
9808 hdd_wext_state_t *pWextState;
9809#endif
9810
9811#ifdef WLAN_FEATURE_11W
9812 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
9813#endif
9814
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009815 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309816
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009817 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9818 ret = wlan_hdd_validate_context(hdd_ctx);
9819 if (0 != ret)
9820 return ret;
9821
Jeff Johnson441e1f72017-02-07 08:50:49 -08009822 ret = hdd_check_private_wext_control(hdd_ctx, info);
9823 if (0 != ret)
9824 return ret;
9825
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009826 switch (sub_cmd) {
9827 case WE_WLAN_VERSION:
9828 {
Arun Khandavallia96c2c02016-05-17 19:15:34 +05309829 hdd_wlan_get_version(hdd_ctx, wrqu, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009830 break;
9831 }
9832
9833 case WE_GET_STATS:
9834 {
9835 hdd_wlan_get_stats(pAdapter, &(wrqu->data.length),
9836 extra, WE_MAX_STR_LEN);
9837 break;
9838 }
9839
Dustin Brownd9322482017-01-09 12:46:03 -08009840 case WE_GET_SUSPEND_RESUME_STATS:
9841 {
9842 ret = wlan_hdd_write_suspend_resume_stats(hdd_ctx, extra,
9843 WE_MAX_STR_LEN);
9844 if (ret >= 0) {
9845 wrqu->data.length = ret;
9846 ret = 0;
9847 }
9848
9849 break;
9850 }
9851
Govind Singha471e5e2015-10-12 17:11:14 +05309852 case WE_LIST_FW_PROFILE:
9853 hdd_wlan_list_fw_profile(&(wrqu->data.length),
9854 extra, WE_MAX_STR_LEN);
9855 break;
9856
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009857 /* The case prints the current state of the HDD, SME, CSR, PE,
9858 * TL it can be extended for WDI Global State as well. And
9859 * currently it only checks P2P_CLIENT adapter. P2P_DEVICE
9860 * and P2P_GO have not been added as of now.
9861 */
9862 case WE_GET_STATES:
9863 {
9864 int buf = 0, len = 0;
9865 int adapter_num = 0;
9866 int count = 0, check = 1;
9867
9868 tHalHandle hHal = NULL;
9869 tpAniSirGlobal pMac = NULL;
9870 hdd_station_ctx_t *pHddStaCtx = NULL;
9871
9872 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
9873 hdd_adapter_t *useAdapter = NULL;
9874
9875 /* Print wlan0 or p2p0 states based on the adapter_num
9876 * by using the correct adapter
9877 */
9878 while (adapter_num < 2) {
9879 if (WLAN_ADAPTER == adapter_num) {
9880 useAdapter = pAdapter;
9881 buf =
9882 scnprintf(extra + len,
9883 WE_MAX_STR_LEN - len,
9884 "\n\n wlan0 States:-");
9885 len += buf;
9886 } else if (P2P_ADAPTER == adapter_num) {
9887 buf =
9888 scnprintf(extra + len,
9889 WE_MAX_STR_LEN - len,
9890 "\n\n p2p0 States:-");
9891 len += buf;
9892
9893 if (!pHddCtx) {
9894 buf =
9895 scnprintf(extra + len,
9896 WE_MAX_STR_LEN -
9897 len,
9898 "\n pHddCtx is NULL");
9899 len += buf;
9900 break;
9901 }
9902
9903 /* Printing p2p0 states only in the
9904 * case when the device is configured
9905 * as a p2p_client
9906 */
9907 useAdapter =
9908 hdd_get_adapter(pHddCtx,
Krunal Sonif07bb382016-03-10 13:02:11 -08009909 QDF_P2P_CLIENT_MODE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009910 if (!useAdapter) {
9911 buf =
9912 scnprintf(extra + len,
9913 WE_MAX_STR_LEN -
9914 len,
9915 "\n Device not configured as P2P_CLIENT.");
9916 len += buf;
9917 break;
9918 }
9919 }
9920
9921 hHal = WLAN_HDD_GET_HAL_CTX(useAdapter);
9922 if (!hHal) {
9923 buf =
9924 scnprintf(extra + len,
9925 WE_MAX_STR_LEN - len,
9926 "\n pMac is NULL");
9927 len += buf;
9928 break;
9929 }
9930 pMac = PMAC_STRUCT(hHal);
9931 if (!pMac) {
9932 buf =
9933 scnprintf(extra + len,
9934 WE_MAX_STR_LEN - len,
9935 "\n pMac is NULL");
9936 len += buf;
9937 break;
9938 }
9939 pHddStaCtx =
9940 WLAN_HDD_GET_STATION_CTX_PTR(useAdapter);
9941
9942
9943 buf =
9944 scnprintf(extra + len, WE_MAX_STR_LEN - len,
9945 "\n HDD Conn State - %s "
9946 "\n \n SME State:"
9947 "\n Neighbour Roam State - %s"
9948 "\n CSR State - %s"
9949 "\n CSR Substate - %s",
9950 hdd_connection_state_string
9951 (pHddStaCtx->conn_info.connState),
9952 mac_trace_get_neighbour_roam_state
9953 (sme_get_neighbor_roam_state
9954 (hHal, useAdapter->sessionId)),
9955 mac_trace_getcsr_roam_state
9956 (sme_get_current_roam_state
9957 (hHal, useAdapter->sessionId)),
9958 mac_trace_getcsr_roam_sub_state
9959 (sme_get_current_roam_sub_state
9960 (hHal, useAdapter->sessionId))
9961 );
9962 len += buf;
9963 adapter_num++;
9964 }
9965
Mukul Sharma81661ae2015-10-30 20:26:02 +05309966 if (hHal) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009967 /* Printing Lim State starting with global lim states */
9968 buf =
9969 scnprintf(extra + len, WE_MAX_STR_LEN - len,
9970 "\n \n LIM STATES:-"
9971 "\n Global Sme State - %s "
9972 "\n Global mlm State - %s " "\n",
9973 mac_trace_get_lim_sme_state
9974 (sme_get_lim_sme_state(hHal)),
9975 mac_trace_get_lim_mlm_state
9976 (sme_get_lim_sme_state(hHal))
9977 );
9978 len += buf;
9979
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009980 while (check < 3 && count < 255) {
9981 if (sme_is_lim_session_valid(hHal, count)) {
9982 buf =
9983 scnprintf(extra + len,
9984 WE_MAX_STR_LEN -
9985 len,
9986 "\n Lim Valid Session %d:-"
9987 "\n PE Sme State - %s "
9988 "\n PE Mlm State - %s "
9989 "\n", check,
9990 mac_trace_get_lim_sme_state
9991 (sme_get_lim_sme_session_state
9992 (hHal, count)),
9993 mac_trace_get_lim_mlm_state
9994 (sme_get_lim_mlm_session_state
9995 (hHal, count))
9996 );
9997
9998 len += buf;
9999 check++;
10000 }
10001 count++;
10002 }
10003 }
10004
10005 wrqu->data.length = strlen(extra) + 1;
10006 break;
10007 }
10008
10009 case WE_GET_CFG:
10010 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010011 hdd_debug("Printing CLD global INI Config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010012 hdd_cfg_get_global_config(WLAN_HDD_GET_CTX(pAdapter),
10013 extra,
10014 QCSAP_IOCTL_MAX_STR_LEN);
10015 wrqu->data.length = strlen(extra) + 1;
10016 break;
10017 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010018 case WE_GET_RSSI:
10019 {
10020 int8_t s7Rssi = 0;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010021
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010022 wlan_hdd_get_rssi(pAdapter, &s7Rssi);
10023 snprintf(extra, WE_MAX_STR_LEN, "rssi=%d", s7Rssi);
10024 wrqu->data.length = strlen(extra) + 1;
10025 break;
10026 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010027
10028 case WE_GET_WMM_STATUS:
10029 {
10030 snprintf(extra, WE_MAX_STR_LEN,
10031 "\nDir: 0=up, 1=down, 3=both\n"
10032 "|------------------------|\n"
10033 "|AC | ACM |Admitted| Dir |\n"
10034 "|------------------------|\n"
10035 "|VO | %d | %3s | %d |\n"
10036 "|VI | %d | %3s | %d |\n"
10037 "|BE | %d | %3s | %d |\n"
10038 "|BK | %d | %3s | %d |\n"
10039 "|------------------------|\n",
10040 pAdapter->hddWmmStatus.
10041 wmmAcStatus[SME_AC_VO].wmmAcAccessRequired,
10042 pAdapter->hddWmmStatus.
10043 wmmAcStatus[SME_AC_VO].
10044 wmmAcAccessAllowed ? "YES" : "NO",
10045 pAdapter->hddWmmStatus.
10046 wmmAcStatus[SME_AC_VO].wmmAcTspecInfo.
10047 ts_info.direction,
10048 pAdapter->hddWmmStatus.
10049 wmmAcStatus[SME_AC_VI].wmmAcAccessRequired,
10050 pAdapter->hddWmmStatus.
10051 wmmAcStatus[SME_AC_VI].
10052 wmmAcAccessAllowed ? "YES" : "NO",
10053 pAdapter->hddWmmStatus.
10054 wmmAcStatus[SME_AC_VI].wmmAcTspecInfo.
10055 ts_info.direction,
10056 pAdapter->hddWmmStatus.
10057 wmmAcStatus[SME_AC_BE].wmmAcAccessRequired,
10058 pAdapter->hddWmmStatus.
10059 wmmAcStatus[SME_AC_BE].
10060 wmmAcAccessAllowed ? "YES" : "NO",
10061 pAdapter->hddWmmStatus.
10062 wmmAcStatus[SME_AC_BE].wmmAcTspecInfo.
10063 ts_info.direction,
10064 pAdapter->hddWmmStatus.
10065 wmmAcStatus[SME_AC_BK].wmmAcAccessRequired,
10066 pAdapter->hddWmmStatus.
10067 wmmAcStatus[SME_AC_BK].
10068 wmmAcAccessAllowed ? "YES" : "NO",
10069 pAdapter->hddWmmStatus.
10070 wmmAcStatus[SME_AC_BK].wmmAcTspecInfo.
10071 ts_info.direction);
10072
10073 wrqu->data.length = strlen(extra) + 1;
10074 break;
10075 }
10076 case WE_GET_CHANNEL_LIST:
10077 {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010078 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010079 uint8_t i, len;
10080 char *buf;
10081 uint8_t ubuf[WNI_CFG_COUNTRY_CODE_LEN];
10082 uint8_t ubuf_len = WNI_CFG_COUNTRY_CODE_LEN;
10083 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
10084
Srinivas Girigowdac231df62017-03-24 18:27:57 -070010085 struct channel_list_info channel_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010086
10087 memset(&channel_list, 0, sizeof(channel_list));
Agrawal Ashish6c9bca72016-09-04 13:37:59 +053010088 status = iw_get_channel_list(dev, info, wrqu,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010089 (char *)&channel_list);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010090 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010091 hdd_err("GetChannelList Failed!!!");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010092 return -EINVAL;
10093 }
10094 buf = extra;
10095 /*
10096 * Maximum channels = WNI_CFG_VALID_CHANNEL_LIST_LEN.
10097 * Maximum buffer needed = 5 * number of channels.
10098 * Check ifsufficient buffer is available and then
10099 * proceed to fill the buffer.
10100 */
10101 if (WE_MAX_STR_LEN <
10102 (5 * WNI_CFG_VALID_CHANNEL_LIST_LEN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010103 hdd_err("Insufficient Buffer to populate channel list");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010104 return -EINVAL;
10105 }
10106 len = scnprintf(buf, WE_MAX_STR_LEN, "%u ",
10107 channel_list.num_channels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010108 if (QDF_STATUS_SUCCESS == sme_get_country_code(hdd_ctx->hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010109 ubuf, &ubuf_len)) {
10110 /* Printing Country code in getChannelList */
10111 for (i = 0; i < (ubuf_len - 1); i++)
10112 len += scnprintf(buf + len,
10113 WE_MAX_STR_LEN - len,
10114 "%c", ubuf[i]);
10115 }
10116 for (i = 0; i < channel_list.num_channels; i++) {
10117 len +=
10118 scnprintf(buf + len, WE_MAX_STR_LEN - len,
10119 " %u", channel_list.channels[i]);
10120 }
10121 wrqu->data.length = strlen(extra) + 1;
10122
10123 break;
10124 }
10125#ifdef FEATURE_WLAN_TDLS
10126 case WE_GET_TDLS_PEERS:
10127 {
10128 wrqu->data.length =
10129 wlan_hdd_tdls_get_all_peers(pAdapter, extra,
10130 WE_MAX_STR_LEN) + 1;
10131 break;
10132 }
10133#endif
10134#ifdef WLAN_FEATURE_11W
10135 case WE_GET_11W_INFO:
10136 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010137 hdd_debug("WE_GET_11W_ENABLED = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010138 pWextState->roamProfile.MFPEnabled);
10139
10140 snprintf(extra, WE_MAX_STR_LEN,
10141 "\n BSSID %02X:%02X:%02X:%02X:%02X:%02X, Is PMF Assoc? %d"
10142 "\n Number of Unprotected Disassocs %d"
10143 "\n Number of Unprotected Deauths %d",
10144 pWextState->roamProfile.BSSIDs.bssid->bytes[0],
10145 pWextState->roamProfile.BSSIDs.bssid->bytes[1],
10146 pWextState->roamProfile.BSSIDs.bssid->bytes[2],
10147 pWextState->roamProfile.BSSIDs.bssid->bytes[3],
10148 pWextState->roamProfile.BSSIDs.bssid->bytes[4],
10149 pWextState->roamProfile.BSSIDs.bssid->bytes[5],
10150 pWextState->roamProfile.MFPEnabled,
10151 pAdapter->hdd_stats.hddPmfStats.
10152 numUnprotDisassocRx,
10153 pAdapter->hdd_stats.hddPmfStats.
10154 numUnprotDeauthRx);
10155
10156 wrqu->data.length = strlen(extra) + 1;
10157 break;
10158 }
10159#endif
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010160 case WE_GET_IBSS_STA_INFO:
10161 {
10162 hdd_station_ctx_t *pHddStaCtx =
10163 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
10164 int idx = 0;
10165 int length = 0, buf = 0;
10166
Naveen Rawatc45d1622016-07-05 12:20:09 -070010167 for (idx = 0; idx < MAX_PEERS; idx++) {
Naveen Rawatac027cb2017-04-27 15:02:42 -070010168 if (HDD_WLAN_INVALID_STA_ID !=
10169 pHddStaCtx->conn_info.staId[idx]) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010170 buf = snprintf
10171 ((extra + length),
10172 WE_MAX_STR_LEN - length,
10173 "\n%d .%02x:%02x:%02x:%02x:%02x:%02x\n",
10174 pHddStaCtx->conn_info.staId[idx],
10175 pHddStaCtx->conn_info.
10176 peerMacAddress[idx].bytes[0],
10177 pHddStaCtx->conn_info.
10178 peerMacAddress[idx].bytes[1],
10179 pHddStaCtx->conn_info.
10180 peerMacAddress[idx].bytes[2],
10181 pHddStaCtx->conn_info.
10182 peerMacAddress[idx].bytes[3],
10183 pHddStaCtx->conn_info.
10184 peerMacAddress[idx].bytes[4],
10185 pHddStaCtx->conn_info.
10186 peerMacAddress[idx].bytes[5]
10187 );
10188 length += buf;
10189 }
10190 }
10191 wrqu->data.length = strlen(extra) + 1;
10192 break;
10193 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010194 case WE_GET_PHYMODE:
10195 {
10196 bool ch_bond24 = false, ch_bond5g = false;
10197 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(pAdapter);
10198 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10199 eCsrPhyMode phymode;
10200 eCsrBand currBand;
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010201 tSmeConfigParams *sme_config;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010202
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010203 sme_config = qdf_mem_malloc(sizeof(*sme_config));
10204 if (!sme_config) {
10205 hdd_err("Out of memory");
10206 ret = -ENOMEM;
10207 break;
10208 }
10209
10210 sme_get_config_param(hal, sme_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010211 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010212 sme_config->csrConfig.channelBondingMode24GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010213 ch_bond24 = true;
10214
10215 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010216 sme_config->csrConfig.channelBondingMode5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010217 ch_bond5g = true;
10218
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010219 qdf_mem_free(sme_config);
10220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010221 phymode = sme_get_phy_mode(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010222 if ((QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010223 sme_get_freq_band(hal, &currBand))) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010224 hdd_err("Failed to get current band config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010225 return -EIO;
10226 }
10227
10228 switch (phymode) {
10229 case eCSR_DOT11_MODE_AUTO:
10230 snprintf(extra, WE_MAX_STR_LEN, "AUTO MODE");
10231 break;
10232 case eCSR_DOT11_MODE_11n:
10233 case eCSR_DOT11_MODE_11n_ONLY:
10234 if (currBand == eCSR_BAND_24) {
10235 if (ch_bond24)
10236 snprintf(extra, WE_MAX_STR_LEN,
10237 "11NGHT40");
10238 else
10239 snprintf(extra, WE_MAX_STR_LEN,
10240 "11NGHT20");
10241 } else if (currBand == eCSR_BAND_5G) {
10242 if (ch_bond5g)
10243 snprintf(extra, WE_MAX_STR_LEN,
10244 "11NAHT40");
10245 else
10246 snprintf(extra, WE_MAX_STR_LEN,
10247 "11NAHT20");
10248 } else {
10249 snprintf(extra, WE_MAX_STR_LEN, "11N");
10250 }
10251 break;
10252 case eCSR_DOT11_MODE_abg:
10253 snprintf(extra, WE_MAX_STR_LEN, "11ABG");
10254 break;
10255 case eCSR_DOT11_MODE_11a:
10256 snprintf(extra, WE_MAX_STR_LEN, "11A");
10257 break;
10258 case eCSR_DOT11_MODE_11b:
10259 case eCSR_DOT11_MODE_11b_ONLY:
10260 snprintf(extra, WE_MAX_STR_LEN, "11B");
10261 break;
10262 case eCSR_DOT11_MODE_11g:
10263 case eCSR_DOT11_MODE_11g_ONLY:
10264 snprintf(extra, WE_MAX_STR_LEN, "11G");
10265 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010266 case eCSR_DOT11_MODE_11ac:
10267 case eCSR_DOT11_MODE_11ac_ONLY:
10268 if (hddctx->config->vhtChannelWidth ==
10269 eHT_CHANNEL_WIDTH_20MHZ)
10270 snprintf(extra, WE_MAX_STR_LEN,
10271 "11ACVHT20");
10272 else if (hddctx->config->vhtChannelWidth ==
10273 eHT_CHANNEL_WIDTH_40MHZ)
10274 snprintf(extra, WE_MAX_STR_LEN,
10275 "11ACVHT40");
10276 else if (hddctx->config->vhtChannelWidth ==
10277 eHT_CHANNEL_WIDTH_80MHZ)
10278 snprintf(extra, WE_MAX_STR_LEN,
10279 "11ACVHT80");
10280 else if (hddctx->config->vhtChannelWidth ==
10281 eHT_CHANNEL_WIDTH_160MHZ)
10282 snprintf(extra, WE_MAX_STR_LEN,
10283 "11ACVHT160");
10284 break;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -080010285 case eCSR_DOT11_MODE_11ax:
10286 case eCSR_DOT11_MODE_11ax_ONLY:
10287 /* currently using vhtChannelWidth */
10288 if (hddctx->config->vhtChannelWidth ==
10289 eHT_CHANNEL_WIDTH_20MHZ)
10290 snprintf(extra, WE_MAX_STR_LEN,
10291 "11AX_HE_20");
10292 else if (hddctx->config->vhtChannelWidth ==
10293 eHT_CHANNEL_WIDTH_40MHZ)
10294 snprintf(extra, WE_MAX_STR_LEN,
10295 "11AX_HE_40");
10296 else if (hddctx->config->vhtChannelWidth ==
10297 eHT_CHANNEL_WIDTH_80MHZ)
10298 snprintf(extra, WE_MAX_STR_LEN,
10299 "11AX_HE_80");
10300 else if (hddctx->config->vhtChannelWidth ==
10301 eHT_CHANNEL_WIDTH_160MHZ)
10302 snprintf(extra, WE_MAX_STR_LEN,
10303 "11AX_HE_160");
10304 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010305 }
10306
10307 wrqu->data.length = strlen(extra) + 1;
10308 break;
10309 }
10310
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010311 case WE_GET_OEM_DATA_CAP:
Naveen Rawat910726a2017-03-06 11:42:51 -080010312 return iw_get_oem_data_cap_wrapper(dev, info, wrqu, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010313 case WE_GET_SNR:
10314 {
10315 int8_t s7snr = 0;
10316 int status = 0;
10317 hdd_context_t *pHddCtx;
10318 hdd_station_ctx_t *pHddStaCtx;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010319
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010320 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
10321 status = wlan_hdd_validate_context(pHddCtx);
Abhishek Singh23edd1c2016-05-05 11:56:06 +053010322 if (status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010323 return status;
Abhishek Singh23edd1c2016-05-05 11:56:06 +053010324
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010325 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
10326 if (0 == pHddCtx->config->fEnableSNRMonitoring ||
10327 eConnectionState_Associated !=
10328 pHddStaCtx->conn_info.connState) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010329 hdd_err("getSNR failed: Enable SNR Monitoring-%d, ConnectionState-%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010330 pHddCtx->config->fEnableSNRMonitoring,
10331 pHddStaCtx->conn_info.connState);
10332 return -ENONET;
10333 }
10334 wlan_hdd_get_snr(pAdapter, &s7snr);
10335 snprintf(extra, WE_MAX_STR_LEN, "snr=%d", s7snr);
10336 wrqu->data.length = strlen(extra) + 1;
10337 break;
10338 }
10339 default:
10340 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010341 hdd_err("Invalid IOCTL command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010342 sub_cmd);
10343 break;
10344 }
10345 }
Dustin Brownd9322482017-01-09 12:46:03 -080010346
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010347 EXIT();
Dustin Brownd9322482017-01-09 12:46:03 -080010348 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010349}
10350
10351static int iw_get_char_setnone(struct net_device *dev,
10352 struct iw_request_info *info,
10353 union iwreq_data *wrqu, char *extra)
10354{
10355 int ret;
10356
10357 cds_ssr_protect(__func__);
10358 ret = __iw_get_char_setnone(dev, info, wrqu, extra);
10359 cds_ssr_unprotect(__func__);
10360
10361 return ret;
10362}
10363
10364/**
10365 * iw_setnone_getnone() - Generic "action" private ioctl handler
10366 * @dev: device upon which the ioctl was received
10367 * @info: ioctl request information
10368 * @wrqu: ioctl request data
10369 * @extra: ioctl extra data
10370 *
10371 * Return: 0 on success, non-zero on error
10372 */
10373static int __iw_setnone_getnone(struct net_device *dev,
10374 struct iw_request_info *info,
10375 union iwreq_data *wrqu, char *extra)
10376{
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010377 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010378 hdd_context_t *hdd_ctx;
10379 int ret;
10380 int sub_cmd;
10381
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080010382 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010383
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010384 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010385 ret = wlan_hdd_validate_context(hdd_ctx);
10386 if (0 != ret)
10387 return ret;
10388
Jeff Johnson441e1f72017-02-07 08:50:49 -080010389 ret = hdd_check_private_wext_control(hdd_ctx, info);
10390 if (0 != ret)
10391 return ret;
10392
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010393#ifdef CONFIG_COMPAT
10394 /* this ioctl is a special case where a sub-ioctl is used and both
10395 * the number of get and set args is 0. in this specific case the
10396 * logic in iwpriv places the sub_cmd in the data.flags portion of
10397 * the iwreq. unfortunately the location of this field will be
10398 * different between 32-bit and 64-bit userspace, and the standard
10399 * compat support in the kernel does not handle this case. so we
10400 * need to explicitly handle it here.
10401 */
10402 if (is_compat_task()) {
10403 struct compat_iw_point *compat_iw_point =
10404 (struct compat_iw_point *)&wrqu->data;
10405 sub_cmd = compat_iw_point->flags;
10406 } else {
10407 sub_cmd = wrqu->data.flags;
10408 }
10409#else
10410 sub_cmd = wrqu->data.flags;
10411#endif
10412
10413 switch (sub_cmd) {
10414 case WE_GET_RECOVERY_STAT:
10415 {
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010416 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010417
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010418 sme_get_recovery_stats(hal);
10419 break;
10420 }
10421
Govind Singha471e5e2015-10-12 17:11:14 +053010422 case WE_GET_FW_PROFILE_DATA:
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010423 ret = wma_cli_set_command(adapter->sessionId,
Govind Singha471e5e2015-10-12 17:11:14 +053010424 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
10425 0, DBG_CMD);
10426 break;
10427
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010428 case WE_IBSS_GET_PEER_INFO_ALL:
10429 {
10430 hdd_wlan_get_ibss_peer_info_all(adapter);
10431 break;
10432 }
10433
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010434 case WE_SET_REASSOC_TRIGGER:
10435 {
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010436 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010437
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010438 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(adapter);
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010439 tSirMacAddr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010440 uint32_t roamId = 0;
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010441 uint8_t operating_ch =
10442 adapter->sessionCtx.station.conn_info.operationChannel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010443 tCsrRoamModifyProfileFields modProfileFields;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010444
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010445 sme_get_modify_profile_fields(hHal, adapter->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010446 &modProfileFields);
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010447 if (roaming_offload_enabled(hdd_ctx)) {
10448 qdf_mem_copy(bssid,
10449 &adapter->sessionCtx.station.conn_info.bssId,
10450 sizeof(bssid));
Naveen Rawat664a7cb2017-01-19 17:58:14 -080010451 hdd_wma_send_fastreassoc_cmd(adapter,
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010452 bssid, operating_ch);
10453 } else {
10454 sme_roam_reassoc(hdd_ctx->hHal, adapter->sessionId,
10455 NULL, modProfileFields, &roamId, 1);
10456 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010457 return 0;
10458 }
10459
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010460 case WE_STOP_OBSS_SCAN:
10461 {
10462 /*
10463 * 1.OBSS Scan is mandatory while operating in 2.4GHz
10464 * 2.OBSS scan is stopped by Firmware during the disassociation
10465 * 3.OBSS stop comamnd is added for debugging purpose
10466 */
10467 tHalHandle hal;
10468
10469 hal = WLAN_HDD_GET_HAL_CTX(adapter);
10470 if (hal == NULL) {
10471 hdd_err("hal context is NULL");
10472 return -EINVAL;
10473 }
10474 sme_ht40_stop_obss_scan(hal, adapter->sessionId);
10475 }
10476 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010477 default:
10478 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010479 hdd_err("unknown ioctl %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010480 break;
10481 }
10482 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010483 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010484 return ret;
10485}
10486
10487static int iw_setnone_getnone(struct net_device *dev,
10488 struct iw_request_info *info,
10489 union iwreq_data *wrqu, char *extra)
10490{
10491 int ret;
10492
10493 cds_ssr_protect(__func__);
10494 ret = __iw_setnone_getnone(dev, info, wrqu, extra);
10495 cds_ssr_unprotect(__func__);
10496
10497 return ret;
10498}
10499
Krunal Sonia6e505b2017-01-12 12:25:18 -080010500#ifdef MPC_UT_FRAMEWORK
10501static int iw_get_policy_manager_ut_ops(hdd_context_t *hdd_ctx,
10502 hdd_adapter_t *adapter, int sub_cmd, int *apps_args)
10503{
Jeff Johnsonac8b0de2017-02-10 09:22:22 -080010504 switch (sub_cmd) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010505 case WE_POLICY_MANAGER_CLIST_CMD:
10506 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010507 hdd_debug("<iwpriv wlan0 pm_clist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010508 policy_mgr_incr_connection_count_utfw(hdd_ctx->hdd_psoc,
10509 apps_args[0], apps_args[1], apps_args[2], apps_args[3],
10510 apps_args[4], apps_args[5], apps_args[6], apps_args[7]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010511 }
10512 break;
10513
10514 case WE_POLICY_MANAGER_DLIST_CMD:
10515 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010516 hdd_debug("<iwpriv wlan0 pm_dlist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010517 policy_mgr_decr_connection_count_utfw(hdd_ctx->hdd_psoc,
10518 apps_args[0], apps_args[1]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010519 }
10520 break;
10521
10522 case WE_POLICY_MANAGER_ULIST_CMD:
10523 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010524 hdd_debug("<iwpriv wlan0 pm_ulist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010525 policy_mgr_update_connection_info_utfw(hdd_ctx->hdd_psoc,
10526 apps_args[0], apps_args[1], apps_args[2], apps_args[3],
10527 apps_args[4], apps_args[5], apps_args[6], apps_args[7]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010528 }
10529 break;
10530
10531 case WE_POLICY_MANAGER_DBS_CMD:
10532 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010533 hdd_debug("<iwpriv wlan0 pm_dbs> is called");
Krunal Sonia6e505b2017-01-12 12:25:18 -080010534 if (apps_args[0] == 0)
10535 wma_set_dbs_capability_ut(0);
10536 else
10537 wma_set_dbs_capability_ut(1);
10538
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010539 if (apps_args[1] >= PM_THROUGHPUT &&
10540 apps_args[1] <= PM_LATENCY) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010541 pr_info("setting system pref to [%d]\n", apps_args[1]);
10542 hdd_ctx->config->conc_system_pref = apps_args[1];
10543 }
10544 }
10545 break;
10546
10547 case WE_POLICY_MANAGER_PCL_CMD:
10548 {
10549 uint8_t pcl[QDF_MAX_NUM_CHAN] = {0};
10550 uint8_t weight_list[QDF_MAX_NUM_CHAN] = {0};
10551 uint32_t pcl_len = 0, i = 0;
10552
10553 hdd_err("<iwpriv wlan0 pm_pcl> is called");
10554
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010555 policy_mgr_get_pcl(hdd_ctx->hdd_psoc, apps_args[0],
Krunal Sonia6e505b2017-01-12 12:25:18 -080010556 pcl, &pcl_len,
10557 weight_list, QDF_ARRAY_SIZE(weight_list));
10558 pr_info("PCL list for role[%d] is {", apps_args[0]);
10559 for (i = 0 ; i < pcl_len; i++)
10560 pr_info(" %d, ", pcl[i]);
10561 pr_info("}--------->\n");
10562 }
10563 break;
10564
10565 case WE_POLICY_SET_HW_MODE_CMD:
10566 {
10567 if (apps_args[0] == 0) {
10568 hdd_err("set hw mode for single mac");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010569 policy_mgr_pdev_set_hw_mode(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010570 adapter->sessionId,
10571 HW_MODE_SS_2x2,
10572 HW_MODE_80_MHZ,
10573 HW_MODE_SS_0x0, HW_MODE_BW_NONE,
10574 HW_MODE_DBS_NONE,
10575 HW_MODE_AGILE_DFS_NONE,
10576 HW_MODE_SBS_NONE,
10577 SIR_UPDATE_REASON_UT);
10578 } else if (apps_args[0] == 1) {
10579 hdd_err("set hw mode for dual mac");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010580 policy_mgr_pdev_set_hw_mode(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010581 adapter->sessionId,
10582 HW_MODE_SS_1x1,
10583 HW_MODE_80_MHZ,
10584 HW_MODE_SS_1x1, HW_MODE_40_MHZ,
10585 HW_MODE_DBS,
10586 HW_MODE_AGILE_DFS_NONE,
10587 HW_MODE_SBS_NONE,
10588 SIR_UPDATE_REASON_UT);
10589 }
10590 }
10591 break;
10592
10593 case WE_POLICY_MANAGER_QUERY_ACTION_CMD:
10594 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010595 enum policy_mgr_conc_next_action action;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010596
Krunal Sonia6e505b2017-01-12 12:25:18 -080010597 hdd_notice("<iwpriv wlan0 pm_query_action> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010598 action = policy_mgr_current_connections_update(
10599 hdd_ctx->hdd_psoc,
10600 adapter->sessionId, apps_args[0],
10601 SIR_UPDATE_REASON_UT);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010602 pr_info("next action is %d {HDD_NOP = 0, HDD_DBS, HDD_DBS_DOWNGRADE, HDD_MCC, HDD_MCC_UPGRADE}", action);
10603 }
10604 break;
10605
10606 case WE_POLICY_MANAGER_QUERY_ALLOW_CMD:
10607 {
10608 bool allow;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010609
10610 hdd_notice("<iwpriv wlan0 pm_query_allow> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010611 allow = policy_mgr_allow_concurrency(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010612 apps_args[0], apps_args[1], apps_args[2]);
10613 pr_info("allow %d {0 = don't allow, 1 = allow}", allow);
10614 }
10615 break;
10616
10617 case WE_POLICY_MANAGER_SCENARIO_CMD:
10618 {
10619 clean_report(hdd_ctx);
10620 if (apps_args[0] == 1) {
10621 wlan_hdd_one_connection_scenario(hdd_ctx);
10622 } else if (apps_args[0] == 2) {
10623 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010624 6, POLICY_MGR_TWO_TWO);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010625 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010626 36, POLICY_MGR_TWO_TWO);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010627 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010628 6, POLICY_MGR_ONE_ONE);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010629 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010630 36, POLICY_MGR_ONE_ONE);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010631 } else if (apps_args[0] == 3) {
10632 /* MCC on same band with 2x2 same mac*/
10633 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010634 6, 11, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010635 /* MCC on diff band with 2x2 same mac*/
10636 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010637 6, 36, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010638 /* MCC on diff band with 1x1 diff mac */
10639 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010640 36, 6, POLICY_MGR_ONE_ONE, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010641 /* MCC on diff band with 1x1 same mac */
10642 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010643 36, 6, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010644 /* SCC on same band with 2x2 same mac */
10645 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010646 36, 36, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010647 /* SCC on same band with 1x1 same mac */
10648 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010649 36, 36, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010650 /* MCC on same band with 2x2 same mac */
10651 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010652 36, 149, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010653 /* MCC on same band with 1x1 same mac */
10654 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010655 36, 149, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010656 }
10657 print_report(hdd_ctx);
10658 }
10659 break;
10660 }
10661 return 0;
10662}
10663#else
10664static int iw_get_policy_manager_ut_ops(hdd_context_t *hdd_ctx,
10665 hdd_adapter_t *adapter, int sub_cmd, int *apps_args)
10666{
10667 return 0;
10668}
10669#endif
10670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010671/**
10672 * __iw_set_var_ints_getnone - Generic "set many" private ioctl handler
10673 * @dev: device upon which the ioctl was received
10674 * @info: ioctl request information
10675 * @wrqu: ioctl request data
10676 * @extra: ioctl extra data
10677 *
10678 * This is an SSR-protected generic handler for private ioctls which
10679 * take multiple arguments. Note that this implementation is also
10680 * somewhat unique in that it is shared by both STA-mode and SAP-mode
10681 * interfaces.
10682 *
10683 * Return: 0 on success, non-zero on error
10684 */
10685static int __iw_set_var_ints_getnone(struct net_device *dev,
10686 struct iw_request_info *info,
10687 union iwreq_data *wrqu, char *extra)
10688{
10689 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
10690 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10691 int sub_cmd;
10692 int *apps_args = (int *) extra;
10693 hdd_context_t *hdd_ctx;
10694 int ret, num_args;
10695
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080010696 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010697
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010698 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
10699 ret = wlan_hdd_validate_context(hdd_ctx);
10700 if (0 != ret)
10701 return ret;
10702
Jeff Johnson441e1f72017-02-07 08:50:49 -080010703 ret = hdd_check_private_wext_control(hdd_ctx, info);
10704 if (0 != ret)
10705 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010706
10707 sub_cmd = wrqu->data.flags;
10708 num_args = wrqu->data.length;
10709
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010710 hdd_debug("Received length %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010711
10712 switch (sub_cmd) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010713 case WE_IBSS_GET_PEER_INFO:
10714 {
10715 pr_info("Station ID = %d\n", apps_args[0]);
10716 hdd_wlan_get_ibss_peer_info(pAdapter, apps_args[0]);
10717 }
10718 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010719
10720 case WE_P2P_NOA_CMD:
10721 {
Srinivas Girigowda5d5fdc52017-03-24 22:30:57 -070010722 struct p2p_app_set_ps p2pNoA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010723
Krunal Sonif07bb382016-03-10 13:02:11 -080010724 if (pAdapter->device_mode != QDF_P2P_GO_MODE) {
Rajeev Kumar274034c2015-11-23 11:28:58 -080010725 hdd_err("Setting NoA is not allowed in Device mode %s(%d)",
10726 hdd_device_mode_to_string(
10727 pAdapter->device_mode),
10728 pAdapter->device_mode);
10729 return -EINVAL;
10730 }
10731
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010732 p2pNoA.opp_ps = apps_args[0];
10733 p2pNoA.ctWindow = apps_args[1];
10734 p2pNoA.duration = apps_args[2];
10735 p2pNoA.interval = apps_args[3];
10736 p2pNoA.count = apps_args[4];
10737 p2pNoA.single_noa_duration = apps_args[5];
10738 p2pNoA.psSelection = apps_args[6];
10739
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010740 hdd_debug("P2P_NOA_ATTR:oppPS %d ctWindow %d duration %d interval %d count %d single noa duration %d PsSelection %x",
Jeff Johnson99bac312016-06-28 10:38:18 -070010741 apps_args[0], apps_args[1], apps_args[2],
10742 apps_args[3], apps_args[4],
10743 apps_args[5], apps_args[6]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010744
10745 hdd_set_p2p_ps(dev, &p2pNoA);
10746
10747 }
10748 break;
10749
10750 case WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD:
10751 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010752 hdd_debug("SELECTIVE_MODULE_LOG %d arg1 %d arg2",
Jeff Johnson99bac312016-06-28 10:38:18 -070010753 apps_args[0], apps_args[1]);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010754 qdf_trace_enable(apps_args[0], apps_args[1]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010755 }
10756 break;
10757
10758 case WE_MTRACE_DUMP_CMD:
10759 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010760 hdd_debug("MTRACE_DUMP code %d session %d count %d bitmask_of_module %d ",
Jeff Johnson99bac312016-06-28 10:38:18 -070010761 apps_args[0], apps_args[1],
10762 apps_args[2], apps_args[3]);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010763 qdf_trace_dump_all((void *)hHal, apps_args[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010764 apps_args[1], apps_args[2],
10765 apps_args[3]);
10766
10767 }
10768 break;
10769
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010770 case WE_POLICY_MANAGER_CINFO_CMD:
10771 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010772 struct policy_mgr_conc_connection_info *conn_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010773 uint32_t i = 0, len = 0;
10774
Krunal Sonia6e505b2017-01-12 12:25:18 -080010775 hdd_info("<iwpriv wlan0 pm_cinfo> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010776 conn_info = policy_mgr_get_conn_info(&len);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010777 pr_info("+--------------------------+\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010778 for (i = 0; i < len; i++) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010779 pr_info("|table_index[%d]\t\t\n", i);
10780 pr_info("|\t|vdev_id - %-10d|\n", conn_info->vdev_id);
10781 pr_info("|\t|chan - %-10d|\n", conn_info->chan);
10782 pr_info("|\t|bw - %-10d|\n", conn_info->bw);
10783 pr_info("|\t|mode - %-10d|\n", conn_info->mode);
10784 pr_info("|\t|mac - %-10d|\n", conn_info->mac);
10785 pr_info("|\t|in_use - %-10d|\n", conn_info->in_use);
10786 pr_info("+--------------------------+\n");
10787 conn_info++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010788 }
10789 }
10790 break;
10791
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010792
10793#ifdef FEATURE_WLAN_TDLS
10794 case WE_TDLS_CONFIG_PARAMS:
10795 {
10796 tdls_config_params_t tdlsParams;
10797
10798 tdlsParams.tdls = apps_args[0];
10799 tdlsParams.tx_period_t = apps_args[1];
10800 tdlsParams.tx_packet_n = apps_args[2];
10801 /* ignore args[3] as discovery_period is not used anymore */
10802 tdlsParams.discovery_tries_n = apps_args[4];
10803 /* ignore args[5] as idle_timeout is not used anymore */
10804 tdlsParams.idle_packet_n = apps_args[6];
10805 /* ignore args[7] as rssi_hysteresis is not used anymore */
10806 tdlsParams.rssi_trigger_threshold = apps_args[8];
10807 tdlsParams.rssi_teardown_threshold = apps_args[9];
10808 tdlsParams.rssi_delta = apps_args[10];
10809
10810 wlan_hdd_tdls_set_params(dev, &tdlsParams);
10811 }
10812 break;
10813#endif
10814 case WE_UNIT_TEST_CMD:
10815 {
10816 t_wma_unit_test_cmd *unitTestArgs;
Rajeev Kumarea95edd2017-01-11 20:49:36 -080010817 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010818 int i, j;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010820 if ((apps_args[0] < WLAN_MODULE_ID_MIN) ||
10821 (apps_args[0] >= WLAN_MODULE_ID_MAX)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010822 hdd_err("Invalid MODULE ID %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010823 apps_args[0]);
10824 return -EINVAL;
10825 }
Anurag Chouhan77564182016-09-03 16:38:01 +053010826 if ((apps_args[1] > (WMA_MAX_NUM_ARGS)) ||
10827 (apps_args[1] < 0)) {
10828 hdd_err("Too Many/Few args %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010829 apps_args[1]);
10830 return -EINVAL;
10831 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010832 unitTestArgs = qdf_mem_malloc(sizeof(*unitTestArgs));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010833 if (NULL == unitTestArgs) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010834 hdd_err("qdf_mem_malloc failed for unitTestArgs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010835 return -ENOMEM;
10836 }
10837 unitTestArgs->vdev_id = (int)pAdapter->sessionId;
10838 unitTestArgs->module_id = apps_args[0];
10839 unitTestArgs->num_args = apps_args[1];
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010840 for (i = 0, j = 2; i < unitTestArgs->num_args; i++, j++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010841 unitTestArgs->args[i] = apps_args[j];
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010842
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010843 msg.type = SIR_HAL_UNIT_TEST_CMD;
10844 msg.reserved = 0;
10845 msg.bodyptr = unitTestArgs;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010846 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarea95edd2017-01-11 20:49:36 -080010847 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010848 qdf_mem_free(unitTestArgs);
Jeff Johnson99bac312016-06-28 10:38:18 -070010849 hdd_err("Not able to post UNIT_TEST_CMD message to WMA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010850 return -EINVAL;
10851 }
10852 }
10853 break;
10854#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
10855 case WE_LED_FLASHING_PARAM:
10856 {
10857 int i;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010858
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010859 if (num_args != 4) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010860 hdd_err("gpio_control: 4 parameters are required");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010861 return -EINVAL;
10862 }
10863 for (i = 0; i < num_args; i++) {
10864 if (apps_args[i] >= 0x7fffffff) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010865 hdd_err("gpio_control: parameter should be less than 0x7fffffff");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010866 return -EINVAL;
10867 }
10868 }
10869 sme_set_led_flashing(WLAN_HDD_GET_HAL_CTX(pAdapter),
10870 0, apps_args[0], apps_args[1]);
10871 sme_set_led_flashing(WLAN_HDD_GET_HAL_CTX(pAdapter),
10872 1, apps_args[2], apps_args[3]);
10873 }
10874 break;
10875#endif
Poddar, Siddarth176c4362016-10-03 12:25:00 +053010876 case WE_SET_PKTLOG:
10877 {
10878 int ret;
10879
10880 if (num_args < 1 || num_args > 2) {
10881 hdd_err("pktlog: either 1 or 2 parameters are required");
10882 return -EINVAL;
10883 }
10884
10885 ret = hdd_process_pktlog_command(hdd_ctx, apps_args[0],
10886 apps_args[1]);
10887 if (ret)
10888 return ret;
10889 break;
10890 }
10891
Manjeet Singhf82ed072016-07-08 11:40:00 +053010892 case WE_MAC_PWR_DEBUG_CMD:
10893 {
10894 struct sir_mac_pwr_dbg_cmd mac_pwr_dbg_args;
10895 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10896 int i, j;
10897
10898 if (num_args < 3) {
10899 hdd_err("number of arguments can't be null %d",
10900 num_args);
10901 return -EINVAL;
10902 }
10903 if (num_args - 3 != apps_args[2]) {
10904 hdd_err("arg list of size %d doesn't match num_args %d",
10905 num_args-3, apps_args[2]);
10906 return -EINVAL;
10907 }
10908 if ((apps_args[1] < WLAN_MODULE_ID_MIN) ||
10909 (apps_args[1] >= WLAN_MODULE_ID_MAX)) {
10910 hdd_err("Invalid MODULE ID %d", apps_args[1]);
10911 return -EINVAL;
10912 }
10913 if (apps_args[2] > (MAX_POWER_DBG_ARGS_SUPPORTED)) {
10914 hdd_err("Too Many args %d", apps_args[2]);
10915 return -EINVAL;
10916 }
10917 mac_pwr_dbg_args.pdev_id = apps_args[0];
10918 mac_pwr_dbg_args.module_id = apps_args[1];
10919 mac_pwr_dbg_args.num_args = apps_args[2];
10920
10921 for (i = 0, j = 3; i < mac_pwr_dbg_args.num_args; i++, j++)
10922 mac_pwr_dbg_args.args[i] = apps_args[j];
10923
10924 if (QDF_STATUS_SUCCESS !=
10925 sme_process_mac_pwr_dbg_cmd(hal, pAdapter->sessionId,
10926 &mac_pwr_dbg_args)) {
10927 return -EINVAL;
10928 }
10929 }
10930 break;
Krunal Sonia6e505b2017-01-12 12:25:18 -080010931 case WE_POLICY_MANAGER_CLIST_CMD:
10932 case WE_POLICY_MANAGER_DLIST_CMD:
10933 case WE_POLICY_MANAGER_ULIST_CMD:
10934 case WE_POLICY_MANAGER_DBS_CMD:
10935 case WE_POLICY_MANAGER_PCL_CMD:
10936 case WE_POLICY_SET_HW_MODE_CMD:
10937 case WE_POLICY_MANAGER_QUERY_ACTION_CMD:
10938 case WE_POLICY_MANAGER_QUERY_ALLOW_CMD:
10939 case WE_POLICY_MANAGER_SCENARIO_CMD:
10940 {
10941 iw_get_policy_manager_ut_ops(hdd_ctx, pAdapter,
10942 sub_cmd, apps_args);
10943 }
10944 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010945 default:
10946 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010947 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010948 }
10949 break;
10950 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010951 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010952 return 0;
10953}
10954
10955/**
10956 * iw_hdd_set_var_ints_getnone() - set var ints getnone callback
10957 * @dev: pointer to net_device structure
10958 * @info: pointer to iw_request_info structure
10959 * @wrqu: pointer to iwreq_data
10960 * @extra; extra
10961 *
10962 * Return: 0 on success, error number otherwise
10963 *
10964 */
10965static int iw_hdd_set_var_ints_getnone(struct net_device *dev,
10966 struct iw_request_info *info,
10967 union iwreq_data *wrqu, char *extra)
10968{
10969 union iwreq_data u_priv_wrqu;
10970 int apps_args[MAX_VAR_ARGS] = {0};
10971 int ret, num_args;
10972
Mukul Sharma64a70e82015-11-02 20:05:09 +053010973 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010974 hdd_err("permission check failed");
Mukul Sharma64a70e82015-11-02 20:05:09 +053010975 return -EPERM;
10976 }
10977
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010978 /* Helper function to get iwreq_data with compat handling. */
10979 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
10980 return -EINVAL;
10981
10982 if (NULL == u_priv_wrqu.data.pointer) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010983 hdd_err("NULL data pointer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010984 return -EINVAL;
10985 }
10986
10987 num_args = u_priv_wrqu.data.length;
10988 if (num_args > MAX_VAR_ARGS)
10989 num_args = MAX_VAR_ARGS;
10990
10991 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
10992 (sizeof(int)) * num_args)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010993 hdd_err("failed to copy data from user buffer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010994 return -EFAULT;
10995 }
10996
10997 cds_ssr_protect(__func__);
10998 ret = __iw_set_var_ints_getnone(dev, info, &u_priv_wrqu,
10999 (char *)&apps_args);
11000 cds_ssr_unprotect(__func__);
11001 return ret;
11002}
11003
11004/**
11005 * iw_set_var_ints_getnone - Generic "set many" private ioctl handler
11006 * @dev: device upon which the ioctl was received
11007 * @info: ioctl request information
11008 * @wrqu: ioctl request data
11009 * @extra: ioctl extra data
11010 *
11011 * This is a generic handler for private ioctls which take multiple
11012 * arguments. Note that this implementation is also somewhat unique
11013 * in that it is shared by both STA-mode and SAP-mode interfaces.
11014 *
11015 * Return: 0 on success, non-zero on error
11016 */
11017int iw_set_var_ints_getnone(struct net_device *dev,
11018 struct iw_request_info *info,
11019 union iwreq_data *wrqu, char *extra)
11020{
11021 int ret;
11022
11023 cds_ssr_protect(__func__);
11024 ret = __iw_set_var_ints_getnone(dev, info, wrqu, extra);
11025 cds_ssr_unprotect(__func__);
11026 return ret;
11027}
11028
11029/**
11030 * iw_add_tspec - Add TSpec private ioctl handler
11031 * @dev: device upon which the ioctl was received
11032 * @info: ioctl request information
11033 * @wrqu: ioctl request data
11034 * @extra: ioctl extra data
11035 *
11036 * Return: 0 on success, non-zero on error
11037 */
11038static int __iw_add_tspec(struct net_device *dev, struct iw_request_info *info,
11039 union iwreq_data *wrqu, char *extra)
11040{
11041 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11042 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
11043 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11044 int params[HDD_WLAN_WMM_PARAM_COUNT];
11045 sme_QosWmmTspecInfo tSpec;
11046 uint32_t handle;
11047 struct iw_point s_priv_data;
11048 hdd_context_t *hdd_ctx;
11049 int ret;
11050
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011051 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011052
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011053 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11054 ret = wlan_hdd_validate_context(hdd_ctx);
11055 if (0 != ret)
11056 return ret;
11057
Jeff Johnson441e1f72017-02-07 08:50:49 -080011058 ret = hdd_check_private_wext_control(hdd_ctx, info);
11059 if (0 != ret)
11060 return ret;
11061
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011062 /* make sure the application is sufficiently priviledged */
11063 /* note that the kernel will do this for "set" ioctls, but since */
11064 /* this ioctl wants to return status to user space it must be */
11065 /* defined as a "get" ioctl */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011066 if (!capable(CAP_NET_ADMIN))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011067 return -EPERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011068
11069 /* we must be associated in order to add a tspec */
11070 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
11071 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11072 return 0;
11073 }
11074 /* since we are defined to be a "get" ioctl, and since the number */
11075 /* of params exceeds the number of params that wireless extensions */
11076 /* will pass down in the iwreq_data, we must copy the "set" params. */
11077 /* We must handle the compat for iwreq_data in 32U/64K environment. */
11078
11079 /* helper function to get iwreq_data with compat handling. */
11080 if (hdd_priv_get_data(&s_priv_data, wrqu)) {
11081 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11082 return 0;
11083 }
11084 /* make sure all params are correctly passed to function */
11085 if ((NULL == s_priv_data.pointer) ||
11086 (HDD_WLAN_WMM_PARAM_COUNT != s_priv_data.length)) {
11087 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11088 return 0;
11089 }
11090 /* from user space ourselves */
11091 if (copy_from_user(&params, s_priv_data.pointer, sizeof(params))) {
11092 /* hmmm, can't get them */
11093 return -EIO;
11094 }
11095 /* clear the tspec */
11096 memset(&tSpec, 0, sizeof(tSpec));
11097
11098 /* validate the handle */
11099 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11100 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11101 /* that one is reserved */
11102 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11103 return 0;
11104 }
11105 /* validate the TID */
11106 if (params[HDD_WLAN_WMM_PARAM_TID] > 7) {
11107 /* out of range */
11108 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11109 return 0;
11110 }
11111 tSpec.ts_info.tid = params[HDD_WLAN_WMM_PARAM_TID];
11112
11113 /* validate the direction */
11114 switch (params[HDD_WLAN_WMM_PARAM_DIRECTION]) {
11115 case HDD_WLAN_WMM_DIRECTION_UPSTREAM:
11116 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_UPLINK;
11117 break;
11118
11119 case HDD_WLAN_WMM_DIRECTION_DOWNSTREAM:
11120 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_DOWNLINK;
11121 break;
11122
11123 case HDD_WLAN_WMM_DIRECTION_BIDIRECTIONAL:
11124 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_BOTH;
11125 break;
11126
11127 default:
11128 /* unknown */
11129 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11130 return 0;
11131 }
11132
11133 tSpec.ts_info.psb = params[HDD_WLAN_WMM_PARAM_APSD];
11134
11135 /* validate the user priority */
11136 if (params[HDD_WLAN_WMM_PARAM_USER_PRIORITY] >= SME_QOS_WMM_UP_MAX) {
11137 /* out of range */
11138 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11139 return 0;
11140 }
11141 tSpec.ts_info.up = params[HDD_WLAN_WMM_PARAM_USER_PRIORITY];
11142 if (0 > tSpec.ts_info.up || SME_QOS_WMM_UP_MAX < tSpec.ts_info.up) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011143 hdd_err("***ts_info.up out of bounds***");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011144 return 0;
11145 }
11146
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011147 hdd_debug("TS_INFO PSB %d UP %d !!!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011148 tSpec.ts_info.psb, tSpec.ts_info.up);
11149
11150 tSpec.nominal_msdu_size = params[HDD_WLAN_WMM_PARAM_NOMINAL_MSDU_SIZE];
11151 tSpec.maximum_msdu_size = params[HDD_WLAN_WMM_PARAM_MAXIMUM_MSDU_SIZE];
11152 tSpec.min_data_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_DATA_RATE];
11153 tSpec.mean_data_rate = params[HDD_WLAN_WMM_PARAM_MEAN_DATA_RATE];
11154 tSpec.peak_data_rate = params[HDD_WLAN_WMM_PARAM_PEAK_DATA_RATE];
11155 tSpec.max_burst_size = params[HDD_WLAN_WMM_PARAM_MAX_BURST_SIZE];
11156 tSpec.min_phy_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_PHY_RATE];
11157 tSpec.surplus_bw_allowance =
11158 params[HDD_WLAN_WMM_PARAM_SURPLUS_BANDWIDTH_ALLOWANCE];
11159 tSpec.min_service_interval =
11160 params[HDD_WLAN_WMM_PARAM_SERVICE_INTERVAL];
11161 tSpec.max_service_interval =
11162 params[HDD_WLAN_WMM_PARAM_MAX_SERVICE_INTERVAL];
11163 tSpec.suspension_interval =
11164 params[HDD_WLAN_WMM_PARAM_SUSPENSION_INTERVAL];
11165 tSpec.inactivity_interval =
11166 params[HDD_WLAN_WMM_PARAM_INACTIVITY_INTERVAL];
11167
11168 tSpec.ts_info.burst_size_defn =
11169 params[HDD_WLAN_WMM_PARAM_BURST_SIZE_DEFN];
11170
11171 /* validate the ts info ack policy */
11172 switch (params[HDD_WLAN_WMM_PARAM_ACK_POLICY]) {
11173 case HDD_WLAN_WMM_TS_INFO_ACK_POLICY_NORMAL_ACK:
11174 tSpec.ts_info.ack_policy = SME_QOS_WMM_TS_ACK_POLICY_NORMAL_ACK;
11175 break;
11176
11177 case HDD_WLAN_WMM_TS_INFO_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK:
11178 tSpec.ts_info.ack_policy =
11179 SME_QOS_WMM_TS_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK;
11180 break;
11181
11182 default:
11183 /* unknown */
11184 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11185 return 0;
11186 }
11187
11188 *pStatus = hdd_wmm_addts(pAdapter, handle, &tSpec);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011189 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011190 return 0;
11191}
11192
11193static int iw_add_tspec(struct net_device *dev,
11194 struct iw_request_info *info,
11195 union iwreq_data *wrqu, char *extra)
11196{
11197 int ret;
11198
11199 cds_ssr_protect(__func__);
11200 ret = __iw_add_tspec(dev, info, wrqu, extra);
11201 cds_ssr_unprotect(__func__);
11202
11203 return ret;
11204}
11205
11206/**
11207 * iw_del_tspec - Delete TSpec private ioctl handler
11208 * @dev: device upon which the ioctl was received
11209 * @info: ioctl request information
11210 * @wrqu: ioctl request data
11211 * @extra: ioctl extra data
11212 *
11213 * Return: 0 on success, non-zero on error
11214 */
11215static int __iw_del_tspec(struct net_device *dev, struct iw_request_info *info,
11216 union iwreq_data *wrqu, char *extra)
11217{
11218 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11219 hdd_context_t *hdd_ctx;
11220 int *params = (int *)extra;
11221 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11222 uint32_t handle;
11223 int ret;
11224
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011225 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011227 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11228 ret = wlan_hdd_validate_context(hdd_ctx);
11229 if (0 != ret)
11230 return ret;
11231
Jeff Johnson441e1f72017-02-07 08:50:49 -080011232 ret = hdd_check_private_wext_control(hdd_ctx, info);
11233 if (0 != ret)
11234 return ret;
11235
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011236 /* make sure the application is sufficiently priviledged */
11237 /* note that the kernel will do this for "set" ioctls, but since */
11238 /* this ioctl wants to return status to user space it must be */
11239 /* defined as a "get" ioctl */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011240 if (!capable(CAP_NET_ADMIN))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011241 return -EPERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011242
11243 /* although we are defined to be a "get" ioctl, the params we require */
11244 /* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
11245 /* is no need to copy the params from user space */
11246
11247 /* validate the handle */
11248 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11249 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11250 /* that one is reserved */
11251 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11252 return 0;
11253 }
11254
11255 *pStatus = hdd_wmm_delts(pAdapter, handle);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011256 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011257 return 0;
11258}
11259
11260static int iw_del_tspec(struct net_device *dev,
11261 struct iw_request_info *info,
11262 union iwreq_data *wrqu, char *extra)
11263{
11264 int ret;
11265
11266 cds_ssr_protect(__func__);
11267 ret = __iw_del_tspec(dev, info, wrqu, extra);
11268 cds_ssr_unprotect(__func__);
11269
11270 return ret;
11271}
11272
11273/**
11274 * iw_get_tspec - Get TSpec private ioctl handler
11275 * @dev: device upon which the ioctl was received
11276 * @info: ioctl request information
11277 * @wrqu: ioctl request data
11278 * @extra: ioctl extra data
11279 *
11280 * Return: 0 on success, non-zero on error
11281 */
11282static int __iw_get_tspec(struct net_device *dev, struct iw_request_info *info,
11283 union iwreq_data *wrqu, char *extra)
11284{
11285 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11286 hdd_context_t *hdd_ctx;
11287 int *params = (int *)extra;
11288 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11289 uint32_t handle;
11290 int ret;
11291
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011292 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011294 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11295 ret = wlan_hdd_validate_context(hdd_ctx);
11296 if (0 != ret)
11297 return ret;
11298
Jeff Johnson441e1f72017-02-07 08:50:49 -080011299 ret = hdd_check_private_wext_control(hdd_ctx, info);
11300 if (0 != ret)
11301 return ret;
11302
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011303 /* although we are defined to be a "get" ioctl, the params we require */
11304 /* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
11305 /* is no need to copy the params from user space */
11306
11307 /* validate the handle */
11308 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11309 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11310 /* that one is reserved */
11311 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11312 return 0;
11313 }
11314
11315 *pStatus = hdd_wmm_checkts(pAdapter, handle);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011316 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011317 return 0;
11318}
11319
11320static int iw_get_tspec(struct net_device *dev,
11321 struct iw_request_info *info,
11322 union iwreq_data *wrqu, char *extra)
11323{
11324 int ret;
11325
11326 cds_ssr_protect(__func__);
11327 ret = __iw_get_tspec(dev, info, wrqu, extra);
11328 cds_ssr_unprotect(__func__);
11329
11330 return ret;
11331}
11332
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011333/**
11334 * iw_set_fties - Set FT IEs private ioctl handler
11335 * @dev: device upon which the ioctl was received
11336 * @info: ioctl request information
11337 * @wrqu: ioctl request data
11338 * @extra: ioctl extra data
11339 *
11340 * Each time the supplicant has the auth_request or reassoc request
11341 * IEs ready they are pushed to the driver. The driver will in turn
11342 * use it to send out the auth req and reassoc req for 11r FT Assoc.
11343 *
11344 * Return: 0 on success, non-zero on error
11345 */
11346static int __iw_set_fties(struct net_device *dev, struct iw_request_info *info,
11347 union iwreq_data *wrqu, char *extra)
11348{
11349 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11350 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
11351 hdd_context_t *hdd_ctx;
11352 int ret;
11353
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011354 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011355
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011356 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11357 ret = wlan_hdd_validate_context(hdd_ctx);
11358 if (0 != ret)
11359 return ret;
11360
Jeff Johnson441e1f72017-02-07 08:50:49 -080011361 ret = hdd_check_private_wext_control(hdd_ctx, info);
11362 if (0 != ret)
11363 return ret;
11364
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011365 if (!wrqu->data.length) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011366 hdd_err("called with 0 length IEs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011367 return -EINVAL;
11368 }
11369 if (wrqu->data.pointer == NULL) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011370 hdd_err("called with NULL IE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011371 return -EINVAL;
11372 }
11373 /* Added for debug on reception of Re-assoc Req. */
11374 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011375 hdd_debug("Called with Ie of length = %d when not associated",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011376 wrqu->data.length);
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011377 hdd_debug("Should be Re-assoc Req IEs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011378 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011379 hdd_debug("called with Ie of length = %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011380
11381 /* Pass the received FT IEs to SME */
11382 sme_set_ft_ies(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId,
11383 extra, wrqu->data.length);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011384 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011385 return 0;
11386}
11387
11388static int iw_set_fties(struct net_device *dev,
11389 struct iw_request_info *info,
11390 union iwreq_data *wrqu, char *extra)
11391{
11392 int ret;
11393
11394 cds_ssr_protect(__func__);
11395 ret = __iw_set_fties(dev, info, wrqu, extra);
11396 cds_ssr_unprotect(__func__);
11397
11398 return ret;
11399}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011400
Dustin Brown0cbc7572016-12-16 13:54:40 -080011401/**
11402 * iw_set_dynamic_mcbc_filter() - Set Dynamic MCBC Filter ioctl handler
11403 * @dev: device upon which the ioctl was received
11404 * @info: ioctl request information
11405 * @wrqu: ioctl request data
11406 * @extra: ioctl extra data
11407 *
Dustin Brown860566f2017-01-31 15:24:43 -080011408 * This IOCTL is OBSOLETE as of Jan 30, 2017. We are leaving it here for the
11409 * time being to provide guidance in migrating to standard APIs.
11410 *
Dustin Brown0cbc7572016-12-16 13:54:40 -080011411 * Return: 0 on success, non-zero on error
11412 */
11413static int iw_set_dynamic_mcbc_filter(struct net_device *dev,
11414 struct iw_request_info *info,
11415 union iwreq_data *wrqu,
11416 char *extra)
11417{
Dustin Brown860566f2017-01-31 15:24:43 -080011418 hdd_err("\n"
11419 "setMCBCFilter is obsolete. Use the following instead:\n"
11420 "Configure multicast filtering via the ‘ip’ command.\n"
11421 "\tip maddr add 11:22:33:44:55:66 dev wlan0 # allow traffic to address\n"
11422 "\tip maddr del 11:22:33:44:55:66 dev wlan0 # undo allow\n"
11423 "Configure broadcast filtering via ini item, 'g_enable_non_arp_bc_hw_filter.'\n"
11424 "\tg_enable_non_arp_bc_hw_filter=1 # drop all non-ARP broadcast traffic\n"
11425 "\tg_enable_non_arp_bc_hw_filter=0 # allow all broadcast traffic");
Mukul Sharma3ba26b82017-01-12 21:59:41 +053011426 return -EINVAL;
Dustin Brown0cbc7572016-12-16 13:54:40 -080011427}
11428
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011429/**
11430 * iw_set_host_offload - Set host offload ioctl handler
11431 * @dev: device upon which the ioctl was received
11432 * @info: ioctl request information
11433 * @wrqu: ioctl request data
11434 * @extra: ioctl extra data
11435 *
11436 * Return: 0 on success, non-zero on error
11437 */
11438static int __iw_set_host_offload(struct net_device *dev,
11439 struct iw_request_info *info,
11440 union iwreq_data *wrqu, char *extra)
11441{
11442 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Srinivas Girigowda077143e2017-03-25 10:47:27 -070011443 struct host_offload_req *pRequest = (struct host_offload_req *) extra;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011444 tSirHostOffloadReq offloadRequest;
11445 hdd_context_t *hdd_ctx;
11446 int ret;
11447
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011448 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011449
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011450 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11451 ret = wlan_hdd_validate_context(hdd_ctx);
11452 if (0 != ret)
11453 return ret;
11454
Jeff Johnson441e1f72017-02-07 08:50:49 -080011455 ret = hdd_check_private_wext_control(hdd_ctx, info);
11456 if (0 != ret)
11457 return ret;
11458
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011459 if (!hdd_conn_is_connected(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011460 hdd_err("dev is not in CONNECTED state, ignore!!!");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011461 return -EINVAL;
11462 }
11463
11464 /* Debug display of request components. */
11465 switch (pRequest->offloadType) {
11466 case WLAN_IPV4_ARP_REPLY_OFFLOAD:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011467 hdd_debug("Host offload request: ARP reply");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011468 switch (pRequest->enableOrDisable) {
11469 case WLAN_OFFLOAD_DISABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011470 hdd_debug(" disable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011471 break;
11472 case WLAN_OFFLOAD_ARP_AND_BC_FILTER_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011473 hdd_debug(" BC Filtering enable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011474 case WLAN_OFFLOAD_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011475 hdd_debug(" ARP offload enable");
11476 hdd_debug(" IP address: %d.%d.%d.%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011477 pRequest->params.hostIpv4Addr[0],
11478 pRequest->params.hostIpv4Addr[1],
11479 pRequest->params.hostIpv4Addr[2],
11480 pRequest->params.hostIpv4Addr[3]);
11481 }
11482 break;
11483
11484 case WLAN_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011485 hdd_debug("Host offload request: neighbor discovery");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011486 switch (pRequest->enableOrDisable) {
11487 case WLAN_OFFLOAD_DISABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011488 hdd_debug(" disable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011489 break;
11490 case WLAN_OFFLOAD_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011491 hdd_debug(" enable");
11492 hdd_debug(" IP address: %x:%x:%x:%x:%x:%x:%x:%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011493 *(uint16_t *) (pRequest->params.hostIpv6Addr),
11494 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11495 2),
11496 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11497 4),
11498 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11499 6),
11500 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11501 8),
11502 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11503 10),
11504 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11505 12),
11506 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11507 14));
11508 }
11509 }
11510
11511 /* Execute offload request. The reason that we can copy the
11512 * request information from the ioctl structure to the SME
11513 * structure is that they are laid out exactly the same.
11514 * Otherwise, each piece of information would have to be
11515 * copied individually.
11516 */
11517 memcpy(&offloadRequest, pRequest, wrqu->data.length);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011518 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011519 sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
11520 pAdapter->sessionId, &offloadRequest)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011521 hdd_err("Failure to execute host offload request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011522 return -EINVAL;
11523 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011524 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011525 return 0;
11526}
11527
11528static int iw_set_host_offload(struct net_device *dev,
11529 struct iw_request_info *info,
11530 union iwreq_data *wrqu, char *extra)
11531{
11532 int ret;
11533
11534 cds_ssr_protect(__func__);
11535 ret = __iw_set_host_offload(dev, info, wrqu, extra);
11536 cds_ssr_unprotect(__func__);
11537
11538 return ret;
11539}
11540
11541/**
11542 * iw_set_keepalive_params - Set keepalive params ioctl handler
11543 * @dev: device upon which the ioctl was received
11544 * @info: ioctl request information
11545 * @wrqu: ioctl request data
11546 * @extra: ioctl extra data
11547 *
11548 * Return: 0 on success, non-zero on error
11549 */
11550static int __iw_set_keepalive_params(struct net_device *dev,
11551 struct iw_request_info *info,
11552 union iwreq_data *wrqu, char *extra)
11553{
11554 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011555 tpSirKeepAliveReq request = (tpSirKeepAliveReq) extra;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011556 hdd_context_t *hdd_ctx;
11557 int ret;
11558
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011559 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011560
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011561 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11562 ret = wlan_hdd_validate_context(hdd_ctx);
11563 if (0 != ret)
11564 return ret;
11565
Jeff Johnson441e1f72017-02-07 08:50:49 -080011566 ret = hdd_check_private_wext_control(hdd_ctx, info);
11567 if (0 != ret)
11568 return ret;
11569
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011570 if (wrqu->data.length != sizeof(*request)) {
11571 hdd_err("Invalid length %d", wrqu->data.length);
11572 return -EINVAL;
11573 }
11574
11575 if (request->timePeriod > WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD_STAMAX) {
11576 hdd_err("Value of timePeriod %d exceed Max limit %d",
11577 request->timePeriod,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011578 WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD_STAMAX);
11579 return -EINVAL;
11580 }
11581
11582 /* Debug display of request components. */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011583 hdd_debug("Set Keep Alive Request : TimePeriod %d size %zu",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011584 request->timePeriod, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011585
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011586 switch (request->packetType) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011587 case WLAN_KEEP_ALIVE_NULL_PKT:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011588 hdd_debug("Keep Alive Request: Tx NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011589 break;
11590
11591 case WLAN_KEEP_ALIVE_UNSOLICIT_ARP_RSP:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011592 hdd_debug("Keep Alive Request: Tx UnSolicited ARP RSP");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011593
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011594 hdd_debug("Host IP address: %d.%d.%d.%d",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011595 request->hostIpv4Addr[0], request->hostIpv4Addr[1],
11596 request->hostIpv4Addr[2], request->hostIpv4Addr[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011597
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011598 hdd_debug("Dest IP address: %d.%d.%d.%d",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011599 request->destIpv4Addr[0], request->destIpv4Addr[1],
11600 request->destIpv4Addr[2], request->destIpv4Addr[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011601
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011602 hdd_debug("Dest MAC address: "MAC_ADDRESS_STR,
Srinivas Girigowda9c330a92015-11-24 12:28:25 -080011603 MAC_ADDR_ARRAY(request->dest_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011604 break;
11605 }
11606
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011607 hdd_debug("Keep alive period %d", request->timePeriod);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011608
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011609 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011610 sme_set_keep_alive(WLAN_HDD_GET_HAL_CTX(pAdapter),
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011611 pAdapter->sessionId, request)) {
11612 hdd_err("Failure to execute Keep Alive");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011613 return -EINVAL;
11614 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011615 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011616 return 0;
11617}
11618
11619static int iw_set_keepalive_params(struct net_device *dev,
11620 struct iw_request_info *info,
11621 union iwreq_data *wrqu,
11622 char *extra)
11623{
11624 int ret;
11625
11626 cds_ssr_protect(__func__);
11627 ret = __iw_set_keepalive_params(dev, info, wrqu, extra);
11628 cds_ssr_unprotect(__func__);
11629
11630 return ret;
11631}
11632
11633#ifdef WLAN_FEATURE_PACKET_FILTERING
11634/**
11635 * wlan_hdd_set_filter() - Set packet filter
11636 * @hdd_ctx: Global HDD context
11637 * @request: Packet filter request struct
11638 * @sessionId: Target session for the request
11639 *
11640 * Return: 0 on success, non-zero on error
11641 */
11642static int wlan_hdd_set_filter(hdd_context_t *hdd_ctx,
11643 struct pkt_filter_cfg *request,
11644 uint8_t sessionId)
11645{
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011646 struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req = NULL;
11647 struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011648 int i = 0;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011649 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011650
11651 if (hdd_ctx->config->disablePacketFilter) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011652 hdd_warn("Packet filtering disabled in ini");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011653 return 0;
11654 }
11655
11656 /* Debug display of request components. */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011657 hdd_debug("Packet Filter Request : FA %d params %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011658 request->filter_action, request->num_params);
11659
11660 switch (request->filter_action) {
11661 case HDD_RCV_FILTER_SET:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011662 hdd_debug("Set Packet Filter Request for Id: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011663 request->filter_id);
11664
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011665 pmo_set_pkt_fltr_req =
11666 qdf_mem_malloc(sizeof(*pmo_set_pkt_fltr_req));
11667 if (!pmo_set_pkt_fltr_req) {
Mukul Sharmad75a6672017-06-22 15:40:53 +053011668 hdd_err("unable to allocate pmo_set_pkt_fltr_req");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011669 return QDF_STATUS_E_NOMEM;
11670 }
11671
11672 pmo_set_pkt_fltr_req->filter_id = request->filter_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011673 if (request->num_params >= HDD_MAX_CMP_PER_PACKET_FILTER) {
11674 hdd_err("Number of Params exceed Max limit %d",
11675 request->num_params);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011676 status = QDF_STATUS_E_INVAL;
11677 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011678 }
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011679 pmo_set_pkt_fltr_req->num_params = request->num_params;
11680 pmo_set_pkt_fltr_req->coalesce_time = 0;
Srinivas Girigowdabbbecad2017-06-28 16:01:48 -070011681 pmo_set_pkt_fltr_req->filter_type = PMO_RCV_FILTER_TYPE_FILTER_PKT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011682 for (i = 0; i < request->num_params; i++) {
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011683 pmo_set_pkt_fltr_req->params_data[i].protocol_layer =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011684 request->params_data[i].protocol_layer;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011685 pmo_set_pkt_fltr_req->params_data[i].compare_flag =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011686 request->params_data[i].compare_flag;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011687 pmo_set_pkt_fltr_req->params_data[i].data_offset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011688 request->params_data[i].data_offset;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011689 pmo_set_pkt_fltr_req->params_data[i].data_length =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011690 request->params_data[i].data_length;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011691 pmo_set_pkt_fltr_req->params_data[i].reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011692
Dustin Brown4d1e8462016-12-14 12:12:24 -080011693 if (request->params_data[i].data_offset >
11694 SIR_MAX_FILTER_TEST_DATA_OFFSET) {
11695 hdd_err("Invalid data offset %u for param %d (max = %d)",
11696 request->params_data[i].data_offset,
11697 i,
11698 SIR_MAX_FILTER_TEST_DATA_OFFSET);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011699 status = QDF_STATUS_E_INVAL;
11700 goto out;
Dustin Brown4d1e8462016-12-14 12:12:24 -080011701 }
11702
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011703 if (request->params_data[i].data_length >
11704 SIR_MAX_FILTER_TEST_DATA_LEN) {
11705 hdd_err("Error invalid data length %d",
11706 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011707 status = QDF_STATUS_E_INVAL;
11708 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011709 }
11710
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011711 hdd_debug("Proto %d Comp Flag %d Filter Type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011712 request->params_data[i].protocol_layer,
11713 request->params_data[i].compare_flag,
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011714 pmo_set_pkt_fltr_req->filter_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011715
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011716 hdd_debug("Data Offset %d Data Len %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011717 request->params_data[i].data_offset,
11718 request->params_data[i].data_length);
11719
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011720 if (sizeof(
11721 pmo_set_pkt_fltr_req->params_data[i].compare_data)
Rajeev Kumarf5b6da22016-04-15 13:24:03 -070011722 < (request->params_data[i].data_length)) {
11723 hdd_err("Error invalid data length %d",
11724 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011725 status = QDF_STATUS_E_INVAL;
11726 goto out;
Rajeev Kumarf5b6da22016-04-15 13:24:03 -070011727 }
11728
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011729 memcpy(
11730 &pmo_set_pkt_fltr_req->params_data[i].compare_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011731 request->params_data[i].compare_data,
11732 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011733 memcpy(&pmo_set_pkt_fltr_req->params_data[i].data_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011734 request->params_data[i].data_mask,
11735 request->params_data[i].data_length);
11736
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011737 hdd_debug("CData %d CData %d CData %d CData %d CData %d CData %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011738 request->params_data[i].compare_data[0],
11739 request->params_data[i].compare_data[1],
11740 request->params_data[i].compare_data[2],
11741 request->params_data[i].compare_data[3],
11742 request->params_data[i].compare_data[4],
11743 request->params_data[i].compare_data[5]);
11744
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011745 hdd_debug("MData %d MData %d MData %d MData %d MData %d MData %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011746 request->params_data[i].data_mask[0],
11747 request->params_data[i].data_mask[1],
11748 request->params_data[i].data_mask[2],
11749 request->params_data[i].data_mask[3],
11750 request->params_data[i].data_mask[4],
11751 request->params_data[i].data_mask[5]);
11752 }
11753
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011754 if (QDF_STATUS_SUCCESS !=
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011755 pmo_ucfg_set_pkt_filter(hdd_ctx->hdd_psoc,
11756 pmo_set_pkt_fltr_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011757 sessionId)) {
11758 hdd_err("Failure to execute Set Filter");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011759 status = QDF_STATUS_E_INVAL;
11760 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011761 }
11762
11763 break;
11764
11765 case HDD_RCV_FILTER_CLEAR:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011766 hdd_debug("Clear Packet Filter Request for Id: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011767 request->filter_id);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011768
11769 pmo_clr_pkt_fltr_param = qdf_mem_malloc(
11770 sizeof(*pmo_clr_pkt_fltr_param));
11771 if (!pmo_clr_pkt_fltr_param) {
11772 hdd_err("unable to allocate pmo_clr_pkt_fltr_param");
11773 return QDF_STATUS_E_NOMEM;
11774 }
11775
11776 pmo_clr_pkt_fltr_param->filter_id = request->filter_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011777 if (QDF_STATUS_SUCCESS !=
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011778 pmo_ucfg_clear_pkt_filter(hdd_ctx->hdd_psoc,
11779 pmo_clr_pkt_fltr_param,
11780 sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011781 hdd_err("Failure to execute Clear Filter");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011782 status = QDF_STATUS_E_INVAL;
11783 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011784 }
11785 break;
11786
11787 default:
11788 hdd_err("Packet Filter Request: Invalid %d",
11789 request->filter_action);
11790 return -EINVAL;
11791 }
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011792
11793out:
11794 if (pmo_set_pkt_fltr_req)
11795 qdf_mem_free(pmo_set_pkt_fltr_req);
11796 if (pmo_clr_pkt_fltr_param)
11797 qdf_mem_free(pmo_clr_pkt_fltr_param);
11798
11799 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011800}
11801
11802/**
11803 * __iw_set_packet_filter_params() - set packet filter parameters in target
11804 * @dev: Pointer to netdev
11805 * @info: Pointer to iw request info
11806 * @wrqu: Pointer to data
11807 * @extra: Pointer to extra data
11808 *
11809 * Return: 0 on success, non-zero on error
11810 */
11811static int __iw_set_packet_filter_params(struct net_device *dev,
11812 struct iw_request_info *info,
11813 union iwreq_data *wrqu, char *extra)
11814{
11815 int ret;
11816 hdd_context_t *hdd_ctx;
11817 struct iw_point priv_data;
11818 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
11819 struct pkt_filter_cfg *request = NULL;
11820
Mukul Sharma472382f2015-11-02 20:16:31 +053011821 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011822 hdd_err("permission check failed");
Mukul Sharma472382f2015-11-02 20:16:31 +053011823 return -EPERM;
11824 }
11825
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011826 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011827
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011828 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
11829 ret = wlan_hdd_validate_context(hdd_ctx);
11830 if (0 != ret)
11831 return ret;
11832
Jeff Johnson441e1f72017-02-07 08:50:49 -080011833 ret = hdd_check_private_wext_control(hdd_ctx, info);
11834 if (0 != ret)
11835 return ret;
11836
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011837 if (hdd_priv_get_data(&priv_data, wrqu)) {
11838 hdd_err("failed to get priv data");
11839 return -EINVAL;
11840 }
11841
11842 if ((NULL == priv_data.pointer) || (0 == priv_data.length)) {
11843 hdd_err("invalid priv data %p or invalid priv data length %d",
11844 priv_data.pointer, priv_data.length);
11845 return -EINVAL;
11846 }
11847
Mukul Sharmabe846bb2017-05-09 17:41:52 +053011848 if (!hdd_conn_is_connected(WLAN_HDD_GET_STATION_CTX_PTR(adapter))) {
11849 hdd_err("Packet filter not supported in disconnected state");
11850 return -ENOTSUPP;
11851 }
11852
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011853 /* copy data using copy_from_user */
11854 request = mem_alloc_copy_from_user_helper(priv_data.pointer,
11855 priv_data.length);
11856 if (NULL == request) {
11857 hdd_err("mem_alloc_copy_from_user_helper fail");
11858 return -ENOMEM;
11859 }
11860
11861 ret = wlan_hdd_set_filter(hdd_ctx, request, adapter->sessionId);
11862
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -070011863 qdf_mem_free(request);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011864 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011865 return ret;
11866}
11867
11868/**
11869 * iw_set_packet_filter_params() - set packet filter parameters in target
11870 * @dev: Pointer to netdev
11871 * @info: Pointer to iw request info
11872 * @wrqu: Pointer to data
11873 * @extra: Pointer to extra data
11874 *
11875 * Return: 0 on success, non-zero on error
11876 */
11877static int iw_set_packet_filter_params(struct net_device *dev,
11878 struct iw_request_info *info,
11879 union iwreq_data *wrqu, char *extra)
11880{
11881 int ret;
11882
11883 cds_ssr_protect(__func__);
11884 ret = __iw_set_packet_filter_params(dev, info, wrqu, extra);
11885 cds_ssr_unprotect(__func__);
11886
11887 return ret;
11888}
11889#endif
11890
11891
11892static int __iw_get_statistics(struct net_device *dev,
11893 struct iw_request_info *info,
11894 union iwreq_data *wrqu, char *extra)
11895{
11896
Anurag Chouhance0dc992016-02-16 18:18:03 +053011897 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011898 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011899 hdd_wext_state_t *pWextState;
11900 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11901 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11902 char *p = extra;
11903 int tlen = 0;
11904 tCsrSummaryStatsInfo *pStats = &(pAdapter->hdd_stats.summary_stat);
11905 tCsrGlobalClassAStatsInfo *aStats = &(pAdapter->hdd_stats.ClassA_stat);
11906 tCsrGlobalClassDStatsInfo *dStats = &(pAdapter->hdd_stats.ClassD_stat);
11907 int ret;
11908
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011909 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011910
11911 ret = wlan_hdd_validate_context(hdd_ctx);
11912 if (0 != ret)
11913 return ret;
11914
Jeff Johnson441e1f72017-02-07 08:50:49 -080011915 ret = hdd_check_private_wext_control(hdd_ctx, info);
11916 if (0 != ret)
11917 return ret;
11918
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011919 if (eConnectionState_Associated !=
11920 (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) {
11921
11922 wrqu->txpower.value = 0;
11923 } else {
11924 status = sme_get_statistics(hdd_ctx->hHal, eCSR_HDD,
11925 SME_SUMMARY_STATS |
11926 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -080011927 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -070011928 hdd_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011929 (WLAN_HDD_GET_STATION_CTX_PTR
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011930 (pAdapter))->conn_info.staId[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011931 pAdapter, pAdapter->sessionId);
11932
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011933 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011934 hdd_err("Unable to retrieve SME statistics");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011935 return -EINVAL;
11936 }
11937
11938 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
11939
Anurag Chouhance0dc992016-02-16 18:18:03 +053011940 qdf_status =
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053011941 qdf_wait_single_event(&pWextState->hdd_qdf_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011942 WLAN_WAIT_TIME_STATS);
Anurag Chouhance0dc992016-02-16 18:18:03 +053011943 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011944 hdd_err("SME timeout while retrieving statistics");
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011945 /* Remove the SME statistics list by
11946 * passing NULL in callback argument
11947 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011948 status = sme_get_statistics(hdd_ctx->hHal, eCSR_HDD,
11949 SME_SUMMARY_STATS |
11950 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -080011951 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -070011952 NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011953 (WLAN_HDD_GET_STATION_CTX_PTR
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011954 (pAdapter))->conn_info.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011955 staId[0], pAdapter,
11956 pAdapter->sessionId);
11957
11958 return -EINVAL;
11959 }
11960 FILL_TLV(p, (uint8_t) WLAN_STATS_RETRY_CNT,
11961 (uint8_t) sizeof(pStats->retry_cnt),
11962 (char *)&(pStats->retry_cnt[0]), tlen);
11963
11964 FILL_TLV(p, (uint8_t) WLAN_STATS_MUL_RETRY_CNT,
11965 (uint8_t) sizeof(pStats->multiple_retry_cnt),
11966 (char *)&(pStats->multiple_retry_cnt[0]), tlen);
11967
11968 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_FRM_CNT,
11969 (uint8_t) sizeof(pStats->tx_frm_cnt),
11970 (char *)&(pStats->tx_frm_cnt[0]), tlen);
11971
11972 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_FRM_CNT,
11973 (uint8_t) sizeof(pStats->rx_frm_cnt),
11974 (char *)&(pStats->rx_frm_cnt), tlen);
11975
11976 FILL_TLV(p, (uint8_t) WLAN_STATS_FRM_DUP_CNT,
11977 (uint8_t) sizeof(pStats->frm_dup_cnt),
11978 (char *)&(pStats->frm_dup_cnt), tlen);
11979
11980 FILL_TLV(p, (uint8_t) WLAN_STATS_FAIL_CNT,
11981 (uint8_t) sizeof(pStats->fail_cnt),
11982 (char *)&(pStats->fail_cnt[0]), tlen);
11983
11984 FILL_TLV(p, (uint8_t) WLAN_STATS_RTS_FAIL_CNT,
11985 (uint8_t) sizeof(pStats->rts_fail_cnt),
11986 (char *)&(pStats->rts_fail_cnt), tlen);
11987
11988 FILL_TLV(p, (uint8_t) WLAN_STATS_ACK_FAIL_CNT,
11989 (uint8_t) sizeof(pStats->ack_fail_cnt),
11990 (char *)&(pStats->ack_fail_cnt), tlen);
11991
11992 FILL_TLV(p, (uint8_t) WLAN_STATS_RTS_SUC_CNT,
11993 (uint8_t) sizeof(pStats->rts_succ_cnt),
11994 (char *)&(pStats->rts_succ_cnt), tlen);
11995
11996 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_DISCARD_CNT,
11997 (uint8_t) sizeof(pStats->rx_discard_cnt),
11998 (char *)&(pStats->rx_discard_cnt), tlen);
11999
12000 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_ERROR_CNT,
12001 (uint8_t) sizeof(pStats->rx_error_cnt),
12002 (char *)&(pStats->rx_error_cnt), tlen);
12003
12004 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_BYTE_CNT,
12005 (uint8_t) sizeof(dStats->tx_uc_byte_cnt[0]),
12006 (char *)&(dStats->tx_uc_byte_cnt[0]), tlen);
12007
12008 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_BYTE_CNT,
12009 (uint8_t) sizeof(dStats->rx_byte_cnt),
12010 (char *)&(dStats->rx_byte_cnt), tlen);
12011
12012 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_RATE,
12013 (uint8_t) sizeof(dStats->rx_rate),
12014 (char *)&(dStats->rx_rate), tlen);
12015
12016 /* Transmit rate, in units of 500 kbit/sec */
12017 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_RATE,
12018 (uint8_t) sizeof(aStats->tx_rate),
12019 (char *)&(aStats->tx_rate), tlen);
12020
12021 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_UC_BYTE_CNT,
12022 (uint8_t) sizeof(dStats->rx_uc_byte_cnt[0]),
12023 (char *)&(dStats->rx_uc_byte_cnt[0]), tlen);
12024 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_MC_BYTE_CNT,
12025 (uint8_t) sizeof(dStats->rx_mc_byte_cnt),
12026 (char *)&(dStats->rx_mc_byte_cnt), tlen);
12027 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_BC_BYTE_CNT,
12028 (uint8_t) sizeof(dStats->rx_bc_byte_cnt),
12029 (char *)&(dStats->rx_bc_byte_cnt), tlen);
12030 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_UC_BYTE_CNT,
12031 (uint8_t) sizeof(dStats->tx_uc_byte_cnt[0]),
12032 (char *)&(dStats->tx_uc_byte_cnt[0]), tlen);
12033 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_MC_BYTE_CNT,
12034 (uint8_t) sizeof(dStats->tx_mc_byte_cnt),
12035 (char *)&(dStats->tx_mc_byte_cnt), tlen);
12036 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_BC_BYTE_CNT,
12037 (uint8_t) sizeof(dStats->tx_bc_byte_cnt),
12038 (char *)&(dStats->tx_bc_byte_cnt), tlen);
12039
12040 wrqu->data.length = tlen;
12041
12042 }
12043
12044 EXIT();
12045
12046 return 0;
12047}
12048
12049static int iw_get_statistics(struct net_device *dev,
12050 struct iw_request_info *info,
12051 union iwreq_data *wrqu, char *extra)
12052{
12053 int ret;
12054
12055 cds_ssr_protect(__func__);
12056 ret = __iw_get_statistics(dev, info, wrqu, extra);
12057 cds_ssr_unprotect(__func__);
12058
12059 return ret;
12060}
12061
12062#ifdef FEATURE_WLAN_SCAN_PNO
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012063/*Max Len for PNO notification*/
12064#define MAX_PNO_NOTIFY_LEN 100
Abhishek Singh0481d662017-04-11 18:20:11 +053012065static void found_pref_network_cb(struct wlan_objmgr_vdev *vdev,
12066 struct scan_event *event, void *args)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012067{
Abhishek Singh0481d662017-04-11 18:20:11 +053012068 struct vdev_osif_priv *osif_priv;
12069 struct wireless_dev *wdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012070 union iwreq_data wrqu;
12071 char buf[MAX_PNO_NOTIFY_LEN + 1];
12072
Abhishek Singh0481d662017-04-11 18:20:11 +053012073 wlan_vdev_obj_lock(vdev);
12074 osif_priv = wlan_vdev_get_ospriv(vdev);
12075 wlan_vdev_obj_unlock(vdev);
12076 if (!osif_priv) {
12077 hdd_err("osif_priv is null");
12078 return;
12079 }
12080
12081 wdev = osif_priv->wdev;
12082 if (!wdev) {
12083 hdd_err("wdev is null");
12084 return;
12085 }
12086
12087 hdd_debug("A preferred network was found");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012088
12089 /* create the event */
Abhishek Singh0481d662017-04-11 18:20:11 +053012090 qdf_mem_zero(&wrqu, sizeof(wrqu));
12091 qdf_mem_zero(buf, sizeof(buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012092
12093 snprintf(buf, MAX_PNO_NOTIFY_LEN,
Abhishek Singh0481d662017-04-11 18:20:11 +053012094 "QCOM: Found preferred network:");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012095
12096 wrqu.data.pointer = buf;
12097 wrqu.data.length = strlen(buf);
12098
12099 /* send the event */
12100
Abhishek Singh0481d662017-04-11 18:20:11 +053012101 wireless_send_event(wdev->netdev, IWEVCUSTOM, &wrqu, buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012102}
12103
12104/**
12105 * __iw_set_pno() - Preferred Network Offload ioctl handler
12106 * @dev: device upon which the ioctl was received
12107 * @info: ioctl request information
12108 * @wrqu: ioctl request data
12109 * @extra: ioctl extra data
12110 *
12111 * This function parses a Preferred Network Offload command
12112 * Input is string based and expected to be of the form:
12113 *
12114 * <enable(1) | disable(0)>
12115 * when enabling:
12116 * <number of networks>
12117 * for each network:
12118 * <ssid_len> <ssid> <authentication> <encryption>
12119 * <ch_num> <channel_list optional> <bcast_type> <rssi_threshold>
Dustin Brown43e87292016-10-10 10:38:25 -070012120 * <scan_time (seconds)>
12121 * <scan_repeat_count (0 means indefinite)>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012122 * <suspend mode>
12123 *
12124 * e.g:
Dustin Brown43e87292016-10-10 10:38:25 -070012125 * 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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012126 *
12127 * this translates into:
12128 * -----------------------------
12129 * enable PNO
12130 * 2 networks
12131 * Network 1:
12132 * test - with authentication type 0 and encryption type 0,
12133 * search on 3 channels: 1 6 and 11,
12134 * SSID bcast type is unknown (directed probe will be sent if
12135 * AP not found) and must meet -40dBm RSSI
12136 * Network 2:
12137 * test2 - with authentication type 4 and encryption type 4,
12138 * search on 6 channels 1, 2, 3, 4, 5 and 6
12139 * bcast type is non-bcast (directed probe will be sent)
12140 * and must not meet any RSSI threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012141 * scan every 5 seconds 2 times
Dustin Brown43e87292016-10-10 10:38:25 -070012142 * enable on suspend
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012143 */
12144static int __iw_set_pno(struct net_device *dev,
12145 struct iw_request_info *info,
12146 union iwreq_data *wrqu, char *extra)
12147{
12148 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
12149 hdd_context_t *hdd_ctx;
Abhishek Singh0481d662017-04-11 18:20:11 +053012150 uint8_t value;
12151 struct wlan_objmgr_vdev *vdev;
12152 struct wlan_objmgr_psoc *psoc;
12153 int ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012154 int offset;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012155 char *ptr, *data;
Abhishek Singh0481d662017-04-11 18:20:11 +053012156 uint8_t i, j, params;
12157 QDF_STATUS status;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012158 size_t len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012159
12160 /* request is a large struct, so we make it static to avoid
12161 * stack overflow. This API is only invoked via ioctl, so it
12162 * is serialized by the kernel rtnl_lock and hence does not
12163 * need to be reentrant
12164 */
Abhishek Singh0481d662017-04-11 18:20:11 +053012165 static struct pno_scan_req_params req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012166
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012167 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012168
12169 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12170 ret = wlan_hdd_validate_context(hdd_ctx);
12171 if (ret)
12172 return ret;
12173
Jeff Johnson441e1f72017-02-07 08:50:49 -080012174 ret = hdd_check_private_wext_control(hdd_ctx, info);
12175 if (0 != ret)
12176 return ret;
12177
Abhishek Singh0481d662017-04-11 18:20:11 +053012178 vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(hdd_ctx->hdd_pdev,
12179 dev->dev_addr, WLAN_LEGACY_MAC_ID);
12180 if (!vdev) {
12181 hdd_err("vdev object is NULL");
12182 return -EIO;
12183 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012184
Abhishek Singh0481d662017-04-11 18:20:11 +053012185 hdd_debug("PNO data len %d data %s", wrqu->data.length, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012186
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012187 /* making sure argument string ends with '\0' */
12188 len = (wrqu->data.length + 1);
12189 data = qdf_mem_malloc(len);
12190 if (!data) {
12191 hdd_err("fail to allocate memory %zu", len);
12192 return -EINVAL;
12193 }
12194 qdf_mem_copy(data, extra, (len-1));
12195 data[len] = '\0';
12196 ptr = data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012197
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012198 if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012199 hdd_err("PNO enable input is not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012200 ret = -EINVAL;
12201 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012202 }
12203
Abhishek Singh0481d662017-04-11 18:20:11 +053012204 if (!value) {
12205 status = ucfg_scan_pno_stop(vdev);
12206 if (QDF_IS_STATUS_ERROR(status)) {
12207 hdd_err("Failed to disabled PNO");
12208 ret = -EINVAL;
12209 } else {
12210 hdd_debug("PNO scan disabled");
12211 }
12212 goto exit;
12213 }
12214
12215 if (ucfg_scan_get_pno_in_progress(vdev)) {
12216 hdd_debug("pno is already in progress");
12217 ret = -EBUSY;
12218 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012219 }
12220
12221 ptr += offset;
12222
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012223 if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012224 hdd_err("PNO count input not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012225 ret = -EINVAL;
12226 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012227 }
Abhishek Singh0481d662017-04-11 18:20:11 +053012228 req.networks_cnt = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012229
Abhishek Singh0481d662017-04-11 18:20:11 +053012230 hdd_debug("PNO enable networks count %d offset %d",
12231 req.networks_cnt, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012232
Abhishek Singh0481d662017-04-11 18:20:11 +053012233 if ((0 == req.networks_cnt) ||
12234 (req.networks_cnt > SCAN_PNO_MAX_SUPP_NETWORKS)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012235 hdd_err("Network count %d invalid",
Abhishek Singh0481d662017-04-11 18:20:11 +053012236 req.networks_cnt);
12237 ret = -EINVAL;
12238 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012239 }
12240
12241 ptr += offset;
12242
Abhishek Singh0481d662017-04-11 18:20:11 +053012243 for (i = 0; i < req.networks_cnt; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012244
Abhishek Singh0481d662017-04-11 18:20:11 +053012245 req.networks_list[i].ssid.length = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012246
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012247 params = sscanf(ptr, " %hhu %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012248 &(req.networks_list[i].ssid.length),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012249 &offset);
12250
12251 if (1 != params) {
12252 hdd_err("PNO ssid length input is not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012253 ret = -EINVAL;
12254 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012255 }
12256
Abhishek Singh0481d662017-04-11 18:20:11 +053012257 if ((0 == req.networks_list[i].ssid.length) ||
12258 (req.networks_list[i].ssid.length > 32)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012259 hdd_err("SSID Len %d is not correct for network %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012260 req.networks_list[i].ssid.length, i);
12261 ret = -EINVAL;
12262 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012263 }
12264
12265 /* Advance to SSID */
12266 ptr += offset;
12267
Abhishek Singh0481d662017-04-11 18:20:11 +053012268 memcpy(req.networks_list[i].ssid.ssid, ptr,
12269 req.networks_list[i].ssid.length);
12270 ptr += req.networks_list[i].ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012271
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012272 params = sscanf(ptr, " %u %u %hhu %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012273 &(req.networks_list[i].authentication),
12274 &(req.networks_list[i].encryption),
12275 &(req.networks_list[i].channel_cnt),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012276 &offset);
12277
12278 if (3 != params) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012279 hdd_err("Incorrect cmd %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012280 ret = -EINVAL;
12281 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012282 }
12283
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012284 hdd_debug("PNO len %d ssid %.*s auth %d encry %d channel count %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012285 req.networks_list[i].ssid.length,
12286 req.networks_list[i].ssid.length,
12287 req.networks_list[i].ssid.ssid,
12288 req.networks_list[i].authentication,
12289 req.networks_list[i].encryption,
12290 req.networks_list[i].channel_cnt, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012291
12292 /* Advance to channel list */
12293 ptr += offset;
12294
Abhishek Singh0481d662017-04-11 18:20:11 +053012295 if (SCAN_PNO_MAX_NETW_CHANNELS_EX <
12296 req.networks_list[i].channel_cnt) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012297 hdd_err("Incorrect number of channels");
Abhishek Singh0481d662017-04-11 18:20:11 +053012298 ret = -EINVAL;
12299 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012300 }
12301
Abhishek Singh0481d662017-04-11 18:20:11 +053012302 if (0 != req.networks_list[i].channel_cnt) {
12303 for (j = 0; j < req.networks_list[i].channel_cnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012304 j++) {
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012305 if (1 != sscanf(ptr, " %hhu %n", &value,
Abhishek Singh0481d662017-04-11 18:20:11 +053012306 &offset)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012307 hdd_err("PNO network channel is not valid %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012308 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012309 ret = -EINVAL;
12310 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012311 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012312 if (!IS_CHANNEL_VALID(value)) {
12313 hdd_err("invalid channel: %hhu", value);
12314 ret = -EINVAL;
12315 goto exit;
12316 }
Abhishek Singh0481d662017-04-11 18:20:11 +053012317 req.networks_list[i].channels[j] =
12318 cds_chan_to_freq(value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012319 /* Advance to next channel number */
12320 ptr += offset;
12321 }
12322 }
12323
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012324 if (1 != sscanf(ptr, " %u %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012325 &(req.networks_list[i].bc_new_type),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012326 &offset)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012327 hdd_err("PNO broadcast network type is not valid %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012328 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012329 ret = -EINVAL;
12330 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012331 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012332 if (req.networks_list[i].bc_new_type > 2) {
12333 hdd_err("invalid bcast nw type: %u",
12334 req.networks_list[i].bc_new_type);
12335 ret = -EINVAL;
12336 goto exit;
12337 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012338
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012339 hdd_debug("PNO bcastNetwType %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012340 req.networks_list[i].bc_new_type, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012341
12342 /* Advance to rssi Threshold */
12343 ptr += offset;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012344 if (1 != sscanf(ptr, " %d %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012345 &(req.networks_list[i].rssi_thresh),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012346 &offset)) {
12347 hdd_err("PNO rssi threshold input is not valid %s",
12348 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012349 ret = -EINVAL;
12350 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012351 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012352 hdd_debug("PNO rssi %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012353 req.networks_list[i].rssi_thresh, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012354 /* Advance to next network */
12355 ptr += offset;
12356 } /* For ucNetworkCount */
12357
Abhishek Singh0481d662017-04-11 18:20:11 +053012358 req.fast_scan_period = 0;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012359 if (sscanf(ptr, " %u %n", &(req.fast_scan_period), &offset) > 0) {
Abhishek Singh0481d662017-04-11 18:20:11 +053012360 req.fast_scan_period *= MSEC_PER_SEC;
Dustin Brown43e87292016-10-10 10:38:25 -070012361 ptr += offset;
12362 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012363 if (req.fast_scan_period == 0) {
12364 hdd_err("invalid fast scan period %u",
12365 req.fast_scan_period);
12366 ret = -EINVAL;
12367 goto exit;
12368 }
Dustin Brown43e87292016-10-10 10:38:25 -070012369
Abhishek Singh0481d662017-04-11 18:20:11 +053012370 req.fast_scan_max_cycles = 0;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012371 if (sscanf(ptr, " %hhu %n", &value,
Dustin Brown43e87292016-10-10 10:38:25 -070012372 &offset) > 0)
12373 ptr += offset;
Abhishek Singh0481d662017-04-11 18:20:11 +053012374 req.fast_scan_max_cycles = value;
Dustin Brown43e87292016-10-10 10:38:25 -070012375
Abhishek Singh0481d662017-04-11 18:20:11 +053012376 wlan_pdev_obj_lock(hdd_ctx->hdd_pdev);
12377 psoc = wlan_pdev_get_psoc(hdd_ctx->hdd_pdev);
12378 wlan_pdev_obj_unlock(hdd_ctx->hdd_pdev);
12379 ucfg_scan_register_pno_cb(psoc,
12380 found_pref_network_cb, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012381
Abhishek Singh0481d662017-04-11 18:20:11 +053012382 ucfg_scan_get_pno_def_params(vdev, &req);
12383 status = ucfg_scan_pno_start(vdev, &req);
12384 if (QDF_IS_STATUS_ERROR(status)) {
12385 hdd_err("Failed to enable PNO");
12386 ret = -EINVAL;
12387 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012388
Abhishek Singh0481d662017-04-11 18:20:11 +053012389exit:
12390 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012391
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012392 qdf_mem_free(data);
Abhishek Singh0481d662017-04-11 18:20:11 +053012393 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012394}
12395
12396static int iw_set_pno(struct net_device *dev,
12397 struct iw_request_info *info,
12398 union iwreq_data *wrqu, char *extra)
12399{
12400 int ret;
12401
12402 cds_ssr_protect(__func__);
12403 ret = __iw_set_pno(dev, info, wrqu, extra);
12404 cds_ssr_unprotect(__func__);
12405
12406 return ret;
12407}
12408#endif /* FEATURE_WLAN_SCAN_PNO */
12409
12410/* Common function to SetBand */
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012411int hdd_reg_set_band(struct net_device *dev, u8 ui_band)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012412{
12413 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
12414 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012415 enum band_info band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012416
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012417 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012418 hdd_context_t *pHddCtx;
12419 hdd_adapter_list_node_t *pAdapterNode, *pNext;
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012420 enum band_info currBand;
12421 enum band_info connectedBand;
12422 long lrc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012423
12424 pAdapterNode = NULL;
12425 pNext = NULL;
12426 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
12427
12428 switch (ui_band) {
12429 case WLAN_HDD_UI_BAND_AUTO:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012430 band = BAND_ALL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012431 break;
12432 case WLAN_HDD_UI_BAND_5_GHZ:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012433 band = BAND_5G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012434 break;
12435 case WLAN_HDD_UI_BAND_2_4_GHZ:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012436 band = BAND_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012437 break;
12438 default:
Jeff Johnson99bac312016-06-28 10:38:18 -070012439 hdd_err("Invalid band value %u", ui_band);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012440 return -EINVAL;
12441 }
12442
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012443 hdd_debug("change band to %u", band);
12444
12445 if ((band == BAND_2G && pHddCtx->config->nBandCapability == 2) ||
12446 (band == BAND_5G && pHddCtx->config->nBandCapability == 1)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070012447 hdd_err("band value %u violate INI settings %u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012448 band, pHddCtx->config->nBandCapability);
12449 return -EIO;
12450 }
12451
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012452 if (band == BAND_ALL) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012453 hdd_debug("Auto band received. Setting band same as ini value %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012454 pHddCtx->config->nBandCapability);
12455 band = pHddCtx->config->nBandCapability;
12456 }
12457
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012458 if (QDF_STATUS_SUCCESS != ucfg_reg_get_curr_band(pHddCtx->hdd_pdev,
12459 &currBand)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012460 hdd_debug("Failed to get current band config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012461 return -EIO;
12462 }
12463
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012464 if (currBand == band)
12465 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012466
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012467 /* Change band request received.
12468 * Abort pending scan requests, flush the existing scan results,
12469 * and change the band capability
12470 */
12471 hdd_debug("Current band value = %u, new setting %u ",
12472 currBand, band);
12473
12474 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
12475 while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
12476 pAdapter = pAdapterNode->pAdapter;
12477 hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
12478 wlan_abort_scan(pHddCtx->hdd_pdev, INVAL_PDEV_ID,
Abhishek Singh69ccb512017-04-25 11:58:16 +053012479 pAdapter->sessionId, INVALID_SCAN_ID, false);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012480 connectedBand = hdd_conn_get_connected_band(
12481 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012482
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012483 /* Handling is done only for STA and P2P */
12484 if (band != BAND_ALL &&
12485 ((pAdapter->device_mode == QDF_STA_MODE) ||
12486 (pAdapter->device_mode == QDF_P2P_CLIENT_MODE)) &&
12487 (hdd_conn_is_connected(
12488 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter)))
12489 && (connectedBand != band)) {
12490 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012491
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012492 /* STA already connected on current
12493 * band, So issue disconnect first,
12494 * then change the band
12495 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012496
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012497 hdd_debug("STA (Device mode %s(%d)) connected in band %u, Changing band to %u, Issuing Disconnect",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012498 hdd_device_mode_to_string(pAdapter->device_mode),
12499 pAdapter->device_mode, currBand, band);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012500 INIT_COMPLETION(pAdapter->disconnect_comp_var);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012501
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012502 status = sme_roam_disconnect(
12503 WLAN_HDD_GET_HAL_CTX(pAdapter),
12504 pAdapter->sessionId,
12505 eCSR_DISCONNECT_REASON_UNSPECIFIED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012506
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012507 if (QDF_STATUS_SUCCESS != status) {
12508 hdd_err("sme_roam_disconnect failure, status: %d",
Jeff Johnson99bac312016-06-28 10:38:18 -070012509 (int)status);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012510 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012511 }
12512
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012513 lrc = wait_for_completion_timeout(
12514 &pAdapter->disconnect_comp_var,
12515 msecs_to_jiffies(
12516 WLAN_WAIT_TIME_DISCONNECT));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012517
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012518 if (lrc == 0) {
12519 hdd_err("Timeout while waiting for csr_roam_disconnect");
12520 return -ETIMEDOUT;
12521 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012522 }
12523
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012524 sme_scan_flush_result(hHal);
12525
12526 status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
12527 pAdapterNode = pNext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012528 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012529
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012530 if (QDF_STATUS_SUCCESS !=
12531 ucfg_reg_set_band(pHddCtx->hdd_pdev, band)) {
12532 hdd_err("Failed to set the band value to %u",
12533 band);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012534 return -EINVAL;
12535 }
12536
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012537 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012538}
12539
12540static int __iw_set_band_config(struct net_device *dev,
12541 struct iw_request_info *info,
12542 union iwreq_data *wrqu, char *extra)
12543{
Jeff Johnson441e1f72017-02-07 08:50:49 -080012544 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
12545 hdd_context_t *hdd_ctx;
12546 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012547 int *value = (int *)extra;
12548
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012549 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012550
Mukul Sharmaa5fe1982015-11-02 19:28:14 +053012551 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070012552 hdd_err("permission check failed");
Mukul Sharmaa5fe1982015-11-02 19:28:14 +053012553 return -EPERM;
12554 }
12555
Jeff Johnson441e1f72017-02-07 08:50:49 -080012556 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12557 ret = hdd_check_private_wext_control(hdd_ctx, info);
12558 if (0 != ret)
12559 return ret;
12560
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012561 return hdd_reg_set_band(dev, value[0]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012562}
12563
12564static int iw_set_band_config(struct net_device *dev,
12565 struct iw_request_info *info,
12566 union iwreq_data *wrqu, char *extra)
12567{
12568 int ret;
12569
12570 cds_ssr_protect(__func__);
12571 ret = __iw_set_band_config(dev, info, wrqu, extra);
12572 cds_ssr_unprotect(__func__);
12573
12574 return ret;
12575}
12576
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012577/**
12578 * wlan_hdd_set_mon_chan() - Set capture channel on the monitor mode interface.
12579 * @adapter: Handle to adapter
12580 * @chan: Monitor mode channel
12581 * @bandwidth: Capture channel bandwidth
12582 *
12583 * Return: 0 on success else error code.
12584 */
12585static int wlan_hdd_set_mon_chan(hdd_adapter_t *adapter, uint32_t chan,
12586 uint32_t bandwidth)
12587{
12588 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12589 hdd_station_ctx_t *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
12590 struct hdd_mon_set_ch_info *ch_info = &sta_ctx->ch_info;
12591 QDF_STATUS status;
12592 tHalHandle hal_hdl = hdd_ctx->hHal;
12593 struct qdf_mac_addr bssid;
12594 tCsrRoamProfile roam_profile;
Amar Singhal5cccafe2017-02-15 12:42:58 -080012595 struct ch_params ch_params;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012596
12597 if (QDF_GLOBAL_MONITOR_MODE != hdd_get_conparam()) {
12598 hdd_err("Not supported, device is not in monitor mode");
12599 return -EINVAL;
12600 }
12601
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012602 hdd_debug("Set monitor mode Channel %d", chan);
Hong Shie531d1f2016-11-14 14:08:03 +080012603 qdf_mem_zero(&roam_profile, sizeof(roam_profile));
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012604 roam_profile.ChannelInfo.ChannelList = &ch_info->channel;
12605 roam_profile.ChannelInfo.numOfChannels = 1;
12606 roam_profile.phyMode = ch_info->phy_mode;
12607 roam_profile.ch_params.ch_width = bandwidth;
Naveen Rawatc77e6e72016-08-05 15:19:03 -070012608 hdd_select_cbmode(adapter, chan, &roam_profile.ch_params);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012609
12610 qdf_mem_copy(bssid.bytes, adapter->macAddressCurrent.bytes,
12611 QDF_MAC_ADDR_SIZE);
12612
12613 ch_params.ch_width = bandwidth;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012614 wlan_reg_set_channel_params(hdd_ctx->hdd_pdev, chan, 0, &ch_params);
Manjunathappa Prakashc4dc9382017-03-07 18:50:33 -080012615 if (ch_params.ch_width == CH_WIDTH_INVALID) {
12616 hdd_err("Invalid capture channel or bandwidth for a country");
12617 return -EINVAL;
12618 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012619
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012620 status = sme_roam_channel_change_req(hal_hdl, bssid, &ch_params,
12621 &roam_profile);
12622 if (status) {
12623 hdd_err("Status: %d Failed to set sme_roam Channel for monitor mode",
12624 status);
12625 }
12626
12627 return qdf_status_to_os_return(status);
12628}
12629
Dustin Brown8d2d0f52017-04-03 17:02:08 -070012630static int printk_adapter(void *priv, const char *fmt, ...)
12631{
12632 int ret;
12633 va_list args;
12634
12635 va_start(args, fmt);
12636 ret = vprintk(fmt, args);
12637 ret += printk("\n");
12638 va_end(args);
12639
12640 return ret;
12641}
12642
12643#ifdef WMI_INTERFACE_EVENT_LOGGING
12644static void hdd_ioctl_log_buffer(int log_id, uint32_t count)
12645{
12646 qdf_abstract_print *print = &printk_adapter;
12647
12648 switch (log_id) {
12649 case HTC_CREDIT_HISTORY_LOG:
12650 print(NULL, "HTC Credit History (count %u)", count);
12651 cds_print_htc_credit_history(count, print, NULL);
12652 break;
12653 case COMMAND_LOG:
12654 print(NULL, "Command Log (count %u)", count);
12655 wma_print_wmi_cmd_log(count, print, NULL);
12656 break;
12657 case COMMAND_TX_CMP_LOG:
12658 print(NULL, "Command Tx Complete Log (count %u)", count);
12659 wma_print_wmi_cmd_tx_cmp_log(count, print, NULL);
12660 break;
12661 case MGMT_COMMAND_LOG:
12662 print(NULL, "Management Command Log (count %u)", count);
12663 wma_print_wmi_mgmt_cmd_log(count, print, NULL);
12664 break;
12665 case MGMT_COMMAND_TX_CMP_LOG:
12666 print(NULL, "Management Command Tx Complete Log (count %u)",
12667 count);
12668 wma_print_wmi_mgmt_cmd_tx_cmp_log(count, print, NULL);
12669 break;
12670 case EVENT_LOG:
12671 print(NULL, "Event Log (count %u)", count);
12672 wma_print_wmi_event_log(count, print, NULL);
12673 break;
12674 case RX_EVENT_LOG:
12675 print(NULL, "Rx Event Log (count %u)", count);
12676 wma_print_wmi_rx_event_log(count, print, NULL);
12677 break;
12678 case MGMT_EVENT_LOG:
12679 print(NULL, "Management Event Log (count %u)", count);
12680 wma_print_wmi_mgmt_event_log(count, print, NULL);
12681 break;
12682 default:
12683 print(NULL, "Invalid Log Id %d", log_id);
12684 break;
12685 }
12686}
12687#else
12688static inline void hdd_ioctl_log_buffer(int log_id, uint32_t count)
12689{
12690}
12691#endif /* WMI_INTERFACE_EVENT_LOGGING */
12692
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012693static int __iw_set_two_ints_getnone(struct net_device *dev,
12694 struct iw_request_info *info,
12695 union iwreq_data *wrqu, char *extra)
12696{
12697 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
12698 int *value = (int *)extra;
12699 int sub_cmd = value[0];
12700 int ret;
12701 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
12702
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012703 ENTER_DEV(dev);
12704
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012705 ret = wlan_hdd_validate_context(hdd_ctx);
12706 if (0 != ret)
12707 return ret;
12708
Jeff Johnson441e1f72017-02-07 08:50:49 -080012709 ret = hdd_check_private_wext_control(hdd_ctx, info);
12710 if (0 != ret)
12711 return ret;
12712
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012713 switch (sub_cmd) {
12714 case WE_SET_SMPS_PARAM:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012715 hdd_debug("WE_SET_SMPS_PARAM val %d %d", value[1], value[2]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012716 ret = wma_cli_set_command(pAdapter->sessionId,
12717 WMI_STA_SMPS_PARAM_CMDID,
12718 value[1] << WMA_SMPS_PARAM_VALUE_S
12719 | value[2],
12720 VDEV_CMD);
12721 break;
Srinivas Girigowda6147c582016-10-18 12:26:15 -070012722#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012723 case WE_SET_FW_CRASH_INJECT:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012724 hdd_debug("WE_SET_FW_CRASH_INJECT: %d %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012725 value[1], value[2]);
DARAM SUDHA7e7e91b2015-05-29 11:38:47 +053012726 pr_err("SSR is triggered by iwpriv CRASH_INJECT: %d %d\n",
12727 value[1], value[2]);
Yue Ma06152352017-06-20 18:08:58 -070012728 if (value[1] == 3) {
12729 cds_trigger_recovery(false);
12730 return 0;
12731 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012732 ret = wma_cli_set2_command(pAdapter->sessionId,
12733 GEN_PARAM_CRASH_INJECT,
12734 value[1], value[2], GEN_CMD);
12735 break;
12736#endif
Govind Singha471e5e2015-10-12 17:11:14 +053012737 case WE_ENABLE_FW_PROFILE:
Jeff Johnson99bac312016-06-28 10:38:18 -070012738 hdd_err("WE_ENABLE_FW_PROFILE: %d %d",
Govind Singha471e5e2015-10-12 17:11:14 +053012739 value[1], value[2]);
12740 ret = wma_cli_set2_command(pAdapter->sessionId,
12741 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
12742 value[1], value[2], DBG_CMD);
12743 break;
12744 case WE_SET_FW_PROFILE_HIST_INTVL:
Jeff Johnson99bac312016-06-28 10:38:18 -070012745 hdd_err("WE_SET_FW_PROFILE_HIST_INTVL: %d %d",
Govind Singha471e5e2015-10-12 17:11:14 +053012746 value[1], value[2]);
12747 ret = wma_cli_set2_command(pAdapter->sessionId,
12748 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
12749 value[1], value[2], DBG_CMD);
12750 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012751 case WE_SET_DUAL_MAC_FW_MODE_CONFIG:
12752 hdd_debug("Ioctl to set dual fw mode config");
12753 if (hdd_ctx->config->dual_mac_feature_disable) {
12754 hdd_err("Dual mac feature is disabled from INI");
12755 return -EPERM;
12756 }
12757 hdd_debug("%d %d", value[1], value[2]);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080012758 policy_mgr_set_dual_mac_fw_mode_config(hdd_ctx->hdd_psoc,
12759 value[1], value[2]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012760 break;
12761 case WE_DUMP_DP_TRACE_LEVEL:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012762 hdd_debug("WE_DUMP_DP_TRACE_LEVEL: %d %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012763 value[1], value[2]);
12764 if (value[1] == DUMP_DP_TRACE)
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -070012765 qdf_dp_trace_dump_all(value[2],
12766 QDF_TRACE_DEFAULT_PDEV_ID);
Nirav Shah0d58a7e2016-04-26 22:54:12 +053012767 else if (value[1] == ENABLE_DP_TRACE_LIVE_MODE)
12768 qdf_dp_trace_enable_live_mode();
Nirav Shahda008342016-05-17 18:50:40 +053012769 else if (value[1] == CLEAR_DP_TRACE_BUFFER)
12770 qdf_dp_trace_clear_buffer();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012771 break;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012772 case WE_SET_MON_MODE_CHAN:
12773 ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]);
12774 break;
Dustin Brown54096432017-02-23 13:00:44 -080012775 case WE_SET_WLAN_SUSPEND: {
Dustin Brown3ed3e9b2017-03-23 12:57:58 -070012776 hdd_info("STA unit-test suspend(%d, %d)", value[1], value[2]);
Dustin Brown54096432017-02-23 13:00:44 -080012777 ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev,
12778 value[1], value[2]);
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012779 break;
Dustin Brown54096432017-02-23 13:00:44 -080012780 }
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012781 case WE_SET_WLAN_RESUME:
Dustin Brownbc81a472016-10-26 16:56:59 -070012782 ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy, dev);
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012783 break;
Dustin Brown8d2d0f52017-04-03 17:02:08 -070012784 case WE_LOG_BUFFER: {
12785 int log_id = value[1];
12786 uint32_t count = value[2] < 0 ? 0 : value[2];
12787
12788 hdd_ioctl_log_buffer(log_id, count);
12789
12790 break;
12791 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012792 default:
Jeff Johnson99bac312016-06-28 10:38:18 -070012793 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012794 break;
12795 }
12796
12797 return ret;
12798}
12799
12800static int iw_set_two_ints_getnone(struct net_device *dev,
12801 struct iw_request_info *info,
12802 union iwreq_data *wrqu, char *extra)
12803{
12804 int ret;
12805
12806 cds_ssr_protect(__func__);
12807 ret = __iw_set_two_ints_getnone(dev, info, wrqu, extra);
12808 cds_ssr_unprotect(__func__);
12809
12810 return ret;
12811}
12812
12813/* Define the Wireless Extensions to the Linux Network Device structure */
12814/* A number of these routines are NULL (meaning they are not implemented.) */
12815
12816static const iw_handler we_handler[] = {
12817 (iw_handler) iw_set_commit, /* SIOCSIWCOMMIT */
12818 (iw_handler) iw_get_name, /* SIOCGIWNAME */
12819 (iw_handler) NULL, /* SIOCSIWNWID */
12820 (iw_handler) NULL, /* SIOCGIWNWID */
12821 (iw_handler) iw_set_freq, /* SIOCSIWFREQ */
12822 (iw_handler) iw_get_freq, /* SIOCGIWFREQ */
12823 (iw_handler) iw_set_mode, /* SIOCSIWMODE */
12824 (iw_handler) iw_get_mode, /* SIOCGIWMODE */
12825 (iw_handler) NULL, /* SIOCSIWSENS */
12826 (iw_handler) NULL, /* SIOCGIWSENS */
12827 (iw_handler) NULL, /* SIOCSIWRANGE */
12828 (iw_handler) iw_get_range, /* SIOCGIWRANGE */
12829 (iw_handler) NULL, /* SIOCSIWPRIV */
12830 (iw_handler) NULL, /* SIOCGIWPRIV */
12831 (iw_handler) NULL, /* SIOCSIWSTATS */
12832 (iw_handler) NULL, /* SIOCGIWSTATS */
12833 (iw_handler) NULL, /* SIOCSIWSPY */
12834 (iw_handler) NULL, /* SIOCGIWSPY */
12835 (iw_handler) NULL, /* SIOCSIWTHRSPY */
12836 (iw_handler) NULL, /* SIOCGIWTHRSPY */
12837 (iw_handler) iw_set_ap_address, /* SIOCSIWAP */
12838 (iw_handler) iw_get_ap_address, /* SIOCGIWAP */
12839 (iw_handler) iw_set_mlme, /* SIOCSIWMLME */
12840 (iw_handler) NULL, /* SIOCGIWAPLIST */
Sandeep Puligillad0004212017-02-26 18:34:56 -080012841 (iw_handler) NULL, /* SIOCSIWSCAN */
12842 (iw_handler) NULL, /* SIOCGIWSCAN */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012843 (iw_handler) iw_set_essid, /* SIOCSIWESSID */
12844 (iw_handler) iw_get_essid, /* SIOCGIWESSID */
12845 (iw_handler) iw_set_nick, /* SIOCSIWNICKN */
12846 (iw_handler) iw_get_nick, /* SIOCGIWNICKN */
12847 (iw_handler) NULL, /* -- hole -- */
12848 (iw_handler) NULL, /* -- hole -- */
12849 (iw_handler) iw_set_bitrate, /* SIOCSIWRATE */
12850 (iw_handler) iw_get_bitrate, /* SIOCGIWRATE */
12851 (iw_handler) iw_set_rts_threshold, /* SIOCSIWRTS */
12852 (iw_handler) iw_get_rts_threshold, /* SIOCGIWRTS */
12853 (iw_handler) iw_set_frag_threshold, /* SIOCSIWFRAG */
12854 (iw_handler) iw_get_frag_threshold, /* SIOCGIWFRAG */
12855 (iw_handler) iw_set_tx_power, /* SIOCSIWTXPOW */
12856 (iw_handler) iw_get_tx_power, /* SIOCGIWTXPOW */
12857 (iw_handler) iw_set_retry, /* SIOCSIWRETRY */
12858 (iw_handler) iw_get_retry, /* SIOCGIWRETRY */
12859 (iw_handler) iw_set_encode, /* SIOCSIWENCODE */
12860 (iw_handler) iw_get_encode, /* SIOCGIWENCODE */
12861 (iw_handler) iw_set_power_mode, /* SIOCSIWPOWER */
12862 (iw_handler) iw_get_power_mode, /* SIOCGIWPOWER */
12863 (iw_handler) NULL, /* -- hole -- */
12864 (iw_handler) NULL, /* -- hole -- */
12865 (iw_handler) iw_set_genie, /* SIOCSIWGENIE */
12866 (iw_handler) iw_get_genie, /* SIOCGIWGENIE */
12867 (iw_handler) iw_set_auth, /* SIOCSIWAUTH */
12868 (iw_handler) iw_get_auth, /* SIOCGIWAUTH */
12869 (iw_handler) iw_set_encodeext, /* SIOCSIWENCODEEXT */
12870 (iw_handler) iw_get_encodeext, /* SIOCGIWENCODEEXT */
12871 (iw_handler) NULL, /* SIOCSIWPMKSA */
12872};
12873
12874static const iw_handler we_private[] = {
12875
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012876 [WLAN_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_setint_getnone,
12877 [WLAN_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_setnone_getint,
12878 [WLAN_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_setchar_getnone,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012879 [WLAN_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12880 iw_set_three_ints_getnone,
12881 [WLAN_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_get_char_setnone,
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012882 [WLAN_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_setnone_getnone,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012883 [WLAN_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12884 iw_hdd_set_var_ints_getnone,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070012885 [WLAN_PRIV_SET_NONE_GET_THREE_INT - SIOCIWFIRSTPRIV] =
12886 iw_setnone_get_threeint,
Jeff Johnson6fa1e012017-04-05 06:40:53 -070012887 [WLAN_PRIV_FIPS_TEST - SIOCIWFIRSTPRIV] = hdd_fips_test,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012888 [WLAN_PRIV_ADD_TSPEC - SIOCIWFIRSTPRIV] = iw_add_tspec,
12889 [WLAN_PRIV_DEL_TSPEC - SIOCIWFIRSTPRIV] = iw_del_tspec,
12890 [WLAN_PRIV_GET_TSPEC - SIOCIWFIRSTPRIV] = iw_get_tspec,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012891 [WLAN_PRIV_SET_FTIES - SIOCIWFIRSTPRIV] = iw_set_fties,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012892 [WLAN_PRIV_SET_HOST_OFFLOAD - SIOCIWFIRSTPRIV] = iw_set_host_offload,
12893 [WLAN_GET_WLAN_STATISTICS - SIOCIWFIRSTPRIV] = iw_get_statistics,
12894 [WLAN_SET_KEEPALIVE_PARAMS - SIOCIWFIRSTPRIV] =
12895 iw_set_keepalive_params,
12896#ifdef WLAN_FEATURE_PACKET_FILTERING
12897 [WLAN_SET_PACKET_FILTER_PARAMS - SIOCIWFIRSTPRIV] =
12898 iw_set_packet_filter_params,
12899#endif
12900#ifdef FEATURE_WLAN_SCAN_PNO
12901 [WLAN_SET_PNO - SIOCIWFIRSTPRIV] = iw_set_pno,
12902#endif
12903 [WLAN_SET_BAND_CONFIG - SIOCIWFIRSTPRIV] = iw_set_band_config,
Dustin Brown0cbc7572016-12-16 13:54:40 -080012904 [WLAN_PRIV_SET_MCBC_FILTER - SIOCIWFIRSTPRIV] =
12905 iw_set_dynamic_mcbc_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012906 [WLAN_GET_LINK_SPEED - SIOCIWFIRSTPRIV] = iw_get_linkspeed,
12907 [WLAN_PRIV_SET_TWO_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12908 iw_set_two_ints_getnone,
12909 [WLAN_SET_DOT11P_CHANNEL_SCHED - SIOCIWFIRSTPRIV] =
12910 iw_set_dot11p_channel_sched,
12911};
12912
12913/*Maximum command length can be only 15 */
12914static const struct iw_priv_args we_private_args[] = {
12915
12916 /* handlers for main ioctl */
12917 {WLAN_PRIV_SET_INT_GET_NONE,
12918 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12919 0,
12920 ""},
12921
12922 /* handlers for sub-ioctl */
12923 {WE_SET_11D_STATE,
12924 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12925 0,
12926 "set11Dstate"},
12927
12928 {WE_WOWL,
12929 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12930 0,
12931 "wowl"},
12932
12933 {WE_SET_POWER,
12934 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12935 0,
12936 "setPower"},
12937
12938 {WE_SET_MAX_ASSOC,
12939 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12940 0,
12941 "setMaxAssoc"},
12942
12943 {WE_SET_SAP_AUTO_CHANNEL_SELECTION,
12944 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,
12945 "setAutoChannel" },
12946
12947 {WE_SET_SCAN_DISABLE,
12948 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12949 0,
12950 "scan_disable"},
12951
12952 {WE_SET_DATA_INACTIVITY_TO,
12953 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12954 0,
12955 "inactivityTO"},
12956
Mukul Sharmaed92f2f2017-04-20 00:06:28 +053012957 {WE_SET_WOW_DATA_INACTIVITY_TO,
12958 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12959 0,
12960 "wow_ito"},
12961
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012962 {WE_SET_MAX_TX_POWER,
12963 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12964 0,
12965 "setMaxTxPower"},
12966
12967 {WE_SET_TX_POWER,
12968 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12969 0,
12970 "setTxPower"},
12971
12972 {WE_SET_MC_RATE,
12973 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12974 0,
12975 "setMcRate"},
12976
12977 {WE_SET_MAX_TX_POWER_2_4,
12978 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12979 0,
12980 "setTxMaxPower2G"},
12981
12982 {WE_SET_MAX_TX_POWER_5_0,
12983 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12984 0,
12985 "setTxMaxPower5G"},
12986
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080012987 {WE_SET_PKTLOG,
Poddar, Siddarth176c4362016-10-03 12:25:00 +053012988 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080012989 0,
12990 "pktlog"},
12991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012992 /* SAP has TxMax whereas STA has MaxTx, adding TxMax for STA
12993 * as well to keep same syntax as in SAP. Now onwards, STA
Jeff Johnson3bb7c732017-01-12 08:40:17 -080012994 * will support both
12995 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012996 {WE_SET_MAX_TX_POWER,
12997 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12998 0,
12999 "setTxMaxPower"},
13000
13001 /* set Higher DTIM Transition (DTIM1 to DTIM3)
Jeff Johnson3bb7c732017-01-12 08:40:17 -080013002 * 1 = enable and 0 = disable
13003 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013004 {
13005 WE_SET_HIGHER_DTIM_TRANSITION,
13006 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13007 0,
13008 "setHDtimTransn"
13009 },
13010
13011 {WE_SET_TM_LEVEL,
13012 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13013 0,
13014 "setTmLevel"},
13015
13016 {WE_SET_PHYMODE,
13017 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13018 0,
13019 "setphymode"},
13020
13021 {WE_SET_NSS,
13022 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13023 0,
13024 "nss"},
13025
13026 {WE_SET_LDPC,
13027 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13028 0,
13029 "ldpc"},
13030
13031 {WE_SET_TX_STBC,
13032 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13033 0,
13034 "tx_stbc"},
13035
13036 {WE_SET_RX_STBC,
13037 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13038 0,
13039 "rx_stbc"},
13040
13041 {WE_SET_SHORT_GI,
13042 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13043 0,
13044 "shortgi"},
13045
13046 {WE_SET_RTSCTS,
13047 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13048 0,
13049 "enablertscts"},
13050
13051 {WE_SET_CHWIDTH,
13052 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13053 0,
13054 "chwidth"},
13055
13056 {WE_SET_ANI_EN_DIS,
13057 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13058 0,
13059 "anienable"},
13060
13061 {WE_SET_ANI_POLL_PERIOD,
13062 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13063 0,
13064 "aniplen"},
13065
13066 {WE_SET_ANI_LISTEN_PERIOD,
13067 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13068 0,
13069 "anilislen"},
13070
13071 {WE_SET_ANI_OFDM_LEVEL,
13072 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13073 0,
13074 "aniofdmlvl"},
13075
13076 {WE_SET_ANI_CCK_LEVEL,
13077 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13078 0,
13079 "aniccklvl"},
13080
13081 {WE_SET_DYNAMIC_BW,
13082 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13083 0,
13084 "cwmenable"},
13085
13086 {WE_SET_CTS_CBW,
13087 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13088 0,
13089 "cts_cbw" },
13090
13091 {WE_SET_GTX_HT_MCS,
13092 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13093 0,
13094 "gtxHTMcs"},
13095
13096 {WE_SET_GTX_VHT_MCS,
13097 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13098 0,
13099 "gtxVHTMcs"},
13100
13101 {WE_SET_GTX_USRCFG,
13102 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13103 0,
13104 "gtxUsrCfg"},
13105
13106 {WE_SET_GTX_THRE,
13107 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13108 0,
13109 "gtxThre"},
13110
13111 {WE_SET_GTX_MARGIN,
13112 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13113 0,
13114 "gtxMargin"},
13115
13116 {WE_SET_GTX_STEP,
13117 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13118 0,
13119 "gtxStep"},
13120
13121 {WE_SET_GTX_MINTPC,
13122 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13123 0,
13124 "gtxMinTpc"},
13125
13126 {WE_SET_GTX_BWMASK,
13127 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13128 0,
13129 "gtxBWMask"},
13130
13131 {WE_SET_TX_CHAINMASK,
13132 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13133 0,
13134 "txchainmask"},
13135
13136 {WE_SET_RX_CHAINMASK,
13137 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13138 0,
13139 "rxchainmask"},
13140
13141 {WE_SET_11N_RATE,
13142 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13143 0,
13144 "set11NRates"},
13145
13146 {WE_SET_VHT_RATE,
13147 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13148 0,
13149 "set11ACRates"},
13150
13151 {WE_SET_AMPDU,
13152 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13153 0,
13154 "ampdu"},
13155
13156 {WE_SET_AMSDU,
13157 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13158 0,
13159 "amsdu"},
13160
13161 {WE_SET_BURST_ENABLE,
13162 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13163 0,
13164 "burst_enable"},
13165
13166 {WE_SET_BURST_DUR,
13167 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13168 0,
13169 "burst_dur"},
13170
13171 {WE_SET_TXPOW_2G,
13172 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13173 0,
13174 "txpow2g"},
13175
13176 {WE_SET_TXPOW_5G,
13177 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13178 0,
13179 "txpow5g"},
13180
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013181 /* Sub-cmds DBGLOG specific commands */
13182 {WE_DBGLOG_LOG_LEVEL,
13183 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13184 0,
13185 "dl_loglevel"},
13186
13187 {WE_DBGLOG_VAP_ENABLE,
13188 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13189 0,
13190 "dl_vapon"},
13191
13192 {WE_DBGLOG_VAP_DISABLE,
13193 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13194 0,
13195 "dl_vapoff"},
13196
13197 {WE_DBGLOG_MODULE_ENABLE,
13198 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13199 0,
13200 "dl_modon"},
13201
13202 {WE_DBGLOG_MODULE_DISABLE,
13203 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13204 0,
13205 "dl_modoff"},
13206
13207 {WE_DBGLOG_MOD_LOG_LEVEL,
13208 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13209 0,
13210 "dl_mod_loglevel"},
13211
13212 {WE_DBGLOG_TYPE,
13213 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13214 0,
13215 "dl_type"},
13216 {WE_DBGLOG_REPORT_ENABLE,
13217 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13218 0,
13219 "dl_report"},
13220
13221 {WE_SET_TXRX_FWSTATS,
13222 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13223 0,
13224 "txrx_fw_stats"},
13225
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -080013226 {WE_SET_TXRX_STATS,
13227 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13228 0,
13229 "txrx_stats"},
13230
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013231 {WE_TXRX_FWSTATS_RESET,
13232 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13233 0,
13234 "txrx_fw_st_rst"},
13235
13236 {WE_PPS_PAID_MATCH,
13237 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13238 0, "paid_match"},
13239
13240 {WE_PPS_GID_MATCH,
13241 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13242 0, "gid_match"},
13243
13244 {WE_PPS_EARLY_TIM_CLEAR,
13245 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13246 0, "tim_clear"},
13247
13248 {WE_PPS_EARLY_DTIM_CLEAR,
13249 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13250 0, "dtim_clear"},
13251
13252 {WE_PPS_EOF_PAD_DELIM,
13253 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13254 0, "eof_delim"},
13255
13256 {WE_PPS_MACADDR_MISMATCH,
13257 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13258 0, "mac_match"},
13259
13260 {WE_PPS_DELIM_CRC_FAIL,
13261 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13262 0, "delim_fail"},
13263
13264 {WE_PPS_GID_NSTS_ZERO,
13265 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13266 0, "nsts_zero"},
13267
13268 {WE_PPS_RSSI_CHECK,
13269 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13270 0, "rssi_chk"},
13271
13272 {WE_PPS_5G_EBT,
13273 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13274 0, "5g_ebt"},
13275
13276 {WE_SET_HTSMPS,
13277 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13278 0, "htsmps"},
13279
13280 {WE_SET_QPOWER_MAX_PSPOLL_COUNT,
13281 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13282 0, "set_qpspollcnt"},
13283
13284 {WE_SET_QPOWER_MAX_TX_BEFORE_WAKE,
13285 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13286 0, "set_qtxwake"},
13287
13288 {WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
13289 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13290 0, "set_qwakeintv"},
13291
13292 {WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
13293 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13294 0, "set_qnodatapoll"},
13295
13296 /* handlers for MCC time quota and latency sub ioctls */
13297 {WE_MCC_CONFIG_LATENCY,
13298 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13299 0, "setMccLatency"},
13300
13301 {WE_MCC_CONFIG_QUOTA,
13302 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13303 0, "setMccQuota"},
13304
13305 {WE_SET_DEBUG_LOG,
13306 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13307 0, "setDbgLvl"},
13308
13309 /* handlers for early_rx power save */
13310 {WE_SET_EARLY_RX_ADJUST_ENABLE,
13311 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13312 0, "erx_enable"},
13313
13314 {WE_SET_EARLY_RX_TGT_BMISS_NUM,
13315 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13316 0, "erx_bmiss_val"},
13317
13318 {WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE,
13319 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13320 0, "erx_bmiss_smpl"},
13321
13322 {WE_SET_EARLY_RX_SLOP_STEP,
13323 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13324 0, "erx_slop_step"},
13325
13326 {WE_SET_EARLY_RX_INIT_SLOP,
13327 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13328 0, "erx_init_slop"},
13329
13330 {WE_SET_EARLY_RX_ADJUST_PAUSE,
13331 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13332 0, "erx_adj_pause"},
13333
13334 {WE_SET_EARLY_RX_DRIFT_SAMPLE,
13335 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13336 0, "erx_dri_sample"},
13337
13338 {WE_DUMP_STATS,
13339 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13340 0, "dumpStats"},
13341
13342 {WE_CLEAR_STATS,
13343 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13344 0, "clearStats"},
13345
Govind Singha471e5e2015-10-12 17:11:14 +053013346 {WE_START_FW_PROFILE,
13347 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13348 0, "startProfile"},
13349
Abhishek Singh1bdb1572015-10-16 16:24:19 +053013350 {WE_SET_CHANNEL,
13351 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13352 0, "setChanChange" },
13353
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +053013354 {WE_SET_CONC_SYSTEM_PREF,
13355 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13356 0, "setConcSysPref" },
13357
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013358 {WLAN_PRIV_SET_NONE_GET_INT,
13359 0,
13360 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13361 ""},
13362
13363 /* handlers for sub-ioctl */
13364 {WE_GET_11D_STATE,
13365 0,
13366 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13367 "get11Dstate"},
13368
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013369 {WE_GET_WLAN_DBG,
13370 0,
13371 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13372 "getwlandbg"},
13373
13374 {WE_GET_MAX_ASSOC,
13375 0,
13376 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13377 "getMaxAssoc"},
13378
13379 {WE_GET_SAP_AUTO_CHANNEL_SELECTION,
13380 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13381 "getAutoChannel" },
13382
13383 {WE_GET_CONCURRENCY_MODE,
13384 0,
13385 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13386 "getconcurrency"},
13387
13388 {WE_GET_NSS,
13389 0,
13390 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13391 "get_nss"},
13392
13393 {WE_GET_LDPC,
13394 0,
13395 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13396 "get_ldpc"},
13397
13398 {WE_GET_TX_STBC,
13399 0,
13400 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13401 "get_tx_stbc"},
13402
13403 {WE_GET_RX_STBC,
13404 0,
13405 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13406 "get_rx_stbc"},
13407
13408 {WE_GET_SHORT_GI,
13409 0,
13410 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13411 "get_shortgi"},
13412
13413 {WE_GET_RTSCTS,
13414 0,
13415 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13416 "get_rtscts"},
13417
13418 {WE_GET_CHWIDTH,
13419 0,
13420 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13421 "get_chwidth"},
13422
13423 {WE_GET_ANI_EN_DIS,
13424 0,
13425 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13426 "get_anienable"},
13427
13428 {WE_GET_ANI_POLL_PERIOD,
13429 0,
13430 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13431 "get_aniplen"},
13432
13433 {WE_GET_ANI_LISTEN_PERIOD,
13434 0,
13435 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13436 "get_anilislen"},
13437
13438 {WE_GET_ANI_OFDM_LEVEL,
13439 0,
13440 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13441 "get_aniofdmlvl"},
13442
13443 {WE_GET_ANI_CCK_LEVEL,
13444 0,
13445 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13446 "get_aniccklvl"},
13447
13448 {WE_GET_DYNAMIC_BW,
13449 0,
13450 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13451 "get_cwmenable"},
13452
13453 {WE_GET_GTX_HT_MCS,
13454 0,
13455 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13456 "get_gtxHTMcs"},
13457
13458 {WE_GET_GTX_VHT_MCS,
13459 0,
13460 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13461 "get_gtxVHTMcs"},
13462
13463 {WE_GET_GTX_USRCFG,
13464 0,
13465 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13466 "get_gtxUsrCfg"},
13467
13468 {WE_GET_GTX_THRE,
13469 0,
13470 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13471 "get_gtxThre"},
13472
13473 {WE_GET_GTX_MARGIN,
13474 0,
13475 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13476 "get_gtxMargin"},
13477
13478 {WE_GET_GTX_STEP,
13479 0,
13480 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13481 "get_gtxStep"},
13482
13483 {WE_GET_GTX_MINTPC,
13484 0,
13485 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13486 "get_gtxMinTpc"},
13487
13488 {WE_GET_GTX_BWMASK,
13489 0,
13490 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13491 "get_gtxBWMask"},
13492
13493 {WE_GET_TX_CHAINMASK,
13494 0,
13495 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13496 "get_txchainmask"},
13497
13498 {WE_GET_RX_CHAINMASK,
13499 0,
13500 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13501 "get_rxchainmask"},
13502
13503 {WE_GET_11N_RATE,
13504 0,
13505 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13506 "get_11nrate"},
13507
13508 {WE_GET_AMPDU,
13509 0,
13510 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13511 "get_ampdu"},
13512
13513 {WE_GET_AMSDU,
13514 0,
13515 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13516 "get_amsdu"},
13517
13518 {WE_GET_BURST_ENABLE,
13519 0,
13520 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13521 "get_burst_en"},
13522
13523 {WE_GET_BURST_DUR,
13524 0,
13525 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13526 "get_burst_dur"},
13527
13528 {WE_GET_TXPOW_2G,
13529 0,
13530 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13531 "get_txpow2g"},
13532
13533 {WE_GET_TXPOW_5G,
13534 0,
13535 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13536 "get_txpow5g"},
13537
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013538 {WE_GET_PPS_PAID_MATCH,
13539 0,
13540 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13541 "get_paid_match"},
13542
13543 {WE_GET_PPS_GID_MATCH,
13544 0,
13545 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13546 "get_gid_match"},
13547
13548 {WE_GET_PPS_EARLY_TIM_CLEAR,
13549 0,
13550 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13551 "get_tim_clear"},
13552
13553 {WE_GET_PPS_EARLY_DTIM_CLEAR,
13554 0,
13555 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13556 "get_dtim_clear"},
13557
13558 {WE_GET_PPS_EOF_PAD_DELIM,
13559 0,
13560 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13561 "get_eof_delim"},
13562
13563 {WE_GET_PPS_MACADDR_MISMATCH,
13564 0,
13565 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13566 "get_mac_match"},
13567
13568 {WE_GET_PPS_DELIM_CRC_FAIL,
13569 0,
13570 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13571 "get_delim_fail"},
13572
13573 {WE_GET_PPS_GID_NSTS_ZERO,
13574 0,
13575 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13576 "get_nsts_zero"},
13577
13578 {WE_GET_PPS_RSSI_CHECK,
13579 0,
13580 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13581 "get_rssi_chk"},
13582
13583 {WE_GET_QPOWER_MAX_PSPOLL_COUNT,
13584 0,
13585 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13586 "get_qpspollcnt"},
13587
13588 {WE_GET_QPOWER_MAX_TX_BEFORE_WAKE,
13589 0,
13590 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13591 "get_qtxwake"},
13592
13593 {WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
13594 0,
13595 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13596 "get_qwakeintv"},
13597
13598 {WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
13599 0,
13600 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13601 "get_qnodatapoll"},
13602
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070013603 {WE_CAP_TSF,
13604 0,
13605 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13606 "cap_tsf"},
13607
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013608 {WE_GET_TEMPERATURE,
13609 0,
13610 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13611 "get_temp"},
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -070013612 {WE_GET_DCM,
13613 0,
13614 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13615 "get_dcm"},
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -070013616 {WE_GET_RANGE_EXT,
13617 0,
13618 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13619 "get_range_ext"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013620 /* handlers for main ioctl */
13621 {WLAN_PRIV_SET_CHAR_GET_NONE,
13622 IW_PRIV_TYPE_CHAR | 512,
13623 0,
13624 ""},
13625
13626 /* handlers for sub-ioctl */
13627 {WE_WOWL_ADD_PTRN,
13628 IW_PRIV_TYPE_CHAR | 512,
13629 0,
13630 "wowlAddPtrn"},
13631
13632 {WE_WOWL_DEL_PTRN,
13633 IW_PRIV_TYPE_CHAR | 512,
13634 0,
13635 "wowlDelPtrn"},
13636
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013637 /* handlers for sub-ioctl */
13638 {WE_NEIGHBOR_REPORT_REQUEST,
13639 IW_PRIV_TYPE_CHAR | 512,
13640 0,
13641 "neighbor"},
Deepak Dhamdhere641bf322016-01-06 15:19:03 -080013642
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013643 {WE_SET_AP_WPS_IE,
13644 IW_PRIV_TYPE_CHAR | 512,
13645 0,
13646 "set_ap_wps_ie"},
13647
13648 {WE_SET_CONFIG,
13649 IW_PRIV_TYPE_CHAR | 512,
13650 0,
13651 "setConfig"},
13652
13653 /* handlers for main ioctl */
13654 {WLAN_PRIV_SET_THREE_INT_GET_NONE,
13655 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13656 0,
13657 ""},
13658
13659 /* handlers for sub-ioctl */
13660 {WE_SET_WLAN_DBG,
13661 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13662 0,
13663 "setwlandbg"},
13664
13665 /* handlers for sub-ioctl */
13666 {WE_SET_DP_TRACE,
13667 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13668 0,
13669 "set_dp_trace"},
13670
13671 {WE_SET_SAP_CHANNELS,
13672 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13673 0,
13674 "setsapchannels"},
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053013675
13676 {WE_SET_FW_TEST,
13677 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13678 0, "fw_test"},
13679
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070013680 /* handlers for main ioctl */
13681 {WLAN_PRIV_SET_NONE_GET_THREE_INT,
13682 0,
13683 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13684 "" },
13685 {WE_GET_TSF,
13686 0,
13687 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13688 "get_tsf" },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013689
13690 {WE_SET_DUAL_MAC_SCAN_CONFIG,
13691 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13692 0,
13693 "set_scan_cfg"},
13694
13695 /* handlers for main ioctl */
13696 {WLAN_PRIV_GET_CHAR_SET_NONE,
13697 0,
13698 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13699 ""},
13700
13701 /* handlers for sub-ioctl */
13702 {WE_WLAN_VERSION,
13703 0,
13704 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13705 "version"},
13706 {WE_GET_STATS,
13707 0,
13708 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13709 "getStats"},
Dustin Brownd9322482017-01-09 12:46:03 -080013710 {WE_GET_SUSPEND_RESUME_STATS,
13711 0,
13712 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13713 "getSuspendStats"},
Govind Singha471e5e2015-10-12 17:11:14 +053013714 {WE_LIST_FW_PROFILE,
13715 0,
13716 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13717 "listProfile"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013718 {WE_GET_STATES,
13719 0,
13720 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13721 "getHostStates"},
13722 {WE_GET_CFG,
13723 0,
13724 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13725 "getConfig"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013726 {WE_GET_RSSI,
13727 0,
13728 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13729 "getRSSI"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013730 {WE_GET_WMM_STATUS,
13731 0,
13732 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13733 "getWmmStatus"},
13734 {
13735 WE_GET_CHANNEL_LIST,
13736 0,
13737 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13738 "getChannelList"
13739 },
13740#ifdef FEATURE_WLAN_TDLS
13741 {
13742 WE_GET_TDLS_PEERS,
13743 0,
13744 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13745 "getTdlsPeers"
13746 },
13747#endif
13748#ifdef WLAN_FEATURE_11W
13749 {
13750 WE_GET_11W_INFO,
13751 0,
13752 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13753 "getPMFInfo"
13754 },
13755#endif
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013756 {
13757 WE_GET_IBSS_STA_INFO,
13758 0,
13759 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13760 "getIbssSTAs"
13761 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013762 {WE_GET_PHYMODE,
13763 0,
13764 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13765 "getphymode"},
Naveen Rawat910726a2017-03-06 11:42:51 -080013766#if defined(FEATURE_OEM_DATA_SUPPORT) || defined(WIFI_POS_CONVERGED)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013767 {WE_GET_OEM_DATA_CAP,
13768 0,
13769 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13770 "getOemDataCap"},
Naveen Rawat910726a2017-03-06 11:42:51 -080013771#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013772 {WE_GET_SNR,
13773 0,
13774 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13775 "getSNR"},
13776
13777 /* handlers for main ioctl */
13778 {WLAN_PRIV_SET_NONE_GET_NONE,
13779 0,
13780 0,
13781 ""},
13782
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013783 /* handlers for sub-ioctl */
13784 {
13785 WE_IBSS_GET_PEER_INFO_ALL,
13786 0,
13787 0,
13788 "ibssPeerInfoAll"
13789 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013790 {WE_GET_RECOVERY_STAT,
13791 0,
13792 0,
13793 "getRecoverStat"},
Govind Singha471e5e2015-10-12 17:11:14 +053013794
13795 {WE_GET_FW_PROFILE_DATA,
13796 0,
13797 0,
13798 "getProfileData"},
13799
13800 {WE_SET_REASSOC_TRIGGER,
13801 0,
13802 0,
13803 "reassoc"},
13804
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080013805 {WE_STOP_OBSS_SCAN,
13806 0,
13807 0,
13808 "stop_obss_scan"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013809 /* handlers for main ioctl */
13810 {WLAN_PRIV_SET_VAR_INT_GET_NONE,
13811 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13812 0,
13813 ""},
13814
13815 /* handlers for sub-ioctl */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013816 {WE_IBSS_GET_PEER_INFO,
13817 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13818 0,
13819 "ibssPeerInfo"},
13820
13821 /* handlers for sub-ioctl */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013822 {WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD,
13823 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13824 0,
13825 "setdumplog"},
13826
13827 {WE_MTRACE_DUMP_CMD,
13828 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13829 0,
13830 "dumplog"},
Krunal Sonia6e505b2017-01-12 12:25:18 -080013831
13832 {WE_POLICY_MANAGER_CINFO_CMD,
13833 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13834 0,
13835 "pm_cinfo"},
13836
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013837#ifdef MPC_UT_FRAMEWORK
13838 {WE_POLICY_MANAGER_CLIST_CMD,
13839 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13840 0,
13841 "pm_clist"},
13842
13843 {WE_POLICY_MANAGER_DLIST_CMD,
13844 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13845 0,
13846 "pm_dlist"},
13847
13848 {WE_POLICY_MANAGER_DBS_CMD,
13849 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13850 0,
13851 "pm_dbs"},
13852
13853 {WE_POLICY_MANAGER_PCL_CMD,
13854 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13855 0,
13856 "pm_pcl"},
13857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013858 {WE_POLICY_MANAGER_ULIST_CMD,
13859 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13860 0,
13861 "pm_ulist"},
13862
13863 {WE_POLICY_MANAGER_QUERY_ACTION_CMD,
13864 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13865 0,
13866 "pm_query_action"},
13867
13868 {WE_POLICY_MANAGER_QUERY_ALLOW_CMD,
13869 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13870 0,
13871 "pm_query_allow"},
13872
13873 {WE_POLICY_MANAGER_SCENARIO_CMD,
13874 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13875 0,
13876 "pm_run_scenario"},
13877
13878 {WE_POLICY_SET_HW_MODE_CMD,
13879 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13880 0,
13881 "pm_set_hw_mode"},
13882#endif
13883#ifdef FEATURE_WLAN_TDLS
13884 /* handlers for sub ioctl */
13885 {
13886 WE_TDLS_CONFIG_PARAMS,
13887 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13888 0,
13889 "setTdlsConfig"
13890 },
13891#endif
13892 {
13893 WE_UNIT_TEST_CMD,
13894 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13895 0,
13896 "setUnitTestCmd"
13897 },
Manjeet Singhf82ed072016-07-08 11:40:00 +053013898 {
13899 WE_MAC_PWR_DEBUG_CMD,
13900 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13901 0,
13902 "halPwrDebug"
13903 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013904
13905#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
13906 {WE_LED_FLASHING_PARAM,
13907 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13908 0,
13909 "gpio_control"},
13910#endif
13911 /* handlers for main ioctl */
Jeff Johnson6fa1e012017-04-05 06:40:53 -070013912 {WLAN_PRIV_FIPS_TEST,
13913 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13914 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13915 "fips_test"},
13916
13917 /* handlers for main ioctl */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013918 {WLAN_PRIV_ADD_TSPEC,
13919 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | HDD_WLAN_WMM_PARAM_COUNT,
13920 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13921 "addTspec"},
13922
13923 /* handlers for main ioctl */
13924 {WLAN_PRIV_DEL_TSPEC,
13925 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13926 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13927 "delTspec"},
13928
13929 /* handlers for main ioctl */
13930 {WLAN_PRIV_GET_TSPEC,
13931 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13932 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13933 "getTspec"},
13934
13935 /* handlers for main ioctl - host offload */
13936 {
13937 WLAN_PRIV_SET_HOST_OFFLOAD,
Srinivas Girigowda077143e2017-03-25 10:47:27 -070013938 IW_PRIV_TYPE_BYTE | sizeof(struct host_offload_req),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013939 0,
13940 "setHostOffload"
13941 }
13942 ,
13943
13944 {
13945 WLAN_GET_WLAN_STATISTICS,
13946 0,
13947 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13948 "getWlanStats"
13949 }
13950 ,
13951
13952 {
13953 WLAN_SET_KEEPALIVE_PARAMS,
Mahesh A Saptasagar72d2e4b2016-04-20 12:44:17 +053013954 IW_PRIV_TYPE_BYTE | sizeof(tSirKeepAliveReq) |
13955 IW_PRIV_SIZE_FIXED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013956 0,
13957 "setKeepAlive"
13958 }
13959 ,
13960#ifdef WLAN_FEATURE_PACKET_FILTERING
13961 {
13962 WLAN_SET_PACKET_FILTER_PARAMS,
Hanumanth Reddy Pothulab3ef4162016-10-25 15:13:26 +053013963 IW_PRIV_TYPE_BYTE |
13964 sizeof(struct pkt_filter_cfg),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013965 0,
13966 "setPktFilter"
13967 }
13968 ,
13969#endif
13970#ifdef FEATURE_WLAN_SCAN_PNO
13971 {
13972 WLAN_SET_PNO,
13973 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13974 0,
13975 "setpno"
13976 }
13977 ,
13978#endif
13979 {
13980 WLAN_SET_BAND_CONFIG,
13981 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13982 0,
13983 "SETBAND"
13984 }
13985 ,
13986 {
Dustin Brown0cbc7572016-12-16 13:54:40 -080013987 WLAN_PRIV_SET_MCBC_FILTER,
Dustin Brown860566f2017-01-31 15:24:43 -080013988 0,
Dustin Brown0cbc7572016-12-16 13:54:40 -080013989 0,
13990 "setMCBCFilter"
13991 }
13992 ,
Dustin Brown0cbc7572016-12-16 13:54:40 -080013993
13994 {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013995 WLAN_GET_LINK_SPEED,
13996 IW_PRIV_TYPE_CHAR | 18,
13997 IW_PRIV_TYPE_CHAR | 5, "getLinkSpeed"
13998 }
13999 ,
14000
14001 /* handlers for main ioctl */
14002 {WLAN_PRIV_SET_TWO_INT_GET_NONE,
14003 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14004 0,
14005 ""}
14006 ,
14007 {WE_SET_SMPS_PARAM,
14008 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14009 0, "set_smps_param"}
14010 ,
14011 {WLAN_SET_DOT11P_CHANNEL_SCHED,
14012 IW_PRIV_TYPE_BYTE | sizeof(struct dot11p_channel_sched),
14013 0, "set_dot11p" }
14014 ,
Srinivas Girigowda6147c582016-10-18 12:26:15 -070014015#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014016 {WE_SET_FW_CRASH_INJECT,
14017 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14018 0, "crash_inject"}
14019 ,
Dustin Brown8d2d0f52017-04-03 17:02:08 -070014020 {WE_LOG_BUFFER,
14021 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14022 0, "log_buffer"}
14023 ,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014024#endif
Rajeev Kumara78a0a42016-07-13 19:28:20 -070014025#ifdef WLAN_SUSPEND_RESUME_TEST
14026 {WE_SET_WLAN_SUSPEND,
14027 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14028 0, "wlan_suspend"}
14029 ,
14030 {WE_SET_WLAN_RESUME,
14031 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14032 0, "wlan_resume"}
14033 ,
14034#endif
Govind Singha471e5e2015-10-12 17:11:14 +053014035 {WE_ENABLE_FW_PROFILE,
14036 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14037 0, "enableProfile"}
14038 ,
14039 {WE_SET_FW_PROFILE_HIST_INTVL,
14040 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14041 0, "set_hist_intvl"}
14042 ,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014043 {WE_SET_DUAL_MAC_FW_MODE_CONFIG,
14044 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14045 0, "set_fw_mode_cfg"}
14046 ,
14047 {WE_DUMP_DP_TRACE_LEVEL,
14048 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14049 0, "dump_dp_trace"}
14050 ,
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014051 {WE_SET_MON_MODE_CHAN,
14052 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14053 0, "setMonChan"}
14054 ,
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -070014055
14056 {WE_GET_ROAM_SYNCH_DELAY,
14057 0,
14058 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14059 "hostroamdelay"}
14060 ,
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -080014061 {WE_SET_11AX_RATE,
14062 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14063 0,
14064 "set_11ax_rate"}
14065 ,
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -070014066 {WE_SET_DCM,
14067 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14068 0,
14069 "enable_dcm"}
14070 ,
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -070014071 {WE_SET_RANGE_EXT,
14072 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14073 0,
14074 "enable_range_ext"}
14075 ,
Naveen Rawatc921c7b2017-06-13 17:29:51 -070014076
14077 {WLAN_PRIV_SET_FTIES,
14078 IW_PRIV_TYPE_CHAR | MAX_FTIE_SIZE,
14079 0,
14080 "set_ft_ies"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014081};
14082
14083const struct iw_handler_def we_handler_def = {
Anurag Chouhan6d760662016-02-20 16:05:43 +053014084 .num_standard = QDF_ARRAY_SIZE(we_handler),
14085 .num_private = QDF_ARRAY_SIZE(we_private),
14086 .num_private_args = QDF_ARRAY_SIZE(we_private_args),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014087
14088 .standard = (iw_handler *) we_handler,
14089 .private = (iw_handler *) we_private,
14090 .private_args = we_private_args,
14091 .get_wireless_stats = NULL,
14092};
14093
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014094/* hdd_set_wext() - configures bss parameters
14095 * @pAdapter: handle to adapter context
14096 *
14097 * Returns: none
14098 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -070014099static int hdd_set_wext(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014100{
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014101 hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
14102 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014103
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014104 ENTER();
14105
14106 if (!pwextBuf) {
14107 hdd_err("ERROR: pwextBuf is NULL");
14108 return QDF_STATUS_E_FAILURE;
14109 }
14110
14111 if (!pHddStaCtx) {
14112 hdd_err("ERROR: pHddStaCtx is NULL");
14113 return QDF_STATUS_E_FAILURE;
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014114 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014115
14116 /* Now configure the roaming profile links. To SSID and bssid. */
14117 pwextBuf->roamProfile.SSIDs.numOfSSIDs = 0;
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014118 pwextBuf->roamProfile.SSIDs.SSIDList = &pHddStaCtx->conn_info.SSID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014119
14120 pwextBuf->roamProfile.BSSIDs.numOfBSSIDs = 0;
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014121 pwextBuf->roamProfile.BSSIDs.bssid = &pHddStaCtx->conn_info.bssId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014122
14123 /*Set the numOfChannels to zero to scan all the channels */
14124 pwextBuf->roamProfile.ChannelInfo.numOfChannels = 0;
14125 pwextBuf->roamProfile.ChannelInfo.ChannelList = NULL;
14126
14127 /* Default is no encryption */
14128 pwextBuf->roamProfile.EncryptionType.numEntries = 1;
14129 pwextBuf->roamProfile.EncryptionType.encryptionType[0] =
14130 eCSR_ENCRYPT_TYPE_NONE;
14131
14132 pwextBuf->roamProfile.mcEncryptionType.numEntries = 1;
14133 pwextBuf->roamProfile.mcEncryptionType.encryptionType[0] =
14134 eCSR_ENCRYPT_TYPE_NONE;
14135
14136 pwextBuf->roamProfile.BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
14137
14138 /* Default is no authentication */
14139 pwextBuf->roamProfile.AuthType.numEntries = 1;
14140 pwextBuf->roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
14141
14142 pwextBuf->roamProfile.phyMode = eCSR_DOT11_MODE_AUTO;
14143 pwextBuf->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
14144
14145 /*Set the default scan mode */
14146 pAdapter->scan_info.scan_mode = eSIR_ACTIVE_SCAN;
14147
14148 hdd_clear_roam_profile_ie(pAdapter);
14149
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014150 EXIT();
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014151 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014152
14153}
14154
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014155/**
14156 * hdd_register_wext() - register wext context
14157 * @dev: net device handle
14158 *
14159 * Registers wext interface context for a given net device
14160 *
14161 * Returns: 0 on success, errno on failure
14162 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014163int hdd_register_wext(struct net_device *dev)
14164{
14165 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014166 hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Anurag Chouhance0dc992016-02-16 18:18:03 +053014167 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014168
14169 ENTER();
14170
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014171 if (!pwextBuf) {
14172 hdd_err(FL("ERROR: pwextBuf is NULL"));
14173 return QDF_STATUS_E_FAILURE;
14174 }
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014175
14176 /* Zero the memory. This zeros the profile structure */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014177 memset(pwextBuf, 0, sizeof(hdd_wext_state_t));
14178
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014179 status = hdd_set_wext(pAdapter);
14180
Anurag Chouhance0dc992016-02-16 18:18:03 +053014181 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070014182 hdd_err("ERROR: hdd_set_wext failed!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014183 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014184 }
14185
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070014186 status = qdf_event_create(&pwextBuf->hdd_qdf_event);
14187 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070014188 hdd_err("ERROR: HDD qdf event init failed!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014189 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014190 }
14191
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014192 /* Register as a wireless device */
14193 dev->wireless_handlers = (struct iw_handler_def *)&we_handler_def;
14194
14195 EXIT();
14196 return 0;
14197}
14198
14199int hdd_unregister_wext(struct net_device *dev)
14200{
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080014201 hdd_debug("dev(%p)", dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014202
14203 if (dev != NULL) {
14204 rtnl_lock();
14205 dev->wireless_handlers = NULL;
14206 rtnl_unlock();
14207 }
14208
14209 return 0;
14210}