blob: f6c3980aba79251869db32f397d4601bb5574f71 [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
Agrawal Ashishbafaff12016-12-27 17:43:08 +0530623/*
624 * <ioctl>
625 * setAutoChannel - set ACS enable/disable
626 *
627 * @INPUT: None
628 *
629 * @OUTPUT: None
630 *
631 * This IOCTL is used to set SAP ACS eanble/disable
632 *
633 * @E.g: iwpriv wlan0 setAutoChannel 0
634 *
635 * Supported Feature: SAP
636 *
637 * Usage: Internal/External
638 *
639 * </ioctl>
640 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800641#define WE_SET_SAP_AUTO_CHANNEL_SELECTION 54
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530642/*
643 * <ioctl>
644 * htsmps - Sets the htsmps
645 *
646 * @INPUT: Atleast one int argument
647 *
648 * @OUTPUT: None
649 *
650 * This IOTCL used to set htsmps
651 *
652 * @E.g: iwpriv wlan0 htsmps <value>
653 *
654 * Supported Feature: STA
655 *
656 * Usage: Internal/External
657 *
658 * </ioctl>
659 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800660#define WE_SET_HTSMPS 55
661/* Private ioctl for QPower */
662#define WE_SET_QPOWER_MAX_PSPOLL_COUNT 56
663#define WE_SET_QPOWER_MAX_TX_BEFORE_WAKE 57
664#define WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 58
665#define WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 59
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530666/*
667 * <ioctl>
668 * burst_enable - Enables or disables the burst feature
669 *
670 * @INPUT: 0-Disable, 1-Enable
671 *
672 * @OUTPUT: None
673 *
674 * This IOCTL enables or disables the burst feature.
675 *
676 * @E.g: iwpriv wlan0 burst_enable 0
677 *
678 * Supported Feature: STA
679 *
680 * Usage: Internal/External
681 *
682 * </ioctl>
683 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800684#define WE_SET_BURST_ENABLE 60
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530685/*
686 * <ioctl>
687 * burst_dur - Enables or disables the burst feature
688 *
689 * @INPUT: int 1…..int 8191 in microseconds
690 *
691 * @OUTPUT: None
692 *
693 * This IOCTL sets the burst duration.
694 *
695 * @E.g: iwpriv wlan0 burst_dur <value>
696 *
697 * Supported Feature: STA
698 *
699 * Usage: Internal/External
700 *
701 * </ioctl>
702 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800703#define WE_SET_BURST_DUR 61
704/* GTX Commands */
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530705/*
706 * <ioctl>
707 * gtxHTMcs - Set the tx HTM value
708 *
709 * @INPUT: Atleast one int orgument
710 *
711 * @OUTPUT: None
712 *
713 * This IOTCL sets htm tx value
714 *
715 * @E.g: iwpriv wlan0 gtxHTMcs <value>
716 *
717 * Supported Feature: STA
718 *
719 * Usage: Internal/External
720 *
721 * </ioctl>
722 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723#define WE_SET_GTX_HT_MCS 62
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530724/*
725 * <ioctl>
726 * gtxVHTMcs - Set gtxVHTMcs value
727 *
728 * @INPUT: Atleast one int argument
729 *
730 * @OUTPUT: None
731 *
732 * This IOTCL used to set gtxVHTMcs value
733 *
734 * @E.g: iwpriv wlan0 gtxVHTMcs <value>
735 *
736 * Supported Feature: STA
737 *
738 * Usage: Internal/External
739 *
740 * </ioctl>
741 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800742#define WE_SET_GTX_VHT_MCS 63
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530743/*
744 * <ioctl>
745 * gtxUsrCfg - Host request for GTX mask
746 *
747 * @INPUT: Atleast one int orgument
748 *
749 * @OUTPUT: None
750 *
751 * This IOTCL used send the host request for GTX mask
752 *
753 * @E.g: iwpriv wlan0 gtxUsrCfg <value>
754 *
755 * Supported Feature: STA
756 *
757 * Usage: Internal/External
758 *
759 * </ioctl>
760 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800761#define WE_SET_GTX_USRCFG 64
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530762/*
763 * <ioctl>
764 * gtxThre - Set the tx threshold
765 *
766 * @INPUT: Atleast one int argument
767 *
768 * @OUTPUT: None
769 *
770 * This IOTCL used to set tx threshold
771 *
772 * @E.g: iwpriv wlan0 gtxThre <value>
773 *
774 * Supported Feature: STA
775 *
776 * Usage: Internal/External
777 *
778 * </ioctl>
779 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800780#define WE_SET_GTX_THRE 65
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530781/*
782 * <ioctl>
783 * gtxMargin - Set the gtxMargin
784 *
785 * @INPUT: 1 to 32
786 *
787 * @OUTPUT: None
788 *
789 * This IOTCL use dto set gtxMargin
790 *
791 * @E.g: iwpriv wlan0 gtxMargini <value>
792 *
793 * Supported Feature: STA
794 *
795 * Usage: Internal/External
796 *
797 * </ioctl>
798 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800799#define WE_SET_GTX_MARGIN 66
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530800/*
801 * <ioctl>
802 * gtxStep - Set the gtxStep
803 *
804 * @INPUT: None
805 *
806 * @OUTPUT: None
807 *
808 * This IOTCL used to sets gtxStep
809 *
810 * @E.g: iwpriv wlan0 gtxStep <value>
811 *
812 * Supported Feature: STA
813 *
814 * Usage: Internal/External
815 *
816 * </ioctl>
817 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800818#define WE_SET_GTX_STEP 67
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530819/*
820 * <ioctl>
821 * gtxMinTpc - Sets the gtxMinTpc
822 *
823 * @INPUT: Atleast one int argument
824 *
825 * @OUTPUT: None
826 *
827 * This IOTCL sets the tx MinTpc
828 *
829 * @E.g: iwpriv wlan0 gtxMinTpc <value>
830 *
831 * Supported Feature: STA
832 *
833 * Usage: Internal/External
834 *
835 * </ioctl>
836 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800837#define WE_SET_GTX_MINTPC 68
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530838/*
839 * <ioctl>
840 * gtxBWMask - Sets the BW mask (20/40/80/160 Mhz)
841 *
842 * @INPUT: Mask value
843 *
844 * @OUTPUT: None
845 *
846 * This IOTCL used to set gtxBWMask
847 *
848 * @E.g: iwpriv wlan0 gtxBWMask <value>
849 *
850 * Supported Feature: STA
851 *
852 * Usage: Internal/External
853 *
854 * </ioctl>
855 */
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530856
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530857#define WE_SET_GTX_BWMASK 69
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530858/*
859 * <ioctl>
860 * setMccLatency - Sets the MCC latency value during STA-P2P concurrency
861 *
862 * @INPUT: set_value
863 *
864 * @OUTPUT: None
865 *
866 * This IOCTL is used to set the MCC latency value in milliseconds
867 * during STA-P2P concurrency.
868 *
869 * If 0ms latency is provided, then FW will set to a default.
870 * Otherwise, latency must be at least 30ms.
871 *
872 * @E.g: iwpriv wlan0 setMccLatency 40
873 *
874 *
875 * Supported Feature: Concurrency
876 *
877 * Usage: Internal/External
878 *
879 * </ioctl>
880 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800881#define WE_MCC_CONFIG_LATENCY 70
Nitesh Shahc87a7a82016-12-14 11:37:55 +0530882
883/*
884 * <ioctl>
885 * setMccQuota- Set the quota for P2P cases
886 *
887 * @INPUT: set_value [0,100]
888 *
889 * @OUTPUT: None
890 *
891 * This IOCTL is used to set the quota in milliseconds for P2P_GO/STA.
892 *
893 * Currently used to set time quota for 2 MCC vdevs/adapters using
894 * (operating channel, quota) for each mode.
895 * The info is provided run time using iwpriv command:
896 * iwpriv <wlan0 | p2p0> setMccQuota <quota in ms>.
897 * Note: the quota provided in command is for the same mode in cmd.
898 * HDD checks if MCC mode is active, gets the second mode and its
899 * operating chan.
900 * Quota for the 2nd role is calculated as 100 - quota of first mode.
901 *
902 * @E.g: iwpriv wlan0 setMccQuota 50
903 * iwpriv p2p0 setMccQuota 50
904 *
905 * Supported Feature: Concurrency
906 *
907 * Usage: Internal/External
908 *
909 * </ioctl>
910 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800911#define WE_MCC_CONFIG_QUOTA 71
912/* Private IOCTL for debug connection issues */
913#define WE_SET_DEBUG_LOG 72
914#ifdef WE_SET_TX_POWER
915#undef WE_SET_TX_POWER
916#endif
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530917/*
918 * <ioctl>
919 * setTxPower - Set the current transmit power
920 *
921 * @INPUT: Transmission power in dBm
922 *
923 * @OUTPUT: None
924 *
925 * This IOCTL sets the current transmit power.
926 * This setting does not persist over reboots.
927 *
928 * @E.g: iwpriv wlan0 setTxPower 10
929 *
930 * Supported Feature: STA
931 *
932 * Usage: Internal/External
933 *
934 * </ioctl>
935 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800936#define WE_SET_TX_POWER 74
937/* Private ioctl for earlyrx power save feature */
938#define WE_SET_EARLY_RX_ADJUST_ENABLE 75
939#define WE_SET_EARLY_RX_TGT_BMISS_NUM 76
940#define WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE 77
941#define WE_SET_EARLY_RX_SLOP_STEP 78
942#define WE_SET_EARLY_RX_INIT_SLOP 79
943#define WE_SET_EARLY_RX_ADJUST_PAUSE 80
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530944/*
945 * <ioctl>
946 * setMcRate - Set the data rate for multicast data
947 *
948 * @INPUT: 1 to 32
949 *
950 * @OUTPUT: None
951 *
952 * This IOCTL sets the data rate for multicast data. Note that this command
953 * is allowed only in STA, IBSS, or QCMobileAP mode
954 *
955 * @E.g: iwpriv wlan0 setMcRate <value>
956 *
957 * Supported Feature: STA
958 *
959 * Usage: Internal/External
960 *
961 * </ioctl>
962 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800963#define WE_SET_MC_RATE 81
964#define WE_SET_EARLY_RX_DRIFT_SAMPLE 82
965/* Private ioctl for packet power save */
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530966/*
967 * <ioctl>
968 * 5g_ebt - Sets the 5g_ebt
969 *
970 * @INPUT: <value>
971 *
972 * @OUTPUT: None
973 *
974 * This IOTCL used to set 5g_ebt
975 *
976 * @E.g: iwpriv wlan0 5g_ebt <value>
977 *
978 * Supported Feature: STA
979 *
980 * Usage: Internal/External
981 *
982 * </ioctl>
983 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984#define WE_PPS_5G_EBT 83
Sen, Devendra9ca8c432017-02-23 15:10:26 +0530985/*
986 * <ioctl>
987 * cts_cbw - Set CTS channel BW for dynamic BW adjustment
988 *
989 * @INPUT: 20 t0 160
990 *
991 * @OUTPUT: None
992 *
993 * This IOTCL used to set CTS channel BW for dynamic BW adjustment
994 *
995 * @E.g: iwpriv wlan0 cts_cbw <value>
996 *
997 * Supported Feature: STA
998 *
999 * Usage: Internal/External
1000 *
1001 * </ioctl>
1002 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001003#define WE_SET_CTS_CBW 84
1004#define WE_DUMP_STATS 85
1005#define WE_CLEAR_STATS 86
Govind Singha471e5e2015-10-12 17:11:14 +05301006/* Private sub ioctl for starting/stopping the profiling */
1007#define WE_START_FW_PROFILE 87
Mukul Sharmaed92f2f2017-04-20 00:06:28 +05301008
Abhishek Singh3c507012016-12-01 11:15:42 +05301009/*
1010 * <ioctl>
1011 * setChanChange - Initiate channel change
1012 *
1013 * @INPUT: channel number to switch to.
1014 *
1015 * @OUTPUT: None
1016 *
1017 * This IOCTL is used to initiate a channel change.
1018 * If called on STA/CLI interface it will send the
1019 * ECSA action frame to the connected SAP/GO asking to
1020 * initiate the ECSA, if supported.
1021 * If called on SAP/GO interface it will initiate
1022 * ECSA and ask connected peers to move to new channel.
1023 *
1024 * @E.g: iwpriv wlan0 setChanChange <channel>
1025 * iwpriv wlan0 setChanChange 1
1026 *
1027 * Supported Feature: ECSA
1028 *
1029 * Usage: Internal/External
1030 *
1031 * </ioctl>
1032 */
Abhishek Singh1bdb1572015-10-16 16:24:19 +05301033#define WE_SET_CHANNEL 88
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05301034#define WE_SET_CONC_SYSTEM_PREF 89
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08001035#define WE_SET_TXRX_STATS 90
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001036
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08001037/*
1038 * <ioctl>
1039 * set_11ax_rate - set 11ax rates to FW
1040 *
1041 * @INPUT: rate code
1042 *
1043 * @OUTPUT: None
1044 *
1045 * This IOCTL fixes the Tx data rate of 11AX.
1046 *
1047 * @E.g: iwpriv wlan0 set_11ax_rate <rate code>
1048 *
1049 * Supported Feature: STA/SAP
1050 *
1051 * Usage: Internal
1052 *
1053 * </ioctl>
1054 */
1055#define WE_SET_11AX_RATE 91
1056
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001057/*
1058 * <ioctl>
1059 * enable_dcm - enable Dual Carrier Modulation(DCM)
1060 *
1061 * @INPUT: 0/1
1062 *
1063 * @OUTPUT: None
1064 *
1065 * This IOCTL enables/disables DCM.
1066 *
1067 * @E.g: iwpriv wlan0 enable_dcm <0/1>
1068 *
1069 * Supported Feature: STA/SAP
1070 *
1071 * Usage: Internal
1072 *
1073 * </ioctl>
1074 */
1075#define WE_SET_DCM 92
1076
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001077/*
1078 * <ioctl>
1079 * enable_range_ext - enable Range extension
1080 *
1081 * @INPUT: 0/1
1082 *
1083 * @OUTPUT: None
1084 *
1085 * This IOCTL enables/disables Range extension.
1086 *
1087 * @E.g: iwpriv wlan0 enable_range_ext <0/1>
1088 *
1089 * Supported Feature: STA/SAP
1090 *
1091 * Usage: Internal
1092 *
1093 * </ioctl>
1094 */
1095#define WE_SET_RANGE_EXT 93
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001096
Mukul Sharmaed92f2f2017-04-20 00:06:28 +05301097/*
1098 * <ioctl>
1099 * wow_ito - sets the timeout value for inactivity data while
1100 * in power save mode during wow
1101 *
1102 * @INPUT: int
1103 *
1104 * @OUTPUT: None
1105 *
1106 * This IOCTL set the timeout value for inactivity data in power save mode
1107 *
1108 * @E.g: iwpriv wlan0 wow_ito 20
1109 *
1110 * Supported Feature: STA
1111 *
1112 * Usage: External
1113 *
1114 * </ioctl>
1115*/
1116#define WE_SET_WOW_DATA_INACTIVITY_TO 94
1117
1118
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001119/* Private ioctls and their sub-ioctls */
1120#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
1121#define WE_GET_11D_STATE 1
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122#define WE_SET_SAP_CHANNELS 3
1123#define WE_GET_WLAN_DBG 4
1124#define WE_GET_MAX_ASSOC 6
1125/* 7 is unused */
1126#define WE_GET_SAP_AUTO_CHANNEL_SELECTION 8
Nitesh Shahc87a7a82016-12-14 11:37:55 +05301127
1128/*
1129 * <ioctl>
1130 * getconcurrency - Get concurrency mode
1131 *
1132 * @INPUT: None
1133 *
1134 * @OUTPUT: It shows concurrency value
1135 * Bit 0:STA 1:SAP 2:P2P_Client 3:P2P_GO
1136 * 4:FTM 5:IBSS 6:Monitor 7:P2P_Device
1137 * 8:OCB 9:EPPING 10:QVIT 11:NDI
1138 *
1139 * This IOCTL is used to retrieve concurrency mode.
1140 *
1141 * @E.g: iwpriv wlan0 getconcurrency
1142 * wlan0 getconcurrency:5
1143 * Above value shows STA+P2P_Client
1144 *
1145 * Supported Feature: Concurrency
1146 *
1147 * Usage: Internal/External
1148 *
1149 * </ioctl>
1150 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001151#define WE_GET_CONCURRENCY_MODE 9
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301152/*
1153 * <ioctl>
1154 * get_nss - Get the number of spatial STBC streams (NSS)
1155 *
1156 * @INPUT: None
1157 *
1158 * @OUTPUT: NSS
1159 * wlan0 get_nss:2
1160 *
1161 * This IOTCL used to get the number of spatial STBC streams
1162 *
1163 * @E.g: iwpriv wlan0 get_nss
1164 *
1165 * Supported Feature: STA
1166 *
1167 * Usage: Internal/External
1168 *
1169 * </ioctl>
1170 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001171#define WE_GET_NSS 11
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301172/*
1173 * <ioctl>
1174 * get_ldpc - This IOCTL gets the low density parity check (LDPC)
1175 *
1176 * @INPUT: None
1177 *
1178 * @OUTPUT: ldpc
1179 * wlan0 get_ldpc:1
1180 *
1181 * This IOTCL used to gets the low density parity check (LDPC)
1182 *
1183 * @E.g: iwpriv wlan0 get_ldpc
1184 *
1185 * Supported Feature: STA
1186 *
1187 * Usage: Internal/External
1188 *
1189 * </ioctl>
1190 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001191#define WE_GET_LDPC 12
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301192/*
1193 * <ioctl>
1194 * get_tx_stbc - Get the value of the current Tx space time block code (STBC)
1195 *
1196 * @INPUT: None
1197 *
1198 * @OUTPUT: TXSTBC
1199 * wlan0 get_tx_stbc:1
1200 *
1201 * This IOTCL get the value of the current Tx space time block code (STBC)
1202 *
1203 * @E.g: iwpriv wlan0 get_tx_stbc
1204 *
1205 * Supported Feature: STA
1206 *
1207 * Usage: Internal/External
1208 *
1209 * </ioctl>
1210 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001211#define WE_GET_TX_STBC 13
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301212/*
1213 * <ioctl>
1214 * get_rx_stbc - Gets the value of the current Rx STBC
1215 *
1216 * @INPUT: None
1217 *
1218 * @OUTPUT: Rx STBC
1219 * wlan0 get_rx_stbc:1
1220 *
1221 * This IOTCL used to get the value of the current Rx STBC
1222 *
1223 * @E.g: iwpriv wlan0 get_rx_stbc
1224 *
1225 * Supported Feature: STA
1226 *
1227 * Usage: Internal/External
1228 *
1229 * </ioctl>
1230 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001231#define WE_GET_RX_STBC 14
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301232/*
1233 * <ioctl>
1234 * get_shortgi - Get the value of the current short GI setting
1235 *
1236 * @INPUT: None
1237 *
1238 * @OUTPUT: Enable/disable of shortgi
1239 * wlan0 get_shortgi:1
1240 *
1241 * This IOCTL gets the value of the current short GI setting
1242 *
1243 * @E.g: iwpriv wlan0 get_shortgi
1244 *
1245 * Supported Feature: STA
1246 *
1247 * Usage: Internal/External
1248 *
1249 * </ioctl>
1250 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001251#define WE_GET_SHORT_GI 15
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301252/*
1253 * <ioctl>
1254 * get_rtscts - Get the value of the current RTS/CTS setting.
1255 *
1256 * @INPUT: None
1257 *
1258 * @OUTPUT: Enable/disable of RTS/CTS
1259 * wlan0 get_rtscts:33
1260 *
1261 * This IOTCL get the value of the current RTS/CTS setting.
1262 *
1263 * @E.g: iwpriv wlan0 get_rtscts
1264 *
1265 * Supported Feature: STA
1266 *
1267 * Usage: Internal/External
1268 *
1269 * </ioctl>
1270 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001271#define WE_GET_RTSCTS 16
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301272/*
1273 * <ioctl>
1274 * get_chwidth - Get the current channel width setting
1275 *
1276 * @INPUT: None
1277 *
1278 * @OUTPUT: channel width
1279 * wlan0 get_chwidth:0
1280 *
1281 * This IOTCL get the current channel width setting.
1282 *
1283 * @E.g: iwpriv wlan0 get_chwidth
1284 *
1285 * Supported Feature: STA
1286 *
1287 * Usage: Internal/External
1288 *
1289 * </ioctl>
1290 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001291#define WE_GET_CHWIDTH 17
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301292/*
1293 * <ioctl>
1294 * get_anienable - Get the anienable
1295 *
1296 * @INPUT: None
1297 *
1298 * @OUTPUT:
1299 * wlan0 get_anienable:0
1300 *
1301 * This IOTCL get the anienable
1302 *
1303 * @E.g: iwpriv wlan0 get_anienable
1304 *
1305 * Supported Feature: STA
1306 *
1307 * Usage: Internal/External
1308 *
1309 * </ioctl>
1310 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001311#define WE_GET_ANI_EN_DIS 18
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301312/*
1313 * <ioctl>
1314 * get_aniplen - Get the aniplen
1315 *
1316 * @INPUT: None
1317 *
1318 * @OUTPUT:
1319 * wlan0 get_aniplen:0
1320 *
1321 * This IOTCL get the aniplen
1322 *
1323 * @E.g: iwpriv wlan0 get_aniplen
1324 *
1325 * Supported Feature: STA
1326 *
1327 * Usage: Internal/External
1328 *
1329 * </ioctl>
1330 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001331#define WE_GET_ANI_POLL_PERIOD 19
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301332/*
1333 * <ioctl>
1334 * get_anilislen- Get the anilislen
1335 *
1336 * @INPUT: None
1337 *
1338 * @OUTPUT:
1339 * wlan0 get_anilislen:0
1340 *
1341 * This IOTCL used to get anilislen
1342 *
1343 * @E.g: iwpriv wlan0 get_anilislen
1344 *
1345 * Supported Feature: STA
1346 *
1347 * Usage: Internal/External
1348 *
1349 * </ioctl>
1350 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351#define WE_GET_ANI_LISTEN_PERIOD 20
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301352/*
1353 * <ioctl>
1354 * get_aniofdmlvl - Get the OFDM level
1355 *
1356 * @INPUT: None
1357 *
1358 * @OUTPUT: OFDM
1359 * wlan0 get_aniofdmlvl:0
1360 *
1361 * This IOTCL used to get ofdm level
1362 *
1363 * @E.g: iwpriv wlan0 get_aniofdmlvl
1364 *
1365 * Supported Feature: STA
1366 *
1367 * Usage: Internal/External
1368 *
1369 * </ioctl>
1370 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001371#define WE_GET_ANI_OFDM_LEVEL 21
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301372/*
1373 * <ioctl>
1374 * get_aniccklvl - Get the cck level
1375 *
1376 * @INPUT: None
1377 *
1378 * @OUTPUT:
1379 * wlan0 get_aniccklvl:0
1380 *
1381 * This IOTCL used to get cck level
1382 *
1383 * @E.g: iwpriv wlan0 get_aniccklvl
1384 *
1385 * Supported Feature: STA
1386 *
1387 * Usage: Internal/External
1388 *
1389 * </ioctl>
1390 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001391#define WE_GET_ANI_CCK_LEVEL 22
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301392/*
1393 * <ioctl>
1394 * get_cwmenable - Get the value of the dynamic channel bandwidth setting
1395 *
1396 * @INPUT: None
1397 *
1398 * @OUTPUT: Enable/disable dynamic channel bandwidth
1399 * wlan0 get_cwmenable:0
1400 *
1401 * This IOTCL get the value of the dynamic channel bandwidth setting
1402 *
1403 * @E.g: iwpriv wlan0 get_cwmenable
1404 *
1405 * Supported Feature: STA
1406 *
1407 * Usage: Internal/External
1408 *
1409 * </ioctl>
1410 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411#define WE_GET_DYNAMIC_BW 23
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301412/*
1413 * <ioctl>
1414 * get_txchainmask - Get the txchainmask that was set
1415 *
1416 * @INPUT: None
1417 *
1418 * @OUTPUT: txchainmask
1419 * wlan0 get_txchainmask:1
1420 *
1421 * This IOCTL gets the txchainmask that was set
1422 * This command is useful if it was previously set
1423 *
1424 * @E.g: iwpriv wlan0 get_txchainmask
1425 *
1426 * Supported Feature: STA
1427 *
1428 * Usage: Internal/External
1429 *
1430 * </ioctl>
1431 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001432#define WE_GET_TX_CHAINMASK 24
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301433/*
1434 * <ioctl>
1435 * get_rxchainmask - Get the rxchainmask that was set
1436 *
1437 * @INPUT: None
1438 *
1439 * @OUTPUT: rxchainmask
1440 * wlan0 get_rxchainmask:1
1441 *
1442 * This IOCTL gets the rxchainmask that was set
1443 * This command is useful only if it was previously set.
1444 *
1445 * @E.g: iwpriv wlan0 get_rxchainmask
1446 *
1447 * Supported Feature: STA
1448 *
1449 * Usage: Internal/External
1450 *
1451 * </ioctl>
1452 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001453#define WE_GET_RX_CHAINMASK 25
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301454/*
1455 * <ioctl>
1456 * get_11nrate - Get the fixed Tx data rate
1457 *
1458 * @INPUT: None
1459 *
1460 * @OUTPUT: Using this command does not return the same value as set
1461 * wlan0 get_11nrate:0
1462 *
1463 * This IOCTL gets the fixed Tx data rate
1464 * This command is useful only if setting the fixed Tx rate.
1465 *
1466 * @E.g: iwpriv wlan0 get_11nrate
1467 *
1468 * Supported Feature: STA
1469 *
1470 * Usage: Internal/External
1471 *
1472 * </ioctl>
1473 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001474#define WE_GET_11N_RATE 26
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301475/*
1476 * <ioctl>
1477 * get_ampdu - Get the maximum subframe of ampdu
1478 *
1479 * @INPUT: None
1480 *
1481 * @OUTPUT: Maximum subframe of ampdu
1482 * wlan0 get_ampdu:1
1483 *
1484 * This IOCTL gets the maximum subframe of ampdu
1485 * This command is useful only if setting ampdu.
1486 *
1487 * @E.g: iwpriv wlan0 get_ampdu
1488 *
1489 * Supported Feature: STA
1490 *
1491 * Usage: Internal/External
1492 *
1493 * </ioctl>
1494 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001495#define WE_GET_AMPDU 27
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301496/*
1497 * <ioctl>
1498 * get_amsdu - Get the maximum subframe of amsdu
1499 *
1500 * @INPUT: None
1501 *
1502 * @OUTPUT: Maximum subframe of amsdu
1503 * wlan0 get_amsdu:1
1504 *
1505 * This IOCTL gets the maximum subframe of amsdu.
1506 * This command is useful only if setting amsdu
1507 *
1508 * @E.g: iwpriv wlan0 get_amsdu
1509 *
1510 * Supported Feature: STA
1511 *
1512 * Usage: Internal/External
1513 *
1514 * </ioctl>
1515 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001516#define WE_GET_AMSDU 28
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301517/*
1518 * <ioctl>
1519 * get_txpow2g - Get the current 2 GHz Tx power setting
1520 *
1521 * @INPUT: None
1522 *
1523 * @OUTPUT: Tx Power in dbm
1524 * wlan0 get_txpow2g:0
1525 *
1526 * This IOCTL gets the current 2 GHz Tx power setting
1527 * This command is useful if setting Tx power
1528 *
1529 * @E.g: iwpriv wlan0 get_txpow2g
1530 *
1531 * Supported Feature: STA
1532 *
1533 * Usage: Internal/External
1534 *
1535 * </ioctl>
1536 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001537#define WE_GET_TXPOW_2G 29
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301538/*
1539 * <ioctl>
1540 * get_txpow5g - Get the current 5 GHz Tx power setting
1541 *
1542 * @INPUT: None
1543 *
1544 * @OUTPUT: Tx Power in dbm
1545 * wlan0 get_txpow5g:0
1546 *
1547 * This IOCTL gets the current 5 GHz Tx power setting
1548 * This command is useful if setting Tx power
1549 *
1550 * @E.g: iwpriv wlan0 get_txpow5g
1551 *
1552 * Supported Feature: STA
1553 *
1554 * Usage: Internal/External
1555 *
1556 * </ioctl>
1557 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001558#define WE_GET_TXPOW_5G 30
Rajeev Kumar1bcfd632015-12-07 11:38:51 -08001559/* 31 is unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001560#define WE_GET_PPS_PAID_MATCH 32
1561#define WE_GET_PPS_GID_MATCH 33
1562#define WE_GET_PPS_EARLY_TIM_CLEAR 34
1563#define WE_GET_PPS_EARLY_DTIM_CLEAR 35
1564#define WE_GET_PPS_EOF_PAD_DELIM 36
1565#define WE_GET_PPS_MACADDR_MISMATCH 37
1566#define WE_GET_PPS_DELIM_CRC_FAIL 38
1567#define WE_GET_PPS_GID_NSTS_ZERO 39
1568#define WE_GET_PPS_RSSI_CHECK 40
1569/* Private ioctl for QPower */
1570#define WE_GET_QPOWER_MAX_PSPOLL_COUNT 41
1571#define WE_GET_QPOWER_MAX_TX_BEFORE_WAKE 42
1572#define WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 43
1573#define WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 44
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301574/*
1575 * <ioctl>
1576 * get_burst_en - Enables or disables the burst feature
1577 *
1578 * @INPUT: None
1579 *
1580 * @OUTPUT: Enable/disable of burst feature
1581 * wlan0 get_burst_en:1
1582 *
1583 * This IOCTL enables or disables the burst feature
1584 *
1585 * @E.g: iwpriv wlan0 get_burst_en
1586 *
1587 * Supported Feature:STA
1588 *
1589 * Usage: Internal/External
1590 *
1591 * </ioctl>
1592 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001593#define WE_GET_BURST_ENABLE 45
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301594/*
1595 * <ioctl>
1596 * get_burst_dur - Get the burst duration
1597 *
1598 * @INPUT: None
1599 *
1600 * @OUTPUT: Duration in microseconds
1601 * wlan0 get_burst_dur:8160
1602 *
1603 * This IOCTL gets the burst duration
1604 * This command is useful if setting burst enable
1605 *
1606 * @E.g: iwpriv wlan0 get_burst_dur
1607 *
1608 * Supported Feature: STA
1609 *
1610 * Usage: Internal/External
1611 *
1612 * </ioctl>
1613 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001614#define WE_GET_BURST_DUR 46
1615/* GTX Commands */
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301616/*
1617 * <ioctl>
1618 * get_gtxHTMcs - Get the tx HTM
1619 *
1620 * @INPUT: None
1621 *
1622 * @OUTPUT: HTM
1623 * wlan0 get_gtxHTMcs:32896
1624 *
1625 * This IOTCL used to get HTM
1626 *
1627 * @E.g: iwpriv wlan0 get_gtxHTMcs
1628 *
1629 * Supported Feature: STA
1630 *
1631 * Usage: Internal/External
1632 *
1633 * </ioctl>
1634 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001635#define WE_GET_GTX_HT_MCS 47
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301636/*
1637 * <ioctl>
1638 * get_gtxVHTMcs - Get the VHTM
1639 *
1640 * @INPUT: None
1641 *
1642 * @OUTPUT: VHTM
1643 * wlan0 get_gtxVHTMcs:524800
1644 *
1645 * This IOTCL used to get the VHTM
1646 *
1647 * @E.g: iwpriv wlan0 get_gtxVHTMcs
1648 *
1649 * Supported Feature: STA
1650 *
1651 * Usage: Internal/External
1652 *
1653 * </ioctl>
1654 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001655#define WE_GET_GTX_VHT_MCS 48
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301656/*
1657 * <ioctl>
1658 * get_gtxUsrCfg - Get the tx cfg
1659 *
1660 * @INPUT: None
1661 *
1662 * @OUTPUT: TXCFG
1663 * wlan0 get_gtxUsrCfg:32
1664 *
1665 * This IOTCL used to get the tx cfg
1666 *
1667 * @E.g: iwpriv wlan0 get_gtxUsrCfg
1668 *
1669 * Supported Feature: STA
1670 *
1671 * Usage: Internal/External
1672 *
1673 * </ioctl>
1674 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001675#define WE_GET_GTX_USRCFG 49
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301676/*
1677 * <ioctl>
1678 * get_gtxThre - Get the tx threshold
1679 *
1680 * @INPUT: None
1681 *
1682 * @OUTPUT: Threshold
1683 * wlan0 get_gtxThre:3
1684 *
1685 * This IOCTL is used to get tx threshold
1686 *
1687 * @E.g: iwpriv wlan0 get_gtxThre
1688 *
1689 * Supported Feature: STA
1690 *
1691 * Usage: Internal/External
1692 *
1693 * </ioctl>
1694 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001695#define WE_GET_GTX_THRE 50
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301696/*
1697 * <ioctl>
1698 * get_gtxMargin - Get the tx margin
1699 *
1700 * @INPUT: None
1701 *
1702 * @OUTPUT: GTXMARGIN
1703 * wlan0 get_gtxMargin:2
1704 *
1705 * This IOCTL is used to set tx margin
1706 *
1707 * @E.g: iwpriv wlan0 get_gtxMargin
1708 *
1709 * Supported Feature: STA
1710 *
1711 * Usage: Internal/External
1712 *
1713 * </ioctl>
1714 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001715#define WE_GET_GTX_MARGIN 51
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301716/*
1717 * <ioctl>
1718 * get_gtxStep - Get the tx step
1719 *
1720 * @INPUT: None
1721 *
1722 * @OUTPUT: GTXSTEP
1723 * wlan0 get_gtxStep:0
1724 *
1725 * This IOCTL is used to get the gtx step
1726 *
1727 * @E.g: iwpriv wlan0 get_gtxStep
1728 *
1729 * Supported Feature: STA
1730 *
1731 * Usage: Internal/External
1732 *
1733 * </ioctl>
1734 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735#define WE_GET_GTX_STEP 52
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301736/*
1737 * <ioctl>
1738 * get_gtxMinTpc - Get the tx miminum tpc
1739 *
1740 * @INPUT: None
1741 *
1742 * @OUTPUT: TPC
1743 * wlan0 get_gtxMinTpc:0
1744 *
1745 * This IOCTL is used to get tx miminum tpc
1746 *
1747 * @E.g: iwpriv wlan0 get_gtxMinTpc
1748 *
1749 * Supported Feature: STA
1750 *
1751 * Usage: Internal/External
1752 *
1753 * </ioctl>
1754 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001755#define WE_GET_GTX_MINTPC 53
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301756/*
1757 * <ioctl>
1758 * get_gtxBWMask - Get the tx BW MASK
1759 *
1760 * @INPUT: None
1761 *
1762 * @OUTPUT: MASK
1763 * wlan0 get_gtxBWMask:15
1764 *
1765 * This IOCTL is used get gtx bw mask
1766 *
1767 * @E.g: iwpriv wlan0 get_gtxBWMask
1768 *
1769 * Supported Feature: STA
1770 *
1771 * Usage: Internal/External
1772 *
1773 * </ioctl>
1774 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001775#define WE_GET_GTX_BWMASK 54
1776#define WE_GET_TEMPERATURE 56
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07001777#define WE_CAP_TSF 58
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07001778#define WE_GET_ROAM_SYNCH_DELAY 59
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001779
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07001780/*
1781 * <ioctl>
1782 * get_dcm - Get dcm enablement value
1783 *
1784 * @INPUT: None
1785 *
1786 * @OUTPUT: 0/1
1787 * wlan0 get_dcm
1788 *
1789 * This IOCTL is used get dcm value
1790 *
1791 * Supported Feature: STA/SAP
1792 *
1793 * Usage: Internal
1794 *
1795 * </ioctl>
1796 */
1797#define WE_GET_DCM 60
1798
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07001799/*
1800 * <ioctl>
1801 * get_dcm - Get range extension enablement value
1802 *
1803 * @INPUT: None
1804 *
1805 * @OUTPUT: 0/1
1806 * wlan0 get_range_ext
1807 *
1808 * This IOCTL is used get range_extension value
1809 *
1810 * Supported Feature: STA/SAP
1811 *
1812 * Usage: Internal
1813 *
1814 * </ioctl>
1815 */
1816#define WE_GET_RANGE_EXT 61
1817
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001818/* Private ioctls and their sub-ioctls */
1819#define WLAN_PRIV_SET_INT_GET_INT (SIOCIWFIRSTPRIV + 2)
1820
1821/* Private ioctls and their sub-ioctls */
1822#define WLAN_PRIV_SET_CHAR_GET_NONE (SIOCIWFIRSTPRIV + 3)
1823#define WE_WOWL_ADD_PTRN 1
1824#define WE_WOWL_DEL_PTRN 2
Sreelakshmi Konamkided64d72017-02-23 10:39:26 +05301825/*
1826 * <ioctl>
1827 * neighbor - Send neighbor report request
1828 *
1829 * @INPUT: string
1830 *
1831 * @OUTPUT: None
1832 *
1833 * This IOCTL create a Neighbor report request and send it to peer
1834 *
1835 * @E.g: iwpriv wlan0 neighbor "SSID"
1836 *
1837 * Supported Feature: 11k
1838 *
1839 * Usage: Internal/External
1840 *
1841 * </ioctl>
1842 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001843#define WE_NEIGHBOR_REPORT_REQUEST 3
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301844/*
1845 * <ioctl>
1846 * set_ap_wps_ie - Set the P2P IE of the probe response
1847 *
1848 * @INPUT: string
1849 *
1850 * @OUTPUT: None
1851 *
1852 * This IOCTL sets the P2P IE of the probe response
1853 *
1854 * @E.g: iwpriv wlan0 set_ap_wps_ie abcd
1855 *
1856 * Supported Feature: STA
1857 *
1858 * Usage: Internal/External
1859 *
1860 * </ioctl>
1861 */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07001862#define WE_SET_AP_WPS_IE 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001863#define WE_SET_CONFIG 5
1864
1865/* Private ioctls and their sub-ioctls */
1866#define WLAN_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV + 4)
1867#define WE_SET_WLAN_DBG 1
1868#define WE_SET_DP_TRACE 2
1869#define WE_SET_SAP_CHANNELS 3
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05301870#define WE_SET_FW_TEST 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001871
1872/* Private ioctls and their sub-ioctls */
1873#define WLAN_PRIV_GET_CHAR_SET_NONE (SIOCIWFIRSTPRIV + 5)
1874#define WE_WLAN_VERSION 1
1875#define WE_GET_STATS 2
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301876/*
1877 * <ioctl>
1878 * getConfig - gets the values of all configurations listed in WCNSS
1879 *
1880 * @INPUT: None
1881 *
1882 * @OUTPUT: Current configuration to the sys log
1883 * wlan0 getConfig: WLAN configuration written to system log
1884 *
1885 * This IOCTL gets the values of all configurations listed in WCNSS
1886 *
1887 * @E.g: iwpriv wlan0 getConfig
1888 *
1889 * Supported Feature: STA
1890 *
1891 * Usage: Internal/External
1892 *
1893 * </ioctl>
1894 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001895#define WE_GET_CFG 3
1896#define WE_GET_WMM_STATUS 4
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301897/*
1898 * <ioctl>
1899 * getChannelList - Get the available channel list while in QCMobileAP
1900 *
1901 * @INPUT: None
1902 *
1903 * @OUTPUT: Channel list
1904 * wlan0 getChannelList:36 US 1..165
1905 *
1906 * This IOCTL gets the available channel list while in QCMobileAP
1907 *
1908 * @E.g: iwpriv wlan0 getChannelList
1909 *
1910 * Supported Feature: STA
1911 *
1912 * Usage: Internal/External
1913 *
1914 * </ioctl>
1915 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001916#define WE_GET_CHANNEL_LIST 5
Sen, Devendra9ca8c432017-02-23 15:10:26 +05301917/*
1918 * <ioctl>
1919 * getRSSI - Get the Received Signal Strength Indicator
1920 *
1921 * @INPUT: None
1922 *
1923 * @OUTPUT: RSSI
1924 * wlan0 getRSSI:rsssi=-32
1925 *
1926 * This IOCTL gets the Received Signal Strength Indicator (RSSI)
1927 *
1928 * @E.g: iwpriv wlan0 getRSSI
1929 *
1930 * Supported Feature: STA
1931 *
1932 * Usage: Internal/External
1933 *
1934 * </ioctl>
1935 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001936#define WE_GET_RSSI 6
Dustin Brownd9322482017-01-09 12:46:03 -08001937
1938/*
1939 * <ioctl>
1940 * getSuspendStats - Get suspend/resume stats
1941 *
1942 * @INPUT: None
1943 *
1944 * @OUTPUT: character string containing formatted suspend/resume stats
1945 *
1946 * This ioctl is used to get suspend/resume stats formatted for display.
1947 * Currently it includes suspend/resume counts, wow wake up reasons, and
1948 * suspend fail reasons.
1949 *
1950 * @E.g: iwpriv wlan0 getSuspendStats
1951 * iwpriv wlan0 getSuspendStats
1952 *
1953 * Supported Feature: suspend/resume
1954 *
1955 * Usage: Internal
1956 *
1957 * </ioctl>
1958 */
1959#define WE_GET_SUSPEND_RESUME_STATS 7
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001960#ifdef FEATURE_WLAN_TDLS
Nitesh Shah5dfb99e2016-12-10 14:19:46 +05301961/*
1962 * <ioctl>
1963 * getTdlsPeers - Get all TDLS peers.
1964 *
1965 * @INPUT: None
1966 *
1967 * @OUTPUT: Returns the MAC address of all the TDLS peers
1968 * wlan0 getTdlsPeers:
1969 * MAC Id cap up RSSI
1970 * ---------------------------------
1971 * 00:0a:f5:0e:bd:18 2 Y Y -44
1972 * 00:0a:f5:bf:0e:12 0 N N 0
1973 *
1974 * This IOCTL is used to get all TDLS peers.
1975 *
1976 * @E.g: iwpriv wlan0 getTdlsPeers
1977 *
1978 * Supported Feature: TDLS
1979 *
1980 * Usage: Internal/External
1981 *
1982 * </ioctl>
1983 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984#define WE_GET_TDLS_PEERS 8
1985#endif
1986#ifdef WLAN_FEATURE_11W
Abhishek Singh2f810492016-12-01 11:39:39 +05301987/*
1988 * <ioctl>
1989 * getPMFInfo - get the PMF info of the connected session
1990 *
1991 * @INPUT: None
1992 *
1993 * @OUTPUT:
1994 * wlan0 getPMFInfo:
1995 * BSSID E4:F4:C6:0A:E0:36, Is PMF Assoc? 0
1996 * Number of Unprotected Disassocs 0
1997 * Number of Unprotected Deauths 0
1998 *
1999 * This IOCTL is used to get the PMF stats/status of the current
2000 * connection.
2001 *
2002 * @e.g:iwpriv wlan0 getPMFInfo
2003 *
2004 * Supported Feature: PMF
2005 *
2006 * Usage: Internal/External
2007 *
2008 * </ioctl>
2009 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002010#define WE_GET_11W_INFO 9
2011#endif
2012#define WE_GET_STATES 10
Abhishek Singh49b654e2016-12-01 16:11:17 +05302013/*
2014 * <ioctl>
2015 * getIbssSTAs - get ibss sta info
2016 *
2017 * @INPUT: None
2018 *
2019 * @OUTPUT: Give the MAC of the IBSS STA
2020 * wlan0 getIbssSTAs:
2021 * 1 .8c:fd:f0:01:9c:bf
2022 *
2023 * This IOCTL is used to get ibss sta info
2024 *
2025 * @E.g: iwpriv wlan0 getIbssSTAs
2026 *
2027 * Supported Feature: IBSS
2028 *
2029 * Usage: Internal/External
2030 *
2031 * </ioctl>
2032 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002033#define WE_GET_IBSS_STA_INFO 11
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302034/*
2035 * <ioctl>
2036 * getphymode - Get the current phymode.
2037 *
2038 * @INPUT: None
2039 *
2040 * @OUTPUT: In phymode
2041 * wlan0 getphymode:AUTO MODE
2042 *
2043 * This IOCTL used to gets the current phymode.
2044 *
2045 * @E.g: iwpriv wlan0 getphymode
2046 *
2047 * Supported Feature: STA
2048 *
2049 * Usage: Internal/External
2050 *
2051 * </ioctl>
2052 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002053#define WE_GET_PHYMODE 12
Naveen Rawat910726a2017-03-06 11:42:51 -08002054
2055/*
2056 * <ioctl>
2057 * getOemDataCap - Get the oem data caps.
2058 *
2059 * @INPUT: None
2060 *
2061 * @OUTPUT: oem data capability
2062 *
2063 * This IOCTL used to gets the current oem data cap.
2064 *
2065 * @E.g: iwpriv wlan0 getOemDataCap
2066 *
2067 * Usage: Internal/External
2068 *
2069 * </ioctl>
2070 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002071#define WE_GET_OEM_DATA_CAP 13
Naveen Rawat910726a2017-03-06 11:42:51 -08002072
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302073/*
2074 * <ioctl>
2075 * getSNR - Enable SNR Monitoring
2076 *
2077 * @INPUT: None
2078 *
2079 * @OUTPUT: Signal strength/ratio
2080 * wlan0 getSNR:1
2081 *
2082 * This IOCTL is used to get ibss sta info
2083 *
2084 * @E.g: iwpriv wlan0 getSNR
2085 *
2086 * Supported Feature: STA
2087 *
2088 * Usage: Internal/External
2089 *
2090 * </ioctl>
2091 */
Naveen Rawat910726a2017-03-06 11:42:51 -08002092
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002093#define WE_GET_SNR 14
Govind Singha471e5e2015-10-12 17:11:14 +05302094#define WE_LIST_FW_PROFILE 15
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002095
2096/* Private ioctls and their sub-ioctls */
2097#define WLAN_PRIV_SET_NONE_GET_NONE (SIOCIWFIRSTPRIV + 6)
Selvaraj, Sridharf7939832017-03-25 16:59:50 +05302098
2099/*
2100 * <ioctl>
2101 * reassoc - Trigger STA re-association to the connected AP
2102 *
2103 * @INPUT: None
2104 *
2105 * @OUTPUT: None
2106 *
2107 * This IOCTL is used to trigger STA reassociation to the connected AP.
2108 *
2109 * @E.g: iwpriv wlan0 reassoc
2110 *
2111 * Supported Feature: Roaming
2112 *
2113 * Usage: Internal
2114 *
2115 * </ioctl>
2116 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002117#define WE_SET_REASSOC_TRIGGER 8
Abhishek Singh49b654e2016-12-01 16:11:17 +05302118/*
2119 * <ioctl>
2120 * ibssPeerInfoAll - Print the ibss peers's MAC, rate and RSSI
2121 *
2122 * @INPUT: None
2123 *
2124 * @OUTPUT: print ibss peer in info logs
2125 * pPeerInfo->numIBSSPeers = 1
2126 * PEER ADDR : 8c:fd:f0:01:9c:bf TxRate: 1 Mbps RSSI: -35
2127 *
2128 * This IOCTL is used to rint the ibss peers's MAC, rate and RSSI
2129 * in info logs
2130 *
2131 * @E.g: iwpriv wlan0 ibssPeerInfoAll
2132 *
2133 * Supported Feature: IBSS
2134 *
2135 * Usage: Internal/External
2136 *
2137 * </ioctl>
2138 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002139#define WE_IBSS_GET_PEER_INFO_ALL 10
Rajeev Kumarf4390fa2016-12-22 13:17:33 -08002140/* Sub ioctls 11 to 16 are not used */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002141#define WE_GET_RECOVERY_STAT 17
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -08002142#define WE_GET_FW_PROFILE_DATA 18
yeshwanth sriram guntukabdfe4352017-02-16 14:44:31 +05302143/*
2144 * <ioctl>
2145 * stop_obss_scan - Stop obss scan
2146 *
2147 * @INPUT: None
2148 *
2149 * @OUTPUT: None
2150 *
2151 * This IOCTL is used to stop obss scan
2152 *
2153 * @E.g: iwpriv wlan0 stop_obss_scan
2154 *
2155 * Supported Feature: Scan
2156 *
2157 * Usage: Internal/External
2158 *
2159 * </ioctl>
2160 */
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -08002161#define WE_STOP_OBSS_SCAN 19
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002162
2163/* Private ioctls and their sub-ioctls */
2164#define WLAN_PRIV_SET_VAR_INT_GET_NONE (SIOCIWFIRSTPRIV + 7)
2165
2166#define WE_P2P_NOA_CMD 2
Manjeet Singhf82ed072016-07-08 11:40:00 +05302167/* subcommands 3 is unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002168
Manjeet Singhf82ed072016-07-08 11:40:00 +05302169#define WE_MAC_PWR_DEBUG_CMD 4
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170
2171#ifdef FEATURE_WLAN_TDLS
Nitesh Shah5dfb99e2016-12-10 14:19:46 +05302172/*
2173 * <ioctl>
2174 * setTdlsConfig - Set TDLS configuration parameters.
2175 *
2176 * @INPUT: 11 TDLS configuration parameters
2177 * @args[0]: tdls: [0..2]
2178 * @args[1]: tx_period_t: [1000..4294967295UL]
2179 * @args[2]: tx_packet_n: [0..4294967295UL]
2180 * @args[3]: [discovery_period is not used anymore]
2181 * @args[4]: discovery_tries_n: [1..100]
2182 * @args[5]: [idle_timeout is not used anymore]
2183 * @args[6]: idle_packet_n: [0..40000]
2184 * @args[7]: [rssi_hysteresis is not used anymore]
2185 * @args[8]: rssi_trigger_threshold: [-120..0]
2186 * @args[9]: rssi_teardown_threshold: [-120..0]
2187 * @args[10]: rssi_delta: [-30..0]
2188 *
2189 * @OUTPUT: None
2190 *
2191 * This IOCTL is used to set the TDLS configuration parameters.
2192 *
2193 * @E.g: iwpriv wlan0 setTdlsConfig tdls tx_period_t tx_packet_n
2194 * discovery_period discovery_tries_n idle_timeout
2195 * idle_packet_n rssi_hysteresis rssi_trigger_threshold
2196 * rssi_teardown_threshold rssi_delta
2197 * iwpriv wlan0 setTdlsConfig 1 1500 40 1 5 1 5 0 -70 -70 -10
2198 *
2199 * Supported Feature: TDLS
2200 *
2201 * Usage: Internal/External
2202 *
2203 * </ioctl>
2204 */
2205
2206
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207#define WE_TDLS_CONFIG_PARAMS 5
2208#endif
Abhishek Singh49b654e2016-12-01 16:11:17 +05302209/*
2210 * <ioctl>
2211 * ibssPeerInfo - Print the ibss peers's MAC, rate and RSSI
2212 *
2213 * @INPUT: staid
2214 *
2215 * @OUTPUT: print ibss peer corresponding to staid in info logs
2216 * PEER ADDR : 8c:fd:f0:01:9c:bf TxRate: 1 Mbps RSSI: -35
2217 *
2218 * This IOCTL is used to print the specific ibss peers's MAC,
2219 * rate and RSSI in info logs
2220 *
2221 * @E.g: iwpriv wlan0 ibssPeerInfo <sta_id>
2222 * iwpriv wlan0 ibssPeerInfo 0
2223 *
2224 * Supported Feature: IBSS
2225 *
2226 * Usage: Internal/External
2227 *
2228 * </ioctl>
2229 */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002230#define WE_IBSS_GET_PEER_INFO 6
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231#define WE_UNIT_TEST_CMD 7
2232
2233#define WE_MTRACE_DUMP_CMD 8
2234#define WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD 9
2235
2236
2237#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
2238#define WE_LED_FLASHING_PARAM 10
2239#endif
2240
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302241/*
2242 * <ioctl>
2243 * pm_clist - Increments the index value of the concurrent connection list
2244 * and update with the input parameters provided.
2245 *
2246 * @INPUT: Following 8 arguments:
2247 * @vdev_id: vdev id
2248 * @tx_streams: TX streams
2249 * @rx_streams: RX streams
2250 * @chain_mask: Chain mask
2251 * @type: vdev_type
2252 * AP:1 STA:2 IBSS:3 Monitor:4 NAN:5 OCB:6 NDI:7
2253 * @sub_type: vdev_subtype
2254 * P2P_Device:1 P2P_Client:2 P2P_GO:3
2255 * Proxy_STA:4 Mesh:5 Mesh_11s:6
2256 * @channel: Channel
2257 * @mac: Mac id
2258 *
2259 * @OUTPUT: None
2260 *
2261 * This IOCTL is used to increments the index value of the concurrent connection
2262 * list and update with the input parameters provided.
2263 *
2264 * @E.g: iwpriv wlan0 pm_clist vdev_id tx_streams rx_streams chain_mask type
2265 * sub_type channel mac
2266 * iwpriv wlan0 pm_clist 1 2 2 1 2 3 10 1
2267 *
2268 * Supported Feature: DBS
2269 *
2270 * Usage: Internal/External
2271 *
2272 * </ioctl>
2273 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002274#define WE_POLICY_MANAGER_CLIST_CMD 11
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302275
2276/*
2277 * <ioctl>
2278 * pm_dlist - Delete the index from the concurrent connection list that is
2279 * present in the given vdev_id.
2280 *
2281 * @INPUT: delete_all, vdev_id
2282 * @delete_all: delete all indices
2283 * @vdev_id: vdev id
2284 *
2285 * @OUTPUT: None
2286 *
2287 * This IOCTL is used to delete the index from the concurrent connection list
2288 * that is present in the given vdev_id.
2289 *
2290 * @E.g: iwpriv wlan0 pm_dlist delete_all vdev_id
2291 * iwpriv wlan0 pm_dlist 0 1
2292 *
2293 * Supported Feature: DBS
2294 *
2295 * Usage: Internal/External
2296 *
2297 * </ioctl>
2298 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002299#define WE_POLICY_MANAGER_DLIST_CMD 12
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302300
2301/*
2302 * <ioctl>
2303 * pm_dbs - Set dbs capability and system preference
2304 *
2305 * @INPUT: dbs, system_pref
2306 * @dbs: Value of DBS capability to be set
2307 * @system_pref: System preference
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002308 * 0:PM_THROUGHPUT 1: PM_POWERSAVE 2: PM_LATENCY
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302309 *
2310 * @OUTPUT: None
2311 *
2312 * This IOCTL is used to set dbs capability and system preference.
2313 *
2314 * @E.g: iwpriv wlan0 pm_dbs dbs system_pref
2315 * iwpriv wlan0 pm_dbs 1 0
2316 *
2317 * Supported Feature: DBS
2318 *
2319 * Usage: Internal/External
2320 *
2321 * </ioctl>
2322 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002323#define WE_POLICY_MANAGER_DBS_CMD 13
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302324
2325/*
2326 * <ioctl>
2327 * pm_pcl - Set pcl for concurrency mode.
2328 *
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002329 * @INPUT: policy_mgr_con_mode
2330 * @policy_mgr_con_mode: concurrency mode for PCL table
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302331 * 0:STA 1:SAP 2:P2P_Client 3:P2P_GO 4:IBSS
2332 *
2333 * @OUTPUT: None
2334 *
2335 * This IOCTL is used to set pcl for concurrency mode.
2336 *
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08002337 * @E.g: iwpriv wlan0 pm_pcl policy_mgr_con_mode
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302338 * iwpriv wlan0 pm_pcl 0
2339 *
2340 * Supported Feature: DBS
2341 *
2342 * Usage: Internal/External
2343 *
2344 * </ioctl>
2345 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002346#define WE_POLICY_MANAGER_PCL_CMD 14
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302347
2348/*
2349 * <ioctl>
2350 * pm_cinfo - Shows the concurrent connection list.
2351 *
2352 * @INPUT: None
2353 *
2354 * @OUTPUT: None
2355 *
2356 * This IOCTL is used to show the concurrent connection list.
2357 *
2358 * @E.g: iwpriv wlan0 pm_cinfo
2359 *
2360 * Supported Feature: DBS
2361 *
2362 * Usage: Internal/External
2363 *
2364 * </ioctl>
2365 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002366#define WE_POLICY_MANAGER_CINFO_CMD 15
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302367
2368/*
2369 * <ioctl>
2370 * pm_ulist - Updates the index value of the concurrent connection list
2371 * with the input parameters provided.
2372 *
2373 * @INPUT: Following 8 arguments:
2374 * @vdev_id: vdev id
2375 * @tx_streams: TX streams
2376 * @rx_streams: RX streams
2377 * @chain_mask: Chain mask
2378 * @type: vdev_type
2379 * AP:1 STA:2 IBSS:3 Monitor:4 NAN:5 OCB:6 NDI:7
2380 * @sub_type: vdev_subtype
2381 * P2P_Device:1 P2P_Client:2 P2P_GO:3
2382 * Proxy_STA:4 Mesh:5 Mesh_11s:6
2383 * @channel: Channel
2384 * @mac: Mac id
2385 *
2386 * @OUTPUT: None
2387 *
2388 * This IOCTL is used to updates the index value of the concurrent
2389 * connection list with the input parameters provided.
2390 *
2391 * @E.g: iwpriv wlan0 pm_ulist vdev_id tx_streams rx_streams chain_mask type
2392 * sub_type channel mac
2393 * iwpriv wlan0 pm_ulist 1 2 2 1 2 3 10 1
2394 *
2395 * Supported Feature: DBS
2396 *
2397 * Usage: Internal/External
2398 *
2399 * </ioctl>
2400 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002401#define WE_POLICY_MANAGER_ULIST_CMD 16
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302402
2403/*
2404 * <ioctl>
2405 * pm_query_action - Initiate actions needed on current connections as
2406 * per the channel provided.
2407 *
2408 * @INPUT: channel
2409 * @channel: Channel on which new connection will be.
2410 *
2411 * @OUTPUT: None
2412 *
2413 * This IOCTL is used to initiate actions needed on current connections
2414 * as per the channel provided.
2415 *
2416 * @E.g: iwpriv wlan0 pm_query_action channel
2417 * iwpriv wlan0 pm_query_action 6
2418 *
2419 * Supported Feature: DBS
2420 *
2421 * Usage: Internal/External
2422 *
2423 * </ioctl>
2424 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425#define WE_POLICY_MANAGER_QUERY_ACTION_CMD 17
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302426
2427/*
2428 * <ioctl>
2429 * pm_query_allow - Checks for allowed concurrency combination
2430 *
2431 * @INPUT: mode, channel, bandwidth
2432 * @mode: new connection mode
2433 * 0:STA 1:SAP 2:P2P_Client 3:P2P_GO 4:IBSS
2434 * @channel: channel on which new connection is coming up
2435 * @bandwidth: Bandwidth requested by the connection
2436 * 0:None 1:5MHz 2:10MHz 3:20MHz
2437 * 4:40MHz 5:80MHz 6:80+80MHz 7:160MHz
2438 *
2439 * @OUTPUT: None
2440 *
2441 * This IOCTL is used to checks for allowed concurrency combination.
2442 *
2443 * @E.g: iwpriv wlan0 pm_query_allow mode channel bandwidth
2444 * iwpriv wlan0 pm_query_allow 0 6 4
2445 *
2446 * Supported Feature: DBS
2447 *
2448 * Usage: Internal/External
2449 *
2450 * </ioctl>
2451 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002452#define WE_POLICY_MANAGER_QUERY_ALLOW_CMD 18
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302453
2454/*
2455 * <ioctl>
2456 * pm_run_scenario - Create scenario with number of connections provided.
2457 *
2458 * @INPUT: num_of_conn
2459 * @num_of_conn: the number of connections (values: 1~3)
2460 *
2461 * @OUTPUT: None
2462 *
2463 * This IOCTL is used to create scenario with the number of connections
2464 * provided.
2465 *
2466 * @E.g: iwpriv wlan0 pm_run_scenario num_of_conn
2467 * iwpriv wlan0 pm_run_scenario 1
2468 *
2469 * Supported Feature: DBS
2470 *
2471 * Usage: Internal/External
2472 *
2473 * </ioctl>
2474 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002475#define WE_POLICY_MANAGER_SCENARIO_CMD 19
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302476
2477/*
2478 * <ioctl>
2479 * pm_set_hw_mode - Set hardware for single/dual mac.
2480 *
2481 * @INPUT: hw_mode
2482 * 0:single mac 1:dual mac
2483 *
2484 * @OUTPUT: None
2485 *
2486 * This IOCTL is used to set hardware for single/dual mac.
2487 *
2488 * @E.g: iwpriv wlan0 pm_set_hw_mode hw_mode
2489 * iwpriv wlan0 pm_set_hw_mode 1
2490 *
2491 * Supported Feature: DBS
2492 *
2493 * Usage: Internal/External
2494 *
2495 * </ioctl>
2496 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497#define WE_POLICY_SET_HW_MODE_CMD 20
2498
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302499/*
2500 * <ioctl>
2501 * set_scan_cfg - Set dual MAC scan config parameters.
2502 *
2503 * @INPUT: dbs, dbs_plus_agile_scan, single_mac_scan_with_dbs
2504 * @dbs: Value of DBS bit
2505 * @dbs_plus_agile_scan: Value of DBS plus agile scan bit
2506 * @single_mac_scan_with_dbs: Value of Single MAC scan with DBS
2507 *
2508 * @OUTPUT: None
2509 *
2510 * This IOCTL is used to set the dual MAC scan config.
2511 *
2512 * @E.g: iwpriv wlan0 set_scan_cfg dbs dbs_plus_agile_scan
2513 * single_mac_scan_with_dbs
2514 * iwpriv wlan0 set_scan_cfg 1 0 1
2515 *
2516 * Supported Feature: DBS
2517 *
2518 * Usage: Internal/External
2519 *
2520 * </ioctl>
2521 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002522#define WE_SET_DUAL_MAC_SCAN_CONFIG 21
Nitesh Shahf9503dd2016-12-15 20:26:07 +05302523
2524/*
2525 * <ioctl>
2526 * set_fw_mode_cfg - Sets the dual mac FW mode config
2527 *
2528 * @INPUT: dbs, dfs
2529 * @dbs: DBS bit
2530 * @dfs: Agile DFS bit
2531 *
2532 * @OUTPUT: None
2533 *
2534 * This IOCTL is used to set the dual mac FW mode config.
2535 *
2536 * @E.g: iwpriv wlan0 set_fw_mode_cfg dbs dfs
2537 * iwpriv wlan0 set_fw_mode_cfg 1 1
2538 *
2539 * Supported Feature: DBS
2540 *
2541 * Usage: Internal/External
2542 *
2543 * </ioctl>
2544 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002545#define WE_SET_DUAL_MAC_FW_MODE_CONFIG 22
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -07002546#define WE_SET_MON_MODE_CHAN 23
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002547
2548#ifdef FEATURE_WLAN_TDLS
2549#undef MAX_VAR_ARGS
2550#define MAX_VAR_ARGS 11
2551#else
2552#undef MAX_VAR_ARGS
2553#define MAX_VAR_ARGS 9
2554#endif
2555
Jeff Johnson6fa1e012017-04-05 06:40:53 -07002556/*
2557 * <ioctl>
2558 * fips_test - Perform a FIPS test
2559 *
2560 * @INPUT: Binary representation of the following packed structure
2561 *
2562 * @OUTPUT: Binary representation of the following packed structure
2563 *
2564 * This IOCTL is used to perform FIPS certification testing
2565 *
2566 * @E.g: iwpriv wlan0 fips_test <test vector>
2567 *
2568 * iwpriv wlan0 fips_test <tbd>
2569 *
2570 * Supported Feature: FIPS
2571 *
2572 * Usage: Internal
2573 *
2574 * </ioctl>
2575 */
2576#define WLAN_PRIV_FIPS_TEST (SIOCIWFIRSTPRIV + 8)
2577
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578/* Private ioctls (with no sub-ioctls) */
2579/* note that they must be odd so that they have "get" semantics */
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302580/*
2581 * <ioctl>
2582 * addTspec - Add TSPEC for each AC
2583 *
2584 * @INPUT: 19 TSPEC params
2585 * @[arg0]: handle
2586 * @[arg1]: tid
2587 * @[arg2]: dir
2588 * @[arg3]: psb
2589 * @[arg4]: up
2590 * @[arg5]: nomMsduSize
2591 * @[arg6]: maxMsduSize
2592 * @[arg7]: minDataRate
2593 * @[arg8]: meanDataRate
2594 * @[arg9]: peakDataRate
2595 * @[arg10]: maxBurstSize
2596 * @[arg11]: minPhyRate
2597 * @[arg12]: sba
2598 * @[arg13]: minServiceIntv
2599 * @[arg14]: suspendIntv
2600 * @[arg15]: burstSizeDefn
2601 * @[arg16]: ackPolicy
2602 * @[arg17]: inactivityPeriod
2603 * @[arg18]: maxServiceIntv
2604 *
2605 * @OUTPUT: Success/Failure
2606 *
2607 * This IOCTL is used to add TSPEC for each AC.
2608 *
2609 * @E.g: iwpriv wlan0 addTspec <handle> <tid> <dir> <psb> <up> <nomMsduSize>
2610 * <maxMsduSize> <minDataRate> <meanDataRate>
2611 * <peakDataRate> <maxBurstSize> <minPhyRate>
2612 * <sba> <minServiceIntv> <suspendIntv>
2613 * <burstSizeDefn> <ackPolicy> <inactivityPeriod>
2614 * <maxServiceIntv>
2615 * iwpriv wlan0 addTspec 7001 6 2 1 6 0x80D0 0x80D0 0x14500 0x14500 0x14500
2616 * 0 0x5B8D80 0x2001 20 2000 0 0 0 2000
2617 * wlan0 addTspec:3
2618 *
2619 * Supported Feature: WMM
2620 *
2621 * Usage: Internal/External
2622 *
2623 * </ioctl>
2624 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002625#define WLAN_PRIV_ADD_TSPEC (SIOCIWFIRSTPRIV + 9)
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302626/*
2627 * <ioctl>
2628 * delTspec - Delete TSPEC entry for each AC
2629 *
2630 * @INPUT: 1 TSPEC param
2631 * @[arg0]: handle
2632 *
2633 * @OUTPUT: Success/Failure
2634 *
2635 * This IOCTL is used to delete TSPEC entry for each AC.
2636 *
2637 * @E.g: iwpriv wlan0 delTspec <handle>
2638 * iwpriv wlan0 delTspec 7001
2639 * wlan0 delTspec:16
2640 *
2641 * Supported Feature: WMM
2642 *
2643 * Usage: Internal/External
2644 *
2645 * </ioctl>
2646 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002647#define WLAN_PRIV_DEL_TSPEC (SIOCIWFIRSTPRIV + 11)
Sreelakshmi Konamki9be8d412017-03-01 10:29:08 +05302648/*
2649 * <ioctl>
2650 * getTspec - Get TSPEC entry for each AC
2651 *
2652 * @INPUT: 1 TSPEC param
2653 * @[arg0]: handle
2654 *
2655 * @OUTPUT: Success/Failure
2656 *
2657 * This IOCTL is used to get TSPEC entry for each AC.
2658 *
2659 * @E.g: iwpriv wlan0 getTspec <handle>
2660 * iwpriv wlan0 getTspec 7001
2661 * wlan0 delTspec:18
2662 *
2663 * Supported Feature: WMM
2664 *
2665 * Usage: Internal/External
2666 *
2667 * </ioctl>
2668 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669#define WLAN_PRIV_GET_TSPEC (SIOCIWFIRSTPRIV + 13)
2670
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671/* (SIOCIWFIRSTPRIV + 10) is currently unused */
2672/* (SIOCIWFIRSTPRIV + 12) is currently unused */
2673/* (SIOCIWFIRSTPRIV + 14) is currently unused */
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07002674#define WLAN_PRIV_SET_NONE_GET_THREE_INT (SIOCIWFIRSTPRIV + 15)
2675#define WE_GET_TSF 1
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002676/* (SIOCIWFIRSTPRIV + 16) is currently unused */
2677/* (SIOCIWFIRSTPRIV + 17) is currently unused */
2678/* (SIOCIWFIRSTPRIV + 19) is currently unused */
2679
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002680#define WLAN_PRIV_SET_FTIES (SIOCIWFIRSTPRIV + 20)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002681
2682/* Private ioctl for setting the host offload feature */
2683#define WLAN_PRIV_SET_HOST_OFFLOAD (SIOCIWFIRSTPRIV + 18)
2684
2685/* Private ioctl to get the statistics */
2686#define WLAN_GET_WLAN_STATISTICS (SIOCIWFIRSTPRIV + 21)
2687
2688/* Private ioctl to set the Keep Alive Params */
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302689/*
2690 * <ioctl>
2691 * setKeepAlive - Set the keep alive feature
2692 *
2693 * @INPUT: 28 bytes of information in the order of packet type, time period
2694 * host IPv4 address, destination IPv4 address, destination MAC address, bssID
2695 *
2696 * @OUTPUT: None
2697 *
2698 * This IOCTL sets the keep alive feature to send either NULL
2699 * or unsolicited ARP response packets
2700 *
2701 * @E.g: iwpriv wlan0 setKeepAlive
2702 *
2703 * Supported Feature: STA
2704 *
2705 * Usage: Internal/External
2706 *
2707 * </ioctl>
2708 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709#define WLAN_SET_KEEPALIVE_PARAMS (SIOCIWFIRSTPRIV + 22)
2710
2711#ifdef WLAN_FEATURE_PACKET_FILTERING
2712/* Private ioctl to set the packet filtering params */
2713#define WLAN_SET_PACKET_FILTER_PARAMS (SIOCIWFIRSTPRIV + 23)
2714#endif
2715
2716
2717#ifdef FEATURE_WLAN_SCAN_PNO
2718/* Private ioctl to get the statistics */
2719#define WLAN_SET_PNO (SIOCIWFIRSTPRIV + 24)
2720#endif
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302721/*
2722 * <ioctl>
2723 * SETBAND - Set the operational band
2724 *
2725 * @INPUT: 0 to Auto, 1 to 5 GHz and 2 to 2.4 GHz
2726 *
2727 * @OUTPUT: None
2728 *
2729 * This IOCTL Set the operational band If the new band is different from the
2730 * current operational band, it aborts the pending scan requests, flushes
2731 * the existing scan results, and then change * the band capability
2732 *
2733 * @E.g: iwpriv wlan0 SETBAND <value>
2734 *
2735 * Supported Feature: STA
2736 *
2737 * Usage: Internal/External
2738 *
2739 * </ioctl>
2740 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002741#define WLAN_SET_BAND_CONFIG (SIOCIWFIRSTPRIV + 25)
2742
Dustin Brown0cbc7572016-12-16 13:54:40 -08002743#define WLAN_PRIV_SET_MCBC_FILTER (SIOCIWFIRSTPRIV + 26)
Dustin Brown860566f2017-01-31 15:24:43 -08002744/* (SIOCIWFIRSTPRIV + 27) is currently unused */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002745
2746/* Private ioctls and their sub-ioctls */
2747#define WLAN_PRIV_SET_TWO_INT_GET_NONE (SIOCIWFIRSTPRIV + 28)
2748#define WE_SET_SMPS_PARAM 1
Srinivas Girigowda6147c582016-10-18 12:26:15 -07002749#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002750#define WE_SET_FW_CRASH_INJECT 2
2751#endif
2752#define WE_DUMP_DP_TRACE_LEVEL 3
Govind Singha471e5e2015-10-12 17:11:14 +05302753/* Private sub ioctl for enabling and setting histogram interval of profiling */
2754#define WE_ENABLE_FW_PROFILE 4
2755#define WE_SET_FW_PROFILE_HIST_INTVL 5
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002756
Rajeev Kumar9bb2e852016-09-24 12:29:25 -07002757/* Private sub-ioctl for initiating WoW suspend without Apps suspend */
Rajeev Kumara78a0a42016-07-13 19:28:20 -07002758#define WE_SET_WLAN_SUSPEND 6
2759#define WE_SET_WLAN_RESUME 7
Rajeev Kumara78a0a42016-07-13 19:28:20 -07002760
Dustin Brown8d2d0f52017-04-03 17:02:08 -07002761/*
2762 * <ioctl>
2763 * log_buffer - prints host/target related communication logs via dmesg
2764 *
2765 * @INPUT: Log Id, Count
2766 *
2767 * Log Id:
2768 * 0) HTC_CREDIT_HISTORY_LOG
2769 * 1) COMMAND_LOG,
2770 * 2) COMMAND_TX_CMP_LOG,
2771 * 3) MGMT_COMMAND_LOG,
2772 * 4) MGMT_COMMAND_TX_CMP_LOG,
2773 * 5) EVENT_LOG,
2774 * 6) RX_EVENT_LOG,
2775 * 7) MGMT_EVENT_LOG
2776 *
2777 * @OUTPUT: None
2778 *
2779 * @E.g:
2780 * # print up to 10 of the most recent records from HTC Credit History
2781 * iwpriv wlan0 log_buffer 0 10
2782 * # print up to 3 of the most recent records from Event Log
2783 * iwpriv wlan0 log_buffer 5 3
2784 *
2785 * Supported Feature: WLAN Trace
2786 *
2787 * Usage: Internal/External
2788 *
2789 * </ioctl>
2790 */
2791#define WE_LOG_BUFFER 8
2792
2793enum host_target_comm_log {
2794 HTC_CREDIT_HISTORY_LOG = 0,
2795 COMMAND_LOG,
2796 COMMAND_TX_CMP_LOG,
2797 MGMT_COMMAND_LOG,
2798 MGMT_COMMAND_TX_CMP_LOG,
2799 EVENT_LOG,
2800 RX_EVENT_LOG,
2801 MGMT_EVENT_LOG
2802};
2803
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804/* (SIOCIWFIRSTPRIV + 29) is currently unused */
2805
2806/* 802.11p IOCTL */
2807#define WLAN_SET_DOT11P_CHANNEL_SCHED (SIOCIWFIRSTPRIV + 30)
2808
Sen, Devendra9ca8c432017-02-23 15:10:26 +05302809/*
2810 * <ioctl>
2811 * getLinkSpeed - Gets the current link speed in Mbps
2812 *
2813 * @INPUT: None
2814 *
2815 * @OUTPUT: linkspeed in mbps
2816 * wlan0 getLinkSpeed:7
2817 *
2818 * This IOCTL is used get the current link speed in Mbps
2819 *
2820 * @E.g: iwpriv wlan0 getLinkSpeed
2821 *
2822 * Supported Feature: STA
2823 *
2824 * Usage: Internal/External
2825 *
2826 * </ioctl>
2827 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002828#define WLAN_GET_LINK_SPEED (SIOCIWFIRSTPRIV + 31)
2829
2830#define WLAN_STATS_INVALID 0
2831#define WLAN_STATS_RETRY_CNT 1
2832#define WLAN_STATS_MUL_RETRY_CNT 2
2833#define WLAN_STATS_TX_FRM_CNT 3
2834#define WLAN_STATS_RX_FRM_CNT 4
2835#define WLAN_STATS_FRM_DUP_CNT 5
2836#define WLAN_STATS_FAIL_CNT 6
2837#define WLAN_STATS_RTS_FAIL_CNT 7
2838#define WLAN_STATS_ACK_FAIL_CNT 8
2839#define WLAN_STATS_RTS_SUC_CNT 9
2840#define WLAN_STATS_RX_DISCARD_CNT 10
2841#define WLAN_STATS_RX_ERROR_CNT 11
2842#define WLAN_STATS_TX_BYTE_CNT 12
2843
2844#define WLAN_STATS_RX_BYTE_CNT 13
2845#define WLAN_STATS_RX_RATE 14
2846#define WLAN_STATS_TX_RATE 15
2847
2848#define WLAN_STATS_RX_UC_BYTE_CNT 16
2849#define WLAN_STATS_RX_MC_BYTE_CNT 17
2850#define WLAN_STATS_RX_BC_BYTE_CNT 18
2851#define WLAN_STATS_TX_UC_BYTE_CNT 19
2852#define WLAN_STATS_TX_MC_BYTE_CNT 20
2853#define WLAN_STATS_TX_BC_BYTE_CNT 21
2854
2855#define FILL_TLV(__p, __type, __size, __val, __tlen) do { \
2856 if ((__tlen + __size + 2) < WE_MAX_STR_LEN) { \
2857 *__p++ = __type; \
2858 *__p++ = __size; \
2859 memcpy(__p, __val, __size); \
2860 __p += __size; \
2861 __tlen += __size + 2; \
2862 } else { \
Jeff Johnson99bac312016-06-28 10:38:18 -07002863 hdd_err("FILL_TLV Failed!!!"); \
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002864 } \
2865 } while (0)
2866
2867#define VERSION_VALUE_MAX_LEN 32
2868
2869#define TX_PER_TRACKING_DEFAULT_RATIO 5
2870#define TX_PER_TRACKING_MAX_RATIO 10
2871#define TX_PER_TRACKING_DEFAULT_WATERMARK 5
2872
2873#define WLAN_ADAPTER 0
2874#define P2P_ADAPTER 1
2875
2876/**
2877 * mem_alloc_copy_from_user_helper - copy from user helper
2878 * @wrqu_data: wireless extensions request data
2879 * @len: length of @wrqu_data
2880 *
2881 * Helper function to allocate buffer and copy user data.
2882 *
2883 * Return: On success return a pointer to a kernel buffer containing a
2884 * copy of the userspace data (with an additional NUL character
2885 * appended for safety). On failure return %NULL.
2886 */
2887void *mem_alloc_copy_from_user_helper(const __user void *wrqu_data, size_t len)
2888{
2889 u8 *ptr = NULL;
2890
2891 /* in order to protect the code, an extra byte is post
2892 * appended to the buffer and the null termination is added.
2893 * However, when allocating (len+1) byte of memory, we need to
2894 * make sure that there is no uint overflow when doing
2895 * addition. In theory check len < UINT_MAX protects the uint
2896 * overflow. For wlan private ioctl, the buffer size is much
2897 * less than UINT_MAX, as a good guess, now, it is assumed
2898 * that the private command buffer size is no greater than 4K
2899 * (4096 bytes). So we use 4096 as the upper boundary for now.
2900 */
2901 if (len > MAX_USER_COMMAND_SIZE) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08002902 hdd_err("Invalid length: %zu max: %u",
2903 len, MAX_USER_COMMAND_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002904 return NULL;
2905 }
2906
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07002907 ptr = qdf_mem_malloc(len + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002908 if (NULL == ptr) {
Jeff Johnson99bac312016-06-28 10:38:18 -07002909 hdd_err("unable to allocate memory");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002910 return NULL;
2911 }
2912
2913 if (copy_from_user(ptr, wrqu_data, len)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07002914 hdd_err("failed to copy data to user buffer");
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07002915 qdf_mem_free(ptr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 return NULL;
2917 }
2918 ptr[len] = '\0';
2919 return ptr;
2920}
2921
2922/**
2923 * hdd_priv_get_data() - Get pointer to ioctl private data
2924 * @p_priv_data: pointer to iw_point struct to be filled
2925 * @wrqu: Pointer to IOCTL Data received from userspace
2926 *
2927 * Helper function to get compatible struct iw_point passed to ioctl
2928 *
2929 * Return - 0 if p_priv_data successfully filled, error otherwise
2930 */
2931int hdd_priv_get_data(struct iw_point *p_priv_data, union iwreq_data *wrqu)
2932{
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07002933 if ((NULL == p_priv_data) || (NULL == wrqu))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07002935
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002936#ifdef CONFIG_COMPAT
2937 if (is_compat_task()) {
2938 struct compat_iw_point *p_compat_priv_data;
2939
2940 /* Compat task:
2941 * typecast to compat structure and copy the members.
2942 */
2943 p_compat_priv_data = (struct compat_iw_point *)&wrqu->data;
2944
2945 p_priv_data->pointer = compat_ptr(p_compat_priv_data->pointer);
2946 p_priv_data->length = p_compat_priv_data->length;
2947 p_priv_data->flags = p_compat_priv_data->flags;
2948 } else {
2949#endif /* #ifdef CONFIG_COMPAT */
2950
2951 /* Non compat task: directly copy the structure. */
2952 memcpy(p_priv_data, &wrqu->data, sizeof(struct iw_point));
2953
2954#ifdef CONFIG_COMPAT
2955 }
2956#endif /* #ifdef CONFIG_COMPAT */
2957
2958 return 0;
2959}
2960
Jeff Johnson441e1f72017-02-07 08:50:49 -08002961static int hdd_check_wext_control(enum hdd_wext_control wext_control,
2962 struct iw_request_info *info)
2963{
2964 switch (wext_control) {
2965 default:
2966 case hdd_wext_disabled:
2967 hdd_err("Rejecting disabled ioctl %x", info->cmd);
2968 return -ENOTSUPP;
2969 case hdd_wext_deprecated:
2970 hdd_warn("Using deprecated ioctl %x", info->cmd);
2971 return 0;
2972 case hdd_wext_enabled:
2973 return 0;
2974 }
2975}
2976
2977int hdd_check_standard_wext_control(struct hdd_context_s *hdd_ctx,
2978 struct iw_request_info *info)
2979{
2980 return hdd_check_wext_control(hdd_ctx->config->standard_wext_control,
2981 info);
2982}
2983
2984int hdd_check_private_wext_control(struct hdd_context_s *hdd_ctx,
2985 struct iw_request_info *info)
2986{
2987 return hdd_check_wext_control(hdd_ctx->config->private_wext_control,
2988 info);
2989}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002990
2991/**
2992 * hdd_wlan_get_stats() - Get txrx stats in SAP mode
2993 * @pAdapter: Pointer to the hdd adapter.
2994 * @length: Size of the data copied
2995 * @buffer: Pointer to char buffer.
2996 * @buf_len: Length of the char buffer.
2997 *
2998 * This function called when the "iwpriv wlan0 get_stats" command is given.
2999 * It used to collect the txrx stats when the device is configured in SAP mode.
3000 *
3001 * Return - none
3002 */
3003void hdd_wlan_get_stats(hdd_adapter_t *pAdapter, uint16_t *length,
3004 char *buffer, uint16_t buf_len)
3005{
3006 hdd_tx_rx_stats_t *pStats = &pAdapter->hdd_stats.hddTxRxStats;
3007 uint32_t len = 0;
3008 uint32_t total_rx_pkt = 0, total_rx_dropped = 0;
3009 uint32_t total_rx_delv = 0, total_rx_refused = 0;
3010 int i = 0;
3011
3012 for (; i < NUM_CPUS; i++) {
3013 total_rx_pkt += pStats->rxPackets[i];
3014 total_rx_dropped += pStats->rxDropped[i];
3015 total_rx_delv += pStats->rxDelivered[i];
3016 total_rx_refused += pStats->rxRefused[i];
3017 }
3018
3019 len = scnprintf(buffer, buf_len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003020 "\nTransmit[%lu] - "
Mohit Khannad0b63f52017-02-18 18:05:52 -08003021 "called %u, dropped %u orphan %u,"
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003022 "\n[dropped] BK %u, BE %u, VI %u, VO %u"
3023 "\n[classified] BK %u, BE %u, VI %u, VO %u"
3024 "\n\nReceive[%lu] - "
3025 "packets %u, dropped %u, delivered %u, refused %u"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003026 "\n",
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003027 qdf_system_ticks(),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003028 pStats->txXmitCalled,
3029 pStats->txXmitDropped,
Mohit Khannad0b63f52017-02-18 18:05:52 -08003030 pStats->txXmitOrphaned,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003031
3032 pStats->txXmitDroppedAC[SME_AC_BK],
3033 pStats->txXmitDroppedAC[SME_AC_BE],
3034 pStats->txXmitDroppedAC[SME_AC_VI],
3035 pStats->txXmitDroppedAC[SME_AC_VO],
3036
3037 pStats->txXmitClassifiedAC[SME_AC_BK],
3038 pStats->txXmitClassifiedAC[SME_AC_BE],
3039 pStats->txXmitClassifiedAC[SME_AC_VI],
3040 pStats->txXmitClassifiedAC[SME_AC_VO],
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003041 qdf_system_ticks(),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 total_rx_pkt, total_rx_dropped, total_rx_delv, total_rx_refused
3043 );
3044
3045 for (i = 0; i < NUM_CPUS; i++) {
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003046 if (pStats->rxPackets[i] == 0)
3047 continue;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003048 len += scnprintf(buffer + len, buf_len - len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003049 "Rx CPU[%d]:"
3050 "packets %u, dropped %u, delivered %u, refused %u\n",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003051 i, pStats->rxPackets[i], pStats->rxDropped[i],
3052 pStats->rxDelivered[i], pStats->rxRefused[i]);
3053 }
3054
3055 len += scnprintf(buffer + len, buf_len - len,
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003056 "\nTX_FLOW"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003057 "\nCurrent status: %s"
3058 "\ntx-flow timer start count %u"
3059 "\npause count %u, unpause count %u",
3060 (pStats->is_txflow_paused == true ? "PAUSED" : "UNPAUSED"),
3061 pStats->txflow_timer_cnt,
3062 pStats->txflow_pause_cnt,
3063 pStats->txflow_unpause_cnt);
3064
Leo Changfdb45c32016-10-28 11:09:23 -07003065 len += cdp_stats(cds_get_context(QDF_MODULE_ID_SOC),
3066 pAdapter->sessionId, &buffer[len], (buf_len - len));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003067 *length = len + 1;
3068}
3069
3070/**
Dustin Brownd9322482017-01-09 12:46:03 -08003071 * wlan_hdd_write_suspend_resume_stats() - Writes suspend/resume stats to buffer
3072 * @hdd_ctx: The Hdd context owning the stats to be written
3073 * @buffer: The char buffer to write to
3074 * @max_len: The maximum number of chars to write
3075 *
3076 * This assumes hdd_ctx has already been validated, and buffer is not NULL.
3077 *
3078 * Return - length of written content, negative number on error
3079 */
3080static int wlan_hdd_write_suspend_resume_stats(hdd_context_t *hdd_ctx,
3081 char *buffer, uint16_t max_len)
3082{
3083 QDF_STATUS status;
3084 struct suspend_resume_stats *sr_stats;
3085 struct sir_wake_lock_stats wow_stats;
3086
3087 sr_stats = &hdd_ctx->suspend_resume_stats;
3088
3089 status = wma_get_wakelock_stats(&wow_stats);
3090 if (QDF_IS_STATUS_ERROR(status)) {
3091 hdd_err("Failed to get WoW stats");
3092 return qdf_status_to_os_return(status);
3093 }
3094
3095 return scnprintf(buffer, max_len,
3096 "\n"
3097 "Suspends: %u\n"
3098 "Resumes: %u\n"
3099 "\n"
3100 "Suspend Fail Reasons\n"
3101 "\tIPA: %u\n"
3102 "\tRadar: %u\n"
3103 "\tRoam: %u\n"
3104 "\tScan: %u\n"
3105 "\tInitial Wakeup: %u\n"
3106 "\n"
3107 "WoW Wake Reasons\n"
3108 "\tunicast: %u\n"
3109 "\tbroadcast: %u\n"
3110 "\tIPv4 multicast: %u\n"
3111 "\tIPv6 multicast: %u\n"
3112 "\tIPv6 multicast RA: %u\n"
3113 "\tIPv6 multicast NS: %u\n"
3114 "\tIPv6 multicast NA: %u\n"
3115 "\tICMPv4: %u\n"
3116 "\tICMPv6: %u\n"
3117 "\tRSSI Breach: %u\n"
3118 "\tLow RSSI: %u\n"
3119 "\tG-Scan: %u\n"
3120 "\tPNO Complete: %u\n"
3121 "\tPNO Match: %u\n",
3122 sr_stats->suspends,
3123 sr_stats->resumes,
3124 sr_stats->suspend_fail[SUSPEND_FAIL_IPA],
3125 sr_stats->suspend_fail[SUSPEND_FAIL_RADAR],
3126 sr_stats->suspend_fail[SUSPEND_FAIL_ROAM],
3127 sr_stats->suspend_fail[SUSPEND_FAIL_SCAN],
3128 sr_stats->suspend_fail[SUSPEND_FAIL_INITIAL_WAKEUP],
3129 wow_stats.wow_ucast_wake_up_count,
3130 wow_stats.wow_bcast_wake_up_count,
3131 wow_stats.wow_ipv4_mcast_wake_up_count,
3132 wow_stats.wow_ipv6_mcast_wake_up_count,
3133 wow_stats.wow_ipv6_mcast_ra_stats,
3134 wow_stats.wow_ipv6_mcast_ns_stats,
3135 wow_stats.wow_ipv6_mcast_na_stats,
3136 wow_stats.wow_icmpv4_count,
3137 wow_stats.wow_icmpv6_count,
3138 wow_stats.wow_rssi_breach_wake_up_count,
3139 wow_stats.wow_low_rssi_wake_up_count,
3140 wow_stats.wow_gscan_wake_up_count,
3141 wow_stats.wow_pno_complete_wake_up_count,
3142 wow_stats.wow_pno_match_wake_up_count);
3143}
3144
3145/**
Govind Singha471e5e2015-10-12 17:11:14 +05303146 * hdd_wlan_list_fw_profile() - Get fw profiling points
3147 * @length: Size of the data copied
3148 * @buffer: Pointer to char buffer.
3149 * @buf_len: Length of the char buffer.
3150 *
3151 * This function called when the "iwpriv wlan0 listProfile" command is given.
3152 * It is used to get the supported profiling points in FW.
3153 *
3154 * Return - none
3155 */
3156void hdd_wlan_list_fw_profile(uint16_t *length,
3157 char *buffer, uint16_t buf_len)
3158{
3159 uint32_t len = 0;
3160
3161 len = scnprintf(buffer, buf_len,
3162 "PROF_CPU_IDLE: %u\n"
3163 "PROF_PPDU_PROC: %u\n"
3164 "PROF_PPDU_POST: %u\n"
3165 "PROF_HTT_TX_INPUT: %u\n"
3166 "PROF_MSDU_ENQ: %u\n"
3167 "PROF_PPDU_POST_HAL: %u\n"
3168 "PROF_COMPUTE_TX_TIME: %u\n",
3169 PROF_CPU_IDLE,
3170 PROF_PPDU_PROC,
3171 PROF_PPDU_POST,
3172 PROF_HTT_TX_INPUT,
3173 PROF_MSDU_ENQ,
3174 PROF_PPDU_POST_HAL,
3175 PROF_COMPUTE_TX_TIME);
3176
3177 *length = len + 1;
3178}
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003179/**
3180 * hdd_display_stats_help() - print statistics help
3181 *
3182 * Return: none
3183 */
3184void hdd_display_stats_help(void)
3185{
3186 hdd_err("iwpriv wlan0 dumpStats [option] - dump statistics");
3187 hdd_err("iwpriv wlan0 clearStats [option] - clear statistics");
3188 hdd_err("options:");
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003189 hdd_err(" 1 -- TXRX PATH statistics");
3190 hdd_err(" 2 -- TXRX HIST statistics");
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003191 hdd_err(" 3 -- TSO statistics");
3192 hdd_err(" 4 -- Network queue statistics");
3193 hdd_err(" 5 -- Flow control statistics");
3194 hdd_err(" 6 -- Per Layer statistics");
3195 hdd_err(" 7 -- Copy engine interrupt statistics");
3196 hdd_err(" 8 -- LRO statistics");
3197 hdd_err(" 9 -- NAPI statistics");
3198}
Govind Singha471e5e2015-10-12 17:11:14 +05303199
3200/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003201 * hdd_wlan_dump_stats() - display dump Stats
3202 * @adapter: adapter handle
3203 * @value: value from user
3204 *
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003205 * Return: 0 => success, error code on failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 */
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003207int hdd_wlan_dump_stats(hdd_adapter_t *adapter, int value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003208{
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003209 int ret = 0;
3210 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
3212
3213 switch (value) {
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003214 case CDP_TXRX_HIST_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 wlan_hdd_display_tx_rx_histogram(hdd_ctx);
3216 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003217 case CDP_HDD_NETIF_OPER_HISTORY:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 wlan_hdd_display_netif_queue_history(hdd_ctx);
3219 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003220 case CDP_HIF_STATS:
Nirav Shahbf1b0332016-05-25 14:27:39 +05303221 hdd_display_hif_stats();
3222 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003223 case CDP_LRO_STATS:
Dhanashri Atree7d442a2016-07-14 18:20:29 -07003224 hdd_lro_display_stats(hdd_ctx);
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07003225 case CDP_NAPI_STATS:
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003226 if (hdd_display_napi_stats()) {
3227 hdd_err("error displaying napi stats");
3228 ret = EFAULT;
3229 }
Dhanashri Atree7d442a2016-07-14 18:20:29 -07003230 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003231 default:
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003232 status = cdp_display_stats(cds_get_context(QDF_MODULE_ID_SOC),
3233 value);
3234 if (status == QDF_STATUS_E_INVAL) {
3235 hdd_display_stats_help();
3236 ret = EINVAL;
3237 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003238 break;
3239 }
Mohit Khanna3e2115b2016-10-11 13:18:29 -07003240 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241}
3242
3243/**
3244 * hdd_wlan_get_version() - Get driver version information
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303245 * @hdd_ctx: Global HDD context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003246 * @wrqu: Pointer to IOCTL REQUEST Data.
3247 * @extra: Pointer to destination buffer
3248 *
3249 * This function is used to get Wlan Driver, Firmware, & Hardware
3250 * Version information. If @wrqu and @extra are specified, then the
3251 * version string is returned. Otherwise it is simply printed to the
3252 * kernel log.
3253 *
3254 * Return: none
3255 */
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303256void hdd_wlan_get_version(hdd_context_t *hdd_ctx, union iwreq_data *wrqu,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003257 char *extra)
3258{
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303259 tSirVersionString wcnss_sw_version;
3260 const char *swversion;
3261 const char *hwversion;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003262 uint32_t msp_id = 0, mspid = 0, siid = 0, crmid = 0, sub_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303264 if (!hdd_ctx) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003265 hdd_err("Invalid context, HDD context is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003266 goto error;
3267 }
3268
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303269 snprintf(wcnss_sw_version, sizeof(wcnss_sw_version), "%08x",
3270 hdd_ctx->target_fw_version);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003271
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303272 swversion = wcnss_sw_version;
3273 msp_id = (hdd_ctx->target_fw_version & 0xf0000000) >> 28;
3274 mspid = (hdd_ctx->target_fw_version & 0xf000000) >> 24;
3275 siid = (hdd_ctx->target_fw_version & 0xf00000) >> 20;
3276 crmid = hdd_ctx->target_fw_version & 0x7fff;
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003277 sub_id = (hdd_ctx->target_fw_vers_ext & 0xf0000000) >> 28;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278
Arun Khandavallia96c2c02016-05-17 19:15:34 +05303279 hwversion = hdd_ctx->target_hw_name;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280
3281 if (wrqu && extra) {
3282 wrqu->data.length =
3283 scnprintf(extra, WE_MAX_STR_LEN,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003284 "Host SW:%s, FW:%d.%d.%d.%d.%d, HW:%s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285 QWLAN_VERSIONSTR,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003286 msp_id, mspid, siid, crmid,
3287 sub_id, hwversion);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288 } else {
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003289 pr_info("Host SW:%s, FW:%d.%d.%d.%d.%d, HW:%s\n",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003290 QWLAN_VERSIONSTR,
Sandeep Puligilla3d6a8e22016-10-11 18:57:14 -07003291 msp_id, mspid, siid, crmid, sub_id, hwversion);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003292 }
3293error:
3294 return;
3295}
3296
3297/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003298 * hdd_wlan_get_ibss_mac_addr_from_staid() - Get IBSS MAC address
3299 * @pAdapter: Adapter upon which the IBSS client is active
3300 * @staIdx: Station index of the IBSS peer
3301 *
3302 * Return: a pointer to the MAC address of the IBSS peer if the peer is
3303 * found, otherwise %NULL.
3304 */
3305struct qdf_mac_addr *
3306hdd_wlan_get_ibss_mac_addr_from_staid(hdd_adapter_t *pAdapter,
3307 uint8_t staIdx)
3308{
3309 uint8_t idx;
3310 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3311
Naveen Rawatc45d1622016-07-05 12:20:09 -07003312 for (idx = 0; idx < MAX_PEERS; idx++) {
Naveen Rawatac027cb2017-04-27 15:02:42 -07003313 if (HDD_WLAN_INVALID_STA_ID !=
3314 pHddStaCtx->conn_info.staId[idx] &&
3315 staIdx == pHddStaCtx->conn_info.staId[idx]) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003316 return &pHddStaCtx->conn_info.peerMacAddress[idx];
3317 }
3318 }
3319 return NULL;
3320}
3321
3322/**
3323 * hdd_wlan_get_ibss_peer_info() - Print IBSS peer information
3324 * @pAdapter: Adapter upon which the IBSS client is active
3325 * @staIdx: Station index of the IBSS peer
3326 *
3327 * Return: QDF_STATUS_STATUS if the peer was found and displayed,
3328 * otherwise an appropriate QDF_STATUS_E_* failure code.
3329 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003330static QDF_STATUS hdd_wlan_get_ibss_peer_info(hdd_adapter_t *pAdapter,
3331 uint8_t staIdx)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003332{
3333 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3334 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
3335 hdd_station_ctx_t *pStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003336 tSirPeerInfoRspParams *pPeerInfo = &pStaCtx->ibss_peer_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003337
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003338 INIT_COMPLETION(pAdapter->ibss_peer_info_comp);
Prakash Dhavali4c2a9fe2016-12-02 16:01:08 -08003339 status = sme_request_ibss_peer_info(hHal, pAdapter,
3340 hdd_get_ibss_peer_info_cb,
3341 false, staIdx);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003342
3343 if (QDF_STATUS_SUCCESS == status) {
3344 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003345
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003346 rc = wait_for_completion_timeout
3347 (&pAdapter->ibss_peer_info_comp,
3348 msecs_to_jiffies(IBSS_PEER_INFO_REQ_TIMOEUT));
3349 if (!rc) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003350 hdd_err("failed wait on ibss_peer_info_comp");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003351 return QDF_STATUS_E_FAILURE;
3352 }
3353
3354 /** Print the peer info */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003355 hdd_debug("pPeerInfo->numIBSSPeers = %d ", pPeerInfo->numPeers);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003356 {
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003357 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
3358 uint32_t tx_rate = pPeerInfo->peerInfoParams[0].txRate;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003359
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003360 qdf_mem_copy(mac_addr, pPeerInfo->peerInfoParams[0].
3361 mac_addr, sizeof(mac_addr));
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003362 hdd_debug("PEER ADDR : %pM TxRate: %d Mbps RSSI: %d",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003363 mac_addr, (int)tx_rate,
3364 (int)pPeerInfo->peerInfoParams[0].rssi);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003365 }
3366 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07003367 hdd_warn("Warning: sme_request_ibss_peer_info Request failed");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003368 }
3369
3370 return status;
3371}
3372
3373/**
3374 * hdd_wlan_get_ibss_peer_info_all() - Print all IBSS peers
3375 * @pAdapter: Adapter upon which the IBSS clients are active
3376 *
3377 * Return: QDF_STATUS_STATUS if the peer information was retrieved and
3378 * displayed, otherwise an appropriate QDF_STATUS_E_* failure code.
3379 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003380static QDF_STATUS hdd_wlan_get_ibss_peer_info_all(hdd_adapter_t *pAdapter)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003381{
3382 QDF_STATUS status = QDF_STATUS_E_FAILURE;
3383 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
3384 hdd_station_ctx_t *pStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003385 tSirPeerInfoRspParams *pPeerInfo = &pStaCtx->ibss_peer_info;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003386 int i;
3387
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003388 INIT_COMPLETION(pAdapter->ibss_peer_info_comp);
Prakash Dhavali4c2a9fe2016-12-02 16:01:08 -08003389 status = sme_request_ibss_peer_info(hHal, pAdapter,
3390 hdd_get_ibss_peer_info_cb,
3391 true, 0xFF);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003392
3393 if (QDF_STATUS_SUCCESS == status) {
3394 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003395
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003396 rc = wait_for_completion_timeout
3397 (&pAdapter->ibss_peer_info_comp,
3398 msecs_to_jiffies(IBSS_PEER_INFO_REQ_TIMOEUT));
3399 if (!rc) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003400 hdd_err("failed wait on ibss_peer_info_comp");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003401 return QDF_STATUS_E_FAILURE;
3402 }
3403
3404 /** Print the peer info */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003405 hdd_debug("pPeerInfo->numIBSSPeers = %d ",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003406 (int)pPeerInfo->numPeers);
3407 for (i = 0; i < pPeerInfo->numPeers; i++) {
3408 uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
3409 uint32_t tx_rate;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003410
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003411 tx_rate = pPeerInfo->peerInfoParams[i].txRate;
3412 qdf_mem_copy(mac_addr,
3413 pPeerInfo->peerInfoParams[i].mac_addr,
3414 sizeof(mac_addr));
3415
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003416 hdd_debug(" PEER ADDR : %pM TxRate: %d Mbps RSSI: %d",
Rajeev Kumar94c9b452016-03-24 12:58:47 -07003417 mac_addr, (int)tx_rate,
3418 (int)pPeerInfo->peerInfoParams[i].rssi);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003419 }
3420 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07003421 hdd_warn("Warning: sme_request_ibss_peer_info Request failed");
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003422 }
3423
3424 return status;
3425}
3426
3427/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428 * hdd_wlan_get_freq() - Convert channel to frequency
3429 * @channel: channel to be converted
3430 * @pfreq: where to store the frequency
3431 *
3432 * Return: 1 on success, otherwise a negative errno
3433 */
3434int hdd_wlan_get_freq(uint32_t channel, uint32_t *pfreq)
3435{
3436 int i;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07003437
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438 if (channel > 0) {
3439 for (i = 0; i < FREQ_CHAN_MAP_TABLE_SIZE; i++) {
3440 if (channel == freq_chan_map[i].chan) {
3441 *pfreq = freq_chan_map[i].freq;
3442 return 1;
3443 }
3444 }
3445 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003446 hdd_err("Invalid channel no=%d!!", channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003447 return -EINVAL;
3448}
3449
3450/**
3451 * hdd_is_auth_type_rsn() - RSN authentication type check
3452 * @authType: authentication type to be checked
3453 *
3454 * Return: true if @authType is an RSN authentication type,
3455 * false if it is not
3456 */
3457static bool hdd_is_auth_type_rsn(eCsrAuthType authType)
3458{
3459 bool rsnType = false;
3460 /* is the authType supported? */
3461 switch (authType) {
3462 case eCSR_AUTH_TYPE_NONE: /* never used */
3463 rsnType = false;
3464 break;
3465 /* MAC layer authentication types */
3466 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3467 rsnType = false;
3468 break;
3469 case eCSR_AUTH_TYPE_SHARED_KEY:
3470 rsnType = false;
3471 break;
3472 case eCSR_AUTH_TYPE_AUTOSWITCH:
3473 rsnType = false;
3474 break;
3475
3476 /* Upper layer authentication types */
3477 case eCSR_AUTH_TYPE_WPA:
3478 rsnType = true;
3479 break;
3480 case eCSR_AUTH_TYPE_WPA_PSK:
3481 rsnType = true;
3482 break;
3483 case eCSR_AUTH_TYPE_WPA_NONE:
3484 rsnType = true;
3485 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003486 case eCSR_AUTH_TYPE_FT_RSN:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487 case eCSR_AUTH_TYPE_RSN:
3488 rsnType = true;
3489 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003490 case eCSR_AUTH_TYPE_FT_RSN_PSK:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491 case eCSR_AUTH_TYPE_RSN_PSK:
3492#ifdef WLAN_FEATURE_11W
3493 case eCSR_AUTH_TYPE_RSN_PSK_SHA256:
3494 case eCSR_AUTH_TYPE_RSN_8021X_SHA256:
3495#endif
3496 rsnType = true;
3497 break;
3498 /* case eCSR_AUTH_TYPE_FAILED: */
3499 case eCSR_AUTH_TYPE_UNKNOWN:
3500 rsnType = false;
3501 break;
3502 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07003503 hdd_err("unknown authType %d, treat as open",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504 authType);
3505 rsnType = false;
3506 break;
3507 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003508 hdd_debug("called with authType: %d, returned: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 authType, rsnType);
3510 return rsnType;
3511}
3512
Jeff Johnsona5444942017-01-23 13:11:08 -08003513struct rssi_priv {
3514 int8_t rssi;
3515};
3516
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003517/**
3518 * hdd_get_rssi_cb() - "Get RSSI" callback function
3519 * @rssi: Current RSSI of the station
Jeff Johnsona5444942017-01-23 13:11:08 -08003520 * @sta_id: ID of the station
3521 * @context: opaque context originally passed to SME. HDD always passes
3522 * a cookie for the request context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003523 *
3524 * Return: None
3525 */
Jeff Johnsona5444942017-01-23 13:11:08 -08003526static void hdd_get_rssi_cb(int8_t rssi, uint32_t sta_id, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003527{
Jeff Johnsona5444942017-01-23 13:11:08 -08003528 struct hdd_request *request;
3529 struct rssi_priv *priv;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003530
Jeff Johnsona5444942017-01-23 13:11:08 -08003531 request = hdd_request_get(context);
3532 if (!request) {
3533 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 return;
3535 }
3536
Jeff Johnsona5444942017-01-23 13:11:08 -08003537 priv = hdd_request_priv(request);
3538 priv->rssi = rssi;
3539 hdd_request_complete(request);
3540 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003541}
3542
3543/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003544 * wlan_hdd_get_rssi() - Get the current RSSI
3545 * @pAdapter: adapter upon which the measurement is requested
3546 * @rssi_value: pointer to where the RSSI should be returned
3547 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303548 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303550QDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552 hdd_context_t *pHddCtx;
3553 hdd_station_ctx_t *pHddStaCtx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554 QDF_STATUS hstatus;
Jeff Johnsona5444942017-01-23 13:11:08 -08003555 int ret;
3556 void *cookie;
3557 struct hdd_request *request;
3558 struct rssi_priv *priv;
3559 static const struct hdd_request_params params = {
3560 .priv_size = sizeof(*priv),
3561 .timeout_ms = WLAN_WAIT_TIME_STATS,
3562 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563
3564 if (NULL == pAdapter) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003565 hdd_err("Invalid context, pAdapter");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303566 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003567 }
Hanumanth Reddy Pothula2a8a7402017-07-03 14:06:11 +05303568 if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
Prashanth Bhatta9e143052015-12-04 11:56:47 -08003569 hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
3570 cds_get_driver_state());
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003571 /* return a cached value */
3572 *rssi_value = pAdapter->rssi;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303573 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574 }
3575
3576 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3577 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3578
3579 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003580 hdd_debug("Not associated!, rssi on disconnect %d",
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05303581 pAdapter->rssi_on_disconnect);
3582 *rssi_value = pAdapter->rssi_on_disconnect;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303583 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003584 }
3585
3586 if (pHddStaCtx->hdd_ReassocScenario) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08003587 hdd_debug("Roaming in progress, return cached RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588 *rssi_value = pAdapter->rssi;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303589 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003590 }
3591
Jeff Johnsona5444942017-01-23 13:11:08 -08003592 request = hdd_request_alloc(&params);
3593 if (!request) {
3594 hdd_err("Request allocation failure, return cached RSSI");
3595 *rssi_value = pAdapter->rssi;
3596 return QDF_STATUS_SUCCESS;
3597 }
3598 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599
3600 hstatus = sme_get_rssi(pHddCtx->hHal, hdd_get_rssi_cb,
3601 pHddStaCtx->conn_info.staId[0],
3602 pHddStaCtx->conn_info.bssId, pAdapter->rssi,
Jeff Johnsona5444942017-01-23 13:11:08 -08003603 cookie, pHddCtx->pcds_context);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303604 if (QDF_STATUS_SUCCESS != hstatus) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003605 hdd_err("Unable to retrieve RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606 /* we'll returned a cached value below */
3607 } else {
3608 /* request was sent -- wait for the response */
Jeff Johnsona5444942017-01-23 13:11:08 -08003609 ret = hdd_request_wait_for_response(request);
3610 if (ret) {
3611 hdd_warn("SME timed out while retrieving RSSI");
3612 /* we'll returned a cached value below */
3613 } else {
3614 /* update the adapter with the fresh results */
3615 priv = hdd_request_priv(request);
Hanumanth Reddy Pothula90051782017-05-04 22:14:43 +05303616 /*
3617 * update rssi only if its valid else return previous
3618 * valid rssi.
3619 */
3620 if (priv->rssi)
3621 pAdapter->rssi = priv->rssi;
3622
3623 /*
3624 * for new connection there might be no valid previous
3625 * RSSI.
3626 */
3627 if (!pAdapter->rssi) {
3628 hdd_get_rssi_snr_by_bssid(pAdapter,
3629 pHddStaCtx->conn_info.bssId.bytes,
3630 &pAdapter->rssi, NULL);
3631 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632 }
3633 }
3634
Jeff Johnsona5444942017-01-23 13:11:08 -08003635 /*
3636 * either we never sent a request, we sent a request and
3637 * received a response or we sent a request and timed out.
3638 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639 */
Jeff Johnsona5444942017-01-23 13:11:08 -08003640 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003641
3642 *rssi_value = pAdapter->rssi;
3643
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303644 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645}
3646
Jeff Johnson002cb972017-01-23 14:59:07 -08003647struct snr_priv {
3648 int8_t snr;
3649};
3650
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651/**
Jeff Johnson8eaff302017-01-23 11:03:31 -08003652 * hdd_get_snr_cb() - "Get SNR" callback function
3653 * @snr: Current SNR of the station
Jeff Johnson002cb972017-01-23 14:59:07 -08003654 * @sta_id: ID of the station
3655 * @context: opaque context originally passed to SME. HDD always passes
3656 * a cookie for the request context
Jeff Johnson8eaff302017-01-23 11:03:31 -08003657 *
3658 * Return: None
3659 */
Jeff Johnson002cb972017-01-23 14:59:07 -08003660static void hdd_get_snr_cb(int8_t snr, uint32_t sta_id, void *context)
Jeff Johnson8eaff302017-01-23 11:03:31 -08003661{
Jeff Johnson002cb972017-01-23 14:59:07 -08003662 struct hdd_request *request;
3663 struct snr_priv *priv;
Jeff Johnson8eaff302017-01-23 11:03:31 -08003664
Jeff Johnson002cb972017-01-23 14:59:07 -08003665 request = hdd_request_get(context);
3666 if (!request) {
3667 hdd_err("Obsolete request");
Jeff Johnson8eaff302017-01-23 11:03:31 -08003668 return;
3669 }
3670
Jeff Johnson002cb972017-01-23 14:59:07 -08003671 /* propagate response back to requesting thread */
3672 priv = hdd_request_priv(request);
3673 priv->snr = snr;
3674 hdd_request_complete(request);
3675 hdd_request_put(request);
Jeff Johnson8eaff302017-01-23 11:03:31 -08003676}
3677
3678/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 * wlan_hdd_get_snr() - Get the current SNR
3680 * @pAdapter: adapter upon which the measurement is requested
3681 * @snr: pointer to where the SNR should be returned
3682 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303683 * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303685QDF_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, int8_t *snr)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687 hdd_context_t *pHddCtx;
3688 hdd_station_ctx_t *pHddStaCtx;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303689 QDF_STATUS hstatus;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 int valid;
Jeff Johnson002cb972017-01-23 14:59:07 -08003691 int ret;
3692 void *cookie;
3693 struct hdd_request *request;
3694 struct snr_priv *priv;
3695 static const struct hdd_request_params params = {
3696 .priv_size = sizeof(*priv),
3697 .timeout_ms = WLAN_WAIT_TIME_STATS,
3698 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003699
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303700 ENTER();
3701
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003702 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003703 hdd_err("Invalid context, pAdapter");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303704 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003705 }
3706
3707 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
3708
3709 valid = wlan_hdd_validate_context(pHddCtx);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303710 if (0 != valid)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303711 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712
3713 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
3714
Jeff Johnson002cb972017-01-23 14:59:07 -08003715 request = hdd_request_alloc(&params);
3716 if (!request) {
3717 hdd_err("Request allocation failure");
3718 return QDF_STATUS_E_FAULT;
3719 }
3720 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721
3722 hstatus = sme_get_snr(pHddCtx->hHal, hdd_get_snr_cb,
3723 pHddStaCtx->conn_info.staId[0],
Jeff Johnson002cb972017-01-23 14:59:07 -08003724 pHddStaCtx->conn_info.bssId, cookie);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303725 if (QDF_STATUS_SUCCESS != hstatus) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003726 hdd_err("Unable to retrieve RSSI");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003727 /* we'll returned a cached value below */
3728 } else {
3729 /* request was sent -- wait for the response */
Jeff Johnson002cb972017-01-23 14:59:07 -08003730 ret = hdd_request_wait_for_response(request);
3731 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003732 hdd_err("SME timed out while retrieving SNR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 /* we'll now returned a cached value below */
Jeff Johnson002cb972017-01-23 14:59:07 -08003734 } else {
3735 /* update the adapter with the fresh results */
3736 priv = hdd_request_priv(request);
3737 pAdapter->snr = priv->snr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738 }
3739 }
3740
Jeff Johnson002cb972017-01-23 14:59:07 -08003741 /*
3742 * either we never sent a request, we sent a request and
3743 * received a response or we sent a request and timed out.
3744 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 */
Jeff Johnson002cb972017-01-23 14:59:07 -08003746 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003747
3748 *snr = pAdapter->snr;
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05303749 EXIT();
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303750 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751}
3752
Jeff Johnsone50427c2017-01-26 10:54:49 -08003753struct linkspeed_priv {
3754 tSirLinkSpeedInfo linkspeed_info;
3755};
3756
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757static void
Jeff Johnsone50427c2017-01-26 10:54:49 -08003758hdd_get_link_speed_cb(tSirLinkSpeedInfo *linkspeed_info, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759{
Jeff Johnsone50427c2017-01-26 10:54:49 -08003760 struct hdd_request *request;
3761 struct linkspeed_priv *priv;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762
Jeff Johnsone50427c2017-01-26 10:54:49 -08003763 if (!linkspeed_info) {
3764 hdd_err("NULL linkspeed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003765 return;
3766 }
3767
Jeff Johnsone50427c2017-01-26 10:54:49 -08003768 request = hdd_request_get(context);
3769 if (!request) {
3770 hdd_err("Obsolete request");
3771 return;
3772 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773
Jeff Johnsone50427c2017-01-26 10:54:49 -08003774 priv = hdd_request_priv(request);
3775 priv->linkspeed_info = *linkspeed_info;
3776 hdd_request_complete(request);
3777 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003778}
3779
Jeff Johnsone50427c2017-01-26 10:54:49 -08003780int wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *adapter,
3781 struct qdf_mac_addr *mac_address,
3782 uint32_t *linkspeed)
3783{
3784 int ret;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303785 QDF_STATUS status;
Jeff Johnsone50427c2017-01-26 10:54:49 -08003786 void *cookie;
3787 tSirLinkSpeedInfo *linkspeed_info;
3788 struct hdd_request *request;
3789 struct linkspeed_priv *priv;
3790 static const struct hdd_request_params params = {
3791 .priv_size = sizeof(*priv),
3792 .timeout_ms = WLAN_WAIT_TIME_STATS,
3793 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794
Jeff Johnsone50427c2017-01-26 10:54:49 -08003795 if ((!adapter) || (!linkspeed)) {
3796 hdd_err("NULL argument");
3797 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003799
Jeff Johnsone50427c2017-01-26 10:54:49 -08003800 request = hdd_request_alloc(&params);
3801 if (!request) {
3802 hdd_err("Request allocation failure");
3803 ret = -ENOMEM;
3804 goto return_cached_value;
3805 }
3806
3807 cookie = hdd_request_cookie(request);
3808 priv = hdd_request_priv(request);
3809
3810 linkspeed_info = &priv->linkspeed_info;
3811 qdf_copy_macaddr(&linkspeed_info->peer_macaddr, mac_address);
3812 status = sme_get_link_speed(WLAN_HDD_GET_HAL_CTX(adapter),
3813 linkspeed_info,
3814 cookie, hdd_get_link_speed_cb);
3815 if (QDF_IS_STATUS_ERROR(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003816 hdd_err("Unable to retrieve statistics for link speed");
Jeff Johnsone50427c2017-01-26 10:54:49 -08003817 ret = qdf_status_to_os_return(status);
3818 goto cleanup;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003819 }
Jeff Johnsone50427c2017-01-26 10:54:49 -08003820 ret = hdd_request_wait_for_response(request);
3821 if (ret) {
3822 hdd_err("SME timed out while retrieving link speed");
3823 goto cleanup;
3824 }
3825 adapter->estimated_linkspeed = linkspeed_info->estLinkSpeed;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826
Jeff Johnsone50427c2017-01-26 10:54:49 -08003827cleanup:
3828 /*
3829 * either we never sent a request, we sent a request and
3830 * received a response or we sent a request and timed out.
3831 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 */
Jeff Johnsone50427c2017-01-26 10:54:49 -08003833 hdd_request_put(request);
3834
3835return_cached_value:
3836 *linkspeed = adapter->estimated_linkspeed;
3837
3838 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003839}
3840
3841/**
3842 * wlan_hdd_get_link_speed() - get link speed
3843 * @pAdapter: pointer to the adapter
3844 * @link_speed: pointer to link speed
3845 *
3846 * This function fetches per bssid link speed.
3847 *
3848 * Return: if associated, link speed shall be returned.
3849 * if not associated, link speed of 0 is returned.
3850 * On error, error number will be returned.
3851 */
3852int wlan_hdd_get_link_speed(hdd_adapter_t *sta_adapter, uint32_t *link_speed)
3853{
3854 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(sta_adapter);
3855 hdd_station_ctx_t *hdd_stactx =
3856 WLAN_HDD_GET_STATION_CTX_PTR(sta_adapter);
3857 int ret;
3858
3859 ret = wlan_hdd_validate_context(hddctx);
Abhishek Singh23edd1c2016-05-05 11:56:06 +05303860 if (ret)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003861 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003862
Nitesh Shah4e2d5eb2016-09-06 19:45:13 +05303863 /* Linkspeed is allowed only for P2P mode */
3864 if (sta_adapter->device_mode != QDF_P2P_CLIENT_MODE) {
3865 hdd_err("Link Speed is not allowed in Device mode %s(%d)",
3866 hdd_device_mode_to_string(sta_adapter->device_mode),
3867 sta_adapter->device_mode);
3868 return -ENOTSUPP;
3869 }
3870
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003871 if (eConnectionState_Associated != hdd_stactx->conn_info.connState) {
3872 /* we are not connected so we don't have a classAstats */
3873 *link_speed = 0;
3874 } else {
Anurag Chouhan6d760662016-02-20 16:05:43 +05303875 struct qdf_mac_addr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876
Anurag Chouhanc5548422016-02-24 18:33:27 +05303877 qdf_copy_macaddr(&bssid, &hdd_stactx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003878
Jeff Johnsone50427c2017-01-26 10:54:49 -08003879 ret = wlan_hdd_get_linkspeed_for_peermac(sta_adapter, &bssid,
3880 link_speed);
3881 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003882 hdd_err("Unable to retrieve SME linkspeed");
Jeff Johnsone50427c2017-01-26 10:54:49 -08003883 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003885 /* linkspeed in units of 500 kbps */
3886 *link_speed = (*link_speed) / 500;
3887 }
3888 return 0;
3889}
3890
3891/**
3892 * hdd_statistics_cb() - "Get statistics" callback function
3893 * @pStats: statistics payload
3894 * @pContext: opaque context originally passed to SME. HDD always passes
3895 * a pointer to an adapter
3896 *
3897 * Return: None
3898 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07003899static void hdd_statistics_cb(void *pStats, void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003900{
3901 hdd_adapter_t *pAdapter = (hdd_adapter_t *) pContext;
3902 hdd_stats_t *pStatsCache = NULL;
3903 hdd_wext_state_t *pWextState;
Anurag Chouhance0dc992016-02-16 18:18:03 +05303904 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003905
3906 tCsrSummaryStatsInfo *pSummaryStats = NULL;
3907 tCsrGlobalClassAStatsInfo *pClassAStats = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 tCsrGlobalClassDStatsInfo *pClassDStats = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909
3910 if (pAdapter != NULL)
3911 pStatsCache = &pAdapter->hdd_stats;
3912
3913 pSummaryStats = (tCsrSummaryStatsInfo *) pStats;
3914 pClassAStats = (tCsrGlobalClassAStatsInfo *) (pSummaryStats + 1);
Jeff Johnsonf2dac4f2017-03-16 11:41:31 -07003915 pClassDStats = (tCsrGlobalClassDStatsInfo *) (pClassAStats + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003916
3917 if (pStatsCache != NULL) {
3918 /* copy the stats into the cache we keep in the
3919 * adapter instance structure
3920 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303921 qdf_mem_copy(&pStatsCache->summary_stat, pSummaryStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003922 sizeof(pStatsCache->summary_stat));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303923 qdf_mem_copy(&pStatsCache->ClassA_stat, pClassAStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003924 sizeof(pStatsCache->ClassA_stat));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303925 qdf_mem_copy(&pStatsCache->ClassD_stat, pClassDStats,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003926 sizeof(pStatsCache->ClassD_stat));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003927 }
3928
3929 if (pAdapter) {
3930 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303931 qdf_status = qdf_event_set(&pWextState->hdd_qdf_event);
Anurag Chouhance0dc992016-02-16 18:18:03 +05303932 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07003933 hdd_err("qdf_event_set failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003934 return;
3935 }
3936 }
3937}
3938
3939/**
3940 * hdd_clear_roam_profile_ie() - Clear Roam Profile IEs
3941 * @pAdapter: adapter who's IEs are to be cleared
3942 *
3943 * Return: None
3944 */
3945void hdd_clear_roam_profile_ie(hdd_adapter_t *pAdapter)
3946{
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07003947 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -07003948
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07003949 ENTER();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003950
3951 /* clear WPA/RSN/WSC IE information in the profile */
3952 pWextState->roamProfile.nWPAReqIELength = 0;
3953 pWextState->roamProfile.pWPAReqIE = (uint8_t *) NULL;
3954 pWextState->roamProfile.nRSNReqIELength = 0;
3955 pWextState->roamProfile.pRSNReqIE = (uint8_t *) NULL;
3956
3957#ifdef FEATURE_WLAN_WAPI
3958 pWextState->roamProfile.nWAPIReqIELength = 0;
3959 pWextState->roamProfile.pWAPIReqIE = (uint8_t *) NULL;
3960#endif
3961
3962 pWextState->roamProfile.bWPSAssociation = false;
3963 pWextState->roamProfile.bOSENAssociation = false;
3964 pWextState->roamProfile.pAddIEScan = (uint8_t *) NULL;
3965 pWextState->roamProfile.nAddIEScanLength = 0;
3966 pWextState->roamProfile.pAddIEAssoc = (uint8_t *) NULL;
3967 pWextState->roamProfile.nAddIEAssocLength = 0;
3968
3969 pWextState->roamProfile.EncryptionType.numEntries = 1;
3970 pWextState->roamProfile.EncryptionType.encryptionType[0]
3971 = eCSR_ENCRYPT_TYPE_NONE;
3972
3973 pWextState->roamProfile.mcEncryptionType.numEntries = 1;
3974 pWextState->roamProfile.mcEncryptionType.encryptionType[0]
3975 = eCSR_ENCRYPT_TYPE_NONE;
3976
3977 pWextState->roamProfile.AuthType.numEntries = 1;
3978 pWextState->roamProfile.AuthType.authType[0] =
3979 eCSR_AUTH_TYPE_OPEN_SYSTEM;
3980
Abhishek Singh3c9910e2017-01-06 17:56:47 +05303981 qdf_mem_zero(pWextState->roamProfile.bssid_hint.bytes,
3982 QDF_MAC_ADDR_SIZE);
3983
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003984#ifdef WLAN_FEATURE_11W
3985 pWextState->roamProfile.MFPEnabled = false;
3986 pWextState->roamProfile.MFPRequired = 0;
3987 pWextState->roamProfile.MFPCapable = 0;
3988#endif
3989
3990 pWextState->authKeyMgmt = 0;
3991
Yingying Tang3cc6b792016-10-20 17:00:37 +08003992 qdf_mem_zero(pWextState->roamProfile.Keys.KeyLength, CSR_MAX_NUM_KEY);
3993
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003994#ifdef FEATURE_WLAN_WAPI
3995 pAdapter->wapi_info.wapiAuthMode = WAPI_AUTH_MODE_OPEN;
3996 pAdapter->wapi_info.nWapiMode = 0;
3997#endif
3998
Anurag Chouhanc5548422016-02-24 18:33:27 +05303999 qdf_zero_macaddr(&pWextState->req_bssId);
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -07004000 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001}
4002
4003/**
4004 * wlan_hdd_get_vendor_oui_ie_ptr() - Find a vendor OUI
4005 * @oui: The OUI that is being searched for
4006 * @oui_size: The length of @oui
4007 * @ie: The set of IEs within which we're trying to find @oui
4008 * @ie_len: The length of @ie
4009 *
4010 * This function will scan the IEs contained within @ie looking for @oui.
4011 *
4012 * Return: Pointer to @oui embedded within @ie if it is present, NULL
4013 * if @oui is not present within @ie.
4014 */
4015uint8_t *wlan_hdd_get_vendor_oui_ie_ptr(uint8_t *oui, uint8_t oui_size,
4016 uint8_t *ie, int ie_len)
4017{
4018 int left = ie_len;
4019 uint8_t *ptr = ie;
4020 uint8_t elem_id, elem_len;
4021 uint8_t eid = 0xDD;
4022
4023 if (NULL == ie || 0 == ie_len)
4024 return NULL;
4025
4026 while (left >= 2) {
4027 elem_id = ptr[0];
4028 elem_len = ptr[1];
4029 left -= 2;
4030 if (elem_len > left) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004031 hdd_err("Invalid IEs eid: %d elem_len: %d left: %d",
4032 eid, elem_len, left);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004033 return NULL;
4034 }
SaidiReddy Yenugaecb273b2017-05-26 18:34:23 +05304035 if ((elem_id == eid) && (elem_len >= oui_size)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004036 if (memcmp(&ptr[2], oui, oui_size) == 0)
4037 return ptr;
4038 }
4039
4040 left -= elem_len;
4041 ptr += (elem_len + 2);
4042 }
4043 return NULL;
4044}
4045
4046/**
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304047 * hdd_get_ldpc() - Get adapter LDPC
4048 * @adapter: adapter being queried
4049 * @value: where to store the value
4050 *
4051 * Return: 0 on success, negative errno on failure
4052 */
4053int hdd_get_ldpc(hdd_adapter_t *adapter, int *value)
4054{
4055 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4056 int ret;
4057
4058 ENTER();
4059 ret = sme_get_ht_config(hal, adapter->sessionId,
4060 WNI_CFG_HT_CAP_INFO_ADVANCE_CODING);
4061 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004062 hdd_err("Failed to get LDPC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304063 } else {
4064 *value = ret;
4065 ret = 0;
4066 }
4067 return ret;
4068}
4069
4070/**
4071 * hdd_set_ldpc() - Set adapter LDPC
4072 * @adapter: adapter being modified
4073 * @value: new LDPC value
4074 *
4075 * Return: 0 on success, negative errno on failure
4076 */
4077int hdd_set_ldpc(hdd_adapter_t *adapter, int value)
4078{
4079 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4080 int ret;
4081
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004082 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304083 if (value) {
4084 /* make sure HT capabilities allow this */
4085 QDF_STATUS status;
4086 uint32_t cfg_value;
4087 union {
4088 uint16_t cfg_value16;
4089 tSirMacHTCapabilityInfo ht_cap_info;
4090 } u;
4091
4092 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4093 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004094 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304095 return -EIO;
4096 }
4097 u.cfg_value16 = cfg_value & 0xFFFF;
4098 if (!u.ht_cap_info.advCodingCap) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004099 hdd_err("LDCP not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304100 return -EINVAL;
4101 }
4102 }
4103
4104 ret = sme_update_ht_config(hal, adapter->sessionId,
4105 WNI_CFG_HT_CAP_INFO_ADVANCE_CODING,
4106 value);
4107 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004108 hdd_err("Failed to set LDPC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304109
4110 return ret;
4111}
4112
4113/**
4114 * hdd_get_tx_stbc() - Get adapter TX STBC
4115 * @adapter: adapter being queried
4116 * @value: where to store the value
4117 *
4118 * Return: 0 on success, negative errno on failure
4119 */
4120int hdd_get_tx_stbc(hdd_adapter_t *adapter, int *value)
4121{
4122 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4123 int ret;
4124
4125 ENTER();
4126 ret = sme_get_ht_config(hal, adapter->sessionId,
4127 WNI_CFG_HT_CAP_INFO_TX_STBC);
4128 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004129 hdd_err("Failed to get TX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304130 } else {
4131 *value = ret;
4132 ret = 0;
4133 }
4134
4135 return ret;
4136}
4137
4138/**
4139 * hdd_set_tx_stbc() - Set adapter TX STBC
4140 * @adapter: adapter being modified
4141 * @value: new TX STBC value
4142 *
4143 * Return: 0 on success, negative errno on failure
4144 */
4145int hdd_set_tx_stbc(hdd_adapter_t *adapter, int value)
4146{
4147 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4148 int ret;
4149
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004150 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304151 if (value) {
4152 /* make sure HT capabilities allow this */
4153 QDF_STATUS status;
4154 uint32_t cfg_value;
4155 union {
4156 uint16_t cfg_value16;
4157 tSirMacHTCapabilityInfo ht_cap_info;
4158 } u;
4159
4160 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4161 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004162 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304163 return -EIO;
4164 }
4165 u.cfg_value16 = cfg_value & 0xFFFF;
4166 if (!u.ht_cap_info.txSTBC) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004167 hdd_err("TX STBC not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304168 return -EINVAL;
4169 }
4170 }
4171 ret = sme_update_ht_config(hal, adapter->sessionId,
4172 WNI_CFG_HT_CAP_INFO_TX_STBC,
4173 value);
4174 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004175 hdd_err("Failed to set TX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304176
4177 return ret;
4178}
4179
4180/**
4181 * hdd_get_rx_stbc() - Get adapter RX STBC
4182 * @adapter: adapter being queried
4183 * @value: where to store the value
4184 *
4185 * Return: 0 on success, negative errno on failure
4186 */
4187int hdd_get_rx_stbc(hdd_adapter_t *adapter, int *value)
4188{
4189 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4190 int ret;
4191
4192 ENTER();
4193 ret = sme_get_ht_config(hal, adapter->sessionId,
4194 WNI_CFG_HT_CAP_INFO_RX_STBC);
4195 if (ret < 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004196 hdd_err("Failed to get RX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304197 } else {
4198 *value = ret;
4199 ret = 0;
4200 }
4201
4202 return ret;
4203}
4204
4205/**
4206 * hdd_set_rx_stbc() - Set adapter RX STBC
4207 * @adapter: adapter being modified
4208 * @value: new RX STBC value
4209 *
4210 * Return: 0 on success, negative errno on failure
4211 */
4212int hdd_set_rx_stbc(hdd_adapter_t *adapter, int value)
4213{
4214 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
4215 int ret;
4216
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004217 hdd_debug("%d", value);
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304218 if (value) {
4219 /* make sure HT capabilities allow this */
4220 QDF_STATUS status;
4221 uint32_t cfg_value;
4222 union {
4223 uint16_t cfg_value16;
4224 tSirMacHTCapabilityInfo ht_cap_info;
4225 } u;
4226
4227 status = sme_cfg_get_int(hal, WNI_CFG_HT_CAP_INFO, &cfg_value);
4228 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004229 hdd_err("Failed to get HT capability info");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304230 return -EIO;
4231 }
4232 u.cfg_value16 = cfg_value & 0xFFFF;
4233 if (!u.ht_cap_info.rxSTBC) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004234 hdd_warn("RX STBC not supported");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304235 return -EINVAL;
4236 }
4237 }
4238 ret = sme_update_ht_config(hal, adapter->sessionId,
4239 WNI_CFG_HT_CAP_INFO_RX_STBC,
4240 value);
4241 if (ret)
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004242 hdd_err("Failed to set RX STBC value");
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304243
4244 return ret;
4245}
4246
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08004247int hdd_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate)
4248{
4249 int set_value;
4250
4251 if (sme_is_feature_supported_by_fw(DOT11AX))
4252 set_value = WMI_ASSEMBLE_RATECODE_V1(rate, nss, preamble);
4253 else
4254 set_value = (preamble << 6) | (nss << 4) | rate;
4255
4256 return set_value;
4257}
4258
4259int hdd_set_11ax_rate(hdd_adapter_t *adapter, int set_value,
4260 struct sap_Config *sap_config)
4261{
4262 uint8_t preamble = 0, nss = 0, rix = 0;
4263 int ret;
4264
4265 if (!sap_config) {
4266 if (!sme_is_feature_supported_by_fw(DOT11AX)) {
4267 hdd_err("Target does not support 11ax");
4268 return -EIO;
4269 }
4270 } else if (sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax &&
4271 sap_config->SapHw_mode != eCSR_DOT11_MODE_11ax_ONLY) {
4272 hdd_err("Invalid hw mode, SAP hw_mode= 0x%x, ch = %d",
4273 sap_config->SapHw_mode, sap_config->channel);
4274 return -EIO;
4275 }
4276
4277 if (set_value != 0xff) {
4278 rix = RC_2_RATE_IDX_11AX(set_value);
4279 preamble = WMI_RATE_PREAMBLE_HE;
4280 nss = HT_RC_2_STREAMS_11AX(set_value);
4281
4282 set_value = hdd_assemble_rate_code(preamble, nss, rix);
4283 }
4284
4285 hdd_notice("SET_11AX_RATE val %d rix %d preamble %x nss %d",
4286 set_value, rix, preamble, nss);
4287
4288 ret = wma_cli_set_command(adapter->sessionId,
4289 WMI_VDEV_PARAM_FIXED_RATE,
4290 set_value, VDEV_CMD);
4291
4292 return ret;
4293}
4294
Manjeet Singhe80d6d82016-09-02 19:04:41 +05304295/**
Krishna Kumaar Natarajanf1581df2017-02-21 13:42:08 -08004296 * hdd_get_aid_rc() - Get AID and rate code passed from user
4297 * @aid: pointer to AID
4298 * @rc: pointer to rate code
4299 * @set_value: value passed from user
4300 *
4301 * If target is 11ax capable, set_value will have AID left shifted 16 bits
4302 * and 16 bits for rate code. If the target is not 11ax capable, rate code
4303 * will only be 8 bits.
4304 *
4305 * Return: None
4306 */
4307static void hdd_get_aid_rc(uint8_t *aid, uint16_t *rc, int set_value)
4308{
4309 uint8_t rc_bits;
4310
4311 if (sme_is_feature_supported_by_fw(DOT11AX))
4312 rc_bits = 16;
4313 else
4314 rc_bits = 8;
4315
4316 *aid = set_value >> rc_bits;
4317 *rc = set_value & ((1 << (rc_bits + 1)) - 1);
4318}
4319
4320int hdd_set_peer_rate(hdd_adapter_t *adapter, int set_value)
4321{
4322 uint8_t aid, *peer_mac;
4323 uint16_t rc;
4324 QDF_STATUS status;
4325
4326 if (adapter->device_mode != QDF_SAP_MODE) {
4327 hdd_err("Invalid devicde mode - %d", adapter->device_mode);
4328 return -EINVAL;
4329 }
4330
4331 hdd_get_aid_rc(&aid, &rc, set_value);
4332
4333 if ((adapter->aStaInfo[aid].isUsed) &&
4334 (OL_TXRX_PEER_STATE_CONN == adapter->aStaInfo[aid].tlSTAState)) {
4335 peer_mac =
4336 (uint8_t *)&(adapter->aStaInfo[aid].macAddrSTA.bytes[0]);
4337 hdd_info("Peer AID: %d MAC_ADDR: "MAC_ADDRESS_STR,
4338 aid, MAC_ADDR_ARRAY(peer_mac));
4339 } else {
4340 hdd_err("No matching peer found for AID: %d", aid);
4341 return -EINVAL;
4342 }
4343
4344 status = sme_set_peer_param(peer_mac, WMI_PEER_PARAM_FIXED_RATE,
4345 rc, adapter->sessionId);
4346 if (status != QDF_STATUS_SUCCESS) {
4347 hdd_err("Failed to set peer fixed rate - status: %d", status);
4348 return -EIO;
4349 }
4350
4351 return 0;
4352}
4353
4354/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004355 * __iw_set_commit() - SIOCSIWCOMMIT ioctl handler
4356 * @dev: device upon which the ioctl was received
4357 * @info: ioctl request information
4358 * @wrqu: ioctl request data
4359 * @extra: ioctl extra data
4360 *
4361 * Return: 0 on success, non-zero on error
4362 */
4363static int __iw_set_commit(struct net_device *dev, struct iw_request_info *info,
4364 union iwreq_data *wrqu, char *extra)
4365{
4366 hdd_adapter_t *adapter;
4367 hdd_context_t *hdd_ctx;
4368 int ret;
4369
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004370 ENTER_DEV(dev);
4371
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004372 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4373 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4374 ret = wlan_hdd_validate_context(hdd_ctx);
4375 if (0 != ret)
4376 return ret;
4377
Jeff Johnson441e1f72017-02-07 08:50:49 -08004378 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4379 if (0 != ret)
4380 return ret;
4381
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004382 /* Do nothing for now */
4383 return 0;
4384}
4385
4386/**
4387 * iw_set_commit() - SSR wrapper function for __iw_set_commit
4388 * @dev: pointer to net_device
4389 * @info: pointer to iw_request_info
4390 * @wrqu: pointer to iwreq_data
4391 * @extra: extra
4392 *
4393 * Return: 0 on success, error number otherwise
4394 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07004395static int iw_set_commit(struct net_device *dev, struct iw_request_info *info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004396 union iwreq_data *wrqu, char *extra)
4397{
4398 int ret;
4399
4400 cds_ssr_protect(__func__);
4401 ret = __iw_set_commit(dev, info, wrqu, extra);
4402 cds_ssr_unprotect(__func__);
4403
4404 return ret;
4405}
4406
4407/**
4408 * __iw_get_name() - SIOCGIWNAME ioctl handler
4409 * @dev: device upon which the ioctl was received
4410 * @info: ioctl request information
4411 * @wrqu: ioctl request data
4412 * @extra: ioctl extra data
4413 *
4414 * Return: 0 on success, non-zero on error
4415 */
4416static int __iw_get_name(struct net_device *dev,
4417 struct iw_request_info *info, char *wrqu, char *extra)
4418{
4419 hdd_adapter_t *adapter;
4420 hdd_context_t *hdd_ctx;
4421 int ret;
4422
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004423 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004424
4425 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
4426 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
4427 ret = wlan_hdd_validate_context(hdd_ctx);
4428 if (0 != ret)
4429 return ret;
4430
Jeff Johnson441e1f72017-02-07 08:50:49 -08004431 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4432 if (0 != ret)
4433 return ret;
4434
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435 strlcpy(wrqu, "Qcom:802.11n", IFNAMSIZ);
4436 EXIT();
4437 return 0;
4438}
4439
4440/**
4441 * __iw_get_name() - SSR wrapper for __iw_get_name
4442 * @dev: pointer to net_device
4443 * @info: pointer to iw_request_info
4444 * @wrqu: pointer to iwreq_data
4445 * @extra: extra
4446 *
4447 * Return: 0 on success, error number otherwise
4448 */
4449static int iw_get_name(struct net_device *dev,
4450 struct iw_request_info *info,
4451 char *wrqu, char *extra)
4452{
4453 int ret;
4454
4455 cds_ssr_protect(__func__);
4456 ret = __iw_get_name(dev, info, wrqu, extra);
4457 cds_ssr_unprotect(__func__);
4458
4459 return ret;
4460}
4461
4462/**
4463 * __iw_set_mode() - ioctl handler
4464 * @dev: device upon which the ioctl was received
4465 * @info: ioctl request information
4466 * @wrqu: ioctl request data
4467 * @extra: ioctl extra data
4468 *
4469 * Return: 0 on success, non-zero on error
4470 */
4471static int __iw_set_mode(struct net_device *dev,
4472 struct iw_request_info *info,
4473 union iwreq_data *wrqu, char *extra)
4474{
4475 hdd_wext_state_t *pWextState;
4476 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4477 hdd_context_t *hdd_ctx;
4478 tCsrRoamProfile *pRoamProfile;
4479 eCsrRoamBssType LastBSSType;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004480 struct hdd_config *pConfig;
4481 struct wireless_dev *wdev;
4482 int ret;
4483
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004484 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004485
4486 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4487 ret = wlan_hdd_validate_context(hdd_ctx);
4488 if (0 != ret)
4489 return ret;
4490
Jeff Johnson441e1f72017-02-07 08:50:49 -08004491 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4492 if (0 != ret)
4493 return ret;
4494
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004495 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4496 wdev = dev->ieee80211_ptr;
4497 pRoamProfile = &pWextState->roamProfile;
4498 LastBSSType = pRoamProfile->BSSType;
4499
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004500 hdd_debug("Old Bss type = %d", LastBSSType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004501
4502 switch (wrqu->mode) {
4503 case IW_MODE_ADHOC:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004504 hdd_debug("Setting AP Mode as IW_MODE_ADHOC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004505 pRoamProfile->BSSType = eCSR_BSS_TYPE_START_IBSS;
4506 /* Set the phymode correctly for IBSS. */
4507 pConfig = (WLAN_HDD_GET_CTX(pAdapter))->config;
4508 pWextState->roamProfile.phyMode =
4509 hdd_cfg_xlate_to_csr_phy_mode(pConfig->dot11Mode);
Krunal Sonif07bb382016-03-10 13:02:11 -08004510 pAdapter->device_mode = QDF_IBSS_MODE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004511 wdev->iftype = NL80211_IFTYPE_ADHOC;
4512 break;
4513 case IW_MODE_INFRA:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004514 hdd_debug("Setting AP Mode as IW_MODE_INFRA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004515 pRoamProfile->BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
4516 wdev->iftype = NL80211_IFTYPE_STATION;
4517 break;
4518 case IW_MODE_AUTO:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004519 hdd_debug("Setting AP Mode as IW_MODE_AUTO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004520 pRoamProfile->BSSType = eCSR_BSS_TYPE_ANY;
4521 break;
4522 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07004523 hdd_err("Unknown AP Mode value %d", wrqu->mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004524 return -EOPNOTSUPP;
4525 }
4526
4527 if (LastBSSType != pRoamProfile->BSSType) {
4528 /* the BSS mode changed. We need to issue disconnect
4529 * if connected or in IBSS disconnect state
4530 */
Jeff Johnson9eeed0a2016-10-03 15:04:57 -07004531 if (hdd_conn_is_connected
4532 (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004533 || (eCSR_BSS_TYPE_START_IBSS == LastBSSType)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304534 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004535 /* need to issue a disconnect to CSR. */
4536 INIT_COMPLETION(pAdapter->disconnect_comp_var);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304537 qdf_status =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
4539 pAdapter->sessionId,
4540 eCSR_DISCONNECT_REASON_IBSS_LEAVE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304541 if (QDF_STATUS_SUCCESS == qdf_status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004542 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004543
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004544 rc = wait_for_completion_timeout(&pAdapter->
4545 disconnect_comp_var,
4546 msecs_to_jiffies
4547 (WLAN_WAIT_TIME_DISCONNECT));
4548 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004549 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004550 }
4551 }
4552 }
4553
4554 EXIT();
4555 return 0;
4556}
4557
4558/**
4559 * iw_set_mode() - SSR wrapper for __iw_set_mode()
4560 * @dev: pointer to net_device
4561 * @info: pointer to iw_request_info
4562 * @wrqu: pointer to iwreq_data
4563 * @extra: pointer to extra ioctl payload
4564 *
4565 * Return: 0 on success, error number otherwise
4566 */
4567static int iw_set_mode(struct net_device *dev, struct iw_request_info *info,
4568 union iwreq_data *wrqu, char *extra)
4569{
4570 int ret;
4571
4572 cds_ssr_protect(__func__);
4573 ret = __iw_set_mode(dev, info, wrqu, extra);
4574 cds_ssr_unprotect(__func__);
4575
4576 return ret;
4577}
4578
4579/**
4580 * __iw_get_mode() - SIOCGIWMODE ioctl handler
4581 * @dev: device upon which the ioctl was received
4582 * @info: ioctl request information
4583 * @wrqu: ioctl request data
4584 * @extra: ioctl extra data
4585 *
4586 * Return: 0 on success, non-zero on error
4587 */
4588static int
4589__iw_get_mode(struct net_device *dev, struct iw_request_info *info,
4590 union iwreq_data *wrqu, char *extra)
4591{
4592 hdd_wext_state_t *pWextState;
4593 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4594 hdd_context_t *hdd_ctx;
4595 int ret;
4596
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004597 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004598
4599 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4600 ret = wlan_hdd_validate_context(hdd_ctx);
4601 if (0 != ret)
4602 return ret;
4603
Jeff Johnson441e1f72017-02-07 08:50:49 -08004604 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4605 if (0 != ret)
4606 return ret;
4607
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004608 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4609
4610 switch (pWextState->roamProfile.BSSType) {
4611 case eCSR_BSS_TYPE_INFRASTRUCTURE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004612 hdd_debug("returns IW_MODE_INFRA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004613 wrqu->mode = IW_MODE_INFRA;
4614 break;
4615 case eCSR_BSS_TYPE_IBSS:
4616 case eCSR_BSS_TYPE_START_IBSS:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004617 hdd_debug("returns IW_MODE_ADHOC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004618 wrqu->mode = IW_MODE_ADHOC;
4619 break;
4620 case eCSR_BSS_TYPE_ANY:
4621 default:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004622 hdd_debug("returns IW_MODE_AUTO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623 wrqu->mode = IW_MODE_AUTO;
4624 break;
4625 }
4626
4627 EXIT();
4628 return 0;
4629}
4630
4631/**
4632 * iw_get_mode() - SSR wrapper for __iw_get_mode()
4633 * @dev: pointer to net_device
4634 * @info: pointer to iw_request_info
4635 * @wrqu: pointer to iwreq_data
4636 * @extra: pointer to extra ioctl payload
4637 *
4638 * Return: 0 on success, error number otherwise
4639 */
4640static int iw_get_mode(struct net_device *dev, struct iw_request_info *info,
4641 union iwreq_data *wrqu, char *extra)
4642{
4643 int ret;
4644
4645 cds_ssr_protect(__func__);
4646 ret = __iw_get_mode(dev, info, wrqu, extra);
4647 cds_ssr_unprotect(__func__);
4648
4649 return ret;
4650}
4651
4652/**
4653 * __iw_set_freq() - SIOCSIWFREQ ioctl handler
4654 * @dev: device upon which the ioctl was received
4655 * @info: ioctl request information
4656 * @wrqu: ioctl request data
4657 * @extra: ioctl extra data
4658 *
4659 * Return: 0 on success, non-zero on error
4660 */
4661static int __iw_set_freq(struct net_device *dev, struct iw_request_info *info,
4662 union iwreq_data *wrqu, char *extra)
4663{
4664 uint32_t numChans = 0;
4665 uint8_t validChan[WNI_CFG_VALID_CHANNEL_LIST_LEN];
4666 uint32_t indx = 0;
4667 int ret;
4668 hdd_wext_state_t *pWextState;
4669 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4670 hdd_context_t *hdd_ctx;
4671 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4672 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4673 tCsrRoamProfile *pRoamProfile;
4674
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004675 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676
4677 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4678 ret = wlan_hdd_validate_context(hdd_ctx);
4679 if (0 != ret)
4680 return ret;
4681
Jeff Johnson441e1f72017-02-07 08:50:49 -08004682 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4683 if (0 != ret)
4684 return ret;
4685
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4687
4688 pRoamProfile = &pWextState->roamProfile;
4689
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004690 /* Link is up then return cant set channel */
4691 if (eConnectionState_IbssConnected == pHddStaCtx->conn_info.connState ||
4692 eConnectionState_Associated == pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004693 hdd_debug("IBSS Associated");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004694 return -EOPNOTSUPP;
4695 }
4696
4697 /* Settings by Frequency as input */
4698 if ((wrqu->freq.e == 1) && (wrqu->freq.m >= (uint32_t) 2.412e8) &&
4699 (wrqu->freq.m <= (uint32_t) 5.825e8)) {
4700 uint32_t freq = wrqu->freq.m / 100000;
4701
4702 while ((indx < FREQ_CHAN_MAP_TABLE_SIZE)
4703 && (freq != freq_chan_map[indx].freq))
4704 indx++;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004705 if (indx >= FREQ_CHAN_MAP_TABLE_SIZE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004707
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004708 wrqu->freq.e = 0;
4709 wrqu->freq.m = freq_chan_map[indx].chan;
4710
4711 }
4712
4713 if (wrqu->freq.e == 0) {
4714 if ((wrqu->freq.m < WNI_CFG_CURRENT_CHANNEL_STAMIN) ||
4715 (wrqu->freq.m > WNI_CFG_CURRENT_CHANNEL_STAMAX)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004716 hdd_debug("Channel %d is not in range[%d to %d]",
Jeff Johnson99bac312016-06-28 10:38:18 -07004717 wrqu->freq.m,
4718 WNI_CFG_CURRENT_CHANNEL_STAMIN,
4719 WNI_CFG_CURRENT_CHANNEL_STAMAX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720 return -EINVAL;
4721 }
4722
4723 numChans = WNI_CFG_VALID_CHANNEL_LIST_LEN;
4724
4725 if (sme_cfg_get_str(hHal, WNI_CFG_VALID_CHANNEL_LIST,
4726 validChan, &numChans) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304727 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004728 hdd_err("WNI_CFG_VALID_CHANNEL_LIST failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004729 return -EIO;
4730 }
4731
4732 for (indx = 0; indx < numChans; indx++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004733 if (wrqu->freq.m == validChan[indx])
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004734 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 }
4736 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737 return -EINVAL;
4738 }
4739
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004740 if (indx >= numChans)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004741 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742
4743 /* Set the Operational Channel */
4744 numChans = pRoamProfile->ChannelInfo.numOfChannels = 1;
4745 pHddStaCtx->conn_info.operationChannel = wrqu->freq.m;
4746 pRoamProfile->ChannelInfo.ChannelList =
4747 &pHddStaCtx->conn_info.operationChannel;
4748
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08004749 hdd_debug("pRoamProfile->operationChannel = %d", wrqu->freq.m);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750
4751 EXIT();
4752
4753 return ret;
4754}
4755
4756/**
4757 * iw_set_freq() - SSR wrapper for __iw_set_freq()
4758 * @dev: pointer to net_device
4759 * @info: pointer to iw_request_info
4760 * @wrqu: pointer to iwreq_data
4761 * @extra: pointer to extra ioctl payload
4762 *
4763 * Return: 0 on success, error number otherwise
4764 */
4765static int iw_set_freq(struct net_device *dev, struct iw_request_info *info,
4766 union iwreq_data *wrqu, char *extra)
4767{
4768 int ret;
4769
4770 cds_ssr_protect(__func__);
4771 ret = __iw_set_freq(dev, info, wrqu, extra);
4772 cds_ssr_unprotect(__func__);
4773
4774 return ret;
4775}
4776
4777/**
4778 * __iw_get_freq() - SIOCGIWFREQ ioctl handler
4779 * @dev: device upon which the ioctl was received
4780 * @info: ioctl request information
4781 * @wrqu: ioctl request data
4782 * @extra: ioctl extra data
4783 *
4784 * Return: 0 on success, non-zero on error
4785 */
4786static int __iw_get_freq(struct net_device *dev, struct iw_request_info *info,
4787 struct iw_freq *fwrq, char *extra)
4788{
4789 uint32_t status = false, channel = 0, freq = 0;
4790 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4791 tHalHandle hHal;
4792 hdd_wext_state_t *pWextState;
4793 tCsrRoamProfile *pRoamProfile;
4794 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4795 hdd_context_t *hdd_ctx;
4796 int ret;
4797
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004798 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004799
4800 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4801 ret = wlan_hdd_validate_context(hdd_ctx);
4802 if (0 != ret)
4803 return ret;
4804
Jeff Johnson441e1f72017-02-07 08:50:49 -08004805 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4806 if (0 != ret)
4807 return ret;
4808
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004809 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
4810 hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4811
4812 pRoamProfile = &pWextState->roamProfile;
4813
4814 if (pHddStaCtx->conn_info.connState == eConnectionState_Associated) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004815 if (sme_get_operation_channel(hHal, &channel,
4816 pAdapter->sessionId) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07004817 hdd_err("failed to get operating channel %u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004818 pAdapter->sessionId);
4819 return -EIO;
Jeff Johnson68755312017-02-10 11:46:55 -08004820 }
Jeff Johnson68755312017-02-10 11:46:55 -08004821 status = hdd_wlan_get_freq(channel, &freq);
4822 if (true == status) {
4823 /* Set Exponent parameter as 6 (MHZ)
4824 * in struct iw_freq iwlist & iwconfig
4825 * command shows frequency into proper
4826 * format (2.412 GHz instead of 246.2
4827 * MHz)
4828 */
4829 fwrq->m = freq;
4830 fwrq->e = MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831 }
4832 } else {
4833 /* Set Exponent parameter as 6 (MHZ) in struct iw_freq
4834 * iwlist & iwconfig command shows frequency into proper
4835 * format (2.412 GHz instead of 246.2 MHz)
4836 */
4837 fwrq->m = 0;
4838 fwrq->e = MHZ;
4839 }
4840 return 0;
4841}
4842
4843/**
4844 * iw_get_freq() - SSR wrapper for __iw_get_freq()
4845 * @dev: pointer to net_device
4846 * @info: pointer to iw_request_info
4847 * @fwrq: pointer to frequency data
4848 * @extra: pointer to extra ioctl payload
4849 *
4850 * Return: 0 on success, error number otherwise
4851 */
4852static int iw_get_freq(struct net_device *dev, struct iw_request_info *info,
4853 struct iw_freq *fwrq, char *extra)
4854{
4855 int ret;
4856
4857 cds_ssr_protect(__func__);
4858 ret = __iw_get_freq(dev, info, fwrq, extra);
4859 cds_ssr_unprotect(__func__);
4860
4861 return ret;
4862}
4863
4864/**
4865 * __iw_get_tx_power() - SIOCGIWTXPOW ioctl handler
4866 * @dev: device upon which the ioctl was received
4867 * @info: ioctl request information
4868 * @wrqu: ioctl request data
4869 * @extra: ioctl extra data
4870 *
4871 * Return: 0 on success, non-zero on error
4872 */
4873static int __iw_get_tx_power(struct net_device *dev,
4874 struct iw_request_info *info,
4875 union iwreq_data *wrqu, char *extra)
4876{
4877
4878 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4879 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4880 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
4881 int ret;
4882
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004883 ENTER_DEV(dev);
4884
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004885 ret = wlan_hdd_validate_context(hdd_ctx);
4886 if (0 != ret)
4887 return ret;
4888
Jeff Johnson441e1f72017-02-07 08:50:49 -08004889 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4890 if (0 != ret)
4891 return ret;
4892
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004893 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
4894 wrqu->txpower.value = 0;
4895 return 0;
4896 }
4897 wlan_hdd_get_class_astats(pAdapter);
4898 wrqu->txpower.value = pAdapter->hdd_stats.ClassA_stat.max_pwr;
4899
4900 return 0;
4901}
4902
4903/**
4904 * iw_get_tx_power() - SSR wrapper for __iw_get_tx_power()
4905 * @dev: pointer to net_device
4906 * @info: pointer to iw_request_info
4907 * @wrqu: pointer to iwreq_data
4908 * @extra: pointer to extra ioctl payload
4909 *
4910 * Return: 0 on success, error number otherwise
4911 */
4912static int iw_get_tx_power(struct net_device *dev,
4913 struct iw_request_info *info,
4914 union iwreq_data *wrqu, char *extra)
4915{
4916 int ret;
4917
4918 cds_ssr_protect(__func__);
4919 ret = __iw_get_tx_power(dev, info, wrqu, extra);
4920 cds_ssr_unprotect(__func__);
4921
4922 return ret;
4923}
4924
4925/**
4926 * __iw_set_tx_power() - SIOCSIWTXPOW ioctl handler
4927 * @dev: device upon which the ioctl was received
4928 * @info: ioctl request information
4929 * @wrqu: ioctl request data
4930 * @extra: ioctl extra data
4931 *
4932 * Return: 0 on success, non-zero on error
4933 */
4934static int __iw_set_tx_power(struct net_device *dev,
4935 struct iw_request_info *info,
4936 union iwreq_data *wrqu, char *extra)
4937{
4938 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
4939 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
4940 hdd_context_t *hdd_ctx;
4941 int ret;
4942
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08004943 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004944
4945 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
4946 ret = wlan_hdd_validate_context(hdd_ctx);
4947 if (0 != ret)
4948 return ret;
4949
Jeff Johnson441e1f72017-02-07 08:50:49 -08004950 ret = hdd_check_standard_wext_control(hdd_ctx, info);
4951 if (0 != ret)
4952 return ret;
4953
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004954 if (sme_cfg_set_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304955 wrqu->txpower.value) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07004956 hdd_err("WNI_CFG_CURRENT_TX_POWER_LEVEL failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004957 return -EIO;
4958 }
4959
4960 EXIT();
4961
4962 return 0;
4963}
4964
4965/**
4966 * iw_set_tx_power() - SSR wrapper for __iw_set_tx_power()
4967 * @dev: pointer to net_device
4968 * @info: pointer to iw_request_info
4969 * @wrqu: pointer to iwreq_data
4970 * @extra: pointer to extra ioctl payload
4971 *
4972 * Return: 0 on success, error number otherwise
4973 */
4974static int iw_set_tx_power(struct net_device *dev,
4975 struct iw_request_info *info,
4976 union iwreq_data *wrqu, char *extra)
4977{
4978 int ret;
4979
4980 cds_ssr_protect(__func__);
4981 ret = __iw_set_tx_power(dev, info, wrqu, extra);
4982 cds_ssr_unprotect(__func__);
4983
4984 return ret;
4985}
4986
4987/**
4988 * __iw_get_bitrate() - SIOCGIWRATE ioctl handler
4989 * @dev: device upon which the ioctl was received
4990 * @info: ioctl request information
4991 * @wrqu: ioctl request data
4992 * @extra: ioctl extra data
4993 *
4994 * Return: 0 on success, non-zero on error
4995 */
4996static int __iw_get_bitrate(struct net_device *dev,
4997 struct iw_request_info *info,
4998 union iwreq_data *wrqu, char *extra)
4999{
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005000 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005001 hdd_wext_state_t *pWextState;
5002 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5003 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
5004 hdd_context_t *hdd_ctx;
5005 int ret;
5006
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005007 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005008
5009 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5010 ret = wlan_hdd_validate_context(hdd_ctx);
5011 if (0 != ret)
5012 return ret;
5013
Jeff Johnson441e1f72017-02-07 08:50:49 -08005014 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5015 if (0 != ret)
5016 return ret;
5017
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
5019 wrqu->bitrate.value = 0;
5020 } else {
5021 status =
5022 sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
5023 eCSR_HDD,
5024 SME_SUMMARY_STATS |
5025 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -08005026 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -07005027 hdd_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005028 pHddStaCtx->conn_info.staId[0],
5029 pAdapter, pAdapter->sessionId);
5030
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305031 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005032 hdd_err("Unable to retrieve statistics");
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005033 return qdf_status_to_os_return(status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005034 }
5035
5036 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5037
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005038 status =
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05305039 qdf_wait_single_event(&pWextState->hdd_qdf_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005040 WLAN_WAIT_TIME_STATS);
5041
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005042 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005043 hdd_err("SME timeout while retrieving statistics");
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005044 return qdf_status_to_os_return(status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005045 }
5046
5047 wrqu->bitrate.value =
5048 pAdapter->hdd_stats.ClassA_stat.tx_rate * 500 * 1000;
5049 }
5050
5051 EXIT();
5052
Jeff Johnsonf25ac102017-02-07 09:16:02 -08005053 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005054}
5055
5056/**
5057 * iw_get_bitrate() - SSR wrapper for __iw_get_bitrate()
5058 * @dev: pointer to net_device
5059 * @info: pointer to iw_request_info
5060 * @wrqu: pointer to iwreq_data
5061 * @extra: pointer to extra ioctl payload
5062 *
5063 * Return: 0 on success, error number otherwise
5064 */
5065static int iw_get_bitrate(struct net_device *dev,
5066 struct iw_request_info *info,
5067 union iwreq_data *wrqu, char *extra)
5068{
5069 int ret;
5070
5071 cds_ssr_protect(__func__);
5072 ret = __iw_get_bitrate(dev, info, wrqu, extra);
5073 cds_ssr_unprotect(__func__);
5074
5075 return ret;
5076}
5077
5078/**
5079 * __iw_set_bitrate() - SIOCSIWRATE ioctl handler
5080 * @dev: device upon which the ioctl was received
5081 * @info: ioctl request information
5082 * @wrqu: ioctl request data
5083 * @extra: ioctl extra data
5084 *
5085 * Return: 0 on success, non-zero on error
5086 */
5087static int __iw_set_bitrate(struct net_device *dev,
5088 struct iw_request_info *info,
5089 union iwreq_data *wrqu, char *extra)
5090{
5091 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5092 hdd_wext_state_t *pWextState;
5093 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
5094 uint8_t supp_rates[WNI_CFG_SUPPORTED_RATES_11A_LEN];
5095 uint32_t a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
5096 uint32_t b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
5097 uint32_t i, rate;
5098 uint32_t valid_rate = false, active_phy_mode = 0;
5099 hdd_context_t *hdd_ctx;
5100 int ret;
5101
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005102 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005103
5104 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5105 ret = wlan_hdd_validate_context(hdd_ctx);
5106 if (0 != ret)
5107 return ret;
5108
Jeff Johnson441e1f72017-02-07 08:50:49 -08005109 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5110 if (0 != ret)
5111 return ret;
5112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5114
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005115 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005116 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117
5118 rate = wrqu->bitrate.value;
5119
5120 if (rate == -1) {
5121 rate = WNI_CFG_FIXED_RATE_AUTO;
5122 valid_rate = true;
5123 } else if (sme_cfg_get_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
5124 WNI_CFG_DOT11_MODE,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305125 &active_phy_mode) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005126 if (active_phy_mode == WNI_CFG_DOT11_MODE_11A
5127 || active_phy_mode == WNI_CFG_DOT11_MODE_11G
5128 || active_phy_mode == WNI_CFG_DOT11_MODE_11B) {
5129 if ((sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
5130 WNI_CFG_SUPPORTED_RATES_11A, supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305131 &a_len) == QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005132 &&
5133 (sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
5134 WNI_CFG_SUPPORTED_RATES_11B, supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305135 &b_len) == QDF_STATUS_SUCCESS)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 for (i = 0; i < (b_len + a_len); ++i) {
5137 /* supported rates returned is double
5138 * the actual rate so we divide it by 2
5139 */
5140 if ((supp_rates[i] & 0x7F) / 2 ==
5141 rate) {
5142 valid_rate = true;
5143 rate = i +
5144 WNI_CFG_FIXED_RATE_1MBPS;
5145 break;
5146 }
5147 }
5148 }
5149 }
5150 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005151 if (valid_rate != true)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005152 return -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005153
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005154 if (sme_cfg_set_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305155 WNI_CFG_FIXED_RATE, rate) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005156 hdd_err("failed to set ini parameter, WNI_CFG_FIXED_RATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005157 return -EIO;
5158 }
5159 return 0;
5160}
5161
5162/**
5163 * iw_set_bitrate() - SSR wrapper for __iw_set_bitrate()
5164 * @dev: pointer to net_device
5165 * @info: pointer to iw_request_info
5166 * @wrqu: pointer to iwreq_data
5167 * @extra: pointer to extra ioctl payload
5168 *
5169 * Return: 0 on success, error number otherwise
5170 */
5171static int iw_set_bitrate(struct net_device *dev,
5172 struct iw_request_info *info,
5173 union iwreq_data *wrqu, char *extra)
5174{
5175 int ret;
5176
5177 cds_ssr_protect(__func__);
5178 ret = __iw_set_bitrate(dev, info, wrqu, extra);
5179 cds_ssr_unprotect(__func__);
5180
5181 return ret;
5182}
5183
5184/**
5185 * __iw_set_genie() - SIOCSIWGENIE ioctl handler
5186 * @dev: device upon which the ioctl was received
5187 * @info: ioctl request information
5188 * @wrqu: ioctl request data
5189 * @extra: ioctl extra data
5190 *
5191 * Return: 0 on success, non-zero on error
5192 */
5193static int __iw_set_genie(struct net_device *dev,
5194 struct iw_request_info *info,
5195 union iwreq_data *wrqu, char *extra)
5196{
5197 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5198 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5199 uint8_t *genie = NULL;
5200 uint8_t *base_genie = NULL;
5201 uint16_t remLen;
5202 hdd_context_t *hdd_ctx;
5203 int ret;
5204
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005205 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005206
5207 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5208 ret = wlan_hdd_validate_context(hdd_ctx);
5209 if (0 != ret)
5210 return ret;
5211
Jeff Johnson441e1f72017-02-07 08:50:49 -08005212 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5213 if (0 != ret)
5214 return ret;
5215
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005216 if (!wrqu->data.length) {
5217 hdd_clear_roam_profile_ie(pAdapter);
5218 EXIT();
5219 return 0;
5220 }
5221
5222 base_genie = mem_alloc_copy_from_user_helper(wrqu->data.pointer,
5223 wrqu->data.length);
5224 if (NULL == base_genie) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005225 hdd_err("mem_alloc_copy_from_user_helper fail");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005226 return -ENOMEM;
5227 }
5228
5229 genie = base_genie;
5230
5231 remLen = wrqu->data.length;
5232
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005233 hdd_debug("iw_set_genie ioctl IE[0x%X], LEN[%d]", genie[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005234 genie[1]);
5235
5236 /* clear any previous genIE before this call */
5237 memset(&pWextState->genIE, 0, sizeof(pWextState->genIE));
5238
5239 while (remLen >= 2) {
5240 uint16_t eLen = 0;
5241 uint8_t elementId;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005242
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005243 elementId = *genie++;
5244 eLen = *genie++;
5245 remLen -= 2;
5246
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005247 hdd_debug("IE[0x%X], LEN[%d]", elementId, eLen);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005248
Srinivas Girigowda9eb807b2017-01-06 11:08:28 -08005249 if (remLen < eLen) {
5250 hdd_err("Remaining len: %u less than ie len: %u",
5251 remLen, eLen);
5252 ret = -EINVAL;
5253 goto exit;
5254 }
5255
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 switch (elementId) {
5257 case IE_EID_VENDOR:
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005258 /* should have at least OUI */
5259 if ((IE_LEN_SIZE + IE_EID_SIZE + IE_VENDOR_OUI_SIZE) > eLen) {
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305260 ret = -EINVAL;
5261 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005262 }
5263
5264 if (0 == memcmp(&genie[0], "\x00\x50\xf2\x04", 4)) {
5265 uint16_t curGenIELen = pWextState->genIE.length;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005266
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005267 hdd_debug("Set WPS OUI(%02x %02x %02x %02x) IE(len %d)",
Jeff Johnson99bac312016-06-28 10:38:18 -07005268 genie[0], genie[1], genie[2],
5269 genie[3], eLen + 2);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005270
5271 if (SIR_MAC_MAX_IE_LENGTH <
5272 (pWextState->genIE.length + eLen)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005273 hdd_err("genIE. Need bigger buffer space");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305274 QDF_ASSERT(0);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305275 ret = -ENOMEM;
5276 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005277 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005278 /* save to Additional IE; it should be
5279 * accumulated to handle WPS IE + other IE
5280 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005281 memcpy(pWextState->genIE.addIEdata +
5282 curGenIELen, genie - 2, eLen + 2);
5283 pWextState->genIE.length += eLen + 2;
5284 } else if (0 == memcmp(&genie[0], "\x00\x50\xf2", 3)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005285 hdd_debug("Set WPA IE (len %d)", eLen + 2);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305286 if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005287 hdd_err("genIE, Need bigger buffer space");
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305288 ret = -EINVAL;
5289 QDF_ASSERT(0);
5290 goto exit;
5291 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 memset(pWextState->WPARSNIE, 0,
5293 MAX_WPA_RSN_IE_LEN);
5294 memcpy(pWextState->WPARSNIE, genie - 2,
5295 (eLen + 2));
5296 pWextState->roamProfile.pWPAReqIE =
5297 pWextState->WPARSNIE;
5298 pWextState->roamProfile.nWPAReqIELength =
5299 eLen + 2;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005300 } else {
5301 /* any vendorId except WPA IE should
5302 * be accumulated to genIE
5303 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005304 uint16_t curGenIELen = pWextState->genIE.length;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005305
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005306 hdd_debug("Set OUI(%02x %02x %02x %02x) IE(len %d)",
Jeff Johnson99bac312016-06-28 10:38:18 -07005307 genie[0], genie[1], genie[2],
5308 genie[3], eLen + 2);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005309
5310 if (SIR_MAC_MAX_IE_LENGTH <
5311 (pWextState->genIE.length + eLen)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005312 hdd_err("genIE. Need bigger buffer space");
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305313 QDF_ASSERT(0);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305314 ret = -ENOMEM;
5315 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005316 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005317 /* save to Additional IE; it should be
5318 * accumulated to handle WPS IE + other IE
5319 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005320 memcpy(pWextState->genIE.addIEdata +
5321 curGenIELen, genie - 2, eLen + 2);
5322 pWextState->genIE.length += eLen + 2;
5323 }
5324 break;
5325 case DOT11F_EID_RSN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005326 hdd_debug("Set RSN IE (len %d)", eLen + 2);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305327 if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005328 hdd_err("genIE, Need bigger buffer space");
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305329 ret = -EINVAL;
5330 QDF_ASSERT(0);
5331 goto exit;
5332 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005333 memset(pWextState->WPARSNIE, 0, MAX_WPA_RSN_IE_LEN);
5334 memcpy(pWextState->WPARSNIE, genie - 2, (eLen + 2));
5335 pWextState->roamProfile.pRSNReqIE =
5336 pWextState->WPARSNIE;
5337 pWextState->roamProfile.nRSNReqIELength = eLen + 2;
5338 break;
5339
5340 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07005341 hdd_err("Set UNKNOWN IE %X", elementId);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305342 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005343 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344 remLen -= eLen;
Srinivas Girigowda9eb807b2017-01-06 11:08:28 -08005345
5346 /* Move genie only if next element is present */
5347 if (remLen >= 2)
5348 genie += eLen;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005349 }
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305350exit:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005351 EXIT();
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07005352 qdf_mem_free(base_genie);
Mahesh A Saptasagard639dde2015-11-06 12:39:13 +05305353 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005354}
5355
5356/**
5357 * iw_set_genie() - SSR wrapper for __iw_set_genie()
5358 * @dev: pointer to net_device
5359 * @info: pointer to iw_request_info
5360 * @wrqu: pointer to iwreq_data
5361 * @extra: pointer to extra ioctl payload
5362 *
5363 * Return: 0 on success, error number otherwise
5364 */
5365static int iw_set_genie(struct net_device *dev,
5366 struct iw_request_info *info,
5367 union iwreq_data *wrqu, char *extra)
5368{
5369 int ret;
5370
5371 cds_ssr_protect(__func__);
5372 ret = __iw_set_genie(dev, info, wrqu, extra);
5373 cds_ssr_unprotect(__func__);
5374
5375 return ret;
5376}
5377
5378/**
5379 * __iw_get_genie() - SIOCGIWGENIE ioctl handler
5380 * @dev: device upon which the ioctl was received
5381 * @info: ioctl request information
5382 * @wrqu: ioctl request data
5383 * @extra: ioctl extra data
5384 *
5385 * Return: 0 on success, non-zero on error
5386 */
5387static int __iw_get_genie(struct net_device *dev,
5388 struct iw_request_info *info,
5389 union iwreq_data *wrqu, char *extra)
5390{
5391 hdd_wext_state_t *pWextState;
5392 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5393 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305394 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005395 uint32_t length = DOT11F_IE_RSN_MAX_LEN;
5396 uint8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
5397 hdd_context_t *hdd_ctx;
5398 int ret;
5399
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005400 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005401
5402 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5403 ret = wlan_hdd_validate_context(hdd_ctx);
5404 if (0 != ret)
5405 return ret;
5406
Jeff Johnson441e1f72017-02-07 08:50:49 -08005407 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5408 if (0 != ret)
5409 return ret;
5410
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005411 hdd_debug("getGEN_IE ioctl");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005412
5413 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5414
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005415 if (pHddStaCtx->conn_info.connState == eConnectionState_NotConnected)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005416 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005417
5418 /* Return something ONLY if we are associated with an RSN or
5419 * WPA network
5420 */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005421 if (!hdd_is_auth_type_rsn(pWextState->roamProfile.negotiatedAuthType))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005422 return -ENXIO;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005423
5424 /* Actually retrieve the RSN IE from CSR. (We previously sent
5425 * it down in the CSR Roam Profile.)
5426 */
5427 status = csr_roam_get_wpa_rsn_req_ie(WLAN_HDD_GET_HAL_CTX(pAdapter),
5428 pAdapter->sessionId,
5429 &length, genIeBytes);
Manjeet Singhfde0c042016-09-03 12:08:09 +05305430 if (QDF_STATUS_SUCCESS != status) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005431 hdd_err("Failed to get WPA-RSN IE data status: %d", status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005432 return -EFAULT;
5433 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005434 wrqu->data.length = length;
Manjeet Singhfde0c042016-09-03 12:08:09 +05305435 if (length > DOT11F_IE_RSN_MAX_LEN) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005436 hdd_err("Invalid buffer length: %d", length);
Manjeet Singhfde0c042016-09-03 12:08:09 +05305437 return -E2BIG;
5438 }
5439 qdf_mem_copy(extra, (void *)genIeBytes, length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005440
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005441 hdd_debug("RSN IE of %d bytes returned",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005442 wrqu->data.length);
5443
5444 EXIT();
5445
5446 return 0;
5447}
5448
5449/**
5450 * iw_get_genie() - SSR wrapper for __iw_get_genie()
5451 * @dev: pointer to net_device
5452 * @info: pointer to iw_request_info
5453 * @wrqu: pointer to iwreq_data
5454 * @extra: pointer to extra ioctl payload
5455 *
5456 * Return: 0 on success, error number otherwise
5457 */
5458static int iw_get_genie(struct net_device *dev,
5459 struct iw_request_info *info,
5460 union iwreq_data *wrqu, char *extra)
5461{
5462 int ret;
5463
5464 cds_ssr_protect(__func__);
5465 ret = __iw_get_genie(dev, info, wrqu, extra);
5466 cds_ssr_unprotect(__func__);
5467
5468 return ret;
5469}
5470
5471/**
5472 * __iw_get_encode() - SIOCGIWENCODE ioctl handler
5473 * @dev: device upon which the ioctl was received
5474 * @info: ioctl request information
5475 * @wrqu: ioctl request data
5476 * @extra: ioctl extra data
5477 *
5478 * Return: 0 on success, non-zero on error
5479 */
5480static int __iw_get_encode(struct net_device *dev,
5481 struct iw_request_info *info,
5482 struct iw_point *dwrq, char *extra)
5483{
5484 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5485 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
5486 tCsrRoamProfile *pRoamProfile = &(pWextState->roamProfile);
5487 int keyId;
5488 eCsrAuthType authType = eCSR_AUTH_TYPE_NONE;
5489 int i;
5490 hdd_context_t *hdd_ctx;
5491 int ret;
5492
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005493 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005494
5495 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5496 ret = wlan_hdd_validate_context(hdd_ctx);
5497 if (0 != ret)
5498 return ret;
5499
Jeff Johnson441e1f72017-02-07 08:50:49 -08005500 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5501 if (0 != ret)
5502 return ret;
5503
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005504 keyId = pRoamProfile->Keys.defaultIndex;
5505
5506 if (keyId < 0 || keyId >= MAX_WEP_KEYS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005507 hdd_err("Invalid keyId: %d", keyId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005508 return -EINVAL;
5509 }
5510
5511 if (pRoamProfile->Keys.KeyLength[keyId] > 0) {
5512 dwrq->flags |= IW_ENCODE_ENABLED;
5513 dwrq->length = pRoamProfile->Keys.KeyLength[keyId];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305514 qdf_mem_copy(extra, &(pRoamProfile->Keys.KeyMaterial[keyId][0]),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005515 pRoamProfile->Keys.KeyLength[keyId]);
5516
5517 dwrq->flags |= (keyId + 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005518 } else {
5519 dwrq->flags |= IW_ENCODE_DISABLED;
5520 }
5521
5522 for (i = 0; i < MAX_WEP_KEYS; i++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005523 if (pRoamProfile->Keys.KeyLength[i] == 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005524 continue;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005525 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005526 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005527 }
5528
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005529 if (MAX_WEP_KEYS == i)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005530 dwrq->flags |= IW_ENCODE_NOKEY;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005531
5532 authType =
5533 ((hdd_station_ctx_t *) WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->
5534 conn_info.authType;
5535
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005536 if (eCSR_AUTH_TYPE_OPEN_SYSTEM == authType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005537 dwrq->flags |= IW_ENCODE_OPEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005538 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005539 dwrq->flags |= IW_ENCODE_RESTRICTED;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005540
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005541 EXIT();
5542 return 0;
5543}
5544
5545/**
5546 * iw_get_encode() - SSR wrapper for __iw_get_encode()
5547 * @dev: pointer to net_device
5548 * @info: pointer to iw_request_info
5549 * @dwrq: pointer to encoding information
5550 * @extra: pointer to extra ioctl payload
5551 *
5552 * Return: 0 on success, error number otherwise
5553 */
5554static int iw_get_encode(struct net_device *dev, struct iw_request_info *info,
5555 struct iw_point *dwrq, char *extra)
5556{
5557 int ret;
5558
5559 cds_ssr_protect(__func__);
5560 ret = __iw_get_encode(dev, info, dwrq, extra);
5561 cds_ssr_unprotect(__func__);
5562
5563 return ret;
5564}
5565
5566/**
5567 * __iw_get_rts_threshold() - SIOCGIWRTS ioctl handler
5568 * @dev: device upon which the ioctl was received
5569 * @info: ioctl request information
5570 * @wrqu: ioctl request data
5571 * @extra: ioctl extra data
5572 *
5573 * Return: 0 on success, non-zero on error
5574 */
5575static int __iw_get_rts_threshold(struct net_device *dev,
5576 struct iw_request_info *info,
5577 union iwreq_data *wrqu, char *extra)
5578{
Jeff Johnson5b907622017-02-07 10:00:37 -08005579 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5580 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
5581 uint32_t threshold = 0;
5582 hdd_context_t *hdd_ctx;
5583 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005584
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005585 ENTER_DEV(dev);
5586
Jeff Johnson5b907622017-02-07 10:00:37 -08005587 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5588 ret = wlan_hdd_validate_context(hdd_ctx);
5589 if (0 != ret)
5590 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005591
Jeff Johnson441e1f72017-02-07 08:50:49 -08005592 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5593 if (0 != ret)
5594 return ret;
5595
Jeff Johnson5b907622017-02-07 10:00:37 -08005596 if (QDF_STATUS_SUCCESS !=
5597 sme_cfg_get_int(hal, WNI_CFG_RTS_THRESHOLD, &threshold)) {
5598 hdd_warn("failed to get ini parameter, WNI_CFG_RTS_THRESHOLD");
5599 return -EIO;
5600 }
5601 wrqu->rts.value = threshold;
5602
5603 hdd_notice("Rts-Threshold=%d!!", wrqu->rts.value);
5604
5605 EXIT();
5606
5607 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005608}
5609
5610/**
5611 * __iw_set_rts_threshold() - SIOCSIWRTS ioctl handler
5612 * @dev: device upon which the ioctl was received
5613 * @info: ioctl request information
5614 * @wrqu: ioctl request data
5615 * @extra: ioctl extra data
5616 *
5617 * Return: 0 on success, non-zero on error
5618 */
5619static int __iw_set_rts_threshold(struct net_device *dev,
5620 struct iw_request_info *info,
5621 union iwreq_data *wrqu, char *extra)
5622{
5623 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5624 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5625 hdd_context_t *hdd_ctx;
5626 int ret;
5627
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005628 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005629
5630 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5631 ret = wlan_hdd_validate_context(hdd_ctx);
5632 if (0 != ret)
5633 return ret;
5634
Jeff Johnson441e1f72017-02-07 08:50:49 -08005635 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5636 if (0 != ret)
5637 return ret;
5638
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005639 if (wrqu->rts.value < WNI_CFG_RTS_THRESHOLD_STAMIN
5640 || wrqu->rts.value > WNI_CFG_RTS_THRESHOLD_STAMAX) {
5641 return -EINVAL;
5642 }
5643
5644 if (sme_cfg_set_int(hHal, WNI_CFG_RTS_THRESHOLD, wrqu->rts.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305645 QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07005646 hdd_err("failed to set ini parameter, WNI_CFG_RTS_THRESHOLD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005647 return -EIO;
5648 }
5649
5650 EXIT();
5651
5652 return 0;
5653}
5654
5655/**
5656 * iw_get_rts_threshold() - SSR wrapper for __iw_get_rts_threshold()
5657 * @dev: pointer to net_device
5658 * @info: pointer to iw_request_info
5659 * @wrqu: pointer to iwreq_data
5660 * @extra: pointer to extra ioctl payload
5661 *
5662 * Return: 0 on success, error number otherwise
5663 */
Jeff Johnson5b907622017-02-07 10:00:37 -08005664int iw_get_rts_threshold(struct net_device *dev,
5665 struct iw_request_info *info,
5666 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005667{
5668 int ret;
5669
5670 cds_ssr_protect(__func__);
5671 ret = __iw_get_rts_threshold(dev, info, wrqu, extra);
5672 cds_ssr_unprotect(__func__);
5673
5674 return ret;
5675}
5676
5677/**
5678 * iw_set_rts_threshold() - SSR wrapper for __iw_set_rts_threshold()
5679 * @dev: pointer to net_device
5680 * @info: pointer to iw_request_info
5681 * @wrqu: pointer to iwreq_data
5682 * @extra: pointer to extra ioctl payload
5683 *
5684 * Return: 0 on success, error number otherwise
5685 */
5686static int iw_set_rts_threshold(struct net_device *dev,
5687 struct iw_request_info *info,
5688 union iwreq_data *wrqu, char *extra)
5689{
5690 int ret;
5691
5692 cds_ssr_protect(__func__);
5693 ret = __iw_set_rts_threshold(dev, info, wrqu, extra);
5694 cds_ssr_unprotect(__func__);
5695
5696 return ret;
5697}
5698
5699/**
5700 * __iw_get_frag_threshold() - SIOCGIWFRAG ioctl handler
5701 * @dev: device upon which the ioctl was received
5702 * @info: ioctl request information
5703 * @wrqu: ioctl request data
5704 * @extra: ioctl extra data
5705 *
5706 * Return: 0 on success, non-zero on error
5707 */
5708static int __iw_get_frag_threshold(struct net_device *dev,
5709 struct iw_request_info *info,
5710 union iwreq_data *wrqu, char *extra)
5711{
Jeff Johnson5b907622017-02-07 10:00:37 -08005712 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5713 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
5714 uint32_t threshold = 0;
5715 hdd_context_t *hdd_ctx;
5716 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005717
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005718 ENTER_DEV(dev);
5719
Jeff Johnson5b907622017-02-07 10:00:37 -08005720 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5721 ret = wlan_hdd_validate_context(hdd_ctx);
5722 if (0 != ret)
5723 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005724
Jeff Johnson441e1f72017-02-07 08:50:49 -08005725 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5726 if (0 != ret)
5727 return ret;
5728
Jeff Johnson5b907622017-02-07 10:00:37 -08005729 if (sme_cfg_get_int(hal, WNI_CFG_FRAGMENTATION_THRESHOLD, &threshold)
5730 != QDF_STATUS_SUCCESS) {
5731 hdd_warn("failed to get ini parameter, WNI_CFG_FRAGMENTATION_THRESHOLD");
5732 return -EIO;
5733 }
5734 wrqu->frag.value = threshold;
5735
5736 hdd_notice("Frag-Threshold=%d!!", wrqu->frag.value);
5737
5738 EXIT();
5739
5740 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005741}
5742
5743/**
5744 * iw_get_frag_threshold() - SSR wrapper for __iw_get_frag_threshold()
5745 * @dev: pointer to net_device
5746 * @info: pointer to iw_request_info
5747 * @wrqu: pointer to iwreq_data
5748 * @extra: pointer to extra ioctl payload
5749 *
5750 * Return: 0 on success, error number otherwise
5751 */
Jeff Johnson5b907622017-02-07 10:00:37 -08005752int iw_get_frag_threshold(struct net_device *dev,
5753 struct iw_request_info *info,
5754 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005755{
5756 int ret;
5757
5758 cds_ssr_protect(__func__);
5759 ret = __iw_get_frag_threshold(dev, info, wrqu, extra);
5760 cds_ssr_unprotect(__func__);
5761
5762 return ret;
5763}
5764
5765/**
5766 * __iw_set_frag_threshold() - SIOCSIWFRAG ioctl handler
5767 * @dev: device upon which the ioctl was received
5768 * @info: ioctl request information
5769 * @wrqu: ioctl request data
5770 * @extra: ioctl extra data
5771 *
5772 * Return: 0 on success, non-zero on error
5773 */
5774static int __iw_set_frag_threshold(struct net_device *dev,
5775 struct iw_request_info *info,
5776 union iwreq_data *wrqu, char *extra)
5777{
5778 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5779 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5780 hdd_context_t *hdd_ctx;
5781 int ret;
5782
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005783 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005784
5785 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5786 ret = wlan_hdd_validate_context(hdd_ctx);
5787 if (0 != ret)
5788 return ret;
5789
Jeff Johnson441e1f72017-02-07 08:50:49 -08005790 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5791 if (0 != ret)
5792 return ret;
5793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005794 if (wrqu->frag.value < WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN
5795 || wrqu->frag.value > WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX) {
5796 return -EINVAL;
5797 }
5798
5799 if (sme_cfg_set_int
5800 (hHal, WNI_CFG_FRAGMENTATION_THRESHOLD, wrqu->frag.value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305801 != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005802 hdd_err("WNI_CFG_FRAGMENTATION_THRESHOLD failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005803 return -EIO;
5804 }
5805
5806 EXIT();
5807
5808 return 0;
5809}
5810
5811/**
5812 * iw_set_frag_threshold() - SSR wrapper for __iw_set_frag_threshold()
5813 * @dev: pointer to net_device
5814 * @info: pointer to iw_request_info
5815 * @wrqu: pointer to iwreq_data
5816 * @extra: pointer to extra ioctl payload
5817 *
5818 * Return: 0 on success, error number otherwise
5819 */
5820static int iw_set_frag_threshold(struct net_device *dev,
5821 struct iw_request_info *info,
5822 union iwreq_data *wrqu, char *extra)
5823{
5824 int ret;
5825
5826 cds_ssr_protect(__func__);
5827 ret = __iw_set_frag_threshold(dev, info, wrqu, extra);
5828 cds_ssr_unprotect(__func__);
5829
5830 return ret;
5831}
5832
5833/**
5834 * __iw_get_power_mode() - SIOCGIWPOWER ioctl handler
5835 * @dev: device upon which the ioctl was received
5836 * @info: ioctl request information
5837 * @wrqu: ioctl request data
5838 * @extra: ioctl extra data
5839 *
5840 * Return: 0 on success, non-zero on error
5841 */
5842static int __iw_get_power_mode(struct net_device *dev,
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005843 struct iw_request_info *info,
5844 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005845{
5846 hdd_adapter_t *adapter;
5847 hdd_context_t *hdd_ctx;
5848 int ret;
5849
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005850 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005851
5852 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5853 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5854 ret = wlan_hdd_validate_context(hdd_ctx);
5855 if (0 != ret)
5856 return ret;
5857
Jeff Johnson441e1f72017-02-07 08:50:49 -08005858 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5859 if (0 != ret)
5860 return ret;
5861
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005862 return -EOPNOTSUPP;
5863}
5864
5865/**
5866 * iw_get_power_mode() - SSR wrapper function for __iw_get_power_mode
5867 * @dev: pointer to net_device
5868 * @info: pointer to iw_request_info
5869 * @wrqu: pointer to iwreq_data
5870 * @extra: extra
5871 *
5872 * Return: 0 on success, error number otherwise
5873 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005874static int iw_get_power_mode(struct net_device *dev,
5875 struct iw_request_info *info,
5876 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005877{
5878 int ret;
5879
5880 cds_ssr_protect(__func__);
5881 ret = __iw_get_power_mode(dev, info, wrqu, extra);
5882 cds_ssr_unprotect(__func__);
5883
5884 return ret;
5885}
5886
5887/**
5888 * __iw_set_power_mode() - SIOCSIWPOWER ioctl handler
5889 * @dev: device upon which the ioctl was received
5890 * @info: ioctl request information
5891 * @wrqu: ioctl request data
5892 * @extra: ioctl extra data
5893 *
5894 * Return: 0 on success, non-zero on error
5895 */
5896static int __iw_set_power_mode(struct net_device *dev,
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005897 struct iw_request_info *info,
5898 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005899{
5900 hdd_adapter_t *adapter;
5901 hdd_context_t *hdd_ctx;
5902 int ret;
5903
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005904 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005905
5906 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
5907 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
5908 ret = wlan_hdd_validate_context(hdd_ctx);
5909 if (0 != ret)
5910 return ret;
5911
Jeff Johnson441e1f72017-02-07 08:50:49 -08005912 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5913 if (0 != ret)
5914 return ret;
5915
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005916 return -EOPNOTSUPP;
5917}
5918
5919/**
5920 * iw_set_power_mode() - SSR wrapper function for __iw_set_power_mode
5921 * @dev: pointer to net_device
5922 * @info: pointer to iw_request_info
5923 * @wrqu: pointer to iwreq_data
5924 * @extra: extra
5925 *
5926 * Return: 0 on success, error number otherwise
5927 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -07005928static int iw_set_power_mode(struct net_device *dev,
5929 struct iw_request_info *info,
5930 union iwreq_data *wrqu, char *extra)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005931{
5932 int ret;
5933
5934 cds_ssr_protect(__func__);
5935 ret = __iw_set_power_mode(dev, info, wrqu, extra);
5936 cds_ssr_unprotect(__func__);
5937
5938 return ret;
5939}
5940
5941/**
5942 * __iw_get_range() - SIOCGIWRANGE ioctl handler
5943 * @dev: device upon which the ioctl was received
5944 * @info: ioctl request information
5945 * @wrqu: ioctl request data
5946 * @extra: ioctl extra data
5947 *
5948 * Return: 0 on success, non-zero on error
5949 */
5950static int __iw_get_range(struct net_device *dev, struct iw_request_info *info,
5951 union iwreq_data *wrqu, char *extra)
5952{
5953 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
5954 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
5955 struct iw_range *range = (struct iw_range *)extra;
5956
5957 uint8_t channels[WNI_CFG_VALID_CHANNEL_LIST_LEN];
5958
5959 uint32_t num_channels = sizeof(channels);
5960 uint8_t supp_rates[WNI_CFG_SUPPORTED_RATES_11A_LEN];
5961 uint32_t a_len;
5962 uint32_t b_len;
5963 uint32_t active_phy_mode = 0;
5964 uint8_t index = 0, i;
5965 hdd_context_t *hdd_ctx;
5966 int ret;
5967
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08005968 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005969
5970 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
5971 ret = wlan_hdd_validate_context(hdd_ctx);
5972 if (0 != ret)
5973 return ret;
5974
Jeff Johnson441e1f72017-02-07 08:50:49 -08005975 ret = hdd_check_standard_wext_control(hdd_ctx, info);
5976 if (0 != ret)
5977 return ret;
5978
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005979 wrqu->data.length = sizeof(struct iw_range);
5980 memset(range, 0, sizeof(struct iw_range));
5981
5982
5983 /*Get the phy mode */
5984 if (sme_cfg_get_int(hHal,
5985 WNI_CFG_DOT11_MODE,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305986 &active_phy_mode) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08005987 hdd_debug("active_phy_mode = %d", active_phy_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005988
5989 if (active_phy_mode == WNI_CFG_DOT11_MODE_11A
5990 || active_phy_mode == WNI_CFG_DOT11_MODE_11G) {
5991 /*Get the supported rates for 11G band */
5992 a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
5993 if (sme_cfg_get_str(hHal,
5994 WNI_CFG_SUPPORTED_RATES_11A,
5995 supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305996 &a_len) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005997 if (a_len > WNI_CFG_SUPPORTED_RATES_11A_LEN)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005998 a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07005999
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006000 for (i = 0; i < a_len; i++) {
6001 range->bitrate[i] =
6002 ((supp_rates[i] & 0x7F) / 2) *
6003 1000000;
6004 }
6005 range->num_bitrates = a_len;
6006 } else {
6007 return -EIO;
6008 }
6009 } else if (active_phy_mode == WNI_CFG_DOT11_MODE_11B) {
6010 /*Get the supported rates for 11B band */
6011 b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
6012 if (sme_cfg_get_str(hHal,
6013 WNI_CFG_SUPPORTED_RATES_11B,
6014 supp_rates,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306015 &b_len) == QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006016 if (b_len > WNI_CFG_SUPPORTED_RATES_11B_LEN)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006017 b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006018
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006019 for (i = 0; i < b_len; i++) {
6020 range->bitrate[i] =
6021 ((supp_rates[i] & 0x7F) / 2) *
6022 1000000;
6023 }
6024 range->num_bitrates = b_len;
6025 } else {
6026 return -EIO;
6027 }
6028 }
6029 }
6030
6031 range->max_rts = WNI_CFG_RTS_THRESHOLD_STAMAX;
6032 range->min_frag = WNI_CFG_FRAGMENTATION_THRESHOLD_STAMIN;
6033 range->max_frag = WNI_CFG_FRAGMENTATION_THRESHOLD_STAMAX;
6034
6035 range->encoding_size[0] = 5;
6036 range->encoding_size[1] = 13;
6037 range->num_encoding_sizes = 2;
6038 range->max_encoding_tokens = MAX_WEP_KEYS;
6039
6040 /* we support through Wireless Extensions 22 */
6041 range->we_version_compiled = WIRELESS_EXT;
6042 range->we_version_source = 22;
6043
6044 /*Supported Channels and Frequencies */
6045 if (sme_cfg_get_str
6046 ((hHal), WNI_CFG_VALID_CHANNEL_LIST, channels,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306047 &num_channels) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006048 hdd_err("Failed to get ini parameter, WNI_CFG_VALID_CHANNEL_LIST");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006049 return -EIO;
6050 }
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006051 if (num_channels > IW_MAX_FREQUENCIES)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006052 num_channels = IW_MAX_FREQUENCIES;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006053
6054 range->num_channels = num_channels;
6055 range->num_frequency = num_channels;
6056
6057 for (index = 0; index < num_channels; index++) {
6058 uint32_t frq_indx = 0;
6059
6060 range->freq[index].i = channels[index];
6061 while (frq_indx < FREQ_CHAN_MAP_TABLE_SIZE) {
6062 if (channels[index] == freq_chan_map[frq_indx].chan) {
6063 range->freq[index].m =
6064 freq_chan_map[frq_indx].freq * 100000;
6065 range->freq[index].e = 1;
6066 break;
6067 }
6068 frq_indx++;
6069 }
6070 }
6071
6072 /* Event capability (kernel + driver) */
6073 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6074 IW_EVENT_CAPA_MASK(SIOCGIWAP) |
6075 IW_EVENT_CAPA_MASK(SIOCGIWSCAN));
6076 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6077
6078 /*Encryption capability */
6079 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6080 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6081
6082 /* Txpower capability */
6083 range->txpower_capa = IW_TXPOW_MWATT;
6084
6085 /*Scanning capability */
6086#if WIRELESS_EXT >= 22
6087 range->scan_capa =
6088 IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE | IW_SCAN_CAPA_CHANNEL;
6089#endif
6090
6091 EXIT();
6092 return 0;
6093}
6094
6095/**
6096 * iw_get_range() - SSR wrapper for __iw_get_range()
6097 * @dev: pointer to net_device
6098 * @info: pointer to iw_request_info
6099 * @wrqu: pointer to iwreq_data
6100 * @extra: pointer to extra ioctl payload
6101 *
6102 * Return: 0 on success, error number otherwise
6103 */
6104static int iw_get_range(struct net_device *dev, struct iw_request_info *info,
6105 union iwreq_data *wrqu, char *extra)
6106{
6107 int ret;
6108
6109 cds_ssr_protect(__func__);
6110 ret = __iw_get_range(dev, info, wrqu, extra);
6111 cds_ssr_unprotect(__func__);
6112
6113 return ret;
6114}
6115
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006116struct class_a_stats {
6117 tCsrGlobalClassAStatsInfo class_a_stats;
6118};
6119
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006120/**
6121 * hdd_get_class_a_statistics_cb() - Get Class A stats callback function
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006122 * @stats: pointer to Class A stats
6123 * @context: user context originally registered with SME (always the
6124 * cookie from the request context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006125 *
6126 * Return: None
6127 */
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006128static void hdd_get_class_a_statistics_cb(void *stats, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006129{
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006130 struct hdd_request *request;
6131 struct class_a_stats *priv;
6132 tCsrGlobalClassAStatsInfo *returned_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006133
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006134 ENTER();
6135 if ((NULL == stats) || (NULL == context)) {
6136 hdd_err("Bad param, stats [%p] context [%p]",
6137 stats, context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006138 return;
6139 }
6140
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006141 request = hdd_request_get(context);
6142 if (!request) {
6143 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006144 return;
6145 }
6146
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006147 returned_stats = stats;
6148 priv = hdd_request_priv(request);
6149 priv->class_a_stats = *returned_stats;
6150 hdd_request_complete(request);
6151 hdd_request_put(request);
6152 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006153}
6154
6155/**
6156 * wlan_hdd_get_class_astats() - Get Class A statistics
6157 * @pAdapter: adapter for which statistics are desired
6158 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306159 * Return: QDF_STATUS_SUCCESS if adapter's Class A statistics were updated
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006160 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306161QDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006162{
6163 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306164 QDF_STATUS hstatus;
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006165 int ret;
6166 void *cookie;
6167 struct hdd_request *request;
6168 struct class_a_stats *priv;
6169 static const struct hdd_request_params params = {
6170 .priv_size = sizeof(*priv),
6171 .timeout_ms = WLAN_WAIT_TIME_STATS,
6172 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006173
6174 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006175 hdd_err("pAdapter is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306176 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006177 }
Hanumanth Reddy Pothula2a8a7402017-07-03 14:06:11 +05306178 if (cds_is_driver_recovering() || cds_is_driver_in_bad_state()) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006179 hdd_debug("Recovery in Progress. State: 0x%x Ignore!!!",
Prashanth Bhatta9e143052015-12-04 11:56:47 -08006180 cds_get_driver_state());
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306181 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006182 }
6183
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006184 request = hdd_request_alloc(&params);
6185 if (!request) {
6186 hdd_err("Request allocation failure");
6187 return QDF_STATUS_E_NOMEM;
6188 }
6189 cookie = hdd_request_cookie(request);
6190
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006191 /* query only for Class A statistics (which include link speed) */
6192 hstatus = sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
6193 eCSR_HDD, SME_GLOBAL_CLASSA_STATS,
6194 hdd_get_class_a_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006195 pHddStaCtx->conn_info.staId[0],
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006196 cookie, pAdapter->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306197 if (QDF_STATUS_SUCCESS != hstatus) {
Archana Ramachandran31b5b652016-09-21 15:37:58 -07006198 hdd_warn("Unable to retrieve Class A statistics");
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006199 goto return_cached_results;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006200 }
6201
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006202 /* request was sent -- wait for the response */
6203 ret = hdd_request_wait_for_response(request);
6204 if (ret) {
6205 hdd_warn("SME timed out while retrieving Class A statistics");
6206 goto return_cached_results;
6207 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006208
Jeff Johnsona6ace5b2017-01-23 07:11:02 -08006209 /* update the adapter with the fresh results */
6210 priv = hdd_request_priv(request);
6211 pAdapter->hdd_stats.ClassA_stat = priv->class_a_stats;
6212
6213return_cached_results:
6214 /*
6215 * either we never sent a request, we sent a request and
6216 * received a response or we sent a request and timed out.
6217 * regardless we are done with the request.
6218 */
6219 hdd_request_put(request);
6220
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306221 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006222}
6223
Jeff Johnsondda167c2017-01-23 10:37:57 -08006224struct station_stats {
6225 tCsrSummaryStatsInfo summary_stats;
6226 tCsrGlobalClassAStatsInfo class_a_stats;
6227 struct csr_per_chain_rssi_stats_info per_chain_rssi_stats;
6228};
6229
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006230/**
6231 * hdd_get_station_statistics_cb() - Get stats callback function
Jeff Johnsondda167c2017-01-23 10:37:57 -08006232 * @stats: pointer to combined station stats
6233 * @context: user context originally registered with SME (always the
6234 * cookie from the request context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006235 *
6236 * Return: None
6237 */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006238static void hdd_get_station_statistics_cb(void *stats, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006239{
Jeff Johnsondda167c2017-01-23 10:37:57 -08006240 struct hdd_request *request;
6241 struct station_stats *priv;
6242 tCsrSummaryStatsInfo *summary_stats;
6243 tCsrGlobalClassAStatsInfo *class_a_stats;
Himanshu Agarwal37e42412016-07-21 14:35:09 +05306244 struct csr_per_chain_rssi_stats_info *per_chain_rssi_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006245
Jeff Johnsondda167c2017-01-23 10:37:57 -08006246 if ((NULL == stats) || (NULL == context)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006247 hdd_err("Bad param, pStats [%p] pContext [%p]",
Jeff Johnsondda167c2017-01-23 10:37:57 -08006248 stats, context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006249 return;
6250 }
6251
Jeff Johnsondda167c2017-01-23 10:37:57 -08006252 request = hdd_request_get(context);
6253 if (!request) {
6254 hdd_err("Obsolete request");
6255 return;
6256 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006257
Jeff Johnsondda167c2017-01-23 10:37:57 -08006258 summary_stats = (tCsrSummaryStatsInfo *) stats;
6259 class_a_stats = (tCsrGlobalClassAStatsInfo *) (summary_stats + 1);
Himanshu Agarwal37e42412016-07-21 14:35:09 +05306260 per_chain_rssi_stats = (struct csr_per_chain_rssi_stats_info *)
Jeff Johnsondda167c2017-01-23 10:37:57 -08006261 (class_a_stats + 1);
6262 priv = hdd_request_priv(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006263
6264 /* copy over the stats. do so as a struct copy */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006265 priv->summary_stats = *summary_stats;
6266 priv->class_a_stats = *class_a_stats;
6267 priv->per_chain_rssi_stats = *per_chain_rssi_stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006268
Jeff Johnsondda167c2017-01-23 10:37:57 -08006269 hdd_request_complete(request);
6270 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006271}
6272
6273/**
6274 * wlan_hdd_get_station_stats() - Get station statistics
6275 * @pAdapter: adapter for which statistics are desired
6276 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306277 * Return: QDF_STATUS_SUCCESS if adapter's statistics were updated
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006278 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306279QDF_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006280{
6281 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Dustin Brown0f5260d2017-06-12 16:17:38 -07006282 QDF_STATUS status;
6283 int errno;
Jeff Johnsondda167c2017-01-23 10:37:57 -08006284 void *cookie;
6285 struct hdd_request *request;
6286 struct station_stats *priv;
6287 static const struct hdd_request_params params = {
6288 .priv_size = sizeof(*priv),
6289 .timeout_ms = WLAN_WAIT_TIME_STATS,
6290 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006291
6292 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006293 hdd_err("pAdapter is NULL");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306294 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006295 }
6296
Jeff Johnsondda167c2017-01-23 10:37:57 -08006297 request = hdd_request_alloc(&params);
6298 if (!request) {
6299 hdd_err("Request allocation failure");
6300 return QDF_STATUS_E_NOMEM;
6301 }
6302 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006303
6304 /* query only for Summary & Class A statistics */
Dustin Brown0f5260d2017-06-12 16:17:38 -07006305 status = sme_get_statistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
6306 eCSR_HDD,
6307 SME_SUMMARY_STATS |
6308 SME_GLOBAL_CLASSA_STATS |
6309 SME_PER_CHAIN_RSSI_STATS,
6310 hdd_get_station_statistics_cb,
Dustin Brown0f5260d2017-06-12 16:17:38 -07006311 pHddStaCtx->conn_info.staId[0],
6312 cookie,
6313 pAdapter->sessionId);
6314 if (QDF_IS_STATUS_ERROR(status)) {
6315 hdd_err("Failed to retrieve statistics, status %d", status);
6316 goto put_request;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006317 }
6318
Dustin Brown0f5260d2017-06-12 16:17:38 -07006319 /* request was sent -- wait for the response */
6320 errno = hdd_request_wait_for_response(request);
6321 if (errno) {
6322 hdd_err("Failed to wait for statistics, errno %d", errno);
6323 goto put_request;
6324 }
6325
6326 /* update the adapter with the fresh results */
6327 priv = hdd_request_priv(request);
6328 pAdapter->hdd_stats.summary_stat = priv->summary_stats;
6329 pAdapter->hdd_stats.ClassA_stat = priv->class_a_stats;
6330 pAdapter->hdd_stats.per_chain_rssi_stats = priv->per_chain_rssi_stats;
6331
6332put_request:
Jeff Johnsondda167c2017-01-23 10:37:57 -08006333 /*
6334 * either we never sent a request, we sent a request and
6335 * received a response or we sent a request and timed out.
6336 * regardless we are done with the request.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006337 */
Jeff Johnsondda167c2017-01-23 10:37:57 -08006338 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006339
6340 /* either callback updated pAdapter stats or it has cached data */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306341 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006342}
6343
6344/**
6345 * iw_get_linkspeed() - Get current link speed ioctl
6346 * @dev: device upon which the ioctl was received
6347 * @info: ioctl request information
6348 * @wrqu: ioctl request data
6349 * @extra: extra ioctl buffer
6350 *
6351 * Return: 0 on success, non-zero on error
6352 */
6353static int __iw_get_linkspeed(struct net_device *dev,
6354 struct iw_request_info *info,
6355 union iwreq_data *wrqu, char *extra)
6356{
6357 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6358 char *pLinkSpeed = (char *)extra;
6359 int len = sizeof(uint32_t) + 1;
6360 uint32_t link_speed = 0;
6361 hdd_context_t *hdd_ctx;
Jeff Johnson441e1f72017-02-07 08:50:49 -08006362 int ret;
6363 int rc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006364
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08006365 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05306366
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006367 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Jeff Johnson441e1f72017-02-07 08:50:49 -08006368 ret = wlan_hdd_validate_context(hdd_ctx);
6369 if (0 != ret)
6370 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006371
Jeff Johnson441e1f72017-02-07 08:50:49 -08006372 ret = hdd_check_private_wext_control(hdd_ctx, info);
6373 if (0 != ret)
6374 return ret;
6375
6376 ret = wlan_hdd_get_link_speed(pAdapter, &link_speed);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006377 if (0 != ret)
Jeff Johnson441e1f72017-02-07 08:50:49 -08006378 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006379
6380 wrqu->data.length = len;
6381 /* return the linkspeed as a string */
6382 rc = snprintf(pLinkSpeed, len, "%u", link_speed);
6383 if ((rc < 0) || (rc >= len)) {
6384 /* encoding or length error? */
Jeff Johnson99bac312016-06-28 10:38:18 -07006385 hdd_err("Unable to encode link speed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006386 return -EIO;
6387 }
6388
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05306389 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006390 /* a value is being successfully returned */
6391 return 0;
6392}
6393
6394static int iw_get_linkspeed(struct net_device *dev,
6395 struct iw_request_info *info,
6396 union iwreq_data *wrqu, char *extra)
6397{
6398 int ret;
6399
6400 cds_ssr_protect(__func__);
6401 ret = __iw_get_linkspeed(dev, info, wrqu, extra);
6402 cds_ssr_unprotect(__func__);
6403
6404 return ret;
6405}
6406
6407/**
6408 * wlan_hdd_change_country_code_callback() - Change country code callback
6409 * @context: opaque context originally passed to SME. All functions
6410 * which use this callback pass the adapter upon which the country
6411 * code change is active
6412 *
6413 * This function is registered as the callback function when
6414 * sme_change_country_code() is invoked. Callers of
6415 * sme_change_country_code() subsequently wait for the adapter's
6416 * @change_country_code completion variable, so all this function
6417 * needs to do is set that completion variable so that execution can
6418 * continue.
6419 *
6420 * Return: none
6421 */
6422void wlan_hdd_change_country_code_callback(void *context)
6423{
6424
6425 hdd_adapter_t *adapter = context;
6426
6427 if (adapter && (WLAN_HDD_ADAPTER_MAGIC == adapter->magic))
6428 complete(&adapter->change_country_code);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006429}
6430
6431/**
6432 * __iw_set_nick() - SIOCSIWNICKN ioctl handler
6433 * @dev: device upon which the ioctl was received
6434 * @info: ioctl request information
6435 * @wrqu: ioctl request data
6436 * @extra: ioctl extra data
6437 *
6438 * Return: 0 on success, non-zero on error
6439 */
6440static int __iw_set_nick(struct net_device *dev,
6441 struct iw_request_info *info,
6442 union iwreq_data *wrqu, char *extra)
6443{
6444 hdd_adapter_t *adapter;
6445 hdd_context_t *hdd_ctx;
6446 int ret;
6447
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006448 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006449
6450 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6451 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6452 ret = wlan_hdd_validate_context(hdd_ctx);
6453 if (0 != ret)
6454 return ret;
6455
Jeff Johnson441e1f72017-02-07 08:50:49 -08006456 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6457 if (0 != ret)
6458 return ret;
6459
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006460 return 0;
6461}
6462
6463/**
6464 * iw_set_nick() - SSR wrapper for __iw_set_nick
6465 * @dev: pointer to net_device
6466 * @info: pointer to iw_request_info
6467 * @wrqu: pointer to iwreq_data
6468 * @extra: extra
6469 *
6470 * Return: 0 on success, error number otherwise
6471 */
6472static int iw_set_nick(struct net_device *dev,
6473 struct iw_request_info *info,
6474 union iwreq_data *wrqu, char *extra)
6475{
6476 int ret;
6477
6478 cds_ssr_protect(__func__);
6479 ret = __iw_set_nick(dev, info, wrqu, extra);
6480 cds_ssr_unprotect(__func__);
6481
6482 return ret;
6483}
6484
6485/**
6486 * __iw_get_nick() - SIOCGIWNICKN ioctl handler
6487 * @dev: device upon which the ioctl was received
6488 * @info: ioctl request information
6489 * @wrqu: ioctl request data
6490 * @extra: ioctl extra data
6491 *
6492 * Return: 0 on success, non-zero on error
6493 */
6494static int __iw_get_nick(struct net_device *dev,
6495 struct iw_request_info *info,
6496 union iwreq_data *wrqu, char *extra)
6497{
6498 hdd_adapter_t *adapter;
6499 hdd_context_t *hdd_ctx;
6500 int ret;
6501
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006502 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006503
6504 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
6505 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
6506 ret = wlan_hdd_validate_context(hdd_ctx);
6507 if (0 != ret)
6508 return ret;
6509
Jeff Johnson441e1f72017-02-07 08:50:49 -08006510 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6511 if (0 != ret)
6512 return ret;
6513
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006514 return 0;
6515}
6516
6517/**
6518 * iw_get_nick() - SSR wrapper for __iw_get_nick
6519 * @dev: pointer to net_device
6520 * @info: pointer to iw_request_info
6521 * @wrqu: pointer to iwreq_data
6522 * @extra: extra
6523 *
6524 * Return: 0 on success, error number otherwise
6525 */
6526static int iw_get_nick(struct net_device *dev,
6527 struct iw_request_info *info,
6528 union iwreq_data *wrqu, char *extra)
6529{
6530 int ret;
6531
6532 cds_ssr_protect(__func__);
6533 ret = __iw_get_nick(dev, info, wrqu, extra);
6534 cds_ssr_unprotect(__func__);
6535
6536 return ret;
6537}
6538
6539/**
6540 * __iw_set_encode() - SIOCSIWENCODE ioctl handler
6541 * @dev: device upon which the ioctl was received
6542 * @info: ioctl request information
6543 * @wrqu: ioctl request data
6544 * @extra: ioctl extra data
6545 *
6546 * Return: 0 on success, non-zero on error
6547 */
6548static int __iw_set_encode(struct net_device *dev, struct iw_request_info *info,
6549 union iwreq_data *wrqu, char *extra)
6550{
6551 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6552 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
6553 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6554 hdd_context_t *hdd_ctx;
6555 struct iw_point *encoderq = &(wrqu->encoding);
6556 uint32_t keyId;
6557 uint8_t key_length;
6558 eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
6559 bool fKeyPresent = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306560 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006561 int ret;
6562
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006563 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006564
6565 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6566 ret = wlan_hdd_validate_context(hdd_ctx);
6567 if (0 != ret)
6568 return ret;
6569
Jeff Johnson441e1f72017-02-07 08:50:49 -08006570 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6571 if (0 != ret)
6572 return ret;
6573
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006574 keyId = encoderq->flags & IW_ENCODE_INDEX;
6575
6576 if (keyId) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006577 if (keyId > MAX_WEP_KEYS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006578 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006579
6580 fKeyPresent = 1;
6581 keyId--;
6582 } else {
6583 fKeyPresent = 0;
6584 }
6585
6586 if (wrqu->data.flags & IW_ENCODE_DISABLED) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006587 hdd_debug("****iwconfig wlan0 key off*****");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006588 if (!fKeyPresent) {
Yingying Tang3cc6b792016-10-20 17:00:37 +08006589 qdf_mem_zero(pWextState->roamProfile.Keys.KeyLength,
6590 CSR_MAX_NUM_KEY);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006591 }
6592 pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
6593 pWextState->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
6594 pWextState->roamProfile.EncryptionType.encryptionType[0] =
6595 eCSR_ENCRYPT_TYPE_NONE;
6596 pWextState->roamProfile.mcEncryptionType.encryptionType[0] =
6597 eCSR_ENCRYPT_TYPE_NONE;
6598
6599 pHddStaCtx->conn_info.ucEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
6600 pHddStaCtx->conn_info.mcEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
6601
6602 if (eConnectionState_Associated ==
6603 pHddStaCtx->conn_info.connState) {
6604 INIT_COMPLETION(pAdapter->disconnect_comp_var);
6605 status =
6606 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
6607 pAdapter->sessionId,
6608 eCSR_DISCONNECT_REASON_UNSPECIFIED);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05306609 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006610 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006611
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006612 rc = wait_for_completion_timeout(&pAdapter->
6613 disconnect_comp_var,
6614 msecs_to_jiffies
6615 (WLAN_WAIT_TIME_DISCONNECT));
6616 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006617 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006618 }
6619 }
6620
6621 return status;
6622
6623 }
6624
6625 if (wrqu->data.flags & (IW_ENCODE_OPEN | IW_ENCODE_RESTRICTED)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006626 hdd_debug("iwconfig wlan0 key on");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006627
6628 pHddStaCtx->conn_info.authType =
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006629 (encoderq->flags & IW_ENCODE_RESTRICTED) ?
6630 eCSR_AUTH_TYPE_SHARED_KEY :
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006631 eCSR_AUTH_TYPE_OPEN_SYSTEM;
6632
6633 }
6634
6635 if (wrqu->data.length > 0) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006636 hdd_debug("wrqu->data.length : %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006637
6638 key_length = wrqu->data.length;
6639
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006640 /* IW_ENCODING_TOKEN_MAX is the value that is set
6641 * for wrqu->data.length by iwconfig.c
6642 * when 'iwconfig wlan0 key on' is issued.
6643 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006644
6645 if (5 == key_length) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006646 hdd_debug("Call with WEP40,key_len=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006647 key_length);
6648
6649 if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt)
6650 && (eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6651 pHddStaCtx->conn_info.authType)) {
6652 encryptionType = eCSR_ENCRYPT_TYPE_WEP40;
6653 } else {
6654 encryptionType =
6655 eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
6656 }
6657 } else if (13 == key_length) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006658 hdd_debug("Call with WEP104,key_len:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006659 key_length);
6660
6661 if ((IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt)
6662 && (eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6663 pHddStaCtx->conn_info.authType)) {
6664 encryptionType = eCSR_ENCRYPT_TYPE_WEP104;
6665 } else {
6666 encryptionType =
6667 eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
6668 }
6669 } else {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006670 hdd_err("Invalid WEP key length :%d", key_length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006671 return -EINVAL;
6672 }
6673
6674 pHddStaCtx->conn_info.ucEncryptionType = encryptionType;
6675 pHddStaCtx->conn_info.mcEncryptionType = encryptionType;
6676 pWextState->roamProfile.EncryptionType.numEntries = 1;
6677 pWextState->roamProfile.EncryptionType.encryptionType[0] =
6678 encryptionType;
6679 pWextState->roamProfile.mcEncryptionType.numEntries = 1;
6680 pWextState->roamProfile.mcEncryptionType.encryptionType[0] =
6681 encryptionType;
6682
6683 if ((eConnectionState_NotConnected ==
6684 pHddStaCtx->conn_info.connState)
6685 &&
6686 ((eCSR_AUTH_TYPE_OPEN_SYSTEM ==
6687 pHddStaCtx->conn_info.authType)
6688 || (eCSR_AUTH_TYPE_SHARED_KEY ==
6689 pHddStaCtx->conn_info.authType))) {
6690
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306691 qdf_mem_copy(&pWextState->roamProfile.Keys.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006692 KeyMaterial[keyId][0], extra, key_length);
6693
6694 pWextState->roamProfile.Keys.KeyLength[keyId] =
6695 (uint8_t) key_length;
6696 pWextState->roamProfile.Keys.defaultIndex =
6697 (uint8_t) keyId;
6698
6699 return status;
6700 }
6701 }
6702
6703 return 0;
6704}
6705
6706/**
6707 * iw_set_encode() - SSR wrapper for __iw_set_encode()
6708 * @dev: pointer to net_device
6709 * @info: pointer to iw_request_info
6710 * @wrqu: pointer to iwreq_data
6711 * @extra: pointer to extra ioctl payload
6712 *
6713 * Return: 0 on success, error number otherwise
6714 */
6715static int iw_set_encode(struct net_device *dev, struct iw_request_info *info,
6716 union iwreq_data *wrqu, char *extra)
6717{
6718 int ret;
6719
6720 cds_ssr_protect(__func__);
6721 ret = __iw_set_encode(dev, info, wrqu, extra);
6722 cds_ssr_unprotect(__func__);
6723
6724 return ret;
6725}
6726
6727/**
6728 * __iw_get_encodeext() - SIOCGIWENCODEEXT ioctl handler
6729 * @dev: device upon which the ioctl was received
6730 * @info: ioctl request information
6731 * @wrqu: ioctl request data
6732 * @extra: ioctl extra data
6733 *
6734 * Return: 0 on success, non-zero on error
6735 */
6736static int __iw_get_encodeext(struct net_device *dev,
6737 struct iw_request_info *info,
6738 struct iw_point *dwrq, char *extra)
6739{
6740 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6741 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6742 tCsrRoamProfile *pRoamProfile = &(pWextState->roamProfile);
6743 int keyId;
6744 eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
6745 eCsrAuthType authType = eCSR_AUTH_TYPE_NONE;
6746 int i, ret;
6747 hdd_context_t *hdd_ctx;
6748
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006749 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006750
6751 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6752 ret = wlan_hdd_validate_context(hdd_ctx);
6753 if (0 != ret)
6754 return ret;
6755
Jeff Johnson441e1f72017-02-07 08:50:49 -08006756 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6757 if (0 != ret)
6758 return ret;
6759
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006760 keyId = pRoamProfile->Keys.defaultIndex;
6761
6762 if (keyId < 0 || keyId >= MAX_WEP_KEYS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006763 hdd_err("Invalid keyId: %d", keyId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006764 return -EINVAL;
6765 }
6766
6767 if (pRoamProfile->Keys.KeyLength[keyId] > 0) {
6768 dwrq->flags |= IW_ENCODE_ENABLED;
6769 dwrq->length = pRoamProfile->Keys.KeyLength[keyId];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306770 qdf_mem_copy(extra, &(pRoamProfile->Keys.KeyMaterial[keyId][0]),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006771 pRoamProfile->Keys.KeyLength[keyId]);
6772 } else {
6773 dwrq->flags |= IW_ENCODE_DISABLED;
6774 }
6775
6776 for (i = 0; i < MAX_WEP_KEYS; i++) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006777 if (pRoamProfile->Keys.KeyLength[i] == 0)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006778 continue;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006779 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006780 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006781 }
6782
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006783 if (MAX_WEP_KEYS == i)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006784 dwrq->flags |= IW_ENCODE_NOKEY;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006785 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006786 dwrq->flags |= IW_ENCODE_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006787
6788 encryptionType = pRoamProfile->EncryptionType.encryptionType[0];
6789
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006790 if (eCSR_ENCRYPT_TYPE_NONE == encryptionType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006791 dwrq->flags |= IW_ENCODE_DISABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006792
6793 authType = (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.authType;
6794
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006795 if (IW_AUTH_ALG_OPEN_SYSTEM == authType)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006796 dwrq->flags |= IW_ENCODE_OPEN;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006797 else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006798 dwrq->flags |= IW_ENCODE_RESTRICTED;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006799
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006800 EXIT();
6801 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006802}
6803
6804/**
6805 * iw_get_encodeext() - SSR wrapper for __iw_get_encodeext()
6806 * @dev: pointer to net_device
6807 * @info: pointer to iw_request_info
6808 * @dwrq: pointer to encoding information
6809 * @extra: pointer to extra ioctl payload
6810 *
6811 * Return: 0 on success, error number otherwise
6812 */
6813static int iw_get_encodeext(struct net_device *dev,
6814 struct iw_request_info *info,
6815 struct iw_point *dwrq, char *extra)
6816{
6817 int ret;
6818
6819 cds_ssr_protect(__func__);
6820 ret = __iw_get_encodeext(dev, info, dwrq, extra);
6821 cds_ssr_unprotect(__func__);
6822
6823 return ret;
6824}
6825
6826/**
6827 * __iw_set_encodeext() - SIOCSIWENCODEEXT ioctl handler
6828 * @dev: device upon which the ioctl was received
6829 * @info: ioctl request information
6830 * @wrqu: ioctl request data
6831 * @extra: ioctl extra data
6832 *
6833 * Return: 0 on success, non-zero on error
6834 */
6835static int __iw_set_encodeext(struct net_device *dev,
6836 struct iw_request_info *info,
6837 union iwreq_data *wrqu, char *extra)
6838{
6839 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
6840 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
6841 hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
6842 hdd_context_t *hdd_ctx;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306843 QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006844 tCsrRoamProfile *pRoamProfile = &pWextState->roamProfile;
6845 int ret;
6846 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6847 int key_index;
6848 struct iw_point *encoding = &wrqu->encoding;
6849 tCsrRoamSetKey setKey;
6850 uint32_t roamId = 0xFF;
6851
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08006852 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006853
6854 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
6855 ret = wlan_hdd_validate_context(hdd_ctx);
6856 if (0 != ret)
6857 return ret;
6858
Jeff Johnson441e1f72017-02-07 08:50:49 -08006859 ret = hdd_check_standard_wext_control(hdd_ctx, info);
6860 if (0 != ret)
6861 return ret;
6862
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006863 key_index = encoding->flags & IW_ENCODE_INDEX;
6864
6865 if (key_index > 0) {
6866
6867 /*Convert from 1-based to 0-based keying */
6868 key_index--;
6869 }
6870 if (!ext->key_len) {
6871
6872 /*Set the encrytion type to NONE */
6873 pRoamProfile->EncryptionType.encryptionType[0] =
6874 eCSR_ENCRYPT_TYPE_NONE;
6875 return ret;
6876 }
6877
6878 if (eConnectionState_NotConnected == pHddStaCtx->conn_info.connState &&
6879 (IW_ENCODE_ALG_WEP == ext->alg)) {
6880 if (IW_AUTH_KEY_MGMT_802_1X == pWextState->authKeyMgmt) {
6881
Jeff Johnson99bac312016-06-28 10:38:18 -07006882 hdd_err("Invalid Configuration");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006883 return -EINVAL;
Jeff Johnson68755312017-02-10 11:46:55 -08006884 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006885
Jeff Johnson68755312017-02-10 11:46:55 -08006886 /*Static wep, update the roam profile with the keys */
6887 if (ext->key_len &&
6888 (ext->key_len <= eCSR_SECURITY_WEP_KEYSIZE_MAX_BYTES) &&
6889 key_index < CSR_MAX_NUM_KEY) {
6890 qdf_mem_copy(&pRoamProfile->Keys.
6891 KeyMaterial[key_index][0],
6892 ext->key, ext->key_len);
6893 pRoamProfile->Keys.KeyLength[key_index] =
6894 (uint8_t) ext->key_len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006895
Jeff Johnson68755312017-02-10 11:46:55 -08006896 if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)
6897 pRoamProfile->Keys.defaultIndex =
6898 (uint8_t) key_index;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006899 }
6900 return ret;
6901 }
6902
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306903 qdf_mem_zero(&setKey, sizeof(tCsrRoamSetKey));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006904
6905 setKey.keyId = key_index;
6906 setKey.keyLength = ext->key_len;
6907
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006908 if (ext->key_len <= CSR_MAX_KEY_LEN)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306909 qdf_mem_copy(&setKey.Key[0], ext->key, ext->key_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006910
6911 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
6912 /*Key direction for group is RX only */
6913 setKey.keyDirection = eSIR_RX_ONLY;
Anurag Chouhanc5548422016-02-24 18:33:27 +05306914 qdf_set_macaddr_broadcast(&setKey.peerMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006915 } else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006916 setKey.keyDirection = eSIR_TX_RX;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306917 qdf_mem_copy(setKey.peerMac.bytes, ext->addr.sa_data,
Anurag Chouhan6d760662016-02-20 16:05:43 +05306918 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006919 }
6920
6921 /*For supplicant pae role is zero */
6922 setKey.paeRole = 0;
6923
6924 switch (ext->alg) {
6925 case IW_ENCODE_ALG_NONE:
6926 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
6927 break;
6928
6929 case IW_ENCODE_ALG_WEP:
6930 setKey.encType =
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07006931 (ext->key_len == 5) ? eCSR_ENCRYPT_TYPE_WEP40 :
6932 eCSR_ENCRYPT_TYPE_WEP104;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006933 break;
6934
6935 case IW_ENCODE_ALG_TKIP:
6936 {
6937 uint8_t *pKey = &setKey.Key[0];
6938
6939 setKey.encType = eCSR_ENCRYPT_TYPE_TKIP;
6940
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306941 qdf_mem_zero(pKey, CSR_MAX_KEY_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006942
6943 /* Supplicant sends the 32bytes key in this order
6944 * |--------------|----------|----------|
6945 * | Tk1 | TX MIC | RX MIC |
6946 * |--------------|----------|----------|
6947 * <---16bytes---><--8bytes--><--8bytes-->
6948 *
6949 *
6950 * Sme expects the 32 bytes key to be in the below order
6951 * |--------------|----------|----------|
6952 * | Tk1 | RX MIC | TX MIC |
6953 * |--------------|----------|----------|
6954 * <---16bytes---><--8bytes--><--8bytes-->
6955 */
6956
6957 /* Copy the Temporal Key 1 (TK1) */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306958 qdf_mem_copy(pKey, ext->key, 16);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006959
6960 /* Copy the rx mic first */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306961 qdf_mem_copy(&pKey[16], &ext->key[24], 8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006962
6963 /* Copy the tx mic */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05306964 qdf_mem_copy(&pKey[24], &ext->key[16], 8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006965
6966 }
6967 break;
6968
6969 case IW_ENCODE_ALG_CCMP:
6970 setKey.encType = eCSR_ENCRYPT_TYPE_AES;
6971 break;
6972
6973#ifdef FEATURE_WLAN_ESE
6974#define IW_ENCODE_ALG_KRK 6
6975 case IW_ENCODE_ALG_KRK:
6976 setKey.encType = eCSR_ENCRYPT_TYPE_KRK;
6977 break;
6978#endif /* FEATURE_WLAN_ESE */
6979
6980 default:
6981 setKey.encType = eCSR_ENCRYPT_TYPE_NONE;
6982 break;
6983 }
6984
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006985 hdd_debug("cipher_alg:%d key_len:%d EncryptionType:%d",
Jeff Johnson99bac312016-06-28 10:38:18 -07006986 (int)ext->alg, (int)ext->key_len, setKey.encType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006987
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006988 /* The supplicant may attempt to set the PTK once
6989 * pre-authentication is done. Save the key in the UMAC and
6990 * include it in the ADD BSS request
6991 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306992 qdf_ret_status = sme_ft_update_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006993 pAdapter->sessionId, &setKey);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306994 if (qdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08006995 hdd_debug("Update PreAuth Key success");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006996 return 0;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05306997 } else if (qdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_FAILED) {
Jeff Johnson99bac312016-06-28 10:38:18 -07006998 hdd_err("Update PreAuth Key failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08006999 return -EINVAL;
7000 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007001
7002 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_SETTING_KEY;
7003
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307004 qdf_ret_status = sme_roam_set_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007005 pAdapter->sessionId,
7006 &setKey, &roamId);
7007
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307008 if (qdf_ret_status != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007009 hdd_err("[%4d] sme_roam_set_key returned ERROR status= %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307010 __LINE__, qdf_ret_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007011
7012 pHddStaCtx->roam_info.roamingState = HDD_ROAM_STATE_NONE;
7013 }
7014
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05307015 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007016}
7017
7018/**
7019 * iw_set_encodeext() - SSR wrapper for __iw_set_encodeext()
7020 * @dev: pointer to net_device
7021 * @info: pointer to iw_request_info
7022 * @wrqu: pointer to iwreq_data
7023 * @extra: pointer to extra ioctl payload
7024 *
7025 * Return: 0 on success, error number otherwise
7026 */
7027static int iw_set_encodeext(struct net_device *dev,
7028 struct iw_request_info *info,
7029 union iwreq_data *wrqu, char *extra)
7030{
7031 int ret;
7032
7033 cds_ssr_protect(__func__);
7034 ret = __iw_set_encodeext(dev, info, wrqu, extra);
7035 cds_ssr_unprotect(__func__);
7036
7037 return ret;
7038}
7039
7040/**
7041 * __iw_set_retry() - SIOCSIWRETRY ioctl handler
7042 * @dev: device upon which the ioctl was received
7043 * @info: ioctl request information
7044 * @wrqu: ioctl request data
7045 * @extra: ioctl extra data
7046 *
7047 * Return: 0 on success, non-zero on error
7048 */
7049static int __iw_set_retry(struct net_device *dev, struct iw_request_info *info,
7050 union iwreq_data *wrqu, char *extra)
7051{
7052 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7053 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7054 hdd_context_t *hdd_ctx;
7055 int ret;
7056
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007057 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007058
7059 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7060 ret = wlan_hdd_validate_context(hdd_ctx);
7061 if (0 != ret)
7062 return ret;
7063
Jeff Johnson441e1f72017-02-07 08:50:49 -08007064 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7065 if (0 != ret)
7066 return ret;
7067
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007068 if (wrqu->retry.value < WNI_CFG_LONG_RETRY_LIMIT_STAMIN ||
7069 wrqu->retry.value > WNI_CFG_LONG_RETRY_LIMIT_STAMAX) {
7070
Jeff Johnson99bac312016-06-28 10:38:18 -07007071 hdd_err("Invalid Retry-Limit=%d!!", wrqu->retry.value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007072
7073 return -EINVAL;
7074 }
7075
7076 if (wrqu->retry.flags & IW_RETRY_LIMIT) {
7077
7078 if ((wrqu->retry.flags & IW_RETRY_LONG)) {
7079 if (sme_cfg_set_int (hHal, WNI_CFG_LONG_RETRY_LIMIT,
7080 wrqu->retry.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307081 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007082 hdd_err("WNI_CFG_LONG_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007083 return -EIO;
7084 }
7085 } else if ((wrqu->retry.flags & IW_RETRY_SHORT)) {
7086 if (sme_cfg_set_int (hHal, WNI_CFG_SHORT_RETRY_LIMIT,
7087 wrqu->retry.value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307088 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007089 hdd_err("WNI_CFG_SHORT_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007090 return -EIO;
7091 }
7092 }
7093 } else {
7094 return -EOPNOTSUPP;
7095 }
7096
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007097 hdd_debug("Set Retry-Limit=%d!!", wrqu->retry.value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007098
7099 EXIT();
7100
7101 return 0;
7102
7103}
7104
7105/**
7106 * iw_set_retry() - SSR wrapper for __iw_set_retry()
7107 * @dev: pointer to net_device
7108 * @info: pointer to iw_request_info
7109 * @wrqu: pointer to iwreq_data
7110 * @extra: pointer to extra ioctl payload
7111 *
7112 * Return: 0 on success, error number otherwise
7113 */
7114static int iw_set_retry(struct net_device *dev, struct iw_request_info *info,
7115 union iwreq_data *wrqu, char *extra)
7116{
7117 int ret;
7118
7119 cds_ssr_protect(__func__);
7120 ret = __iw_set_retry(dev, info, wrqu, extra);
7121 cds_ssr_unprotect(__func__);
7122
7123 return ret;
7124}
7125
7126/**
7127 * __iw_get_retry() - SIOCGIWRETRY ioctl handler
7128 * @dev: device upon which the ioctl was received
7129 * @info: ioctl request information
7130 * @wrqu: ioctl request data
7131 * @extra: ioctl extra data
7132 *
7133 * Return: 0 on success, non-zero on error
7134 */
7135static int __iw_get_retry(struct net_device *dev, struct iw_request_info *info,
7136 union iwreq_data *wrqu, char *extra)
7137{
7138 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7139 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7140 uint32_t retry = 0;
7141 hdd_context_t *hdd_ctx;
7142 int ret;
7143
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007144 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007145
7146 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7147 ret = wlan_hdd_validate_context(hdd_ctx);
7148 if (0 != ret)
7149 return ret;
7150
Jeff Johnson441e1f72017-02-07 08:50:49 -08007151 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7152 if (0 != ret)
7153 return ret;
7154
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007155 if ((wrqu->retry.flags & IW_RETRY_LONG)) {
7156 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7157
7158 if (sme_cfg_get_int(hHal, WNI_CFG_LONG_RETRY_LIMIT, &retry) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307159 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007160 hdd_err("WNI_CFG_LONG_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007161 return -EIO;
7162 }
7163
7164 wrqu->retry.value = retry;
7165 } else if ((wrqu->retry.flags & IW_RETRY_SHORT)) {
7166 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_SHORT;
7167
7168 if (sme_cfg_get_int(hHal, WNI_CFG_SHORT_RETRY_LIMIT, &retry) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307169 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007170 hdd_err("WNI_CFG_SHORT_RETRY_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007171 return -EIO;
7172 }
7173
7174 wrqu->retry.value = retry;
7175 } else {
7176 return -EOPNOTSUPP;
7177 }
7178
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007179 hdd_debug("Retry-Limit=%d!!", retry);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007180
7181 EXIT();
7182
7183 return 0;
7184}
7185
7186/**
7187 * iw_get_retry() - SSR wrapper for __iw_get_retry()
7188 * @dev: pointer to net_device
7189 * @info: pointer to iw_request_info
7190 * @wrqu: pointer to iwreq_data
7191 * @extra: pointer to extra ioctl payload
7192 *
7193 * Return: 0 on success, error number otherwise
7194 */
7195static int iw_get_retry(struct net_device *dev, struct iw_request_info *info,
7196 union iwreq_data *wrqu, char *extra)
7197{
7198 int ret;
7199
7200 cds_ssr_protect(__func__);
7201 ret = __iw_get_retry(dev, info, wrqu, extra);
7202 cds_ssr_unprotect(__func__);
7203
7204 return ret;
7205}
7206
7207/**
7208 * __iw_set_mlme() - SIOCSIWMLME ioctl handler
7209 * @dev: device upon which the ioctl was received
7210 * @info: ioctl request information
7211 * @wrqu: ioctl request data
7212 * @extra: ioctl extra data
7213 *
7214 * Return: 0 on success, non-zero on error
7215 */
7216static int __iw_set_mlme(struct net_device *dev,
7217 struct iw_request_info *info,
7218 union iwreq_data *wrqu, char *extra)
7219{
7220 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7221 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
7222 struct iw_mlme *mlme = (struct iw_mlme *)extra;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307223 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007224 hdd_context_t *hdd_ctx;
7225 int ret;
7226
Jeff Johnsonb25dcb12016-02-11 17:46:42 -08007227 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007228
7229 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7230 ret = wlan_hdd_validate_context(hdd_ctx);
7231 if (0 != ret)
7232 return ret;
7233
Jeff Johnson441e1f72017-02-07 08:50:49 -08007234 ret = hdd_check_standard_wext_control(hdd_ctx, info);
7235 if (0 != ret)
7236 return ret;
7237
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007238 /* reason_code is unused. By default it is set to
7239 * eCSR_DISCONNECT_REASON_UNSPECIFIED
7240 */
7241 switch (mlme->cmd) {
7242 case IW_MLME_DISASSOC:
7243 case IW_MLME_DEAUTH:
7244
7245 if (pHddStaCtx->conn_info.connState ==
7246 eConnectionState_Associated) {
7247 eCsrRoamDisconnectReason reason =
7248 eCSR_DISCONNECT_REASON_UNSPECIFIED;
7249
7250 if (mlme->reason_code == HDD_REASON_MICHAEL_MIC_FAILURE)
7251 reason = eCSR_DISCONNECT_REASON_MIC_ERROR;
7252
7253 INIT_COMPLETION(pAdapter->disconnect_comp_var);
7254 status =
7255 sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
7256 pAdapter->sessionId, reason);
7257
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307258 if (QDF_STATUS_SUCCESS == status) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007259 unsigned long rc;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007260
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007261 rc = wait_for_completion_timeout(&pAdapter->
7262 disconnect_comp_var,
7263 msecs_to_jiffies
7264 (WLAN_WAIT_TIME_DISCONNECT));
7265 if (!rc)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007266 hdd_err("disconnect_comp_var failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007267 } else
Jeff Johnson99bac312016-06-28 10:38:18 -07007268 hdd_err("%d Command Disassociate/Deauthenticate : csr_roam_disconnect failure returned %d",
7269 (int)mlme->cmd, (int)status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007270
7271 /* Resetting authKeyMgmt */
7272 (WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter))->authKeyMgmt =
7273 0;
7274
Jeff Johnson99bac312016-06-28 10:38:18 -07007275 hdd_notice("Disabling queues");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007276 wlan_hdd_netif_queue_control(pAdapter,
Himanshu Agarwal865201d2017-04-12 15:45:31 +05307277 WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007278 WLAN_CONTROL_PATH);
7279
7280 } else {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007281 hdd_warn("%d Command Disassociate/Deauthenticate called but station is not in associated state",
Jeff Johnson99bac312016-06-28 10:38:18 -07007282 (int)mlme->cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007283 }
7284 break;
7285 default:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007286 hdd_err("Unexpected cmd: %d", (int)mlme->cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007287 return -EINVAL;
7288 } /* end of switch */
7289
7290 EXIT();
7291
7292 return status;
7293
7294}
7295
7296/**
7297 * iw_set_mlme() - SSR wrapper for __iw_set_mlme()
7298 * @dev: pointer to net_device
7299 * @info: pointer to iw_request_info
7300 * @wrqu: pointer to iwreq_data
7301 * @extra: pointer to extra ioctl payload
7302 *
7303 * Return: 0 on success, error number otherwise
7304 */
7305static int iw_set_mlme(struct net_device *dev, struct iw_request_info *info,
7306 union iwreq_data *wrqu, char *extra)
7307{
7308 int ret;
7309
7310 cds_ssr_protect(__func__);
7311 ret = __iw_set_mlme(dev, info, wrqu, extra);
7312 cds_ssr_unprotect(__func__);
7313
7314 return ret;
7315}
7316
7317/**
7318 * wlan_hdd_update_phymode() - handle change in PHY mode
7319 * @net: device upon which PHY mode change was received
7320 * @hal: umac handle for the driver
7321 * @new_phymode: new PHY mode for the device
7322 * @phddctx: pointer to the HDD context
7323 *
7324 * This function is called when the device is set to a new PHY mode.
7325 * It takes a holistic look at the desired PHY mode along with the
7326 * configured capabilities of the driver and the reported capabilities
7327 * of the hardware in order to correctly configure all PHY-related
7328 * parameters.
7329 *
7330 * Return: 0 on success, negative errno value on error
7331 */
7332int wlan_hdd_update_phymode(struct net_device *net, tHalHandle hal,
7333 int new_phymode, hdd_context_t *phddctx)
7334{
7335#ifdef QCA_HT_2040_COEX
7336 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(net);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307337 QDF_STATUS halStatus = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007338#endif
7339 bool band_24 = false, band_5g = false;
7340 bool ch_bond24 = false, ch_bond5g = false;
7341 tSmeConfigParams smeconfig;
7342 uint32_t chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007343 uint32_t vhtchanwidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007344 eCsrPhyMode phymode = -EIO, old_phymode;
Srinivas Girigowda2fb677c2017-03-25 15:35:34 -07007345 enum hdd_dot11_mode hdd_dot11mode = phddctx->config->dot11Mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007346 eCsrBand curr_band = eCSR_BAND_ALL;
7347
7348 old_phymode = sme_get_phy_mode(hal);
7349
7350 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
7351 sme_get_cb_phy_state_from_cb_ini_value(phddctx->config->
7352 nChannelBondingMode24GHz))
7353 ch_bond24 = true;
7354
7355 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
7356 sme_get_cb_phy_state_from_cb_ini_value(phddctx->config->
7357 nChannelBondingMode5GHz))
7358 ch_bond5g = true;
7359
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007360 if (phddctx->config->nBandCapability == eCSR_BAND_ALL)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007361 band_24 = band_5g = true;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007362 else if (phddctx->config->nBandCapability == eCSR_BAND_24)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007363 band_24 = true;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007364 else if (phddctx->config->nBandCapability == eCSR_BAND_5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007365 band_5g = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007366
7367 vhtchanwidth = phddctx->config->vhtChannelWidth;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007368 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 -08007369 ch_bond24, ch_bond5g, band_24, band_5g, vhtchanwidth);
7370
7371 switch (new_phymode) {
7372 case IEEE80211_MODE_AUTO:
7373 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007374 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_AUTO) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007375 phymode = eCSR_DOT11_MODE_AUTO;
7376 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7377 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7378 curr_band = eCSR_BAND_ALL;
7379 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7380 } else {
7381 sme_set_phy_mode(hal, old_phymode);
7382 return -EIO;
7383 }
7384 break;
7385 case IEEE80211_MODE_11A:
7386 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11a);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007387 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007388 phymode = eCSR_DOT11_MODE_11a;
7389 hdd_dot11mode = eHDD_DOT11_MODE_11a;
7390 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7391 curr_band = eCSR_BAND_5G;
7392 } else {
7393 sme_set_phy_mode(hal, old_phymode);
7394 return -EIO;
7395 }
7396 break;
7397 case IEEE80211_MODE_11B:
7398 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11b);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007399 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007400 phymode = eCSR_DOT11_MODE_11b;
7401 hdd_dot11mode = eHDD_DOT11_MODE_11b;
7402 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7403 curr_band = eCSR_BAND_24;
7404 } else {
7405 sme_set_phy_mode(hal, old_phymode);
7406 return -EIO;
7407 }
7408 break;
7409 case IEEE80211_MODE_11G:
7410 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11g);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007411 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007412 phymode = eCSR_DOT11_MODE_11g;
7413 hdd_dot11mode = eHDD_DOT11_MODE_11g;
7414 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7415 curr_band = eCSR_BAND_24;
7416 } else {
7417 sme_set_phy_mode(hal, old_phymode);
7418 return -EIO;
7419 }
7420 break;
7421 /* UMAC doesnt have option to set MODE_11NA/MODE_11NG as phymode
7422 * so setting phymode as eCSR_DOT11_MODE_11n and updating the band
7423 * and channel bonding in configuration to reflect MODE_11NA/MODE_11NG
7424 */
7425 case IEEE80211_MODE_11NA_HT20:
7426 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007427 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007428 phymode = eCSR_DOT11_MODE_11n;
7429 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7430 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7431 curr_band = eCSR_BAND_5G;
7432 } else {
7433 sme_set_phy_mode(hal, old_phymode);
7434 return -EIO;
7435 }
7436 break;
7437 case IEEE80211_MODE_11NA_HT40:
7438 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007439 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007440 phymode = eCSR_DOT11_MODE_11n;
7441 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7442 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7443 curr_band = eCSR_BAND_5G;
7444 } else {
7445 sme_set_phy_mode(hal, old_phymode);
7446 return -EIO;
7447 }
7448 break;
7449 case IEEE80211_MODE_11NG_HT20:
7450 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007451 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007452 phymode = eCSR_DOT11_MODE_11n;
7453 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7454 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7455 curr_band = eCSR_BAND_24;
7456 } else {
7457 sme_set_phy_mode(hal, old_phymode);
7458 return -EIO;
7459 }
7460 break;
7461 case IEEE80211_MODE_11NG_HT40:
7462 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007463 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007464 phymode = eCSR_DOT11_MODE_11n;
7465 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7466 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7467 curr_band = eCSR_BAND_24;
7468 } else {
7469 sme_set_phy_mode(hal, old_phymode);
7470 return -EIO;
7471 }
7472 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007473 case IEEE80211_MODE_11AC_VHT20:
7474 case IEEE80211_MODE_11AC_VHT40:
7475 case IEEE80211_MODE_11AC_VHT80:
7476 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11ac);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007477 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007478 phymode = eCSR_DOT11_MODE_11ac;
7479 hdd_dot11mode = eHDD_DOT11_MODE_11ac;
7480 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7481 curr_band = eCSR_BAND_5G;
7482 } else {
7483 sme_set_phy_mode(hal, old_phymode);
7484 return -EIO;
7485 }
7486 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007487 case IEEE80211_MODE_2G_AUTO:
7488 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007489 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_2_4_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007490 phymode = eCSR_DOT11_MODE_AUTO;
7491 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7492 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7493 curr_band = eCSR_BAND_24;
7494 } else {
7495 sme_set_phy_mode(hal, old_phymode);
7496 return -EIO;
7497 }
7498 break;
7499 case IEEE80211_MODE_5G_AUTO:
7500 sme_set_phy_mode(hal, eCSR_DOT11_MODE_AUTO);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007501 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_5_GHZ) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007502 phymode = eCSR_DOT11_MODE_AUTO;
7503 hdd_dot11mode = eHDD_DOT11_MODE_AUTO;
7504 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7505 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7506 curr_band = eCSR_BAND_5G;
7507 } else {
7508 sme_set_phy_mode(hal, old_phymode);
7509 return -EIO;
7510 }
7511 break;
7512 case IEEE80211_MODE_11AGN:
7513 sme_set_phy_mode(hal, eCSR_DOT11_MODE_11n);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -07007514 if (hdd_reg_set_band(net, WLAN_HDD_UI_BAND_AUTO) == 0) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007515 phymode = eCSR_DOT11_MODE_11n;
7516 hdd_dot11mode = eHDD_DOT11_MODE_11n;
7517 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
7518 curr_band = eCSR_BAND_ALL;
7519 } else {
7520 sme_set_phy_mode(hal, old_phymode);
7521 return -EIO;
7522 }
7523 break;
7524 default:
7525 return -EIO;
7526 }
7527
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007528 switch (new_phymode) {
7529 case IEEE80211_MODE_11AC_VHT20:
7530 chwidth = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
7531 vhtchanwidth = eHT_CHANNEL_WIDTH_20MHZ;
7532 break;
7533 case IEEE80211_MODE_11AC_VHT40:
7534 vhtchanwidth = eHT_CHANNEL_WIDTH_40MHZ;
7535 break;
7536 case IEEE80211_MODE_11AC_VHT80:
7537 vhtchanwidth = eHT_CHANNEL_WIDTH_80MHZ;
7538 break;
7539 default:
7540 vhtchanwidth = phddctx->config->vhtChannelWidth;
7541 break;
7542 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007543
7544 if (phymode != -EIO) {
7545 sme_get_config_param(hal, &smeconfig);
7546 smeconfig.csrConfig.phyMode = phymode;
7547#ifdef QCA_HT_2040_COEX
7548 if (phymode == eCSR_DOT11_MODE_11n &&
7549 chwidth == WNI_CFG_CHANNEL_BONDING_MODE_DISABLE) {
7550 smeconfig.csrConfig.obssEnabled = false;
7551 halStatus = sme_set_ht2040_mode(hal,
7552 pAdapter->sessionId,
7553 eHT_CHAN_HT20, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307554 if (halStatus == QDF_STATUS_E_FAILURE) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007555 hdd_err("Failed to disable OBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007556 return -EIO;
7557 }
7558 } else if (phymode == eCSR_DOT11_MODE_11n &&
7559 chwidth == WNI_CFG_CHANNEL_BONDING_MODE_ENABLE) {
7560 smeconfig.csrConfig.obssEnabled = true;
7561 halStatus = sme_set_ht2040_mode(hal,
7562 pAdapter->sessionId,
7563 eHT_CHAN_HT20, true);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307564 if (halStatus == QDF_STATUS_E_FAILURE) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007565 hdd_err("Failed to enable OBSS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007566 return -EIO;
7567 }
7568 }
7569#endif
7570 smeconfig.csrConfig.eBand = curr_band;
7571 smeconfig.csrConfig.bandCapability = curr_band;
7572 if (curr_band == eCSR_BAND_24)
7573 smeconfig.csrConfig.Is11hSupportEnabled = 0;
7574 else
7575 smeconfig.csrConfig.Is11hSupportEnabled =
7576 phddctx->config->Is11hSupportEnabled;
7577 if (curr_band == eCSR_BAND_24)
7578 smeconfig.csrConfig.channelBondingMode24GHz = chwidth;
7579 else if (curr_band == eCSR_BAND_24)
7580 smeconfig.csrConfig.channelBondingMode5GHz = chwidth;
7581 else {
7582 smeconfig.csrConfig.channelBondingMode24GHz = chwidth;
7583 smeconfig.csrConfig.channelBondingMode5GHz = chwidth;
7584 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007585 smeconfig.csrConfig.nVhtChannelWidth = vhtchanwidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007586 sme_update_config(hal, &smeconfig);
7587
7588 phddctx->config->dot11Mode = hdd_dot11mode;
7589 phddctx->config->nBandCapability = curr_band;
7590 phddctx->config->nChannelBondingMode24GHz =
7591 smeconfig.csrConfig.channelBondingMode24GHz;
7592 phddctx->config->nChannelBondingMode5GHz =
7593 smeconfig.csrConfig.channelBondingMode5GHz;
7594 phddctx->config->vhtChannelWidth = vhtchanwidth;
Krunal Sonidf0f8742016-09-26 14:56:31 -07007595 if (hdd_update_config_cfg(phddctx) == false) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007596 hdd_err("could not update config_dat");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007597 return -EIO;
7598 }
7599 if (phddctx->config->nChannelBondingMode5GHz)
Srinivas Girigowda11c28e02017-06-27 20:06:21 -07007600 phddctx->wiphy->bands[HDD_NL80211_BAND_5GHZ]->ht_cap.cap
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007601 |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7602 else
Srinivas Girigowda11c28e02017-06-27 20:06:21 -07007603 phddctx->wiphy->bands[HDD_NL80211_BAND_5GHZ]->ht_cap.cap
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007604 &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7605
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007606 hdd_debug("New_Phymode= %d ch_bonding=%d band=%d VHT_ch_width=%u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007607 phymode, chwidth, curr_band, vhtchanwidth);
7608 }
7609
7610 return 0;
7611}
7612
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007613struct temperature_priv {
7614 int temperature;
7615};
7616
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007617/**
7618 * hdd_get_temperature_cb() - "Get Temperature" callback function
7619 * @temperature: measured temperature
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007620 * @context: callback context
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007621 *
7622 * This function is passed to sme_get_temperature() as the callback
7623 * function to be invoked when the temperature measurement is
7624 * available.
7625 *
7626 * Return: None
7627 */
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007628static void hdd_get_temperature_cb(int temperature, void *context)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007629{
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007630 struct hdd_request *request;
7631 struct temperature_priv *priv;
7632
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007633 ENTER();
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007634
7635 request = hdd_request_get(context);
7636 if (!request) {
7637 hdd_err("Obsolete request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007638 return;
7639 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007640
7641 priv = hdd_request_priv(request);
7642 priv->temperature = temperature;
7643 hdd_request_complete(request);
7644 hdd_request_put(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007645 EXIT();
7646}
7647
7648/**
7649 * wlan_hdd_get_temperature() - get current device temperature
7650 * @pAdapter: device upon which the request was made
7651 * @temperature: pointer to where the temperature is to be returned
7652 *
7653 * Return: 0 if a temperature value (either current or cached) was
7654 * returned, otherwise a negative errno is returned.
7655 *
7656 */
7657int wlan_hdd_get_temperature(hdd_adapter_t *pAdapter, int *temperature)
7658{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307659 QDF_STATUS status;
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007660 int ret;
7661 void *cookie;
7662 struct hdd_request *request;
7663 struct temperature_priv *priv;
7664 static const struct hdd_request_params params = {
7665 .priv_size = sizeof(*priv),
7666 .timeout_ms = WLAN_WAIT_TIME_STATS,
7667 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007668
7669 ENTER();
7670 if (NULL == pAdapter) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007671 hdd_err("pAdapter is NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007672 return -EPERM;
7673 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007674
7675 request = hdd_request_alloc(&params);
7676 if (!request) {
7677 hdd_err("Request allocation failure");
7678 return -ENOMEM;
7679 }
7680 cookie = hdd_request_cookie(request);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007681 status = sme_get_temperature(WLAN_HDD_GET_HAL_CTX(pAdapter),
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007682 cookie, hdd_get_temperature_cb);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307683 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007684 hdd_err("Unable to retrieve temperature");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007685 } else {
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007686 ret = hdd_request_wait_for_response(request);
7687 if (ret) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007688 hdd_err("SME timed out while retrieving temperature");
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007689 } else {
7690 /* update the adapter with the fresh results */
7691 priv = hdd_request_priv(request);
7692 if (priv->temperature)
7693 pAdapter->temperature = priv->temperature;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007694 }
7695 }
Jeff Johnson0c5a2ba2017-01-23 16:36:43 -08007696
7697 /*
7698 * either we never sent a request, we sent a request and
7699 * received a response or we sent a request and timed out.
7700 * regardless we are done with the request.
7701 */
7702 hdd_request_put(request);
7703
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007704 *temperature = pAdapter->temperature;
7705 EXIT();
7706 return 0;
7707}
7708
7709/**
7710 * iw_setint_getnone() - Generic "set integer" private ioctl handler
7711 * @dev: device upon which the ioctl was received
7712 * @info: ioctl request information
7713 * @wrqu: ioctl request data
7714 * @extra: ioctl extra data
7715 *
7716 * Return: 0 on success, non-zero on error
7717 */
7718static int __iw_setint_getnone(struct net_device *dev,
7719 struct iw_request_info *info,
7720 union iwreq_data *wrqu, char *extra)
7721{
7722 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
7723 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
7724 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007725 hdd_context_t *hdd_ctx;
7726 tSmeConfigParams smeConfig;
7727 int *value = (int *)extra;
7728 int sub_cmd = value[0];
7729 int set_value = value[1];
7730 int ret;
7731 int enable_pbm, enable_mp;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307732 QDF_STATUS status;
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08007733 void *soc = NULL;
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08007734 struct cdp_pdev *pdev = NULL;
7735 struct cdp_vdev *vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007736
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08007737 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05307738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007739 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
7740 ret = wlan_hdd_validate_context(hdd_ctx);
7741 if (0 != ret)
7742 return ret;
7743
Jeff Johnson441e1f72017-02-07 08:50:49 -08007744 ret = hdd_check_private_wext_control(hdd_ctx, info);
7745 if (0 != ret)
7746 return ret;
7747
Jeff Johnson441e1f72017-02-07 08:50:49 -08007748 memset(&smeConfig, 0x00, sizeof(smeConfig));
7749
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007750 switch (sub_cmd) {
7751 case WE_SET_11D_STATE:
7752 {
7753 if ((ENABLE_11D == set_value)
7754 || (DISABLE_11D == set_value)) {
7755
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007756 sme_get_config_param(hHal, &smeConfig);
7757 smeConfig.csrConfig.Is11dSupportEnabled =
7758 (bool) set_value;
7759
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007760 hdd_debug("11D state=%d!!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007761 smeConfig.csrConfig.
7762 Is11dSupportEnabled);
7763
7764 sme_update_config(hHal, &smeConfig);
7765 } else {
7766 return -EINVAL;
7767 }
7768 break;
7769 }
7770
7771 case WE_WOWL:
7772 {
7773 switch (set_value) {
7774 case 0x00:
7775 hdd_exit_wowl(pAdapter);
7776 break;
7777 case 0x01:
7778 case 0x02:
7779 case 0x03:
7780 enable_mp = (set_value & 0x01) ? 1 : 0;
7781 enable_pbm = (set_value & 0x02) ? 1 : 0;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007782 hdd_debug("magic packet ? = %s pattern byte matching ? = %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007783 (enable_mp ? "YES" : "NO"),
7784 (enable_pbm ? "YES" : "NO"));
7785 hdd_enter_wowl(pAdapter, enable_mp, enable_pbm);
7786 break;
7787 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07007788 hdd_err("Invalid arg %d in WE_WOWL IOCTL",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007789 set_value);
7790 ret = -EINVAL;
7791 break;
7792 }
7793
7794 break;
7795 }
7796 case WE_SET_POWER:
7797 {
7798 switch (set_value) {
7799 case 1:
7800 /* Enable PowerSave */
7801 sme_ps_enable_disable(hHal, pAdapter->sessionId,
7802 SME_PS_ENABLE);
7803 break;
7804 case 2:
7805 /* Disable PowerSave */
7806 sme_ps_enable_disable(hHal, pAdapter->sessionId,
7807 SME_PS_DISABLE);
7808 break;
7809 case 3: /* Enable UASPD */
7810 sme_ps_uapsd_enable(hHal, pAdapter->sessionId);
7811 break;
7812 case 4: /* Disable UASPD */
7813 sme_ps_uapsd_disable(hHal, pAdapter->sessionId);
7814 break;
7815 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07007816 hdd_err("Invalid arg %d in WE_SET_POWER IOCTL",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007817 set_value);
7818 ret = -EINVAL;
7819 break;
7820 }
7821 break;
7822 }
7823
7824 case WE_SET_MAX_ASSOC:
7825 {
7826 if ((WNI_CFG_ASSOC_STA_LIMIT_STAMIN > set_value) ||
7827 (WNI_CFG_ASSOC_STA_LIMIT_STAMAX < set_value)) {
7828 ret = -EINVAL;
7829 } else if (sme_cfg_set_int(hHal, WNI_CFG_ASSOC_STA_LIMIT,
7830 set_value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307831 != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007832 hdd_err("WNI_CFG_ASSOC_STA_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007833 ret = -EIO;
7834 }
7835 break;
7836 }
7837
7838 case WE_SET_SAP_AUTO_CHANNEL_SELECTION:
7839 if (set_value == 0 || set_value == 1)
7840 (WLAN_HDD_GET_CTX(pAdapter))->config->force_sap_acs =
7841 set_value;
7842 else
7843 ret = -EINVAL;
7844 break;
7845
7846 case WE_SET_DATA_INACTIVITY_TO:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007847 if ((set_value < CFG_DATA_INACTIVITY_TIMEOUT_MIN) ||
7848 (set_value > CFG_DATA_INACTIVITY_TIMEOUT_MAX) ||
7849 (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
7850 WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307851 set_value) == QDF_STATUS_E_FAILURE)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007852 hdd_err("WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007853 ret = -EINVAL;
7854 }
7855 break;
Mukul Sharmaed92f2f2017-04-20 00:06:28 +05307856 case WE_SET_WOW_DATA_INACTIVITY_TO:
7857 if (!hHal)
7858 return -EINVAL;
7859
7860 if ((set_value < CFG_WOW_DATA_INACTIVITY_TIMEOUT_MIN) ||
7861 (set_value > CFG_WOW_DATA_INACTIVITY_TIMEOUT_MAX) ||
7862 (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
7863 WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT,
7864 set_value) == QDF_STATUS_E_FAILURE)) {
7865 hdd_err("WNI_CFG_PS_WOW_DATA_INACTIVITY_TIMEOUT fail");
7866 ret = -EINVAL;
7867 }
7868 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007869 case WE_SET_MC_RATE:
7870 {
7871 ret = wlan_hdd_set_mc_rate(pAdapter, set_value);
7872 break;
7873 }
7874 case WE_SET_TX_POWER:
7875 {
Anurag Chouhan6d760662016-02-20 16:05:43 +05307876 struct qdf_mac_addr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007877
Anurag Chouhanc5548422016-02-24 18:33:27 +05307878 qdf_copy_macaddr(&bssid, &pHddStaCtx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007879 if (sme_set_tx_power
7880 (hHal, pAdapter->sessionId, bssid,
7881 pAdapter->device_mode,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307882 set_value) != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007883 hdd_err("Setting tx power failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007884 return -EIO;
7885 }
7886 break;
7887 }
7888 case WE_SET_MAX_TX_POWER:
7889 {
Anurag Chouhan6d760662016-02-20 16:05:43 +05307890 struct qdf_mac_addr bssid;
7891 struct qdf_mac_addr selfMac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007892
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007893
7894 hdd_debug("Setting maximum tx power %d dBm",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007895 set_value);
Anurag Chouhanc5548422016-02-24 18:33:27 +05307896 qdf_copy_macaddr(&bssid, &pHddStaCtx->conn_info.bssId);
7897 qdf_copy_macaddr(&selfMac, &pHddStaCtx->conn_info.bssId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007898
7899 if (sme_set_max_tx_power(hHal, bssid, selfMac, set_value)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307900 != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007901 hdd_err("Setting maximum tx power failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007902 return -EIO;
7903 }
7904
7905 break;
7906 }
7907 case WE_SET_MAX_TX_POWER_2_4:
7908 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007909 hdd_debug("Setting maximum tx power %d dBm for 2.4 GHz band",
Jeff Johnson99bac312016-06-28 10:38:18 -07007910 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007911 if (sme_set_max_tx_power_per_band(eCSR_BAND_24, set_value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307912 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007913 hdd_err("Setting max tx power failed for 2.4 GHz band");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007914 return -EIO;
7915 }
7916
7917 break;
7918 }
7919 case WE_SET_MAX_TX_POWER_5_0:
7920 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007921 hdd_debug("Setting maximum tx power %d dBm for 5.0 GHz band",
Jeff Johnson99bac312016-06-28 10:38:18 -07007922 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007923 if (sme_set_max_tx_power_per_band(eCSR_BAND_5G, set_value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307924 QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07007925 hdd_err("Setting max tx power failed for 5.0 GHz band");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007926 return -EIO;
7927 }
7928
7929 break;
7930 }
7931 case WE_SET_HIGHER_DTIM_TRANSITION:
7932 {
7933 if (!((set_value == false) || (set_value == true))) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007934 hdd_err("Dynamic DTIM Incorrect data:%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007935 set_value);
7936 ret = -EINVAL;
7937 } else {
7938 if (pAdapter->higherDtimTransition != set_value) {
7939 pAdapter->higherDtimTransition =
7940 set_value;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007941 hdd_debug("higherDtimTransition set to :%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007942 pAdapter->higherDtimTransition);
7943 }
7944 }
7945
7946 break;
7947 }
7948
7949 case WE_SET_TM_LEVEL:
7950 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007951 hdd_debug("Set Thermal Mitigation Level %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007952 (void)sme_set_thermal_level(hHal, set_value);
7953 break;
7954 }
7955
7956 case WE_SET_PHYMODE:
7957 {
7958 hdd_context_t *phddctx = WLAN_HDD_GET_CTX(pAdapter);
7959
7960 ret =
7961 wlan_hdd_update_phymode(dev, hHal, set_value,
7962 phddctx);
7963 break;
7964 }
7965
7966 case WE_SET_NSS:
7967 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007968 hdd_debug("Set NSS = %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007969 if ((set_value > 2) || (set_value <= 0)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07007970 hdd_err("NSS greater than 2 not supported");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007971 ret = -EINVAL;
7972 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05307973 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007974 hdd_update_nss(WLAN_HDD_GET_CTX(pAdapter),
7975 set_value))
7976 ret = -EINVAL;
7977 }
7978 break;
7979 }
7980
7981 case WE_SET_GTX_HT_MCS:
7982 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007983 hdd_debug("WMI_VDEV_PARAM_GTX_HT_MCS %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007984 ret = wma_cli_set_command(pAdapter->sessionId,
7985 WMI_VDEV_PARAM_GTX_HT_MCS,
7986 set_value, GTX_CMD);
7987 break;
7988 }
7989
7990 case WE_SET_GTX_VHT_MCS:
7991 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08007992 hdd_debug("WMI_VDEV_PARAM_GTX_VHT_MCS %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08007993 set_value);
7994 ret = wma_cli_set_command(pAdapter->sessionId,
7995 WMI_VDEV_PARAM_GTX_VHT_MCS,
7996 set_value, GTX_CMD);
7997 break;
7998 }
7999
8000 case WE_SET_GTX_USRCFG:
8001 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008002 hdd_debug("WMI_VDEV_PARAM_GTX_USR_CFG %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008003 set_value);
8004 ret = wma_cli_set_command(pAdapter->sessionId,
8005 WMI_VDEV_PARAM_GTX_USR_CFG,
8006 set_value, GTX_CMD);
8007 break;
8008 }
8009
8010 case WE_SET_GTX_THRE:
8011 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008012 hdd_debug("WMI_VDEV_PARAM_GTX_THRE %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008013 ret = wma_cli_set_command(pAdapter->sessionId,
8014 WMI_VDEV_PARAM_GTX_THRE,
8015 set_value, GTX_CMD);
8016 break;
8017 }
8018
8019 case WE_SET_GTX_MARGIN:
8020 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008021 hdd_debug("WMI_VDEV_PARAM_GTX_MARGIN %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008022 ret = wma_cli_set_command(pAdapter->sessionId,
8023 WMI_VDEV_PARAM_GTX_MARGIN,
8024 set_value, GTX_CMD);
8025 break;
8026 }
8027
8028 case WE_SET_GTX_STEP:
8029 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008030 hdd_debug("WMI_VDEV_PARAM_GTX_STEP %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008031 ret = wma_cli_set_command(pAdapter->sessionId,
8032 WMI_VDEV_PARAM_GTX_STEP,
8033 set_value, GTX_CMD);
8034 break;
8035 }
8036
8037 case WE_SET_GTX_MINTPC:
8038 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008039 hdd_debug("WMI_VDEV_PARAM_GTX_MINTPC %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008040 ret = wma_cli_set_command(pAdapter->sessionId,
8041 WMI_VDEV_PARAM_GTX_MINTPC,
8042 set_value, GTX_CMD);
8043 break;
8044 }
8045
8046 case WE_SET_GTX_BWMASK:
8047 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008048 hdd_debug("WMI_VDEV_PARAM_GTX_BWMASK %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008049 ret = wma_cli_set_command(pAdapter->sessionId,
8050 WMI_VDEV_PARAM_GTX_BW_MASK,
8051 set_value, GTX_CMD);
8052 break;
8053 }
8054
8055 case WE_SET_LDPC:
8056 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308057 ret = hdd_set_ldpc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008058 break;
8059 }
8060
8061 case WE_SET_TX_STBC:
8062 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308063 ret = hdd_set_tx_stbc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008064 break;
8065 }
8066
8067 case WE_SET_RX_STBC:
8068 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05308069 ret = hdd_set_rx_stbc(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008070 break;
8071 }
8072
8073 case WE_SET_SHORT_GI:
8074 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008075 hdd_debug("WMI_VDEV_PARAM_SGI val %d", set_value);
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08008076 /*
8077 * wma_cli_set_command should be called instead of
8078 * sme_update_ht_config since SGI is used for HT/HE.
8079 * This should be refactored.
8080 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008081 ret = sme_update_ht_config(hHal, pAdapter->sessionId,
8082 WNI_CFG_HT_CAP_INFO_SHORT_GI_20MHZ,
8083 set_value);
8084 if (ret)
Jeff Johnson99bac312016-06-28 10:38:18 -07008085 hdd_err("Failed to set ShortGI value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008086 break;
8087 }
8088
8089 case WE_SET_RTSCTS:
8090 {
8091 uint32_t value;
8092
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008093 hdd_debug("WMI_VDEV_PARAM_ENABLE_RTSCTS val 0x%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008094 set_value);
8095
8096 if ((set_value & HDD_RTSCTS_EN_MASK) ==
8097 HDD_RTSCTS_ENABLE)
8098 value =
8099 (WLAN_HDD_GET_CTX(pAdapter))->config->
8100 RTSThreshold;
8101 else if (((set_value & HDD_RTSCTS_EN_MASK) == 0)
8102 || ((set_value & HDD_RTSCTS_EN_MASK) ==
8103 HDD_CTS_ENABLE))
8104 value = WNI_CFG_RTS_THRESHOLD_STAMAX;
8105 else
8106 return -EIO;
8107
8108 ret = wma_cli_set_command(pAdapter->sessionId,
8109 WMI_VDEV_PARAM_ENABLE_RTSCTS,
8110 set_value, VDEV_CMD);
8111 if (!ret) {
8112 if (sme_cfg_set_int
8113 (hHal, WNI_CFG_RTS_THRESHOLD, value) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308114 QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008115 hdd_err("FAILED TO SET RTSCTS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008116 return -EIO;
8117 }
8118 }
8119
8120 break;
8121 }
8122
8123 case WE_SET_CHWIDTH:
8124 {
8125 bool chwidth = false;
8126 hdd_context_t *phddctx = WLAN_HDD_GET_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008127
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008128 /*updating channel bonding only on 5Ghz */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008129 hdd_debug("WMI_VDEV_PARAM_CHWIDTH val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008130 set_value);
8131 if (set_value > eHT_CHANNEL_WIDTH_80MHZ) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008132 hdd_err("Invalid channel width 0->20 1->40 2->80");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008133 return -EINVAL;
8134 }
8135
8136 if ((WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
8137 csr_convert_cb_ini_value_to_phy_cb_state(phddctx->config->
8138 nChannelBondingMode5GHz)))
8139 chwidth = true;
8140
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008141 sme_get_config_param(hHal, &smeConfig);
8142 switch (set_value) {
8143 case eHT_CHANNEL_WIDTH_20MHZ:
8144 smeConfig.csrConfig.channelBondingMode5GHz =
8145 WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
8146 break;
8147 case eHT_CHANNEL_WIDTH_40MHZ:
8148 if (chwidth)
8149 smeConfig.csrConfig.
8150 channelBondingMode5GHz =
8151 phddctx->config->
8152 nChannelBondingMode5GHz;
8153 else
8154 return -EINVAL;
8155
8156 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008157 case eHT_CHANNEL_WIDTH_80MHZ:
8158 if (chwidth)
8159 smeConfig.csrConfig.
8160 channelBondingMode5GHz =
8161 phddctx->config->
8162 nChannelBondingMode5GHz;
8163 else
8164 return -EINVAL;
8165
8166 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008167
8168 default:
8169 return -EINVAL;
8170 }
8171
8172 ret = wma_cli_set_command(pAdapter->sessionId,
8173 WMI_VDEV_PARAM_CHWIDTH,
8174 set_value, VDEV_CMD);
8175 if (!ret)
8176 sme_update_config(hHal, &smeConfig);
8177
8178 break;
8179 }
8180
8181 case WE_SET_ANI_EN_DIS:
8182 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008183 hdd_debug("WMI_PDEV_PARAM_ANI_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008184 set_value);
8185 ret = wma_cli_set_command(pAdapter->sessionId,
8186 WMI_PDEV_PARAM_ANI_ENABLE,
8187 set_value, PDEV_CMD);
8188 break;
8189 }
8190
8191 case WE_SET_ANI_POLL_PERIOD:
8192 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008193 hdd_debug("WMI_PDEV_PARAM_ANI_POLL_PERIOD val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008194 set_value);
8195 ret = wma_cli_set_command(pAdapter->sessionId,
8196 WMI_PDEV_PARAM_ANI_POLL_PERIOD,
8197 set_value, PDEV_CMD);
8198 break;
8199 }
8200
8201 case WE_SET_ANI_LISTEN_PERIOD:
8202 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008203 hdd_debug("WMI_PDEV_PARAM_ANI_LISTEN_PERIOD val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008204 set_value);
8205 ret = wma_cli_set_command(pAdapter->sessionId,
8206 WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
8207 set_value, PDEV_CMD);
8208 break;
8209 }
8210
8211 case WE_SET_ANI_OFDM_LEVEL:
8212 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008213 hdd_debug("WMI_PDEV_PARAM_ANI_OFDM_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008214 set_value);
8215 ret = wma_cli_set_command(pAdapter->sessionId,
8216 WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
8217 set_value, PDEV_CMD);
8218 break;
8219 }
8220
8221 case WE_SET_ANI_CCK_LEVEL:
8222 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008223 hdd_debug("WMI_PDEV_PARAM_ANI_CCK_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008224 set_value);
8225 ret = wma_cli_set_command(pAdapter->sessionId,
8226 WMI_PDEV_PARAM_ANI_CCK_LEVEL,
8227 set_value, PDEV_CMD);
8228 break;
8229 }
8230
8231 case WE_SET_DYNAMIC_BW:
8232 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008233 hdd_debug("WMI_PDEV_PARAM_DYNAMIC_BW val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008234 set_value);
8235 ret = wma_cli_set_command(pAdapter->sessionId,
8236 WMI_PDEV_PARAM_DYNAMIC_BW,
8237 set_value, PDEV_CMD);
8238 break;
8239 }
8240
8241 case WE_SET_CTS_CBW:
8242 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008243 hdd_debug("WE_SET_CTS_CBW val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008244 ret = wma_cli_set_command(pAdapter->sessionId,
8245 WMI_PDEV_PARAM_CTS_CBW,
8246 set_value, PDEV_CMD);
8247 break;
8248 }
8249
8250 case WE_SET_11N_RATE:
8251 {
8252 uint8_t preamble = 0, nss = 0, rix = 0;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008253
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008254 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008255 set_value);
8256
8257 if (set_value != 0xff) {
8258 rix = RC_2_RATE_IDX(set_value);
8259 if (set_value & 0x80) {
8260 preamble = WMI_RATE_PREAMBLE_HT;
8261 nss = HT_RC_2_STREAMS(set_value) - 1;
8262 } else {
8263 nss = 0;
8264 rix = RC_2_RATE_IDX(set_value);
8265 if (set_value & 0x10) {
8266 preamble =
8267 WMI_RATE_PREAMBLE_CCK;
8268 if (rix != 0x3)
8269 /* Enable Short
8270 * preamble always for
8271 * CCK except 1mbps
8272 */
8273 rix |= 0x4;
8274 } else {
8275 preamble =
8276 WMI_RATE_PREAMBLE_OFDM;
8277 }
8278 }
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008279 set_value = hdd_assemble_rate_code(preamble, nss, rix);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008280 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008281 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008282 set_value, rix, preamble, nss);
8283
8284 ret = wma_cli_set_command(pAdapter->sessionId,
8285 WMI_VDEV_PARAM_FIXED_RATE,
8286 set_value, VDEV_CMD);
8287 break;
8288 }
8289
8290 case WE_SET_VHT_RATE:
8291 {
8292 uint8_t preamble = 0, nss = 0, rix = 0;
8293
8294 if (set_value != 0xff) {
8295 rix = RC_2_RATE_IDX_11AC(set_value);
8296 preamble = WMI_RATE_PREAMBLE_VHT;
8297 nss = HT_RC_2_STREAMS_11AC(set_value) - 1;
8298
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008299 set_value = hdd_assemble_rate_code(preamble, nss, rix);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008300 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008301 hdd_debug("WMI_VDEV_PARAM_FIXED_RATE val %d rix %d preamble %x nss %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008302 set_value, rix, preamble, nss);
8303 ret = wma_cli_set_command(pAdapter->sessionId,
8304 WMI_VDEV_PARAM_FIXED_RATE,
8305 set_value, VDEV_CMD);
8306 break;
8307 }
8308
8309 case WE_SET_AMPDU:
8310 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008311 hdd_debug("SET AMPDU val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008312 ret = wma_cli_set_command(pAdapter->sessionId,
8313 GEN_VDEV_PARAM_AMPDU,
8314 set_value, GEN_CMD);
8315 break;
8316 }
8317
8318 case WE_SET_AMSDU:
8319 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008320 hdd_debug("SET AMSDU val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008321 ret = wma_cli_set_command(pAdapter->sessionId,
8322 GEN_VDEV_PARAM_AMSDU,
8323 set_value, GEN_CMD);
Deepak Dhamdhere612392c2016-08-28 02:56:51 -07008324 /* Update the stored ini value */
8325 if (!ret)
8326 hdd_ctx->config->max_amsdu_num = set_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008327 break;
8328 }
8329
8330 case WE_SET_BURST_ENABLE:
8331 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008332 hdd_debug("SET Burst enable val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008333 if ((set_value == 0) || (set_value == 1)) {
8334 ret = wma_cli_set_command(pAdapter->sessionId,
8335 WMI_PDEV_PARAM_BURST_ENABLE,
8336 set_value, PDEV_CMD);
8337 } else
8338 ret = -EINVAL;
8339 break;
8340 }
8341 case WE_SET_BURST_DUR:
8342 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008343 hdd_debug("SET Burst duration val %d", set_value);
Jeff Johnsonda5ee772016-08-04 17:18:47 -07008344 if ((set_value > 0) && (set_value <= 102400))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008345 ret = wma_cli_set_command(pAdapter->sessionId,
8346 WMI_PDEV_PARAM_BURST_DUR,
8347 set_value, PDEV_CMD);
8348 else
8349 ret = -EINVAL;
8350 break;
8351 }
8352
8353 case WE_SET_TX_CHAINMASK:
8354 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008355 hdd_debug("WMI_PDEV_PARAM_TX_CHAIN_MASK val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008356 set_value);
8357 ret = wma_cli_set_command(pAdapter->sessionId,
8358 WMI_PDEV_PARAM_TX_CHAIN_MASK,
8359 set_value, PDEV_CMD);
8360 break;
8361 }
8362
8363 case WE_SET_RX_CHAINMASK:
8364 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008365 hdd_debug("WMI_PDEV_PARAM_RX_CHAIN_MASK val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008366 set_value);
8367 ret = wma_cli_set_command(pAdapter->sessionId,
8368 WMI_PDEV_PARAM_RX_CHAIN_MASK,
8369 set_value, PDEV_CMD);
8370 break;
8371 }
8372
8373 case WE_SET_TXPOW_2G:
8374 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008375 hdd_debug("WMI_PDEV_PARAM_TXPOWER_LIMIT2G val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008376 set_value);
8377 ret = wma_cli_set_command(pAdapter->sessionId,
8378 WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
8379 set_value, PDEV_CMD);
8380 break;
8381 }
8382
8383 case WE_SET_TXPOW_5G:
8384 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008385 hdd_debug("WMI_PDEV_PARAM_TXPOWER_LIMIT5G val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008386 set_value);
8387 ret = wma_cli_set_command(pAdapter->sessionId,
8388 WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
8389 set_value, PDEV_CMD);
8390 break;
8391 }
8392
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008393 /* Firmware debug log */
8394 case WE_DBGLOG_LOG_LEVEL:
8395 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008396 hdd_debug("WE_DBGLOG_LOG_LEVEL val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008397 hdd_ctx->fw_log_settings.dl_loglevel = set_value;
8398 ret = wma_cli_set_command(pAdapter->sessionId,
8399 WMI_DBGLOG_LOG_LEVEL,
8400 set_value, DBG_CMD);
8401 break;
8402 }
8403
8404 case WE_DBGLOG_VAP_ENABLE:
8405 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008406 hdd_debug("WE_DBGLOG_VAP_ENABLE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008407 ret = wma_cli_set_command(pAdapter->sessionId,
8408 WMI_DBGLOG_VAP_ENABLE,
8409 set_value, DBG_CMD);
8410 break;
8411 }
8412
8413 case WE_DBGLOG_VAP_DISABLE:
8414 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008415 hdd_debug("WE_DBGLOG_VAP_DISABLE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008416 ret = wma_cli_set_command(pAdapter->sessionId,
8417 WMI_DBGLOG_VAP_DISABLE,
8418 set_value, DBG_CMD);
8419 break;
8420 }
8421
8422 case WE_DBGLOG_MODULE_ENABLE:
8423 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008424 hdd_debug("WE_DBGLOG_MODULE_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008425 set_value);
8426 hdd_ctx->fw_log_settings.enable = set_value;
8427 ret = wma_cli_set_command(pAdapter->sessionId,
8428 WMI_DBGLOG_MODULE_ENABLE,
8429 set_value, DBG_CMD);
8430 break;
8431 }
8432
8433 case WE_DBGLOG_MODULE_DISABLE:
8434 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008435 hdd_debug("WE_DBGLOG_MODULE_DISABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008436 set_value);
8437 hdd_ctx->fw_log_settings.enable = set_value;
8438 ret = wma_cli_set_command(pAdapter->sessionId,
8439 WMI_DBGLOG_MODULE_DISABLE,
8440 set_value, DBG_CMD);
8441 break;
8442 }
8443 case WE_DBGLOG_MOD_LOG_LEVEL:
8444 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008445 hdd_debug("WE_DBGLOG_MOD_LOG_LEVEL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008446 set_value);
8447
8448 if (hdd_ctx->fw_log_settings.index >= MAX_MOD_LOGLEVEL)
8449 hdd_ctx->fw_log_settings.index = 0;
8450
8451 hdd_ctx->fw_log_settings.
8452 dl_mod_loglevel[hdd_ctx->fw_log_settings.index] =
8453 set_value;
8454 hdd_ctx->fw_log_settings.index++;
8455
8456 ret = wma_cli_set_command(pAdapter->sessionId,
8457 WMI_DBGLOG_MOD_LOG_LEVEL,
8458 set_value, DBG_CMD);
8459 break;
8460 }
8461
8462 case WE_DBGLOG_TYPE:
8463 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008464 hdd_debug("WE_DBGLOG_TYPE val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008465 hdd_ctx->fw_log_settings.dl_type = set_value;
8466 ret = wma_cli_set_command(pAdapter->sessionId,
8467 WMI_DBGLOG_TYPE,
8468 set_value, DBG_CMD);
8469 break;
8470 }
8471 case WE_DBGLOG_REPORT_ENABLE:
8472 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008473 hdd_debug("WE_DBGLOG_REPORT_ENABLE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008474 set_value);
8475 hdd_ctx->fw_log_settings.dl_report = set_value;
8476 ret = wma_cli_set_command(pAdapter->sessionId,
8477 WMI_DBGLOG_REPORT_ENABLE,
8478 set_value, DBG_CMD);
8479 break;
8480 }
8481
8482 case WE_SET_TXRX_FWSTATS:
8483 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008484 hdd_debug("WE_SET_TXRX_FWSTATS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008485 ret = wma_cli_set_command(pAdapter->sessionId,
8486 WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID,
8487 set_value, VDEV_CMD);
8488 break;
8489 }
8490
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008491 case WE_SET_TXRX_STATS:
8492 {
8493 hdd_notice("WE_SET_TXRX_STATS val %d", set_value);
8494 ret = cds_get_datapath_handles(&soc, &pdev, &vdev,
8495 pAdapter->sessionId);
8496
Venkata Sharath Chandra Manchalabcdfdb12017-03-29 19:25:45 -07008497 if (ret != 0) {
8498 QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR,
8499 "Invalid handles");
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008500 break;
Venkata Sharath Chandra Manchalabcdfdb12017-03-29 19:25:45 -07008501 }
8502 ret = cdp_txrx_stats(soc, vdev, set_value);
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -08008503 break;
8504 }
8505
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008506 case WE_TXRX_FWSTATS_RESET:
8507 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008508 hdd_debug("WE_TXRX_FWSTATS_RESET val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008509 ret = wma_cli_set_command(pAdapter->sessionId,
8510 WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
8511 set_value, VDEV_CMD);
8512 break;
8513 }
8514
8515 case WE_DUMP_STATS:
8516 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008517 hdd_debug("WE_DUMP_STATS val %d", set_value);
Mohit Khanna3e2115b2016-10-11 13:18:29 -07008518 ret = hdd_wlan_dump_stats(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008519 break;
8520 }
8521
8522 case WE_CLEAR_STATS:
8523 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008524 hdd_debug("WE_CLEAR_STATS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008525 switch (set_value) {
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008526 case CDP_HDD_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008527 memset(&pAdapter->stats, 0, sizeof(pAdapter->stats));
8528 memset(&pAdapter->hdd_stats, 0,
8529 sizeof(pAdapter->hdd_stats));
8530 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008531 case CDP_TXRX_HIST_STATS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008532 wlan_hdd_clear_tx_rx_histogram(hdd_ctx);
8533 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008534 case CDP_HDD_NETIF_OPER_HISTORY:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008535 wlan_hdd_clear_netif_queue_history(hdd_ctx);
8536 break;
Venkata Sharath Chandra Manchala71032b62017-03-29 12:30:45 -07008537 case CDP_HIF_STATS:
Nirav Shahbf1b0332016-05-25 14:27:39 +05308538 hdd_clear_hif_stats();
8539 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008540 default:
Leo Changfdb45c32016-10-28 11:09:23 -07008541 cdp_clear_stats(cds_get_context(QDF_MODULE_ID_SOC),
8542 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008543 }
8544 break;
8545 }
8546
8547 case WE_PPS_PAID_MATCH:
8548 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008549 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008550 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008551
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008552 hdd_debug("WMI_VDEV_PPS_PAID_MATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008553 set_value);
8554 ret = wma_cli_set_command(pAdapter->sessionId,
8555 WMI_VDEV_PPS_PAID_MATCH,
8556 set_value, PPS_CMD);
8557 break;
8558 }
8559
8560 case WE_PPS_GID_MATCH:
8561 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008562 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008563 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008564 hdd_debug("WMI_VDEV_PPS_GID_MATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008565 set_value);
8566 ret = wma_cli_set_command(pAdapter->sessionId,
8567 WMI_VDEV_PPS_GID_MATCH,
8568 set_value, PPS_CMD);
8569 break;
8570 }
8571
8572 case WE_PPS_EARLY_TIM_CLEAR:
8573 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008574 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008575 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008576 hdd_debug(" WMI_VDEV_PPS_EARLY_TIM_CLEAR val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008577 set_value);
8578 ret = wma_cli_set_command(pAdapter->sessionId,
8579 WMI_VDEV_PPS_EARLY_TIM_CLEAR,
8580 set_value, PPS_CMD);
8581 break;
8582 }
8583
8584 case WE_PPS_EARLY_DTIM_CLEAR:
8585 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008586 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008587 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008588 hdd_debug("WMI_VDEV_PPS_EARLY_DTIM_CLEAR val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008589 set_value);
8590 ret = wma_cli_set_command(pAdapter->sessionId,
8591 WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
8592 set_value, PPS_CMD);
8593 break;
8594 }
8595
8596 case WE_PPS_EOF_PAD_DELIM:
8597 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008598 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008599 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008600 hdd_debug("WMI_VDEV_PPS_EOF_PAD_DELIM val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008601 set_value);
8602 ret = wma_cli_set_command(pAdapter->sessionId,
8603 WMI_VDEV_PPS_EOF_PAD_DELIM,
8604 set_value, PPS_CMD);
8605 break;
8606 }
8607
8608 case WE_PPS_MACADDR_MISMATCH:
8609 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008610 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008611 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008612 hdd_debug("WMI_VDEV_PPS_MACADDR_MISMATCH val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008613 set_value);
8614 ret = wma_cli_set_command(pAdapter->sessionId,
8615 WMI_VDEV_PPS_MACADDR_MISMATCH,
8616 set_value, PPS_CMD);
8617 break;
8618 }
8619
8620 case WE_PPS_DELIM_CRC_FAIL:
8621 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008622 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008623 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008624 hdd_debug("WMI_VDEV_PPS_DELIM_CRC_FAIL val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008625 set_value);
8626 ret = wma_cli_set_command(pAdapter->sessionId,
8627 WMI_VDEV_PPS_DELIM_CRC_FAIL,
8628 set_value, PPS_CMD);
8629 break;
8630 }
8631
8632 case WE_PPS_GID_NSTS_ZERO:
8633 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008634 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008635 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008636 hdd_debug("WMI_VDEV_PPS_GID_NSTS_ZERO val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008637 set_value);
8638 ret = wma_cli_set_command(pAdapter->sessionId,
8639 WMI_VDEV_PPS_GID_NSTS_ZERO,
8640 set_value, PPS_CMD);
8641 break;
8642 }
8643
8644 case WE_PPS_RSSI_CHECK:
8645 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008646 if (pAdapter->device_mode != QDF_STA_MODE)
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07008647 return -EINVAL;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008648 hdd_debug("WMI_VDEV_PPS_RSSI_CHECK val %d ",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008649 set_value);
8650 ret = wma_cli_set_command(pAdapter->sessionId,
8651 WMI_VDEV_PPS_RSSI_CHECK,
8652 set_value, PPS_CMD);
8653 break;
8654 }
8655
8656 case WE_PPS_5G_EBT:
8657 {
Krunal Sonif07bb382016-03-10 13:02:11 -08008658 if (pAdapter->device_mode != QDF_STA_MODE)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008659 return -EINVAL;
8660
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008661 hdd_debug("WMI_VDEV_PPS_5G_EBT val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008662 ret = wma_cli_set_command(pAdapter->sessionId,
8663 WMI_VDEV_PPS_5G_EBT,
8664 set_value, PPS_CMD);
8665 break;
8666 }
8667
8668 case WE_SET_HTSMPS:
8669 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008670 hdd_debug("WE_SET_HTSMPS val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008671 ret = wma_cli_set_command(pAdapter->sessionId,
8672 WMI_STA_SMPS_FORCE_MODE_CMDID,
8673 set_value, VDEV_CMD);
8674 break;
8675 }
8676
8677 case WE_SET_QPOWER_MAX_PSPOLL_COUNT:
8678 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008679 hdd_debug("WE_SET_QPOWER_MAX_PSPOLL_COUNT val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008680 set_value);
8681 ret = wma_cli_set_command(pAdapter->sessionId,
8682 WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
8683 set_value, QPOWER_CMD);
8684 break;
8685 }
8686
8687 case WE_SET_QPOWER_MAX_TX_BEFORE_WAKE:
8688 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008689 hdd_debug("WE_SET_QPOWER_MAX_TX_BEFORE_WAKE val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008690 set_value);
8691 ret = wma_cli_set_command(
8692 pAdapter->sessionId,
8693 WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
8694 set_value, QPOWER_CMD);
8695 break;
8696 }
8697
8698 case WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
8699 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008700 hdd_debug("WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008701 set_value);
8702 ret = wma_cli_set_command(
8703 pAdapter->sessionId,
8704 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
8705 set_value, QPOWER_CMD);
8706 break;
8707 }
8708
8709 case WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
8710 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008711 hdd_debug("WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008712 set_value);
8713 ret = wma_cli_set_command(
8714 pAdapter->sessionId,
8715 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
8716 set_value, QPOWER_CMD);
8717 break;
8718 }
8719
8720 case WE_MCC_CONFIG_LATENCY:
8721 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08008722 wlan_hdd_set_mcc_latency(pAdapter, set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008723 break;
8724 }
8725
8726 case WE_MCC_CONFIG_QUOTA:
8727 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008728 hdd_debug("iwpriv cmd to set MCC quota with val %dms",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008729 set_value);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08008730 ret = wlan_hdd_set_mcc_p2p_quota(pAdapter,
8731 set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008732 break;
8733 }
8734 case WE_SET_DEBUG_LOG:
8735 {
8736 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Nirav Shah1da77682016-05-03 20:16:39 +05308737
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008738 hdd_ctx->config->gEnableDebugLog = set_value;
8739 sme_update_connect_debug(hdd_ctx->hHal, set_value);
8740 break;
8741 }
8742 case WE_SET_EARLY_RX_ADJUST_ENABLE:
8743 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008744 hdd_debug("SET early_rx enable val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008745 if ((set_value == 0) || (set_value == 1))
8746 ret = wma_cli_set_command(
8747 pAdapter->sessionId,
8748 WMI_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE,
8749 set_value, VDEV_CMD);
8750 else
8751 ret = -EINVAL;
8752 break;
8753 }
8754 case WE_SET_EARLY_RX_TGT_BMISS_NUM:
8755 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008756 hdd_debug("SET early_rx bmiss val %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008757 ret = wma_cli_set_command(pAdapter->sessionId,
8758 WMI_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM,
8759 set_value, VDEV_CMD);
8760 break;
8761 }
8762 case WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE:
8763 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008764 hdd_debug("SET early_rx bmiss sample cycle %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008765 set_value);
8766 ret = wma_cli_set_command(
8767 pAdapter->sessionId,
8768 WMI_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE,
8769 set_value, VDEV_CMD);
8770 break;
8771 }
8772 case WE_SET_EARLY_RX_SLOP_STEP:
8773 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008774 hdd_debug("SET early_rx bmiss slop step val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008775 set_value);
8776 ret = wma_cli_set_command(pAdapter->sessionId,
8777 WMI_VDEV_PARAM_EARLY_RX_SLOP_STEP,
8778 set_value, VDEV_CMD);
8779 break;
8780 }
8781 case WE_SET_EARLY_RX_INIT_SLOP:
8782 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008783 hdd_debug("SET early_rx init slop step val %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008784 set_value);
8785 ret = wma_cli_set_command(pAdapter->sessionId,
8786 WMI_VDEV_PARAM_EARLY_RX_INIT_SLOP,
8787 set_value, VDEV_CMD);
8788 break;
8789 }
8790 case WE_SET_EARLY_RX_ADJUST_PAUSE:
8791 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008792 hdd_debug("SET early_rx adjust pause %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008793 if ((set_value == 0) || (set_value == 1))
8794 ret = wma_cli_set_command(
8795 pAdapter->sessionId,
8796 WMI_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE,
8797 set_value, VDEV_CMD);
8798 else
8799 ret = -EINVAL;
8800 break;
8801 }
8802 case WE_SET_EARLY_RX_DRIFT_SAMPLE:
8803 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008804 hdd_debug("SET early_rx drift sample %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008805 ret = wma_cli_set_command(pAdapter->sessionId,
8806 WMI_VDEV_PARAM_EARLY_RX_DRIFT_SAMPLE,
8807 set_value, VDEV_CMD);
8808 break;
8809 }
8810 case WE_SET_SCAN_DISABLE:
8811 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008812 hdd_debug("SET SCAN DISABLE %d", set_value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008813 sme_set_scan_disable(WLAN_HDD_GET_HAL_CTX(pAdapter), set_value);
8814 break;
8815 }
Govind Singha471e5e2015-10-12 17:11:14 +05308816 case WE_START_FW_PROFILE:
8817 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008818 hdd_debug("WE_START_FW_PROFILE %d", set_value);
Govind Singha471e5e2015-10-12 17:11:14 +05308819 ret = wma_cli_set_command(pAdapter->sessionId,
8820 WMI_WLAN_PROFILE_TRIGGER_CMDID,
8821 set_value, DBG_CMD);
8822 break;
8823 }
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308824 case WE_SET_CHANNEL:
8825 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008826 hdd_debug("Set Channel %d Session ID %d mode %d", set_value,
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308827 pAdapter->sessionId, pAdapter->device_mode);
8828
Krunal Sonif07bb382016-03-10 13:02:11 -08008829 if ((QDF_STA_MODE == pAdapter->device_mode) ||
8830 (QDF_P2P_CLIENT_MODE == pAdapter->device_mode)) {
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308831
8832 status = sme_ext_change_channel(hHal,
8833 set_value, pAdapter->sessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308834 if (status != QDF_STATUS_SUCCESS) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008835 hdd_err("Error in change channel status %d",
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308836 status);
8837 ret = -EINVAL;
8838 }
8839 } else {
Jeff Johnson99bac312016-06-28 10:38:18 -07008840 hdd_err("change channel not supported for device mode %d",
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308841 pAdapter->device_mode);
8842 ret = -EINVAL;
8843 }
8844 break;
8845 }
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308846 case WE_SET_CONC_SYSTEM_PREF:
8847 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008848 hdd_debug("New preference: %d", set_value);
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308849 if (!((set_value >= CFG_CONC_SYSTEM_PREF_MIN) &&
8850 (set_value <= CFG_CONC_SYSTEM_PREF_MAX))) {
8851 hdd_err("Invalid system preference %d", set_value);
8852 return -EINVAL;
8853 }
Abhishek Singh1bdb1572015-10-16 16:24:19 +05308854
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +05308855 /* hdd_ctx, hdd_ctx->config are already checked for null */
8856 hdd_ctx->config->conc_system_pref = set_value;
8857 break;
8858 }
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -08008859 case WE_SET_11AX_RATE:
8860 ret = hdd_set_11ax_rate(pAdapter, set_value, NULL);
8861 break;
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07008862 case WE_SET_DCM:
8863 hdd_notice("Set WMI_VDEV_PARAM_HE_DCM: %d", set_value);
8864 ret = wma_cli_set_command(pAdapter->sessionId,
8865 WMI_VDEV_PARAM_HE_DCM, set_value,
8866 VDEV_CMD);
8867 break;
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07008868 case WE_SET_RANGE_EXT:
8869 hdd_notice("Set WMI_VDEV_PARAM_HE_RANGE_EXT: %d", set_value);
8870 ret = wma_cli_set_command(pAdapter->sessionId,
8871 WMI_VDEV_PARAM_HE_RANGE_EXT,
8872 set_value, VDEV_CMD);
8873 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008874 default:
8875 {
Jeff Johnson99bac312016-06-28 10:38:18 -07008876 hdd_err("Invalid sub command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008877 sub_cmd);
8878 ret = -EINVAL;
8879 break;
8880 }
8881 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05308882 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008883 return ret;
8884}
8885
8886static int iw_setint_getnone(struct net_device *dev,
8887 struct iw_request_info *info,
8888 union iwreq_data *wrqu,
8889 char *extra)
8890{
8891 int ret;
8892
8893 cds_ssr_protect(__func__);
8894 ret = __iw_setint_getnone(dev, info, wrqu, extra);
8895 cds_ssr_unprotect(__func__);
8896
8897 return ret;
8898}
8899
8900/**
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07008901 * __iw_setnone_get_threeint() - return three value to up layer.
8902 *
8903 * @dev: pointer of net_device of this wireless card
8904 * @info: meta data about Request sent
8905 * @wrqu: include request info
8906 * @extra: buf used for in/Output
8907 *
8908 * Return: execute result
8909 */
8910static int __iw_setnone_get_threeint(struct net_device *dev,
8911 struct iw_request_info *info,
8912 union iwreq_data *wrqu, char *extra)
8913{
8914 int ret = 0; /* success */
8915 uint32_t *value = (int *)extra;
8916 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
8917 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
8918
8919 ENTER_DEV(dev);
8920 ret = wlan_hdd_validate_context(hdd_ctx);
8921 if (0 != ret)
8922 return ret;
8923
Jeff Johnson441e1f72017-02-07 08:50:49 -08008924 ret = hdd_check_private_wext_control(hdd_ctx, info);
8925 if (0 != ret)
8926 return ret;
8927
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08008928 hdd_debug("param = %d", value[0]);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07008929 switch (value[0]) {
8930 case WE_GET_TSF:
8931 ret = hdd_indicate_tsf(adapter, value, 3);
8932 break;
8933 default:
8934 hdd_err("Invalid IOCTL get_value command %d", value[0]);
8935 break;
8936 }
8937 return ret;
8938}
8939
8940/**
8941 * iw_setnone_get_threeint() - return three value to up layer.
8942 *
8943 * @dev: pointer of net_device of this wireless card
8944 * @info: meta data about Request sent
8945 * @wrqu: include request info
8946 * @extra: buf used for in/Output
8947 *
8948 * Return: execute result
8949 */
8950static int iw_setnone_get_threeint(struct net_device *dev,
8951 struct iw_request_info *info,
8952 union iwreq_data *wrqu, char *extra)
8953{
8954 int ret;
8955
8956 cds_ssr_protect(__func__);
8957 ret = __iw_setnone_get_threeint(dev, info, wrqu, extra);
8958 cds_ssr_unprotect(__func__);
8959
8960 return ret;
8961}
8962
8963/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008964 * iw_setchar_getnone() - Generic "set string" private ioctl handler
8965 * @dev: device upon which the ioctl was received
8966 * @info: ioctl request information
8967 * @wrqu: ioctl request data
8968 * @extra: ioctl extra data
8969 *
8970 * Return: 0 on success, non-zero on error
8971 */
8972static int __iw_setchar_getnone(struct net_device *dev,
8973 struct iw_request_info *info,
8974 union iwreq_data *wrqu, char *extra)
8975{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05308976 QDF_STATUS vstatus;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008977 int sub_cmd;
8978 int ret;
8979 char *pBuffer = NULL;
8980 hdd_adapter_t *pAdapter = (netdev_priv(dev));
8981 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008982 struct hdd_config *pConfig = hdd_ctx->config;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008983 struct iw_point s_priv_data;
8984
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08008985 ENTER_DEV(dev);
8986
Mukul Sharma34777c62015-11-02 20:22:30 +05308987 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07008988 hdd_err("permission check failed");
Mukul Sharma34777c62015-11-02 20:22:30 +05308989 return -EPERM;
8990 }
8991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08008992 ret = wlan_hdd_validate_context(hdd_ctx);
8993 if (0 != ret)
8994 return ret;
8995
Jeff Johnson441e1f72017-02-07 08:50:49 -08008996 ret = hdd_check_private_wext_control(hdd_ctx, info);
8997 if (0 != ret)
8998 return ret;
8999
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009000 /* helper function to get iwreq_data with compat handling. */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009001 if (hdd_priv_get_data(&s_priv_data, wrqu))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009002 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009003
9004 /* make sure all params are correctly passed to function */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009005 if ((NULL == s_priv_data.pointer) || (0 == s_priv_data.length))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009006 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009007
9008 sub_cmd = s_priv_data.flags;
9009
9010 /* ODD number is used for set, copy data using copy_from_user */
9011 pBuffer = mem_alloc_copy_from_user_helper(s_priv_data.pointer,
9012 s_priv_data.length);
9013 if (NULL == pBuffer) {
Jeff Johnson99bac312016-06-28 10:38:18 -07009014 hdd_err("mem_alloc_copy_from_user_helper fail");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009015 return -ENOMEM;
9016 }
9017
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009018 hdd_debug("Received length: %d data: %s",
9019 s_priv_data.length, pBuffer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009020
9021 switch (sub_cmd) {
9022 case WE_WOWL_ADD_PTRN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009023 hdd_debug("ADD_PTRN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009024 hdd_add_wowl_ptrn(pAdapter, pBuffer);
9025 break;
9026 case WE_WOWL_DEL_PTRN:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009027 hdd_debug("DEL_PTRN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009028 hdd_del_wowl_ptrn(pAdapter, pBuffer);
9029 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009030 case WE_NEIGHBOR_REPORT_REQUEST:
9031 {
9032 tRrmNeighborReq neighborReq;
9033 tRrmNeighborRspCallbackInfo callbackInfo;
9034
9035 if (pConfig->fRrmEnable) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009036 hdd_debug("Neighbor Request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009037 neighborReq.no_ssid =
9038 (s_priv_data.length - 1) ? false : true;
9039 if (!neighborReq.no_ssid) {
9040 neighborReq.ssid.length =
9041 (s_priv_data.length - 1) >
9042 32 ? 32 : (s_priv_data.length - 1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05309043 qdf_mem_copy(neighborReq.ssid.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009044 pBuffer,
9045 neighborReq.ssid.length);
9046 }
9047
9048 callbackInfo.neighborRspCallback = NULL;
9049 callbackInfo.neighborRspCallbackContext = NULL;
9050 callbackInfo.timeout = 5000; /* 5 seconds */
9051 sme_neighbor_report_request(WLAN_HDD_GET_HAL_CTX
9052 (pAdapter),
9053 pAdapter->sessionId,
9054 &neighborReq,
9055 &callbackInfo);
9056 } else {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009057 hdd_err("Ignoring neighbor request as RRM not enabled");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009058 ret = -EINVAL;
9059 }
9060 }
9061 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009062 case WE_SET_AP_WPS_IE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009063 hdd_debug("Received WE_SET_AP_WPS_IE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009064 sme_update_p2p_ie(WLAN_HDD_GET_HAL_CTX(pAdapter), pBuffer,
9065 s_priv_data.length);
9066 break;
9067 case WE_SET_CONFIG:
9068 vstatus = hdd_execute_global_config_command(hdd_ctx, pBuffer);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009069 if (QDF_STATUS_SUCCESS != vstatus)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009070 ret = -EINVAL;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009072 break;
9073 default:
9074 {
Jeff Johnson99bac312016-06-28 10:38:18 -07009075 hdd_err("Invalid sub command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009076 sub_cmd);
9077 ret = -EINVAL;
9078 break;
9079 }
9080 }
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -07009081 qdf_mem_free(pBuffer);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309082 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009083 return ret;
9084}
9085
9086static int iw_setchar_getnone(struct net_device *dev,
9087 struct iw_request_info *info,
9088 union iwreq_data *wrqu, char *extra)
9089{
9090 int ret;
9091
9092 cds_ssr_protect(__func__);
9093 ret = __iw_setchar_getnone(dev, info, wrqu, extra);
9094 cds_ssr_unprotect(__func__);
9095
9096 return ret;
9097}
9098
9099/**
9100 * iw_setnone_getint() - Generic "get integer" private ioctl handler
9101 * @dev: device upon which the ioctl was received
9102 * @info: ioctl request information
9103 * @wrqu: ioctl request data
9104 * @extra: ioctl extra data
9105 *
9106 * Return: 0 on success, non-zero on error
9107 */
9108static int __iw_setnone_getint(struct net_device *dev,
9109 struct iw_request_info *info,
9110 union iwreq_data *wrqu, char *extra)
9111{
9112 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9113 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
9114 int *value = (int *)extra;
9115 int ret;
9116 tSmeConfigParams smeConfig;
9117 hdd_context_t *hdd_ctx;
9118
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009119 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309120
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009121 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9122 ret = wlan_hdd_validate_context(hdd_ctx);
9123 if (0 != ret)
9124 return ret;
9125
Jeff Johnson441e1f72017-02-07 08:50:49 -08009126 ret = hdd_check_private_wext_control(hdd_ctx, info);
9127 if (0 != ret)
9128 return ret;
9129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009130 switch (value[0]) {
9131 case WE_GET_11D_STATE:
9132 {
9133 sme_get_config_param(hHal, &smeConfig);
9134
9135 *value = smeConfig.csrConfig.Is11dSupportEnabled;
9136
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009137 hdd_debug("11D state=%d!!", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009138
9139 break;
9140 }
9141
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009142 case WE_GET_WLAN_DBG:
9143 {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309144 qdf_trace_display();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009145 *value = 0;
9146 break;
9147 }
9148 case WE_GET_MAX_ASSOC:
9149 {
9150 if (sme_cfg_get_int
9151 (hHal, WNI_CFG_ASSOC_STA_LIMIT,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309152 (uint32_t *) value) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009153 hdd_err("WNI_CFG_ASSOC_STA_LIMIT failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009154 ret = -EIO;
9155 }
9156 break;
9157 }
9158 case WE_GET_SAP_AUTO_CHANNEL_SELECTION:
9159 *value = (WLAN_HDD_GET_CTX(
9160 pAdapter))->config->force_sap_acs;
9161 break;
9162
9163 case WE_GET_CONCURRENCY_MODE:
9164 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08009165 *value = policy_mgr_get_concurrency_mode(hdd_ctx->hdd_psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009166
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009167 hdd_debug("concurrency mode=%d", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009168 break;
9169 }
9170
9171 case WE_GET_NSS:
9172 {
9173 sme_get_config_param(hHal, &smeConfig);
9174 *value = (smeConfig.csrConfig.enable2x2 == 0) ? 1 : 2;
Agrawal Ashish569ad262017-05-01 14:06:36 +05309175 if (policy_mgr_is_current_hwmode_dbs(hdd_ctx->hdd_psoc))
9176 *value = *value-1;
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009177 hdd_debug("GET_NSS: Current NSS:%d", *value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009178 break;
9179 }
9180
9181 case WE_GET_GTX_HT_MCS:
9182 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009183 hdd_debug("GET WMI_VDEV_PARAM_GTX_HT_MCS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009184 *value = wma_cli_get_command(pAdapter->sessionId,
9185 WMI_VDEV_PARAM_GTX_HT_MCS,
9186 GTX_CMD);
9187 break;
9188 }
9189
9190 case WE_GET_GTX_VHT_MCS:
9191 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009192 hdd_debug("GET WMI_VDEV_PARAM_GTX_VHT_MCS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009193 *value = wma_cli_get_command(pAdapter->sessionId,
9194 WMI_VDEV_PARAM_GTX_VHT_MCS,
9195 GTX_CMD);
9196 break;
9197 }
9198
9199 case WE_GET_GTX_USRCFG:
9200 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009201 hdd_debug("GET WMI_VDEV_PARAM_GTX_USR_CFG");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009202 *value = wma_cli_get_command(pAdapter->sessionId,
9203 WMI_VDEV_PARAM_GTX_USR_CFG,
9204 GTX_CMD);
9205 break;
9206 }
9207
9208 case WE_GET_GTX_THRE:
9209 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009210 hdd_debug("GET WMI_VDEV_PARAM_GTX_THRE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009211 *value = wma_cli_get_command(pAdapter->sessionId,
9212 WMI_VDEV_PARAM_GTX_THRE,
9213 GTX_CMD);
9214 break;
9215 }
9216
9217 case WE_GET_GTX_MARGIN:
9218 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009219 hdd_debug("GET WMI_VDEV_PARAM_GTX_MARGIN");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009220 *value = wma_cli_get_command(pAdapter->sessionId,
9221 WMI_VDEV_PARAM_GTX_MARGIN,
9222 GTX_CMD);
9223 break;
9224 }
9225
9226 case WE_GET_GTX_STEP:
9227 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009228 hdd_debug("GET WMI_VDEV_PARAM_GTX_STEP");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009229 *value = wma_cli_get_command(pAdapter->sessionId,
9230 WMI_VDEV_PARAM_GTX_STEP,
9231 GTX_CMD);
9232 break;
9233 }
9234
9235 case WE_GET_GTX_MINTPC:
9236 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009237 hdd_debug("GET WMI_VDEV_PARAM_GTX_MINTPC");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009238 *value = wma_cli_get_command(pAdapter->sessionId,
9239 WMI_VDEV_PARAM_GTX_MINTPC,
9240 GTX_CMD);
9241 break;
9242 }
9243
9244 case WE_GET_GTX_BWMASK:
9245 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009246 hdd_debug("GET WMI_VDEV_PARAM_GTX_BW_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009247 *value = wma_cli_get_command(pAdapter->sessionId,
9248 WMI_VDEV_PARAM_GTX_BW_MASK,
9249 GTX_CMD);
9250 break;
9251 }
9252
9253 case WE_GET_LDPC:
9254 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309255 ret = hdd_get_ldpc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009256 break;
9257 }
9258
9259 case WE_GET_TX_STBC:
9260 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309261 ret = hdd_get_tx_stbc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009262 break;
9263 }
9264
9265 case WE_GET_RX_STBC:
9266 {
Manjeet Singhe80d6d82016-09-02 19:04:41 +05309267 ret = hdd_get_rx_stbc(pAdapter, value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009268 break;
9269 }
9270
9271 case WE_GET_SHORT_GI:
9272 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009273 hdd_debug("GET WMI_VDEV_PARAM_SGI");
Krishna Kumaar Natarajana5c5aad2016-12-05 14:12:13 -08009274 *value = wma_cli_get_command(pAdapter->sessionId,
9275 WMI_VDEV_PARAM_SGI,
9276 VDEV_CMD);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009277 break;
9278 }
9279
9280 case WE_GET_RTSCTS:
9281 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009282 hdd_debug("GET WMI_VDEV_PARAM_ENABLE_RTSCTS");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009283 *value = wma_cli_get_command(pAdapter->sessionId,
9284 WMI_VDEV_PARAM_ENABLE_RTSCTS,
9285 VDEV_CMD);
9286 break;
9287 }
9288
9289 case WE_GET_CHWIDTH:
9290 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009291 hdd_debug("GET WMI_VDEV_PARAM_CHWIDTH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009292 *value = wma_cli_get_command(pAdapter->sessionId,
9293 WMI_VDEV_PARAM_CHWIDTH,
9294 VDEV_CMD);
9295 break;
9296 }
9297
9298 case WE_GET_ANI_EN_DIS:
9299 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009300 hdd_debug("GET WMI_PDEV_PARAM_ANI_ENABLE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009301 *value = wma_cli_get_command(pAdapter->sessionId,
9302 WMI_PDEV_PARAM_ANI_ENABLE,
9303 PDEV_CMD);
9304 break;
9305 }
9306
9307 case WE_GET_ANI_POLL_PERIOD:
9308 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009309 hdd_debug("GET WMI_PDEV_PARAM_ANI_POLL_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009310 *value = wma_cli_get_command(pAdapter->sessionId,
9311 WMI_PDEV_PARAM_ANI_POLL_PERIOD,
9312 PDEV_CMD);
9313 break;
9314 }
9315
9316 case WE_GET_ANI_LISTEN_PERIOD:
9317 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009318 hdd_debug("GET WMI_PDEV_PARAM_ANI_LISTEN_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009319 *value = wma_cli_get_command(pAdapter->sessionId,
9320 WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
9321 PDEV_CMD);
9322 break;
9323 }
9324
9325 case WE_GET_ANI_OFDM_LEVEL:
9326 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009327 hdd_debug("GET WMI_PDEV_PARAM_ANI_OFDM_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009328 *value = wma_cli_get_command(pAdapter->sessionId,
9329 WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
9330 PDEV_CMD);
9331 break;
9332 }
9333
9334 case WE_GET_ANI_CCK_LEVEL:
9335 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009336 hdd_debug("GET WMI_PDEV_PARAM_ANI_CCK_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009337 *value = wma_cli_get_command(pAdapter->sessionId,
9338 WMI_PDEV_PARAM_ANI_CCK_LEVEL,
9339 PDEV_CMD);
9340 break;
9341 }
9342
9343 case WE_GET_DYNAMIC_BW:
9344 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009345 hdd_debug("GET WMI_PDEV_PARAM_ANI_CCK_LEVEL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009346 *value = wma_cli_get_command(pAdapter->sessionId,
9347 WMI_PDEV_PARAM_DYNAMIC_BW,
9348 PDEV_CMD);
9349 break;
9350 }
9351
9352 case WE_GET_11N_RATE:
9353 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009354 hdd_debug("GET WMI_VDEV_PARAM_FIXED_RATE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009355 *value = wma_cli_get_command(pAdapter->sessionId,
9356 WMI_VDEV_PARAM_FIXED_RATE,
9357 VDEV_CMD);
9358 break;
9359 }
9360
9361 case WE_GET_AMPDU:
9362 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009363 hdd_debug("GET AMPDU");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009364 *value = wma_cli_get_command(pAdapter->sessionId,
9365 GEN_VDEV_PARAM_AMPDU,
9366 GEN_CMD);
9367 break;
9368 }
9369
9370 case WE_GET_AMSDU:
9371 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009372 hdd_debug("GET AMSDU");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009373 *value = wma_cli_get_command(pAdapter->sessionId,
9374 GEN_VDEV_PARAM_AMSDU,
9375 GEN_CMD);
9376 break;
9377 }
9378
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07009379 case WE_GET_ROAM_SYNCH_DELAY:
9380 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009381 hdd_debug("GET ROAM SYNCH DELAY");
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -07009382 *value = wma_cli_get_command(pAdapter->sessionId,
9383 GEN_VDEV_ROAM_SYNCH_DELAY,
9384 GEN_CMD);
9385 break;
9386 }
9387
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009388 case WE_GET_BURST_ENABLE:
9389 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009390 hdd_debug("GET Burst enable value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009391 *value = wma_cli_get_command(pAdapter->sessionId,
9392 WMI_PDEV_PARAM_BURST_ENABLE,
9393 PDEV_CMD);
9394 break;
9395 }
9396 case WE_GET_BURST_DUR:
9397 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009398 hdd_debug("GET Burst Duration value");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009399 *value = wma_cli_get_command(pAdapter->sessionId,
9400 WMI_PDEV_PARAM_BURST_DUR,
9401 PDEV_CMD);
9402 break;
9403 }
9404
9405 case WE_GET_TX_CHAINMASK:
9406 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009407 hdd_debug("GET WMI_PDEV_PARAM_TX_CHAIN_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009408 *value = wma_cli_get_command(pAdapter->sessionId,
9409 WMI_PDEV_PARAM_TX_CHAIN_MASK,
9410 PDEV_CMD);
9411 break;
9412 }
9413
9414 case WE_GET_RX_CHAINMASK:
9415 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009416 hdd_debug("GET WMI_PDEV_PARAM_RX_CHAIN_MASK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009417 *value = wma_cli_get_command(pAdapter->sessionId,
9418 WMI_PDEV_PARAM_RX_CHAIN_MASK,
9419 PDEV_CMD);
9420 break;
9421 }
9422
9423 case WE_GET_TXPOW_2G:
9424 {
9425 uint32_t txpow2g = 0;
9426 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009427
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009428 hdd_debug("GET WMI_PDEV_PARAM_TXPOWER_LIMIT2G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009429 *value = wma_cli_get_command(pAdapter->sessionId,
9430 WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
9431 PDEV_CMD);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309432 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009433 sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
9434 &txpow2g)) {
9435 return -EIO;
9436 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009437 hdd_debug("2G tx_power %d", txpow2g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009438 break;
9439 }
9440
9441 case WE_GET_TXPOW_5G:
9442 {
9443 uint32_t txpow5g = 0;
9444 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -07009445
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009446 hdd_debug("GET WMI_PDEV_PARAM_TXPOWER_LIMIT5G");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009447 *value = wma_cli_get_command(pAdapter->sessionId,
9448 WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
9449 PDEV_CMD);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309450 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009451 sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
9452 &txpow5g)) {
9453 return -EIO;
9454 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009455 hdd_debug("5G tx_power %d", txpow5g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009456 break;
9457 }
9458
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009459 case WE_GET_PPS_PAID_MATCH:
9460 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009461 hdd_debug("GET WMI_VDEV_PPS_PAID_MATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009462 *value = wma_cli_get_command(pAdapter->sessionId,
9463 WMI_VDEV_PPS_PAID_MATCH,
9464 PPS_CMD);
9465 break;
9466 }
9467
9468 case WE_GET_PPS_GID_MATCH:
9469 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009470 hdd_debug("GET WMI_VDEV_PPS_GID_MATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009471 *value = wma_cli_get_command(pAdapter->sessionId,
9472 WMI_VDEV_PPS_GID_MATCH,
9473 PPS_CMD);
9474 break;
9475 }
9476
9477 case WE_GET_PPS_EARLY_TIM_CLEAR:
9478 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009479 hdd_debug("GET WMI_VDEV_PPS_EARLY_TIM_CLEAR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009480 *value = wma_cli_get_command(pAdapter->sessionId,
9481 WMI_VDEV_PPS_EARLY_TIM_CLEAR,
9482 PPS_CMD);
9483 break;
9484 }
9485
9486 case WE_GET_PPS_EARLY_DTIM_CLEAR:
9487 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009488 hdd_debug("GET WMI_VDEV_PPS_EARLY_DTIM_CLEAR");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009489 *value = wma_cli_get_command(pAdapter->sessionId,
9490 WMI_VDEV_PPS_EARLY_DTIM_CLEAR,
9491 PPS_CMD);
9492 break;
9493 }
9494
9495 case WE_GET_PPS_EOF_PAD_DELIM:
9496 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009497 hdd_debug("GET WMI_VDEV_PPS_EOF_PAD_DELIM");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009498 *value = wma_cli_get_command(pAdapter->sessionId,
9499 WMI_VDEV_PPS_EOF_PAD_DELIM,
9500 PPS_CMD);
9501 break;
9502 }
9503
9504 case WE_GET_PPS_MACADDR_MISMATCH:
9505 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009506 hdd_debug("GET WMI_VDEV_PPS_MACADDR_MISMATCH");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009507 *value = wma_cli_get_command(pAdapter->sessionId,
9508 WMI_VDEV_PPS_MACADDR_MISMATCH,
9509 PPS_CMD);
9510 break;
9511 }
9512
9513 case WE_GET_PPS_DELIM_CRC_FAIL:
9514 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009515 hdd_debug("GET WMI_VDEV_PPS_DELIM_CRC_FAIL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009516 *value = wma_cli_get_command(pAdapter->sessionId,
9517 WMI_VDEV_PPS_DELIM_CRC_FAIL,
9518 PPS_CMD);
9519 break;
9520 }
9521
9522 case WE_GET_PPS_GID_NSTS_ZERO:
9523 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009524 hdd_debug("GET WMI_VDEV_PPS_GID_NSTS_ZERO");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009525 *value = wma_cli_get_command(pAdapter->sessionId,
9526 WMI_VDEV_PPS_GID_NSTS_ZERO,
9527 PPS_CMD);
9528 break;
9529 }
9530
9531 case WE_GET_PPS_RSSI_CHECK:
9532 {
9533
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009534 hdd_debug("GET WMI_VDEV_PPS_RSSI_CHECK");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009535 *value = wma_cli_get_command(pAdapter->sessionId,
9536 WMI_VDEV_PPS_RSSI_CHECK,
9537 PPS_CMD);
9538 break;
9539 }
9540
9541 case WE_GET_QPOWER_MAX_PSPOLL_COUNT:
9542 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009543 hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009544 *value = wma_cli_get_command(pAdapter->sessionId,
9545 WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
9546 QPOWER_CMD);
9547 break;
9548 }
9549
9550 case WE_GET_QPOWER_MAX_TX_BEFORE_WAKE:
9551 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009552 hdd_debug("WE_GET_QPOWER_MAX_TX_BEFORE_WAKE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009553 *value = wma_cli_get_command(pAdapter->sessionId,
9554 WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
9555 QPOWER_CMD);
9556 break;
9557 }
9558
9559 case WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
9560 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009561 hdd_debug("WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009562 *value = wma_cli_get_command(pAdapter->sessionId,
9563 WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
9564 QPOWER_CMD);
9565 break;
9566 }
9567
9568 case WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
9569 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009570 hdd_debug("WE_GET_QPOWER_MAX_PSPOLL_COUNT");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009571 *value = wma_cli_get_command(pAdapter->sessionId,
9572 WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
9573 QPOWER_CMD);
9574 break;
9575 }
Manikandan Mohandcc21ba2016-03-15 14:31:56 -07009576 case WE_CAP_TSF:
9577 ret = hdd_capture_tsf(pAdapter, (uint32_t *)value, 1);
9578 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009579 case WE_GET_TEMPERATURE:
9580 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -08009581 hdd_debug("WE_GET_TEMPERATURE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009582 ret = wlan_hdd_get_temperature(pAdapter, value);
9583 break;
9584 }
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -07009585 case WE_GET_DCM:
9586 hdd_notice("GET WMI_VDEV_PARAM_HE_DCM");
9587 *value = wma_cli_get_command(pAdapter->sessionId,
9588 WMI_VDEV_PARAM_HE_DCM,
9589 VDEV_CMD);
9590 break;
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -07009591 case WE_GET_RANGE_EXT:
9592 hdd_notice("GET WMI_VDEV_PARAM_HE_RANGE_EXT");
9593 *value = wma_cli_get_command(pAdapter->sessionId,
9594 WMI_VDEV_PARAM_HE_RANGE_EXT,
9595 VDEV_CMD);
9596 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009597 default:
9598 {
Jeff Johnson99bac312016-06-28 10:38:18 -07009599 hdd_err("Invalid IOCTL get_value command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009600 value[0]);
9601 break;
9602 }
9603 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309604 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009605 return ret;
9606}
9607
9608static int iw_setnone_getint(struct net_device *dev,
9609 struct iw_request_info *info,
9610 union iwreq_data *wrqu, char *extra)
9611{
9612 int ret;
9613
9614 cds_ssr_protect(__func__);
9615 ret = __iw_setnone_getint(dev, info, wrqu, extra);
9616 cds_ssr_unprotect(__func__);
9617
9618 return ret;
9619}
9620
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05309621static int hdd_set_fwtest(int argc, int cmd, int value)
9622{
9623 struct set_fwtest_params *fw_test;
9624
9625 /* check for max number of arguments */
9626 if (argc > (WMA_MAX_NUM_ARGS) ||
9627 argc != HDD_FWTEST_PARAMS) {
9628 hdd_err("Too Many args %d", argc);
9629 return -EINVAL;
9630 }
9631 /*
9632 * check if number of arguments are 3 then, check
9633 * then set the default value for sounding interval.
9634 */
9635 if (HDD_FWTEST_PARAMS == argc) {
9636 if (HDD_FWTEST_SU_PARAM_ID == cmd && 0 == value)
9637 value = HDD_FWTEST_SU_DEFAULT_VALUE;
9638 if (HDD_FWTEST_MU_PARAM_ID == cmd && 0 == value)
9639 value = HDD_FWTEST_MU_DEFAULT_VALUE;
9640 }
9641 /* check sounding interval value should not exceed to max */
9642 if (value > HDD_FWTEST_MAX_VALUE) {
9643 hdd_err("Invalid arguments value should not exceed max: %d",
9644 value);
9645 return -EINVAL;
9646 }
9647 fw_test = qdf_mem_malloc(sizeof(*fw_test));
9648 if (NULL == fw_test) {
9649 hdd_err("qdf_mem_malloc failed for fw_test");
9650 return -ENOMEM;
9651 }
9652 fw_test->arg = cmd;
9653 fw_test->value = value;
9654 if (QDF_STATUS_SUCCESS != sme_set_fw_test(fw_test)) {
9655 qdf_mem_free(fw_test);
9656 hdd_err("Not able to post FW_TEST_CMD message to WMA");
9657 return -EINVAL;
9658 }
9659 return 0;
9660}
9661
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009662/**
9663 * iw_set_three_ints_getnone() - Generic "set 3 params" private ioctl handler
9664 * @dev: device upon which the ioctl was received
9665 * @info: ioctl request information
9666 * @wrqu: ioctl request data
9667 * @extra: ioctl extra data
9668 *
9669 * Return: 0 on success, non-zero on error
9670 */
9671static int __iw_set_three_ints_getnone(struct net_device *dev,
9672 struct iw_request_info *info,
9673 union iwreq_data *wrqu, char *extra)
9674{
9675 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9676 int *value = (int *)extra;
9677 int sub_cmd = value[0];
9678 int ret;
9679 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9680
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009681 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309682
Rajeev Kumar2cce8a82016-04-14 15:10:41 -07009683 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -07009684 hdd_err("permission check failed");
Rajeev Kumar2cce8a82016-04-14 15:10:41 -07009685 return -EPERM;
9686 }
9687
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009688 ret = wlan_hdd_validate_context(hdd_ctx);
9689 if (0 != ret)
9690 return ret;
9691
Jeff Johnson441e1f72017-02-07 08:50:49 -08009692 ret = hdd_check_private_wext_control(hdd_ctx, info);
9693 if (0 != ret)
9694 return ret;
9695
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009696 switch (sub_cmd) {
9697
9698 case WE_SET_WLAN_DBG:
Dustin Brown36e2e5c2017-05-16 15:41:37 -07009699 qdf_print_set_category_verbose(qdf_get_pidx(), value[1],
9700 value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009701 break;
9702 case WE_SET_DP_TRACE:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05309703 qdf_dp_trace_set_value(value[1], value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009704 break;
9705
9706 /* value[3] the acs band is not required as start and end channels are
9707 * enough but this cmd is maintained under set three ints for historic
9708 * reasons.
9709 */
9710 case WE_SET_SAP_CHANNELS:
9711 if (wlan_hdd_validate_operation_channel(pAdapter, value[1]) !=
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309712 QDF_STATUS_SUCCESS ||
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009713 wlan_hdd_validate_operation_channel(pAdapter,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05309714 value[2]) != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009715 ret = -EINVAL;
9716 } else {
9717 hdd_ctx->config->force_sap_acs_st_ch = value[1];
9718 hdd_ctx->config->force_sap_acs_end_ch = value[2];
9719 }
9720 break;
9721 case WE_SET_DUAL_MAC_SCAN_CONFIG:
9722 hdd_debug("Ioctl to set dual mac scan config");
9723 if (hdd_ctx->config->dual_mac_feature_disable) {
9724 hdd_err("Dual mac feature is disabled from INI");
9725 return -EPERM;
9726 }
9727 hdd_debug("%d %d %d", value[1], value[2], value[3]);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -08009728 policy_mgr_set_dual_mac_scan_config(hdd_ctx->hdd_psoc,
9729 value[1], value[2], value[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009730 break;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05309731 case WE_SET_FW_TEST:
9732 {
9733 ret = hdd_set_fwtest(value[1], value[2], value[3]);
9734 if (ret) {
9735 hdd_err("Not able to set fwtest %d", ret);
9736 return ret;
9737 }
9738 }
9739 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009740 default:
Jeff Johnson99bac312016-06-28 10:38:18 -07009741 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009742 break;
9743
9744 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309745 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009746 return ret;
9747}
9748
9749int iw_set_three_ints_getnone(struct net_device *dev,
9750 struct iw_request_info *info,
9751 union iwreq_data *wrqu, char *extra)
9752{
9753 int ret;
9754
9755 cds_ssr_protect(__func__);
9756 ret = __iw_set_three_ints_getnone(dev, info, wrqu, extra);
9757 cds_ssr_unprotect(__func__);
9758
9759 return ret;
9760}
9761
9762/**
9763 * hdd_connection_state_string() - Get connection state string
9764 * @connection_state: enum to be converted to a string
9765 *
9766 * Return: the string equivalent of @connection_state
9767 */
9768static const char *
9769hdd_connection_state_string(eConnectionState connection_state)
9770{
9771 switch (connection_state) {
9772 CASE_RETURN_STRING(eConnectionState_NotConnected);
9773 CASE_RETURN_STRING(eConnectionState_Connecting);
9774 CASE_RETURN_STRING(eConnectionState_Associated);
9775 CASE_RETURN_STRING(eConnectionState_IbssDisconnected);
9776 CASE_RETURN_STRING(eConnectionState_IbssConnected);
9777 CASE_RETURN_STRING(eConnectionState_Disconnecting);
9778 default:
9779 return "UNKNOWN";
9780 }
9781}
9782
Naveen Rawat910726a2017-03-06 11:42:51 -08009783#if defined(FEATURE_OEM_DATA_SUPPORT)
9784/**
9785 * iw_get_oem_data_cap_wrapper() - wrapper function to call legacy or new
9786 * wifi_pos api to get oem data caps
9787 * @dev: net device upon which the request was received
9788 * @info: ioctl request information
9789 * @wrqu: ioctl request data
9790 * @extra: ioctl data payload
9791 *
9792 * Return: 0 for success, negative errno value on failure
9793 */
9794static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9795 struct iw_request_info *info,
9796 union iwreq_data *wrqu, char *extra)
9797{
9798 return iw_get_oem_data_cap(dev, info, wrqu, extra);
9799}
9800#elif defined(WIFI_POS_CONVERGED)
9801static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9802 struct iw_request_info *info,
9803 union iwreq_data *wrqu, char *extra)
9804{
9805 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
9806 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
9807
9808 return os_if_wifi_pos_populate_caps(hdd_ctx->hdd_psoc,
9809 (struct wifi_pos_driver_caps *)extra);
9810}
9811#else
9812static inline int iw_get_oem_data_cap_wrapper(struct net_device *dev,
9813 struct iw_request_info *info,
9814 union iwreq_data *wrqu, char *extra)
9815{
9816 return -ENOTSUPP;
9817}
9818#endif
9819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009820/**
9821 * iw_get_char_setnone() - Generic "get string" private ioctl handler
9822 * @dev: device upon which the ioctl was received
9823 * @info: ioctl request information
9824 * @wrqu: ioctl request data
9825 * @extra: ioctl extra data
9826 *
9827 * Return: 0 on success, non-zero on error
9828 */
9829static int __iw_get_char_setnone(struct net_device *dev,
9830 struct iw_request_info *info,
9831 union iwreq_data *wrqu, char *extra)
9832{
9833 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
9834 int sub_cmd = wrqu->data.flags;
9835 hdd_context_t *hdd_ctx;
9836 int ret;
9837#ifdef WLAN_FEATURE_11W
9838 hdd_wext_state_t *pWextState;
9839#endif
9840
9841#ifdef WLAN_FEATURE_11W
9842 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
9843#endif
9844
Jeff Johnson6ee91ee2016-02-11 18:55:30 -08009845 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +05309846
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009847 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
9848 ret = wlan_hdd_validate_context(hdd_ctx);
9849 if (0 != ret)
9850 return ret;
9851
Jeff Johnson441e1f72017-02-07 08:50:49 -08009852 ret = hdd_check_private_wext_control(hdd_ctx, info);
9853 if (0 != ret)
9854 return ret;
9855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009856 switch (sub_cmd) {
9857 case WE_WLAN_VERSION:
9858 {
Arun Khandavallia96c2c02016-05-17 19:15:34 +05309859 hdd_wlan_get_version(hdd_ctx, wrqu, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009860 break;
9861 }
9862
9863 case WE_GET_STATS:
9864 {
9865 hdd_wlan_get_stats(pAdapter, &(wrqu->data.length),
9866 extra, WE_MAX_STR_LEN);
9867 break;
9868 }
9869
Dustin Brownd9322482017-01-09 12:46:03 -08009870 case WE_GET_SUSPEND_RESUME_STATS:
9871 {
9872 ret = wlan_hdd_write_suspend_resume_stats(hdd_ctx, extra,
9873 WE_MAX_STR_LEN);
9874 if (ret >= 0) {
9875 wrqu->data.length = ret;
9876 ret = 0;
9877 }
9878
9879 break;
9880 }
9881
Govind Singha471e5e2015-10-12 17:11:14 +05309882 case WE_LIST_FW_PROFILE:
9883 hdd_wlan_list_fw_profile(&(wrqu->data.length),
9884 extra, WE_MAX_STR_LEN);
9885 break;
9886
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009887 /* The case prints the current state of the HDD, SME, CSR, PE,
9888 * TL it can be extended for WDI Global State as well. And
9889 * currently it only checks P2P_CLIENT adapter. P2P_DEVICE
9890 * and P2P_GO have not been added as of now.
9891 */
9892 case WE_GET_STATES:
9893 {
9894 int buf = 0, len = 0;
9895 int adapter_num = 0;
9896 int count = 0, check = 1;
9897
9898 tHalHandle hHal = NULL;
9899 tpAniSirGlobal pMac = NULL;
9900 hdd_station_ctx_t *pHddStaCtx = NULL;
9901
9902 hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
9903 hdd_adapter_t *useAdapter = NULL;
9904
9905 /* Print wlan0 or p2p0 states based on the adapter_num
9906 * by using the correct adapter
9907 */
9908 while (adapter_num < 2) {
9909 if (WLAN_ADAPTER == adapter_num) {
9910 useAdapter = pAdapter;
9911 buf =
9912 scnprintf(extra + len,
9913 WE_MAX_STR_LEN - len,
9914 "\n\n wlan0 States:-");
9915 len += buf;
9916 } else if (P2P_ADAPTER == adapter_num) {
9917 buf =
9918 scnprintf(extra + len,
9919 WE_MAX_STR_LEN - len,
9920 "\n\n p2p0 States:-");
9921 len += buf;
9922
9923 if (!pHddCtx) {
9924 buf =
9925 scnprintf(extra + len,
9926 WE_MAX_STR_LEN -
9927 len,
9928 "\n pHddCtx is NULL");
9929 len += buf;
9930 break;
9931 }
9932
9933 /* Printing p2p0 states only in the
9934 * case when the device is configured
9935 * as a p2p_client
9936 */
9937 useAdapter =
9938 hdd_get_adapter(pHddCtx,
Krunal Sonif07bb382016-03-10 13:02:11 -08009939 QDF_P2P_CLIENT_MODE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009940 if (!useAdapter) {
9941 buf =
9942 scnprintf(extra + len,
9943 WE_MAX_STR_LEN -
9944 len,
9945 "\n Device not configured as P2P_CLIENT.");
9946 len += buf;
9947 break;
9948 }
9949 }
9950
9951 hHal = WLAN_HDD_GET_HAL_CTX(useAdapter);
9952 if (!hHal) {
9953 buf =
9954 scnprintf(extra + len,
9955 WE_MAX_STR_LEN - len,
9956 "\n pMac is NULL");
9957 len += buf;
9958 break;
9959 }
9960 pMac = PMAC_STRUCT(hHal);
9961 if (!pMac) {
9962 buf =
9963 scnprintf(extra + len,
9964 WE_MAX_STR_LEN - len,
9965 "\n pMac is NULL");
9966 len += buf;
9967 break;
9968 }
9969 pHddStaCtx =
9970 WLAN_HDD_GET_STATION_CTX_PTR(useAdapter);
9971
9972
9973 buf =
9974 scnprintf(extra + len, WE_MAX_STR_LEN - len,
9975 "\n HDD Conn State - %s "
9976 "\n \n SME State:"
9977 "\n Neighbour Roam State - %s"
9978 "\n CSR State - %s"
9979 "\n CSR Substate - %s",
9980 hdd_connection_state_string
9981 (pHddStaCtx->conn_info.connState),
9982 mac_trace_get_neighbour_roam_state
9983 (sme_get_neighbor_roam_state
9984 (hHal, useAdapter->sessionId)),
9985 mac_trace_getcsr_roam_state
9986 (sme_get_current_roam_state
9987 (hHal, useAdapter->sessionId)),
9988 mac_trace_getcsr_roam_sub_state
9989 (sme_get_current_roam_sub_state
9990 (hHal, useAdapter->sessionId))
9991 );
9992 len += buf;
9993 adapter_num++;
9994 }
9995
Mukul Sharma81661ae2015-10-30 20:26:02 +05309996 if (hHal) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08009997 /* Printing Lim State starting with global lim states */
9998 buf =
9999 scnprintf(extra + len, WE_MAX_STR_LEN - len,
10000 "\n \n LIM STATES:-"
10001 "\n Global Sme State - %s "
10002 "\n Global mlm State - %s " "\n",
10003 mac_trace_get_lim_sme_state
10004 (sme_get_lim_sme_state(hHal)),
10005 mac_trace_get_lim_mlm_state
10006 (sme_get_lim_sme_state(hHal))
10007 );
10008 len += buf;
10009
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010010 while (check < 3 && count < 255) {
10011 if (sme_is_lim_session_valid(hHal, count)) {
10012 buf =
10013 scnprintf(extra + len,
10014 WE_MAX_STR_LEN -
10015 len,
10016 "\n Lim Valid Session %d:-"
10017 "\n PE Sme State - %s "
10018 "\n PE Mlm State - %s "
10019 "\n", check,
10020 mac_trace_get_lim_sme_state
10021 (sme_get_lim_sme_session_state
10022 (hHal, count)),
10023 mac_trace_get_lim_mlm_state
10024 (sme_get_lim_mlm_session_state
10025 (hHal, count))
10026 );
10027
10028 len += buf;
10029 check++;
10030 }
10031 count++;
10032 }
10033 }
10034
10035 wrqu->data.length = strlen(extra) + 1;
10036 break;
10037 }
10038
10039 case WE_GET_CFG:
10040 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010041 hdd_debug("Printing CLD global INI Config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010042 hdd_cfg_get_global_config(WLAN_HDD_GET_CTX(pAdapter),
10043 extra,
10044 QCSAP_IOCTL_MAX_STR_LEN);
10045 wrqu->data.length = strlen(extra) + 1;
10046 break;
10047 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010048 case WE_GET_RSSI:
10049 {
10050 int8_t s7Rssi = 0;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010051
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010052 wlan_hdd_get_rssi(pAdapter, &s7Rssi);
10053 snprintf(extra, WE_MAX_STR_LEN, "rssi=%d", s7Rssi);
10054 wrqu->data.length = strlen(extra) + 1;
10055 break;
10056 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010057
10058 case WE_GET_WMM_STATUS:
10059 {
10060 snprintf(extra, WE_MAX_STR_LEN,
10061 "\nDir: 0=up, 1=down, 3=both\n"
10062 "|------------------------|\n"
10063 "|AC | ACM |Admitted| Dir |\n"
10064 "|------------------------|\n"
10065 "|VO | %d | %3s | %d |\n"
10066 "|VI | %d | %3s | %d |\n"
10067 "|BE | %d | %3s | %d |\n"
10068 "|BK | %d | %3s | %d |\n"
10069 "|------------------------|\n",
10070 pAdapter->hddWmmStatus.
10071 wmmAcStatus[SME_AC_VO].wmmAcAccessRequired,
10072 pAdapter->hddWmmStatus.
10073 wmmAcStatus[SME_AC_VO].
10074 wmmAcAccessAllowed ? "YES" : "NO",
10075 pAdapter->hddWmmStatus.
10076 wmmAcStatus[SME_AC_VO].wmmAcTspecInfo.
10077 ts_info.direction,
10078 pAdapter->hddWmmStatus.
10079 wmmAcStatus[SME_AC_VI].wmmAcAccessRequired,
10080 pAdapter->hddWmmStatus.
10081 wmmAcStatus[SME_AC_VI].
10082 wmmAcAccessAllowed ? "YES" : "NO",
10083 pAdapter->hddWmmStatus.
10084 wmmAcStatus[SME_AC_VI].wmmAcTspecInfo.
10085 ts_info.direction,
10086 pAdapter->hddWmmStatus.
10087 wmmAcStatus[SME_AC_BE].wmmAcAccessRequired,
10088 pAdapter->hddWmmStatus.
10089 wmmAcStatus[SME_AC_BE].
10090 wmmAcAccessAllowed ? "YES" : "NO",
10091 pAdapter->hddWmmStatus.
10092 wmmAcStatus[SME_AC_BE].wmmAcTspecInfo.
10093 ts_info.direction,
10094 pAdapter->hddWmmStatus.
10095 wmmAcStatus[SME_AC_BK].wmmAcAccessRequired,
10096 pAdapter->hddWmmStatus.
10097 wmmAcStatus[SME_AC_BK].
10098 wmmAcAccessAllowed ? "YES" : "NO",
10099 pAdapter->hddWmmStatus.
10100 wmmAcStatus[SME_AC_BK].wmmAcTspecInfo.
10101 ts_info.direction);
10102
10103 wrqu->data.length = strlen(extra) + 1;
10104 break;
10105 }
10106 case WE_GET_CHANNEL_LIST:
10107 {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010108 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010109 uint8_t i, len;
10110 char *buf;
10111 uint8_t ubuf[WNI_CFG_COUNTRY_CODE_LEN];
10112 uint8_t ubuf_len = WNI_CFG_COUNTRY_CODE_LEN;
10113 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
10114
Srinivas Girigowdac231df62017-03-24 18:27:57 -070010115 struct channel_list_info channel_list;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010116
10117 memset(&channel_list, 0, sizeof(channel_list));
Agrawal Ashish6c9bca72016-09-04 13:37:59 +053010118 status = iw_get_channel_list(dev, info, wrqu,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010119 (char *)&channel_list);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010120 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010121 hdd_err("GetChannelList Failed!!!");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010122 return -EINVAL;
10123 }
10124 buf = extra;
10125 /*
10126 * Maximum channels = WNI_CFG_VALID_CHANNEL_LIST_LEN.
10127 * Maximum buffer needed = 5 * number of channels.
10128 * Check ifsufficient buffer is available and then
10129 * proceed to fill the buffer.
10130 */
10131 if (WE_MAX_STR_LEN <
10132 (5 * WNI_CFG_VALID_CHANNEL_LIST_LEN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010133 hdd_err("Insufficient Buffer to populate channel list");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010134 return -EINVAL;
10135 }
10136 len = scnprintf(buf, WE_MAX_STR_LEN, "%u ",
10137 channel_list.num_channels);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010138 if (QDF_STATUS_SUCCESS == sme_get_country_code(hdd_ctx->hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010139 ubuf, &ubuf_len)) {
10140 /* Printing Country code in getChannelList */
10141 for (i = 0; i < (ubuf_len - 1); i++)
10142 len += scnprintf(buf + len,
10143 WE_MAX_STR_LEN - len,
10144 "%c", ubuf[i]);
10145 }
10146 for (i = 0; i < channel_list.num_channels; i++) {
10147 len +=
10148 scnprintf(buf + len, WE_MAX_STR_LEN - len,
10149 " %u", channel_list.channels[i]);
10150 }
10151 wrqu->data.length = strlen(extra) + 1;
10152
10153 break;
10154 }
10155#ifdef FEATURE_WLAN_TDLS
10156 case WE_GET_TDLS_PEERS:
10157 {
10158 wrqu->data.length =
10159 wlan_hdd_tdls_get_all_peers(pAdapter, extra,
10160 WE_MAX_STR_LEN) + 1;
10161 break;
10162 }
10163#endif
10164#ifdef WLAN_FEATURE_11W
10165 case WE_GET_11W_INFO:
10166 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010167 hdd_debug("WE_GET_11W_ENABLED = %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010168 pWextState->roamProfile.MFPEnabled);
10169
10170 snprintf(extra, WE_MAX_STR_LEN,
10171 "\n BSSID %02X:%02X:%02X:%02X:%02X:%02X, Is PMF Assoc? %d"
10172 "\n Number of Unprotected Disassocs %d"
10173 "\n Number of Unprotected Deauths %d",
10174 pWextState->roamProfile.BSSIDs.bssid->bytes[0],
10175 pWextState->roamProfile.BSSIDs.bssid->bytes[1],
10176 pWextState->roamProfile.BSSIDs.bssid->bytes[2],
10177 pWextState->roamProfile.BSSIDs.bssid->bytes[3],
10178 pWextState->roamProfile.BSSIDs.bssid->bytes[4],
10179 pWextState->roamProfile.BSSIDs.bssid->bytes[5],
10180 pWextState->roamProfile.MFPEnabled,
10181 pAdapter->hdd_stats.hddPmfStats.
10182 numUnprotDisassocRx,
10183 pAdapter->hdd_stats.hddPmfStats.
10184 numUnprotDeauthRx);
10185
10186 wrqu->data.length = strlen(extra) + 1;
10187 break;
10188 }
10189#endif
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010190 case WE_GET_IBSS_STA_INFO:
10191 {
10192 hdd_station_ctx_t *pHddStaCtx =
10193 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
10194 int idx = 0;
10195 int length = 0, buf = 0;
10196
Naveen Rawatc45d1622016-07-05 12:20:09 -070010197 for (idx = 0; idx < MAX_PEERS; idx++) {
Naveen Rawatac027cb2017-04-27 15:02:42 -070010198 if (HDD_WLAN_INVALID_STA_ID !=
10199 pHddStaCtx->conn_info.staId[idx]) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010200 buf = snprintf
10201 ((extra + length),
10202 WE_MAX_STR_LEN - length,
10203 "\n%d .%02x:%02x:%02x:%02x:%02x:%02x\n",
10204 pHddStaCtx->conn_info.staId[idx],
10205 pHddStaCtx->conn_info.
10206 peerMacAddress[idx].bytes[0],
10207 pHddStaCtx->conn_info.
10208 peerMacAddress[idx].bytes[1],
10209 pHddStaCtx->conn_info.
10210 peerMacAddress[idx].bytes[2],
10211 pHddStaCtx->conn_info.
10212 peerMacAddress[idx].bytes[3],
10213 pHddStaCtx->conn_info.
10214 peerMacAddress[idx].bytes[4],
10215 pHddStaCtx->conn_info.
10216 peerMacAddress[idx].bytes[5]
10217 );
10218 length += buf;
10219 }
10220 }
10221 wrqu->data.length = strlen(extra) + 1;
10222 break;
10223 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010224 case WE_GET_PHYMODE:
10225 {
10226 bool ch_bond24 = false, ch_bond5g = false;
10227 hdd_context_t *hddctx = WLAN_HDD_GET_CTX(pAdapter);
10228 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10229 eCsrPhyMode phymode;
10230 eCsrBand currBand;
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010231 tSmeConfigParams *sme_config;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010232
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010233 sme_config = qdf_mem_malloc(sizeof(*sme_config));
10234 if (!sme_config) {
10235 hdd_err("Out of memory");
10236 ret = -ENOMEM;
10237 break;
10238 }
10239
10240 sme_get_config_param(hal, sme_config);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010241 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010242 sme_config->csrConfig.channelBondingMode24GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010243 ch_bond24 = true;
10244
10245 if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE !=
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010246 sme_config->csrConfig.channelBondingMode5GHz)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010247 ch_bond5g = true;
10248
Dustin Browne9c6b3a2017-01-23 17:17:32 -080010249 qdf_mem_free(sme_config);
10250
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010251 phymode = sme_get_phy_mode(hal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010252 if ((QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010253 sme_get_freq_band(hal, &currBand))) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010254 hdd_err("Failed to get current band config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010255 return -EIO;
10256 }
10257
10258 switch (phymode) {
10259 case eCSR_DOT11_MODE_AUTO:
10260 snprintf(extra, WE_MAX_STR_LEN, "AUTO MODE");
10261 break;
10262 case eCSR_DOT11_MODE_11n:
10263 case eCSR_DOT11_MODE_11n_ONLY:
10264 if (currBand == eCSR_BAND_24) {
10265 if (ch_bond24)
10266 snprintf(extra, WE_MAX_STR_LEN,
10267 "11NGHT40");
10268 else
10269 snprintf(extra, WE_MAX_STR_LEN,
10270 "11NGHT20");
10271 } else if (currBand == eCSR_BAND_5G) {
10272 if (ch_bond5g)
10273 snprintf(extra, WE_MAX_STR_LEN,
10274 "11NAHT40");
10275 else
10276 snprintf(extra, WE_MAX_STR_LEN,
10277 "11NAHT20");
10278 } else {
10279 snprintf(extra, WE_MAX_STR_LEN, "11N");
10280 }
10281 break;
10282 case eCSR_DOT11_MODE_abg:
10283 snprintf(extra, WE_MAX_STR_LEN, "11ABG");
10284 break;
10285 case eCSR_DOT11_MODE_11a:
10286 snprintf(extra, WE_MAX_STR_LEN, "11A");
10287 break;
10288 case eCSR_DOT11_MODE_11b:
10289 case eCSR_DOT11_MODE_11b_ONLY:
10290 snprintf(extra, WE_MAX_STR_LEN, "11B");
10291 break;
10292 case eCSR_DOT11_MODE_11g:
10293 case eCSR_DOT11_MODE_11g_ONLY:
10294 snprintf(extra, WE_MAX_STR_LEN, "11G");
10295 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010296 case eCSR_DOT11_MODE_11ac:
10297 case eCSR_DOT11_MODE_11ac_ONLY:
10298 if (hddctx->config->vhtChannelWidth ==
10299 eHT_CHANNEL_WIDTH_20MHZ)
10300 snprintf(extra, WE_MAX_STR_LEN,
10301 "11ACVHT20");
10302 else if (hddctx->config->vhtChannelWidth ==
10303 eHT_CHANNEL_WIDTH_40MHZ)
10304 snprintf(extra, WE_MAX_STR_LEN,
10305 "11ACVHT40");
10306 else if (hddctx->config->vhtChannelWidth ==
10307 eHT_CHANNEL_WIDTH_80MHZ)
10308 snprintf(extra, WE_MAX_STR_LEN,
10309 "11ACVHT80");
10310 else if (hddctx->config->vhtChannelWidth ==
10311 eHT_CHANNEL_WIDTH_160MHZ)
10312 snprintf(extra, WE_MAX_STR_LEN,
10313 "11ACVHT160");
10314 break;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -080010315 case eCSR_DOT11_MODE_11ax:
10316 case eCSR_DOT11_MODE_11ax_ONLY:
10317 /* currently using vhtChannelWidth */
10318 if (hddctx->config->vhtChannelWidth ==
10319 eHT_CHANNEL_WIDTH_20MHZ)
10320 snprintf(extra, WE_MAX_STR_LEN,
10321 "11AX_HE_20");
10322 else if (hddctx->config->vhtChannelWidth ==
10323 eHT_CHANNEL_WIDTH_40MHZ)
10324 snprintf(extra, WE_MAX_STR_LEN,
10325 "11AX_HE_40");
10326 else if (hddctx->config->vhtChannelWidth ==
10327 eHT_CHANNEL_WIDTH_80MHZ)
10328 snprintf(extra, WE_MAX_STR_LEN,
10329 "11AX_HE_80");
10330 else if (hddctx->config->vhtChannelWidth ==
10331 eHT_CHANNEL_WIDTH_160MHZ)
10332 snprintf(extra, WE_MAX_STR_LEN,
10333 "11AX_HE_160");
10334 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010335 }
10336
10337 wrqu->data.length = strlen(extra) + 1;
10338 break;
10339 }
10340
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010341 case WE_GET_OEM_DATA_CAP:
Naveen Rawat910726a2017-03-06 11:42:51 -080010342 return iw_get_oem_data_cap_wrapper(dev, info, wrqu, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010343 case WE_GET_SNR:
10344 {
10345 int8_t s7snr = 0;
10346 int status = 0;
10347 hdd_context_t *pHddCtx;
10348 hdd_station_ctx_t *pHddStaCtx;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010349
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010350 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
10351 status = wlan_hdd_validate_context(pHddCtx);
Abhishek Singh23edd1c2016-05-05 11:56:06 +053010352 if (status)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010353 return status;
Abhishek Singh23edd1c2016-05-05 11:56:06 +053010354
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010355 pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
10356 if (0 == pHddCtx->config->fEnableSNRMonitoring ||
10357 eConnectionState_Associated !=
10358 pHddStaCtx->conn_info.connState) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010359 hdd_err("getSNR failed: Enable SNR Monitoring-%d, ConnectionState-%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010360 pHddCtx->config->fEnableSNRMonitoring,
10361 pHddStaCtx->conn_info.connState);
10362 return -ENONET;
10363 }
10364 wlan_hdd_get_snr(pAdapter, &s7snr);
10365 snprintf(extra, WE_MAX_STR_LEN, "snr=%d", s7snr);
10366 wrqu->data.length = strlen(extra) + 1;
10367 break;
10368 }
10369 default:
10370 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010371 hdd_err("Invalid IOCTL command %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010372 sub_cmd);
10373 break;
10374 }
10375 }
Dustin Brownd9322482017-01-09 12:46:03 -080010376
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010377 EXIT();
Dustin Brownd9322482017-01-09 12:46:03 -080010378 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010379}
10380
10381static int iw_get_char_setnone(struct net_device *dev,
10382 struct iw_request_info *info,
10383 union iwreq_data *wrqu, char *extra)
10384{
10385 int ret;
10386
10387 cds_ssr_protect(__func__);
10388 ret = __iw_get_char_setnone(dev, info, wrqu, extra);
10389 cds_ssr_unprotect(__func__);
10390
10391 return ret;
10392}
10393
10394/**
10395 * iw_setnone_getnone() - Generic "action" private ioctl handler
10396 * @dev: device upon which the ioctl was received
10397 * @info: ioctl request information
10398 * @wrqu: ioctl request data
10399 * @extra: ioctl extra data
10400 *
10401 * Return: 0 on success, non-zero on error
10402 */
10403static int __iw_setnone_getnone(struct net_device *dev,
10404 struct iw_request_info *info,
10405 union iwreq_data *wrqu, char *extra)
10406{
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010407 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010408 hdd_context_t *hdd_ctx;
10409 int ret;
10410 int sub_cmd;
10411
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080010412 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010413
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010414 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010415 ret = wlan_hdd_validate_context(hdd_ctx);
10416 if (0 != ret)
10417 return ret;
10418
Jeff Johnson441e1f72017-02-07 08:50:49 -080010419 ret = hdd_check_private_wext_control(hdd_ctx, info);
10420 if (0 != ret)
10421 return ret;
10422
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010423#ifdef CONFIG_COMPAT
10424 /* this ioctl is a special case where a sub-ioctl is used and both
10425 * the number of get and set args is 0. in this specific case the
10426 * logic in iwpriv places the sub_cmd in the data.flags portion of
10427 * the iwreq. unfortunately the location of this field will be
10428 * different between 32-bit and 64-bit userspace, and the standard
10429 * compat support in the kernel does not handle this case. so we
10430 * need to explicitly handle it here.
10431 */
10432 if (is_compat_task()) {
10433 struct compat_iw_point *compat_iw_point =
10434 (struct compat_iw_point *)&wrqu->data;
10435 sub_cmd = compat_iw_point->flags;
10436 } else {
10437 sub_cmd = wrqu->data.flags;
10438 }
10439#else
10440 sub_cmd = wrqu->data.flags;
10441#endif
10442
10443 switch (sub_cmd) {
10444 case WE_GET_RECOVERY_STAT:
10445 {
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010446 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(adapter);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010447
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010448 sme_get_recovery_stats(hal);
10449 break;
10450 }
10451
Govind Singha471e5e2015-10-12 17:11:14 +053010452 case WE_GET_FW_PROFILE_DATA:
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010453 ret = wma_cli_set_command(adapter->sessionId,
Govind Singha471e5e2015-10-12 17:11:14 +053010454 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
10455 0, DBG_CMD);
10456 break;
10457
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010458 case WE_IBSS_GET_PEER_INFO_ALL:
10459 {
10460 hdd_wlan_get_ibss_peer_info_all(adapter);
10461 break;
10462 }
10463
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010464 case WE_SET_REASSOC_TRIGGER:
10465 {
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010466 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010467
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010468 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(adapter);
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010469 tSirMacAddr bssid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010470 uint32_t roamId = 0;
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010471 uint8_t operating_ch =
10472 adapter->sessionCtx.station.conn_info.operationChannel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010473 tCsrRoamModifyProfileFields modProfileFields;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010474
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010475 sme_get_modify_profile_fields(hHal, adapter->sessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010476 &modProfileFields);
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010477 if (roaming_offload_enabled(hdd_ctx)) {
10478 qdf_mem_copy(bssid,
10479 &adapter->sessionCtx.station.conn_info.bssId,
10480 sizeof(bssid));
Naveen Rawat664a7cb2017-01-19 17:58:14 -080010481 hdd_wma_send_fastreassoc_cmd(adapter,
Deepak Dhamdhere5fda0e42016-06-24 18:30:02 +053010482 bssid, operating_ch);
10483 } else {
10484 sme_roam_reassoc(hdd_ctx->hHal, adapter->sessionId,
10485 NULL, modProfileFields, &roamId, 1);
10486 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010487 return 0;
10488 }
10489
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080010490 case WE_STOP_OBSS_SCAN:
10491 {
10492 /*
10493 * 1.OBSS Scan is mandatory while operating in 2.4GHz
10494 * 2.OBSS scan is stopped by Firmware during the disassociation
10495 * 3.OBSS stop comamnd is added for debugging purpose
10496 */
10497 tHalHandle hal;
10498
10499 hal = WLAN_HDD_GET_HAL_CTX(adapter);
10500 if (hal == NULL) {
10501 hdd_err("hal context is NULL");
10502 return -EINVAL;
10503 }
10504 sme_ht40_stop_obss_scan(hal, adapter->sessionId);
10505 }
10506 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010507 default:
10508 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010509 hdd_err("unknown ioctl %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010510 break;
10511 }
10512 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010513 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010514 return ret;
10515}
10516
10517static int iw_setnone_getnone(struct net_device *dev,
10518 struct iw_request_info *info,
10519 union iwreq_data *wrqu, char *extra)
10520{
10521 int ret;
10522
10523 cds_ssr_protect(__func__);
10524 ret = __iw_setnone_getnone(dev, info, wrqu, extra);
10525 cds_ssr_unprotect(__func__);
10526
10527 return ret;
10528}
10529
Krunal Sonia6e505b2017-01-12 12:25:18 -080010530#ifdef MPC_UT_FRAMEWORK
10531static int iw_get_policy_manager_ut_ops(hdd_context_t *hdd_ctx,
10532 hdd_adapter_t *adapter, int sub_cmd, int *apps_args)
10533{
Jeff Johnsonac8b0de2017-02-10 09:22:22 -080010534 switch (sub_cmd) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010535 case WE_POLICY_MANAGER_CLIST_CMD:
10536 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010537 hdd_debug("<iwpriv wlan0 pm_clist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010538 policy_mgr_incr_connection_count_utfw(hdd_ctx->hdd_psoc,
10539 apps_args[0], apps_args[1], apps_args[2], apps_args[3],
10540 apps_args[4], apps_args[5], apps_args[6], apps_args[7]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010541 }
10542 break;
10543
10544 case WE_POLICY_MANAGER_DLIST_CMD:
10545 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010546 hdd_debug("<iwpriv wlan0 pm_dlist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010547 policy_mgr_decr_connection_count_utfw(hdd_ctx->hdd_psoc,
10548 apps_args[0], apps_args[1]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010549 }
10550 break;
10551
10552 case WE_POLICY_MANAGER_ULIST_CMD:
10553 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010554 hdd_debug("<iwpriv wlan0 pm_ulist> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010555 policy_mgr_update_connection_info_utfw(hdd_ctx->hdd_psoc,
10556 apps_args[0], apps_args[1], apps_args[2], apps_args[3],
10557 apps_args[4], apps_args[5], apps_args[6], apps_args[7]);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010558 }
10559 break;
10560
10561 case WE_POLICY_MANAGER_DBS_CMD:
10562 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010563 hdd_debug("<iwpriv wlan0 pm_dbs> is called");
Krunal Sonia6e505b2017-01-12 12:25:18 -080010564 if (apps_args[0] == 0)
10565 wma_set_dbs_capability_ut(0);
10566 else
10567 wma_set_dbs_capability_ut(1);
10568
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010569 if (apps_args[1] >= PM_THROUGHPUT &&
10570 apps_args[1] <= PM_LATENCY) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010571 pr_info("setting system pref to [%d]\n", apps_args[1]);
10572 hdd_ctx->config->conc_system_pref = apps_args[1];
10573 }
10574 }
10575 break;
10576
10577 case WE_POLICY_MANAGER_PCL_CMD:
10578 {
10579 uint8_t pcl[QDF_MAX_NUM_CHAN] = {0};
10580 uint8_t weight_list[QDF_MAX_NUM_CHAN] = {0};
10581 uint32_t pcl_len = 0, i = 0;
10582
10583 hdd_err("<iwpriv wlan0 pm_pcl> is called");
10584
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010585 policy_mgr_get_pcl(hdd_ctx->hdd_psoc, apps_args[0],
Krunal Sonia6e505b2017-01-12 12:25:18 -080010586 pcl, &pcl_len,
10587 weight_list, QDF_ARRAY_SIZE(weight_list));
10588 pr_info("PCL list for role[%d] is {", apps_args[0]);
10589 for (i = 0 ; i < pcl_len; i++)
10590 pr_info(" %d, ", pcl[i]);
10591 pr_info("}--------->\n");
10592 }
10593 break;
10594
10595 case WE_POLICY_SET_HW_MODE_CMD:
10596 {
10597 if (apps_args[0] == 0) {
10598 hdd_err("set hw mode for single mac");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010599 policy_mgr_pdev_set_hw_mode(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010600 adapter->sessionId,
10601 HW_MODE_SS_2x2,
10602 HW_MODE_80_MHZ,
10603 HW_MODE_SS_0x0, HW_MODE_BW_NONE,
10604 HW_MODE_DBS_NONE,
10605 HW_MODE_AGILE_DFS_NONE,
10606 HW_MODE_SBS_NONE,
10607 SIR_UPDATE_REASON_UT);
10608 } else if (apps_args[0] == 1) {
10609 hdd_err("set hw mode for dual mac");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010610 policy_mgr_pdev_set_hw_mode(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010611 adapter->sessionId,
10612 HW_MODE_SS_1x1,
10613 HW_MODE_80_MHZ,
10614 HW_MODE_SS_1x1, HW_MODE_40_MHZ,
10615 HW_MODE_DBS,
10616 HW_MODE_AGILE_DFS_NONE,
10617 HW_MODE_SBS_NONE,
10618 SIR_UPDATE_REASON_UT);
10619 }
10620 }
10621 break;
10622
10623 case WE_POLICY_MANAGER_QUERY_ACTION_CMD:
10624 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010625 enum policy_mgr_conc_next_action action;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010626
Krunal Sonia6e505b2017-01-12 12:25:18 -080010627 hdd_notice("<iwpriv wlan0 pm_query_action> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010628 action = policy_mgr_current_connections_update(
10629 hdd_ctx->hdd_psoc,
10630 adapter->sessionId, apps_args[0],
10631 SIR_UPDATE_REASON_UT);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010632 pr_info("next action is %d {HDD_NOP = 0, HDD_DBS, HDD_DBS_DOWNGRADE, HDD_MCC, HDD_MCC_UPGRADE}", action);
10633 }
10634 break;
10635
10636 case WE_POLICY_MANAGER_QUERY_ALLOW_CMD:
10637 {
10638 bool allow;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010639
10640 hdd_notice("<iwpriv wlan0 pm_query_allow> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010641 allow = policy_mgr_allow_concurrency(hdd_ctx->hdd_psoc,
Krunal Sonia6e505b2017-01-12 12:25:18 -080010642 apps_args[0], apps_args[1], apps_args[2]);
10643 pr_info("allow %d {0 = don't allow, 1 = allow}", allow);
10644 }
10645 break;
10646
10647 case WE_POLICY_MANAGER_SCENARIO_CMD:
10648 {
10649 clean_report(hdd_ctx);
10650 if (apps_args[0] == 1) {
10651 wlan_hdd_one_connection_scenario(hdd_ctx);
10652 } else if (apps_args[0] == 2) {
10653 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010654 6, POLICY_MGR_TWO_TWO);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010655 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010656 36, POLICY_MGR_TWO_TWO);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010657 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010658 6, POLICY_MGR_ONE_ONE);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010659 wlan_hdd_two_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010660 36, POLICY_MGR_ONE_ONE);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010661 } else if (apps_args[0] == 3) {
10662 /* MCC on same band with 2x2 same mac*/
10663 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010664 6, 11, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010665 /* MCC on diff band with 2x2 same mac*/
10666 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010667 6, 36, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010668 /* MCC on diff band with 1x1 diff mac */
10669 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010670 36, 6, POLICY_MGR_ONE_ONE, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010671 /* MCC on diff band with 1x1 same mac */
10672 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010673 36, 6, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010674 /* SCC on same band with 2x2 same mac */
10675 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010676 36, 36, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010677 /* SCC on same band with 1x1 same mac */
10678 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010679 36, 36, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010680 /* MCC on same band with 2x2 same mac */
10681 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010682 36, 149, POLICY_MGR_TWO_TWO, 0);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010683 /* MCC on same band with 1x1 same mac */
10684 wlan_hdd_three_connections_scenario(hdd_ctx,
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010685 36, 149, POLICY_MGR_ONE_ONE, 1);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010686 }
10687 print_report(hdd_ctx);
10688 }
10689 break;
10690 }
10691 return 0;
10692}
10693#else
10694static int iw_get_policy_manager_ut_ops(hdd_context_t *hdd_ctx,
10695 hdd_adapter_t *adapter, int sub_cmd, int *apps_args)
10696{
10697 return 0;
10698}
10699#endif
10700
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010701/**
10702 * __iw_set_var_ints_getnone - Generic "set many" private ioctl handler
10703 * @dev: device upon which the ioctl was received
10704 * @info: ioctl request information
10705 * @wrqu: ioctl request data
10706 * @extra: ioctl extra data
10707 *
10708 * This is an SSR-protected generic handler for private ioctls which
10709 * take multiple arguments. Note that this implementation is also
10710 * somewhat unique in that it is shared by both STA-mode and SAP-mode
10711 * interfaces.
10712 *
10713 * Return: 0 on success, non-zero on error
10714 */
10715static int __iw_set_var_ints_getnone(struct net_device *dev,
10716 struct iw_request_info *info,
10717 union iwreq_data *wrqu, char *extra)
10718{
10719 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
10720 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10721 int sub_cmd;
10722 int *apps_args = (int *) extra;
10723 hdd_context_t *hdd_ctx;
10724 int ret, num_args;
10725
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080010726 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010728 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
10729 ret = wlan_hdd_validate_context(hdd_ctx);
10730 if (0 != ret)
10731 return ret;
10732
Jeff Johnson441e1f72017-02-07 08:50:49 -080010733 ret = hdd_check_private_wext_control(hdd_ctx, info);
10734 if (0 != ret)
10735 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010736
10737 sub_cmd = wrqu->data.flags;
10738 num_args = wrqu->data.length;
10739
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010740 hdd_debug("Received length %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010741
10742 switch (sub_cmd) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080010743 case WE_IBSS_GET_PEER_INFO:
10744 {
10745 pr_info("Station ID = %d\n", apps_args[0]);
10746 hdd_wlan_get_ibss_peer_info(pAdapter, apps_args[0]);
10747 }
10748 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010749
10750 case WE_P2P_NOA_CMD:
10751 {
Srinivas Girigowda5d5fdc52017-03-24 22:30:57 -070010752 struct p2p_app_set_ps p2pNoA;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010753
Krunal Sonif07bb382016-03-10 13:02:11 -080010754 if (pAdapter->device_mode != QDF_P2P_GO_MODE) {
Rajeev Kumar274034c2015-11-23 11:28:58 -080010755 hdd_err("Setting NoA is not allowed in Device mode %s(%d)",
10756 hdd_device_mode_to_string(
10757 pAdapter->device_mode),
10758 pAdapter->device_mode);
10759 return -EINVAL;
10760 }
10761
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010762 p2pNoA.opp_ps = apps_args[0];
10763 p2pNoA.ctWindow = apps_args[1];
10764 p2pNoA.duration = apps_args[2];
10765 p2pNoA.interval = apps_args[3];
10766 p2pNoA.count = apps_args[4];
10767 p2pNoA.single_noa_duration = apps_args[5];
10768 p2pNoA.psSelection = apps_args[6];
10769
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010770 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 -070010771 apps_args[0], apps_args[1], apps_args[2],
10772 apps_args[3], apps_args[4],
10773 apps_args[5], apps_args[6]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010774
10775 hdd_set_p2p_ps(dev, &p2pNoA);
10776
10777 }
10778 break;
10779
10780 case WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD:
10781 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010782 hdd_debug("SELECTIVE_MODULE_LOG %d arg1 %d arg2",
Jeff Johnson99bac312016-06-28 10:38:18 -070010783 apps_args[0], apps_args[1]);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010784 qdf_trace_enable(apps_args[0], apps_args[1]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010785 }
10786 break;
10787
10788 case WE_MTRACE_DUMP_CMD:
10789 {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080010790 hdd_debug("MTRACE_DUMP code %d session %d count %d bitmask_of_module %d ",
Jeff Johnson99bac312016-06-28 10:38:18 -070010791 apps_args[0], apps_args[1],
10792 apps_args[2], apps_args[3]);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053010793 qdf_trace_dump_all((void *)hHal, apps_args[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010794 apps_args[1], apps_args[2],
10795 apps_args[3]);
10796
10797 }
10798 break;
10799
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010800 case WE_POLICY_MANAGER_CINFO_CMD:
10801 {
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010802 struct policy_mgr_conc_connection_info *conn_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010803 uint32_t i = 0, len = 0;
10804
Krunal Sonia6e505b2017-01-12 12:25:18 -080010805 hdd_info("<iwpriv wlan0 pm_cinfo> is called");
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080010806 conn_info = policy_mgr_get_conn_info(&len);
Krunal Sonia6e505b2017-01-12 12:25:18 -080010807 pr_info("+--------------------------+\n");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010808 for (i = 0; i < len; i++) {
Krunal Sonia6e505b2017-01-12 12:25:18 -080010809 pr_info("|table_index[%d]\t\t\n", i);
10810 pr_info("|\t|vdev_id - %-10d|\n", conn_info->vdev_id);
10811 pr_info("|\t|chan - %-10d|\n", conn_info->chan);
10812 pr_info("|\t|bw - %-10d|\n", conn_info->bw);
10813 pr_info("|\t|mode - %-10d|\n", conn_info->mode);
10814 pr_info("|\t|mac - %-10d|\n", conn_info->mac);
10815 pr_info("|\t|in_use - %-10d|\n", conn_info->in_use);
10816 pr_info("+--------------------------+\n");
10817 conn_info++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010818 }
10819 }
10820 break;
10821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010822
10823#ifdef FEATURE_WLAN_TDLS
10824 case WE_TDLS_CONFIG_PARAMS:
10825 {
10826 tdls_config_params_t tdlsParams;
10827
10828 tdlsParams.tdls = apps_args[0];
10829 tdlsParams.tx_period_t = apps_args[1];
10830 tdlsParams.tx_packet_n = apps_args[2];
10831 /* ignore args[3] as discovery_period is not used anymore */
10832 tdlsParams.discovery_tries_n = apps_args[4];
10833 /* ignore args[5] as idle_timeout is not used anymore */
10834 tdlsParams.idle_packet_n = apps_args[6];
10835 /* ignore args[7] as rssi_hysteresis is not used anymore */
10836 tdlsParams.rssi_trigger_threshold = apps_args[8];
10837 tdlsParams.rssi_teardown_threshold = apps_args[9];
10838 tdlsParams.rssi_delta = apps_args[10];
10839
10840 wlan_hdd_tdls_set_params(dev, &tdlsParams);
10841 }
10842 break;
10843#endif
10844 case WE_UNIT_TEST_CMD:
10845 {
10846 t_wma_unit_test_cmd *unitTestArgs;
Rajeev Kumarea95edd2017-01-11 20:49:36 -080010847 struct scheduler_msg msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010848 int i, j;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010849
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010850 if ((apps_args[0] < WLAN_MODULE_ID_MIN) ||
10851 (apps_args[0] >= WLAN_MODULE_ID_MAX)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010852 hdd_err("Invalid MODULE ID %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010853 apps_args[0]);
10854 return -EINVAL;
10855 }
Anurag Chouhan77564182016-09-03 16:38:01 +053010856 if ((apps_args[1] > (WMA_MAX_NUM_ARGS)) ||
10857 (apps_args[1] < 0)) {
10858 hdd_err("Too Many/Few args %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010859 apps_args[1]);
10860 return -EINVAL;
10861 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010862 unitTestArgs = qdf_mem_malloc(sizeof(*unitTestArgs));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010863 if (NULL == unitTestArgs) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010864 hdd_err("qdf_mem_malloc failed for unitTestArgs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010865 return -ENOMEM;
10866 }
10867 unitTestArgs->vdev_id = (int)pAdapter->sessionId;
10868 unitTestArgs->module_id = apps_args[0];
10869 unitTestArgs->num_args = apps_args[1];
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010870 for (i = 0, j = 2; i < unitTestArgs->num_args; i++, j++)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010871 unitTestArgs->args[i] = apps_args[j];
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010873 msg.type = SIR_HAL_UNIT_TEST_CMD;
10874 msg.reserved = 0;
10875 msg.bodyptr = unitTestArgs;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053010876 if (QDF_STATUS_SUCCESS !=
Rajeev Kumarea95edd2017-01-11 20:49:36 -080010877 scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +053010878 qdf_mem_free(unitTestArgs);
Jeff Johnson99bac312016-06-28 10:38:18 -070010879 hdd_err("Not able to post UNIT_TEST_CMD message to WMA");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010880 return -EINVAL;
10881 }
10882 }
10883 break;
10884#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
10885 case WE_LED_FLASHING_PARAM:
10886 {
10887 int i;
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070010888
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010889 if (num_args != 4) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010890 hdd_err("gpio_control: 4 parameters are required");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010891 return -EINVAL;
10892 }
10893 for (i = 0; i < num_args; i++) {
10894 if (apps_args[i] >= 0x7fffffff) {
Jeff Johnson99bac312016-06-28 10:38:18 -070010895 hdd_err("gpio_control: parameter should be less than 0x7fffffff");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010896 return -EINVAL;
10897 }
10898 }
10899 sme_set_led_flashing(WLAN_HDD_GET_HAL_CTX(pAdapter),
10900 0, apps_args[0], apps_args[1]);
10901 sme_set_led_flashing(WLAN_HDD_GET_HAL_CTX(pAdapter),
10902 1, apps_args[2], apps_args[3]);
10903 }
10904 break;
10905#endif
Poddar, Siddarth176c4362016-10-03 12:25:00 +053010906 case WE_SET_PKTLOG:
10907 {
10908 int ret;
10909
10910 if (num_args < 1 || num_args > 2) {
10911 hdd_err("pktlog: either 1 or 2 parameters are required");
10912 return -EINVAL;
10913 }
10914
10915 ret = hdd_process_pktlog_command(hdd_ctx, apps_args[0],
10916 apps_args[1]);
10917 if (ret)
10918 return ret;
10919 break;
10920 }
10921
Manjeet Singhf82ed072016-07-08 11:40:00 +053010922 case WE_MAC_PWR_DEBUG_CMD:
10923 {
10924 struct sir_mac_pwr_dbg_cmd mac_pwr_dbg_args;
10925 tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter);
10926 int i, j;
10927
10928 if (num_args < 3) {
10929 hdd_err("number of arguments can't be null %d",
10930 num_args);
10931 return -EINVAL;
10932 }
10933 if (num_args - 3 != apps_args[2]) {
10934 hdd_err("arg list of size %d doesn't match num_args %d",
10935 num_args-3, apps_args[2]);
10936 return -EINVAL;
10937 }
10938 if ((apps_args[1] < WLAN_MODULE_ID_MIN) ||
10939 (apps_args[1] >= WLAN_MODULE_ID_MAX)) {
10940 hdd_err("Invalid MODULE ID %d", apps_args[1]);
10941 return -EINVAL;
10942 }
10943 if (apps_args[2] > (MAX_POWER_DBG_ARGS_SUPPORTED)) {
10944 hdd_err("Too Many args %d", apps_args[2]);
10945 return -EINVAL;
10946 }
10947 mac_pwr_dbg_args.pdev_id = apps_args[0];
10948 mac_pwr_dbg_args.module_id = apps_args[1];
10949 mac_pwr_dbg_args.num_args = apps_args[2];
10950
10951 for (i = 0, j = 3; i < mac_pwr_dbg_args.num_args; i++, j++)
10952 mac_pwr_dbg_args.args[i] = apps_args[j];
10953
10954 if (QDF_STATUS_SUCCESS !=
10955 sme_process_mac_pwr_dbg_cmd(hal, pAdapter->sessionId,
10956 &mac_pwr_dbg_args)) {
10957 return -EINVAL;
10958 }
10959 }
10960 break;
Krunal Sonia6e505b2017-01-12 12:25:18 -080010961 case WE_POLICY_MANAGER_CLIST_CMD:
10962 case WE_POLICY_MANAGER_DLIST_CMD:
10963 case WE_POLICY_MANAGER_ULIST_CMD:
10964 case WE_POLICY_MANAGER_DBS_CMD:
10965 case WE_POLICY_MANAGER_PCL_CMD:
10966 case WE_POLICY_SET_HW_MODE_CMD:
10967 case WE_POLICY_MANAGER_QUERY_ACTION_CMD:
10968 case WE_POLICY_MANAGER_QUERY_ALLOW_CMD:
10969 case WE_POLICY_MANAGER_SCENARIO_CMD:
10970 {
10971 iw_get_policy_manager_ut_ops(hdd_ctx, pAdapter,
10972 sub_cmd, apps_args);
10973 }
10974 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010975 default:
10976 {
Jeff Johnson99bac312016-06-28 10:38:18 -070010977 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010978 }
10979 break;
10980 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053010981 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080010982 return 0;
10983}
10984
10985/**
10986 * iw_hdd_set_var_ints_getnone() - set var ints getnone callback
10987 * @dev: pointer to net_device structure
10988 * @info: pointer to iw_request_info structure
10989 * @wrqu: pointer to iwreq_data
10990 * @extra; extra
10991 *
10992 * Return: 0 on success, error number otherwise
10993 *
10994 */
10995static int iw_hdd_set_var_ints_getnone(struct net_device *dev,
10996 struct iw_request_info *info,
10997 union iwreq_data *wrqu, char *extra)
10998{
10999 union iwreq_data u_priv_wrqu;
11000 int apps_args[MAX_VAR_ARGS] = {0};
11001 int ret, num_args;
11002
Mukul Sharma64a70e82015-11-02 20:05:09 +053011003 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011004 hdd_err("permission check failed");
Mukul Sharma64a70e82015-11-02 20:05:09 +053011005 return -EPERM;
11006 }
11007
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011008 /* Helper function to get iwreq_data with compat handling. */
11009 if (hdd_priv_get_data(&u_priv_wrqu.data, wrqu))
11010 return -EINVAL;
11011
11012 if (NULL == u_priv_wrqu.data.pointer) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011013 hdd_err("NULL data pointer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011014 return -EINVAL;
11015 }
11016
11017 num_args = u_priv_wrqu.data.length;
11018 if (num_args > MAX_VAR_ARGS)
11019 num_args = MAX_VAR_ARGS;
11020
11021 if (copy_from_user(apps_args, u_priv_wrqu.data.pointer,
11022 (sizeof(int)) * num_args)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011023 hdd_err("failed to copy data from user buffer");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011024 return -EFAULT;
11025 }
11026
11027 cds_ssr_protect(__func__);
11028 ret = __iw_set_var_ints_getnone(dev, info, &u_priv_wrqu,
11029 (char *)&apps_args);
11030 cds_ssr_unprotect(__func__);
11031 return ret;
11032}
11033
11034/**
11035 * iw_set_var_ints_getnone - Generic "set many" private ioctl handler
11036 * @dev: device upon which the ioctl was received
11037 * @info: ioctl request information
11038 * @wrqu: ioctl request data
11039 * @extra: ioctl extra data
11040 *
11041 * This is a generic handler for private ioctls which take multiple
11042 * arguments. Note that this implementation is also somewhat unique
11043 * in that it is shared by both STA-mode and SAP-mode interfaces.
11044 *
11045 * Return: 0 on success, non-zero on error
11046 */
11047int iw_set_var_ints_getnone(struct net_device *dev,
11048 struct iw_request_info *info,
11049 union iwreq_data *wrqu, char *extra)
11050{
11051 int ret;
11052
11053 cds_ssr_protect(__func__);
11054 ret = __iw_set_var_ints_getnone(dev, info, wrqu, extra);
11055 cds_ssr_unprotect(__func__);
11056 return ret;
11057}
11058
11059/**
11060 * iw_add_tspec - Add TSpec private ioctl handler
11061 * @dev: device upon which the ioctl was received
11062 * @info: ioctl request information
11063 * @wrqu: ioctl request data
11064 * @extra: ioctl extra data
11065 *
11066 * Return: 0 on success, non-zero on error
11067 */
11068static int __iw_add_tspec(struct net_device *dev, struct iw_request_info *info,
11069 union iwreq_data *wrqu, char *extra)
11070{
11071 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11072 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
11073 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11074 int params[HDD_WLAN_WMM_PARAM_COUNT];
11075 sme_QosWmmTspecInfo tSpec;
11076 uint32_t handle;
11077 struct iw_point s_priv_data;
11078 hdd_context_t *hdd_ctx;
11079 int ret;
11080
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011081 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011083 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11084 ret = wlan_hdd_validate_context(hdd_ctx);
11085 if (0 != ret)
11086 return ret;
11087
Jeff Johnson441e1f72017-02-07 08:50:49 -080011088 ret = hdd_check_private_wext_control(hdd_ctx, info);
11089 if (0 != ret)
11090 return ret;
11091
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011092 /* make sure the application is sufficiently priviledged */
11093 /* note that the kernel will do this for "set" ioctls, but since */
11094 /* this ioctl wants to return status to user space it must be */
11095 /* defined as a "get" ioctl */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011096 if (!capable(CAP_NET_ADMIN))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011097 return -EPERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011098
11099 /* we must be associated in order to add a tspec */
11100 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
11101 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11102 return 0;
11103 }
11104 /* since we are defined to be a "get" ioctl, and since the number */
11105 /* of params exceeds the number of params that wireless extensions */
11106 /* will pass down in the iwreq_data, we must copy the "set" params. */
11107 /* We must handle the compat for iwreq_data in 32U/64K environment. */
11108
11109 /* helper function to get iwreq_data with compat handling. */
11110 if (hdd_priv_get_data(&s_priv_data, wrqu)) {
11111 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11112 return 0;
11113 }
11114 /* make sure all params are correctly passed to function */
11115 if ((NULL == s_priv_data.pointer) ||
11116 (HDD_WLAN_WMM_PARAM_COUNT != s_priv_data.length)) {
11117 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11118 return 0;
11119 }
11120 /* from user space ourselves */
11121 if (copy_from_user(&params, s_priv_data.pointer, sizeof(params))) {
11122 /* hmmm, can't get them */
11123 return -EIO;
11124 }
11125 /* clear the tspec */
11126 memset(&tSpec, 0, sizeof(tSpec));
11127
11128 /* validate the handle */
11129 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11130 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11131 /* that one is reserved */
11132 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11133 return 0;
11134 }
11135 /* validate the TID */
11136 if (params[HDD_WLAN_WMM_PARAM_TID] > 7) {
11137 /* out of range */
11138 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11139 return 0;
11140 }
11141 tSpec.ts_info.tid = params[HDD_WLAN_WMM_PARAM_TID];
11142
11143 /* validate the direction */
11144 switch (params[HDD_WLAN_WMM_PARAM_DIRECTION]) {
11145 case HDD_WLAN_WMM_DIRECTION_UPSTREAM:
11146 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_UPLINK;
11147 break;
11148
11149 case HDD_WLAN_WMM_DIRECTION_DOWNSTREAM:
11150 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_DOWNLINK;
11151 break;
11152
11153 case HDD_WLAN_WMM_DIRECTION_BIDIRECTIONAL:
11154 tSpec.ts_info.direction = SME_QOS_WMM_TS_DIR_BOTH;
11155 break;
11156
11157 default:
11158 /* unknown */
11159 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11160 return 0;
11161 }
11162
11163 tSpec.ts_info.psb = params[HDD_WLAN_WMM_PARAM_APSD];
11164
11165 /* validate the user priority */
11166 if (params[HDD_WLAN_WMM_PARAM_USER_PRIORITY] >= SME_QOS_WMM_UP_MAX) {
11167 /* out of range */
11168 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11169 return 0;
11170 }
11171 tSpec.ts_info.up = params[HDD_WLAN_WMM_PARAM_USER_PRIORITY];
11172 if (0 > tSpec.ts_info.up || SME_QOS_WMM_UP_MAX < tSpec.ts_info.up) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011173 hdd_err("***ts_info.up out of bounds***");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011174 return 0;
11175 }
11176
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011177 hdd_debug("TS_INFO PSB %d UP %d !!!",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011178 tSpec.ts_info.psb, tSpec.ts_info.up);
11179
11180 tSpec.nominal_msdu_size = params[HDD_WLAN_WMM_PARAM_NOMINAL_MSDU_SIZE];
11181 tSpec.maximum_msdu_size = params[HDD_WLAN_WMM_PARAM_MAXIMUM_MSDU_SIZE];
11182 tSpec.min_data_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_DATA_RATE];
11183 tSpec.mean_data_rate = params[HDD_WLAN_WMM_PARAM_MEAN_DATA_RATE];
11184 tSpec.peak_data_rate = params[HDD_WLAN_WMM_PARAM_PEAK_DATA_RATE];
11185 tSpec.max_burst_size = params[HDD_WLAN_WMM_PARAM_MAX_BURST_SIZE];
11186 tSpec.min_phy_rate = params[HDD_WLAN_WMM_PARAM_MINIMUM_PHY_RATE];
11187 tSpec.surplus_bw_allowance =
11188 params[HDD_WLAN_WMM_PARAM_SURPLUS_BANDWIDTH_ALLOWANCE];
11189 tSpec.min_service_interval =
11190 params[HDD_WLAN_WMM_PARAM_SERVICE_INTERVAL];
11191 tSpec.max_service_interval =
11192 params[HDD_WLAN_WMM_PARAM_MAX_SERVICE_INTERVAL];
11193 tSpec.suspension_interval =
11194 params[HDD_WLAN_WMM_PARAM_SUSPENSION_INTERVAL];
11195 tSpec.inactivity_interval =
11196 params[HDD_WLAN_WMM_PARAM_INACTIVITY_INTERVAL];
11197
11198 tSpec.ts_info.burst_size_defn =
11199 params[HDD_WLAN_WMM_PARAM_BURST_SIZE_DEFN];
11200
11201 /* validate the ts info ack policy */
11202 switch (params[HDD_WLAN_WMM_PARAM_ACK_POLICY]) {
11203 case HDD_WLAN_WMM_TS_INFO_ACK_POLICY_NORMAL_ACK:
11204 tSpec.ts_info.ack_policy = SME_QOS_WMM_TS_ACK_POLICY_NORMAL_ACK;
11205 break;
11206
11207 case HDD_WLAN_WMM_TS_INFO_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK:
11208 tSpec.ts_info.ack_policy =
11209 SME_QOS_WMM_TS_ACK_POLICY_HT_IMMEDIATE_BLOCK_ACK;
11210 break;
11211
11212 default:
11213 /* unknown */
11214 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11215 return 0;
11216 }
11217
11218 *pStatus = hdd_wmm_addts(pAdapter, handle, &tSpec);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011219 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011220 return 0;
11221}
11222
11223static int iw_add_tspec(struct net_device *dev,
11224 struct iw_request_info *info,
11225 union iwreq_data *wrqu, char *extra)
11226{
11227 int ret;
11228
11229 cds_ssr_protect(__func__);
11230 ret = __iw_add_tspec(dev, info, wrqu, extra);
11231 cds_ssr_unprotect(__func__);
11232
11233 return ret;
11234}
11235
11236/**
11237 * iw_del_tspec - Delete TSpec private ioctl handler
11238 * @dev: device upon which the ioctl was received
11239 * @info: ioctl request information
11240 * @wrqu: ioctl request data
11241 * @extra: ioctl extra data
11242 *
11243 * Return: 0 on success, non-zero on error
11244 */
11245static int __iw_del_tspec(struct net_device *dev, struct iw_request_info *info,
11246 union iwreq_data *wrqu, char *extra)
11247{
11248 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11249 hdd_context_t *hdd_ctx;
11250 int *params = (int *)extra;
11251 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11252 uint32_t handle;
11253 int ret;
11254
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011255 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011256
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011257 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11258 ret = wlan_hdd_validate_context(hdd_ctx);
11259 if (0 != ret)
11260 return ret;
11261
Jeff Johnson441e1f72017-02-07 08:50:49 -080011262 ret = hdd_check_private_wext_control(hdd_ctx, info);
11263 if (0 != ret)
11264 return ret;
11265
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011266 /* make sure the application is sufficiently priviledged */
11267 /* note that the kernel will do this for "set" ioctls, but since */
11268 /* this ioctl wants to return status to user space it must be */
11269 /* defined as a "get" ioctl */
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011270 if (!capable(CAP_NET_ADMIN))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011271 return -EPERM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011272
11273 /* although we are defined to be a "get" ioctl, the params we require */
11274 /* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
11275 /* is no need to copy the params from user space */
11276
11277 /* validate the handle */
11278 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11279 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11280 /* that one is reserved */
11281 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11282 return 0;
11283 }
11284
11285 *pStatus = hdd_wmm_delts(pAdapter, handle);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011286 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011287 return 0;
11288}
11289
11290static int iw_del_tspec(struct net_device *dev,
11291 struct iw_request_info *info,
11292 union iwreq_data *wrqu, char *extra)
11293{
11294 int ret;
11295
11296 cds_ssr_protect(__func__);
11297 ret = __iw_del_tspec(dev, info, wrqu, extra);
11298 cds_ssr_unprotect(__func__);
11299
11300 return ret;
11301}
11302
11303/**
11304 * iw_get_tspec - Get TSpec private ioctl handler
11305 * @dev: device upon which the ioctl was received
11306 * @info: ioctl request information
11307 * @wrqu: ioctl request data
11308 * @extra: ioctl extra data
11309 *
11310 * Return: 0 on success, non-zero on error
11311 */
11312static int __iw_get_tspec(struct net_device *dev, struct iw_request_info *info,
11313 union iwreq_data *wrqu, char *extra)
11314{
11315 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11316 hdd_context_t *hdd_ctx;
11317 int *params = (int *)extra;
11318 hdd_wlan_wmm_status_e *pStatus = (hdd_wlan_wmm_status_e *) extra;
11319 uint32_t handle;
11320 int ret;
11321
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011322 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011323
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011324 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11325 ret = wlan_hdd_validate_context(hdd_ctx);
11326 if (0 != ret)
11327 return ret;
11328
Jeff Johnson441e1f72017-02-07 08:50:49 -080011329 ret = hdd_check_private_wext_control(hdd_ctx, info);
11330 if (0 != ret)
11331 return ret;
11332
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011333 /* although we are defined to be a "get" ioctl, the params we require */
11334 /* will fit in the iwreq_data, therefore unlike iw_add_tspec() there */
11335 /* is no need to copy the params from user space */
11336
11337 /* validate the handle */
11338 handle = params[HDD_WLAN_WMM_PARAM_HANDLE];
11339 if (HDD_WMM_HANDLE_IMPLICIT == handle) {
11340 /* that one is reserved */
11341 *pStatus = HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM;
11342 return 0;
11343 }
11344
11345 *pStatus = hdd_wmm_checkts(pAdapter, handle);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011346 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011347 return 0;
11348}
11349
11350static int iw_get_tspec(struct net_device *dev,
11351 struct iw_request_info *info,
11352 union iwreq_data *wrqu, char *extra)
11353{
11354 int ret;
11355
11356 cds_ssr_protect(__func__);
11357 ret = __iw_get_tspec(dev, info, wrqu, extra);
11358 cds_ssr_unprotect(__func__);
11359
11360 return ret;
11361}
11362
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011363/**
11364 * iw_set_fties - Set FT IEs private ioctl handler
11365 * @dev: device upon which the ioctl was received
11366 * @info: ioctl request information
11367 * @wrqu: ioctl request data
11368 * @extra: ioctl extra data
11369 *
11370 * Each time the supplicant has the auth_request or reassoc request
11371 * IEs ready they are pushed to the driver. The driver will in turn
11372 * use it to send out the auth req and reassoc req for 11r FT Assoc.
11373 *
11374 * Return: 0 on success, non-zero on error
11375 */
11376static int __iw_set_fties(struct net_device *dev, struct iw_request_info *info,
11377 union iwreq_data *wrqu, char *extra)
11378{
11379 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11380 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
11381 hdd_context_t *hdd_ctx;
11382 int ret;
11383
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011384 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011385
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011386 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11387 ret = wlan_hdd_validate_context(hdd_ctx);
11388 if (0 != ret)
11389 return ret;
11390
Jeff Johnson441e1f72017-02-07 08:50:49 -080011391 ret = hdd_check_private_wext_control(hdd_ctx, info);
11392 if (0 != ret)
11393 return ret;
11394
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011395 if (!wrqu->data.length) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011396 hdd_err("called with 0 length IEs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011397 return -EINVAL;
11398 }
11399 if (wrqu->data.pointer == NULL) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011400 hdd_err("called with NULL IE");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011401 return -EINVAL;
11402 }
11403 /* Added for debug on reception of Re-assoc Req. */
11404 if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011405 hdd_debug("Called with Ie of length = %d when not associated",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011406 wrqu->data.length);
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011407 hdd_debug("Should be Re-assoc Req IEs");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011408 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011409 hdd_debug("called with Ie of length = %d", wrqu->data.length);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011410
11411 /* Pass the received FT IEs to SME */
11412 sme_set_ft_ies(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId,
11413 extra, wrqu->data.length);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011414 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011415 return 0;
11416}
11417
11418static int iw_set_fties(struct net_device *dev,
11419 struct iw_request_info *info,
11420 union iwreq_data *wrqu, char *extra)
11421{
11422 int ret;
11423
11424 cds_ssr_protect(__func__);
11425 ret = __iw_set_fties(dev, info, wrqu, extra);
11426 cds_ssr_unprotect(__func__);
11427
11428 return ret;
11429}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011430
Dustin Brown0cbc7572016-12-16 13:54:40 -080011431/**
11432 * iw_set_dynamic_mcbc_filter() - Set Dynamic MCBC Filter ioctl handler
11433 * @dev: device upon which the ioctl was received
11434 * @info: ioctl request information
11435 * @wrqu: ioctl request data
11436 * @extra: ioctl extra data
11437 *
Dustin Brown860566f2017-01-31 15:24:43 -080011438 * This IOCTL is OBSOLETE as of Jan 30, 2017. We are leaving it here for the
11439 * time being to provide guidance in migrating to standard APIs.
11440 *
Dustin Brown0cbc7572016-12-16 13:54:40 -080011441 * Return: 0 on success, non-zero on error
11442 */
11443static int iw_set_dynamic_mcbc_filter(struct net_device *dev,
11444 struct iw_request_info *info,
11445 union iwreq_data *wrqu,
11446 char *extra)
11447{
Dustin Brown860566f2017-01-31 15:24:43 -080011448 hdd_err("\n"
11449 "setMCBCFilter is obsolete. Use the following instead:\n"
11450 "Configure multicast filtering via the ‘ip’ command.\n"
11451 "\tip maddr add 11:22:33:44:55:66 dev wlan0 # allow traffic to address\n"
11452 "\tip maddr del 11:22:33:44:55:66 dev wlan0 # undo allow\n"
11453 "Configure broadcast filtering via ini item, 'g_enable_non_arp_bc_hw_filter.'\n"
11454 "\tg_enable_non_arp_bc_hw_filter=1 # drop all non-ARP broadcast traffic\n"
11455 "\tg_enable_non_arp_bc_hw_filter=0 # allow all broadcast traffic");
Mukul Sharma3ba26b82017-01-12 21:59:41 +053011456 return -EINVAL;
Dustin Brown0cbc7572016-12-16 13:54:40 -080011457}
11458
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011459/**
11460 * iw_set_host_offload - Set host offload ioctl handler
11461 * @dev: device upon which the ioctl was received
11462 * @info: ioctl request information
11463 * @wrqu: ioctl request data
11464 * @extra: ioctl extra data
11465 *
11466 * Return: 0 on success, non-zero on error
11467 */
11468static int __iw_set_host_offload(struct net_device *dev,
11469 struct iw_request_info *info,
11470 union iwreq_data *wrqu, char *extra)
11471{
11472 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Srinivas Girigowda077143e2017-03-25 10:47:27 -070011473 struct host_offload_req *pRequest = (struct host_offload_req *) extra;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011474 tSirHostOffloadReq offloadRequest;
11475 hdd_context_t *hdd_ctx;
11476 int ret;
11477
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011478 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011479
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011480 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11481 ret = wlan_hdd_validate_context(hdd_ctx);
11482 if (0 != ret)
11483 return ret;
11484
Jeff Johnson441e1f72017-02-07 08:50:49 -080011485 ret = hdd_check_private_wext_control(hdd_ctx, info);
11486 if (0 != ret)
11487 return ret;
11488
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011489 if (!hdd_conn_is_connected(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011490 hdd_err("dev is not in CONNECTED state, ignore!!!");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011491 return -EINVAL;
11492 }
11493
11494 /* Debug display of request components. */
11495 switch (pRequest->offloadType) {
11496 case WLAN_IPV4_ARP_REPLY_OFFLOAD:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011497 hdd_debug("Host offload request: ARP reply");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011498 switch (pRequest->enableOrDisable) {
11499 case WLAN_OFFLOAD_DISABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011500 hdd_debug(" disable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011501 break;
11502 case WLAN_OFFLOAD_ARP_AND_BC_FILTER_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011503 hdd_debug(" BC Filtering enable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011504 case WLAN_OFFLOAD_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011505 hdd_debug(" ARP offload enable");
11506 hdd_debug(" IP address: %d.%d.%d.%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011507 pRequest->params.hostIpv4Addr[0],
11508 pRequest->params.hostIpv4Addr[1],
11509 pRequest->params.hostIpv4Addr[2],
11510 pRequest->params.hostIpv4Addr[3]);
11511 }
11512 break;
11513
11514 case WLAN_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011515 hdd_debug("Host offload request: neighbor discovery");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011516 switch (pRequest->enableOrDisable) {
11517 case WLAN_OFFLOAD_DISABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011518 hdd_debug(" disable");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011519 break;
11520 case WLAN_OFFLOAD_ENABLE:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011521 hdd_debug(" enable");
11522 hdd_debug(" IP address: %x:%x:%x:%x:%x:%x:%x:%x",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011523 *(uint16_t *) (pRequest->params.hostIpv6Addr),
11524 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11525 2),
11526 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11527 4),
11528 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11529 6),
11530 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11531 8),
11532 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11533 10),
11534 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11535 12),
11536 *(uint16_t *) (pRequest->params.hostIpv6Addr +
11537 14));
11538 }
11539 }
11540
11541 /* Execute offload request. The reason that we can copy the
11542 * request information from the ioctl structure to the SME
11543 * structure is that they are laid out exactly the same.
11544 * Otherwise, each piece of information would have to be
11545 * copied individually.
11546 */
11547 memcpy(&offloadRequest, pRequest, wrqu->data.length);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011548 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011549 sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
11550 pAdapter->sessionId, &offloadRequest)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011551 hdd_err("Failure to execute host offload request");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011552 return -EINVAL;
11553 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011554 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011555 return 0;
11556}
11557
11558static int iw_set_host_offload(struct net_device *dev,
11559 struct iw_request_info *info,
11560 union iwreq_data *wrqu, char *extra)
11561{
11562 int ret;
11563
11564 cds_ssr_protect(__func__);
11565 ret = __iw_set_host_offload(dev, info, wrqu, extra);
11566 cds_ssr_unprotect(__func__);
11567
11568 return ret;
11569}
11570
11571/**
11572 * iw_set_keepalive_params - Set keepalive params ioctl handler
11573 * @dev: device upon which the ioctl was received
11574 * @info: ioctl request information
11575 * @wrqu: ioctl request data
11576 * @extra: ioctl extra data
11577 *
11578 * Return: 0 on success, non-zero on error
11579 */
11580static int __iw_set_keepalive_params(struct net_device *dev,
11581 struct iw_request_info *info,
11582 union iwreq_data *wrqu, char *extra)
11583{
11584 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011585 tpSirKeepAliveReq request = (tpSirKeepAliveReq) extra;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011586 hdd_context_t *hdd_ctx;
11587 int ret;
11588
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011589 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011590
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011591 hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11592 ret = wlan_hdd_validate_context(hdd_ctx);
11593 if (0 != ret)
11594 return ret;
11595
Jeff Johnson441e1f72017-02-07 08:50:49 -080011596 ret = hdd_check_private_wext_control(hdd_ctx, info);
11597 if (0 != ret)
11598 return ret;
11599
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011600 if (wrqu->data.length != sizeof(*request)) {
11601 hdd_err("Invalid length %d", wrqu->data.length);
11602 return -EINVAL;
11603 }
11604
11605 if (request->timePeriod > WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD_STAMAX) {
11606 hdd_err("Value of timePeriod %d exceed Max limit %d",
11607 request->timePeriod,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011608 WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD_STAMAX);
11609 return -EINVAL;
11610 }
11611
11612 /* Debug display of request components. */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011613 hdd_debug("Set Keep Alive Request : TimePeriod %d size %zu",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011614 request->timePeriod, sizeof(tSirKeepAliveReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011615
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011616 switch (request->packetType) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011617 case WLAN_KEEP_ALIVE_NULL_PKT:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011618 hdd_debug("Keep Alive Request: Tx NULL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011619 break;
11620
11621 case WLAN_KEEP_ALIVE_UNSOLICIT_ARP_RSP:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011622 hdd_debug("Keep Alive Request: Tx UnSolicited ARP RSP");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011623
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011624 hdd_debug("Host IP address: %d.%d.%d.%d",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011625 request->hostIpv4Addr[0], request->hostIpv4Addr[1],
11626 request->hostIpv4Addr[2], request->hostIpv4Addr[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011627
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011628 hdd_debug("Dest IP address: %d.%d.%d.%d",
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011629 request->destIpv4Addr[0], request->destIpv4Addr[1],
11630 request->destIpv4Addr[2], request->destIpv4Addr[3]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011631
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011632 hdd_debug("Dest MAC address: "MAC_ADDRESS_STR,
Srinivas Girigowda9c330a92015-11-24 12:28:25 -080011633 MAC_ADDR_ARRAY(request->dest_macaddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011634 break;
11635 }
11636
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011637 hdd_debug("Keep alive period %d", request->timePeriod);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011638
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011639 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011640 sme_set_keep_alive(WLAN_HDD_GET_HAL_CTX(pAdapter),
Rajeev Kumar3ddf1c62015-11-03 14:10:13 -080011641 pAdapter->sessionId, request)) {
11642 hdd_err("Failure to execute Keep Alive");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011643 return -EINVAL;
11644 }
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011645 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011646 return 0;
11647}
11648
11649static int iw_set_keepalive_params(struct net_device *dev,
11650 struct iw_request_info *info,
11651 union iwreq_data *wrqu,
11652 char *extra)
11653{
11654 int ret;
11655
11656 cds_ssr_protect(__func__);
11657 ret = __iw_set_keepalive_params(dev, info, wrqu, extra);
11658 cds_ssr_unprotect(__func__);
11659
11660 return ret;
11661}
11662
11663#ifdef WLAN_FEATURE_PACKET_FILTERING
11664/**
11665 * wlan_hdd_set_filter() - Set packet filter
11666 * @hdd_ctx: Global HDD context
11667 * @request: Packet filter request struct
11668 * @sessionId: Target session for the request
11669 *
11670 * Return: 0 on success, non-zero on error
11671 */
11672static int wlan_hdd_set_filter(hdd_context_t *hdd_ctx,
11673 struct pkt_filter_cfg *request,
11674 uint8_t sessionId)
11675{
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011676 struct pmo_rcv_pkt_fltr_cfg *pmo_set_pkt_fltr_req = NULL;
11677 struct pmo_rcv_pkt_fltr_clear_param *pmo_clr_pkt_fltr_param = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011678 int i = 0;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011679 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011680
11681 if (hdd_ctx->config->disablePacketFilter) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011682 hdd_warn("Packet filtering disabled in ini");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011683 return 0;
11684 }
11685
11686 /* Debug display of request components. */
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011687 hdd_debug("Packet Filter Request : FA %d params %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011688 request->filter_action, request->num_params);
11689
11690 switch (request->filter_action) {
11691 case HDD_RCV_FILTER_SET:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011692 hdd_debug("Set Packet Filter Request for Id: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011693 request->filter_id);
11694
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011695 pmo_set_pkt_fltr_req =
11696 qdf_mem_malloc(sizeof(*pmo_set_pkt_fltr_req));
11697 if (!pmo_set_pkt_fltr_req) {
Mukul Sharmad75a6672017-06-22 15:40:53 +053011698 hdd_err("unable to allocate pmo_set_pkt_fltr_req");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011699 return QDF_STATUS_E_NOMEM;
11700 }
11701
11702 pmo_set_pkt_fltr_req->filter_id = request->filter_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011703 if (request->num_params >= HDD_MAX_CMP_PER_PACKET_FILTER) {
11704 hdd_err("Number of Params exceed Max limit %d",
11705 request->num_params);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011706 status = QDF_STATUS_E_INVAL;
11707 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011708 }
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011709 pmo_set_pkt_fltr_req->num_params = request->num_params;
11710 pmo_set_pkt_fltr_req->coalesce_time = 0;
Srinivas Girigowdabbbecad2017-06-28 16:01:48 -070011711 pmo_set_pkt_fltr_req->filter_type = PMO_RCV_FILTER_TYPE_FILTER_PKT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011712 for (i = 0; i < request->num_params; i++) {
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011713 pmo_set_pkt_fltr_req->params_data[i].protocol_layer =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011714 request->params_data[i].protocol_layer;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011715 pmo_set_pkt_fltr_req->params_data[i].compare_flag =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011716 request->params_data[i].compare_flag;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011717 pmo_set_pkt_fltr_req->params_data[i].data_offset =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011718 request->params_data[i].data_offset;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011719 pmo_set_pkt_fltr_req->params_data[i].data_length =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011720 request->params_data[i].data_length;
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011721 pmo_set_pkt_fltr_req->params_data[i].reserved = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011722
Dustin Brown4d1e8462016-12-14 12:12:24 -080011723 if (request->params_data[i].data_offset >
11724 SIR_MAX_FILTER_TEST_DATA_OFFSET) {
11725 hdd_err("Invalid data offset %u for param %d (max = %d)",
11726 request->params_data[i].data_offset,
11727 i,
11728 SIR_MAX_FILTER_TEST_DATA_OFFSET);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011729 status = QDF_STATUS_E_INVAL;
11730 goto out;
Dustin Brown4d1e8462016-12-14 12:12:24 -080011731 }
11732
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011733 if (request->params_data[i].data_length >
11734 SIR_MAX_FILTER_TEST_DATA_LEN) {
11735 hdd_err("Error invalid data length %d",
11736 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011737 status = QDF_STATUS_E_INVAL;
11738 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011739 }
11740
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011741 hdd_debug("Proto %d Comp Flag %d Filter Type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011742 request->params_data[i].protocol_layer,
11743 request->params_data[i].compare_flag,
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011744 pmo_set_pkt_fltr_req->filter_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011745
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011746 hdd_debug("Data Offset %d Data Len %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011747 request->params_data[i].data_offset,
11748 request->params_data[i].data_length);
11749
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011750 if (sizeof(
11751 pmo_set_pkt_fltr_req->params_data[i].compare_data)
Rajeev Kumarf5b6da22016-04-15 13:24:03 -070011752 < (request->params_data[i].data_length)) {
11753 hdd_err("Error invalid data length %d",
11754 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011755 status = QDF_STATUS_E_INVAL;
11756 goto out;
Rajeev Kumarf5b6da22016-04-15 13:24:03 -070011757 }
11758
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011759 memcpy(
11760 &pmo_set_pkt_fltr_req->params_data[i].compare_data,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011761 request->params_data[i].compare_data,
11762 request->params_data[i].data_length);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011763 memcpy(&pmo_set_pkt_fltr_req->params_data[i].data_mask,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011764 request->params_data[i].data_mask,
11765 request->params_data[i].data_length);
11766
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011767 hdd_debug("CData %d CData %d CData %d CData %d CData %d CData %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011768 request->params_data[i].compare_data[0],
11769 request->params_data[i].compare_data[1],
11770 request->params_data[i].compare_data[2],
11771 request->params_data[i].compare_data[3],
11772 request->params_data[i].compare_data[4],
11773 request->params_data[i].compare_data[5]);
11774
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011775 hdd_debug("MData %d MData %d MData %d MData %d MData %d MData %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011776 request->params_data[i].data_mask[0],
11777 request->params_data[i].data_mask[1],
11778 request->params_data[i].data_mask[2],
11779 request->params_data[i].data_mask[3],
11780 request->params_data[i].data_mask[4],
11781 request->params_data[i].data_mask[5]);
11782 }
11783
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011784 if (QDF_STATUS_SUCCESS !=
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011785 pmo_ucfg_set_pkt_filter(hdd_ctx->hdd_psoc,
11786 pmo_set_pkt_fltr_req,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011787 sessionId)) {
11788 hdd_err("Failure to execute Set Filter");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011789 status = QDF_STATUS_E_INVAL;
11790 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011791 }
11792
11793 break;
11794
11795 case HDD_RCV_FILTER_CLEAR:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080011796 hdd_debug("Clear Packet Filter Request for Id: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011797 request->filter_id);
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011798
11799 pmo_clr_pkt_fltr_param = qdf_mem_malloc(
11800 sizeof(*pmo_clr_pkt_fltr_param));
11801 if (!pmo_clr_pkt_fltr_param) {
11802 hdd_err("unable to allocate pmo_clr_pkt_fltr_param");
11803 return QDF_STATUS_E_NOMEM;
11804 }
11805
11806 pmo_clr_pkt_fltr_param->filter_id = request->filter_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011807 if (QDF_STATUS_SUCCESS !=
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011808 pmo_ucfg_clear_pkt_filter(hdd_ctx->hdd_psoc,
11809 pmo_clr_pkt_fltr_param,
11810 sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011811 hdd_err("Failure to execute Clear Filter");
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011812 status = QDF_STATUS_E_INVAL;
11813 goto out;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011814 }
11815 break;
11816
11817 default:
11818 hdd_err("Packet Filter Request: Invalid %d",
11819 request->filter_action);
11820 return -EINVAL;
11821 }
Ravi Kumar Bokka4bd571d2017-04-17 14:21:10 +053011822
11823out:
11824 if (pmo_set_pkt_fltr_req)
11825 qdf_mem_free(pmo_set_pkt_fltr_req);
11826 if (pmo_clr_pkt_fltr_param)
11827 qdf_mem_free(pmo_clr_pkt_fltr_param);
11828
11829 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011830}
11831
11832/**
11833 * __iw_set_packet_filter_params() - set packet filter parameters in target
11834 * @dev: Pointer to netdev
11835 * @info: Pointer to iw request info
11836 * @wrqu: Pointer to data
11837 * @extra: Pointer to extra data
11838 *
11839 * Return: 0 on success, non-zero on error
11840 */
11841static int __iw_set_packet_filter_params(struct net_device *dev,
11842 struct iw_request_info *info,
11843 union iwreq_data *wrqu, char *extra)
11844{
11845 int ret;
11846 hdd_context_t *hdd_ctx;
11847 struct iw_point priv_data;
11848 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
11849 struct pkt_filter_cfg *request = NULL;
11850
Mukul Sharma472382f2015-11-02 20:16:31 +053011851 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011852 hdd_err("permission check failed");
Mukul Sharma472382f2015-11-02 20:16:31 +053011853 return -EPERM;
11854 }
11855
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011856 ENTER_DEV(dev);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011858 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
11859 ret = wlan_hdd_validate_context(hdd_ctx);
11860 if (0 != ret)
11861 return ret;
11862
Jeff Johnson441e1f72017-02-07 08:50:49 -080011863 ret = hdd_check_private_wext_control(hdd_ctx, info);
11864 if (0 != ret)
11865 return ret;
11866
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011867 if (hdd_priv_get_data(&priv_data, wrqu)) {
11868 hdd_err("failed to get priv data");
11869 return -EINVAL;
11870 }
11871
11872 if ((NULL == priv_data.pointer) || (0 == priv_data.length)) {
11873 hdd_err("invalid priv data %p or invalid priv data length %d",
11874 priv_data.pointer, priv_data.length);
11875 return -EINVAL;
11876 }
11877
Mukul Sharmabe846bb2017-05-09 17:41:52 +053011878 if (!hdd_conn_is_connected(WLAN_HDD_GET_STATION_CTX_PTR(adapter))) {
11879 hdd_err("Packet filter not supported in disconnected state");
11880 return -ENOTSUPP;
11881 }
11882
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011883 /* copy data using copy_from_user */
11884 request = mem_alloc_copy_from_user_helper(priv_data.pointer,
11885 priv_data.length);
11886 if (NULL == request) {
11887 hdd_err("mem_alloc_copy_from_user_helper fail");
11888 return -ENOMEM;
11889 }
11890
11891 ret = wlan_hdd_set_filter(hdd_ctx, request, adapter->sessionId);
11892
Mahesh Kumar Kalikot Veetil9c656182016-11-02 10:28:03 -070011893 qdf_mem_free(request);
Hanumantha Reddy Pothula2db50ed2015-11-23 10:48:33 +053011894 EXIT();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011895 return ret;
11896}
11897
11898/**
11899 * iw_set_packet_filter_params() - set packet filter parameters in target
11900 * @dev: Pointer to netdev
11901 * @info: Pointer to iw request info
11902 * @wrqu: Pointer to data
11903 * @extra: Pointer to extra data
11904 *
11905 * Return: 0 on success, non-zero on error
11906 */
11907static int iw_set_packet_filter_params(struct net_device *dev,
11908 struct iw_request_info *info,
11909 union iwreq_data *wrqu, char *extra)
11910{
11911 int ret;
11912
11913 cds_ssr_protect(__func__);
11914 ret = __iw_set_packet_filter_params(dev, info, wrqu, extra);
11915 cds_ssr_unprotect(__func__);
11916
11917 return ret;
11918}
11919#endif
11920
11921
11922static int __iw_get_statistics(struct net_device *dev,
11923 struct iw_request_info *info,
11924 union iwreq_data *wrqu, char *extra)
11925{
11926
Anurag Chouhance0dc992016-02-16 18:18:03 +053011927 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011928 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011929 hdd_wext_state_t *pWextState;
11930 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
11931 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
11932 char *p = extra;
11933 int tlen = 0;
11934 tCsrSummaryStatsInfo *pStats = &(pAdapter->hdd_stats.summary_stat);
11935 tCsrGlobalClassAStatsInfo *aStats = &(pAdapter->hdd_stats.ClassA_stat);
11936 tCsrGlobalClassDStatsInfo *dStats = &(pAdapter->hdd_stats.ClassD_stat);
11937 int ret;
11938
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080011939 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011940
11941 ret = wlan_hdd_validate_context(hdd_ctx);
11942 if (0 != ret)
11943 return ret;
11944
Jeff Johnson441e1f72017-02-07 08:50:49 -080011945 ret = hdd_check_private_wext_control(hdd_ctx, info);
11946 if (0 != ret)
11947 return ret;
11948
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011949 if (eConnectionState_Associated !=
11950 (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) {
11951
11952 wrqu->txpower.value = 0;
11953 } else {
11954 status = sme_get_statistics(hdd_ctx->hHal, eCSR_HDD,
11955 SME_SUMMARY_STATS |
11956 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -080011957 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -070011958 hdd_statistics_cb,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011959 (WLAN_HDD_GET_STATION_CTX_PTR
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011960 (pAdapter))->conn_info.staId[0],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011961 pAdapter, pAdapter->sessionId);
11962
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053011963 if (QDF_STATUS_SUCCESS != status) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011964 hdd_err("Unable to retrieve SME statistics");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011965 return -EINVAL;
11966 }
11967
11968 pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
11969
Anurag Chouhance0dc992016-02-16 18:18:03 +053011970 qdf_status =
Anurag Chouhanf04e84f2016-03-03 10:12:12 +053011971 qdf_wait_single_event(&pWextState->hdd_qdf_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011972 WLAN_WAIT_TIME_STATS);
Anurag Chouhance0dc992016-02-16 18:18:03 +053011973 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070011974 hdd_err("SME timeout while retrieving statistics");
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011975 /* Remove the SME statistics list by
11976 * passing NULL in callback argument
11977 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011978 status = sme_get_statistics(hdd_ctx->hHal, eCSR_HDD,
11979 SME_SUMMARY_STATS |
11980 SME_GLOBAL_CLASSA_STATS |
Jeff Johnsondfe89512017-03-10 15:50:00 -080011981 SME_GLOBAL_CLASSD_STATS,
Naveen Rawatd0ca4412017-06-16 14:19:19 -070011982 NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011983 (WLAN_HDD_GET_STATION_CTX_PTR
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070011984 (pAdapter))->conn_info.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080011985 staId[0], pAdapter,
11986 pAdapter->sessionId);
11987
11988 return -EINVAL;
11989 }
11990 FILL_TLV(p, (uint8_t) WLAN_STATS_RETRY_CNT,
11991 (uint8_t) sizeof(pStats->retry_cnt),
11992 (char *)&(pStats->retry_cnt[0]), tlen);
11993
11994 FILL_TLV(p, (uint8_t) WLAN_STATS_MUL_RETRY_CNT,
11995 (uint8_t) sizeof(pStats->multiple_retry_cnt),
11996 (char *)&(pStats->multiple_retry_cnt[0]), tlen);
11997
11998 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_FRM_CNT,
11999 (uint8_t) sizeof(pStats->tx_frm_cnt),
12000 (char *)&(pStats->tx_frm_cnt[0]), tlen);
12001
12002 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_FRM_CNT,
12003 (uint8_t) sizeof(pStats->rx_frm_cnt),
12004 (char *)&(pStats->rx_frm_cnt), tlen);
12005
12006 FILL_TLV(p, (uint8_t) WLAN_STATS_FRM_DUP_CNT,
12007 (uint8_t) sizeof(pStats->frm_dup_cnt),
12008 (char *)&(pStats->frm_dup_cnt), tlen);
12009
12010 FILL_TLV(p, (uint8_t) WLAN_STATS_FAIL_CNT,
12011 (uint8_t) sizeof(pStats->fail_cnt),
12012 (char *)&(pStats->fail_cnt[0]), tlen);
12013
12014 FILL_TLV(p, (uint8_t) WLAN_STATS_RTS_FAIL_CNT,
12015 (uint8_t) sizeof(pStats->rts_fail_cnt),
12016 (char *)&(pStats->rts_fail_cnt), tlen);
12017
12018 FILL_TLV(p, (uint8_t) WLAN_STATS_ACK_FAIL_CNT,
12019 (uint8_t) sizeof(pStats->ack_fail_cnt),
12020 (char *)&(pStats->ack_fail_cnt), tlen);
12021
12022 FILL_TLV(p, (uint8_t) WLAN_STATS_RTS_SUC_CNT,
12023 (uint8_t) sizeof(pStats->rts_succ_cnt),
12024 (char *)&(pStats->rts_succ_cnt), tlen);
12025
12026 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_DISCARD_CNT,
12027 (uint8_t) sizeof(pStats->rx_discard_cnt),
12028 (char *)&(pStats->rx_discard_cnt), tlen);
12029
12030 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_ERROR_CNT,
12031 (uint8_t) sizeof(pStats->rx_error_cnt),
12032 (char *)&(pStats->rx_error_cnt), tlen);
12033
12034 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_BYTE_CNT,
12035 (uint8_t) sizeof(dStats->tx_uc_byte_cnt[0]),
12036 (char *)&(dStats->tx_uc_byte_cnt[0]), tlen);
12037
12038 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_BYTE_CNT,
12039 (uint8_t) sizeof(dStats->rx_byte_cnt),
12040 (char *)&(dStats->rx_byte_cnt), tlen);
12041
12042 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_RATE,
12043 (uint8_t) sizeof(dStats->rx_rate),
12044 (char *)&(dStats->rx_rate), tlen);
12045
12046 /* Transmit rate, in units of 500 kbit/sec */
12047 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_RATE,
12048 (uint8_t) sizeof(aStats->tx_rate),
12049 (char *)&(aStats->tx_rate), tlen);
12050
12051 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_UC_BYTE_CNT,
12052 (uint8_t) sizeof(dStats->rx_uc_byte_cnt[0]),
12053 (char *)&(dStats->rx_uc_byte_cnt[0]), tlen);
12054 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_MC_BYTE_CNT,
12055 (uint8_t) sizeof(dStats->rx_mc_byte_cnt),
12056 (char *)&(dStats->rx_mc_byte_cnt), tlen);
12057 FILL_TLV(p, (uint8_t) WLAN_STATS_RX_BC_BYTE_CNT,
12058 (uint8_t) sizeof(dStats->rx_bc_byte_cnt),
12059 (char *)&(dStats->rx_bc_byte_cnt), tlen);
12060 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_UC_BYTE_CNT,
12061 (uint8_t) sizeof(dStats->tx_uc_byte_cnt[0]),
12062 (char *)&(dStats->tx_uc_byte_cnt[0]), tlen);
12063 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_MC_BYTE_CNT,
12064 (uint8_t) sizeof(dStats->tx_mc_byte_cnt),
12065 (char *)&(dStats->tx_mc_byte_cnt), tlen);
12066 FILL_TLV(p, (uint8_t) WLAN_STATS_TX_BC_BYTE_CNT,
12067 (uint8_t) sizeof(dStats->tx_bc_byte_cnt),
12068 (char *)&(dStats->tx_bc_byte_cnt), tlen);
12069
12070 wrqu->data.length = tlen;
12071
12072 }
12073
12074 EXIT();
12075
12076 return 0;
12077}
12078
12079static int iw_get_statistics(struct net_device *dev,
12080 struct iw_request_info *info,
12081 union iwreq_data *wrqu, char *extra)
12082{
12083 int ret;
12084
12085 cds_ssr_protect(__func__);
12086 ret = __iw_get_statistics(dev, info, wrqu, extra);
12087 cds_ssr_unprotect(__func__);
12088
12089 return ret;
12090}
12091
12092#ifdef FEATURE_WLAN_SCAN_PNO
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012093/*Max Len for PNO notification*/
12094#define MAX_PNO_NOTIFY_LEN 100
Abhishek Singh0481d662017-04-11 18:20:11 +053012095static void found_pref_network_cb(struct wlan_objmgr_vdev *vdev,
12096 struct scan_event *event, void *args)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012097{
Abhishek Singh0481d662017-04-11 18:20:11 +053012098 struct vdev_osif_priv *osif_priv;
12099 struct wireless_dev *wdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012100 union iwreq_data wrqu;
12101 char buf[MAX_PNO_NOTIFY_LEN + 1];
12102
Abhishek Singh0481d662017-04-11 18:20:11 +053012103 wlan_vdev_obj_lock(vdev);
12104 osif_priv = wlan_vdev_get_ospriv(vdev);
12105 wlan_vdev_obj_unlock(vdev);
12106 if (!osif_priv) {
12107 hdd_err("osif_priv is null");
12108 return;
12109 }
12110
12111 wdev = osif_priv->wdev;
12112 if (!wdev) {
12113 hdd_err("wdev is null");
12114 return;
12115 }
12116
12117 hdd_debug("A preferred network was found");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012118
12119 /* create the event */
Abhishek Singh0481d662017-04-11 18:20:11 +053012120 qdf_mem_zero(&wrqu, sizeof(wrqu));
12121 qdf_mem_zero(buf, sizeof(buf));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012122
12123 snprintf(buf, MAX_PNO_NOTIFY_LEN,
Abhishek Singh0481d662017-04-11 18:20:11 +053012124 "QCOM: Found preferred network:");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012125
12126 wrqu.data.pointer = buf;
12127 wrqu.data.length = strlen(buf);
12128
12129 /* send the event */
12130
Abhishek Singh0481d662017-04-11 18:20:11 +053012131 wireless_send_event(wdev->netdev, IWEVCUSTOM, &wrqu, buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012132}
12133
12134/**
12135 * __iw_set_pno() - Preferred Network Offload ioctl handler
12136 * @dev: device upon which the ioctl was received
12137 * @info: ioctl request information
12138 * @wrqu: ioctl request data
12139 * @extra: ioctl extra data
12140 *
12141 * This function parses a Preferred Network Offload command
12142 * Input is string based and expected to be of the form:
12143 *
12144 * <enable(1) | disable(0)>
12145 * when enabling:
12146 * <number of networks>
12147 * for each network:
12148 * <ssid_len> <ssid> <authentication> <encryption>
12149 * <ch_num> <channel_list optional> <bcast_type> <rssi_threshold>
Dustin Brown43e87292016-10-10 10:38:25 -070012150 * <scan_time (seconds)>
12151 * <scan_repeat_count (0 means indefinite)>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012152 * <suspend mode>
12153 *
12154 * e.g:
Dustin Brown43e87292016-10-10 10:38:25 -070012155 * 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 -080012156 *
12157 * this translates into:
12158 * -----------------------------
12159 * enable PNO
12160 * 2 networks
12161 * Network 1:
12162 * test - with authentication type 0 and encryption type 0,
12163 * search on 3 channels: 1 6 and 11,
12164 * SSID bcast type is unknown (directed probe will be sent if
12165 * AP not found) and must meet -40dBm RSSI
12166 * Network 2:
12167 * test2 - with authentication type 4 and encryption type 4,
12168 * search on 6 channels 1, 2, 3, 4, 5 and 6
12169 * bcast type is non-bcast (directed probe will be sent)
12170 * and must not meet any RSSI threshold
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012171 * scan every 5 seconds 2 times
Dustin Brown43e87292016-10-10 10:38:25 -070012172 * enable on suspend
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012173 */
12174static int __iw_set_pno(struct net_device *dev,
12175 struct iw_request_info *info,
12176 union iwreq_data *wrqu, char *extra)
12177{
12178 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
12179 hdd_context_t *hdd_ctx;
Abhishek Singh0481d662017-04-11 18:20:11 +053012180 uint8_t value;
12181 struct wlan_objmgr_vdev *vdev;
12182 struct wlan_objmgr_psoc *psoc;
12183 int ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012184 int offset;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012185 char *ptr, *data;
Abhishek Singh0481d662017-04-11 18:20:11 +053012186 uint8_t i, j, params;
12187 QDF_STATUS status;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012188 size_t len;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012189
12190 /* request is a large struct, so we make it static to avoid
12191 * stack overflow. This API is only invoked via ioctl, so it
12192 * is serialized by the kernel rtnl_lock and hence does not
12193 * need to be reentrant
12194 */
Abhishek Singh0481d662017-04-11 18:20:11 +053012195 static struct pno_scan_req_params req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012196
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012197 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012198
12199 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12200 ret = wlan_hdd_validate_context(hdd_ctx);
12201 if (ret)
12202 return ret;
12203
Jeff Johnson441e1f72017-02-07 08:50:49 -080012204 ret = hdd_check_private_wext_control(hdd_ctx, info);
12205 if (0 != ret)
12206 return ret;
12207
Abhishek Singh0481d662017-04-11 18:20:11 +053012208 vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(hdd_ctx->hdd_pdev,
12209 dev->dev_addr, WLAN_LEGACY_MAC_ID);
12210 if (!vdev) {
12211 hdd_err("vdev object is NULL");
12212 return -EIO;
12213 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012214
Abhishek Singh0481d662017-04-11 18:20:11 +053012215 hdd_debug("PNO data len %d data %s", wrqu->data.length, extra);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012216
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012217 /* making sure argument string ends with '\0' */
12218 len = (wrqu->data.length + 1);
12219 data = qdf_mem_malloc(len);
12220 if (!data) {
12221 hdd_err("fail to allocate memory %zu", len);
12222 return -EINVAL;
12223 }
12224 qdf_mem_copy(data, extra, (len-1));
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012225 ptr = data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012226
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012227 if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012228 hdd_err("PNO enable input is not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012229 ret = -EINVAL;
12230 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012231 }
12232
Abhishek Singh0481d662017-04-11 18:20:11 +053012233 if (!value) {
12234 status = ucfg_scan_pno_stop(vdev);
12235 if (QDF_IS_STATUS_ERROR(status)) {
12236 hdd_err("Failed to disabled PNO");
12237 ret = -EINVAL;
12238 } else {
12239 hdd_debug("PNO scan disabled");
12240 }
12241 goto exit;
12242 }
12243
12244 if (ucfg_scan_get_pno_in_progress(vdev)) {
12245 hdd_debug("pno is already in progress");
12246 ret = -EBUSY;
12247 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012248 }
12249
12250 ptr += offset;
12251
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012252 if (1 != sscanf(ptr, " %hhu %n", &value, &offset)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012253 hdd_err("PNO count input not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012254 ret = -EINVAL;
12255 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012256 }
Abhishek Singh0481d662017-04-11 18:20:11 +053012257 req.networks_cnt = value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012258
Abhishek Singh0481d662017-04-11 18:20:11 +053012259 hdd_debug("PNO enable networks count %d offset %d",
12260 req.networks_cnt, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012261
Abhishek Singh0481d662017-04-11 18:20:11 +053012262 if ((0 == req.networks_cnt) ||
12263 (req.networks_cnt > SCAN_PNO_MAX_SUPP_NETWORKS)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012264 hdd_err("Network count %d invalid",
Abhishek Singh0481d662017-04-11 18:20:11 +053012265 req.networks_cnt);
12266 ret = -EINVAL;
12267 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012268 }
12269
12270 ptr += offset;
12271
Abhishek Singh0481d662017-04-11 18:20:11 +053012272 for (i = 0; i < req.networks_cnt; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012273
Abhishek Singh0481d662017-04-11 18:20:11 +053012274 req.networks_list[i].ssid.length = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012275
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012276 params = sscanf(ptr, " %hhu %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012277 &(req.networks_list[i].ssid.length),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012278 &offset);
12279
12280 if (1 != params) {
12281 hdd_err("PNO ssid length input is not valid %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012282 ret = -EINVAL;
12283 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012284 }
12285
Abhishek Singh0481d662017-04-11 18:20:11 +053012286 if ((0 == req.networks_list[i].ssid.length) ||
12287 (req.networks_list[i].ssid.length > 32)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012288 hdd_err("SSID Len %d is not correct for network %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012289 req.networks_list[i].ssid.length, i);
12290 ret = -EINVAL;
12291 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012292 }
12293
12294 /* Advance to SSID */
12295 ptr += offset;
12296
Abhishek Singh0481d662017-04-11 18:20:11 +053012297 memcpy(req.networks_list[i].ssid.ssid, ptr,
12298 req.networks_list[i].ssid.length);
12299 ptr += req.networks_list[i].ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012300
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012301 params = sscanf(ptr, " %u %u %hhu %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012302 &(req.networks_list[i].authentication),
12303 &(req.networks_list[i].encryption),
12304 &(req.networks_list[i].channel_cnt),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012305 &offset);
12306
12307 if (3 != params) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012308 hdd_err("Incorrect cmd %s", ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012309 ret = -EINVAL;
12310 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012311 }
12312
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012313 hdd_debug("PNO len %d ssid %.*s auth %d encry %d channel count %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012314 req.networks_list[i].ssid.length,
12315 req.networks_list[i].ssid.length,
12316 req.networks_list[i].ssid.ssid,
12317 req.networks_list[i].authentication,
12318 req.networks_list[i].encryption,
12319 req.networks_list[i].channel_cnt, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012320
12321 /* Advance to channel list */
12322 ptr += offset;
12323
Abhishek Singh0481d662017-04-11 18:20:11 +053012324 if (SCAN_PNO_MAX_NETW_CHANNELS_EX <
12325 req.networks_list[i].channel_cnt) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012326 hdd_err("Incorrect number of channels");
Abhishek Singh0481d662017-04-11 18:20:11 +053012327 ret = -EINVAL;
12328 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012329 }
12330
Abhishek Singh0481d662017-04-11 18:20:11 +053012331 if (0 != req.networks_list[i].channel_cnt) {
12332 for (j = 0; j < req.networks_list[i].channel_cnt;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012333 j++) {
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012334 if (1 != sscanf(ptr, " %hhu %n", &value,
Abhishek Singh0481d662017-04-11 18:20:11 +053012335 &offset)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012336 hdd_err("PNO network channel is not valid %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012337 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012338 ret = -EINVAL;
12339 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012340 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012341 if (!IS_CHANNEL_VALID(value)) {
12342 hdd_err("invalid channel: %hhu", value);
12343 ret = -EINVAL;
12344 goto exit;
12345 }
Abhishek Singh0481d662017-04-11 18:20:11 +053012346 req.networks_list[i].channels[j] =
12347 cds_chan_to_freq(value);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012348 /* Advance to next channel number */
12349 ptr += offset;
12350 }
12351 }
12352
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012353 if (1 != sscanf(ptr, " %u %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012354 &(req.networks_list[i].bc_new_type),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012355 &offset)) {
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012356 hdd_err("PNO broadcast network type is not valid %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012357 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012358 ret = -EINVAL;
12359 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012360 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012361 if (req.networks_list[i].bc_new_type > 2) {
12362 hdd_err("invalid bcast nw type: %u",
12363 req.networks_list[i].bc_new_type);
12364 ret = -EINVAL;
12365 goto exit;
12366 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012367
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012368 hdd_debug("PNO bcastNetwType %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012369 req.networks_list[i].bc_new_type, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012370
12371 /* Advance to rssi Threshold */
12372 ptr += offset;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012373 if (1 != sscanf(ptr, " %d %n",
Abhishek Singh0481d662017-04-11 18:20:11 +053012374 &(req.networks_list[i].rssi_thresh),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012375 &offset)) {
12376 hdd_err("PNO rssi threshold input is not valid %s",
12377 ptr);
Abhishek Singh0481d662017-04-11 18:20:11 +053012378 ret = -EINVAL;
12379 goto exit;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012380 }
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012381 hdd_debug("PNO rssi %d offset %d",
Abhishek Singh0481d662017-04-11 18:20:11 +053012382 req.networks_list[i].rssi_thresh, offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012383 /* Advance to next network */
12384 ptr += offset;
12385 } /* For ucNetworkCount */
12386
Abhishek Singh0481d662017-04-11 18:20:11 +053012387 req.fast_scan_period = 0;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012388 if (sscanf(ptr, " %u %n", &(req.fast_scan_period), &offset) > 0) {
Abhishek Singh0481d662017-04-11 18:20:11 +053012389 req.fast_scan_period *= MSEC_PER_SEC;
Dustin Brown43e87292016-10-10 10:38:25 -070012390 ptr += offset;
12391 }
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012392 if (req.fast_scan_period == 0) {
12393 hdd_err("invalid fast scan period %u",
12394 req.fast_scan_period);
12395 ret = -EINVAL;
12396 goto exit;
12397 }
Dustin Brown43e87292016-10-10 10:38:25 -070012398
Abhishek Singh0481d662017-04-11 18:20:11 +053012399 req.fast_scan_max_cycles = 0;
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012400 if (sscanf(ptr, " %hhu %n", &value,
Dustin Brown43e87292016-10-10 10:38:25 -070012401 &offset) > 0)
12402 ptr += offset;
Abhishek Singh0481d662017-04-11 18:20:11 +053012403 req.fast_scan_max_cycles = value;
Dustin Brown43e87292016-10-10 10:38:25 -070012404
Abhishek Singh0481d662017-04-11 18:20:11 +053012405 wlan_pdev_obj_lock(hdd_ctx->hdd_pdev);
12406 psoc = wlan_pdev_get_psoc(hdd_ctx->hdd_pdev);
12407 wlan_pdev_obj_unlock(hdd_ctx->hdd_pdev);
12408 ucfg_scan_register_pno_cb(psoc,
12409 found_pref_network_cb, NULL);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012410
Abhishek Singh0481d662017-04-11 18:20:11 +053012411 ucfg_scan_get_pno_def_params(vdev, &req);
12412 status = ucfg_scan_pno_start(vdev, &req);
12413 if (QDF_IS_STATUS_ERROR(status)) {
12414 hdd_err("Failed to enable PNO");
12415 ret = -EINVAL;
12416 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012417
Abhishek Singh0481d662017-04-11 18:20:11 +053012418exit:
12419 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012420
Hanumanth Reddy Pothula6310c772017-01-16 14:19:21 +053012421 qdf_mem_free(data);
Abhishek Singh0481d662017-04-11 18:20:11 +053012422 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012423}
12424
12425static int iw_set_pno(struct net_device *dev,
12426 struct iw_request_info *info,
12427 union iwreq_data *wrqu, char *extra)
12428{
12429 int ret;
12430
12431 cds_ssr_protect(__func__);
12432 ret = __iw_set_pno(dev, info, wrqu, extra);
12433 cds_ssr_unprotect(__func__);
12434
12435 return ret;
12436}
12437#endif /* FEATURE_WLAN_SCAN_PNO */
12438
12439/* Common function to SetBand */
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012440int hdd_reg_set_band(struct net_device *dev, u8 ui_band)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012441{
12442 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
12443 tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012444 enum band_info band;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012445
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053012446 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012447 hdd_context_t *pHddCtx;
12448 hdd_adapter_list_node_t *pAdapterNode, *pNext;
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012449 enum band_info currBand;
12450 enum band_info connectedBand;
12451 long lrc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012452
12453 pAdapterNode = NULL;
12454 pNext = NULL;
12455 pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
12456
12457 switch (ui_band) {
12458 case WLAN_HDD_UI_BAND_AUTO:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012459 band = BAND_ALL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012460 break;
12461 case WLAN_HDD_UI_BAND_5_GHZ:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012462 band = BAND_5G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012463 break;
12464 case WLAN_HDD_UI_BAND_2_4_GHZ:
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012465 band = BAND_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012466 break;
12467 default:
Jeff Johnson99bac312016-06-28 10:38:18 -070012468 hdd_err("Invalid band value %u", ui_band);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012469 return -EINVAL;
12470 }
12471
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012472 hdd_debug("change band to %u", band);
12473
12474 if ((band == BAND_2G && pHddCtx->config->nBandCapability == 2) ||
12475 (band == BAND_5G && pHddCtx->config->nBandCapability == 1)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070012476 hdd_err("band value %u violate INI settings %u",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012477 band, pHddCtx->config->nBandCapability);
12478 return -EIO;
12479 }
12480
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012481 if (band == BAND_ALL) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012482 hdd_debug("Auto band received. Setting band same as ini value %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012483 pHddCtx->config->nBandCapability);
12484 band = pHddCtx->config->nBandCapability;
12485 }
12486
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012487 if (QDF_STATUS_SUCCESS != ucfg_reg_get_curr_band(pHddCtx->hdd_pdev,
12488 &currBand)) {
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012489 hdd_debug("Failed to get current band config");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012490 return -EIO;
12491 }
12492
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012493 if (currBand == band)
12494 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012495
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012496 /* Change band request received.
12497 * Abort pending scan requests, flush the existing scan results,
12498 * and change the band capability
12499 */
12500 hdd_debug("Current band value = %u, new setting %u ",
12501 currBand, band);
12502
12503 status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
12504 while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
12505 pAdapter = pAdapterNode->pAdapter;
12506 hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
12507 wlan_abort_scan(pHddCtx->hdd_pdev, INVAL_PDEV_ID,
Abhishek Singh69ccb512017-04-25 11:58:16 +053012508 pAdapter->sessionId, INVALID_SCAN_ID, false);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012509 connectedBand = hdd_conn_get_connected_band(
12510 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012511
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012512 /* Handling is done only for STA and P2P */
12513 if (band != BAND_ALL &&
12514 ((pAdapter->device_mode == QDF_STA_MODE) ||
12515 (pAdapter->device_mode == QDF_P2P_CLIENT_MODE)) &&
12516 (hdd_conn_is_connected(
12517 WLAN_HDD_GET_STATION_CTX_PTR(pAdapter)))
12518 && (connectedBand != band)) {
12519 status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012520
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012521 /* STA already connected on current
12522 * band, So issue disconnect first,
12523 * then change the band
12524 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012525
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012526 hdd_debug("STA (Device mode %s(%d)) connected in band %u, Changing band to %u, Issuing Disconnect",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012527 hdd_device_mode_to_string(pAdapter->device_mode),
12528 pAdapter->device_mode, currBand, band);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012529 INIT_COMPLETION(pAdapter->disconnect_comp_var);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012530
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012531 status = sme_roam_disconnect(
12532 WLAN_HDD_GET_HAL_CTX(pAdapter),
12533 pAdapter->sessionId,
12534 eCSR_DISCONNECT_REASON_UNSPECIFIED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012535
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012536 if (QDF_STATUS_SUCCESS != status) {
12537 hdd_err("sme_roam_disconnect failure, status: %d",
Jeff Johnson99bac312016-06-28 10:38:18 -070012538 (int)status);
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012539 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012540 }
12541
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012542 lrc = wait_for_completion_timeout(
12543 &pAdapter->disconnect_comp_var,
12544 msecs_to_jiffies(
12545 WLAN_WAIT_TIME_DISCONNECT));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012546
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012547 if (lrc == 0) {
12548 hdd_err("Timeout while waiting for csr_roam_disconnect");
12549 return -ETIMEDOUT;
12550 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012551 }
12552
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012553 sme_scan_flush_result(hHal);
12554
12555 status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
12556 pAdapterNode = pNext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012557 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012558
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012559 if (QDF_STATUS_SUCCESS !=
12560 ucfg_reg_set_band(pHddCtx->hdd_pdev, band)) {
12561 hdd_err("Failed to set the band value to %u",
12562 band);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012563 return -EINVAL;
12564 }
12565
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012566 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012567}
12568
12569static int __iw_set_band_config(struct net_device *dev,
12570 struct iw_request_info *info,
12571 union iwreq_data *wrqu, char *extra)
12572{
Jeff Johnson441e1f72017-02-07 08:50:49 -080012573 hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
12574 hdd_context_t *hdd_ctx;
12575 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012576 int *value = (int *)extra;
12577
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012578 ENTER_DEV(dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012579
Mukul Sharmaa5fe1982015-11-02 19:28:14 +053012580 if (!capable(CAP_NET_ADMIN)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070012581 hdd_err("permission check failed");
Mukul Sharmaa5fe1982015-11-02 19:28:14 +053012582 return -EPERM;
12583 }
12584
Jeff Johnson441e1f72017-02-07 08:50:49 -080012585 hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12586 ret = hdd_check_private_wext_control(hdd_ctx, info);
12587 if (0 != ret)
12588 return ret;
12589
Kiran Kumar Lokereb1d412e2017-04-23 17:19:43 -070012590 return hdd_reg_set_band(dev, value[0]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012591}
12592
12593static int iw_set_band_config(struct net_device *dev,
12594 struct iw_request_info *info,
12595 union iwreq_data *wrqu, char *extra)
12596{
12597 int ret;
12598
12599 cds_ssr_protect(__func__);
12600 ret = __iw_set_band_config(dev, info, wrqu, extra);
12601 cds_ssr_unprotect(__func__);
12602
12603 return ret;
12604}
12605
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012606/**
12607 * wlan_hdd_set_mon_chan() - Set capture channel on the monitor mode interface.
12608 * @adapter: Handle to adapter
12609 * @chan: Monitor mode channel
12610 * @bandwidth: Capture channel bandwidth
12611 *
12612 * Return: 0 on success else error code.
12613 */
12614static int wlan_hdd_set_mon_chan(hdd_adapter_t *adapter, uint32_t chan,
12615 uint32_t bandwidth)
12616{
12617 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
12618 hdd_station_ctx_t *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
12619 struct hdd_mon_set_ch_info *ch_info = &sta_ctx->ch_info;
12620 QDF_STATUS status;
12621 tHalHandle hal_hdl = hdd_ctx->hHal;
12622 struct qdf_mac_addr bssid;
12623 tCsrRoamProfile roam_profile;
Amar Singhal5cccafe2017-02-15 12:42:58 -080012624 struct ch_params ch_params;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012625
12626 if (QDF_GLOBAL_MONITOR_MODE != hdd_get_conparam()) {
12627 hdd_err("Not supported, device is not in monitor mode");
12628 return -EINVAL;
12629 }
12630
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012631 hdd_debug("Set monitor mode Channel %d", chan);
Hong Shie531d1f2016-11-14 14:08:03 +080012632 qdf_mem_zero(&roam_profile, sizeof(roam_profile));
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012633 roam_profile.ChannelInfo.ChannelList = &ch_info->channel;
12634 roam_profile.ChannelInfo.numOfChannels = 1;
12635 roam_profile.phyMode = ch_info->phy_mode;
12636 roam_profile.ch_params.ch_width = bandwidth;
Naveen Rawatc77e6e72016-08-05 15:19:03 -070012637 hdd_select_cbmode(adapter, chan, &roam_profile.ch_params);
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012638
12639 qdf_mem_copy(bssid.bytes, adapter->macAddressCurrent.bytes,
12640 QDF_MAC_ADDR_SIZE);
12641
12642 ch_params.ch_width = bandwidth;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012643 wlan_reg_set_channel_params(hdd_ctx->hdd_pdev, chan, 0, &ch_params);
Manjunathappa Prakashc4dc9382017-03-07 18:50:33 -080012644 if (ch_params.ch_width == CH_WIDTH_INVALID) {
12645 hdd_err("Invalid capture channel or bandwidth for a country");
12646 return -EINVAL;
12647 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070012648
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012649 status = sme_roam_channel_change_req(hal_hdl, bssid, &ch_params,
12650 &roam_profile);
12651 if (status) {
12652 hdd_err("Status: %d Failed to set sme_roam Channel for monitor mode",
12653 status);
12654 }
12655
12656 return qdf_status_to_os_return(status);
12657}
12658
Dustin Brown8d2d0f52017-04-03 17:02:08 -070012659static int printk_adapter(void *priv, const char *fmt, ...)
12660{
12661 int ret;
12662 va_list args;
12663
12664 va_start(args, fmt);
12665 ret = vprintk(fmt, args);
12666 ret += printk("\n");
12667 va_end(args);
12668
12669 return ret;
12670}
12671
12672#ifdef WMI_INTERFACE_EVENT_LOGGING
12673static void hdd_ioctl_log_buffer(int log_id, uint32_t count)
12674{
12675 qdf_abstract_print *print = &printk_adapter;
12676
12677 switch (log_id) {
12678 case HTC_CREDIT_HISTORY_LOG:
12679 print(NULL, "HTC Credit History (count %u)", count);
12680 cds_print_htc_credit_history(count, print, NULL);
12681 break;
12682 case COMMAND_LOG:
12683 print(NULL, "Command Log (count %u)", count);
12684 wma_print_wmi_cmd_log(count, print, NULL);
12685 break;
12686 case COMMAND_TX_CMP_LOG:
12687 print(NULL, "Command Tx Complete Log (count %u)", count);
12688 wma_print_wmi_cmd_tx_cmp_log(count, print, NULL);
12689 break;
12690 case MGMT_COMMAND_LOG:
12691 print(NULL, "Management Command Log (count %u)", count);
12692 wma_print_wmi_mgmt_cmd_log(count, print, NULL);
12693 break;
12694 case MGMT_COMMAND_TX_CMP_LOG:
12695 print(NULL, "Management Command Tx Complete Log (count %u)",
12696 count);
12697 wma_print_wmi_mgmt_cmd_tx_cmp_log(count, print, NULL);
12698 break;
12699 case EVENT_LOG:
12700 print(NULL, "Event Log (count %u)", count);
12701 wma_print_wmi_event_log(count, print, NULL);
12702 break;
12703 case RX_EVENT_LOG:
12704 print(NULL, "Rx Event Log (count %u)", count);
12705 wma_print_wmi_rx_event_log(count, print, NULL);
12706 break;
12707 case MGMT_EVENT_LOG:
12708 print(NULL, "Management Event Log (count %u)", count);
12709 wma_print_wmi_mgmt_event_log(count, print, NULL);
12710 break;
12711 default:
12712 print(NULL, "Invalid Log Id %d", log_id);
12713 break;
12714 }
12715}
12716#else
12717static inline void hdd_ioctl_log_buffer(int log_id, uint32_t count)
12718{
12719}
12720#endif /* WMI_INTERFACE_EVENT_LOGGING */
12721
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012722static int __iw_set_two_ints_getnone(struct net_device *dev,
12723 struct iw_request_info *info,
12724 union iwreq_data *wrqu, char *extra)
12725{
12726 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
12727 int *value = (int *)extra;
12728 int sub_cmd = value[0];
12729 int ret;
12730 hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
12731
Jeff Johnson6ee91ee2016-02-11 18:55:30 -080012732 ENTER_DEV(dev);
12733
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012734 ret = wlan_hdd_validate_context(hdd_ctx);
12735 if (0 != ret)
12736 return ret;
12737
Jeff Johnson441e1f72017-02-07 08:50:49 -080012738 ret = hdd_check_private_wext_control(hdd_ctx, info);
12739 if (0 != ret)
12740 return ret;
12741
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012742 switch (sub_cmd) {
12743 case WE_SET_SMPS_PARAM:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012744 hdd_debug("WE_SET_SMPS_PARAM val %d %d", value[1], value[2]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012745 ret = wma_cli_set_command(pAdapter->sessionId,
12746 WMI_STA_SMPS_PARAM_CMDID,
12747 value[1] << WMA_SMPS_PARAM_VALUE_S
12748 | value[2],
12749 VDEV_CMD);
12750 break;
Srinivas Girigowda6147c582016-10-18 12:26:15 -070012751#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012752 case WE_SET_FW_CRASH_INJECT:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012753 hdd_debug("WE_SET_FW_CRASH_INJECT: %d %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012754 value[1], value[2]);
DARAM SUDHA7e7e91b2015-05-29 11:38:47 +053012755 pr_err("SSR is triggered by iwpriv CRASH_INJECT: %d %d\n",
12756 value[1], value[2]);
Yue Ma06152352017-06-20 18:08:58 -070012757 if (value[1] == 3) {
12758 cds_trigger_recovery(false);
12759 return 0;
12760 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012761 ret = wma_cli_set2_command(pAdapter->sessionId,
12762 GEN_PARAM_CRASH_INJECT,
12763 value[1], value[2], GEN_CMD);
12764 break;
12765#endif
Govind Singha471e5e2015-10-12 17:11:14 +053012766 case WE_ENABLE_FW_PROFILE:
Jeff Johnson99bac312016-06-28 10:38:18 -070012767 hdd_err("WE_ENABLE_FW_PROFILE: %d %d",
Govind Singha471e5e2015-10-12 17:11:14 +053012768 value[1], value[2]);
12769 ret = wma_cli_set2_command(pAdapter->sessionId,
12770 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
12771 value[1], value[2], DBG_CMD);
12772 break;
12773 case WE_SET_FW_PROFILE_HIST_INTVL:
Jeff Johnson99bac312016-06-28 10:38:18 -070012774 hdd_err("WE_SET_FW_PROFILE_HIST_INTVL: %d %d",
Govind Singha471e5e2015-10-12 17:11:14 +053012775 value[1], value[2]);
12776 ret = wma_cli_set2_command(pAdapter->sessionId,
12777 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
12778 value[1], value[2], DBG_CMD);
12779 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012780 case WE_SET_DUAL_MAC_FW_MODE_CONFIG:
12781 hdd_debug("Ioctl to set dual fw mode config");
12782 if (hdd_ctx->config->dual_mac_feature_disable) {
12783 hdd_err("Dual mac feature is disabled from INI");
12784 return -EPERM;
12785 }
12786 hdd_debug("%d %d", value[1], value[2]);
Tushnim Bhattacharyyade1070d2017-03-09 13:23:55 -080012787 policy_mgr_set_dual_mac_fw_mode_config(hdd_ctx->hdd_psoc,
12788 value[1], value[2]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012789 break;
12790 case WE_DUMP_DP_TRACE_LEVEL:
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080012791 hdd_debug("WE_DUMP_DP_TRACE_LEVEL: %d %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012792 value[1], value[2]);
12793 if (value[1] == DUMP_DP_TRACE)
Venkata Sharath Chandra Manchala0b9fc632017-05-15 14:35:15 -070012794 qdf_dp_trace_dump_all(value[2],
12795 QDF_TRACE_DEFAULT_PDEV_ID);
Nirav Shah0d58a7e2016-04-26 22:54:12 +053012796 else if (value[1] == ENABLE_DP_TRACE_LIVE_MODE)
12797 qdf_dp_trace_enable_live_mode();
Nirav Shahda008342016-05-17 18:50:40 +053012798 else if (value[1] == CLEAR_DP_TRACE_BUFFER)
12799 qdf_dp_trace_clear_buffer();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012800 break;
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070012801 case WE_SET_MON_MODE_CHAN:
12802 ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]);
12803 break;
Dustin Brown54096432017-02-23 13:00:44 -080012804 case WE_SET_WLAN_SUSPEND: {
Dustin Brown3ed3e9b2017-03-23 12:57:58 -070012805 hdd_info("STA unit-test suspend(%d, %d)", value[1], value[2]);
Dustin Brown54096432017-02-23 13:00:44 -080012806 ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev,
12807 value[1], value[2]);
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012808 break;
Dustin Brown54096432017-02-23 13:00:44 -080012809 }
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012810 case WE_SET_WLAN_RESUME:
Dustin Brownbc81a472016-10-26 16:56:59 -070012811 ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy, dev);
Rajeev Kumara78a0a42016-07-13 19:28:20 -070012812 break;
Dustin Brown8d2d0f52017-04-03 17:02:08 -070012813 case WE_LOG_BUFFER: {
12814 int log_id = value[1];
12815 uint32_t count = value[2] < 0 ? 0 : value[2];
12816
12817 hdd_ioctl_log_buffer(log_id, count);
12818
12819 break;
12820 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012821 default:
Jeff Johnson99bac312016-06-28 10:38:18 -070012822 hdd_err("Invalid IOCTL command %d", sub_cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012823 break;
12824 }
12825
12826 return ret;
12827}
12828
12829static int iw_set_two_ints_getnone(struct net_device *dev,
12830 struct iw_request_info *info,
12831 union iwreq_data *wrqu, char *extra)
12832{
12833 int ret;
12834
12835 cds_ssr_protect(__func__);
12836 ret = __iw_set_two_ints_getnone(dev, info, wrqu, extra);
12837 cds_ssr_unprotect(__func__);
12838
12839 return ret;
12840}
12841
12842/* Define the Wireless Extensions to the Linux Network Device structure */
12843/* A number of these routines are NULL (meaning they are not implemented.) */
12844
12845static const iw_handler we_handler[] = {
12846 (iw_handler) iw_set_commit, /* SIOCSIWCOMMIT */
12847 (iw_handler) iw_get_name, /* SIOCGIWNAME */
12848 (iw_handler) NULL, /* SIOCSIWNWID */
12849 (iw_handler) NULL, /* SIOCGIWNWID */
12850 (iw_handler) iw_set_freq, /* SIOCSIWFREQ */
12851 (iw_handler) iw_get_freq, /* SIOCGIWFREQ */
12852 (iw_handler) iw_set_mode, /* SIOCSIWMODE */
12853 (iw_handler) iw_get_mode, /* SIOCGIWMODE */
12854 (iw_handler) NULL, /* SIOCSIWSENS */
12855 (iw_handler) NULL, /* SIOCGIWSENS */
12856 (iw_handler) NULL, /* SIOCSIWRANGE */
12857 (iw_handler) iw_get_range, /* SIOCGIWRANGE */
12858 (iw_handler) NULL, /* SIOCSIWPRIV */
12859 (iw_handler) NULL, /* SIOCGIWPRIV */
12860 (iw_handler) NULL, /* SIOCSIWSTATS */
12861 (iw_handler) NULL, /* SIOCGIWSTATS */
12862 (iw_handler) NULL, /* SIOCSIWSPY */
12863 (iw_handler) NULL, /* SIOCGIWSPY */
12864 (iw_handler) NULL, /* SIOCSIWTHRSPY */
12865 (iw_handler) NULL, /* SIOCGIWTHRSPY */
12866 (iw_handler) iw_set_ap_address, /* SIOCSIWAP */
12867 (iw_handler) iw_get_ap_address, /* SIOCGIWAP */
12868 (iw_handler) iw_set_mlme, /* SIOCSIWMLME */
12869 (iw_handler) NULL, /* SIOCGIWAPLIST */
Sandeep Puligillad0004212017-02-26 18:34:56 -080012870 (iw_handler) NULL, /* SIOCSIWSCAN */
12871 (iw_handler) NULL, /* SIOCGIWSCAN */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012872 (iw_handler) iw_set_essid, /* SIOCSIWESSID */
12873 (iw_handler) iw_get_essid, /* SIOCGIWESSID */
12874 (iw_handler) iw_set_nick, /* SIOCSIWNICKN */
12875 (iw_handler) iw_get_nick, /* SIOCGIWNICKN */
12876 (iw_handler) NULL, /* -- hole -- */
12877 (iw_handler) NULL, /* -- hole -- */
12878 (iw_handler) iw_set_bitrate, /* SIOCSIWRATE */
12879 (iw_handler) iw_get_bitrate, /* SIOCGIWRATE */
12880 (iw_handler) iw_set_rts_threshold, /* SIOCSIWRTS */
12881 (iw_handler) iw_get_rts_threshold, /* SIOCGIWRTS */
12882 (iw_handler) iw_set_frag_threshold, /* SIOCSIWFRAG */
12883 (iw_handler) iw_get_frag_threshold, /* SIOCGIWFRAG */
12884 (iw_handler) iw_set_tx_power, /* SIOCSIWTXPOW */
12885 (iw_handler) iw_get_tx_power, /* SIOCGIWTXPOW */
12886 (iw_handler) iw_set_retry, /* SIOCSIWRETRY */
12887 (iw_handler) iw_get_retry, /* SIOCGIWRETRY */
12888 (iw_handler) iw_set_encode, /* SIOCSIWENCODE */
12889 (iw_handler) iw_get_encode, /* SIOCGIWENCODE */
12890 (iw_handler) iw_set_power_mode, /* SIOCSIWPOWER */
12891 (iw_handler) iw_get_power_mode, /* SIOCGIWPOWER */
12892 (iw_handler) NULL, /* -- hole -- */
12893 (iw_handler) NULL, /* -- hole -- */
12894 (iw_handler) iw_set_genie, /* SIOCSIWGENIE */
12895 (iw_handler) iw_get_genie, /* SIOCGIWGENIE */
12896 (iw_handler) iw_set_auth, /* SIOCSIWAUTH */
12897 (iw_handler) iw_get_auth, /* SIOCGIWAUTH */
12898 (iw_handler) iw_set_encodeext, /* SIOCSIWENCODEEXT */
12899 (iw_handler) iw_get_encodeext, /* SIOCGIWENCODEEXT */
12900 (iw_handler) NULL, /* SIOCSIWPMKSA */
12901};
12902
12903static const iw_handler we_private[] = {
12904
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012905 [WLAN_PRIV_SET_INT_GET_NONE - SIOCIWFIRSTPRIV] = iw_setint_getnone,
12906 [WLAN_PRIV_SET_NONE_GET_INT - SIOCIWFIRSTPRIV] = iw_setnone_getint,
12907 [WLAN_PRIV_SET_CHAR_GET_NONE - SIOCIWFIRSTPRIV] = iw_setchar_getnone,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012908 [WLAN_PRIV_SET_THREE_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12909 iw_set_three_ints_getnone,
12910 [WLAN_PRIV_GET_CHAR_SET_NONE - SIOCIWFIRSTPRIV] = iw_get_char_setnone,
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070012911 [WLAN_PRIV_SET_NONE_GET_NONE - SIOCIWFIRSTPRIV] = iw_setnone_getnone,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012912 [WLAN_PRIV_SET_VAR_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12913 iw_hdd_set_var_ints_getnone,
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070012914 [WLAN_PRIV_SET_NONE_GET_THREE_INT - SIOCIWFIRSTPRIV] =
12915 iw_setnone_get_threeint,
Jeff Johnson6fa1e012017-04-05 06:40:53 -070012916 [WLAN_PRIV_FIPS_TEST - SIOCIWFIRSTPRIV] = hdd_fips_test,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012917 [WLAN_PRIV_ADD_TSPEC - SIOCIWFIRSTPRIV] = iw_add_tspec,
12918 [WLAN_PRIV_DEL_TSPEC - SIOCIWFIRSTPRIV] = iw_del_tspec,
12919 [WLAN_PRIV_GET_TSPEC - SIOCIWFIRSTPRIV] = iw_get_tspec,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012920 [WLAN_PRIV_SET_FTIES - SIOCIWFIRSTPRIV] = iw_set_fties,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012921 [WLAN_PRIV_SET_HOST_OFFLOAD - SIOCIWFIRSTPRIV] = iw_set_host_offload,
12922 [WLAN_GET_WLAN_STATISTICS - SIOCIWFIRSTPRIV] = iw_get_statistics,
12923 [WLAN_SET_KEEPALIVE_PARAMS - SIOCIWFIRSTPRIV] =
12924 iw_set_keepalive_params,
12925#ifdef WLAN_FEATURE_PACKET_FILTERING
12926 [WLAN_SET_PACKET_FILTER_PARAMS - SIOCIWFIRSTPRIV] =
12927 iw_set_packet_filter_params,
12928#endif
12929#ifdef FEATURE_WLAN_SCAN_PNO
12930 [WLAN_SET_PNO - SIOCIWFIRSTPRIV] = iw_set_pno,
12931#endif
12932 [WLAN_SET_BAND_CONFIG - SIOCIWFIRSTPRIV] = iw_set_band_config,
Dustin Brown0cbc7572016-12-16 13:54:40 -080012933 [WLAN_PRIV_SET_MCBC_FILTER - SIOCIWFIRSTPRIV] =
12934 iw_set_dynamic_mcbc_filter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012935 [WLAN_GET_LINK_SPEED - SIOCIWFIRSTPRIV] = iw_get_linkspeed,
12936 [WLAN_PRIV_SET_TWO_INT_GET_NONE - SIOCIWFIRSTPRIV] =
12937 iw_set_two_ints_getnone,
12938 [WLAN_SET_DOT11P_CHANNEL_SCHED - SIOCIWFIRSTPRIV] =
12939 iw_set_dot11p_channel_sched,
12940};
12941
12942/*Maximum command length can be only 15 */
12943static const struct iw_priv_args we_private_args[] = {
12944
12945 /* handlers for main ioctl */
12946 {WLAN_PRIV_SET_INT_GET_NONE,
12947 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12948 0,
12949 ""},
12950
12951 /* handlers for sub-ioctl */
12952 {WE_SET_11D_STATE,
12953 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12954 0,
12955 "set11Dstate"},
12956
12957 {WE_WOWL,
12958 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12959 0,
12960 "wowl"},
12961
12962 {WE_SET_POWER,
12963 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12964 0,
12965 "setPower"},
12966
12967 {WE_SET_MAX_ASSOC,
12968 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12969 0,
12970 "setMaxAssoc"},
12971
12972 {WE_SET_SAP_AUTO_CHANNEL_SELECTION,
12973 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0,
12974 "setAutoChannel" },
12975
12976 {WE_SET_SCAN_DISABLE,
12977 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12978 0,
12979 "scan_disable"},
12980
12981 {WE_SET_DATA_INACTIVITY_TO,
12982 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12983 0,
12984 "inactivityTO"},
12985
Mukul Sharmaed92f2f2017-04-20 00:06:28 +053012986 {WE_SET_WOW_DATA_INACTIVITY_TO,
12987 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12988 0,
12989 "wow_ito"},
12990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080012991 {WE_SET_MAX_TX_POWER,
12992 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12993 0,
12994 "setMaxTxPower"},
12995
12996 {WE_SET_TX_POWER,
12997 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
12998 0,
12999 "setTxPower"},
13000
13001 {WE_SET_MC_RATE,
13002 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13003 0,
13004 "setMcRate"},
13005
13006 {WE_SET_MAX_TX_POWER_2_4,
13007 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13008 0,
13009 "setTxMaxPower2G"},
13010
13011 {WE_SET_MAX_TX_POWER_5_0,
13012 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13013 0,
13014 "setTxMaxPower5G"},
13015
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080013016 {WE_SET_PKTLOG,
Poddar, Siddarth176c4362016-10-03 12:25:00 +053013017 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -080013018 0,
13019 "pktlog"},
13020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013021 /* SAP has TxMax whereas STA has MaxTx, adding TxMax for STA
13022 * as well to keep same syntax as in SAP. Now onwards, STA
Jeff Johnson3bb7c732017-01-12 08:40:17 -080013023 * will support both
13024 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013025 {WE_SET_MAX_TX_POWER,
13026 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13027 0,
13028 "setTxMaxPower"},
13029
13030 /* set Higher DTIM Transition (DTIM1 to DTIM3)
Jeff Johnson3bb7c732017-01-12 08:40:17 -080013031 * 1 = enable and 0 = disable
13032 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013033 {
13034 WE_SET_HIGHER_DTIM_TRANSITION,
13035 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13036 0,
13037 "setHDtimTransn"
13038 },
13039
13040 {WE_SET_TM_LEVEL,
13041 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13042 0,
13043 "setTmLevel"},
13044
13045 {WE_SET_PHYMODE,
13046 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13047 0,
13048 "setphymode"},
13049
13050 {WE_SET_NSS,
13051 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13052 0,
13053 "nss"},
13054
13055 {WE_SET_LDPC,
13056 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13057 0,
13058 "ldpc"},
13059
13060 {WE_SET_TX_STBC,
13061 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13062 0,
13063 "tx_stbc"},
13064
13065 {WE_SET_RX_STBC,
13066 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13067 0,
13068 "rx_stbc"},
13069
13070 {WE_SET_SHORT_GI,
13071 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13072 0,
13073 "shortgi"},
13074
13075 {WE_SET_RTSCTS,
13076 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13077 0,
13078 "enablertscts"},
13079
13080 {WE_SET_CHWIDTH,
13081 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13082 0,
13083 "chwidth"},
13084
13085 {WE_SET_ANI_EN_DIS,
13086 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13087 0,
13088 "anienable"},
13089
13090 {WE_SET_ANI_POLL_PERIOD,
13091 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13092 0,
13093 "aniplen"},
13094
13095 {WE_SET_ANI_LISTEN_PERIOD,
13096 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13097 0,
13098 "anilislen"},
13099
13100 {WE_SET_ANI_OFDM_LEVEL,
13101 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13102 0,
13103 "aniofdmlvl"},
13104
13105 {WE_SET_ANI_CCK_LEVEL,
13106 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13107 0,
13108 "aniccklvl"},
13109
13110 {WE_SET_DYNAMIC_BW,
13111 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13112 0,
13113 "cwmenable"},
13114
13115 {WE_SET_CTS_CBW,
13116 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13117 0,
13118 "cts_cbw" },
13119
13120 {WE_SET_GTX_HT_MCS,
13121 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13122 0,
13123 "gtxHTMcs"},
13124
13125 {WE_SET_GTX_VHT_MCS,
13126 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13127 0,
13128 "gtxVHTMcs"},
13129
13130 {WE_SET_GTX_USRCFG,
13131 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13132 0,
13133 "gtxUsrCfg"},
13134
13135 {WE_SET_GTX_THRE,
13136 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13137 0,
13138 "gtxThre"},
13139
13140 {WE_SET_GTX_MARGIN,
13141 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13142 0,
13143 "gtxMargin"},
13144
13145 {WE_SET_GTX_STEP,
13146 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13147 0,
13148 "gtxStep"},
13149
13150 {WE_SET_GTX_MINTPC,
13151 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13152 0,
13153 "gtxMinTpc"},
13154
13155 {WE_SET_GTX_BWMASK,
13156 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13157 0,
13158 "gtxBWMask"},
13159
13160 {WE_SET_TX_CHAINMASK,
13161 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13162 0,
13163 "txchainmask"},
13164
13165 {WE_SET_RX_CHAINMASK,
13166 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13167 0,
13168 "rxchainmask"},
13169
13170 {WE_SET_11N_RATE,
13171 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13172 0,
13173 "set11NRates"},
13174
13175 {WE_SET_VHT_RATE,
13176 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13177 0,
13178 "set11ACRates"},
13179
13180 {WE_SET_AMPDU,
13181 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13182 0,
13183 "ampdu"},
13184
13185 {WE_SET_AMSDU,
13186 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13187 0,
13188 "amsdu"},
13189
13190 {WE_SET_BURST_ENABLE,
13191 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13192 0,
13193 "burst_enable"},
13194
13195 {WE_SET_BURST_DUR,
13196 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13197 0,
13198 "burst_dur"},
13199
13200 {WE_SET_TXPOW_2G,
13201 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13202 0,
13203 "txpow2g"},
13204
13205 {WE_SET_TXPOW_5G,
13206 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13207 0,
13208 "txpow5g"},
13209
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013210 /* Sub-cmds DBGLOG specific commands */
13211 {WE_DBGLOG_LOG_LEVEL,
13212 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13213 0,
13214 "dl_loglevel"},
13215
13216 {WE_DBGLOG_VAP_ENABLE,
13217 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13218 0,
13219 "dl_vapon"},
13220
13221 {WE_DBGLOG_VAP_DISABLE,
13222 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13223 0,
13224 "dl_vapoff"},
13225
13226 {WE_DBGLOG_MODULE_ENABLE,
13227 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13228 0,
13229 "dl_modon"},
13230
13231 {WE_DBGLOG_MODULE_DISABLE,
13232 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13233 0,
13234 "dl_modoff"},
13235
13236 {WE_DBGLOG_MOD_LOG_LEVEL,
13237 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13238 0,
13239 "dl_mod_loglevel"},
13240
13241 {WE_DBGLOG_TYPE,
13242 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13243 0,
13244 "dl_type"},
13245 {WE_DBGLOG_REPORT_ENABLE,
13246 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13247 0,
13248 "dl_report"},
13249
13250 {WE_SET_TXRX_FWSTATS,
13251 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13252 0,
13253 "txrx_fw_stats"},
13254
Venkata Sharath Chandra Manchala83985632017-02-28 14:16:22 -080013255 {WE_SET_TXRX_STATS,
13256 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13257 0,
13258 "txrx_stats"},
13259
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013260 {WE_TXRX_FWSTATS_RESET,
13261 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13262 0,
13263 "txrx_fw_st_rst"},
13264
13265 {WE_PPS_PAID_MATCH,
13266 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13267 0, "paid_match"},
13268
13269 {WE_PPS_GID_MATCH,
13270 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13271 0, "gid_match"},
13272
13273 {WE_PPS_EARLY_TIM_CLEAR,
13274 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13275 0, "tim_clear"},
13276
13277 {WE_PPS_EARLY_DTIM_CLEAR,
13278 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13279 0, "dtim_clear"},
13280
13281 {WE_PPS_EOF_PAD_DELIM,
13282 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13283 0, "eof_delim"},
13284
13285 {WE_PPS_MACADDR_MISMATCH,
13286 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13287 0, "mac_match"},
13288
13289 {WE_PPS_DELIM_CRC_FAIL,
13290 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13291 0, "delim_fail"},
13292
13293 {WE_PPS_GID_NSTS_ZERO,
13294 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13295 0, "nsts_zero"},
13296
13297 {WE_PPS_RSSI_CHECK,
13298 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13299 0, "rssi_chk"},
13300
13301 {WE_PPS_5G_EBT,
13302 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13303 0, "5g_ebt"},
13304
13305 {WE_SET_HTSMPS,
13306 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13307 0, "htsmps"},
13308
13309 {WE_SET_QPOWER_MAX_PSPOLL_COUNT,
13310 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13311 0, "set_qpspollcnt"},
13312
13313 {WE_SET_QPOWER_MAX_TX_BEFORE_WAKE,
13314 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13315 0, "set_qtxwake"},
13316
13317 {WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
13318 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13319 0, "set_qwakeintv"},
13320
13321 {WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
13322 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13323 0, "set_qnodatapoll"},
13324
13325 /* handlers for MCC time quota and latency sub ioctls */
13326 {WE_MCC_CONFIG_LATENCY,
13327 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13328 0, "setMccLatency"},
13329
13330 {WE_MCC_CONFIG_QUOTA,
13331 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13332 0, "setMccQuota"},
13333
13334 {WE_SET_DEBUG_LOG,
13335 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13336 0, "setDbgLvl"},
13337
13338 /* handlers for early_rx power save */
13339 {WE_SET_EARLY_RX_ADJUST_ENABLE,
13340 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13341 0, "erx_enable"},
13342
13343 {WE_SET_EARLY_RX_TGT_BMISS_NUM,
13344 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13345 0, "erx_bmiss_val"},
13346
13347 {WE_SET_EARLY_RX_BMISS_SAMPLE_CYCLE,
13348 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13349 0, "erx_bmiss_smpl"},
13350
13351 {WE_SET_EARLY_RX_SLOP_STEP,
13352 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13353 0, "erx_slop_step"},
13354
13355 {WE_SET_EARLY_RX_INIT_SLOP,
13356 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13357 0, "erx_init_slop"},
13358
13359 {WE_SET_EARLY_RX_ADJUST_PAUSE,
13360 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13361 0, "erx_adj_pause"},
13362
13363 {WE_SET_EARLY_RX_DRIFT_SAMPLE,
13364 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13365 0, "erx_dri_sample"},
13366
13367 {WE_DUMP_STATS,
13368 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13369 0, "dumpStats"},
13370
13371 {WE_CLEAR_STATS,
13372 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13373 0, "clearStats"},
13374
Govind Singha471e5e2015-10-12 17:11:14 +053013375 {WE_START_FW_PROFILE,
13376 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13377 0, "startProfile"},
13378
Abhishek Singh1bdb1572015-10-16 16:24:19 +053013379 {WE_SET_CHANNEL,
13380 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13381 0, "setChanChange" },
13382
Manishekar Chandrasekaran97e077d2016-03-23 17:10:31 +053013383 {WE_SET_CONC_SYSTEM_PREF,
13384 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13385 0, "setConcSysPref" },
13386
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013387 {WLAN_PRIV_SET_NONE_GET_INT,
13388 0,
13389 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13390 ""},
13391
13392 /* handlers for sub-ioctl */
13393 {WE_GET_11D_STATE,
13394 0,
13395 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13396 "get11Dstate"},
13397
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013398 {WE_GET_WLAN_DBG,
13399 0,
13400 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13401 "getwlandbg"},
13402
13403 {WE_GET_MAX_ASSOC,
13404 0,
13405 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13406 "getMaxAssoc"},
13407
13408 {WE_GET_SAP_AUTO_CHANNEL_SELECTION,
13409 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13410 "getAutoChannel" },
13411
13412 {WE_GET_CONCURRENCY_MODE,
13413 0,
13414 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13415 "getconcurrency"},
13416
13417 {WE_GET_NSS,
13418 0,
13419 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13420 "get_nss"},
13421
13422 {WE_GET_LDPC,
13423 0,
13424 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13425 "get_ldpc"},
13426
13427 {WE_GET_TX_STBC,
13428 0,
13429 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13430 "get_tx_stbc"},
13431
13432 {WE_GET_RX_STBC,
13433 0,
13434 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13435 "get_rx_stbc"},
13436
13437 {WE_GET_SHORT_GI,
13438 0,
13439 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13440 "get_shortgi"},
13441
13442 {WE_GET_RTSCTS,
13443 0,
13444 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13445 "get_rtscts"},
13446
13447 {WE_GET_CHWIDTH,
13448 0,
13449 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13450 "get_chwidth"},
13451
13452 {WE_GET_ANI_EN_DIS,
13453 0,
13454 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13455 "get_anienable"},
13456
13457 {WE_GET_ANI_POLL_PERIOD,
13458 0,
13459 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13460 "get_aniplen"},
13461
13462 {WE_GET_ANI_LISTEN_PERIOD,
13463 0,
13464 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13465 "get_anilislen"},
13466
13467 {WE_GET_ANI_OFDM_LEVEL,
13468 0,
13469 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13470 "get_aniofdmlvl"},
13471
13472 {WE_GET_ANI_CCK_LEVEL,
13473 0,
13474 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13475 "get_aniccklvl"},
13476
13477 {WE_GET_DYNAMIC_BW,
13478 0,
13479 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13480 "get_cwmenable"},
13481
13482 {WE_GET_GTX_HT_MCS,
13483 0,
13484 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13485 "get_gtxHTMcs"},
13486
13487 {WE_GET_GTX_VHT_MCS,
13488 0,
13489 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13490 "get_gtxVHTMcs"},
13491
13492 {WE_GET_GTX_USRCFG,
13493 0,
13494 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13495 "get_gtxUsrCfg"},
13496
13497 {WE_GET_GTX_THRE,
13498 0,
13499 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13500 "get_gtxThre"},
13501
13502 {WE_GET_GTX_MARGIN,
13503 0,
13504 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13505 "get_gtxMargin"},
13506
13507 {WE_GET_GTX_STEP,
13508 0,
13509 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13510 "get_gtxStep"},
13511
13512 {WE_GET_GTX_MINTPC,
13513 0,
13514 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13515 "get_gtxMinTpc"},
13516
13517 {WE_GET_GTX_BWMASK,
13518 0,
13519 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13520 "get_gtxBWMask"},
13521
13522 {WE_GET_TX_CHAINMASK,
13523 0,
13524 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13525 "get_txchainmask"},
13526
13527 {WE_GET_RX_CHAINMASK,
13528 0,
13529 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13530 "get_rxchainmask"},
13531
13532 {WE_GET_11N_RATE,
13533 0,
13534 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13535 "get_11nrate"},
13536
13537 {WE_GET_AMPDU,
13538 0,
13539 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13540 "get_ampdu"},
13541
13542 {WE_GET_AMSDU,
13543 0,
13544 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13545 "get_amsdu"},
13546
13547 {WE_GET_BURST_ENABLE,
13548 0,
13549 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13550 "get_burst_en"},
13551
13552 {WE_GET_BURST_DUR,
13553 0,
13554 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13555 "get_burst_dur"},
13556
13557 {WE_GET_TXPOW_2G,
13558 0,
13559 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13560 "get_txpow2g"},
13561
13562 {WE_GET_TXPOW_5G,
13563 0,
13564 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13565 "get_txpow5g"},
13566
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013567 {WE_GET_PPS_PAID_MATCH,
13568 0,
13569 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13570 "get_paid_match"},
13571
13572 {WE_GET_PPS_GID_MATCH,
13573 0,
13574 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13575 "get_gid_match"},
13576
13577 {WE_GET_PPS_EARLY_TIM_CLEAR,
13578 0,
13579 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13580 "get_tim_clear"},
13581
13582 {WE_GET_PPS_EARLY_DTIM_CLEAR,
13583 0,
13584 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13585 "get_dtim_clear"},
13586
13587 {WE_GET_PPS_EOF_PAD_DELIM,
13588 0,
13589 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13590 "get_eof_delim"},
13591
13592 {WE_GET_PPS_MACADDR_MISMATCH,
13593 0,
13594 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13595 "get_mac_match"},
13596
13597 {WE_GET_PPS_DELIM_CRC_FAIL,
13598 0,
13599 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13600 "get_delim_fail"},
13601
13602 {WE_GET_PPS_GID_NSTS_ZERO,
13603 0,
13604 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13605 "get_nsts_zero"},
13606
13607 {WE_GET_PPS_RSSI_CHECK,
13608 0,
13609 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13610 "get_rssi_chk"},
13611
13612 {WE_GET_QPOWER_MAX_PSPOLL_COUNT,
13613 0,
13614 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13615 "get_qpspollcnt"},
13616
13617 {WE_GET_QPOWER_MAX_TX_BEFORE_WAKE,
13618 0,
13619 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13620 "get_qtxwake"},
13621
13622 {WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
13623 0,
13624 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13625 "get_qwakeintv"},
13626
13627 {WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
13628 0,
13629 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13630 "get_qnodatapoll"},
13631
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070013632 {WE_CAP_TSF,
13633 0,
13634 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13635 "cap_tsf"},
13636
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013637 {WE_GET_TEMPERATURE,
13638 0,
13639 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13640 "get_temp"},
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -070013641 {WE_GET_DCM,
13642 0,
13643 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13644 "get_dcm"},
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -070013645 {WE_GET_RANGE_EXT,
13646 0,
13647 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13648 "get_range_ext"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013649 /* handlers for main ioctl */
13650 {WLAN_PRIV_SET_CHAR_GET_NONE,
13651 IW_PRIV_TYPE_CHAR | 512,
13652 0,
13653 ""},
13654
13655 /* handlers for sub-ioctl */
13656 {WE_WOWL_ADD_PTRN,
13657 IW_PRIV_TYPE_CHAR | 512,
13658 0,
13659 "wowlAddPtrn"},
13660
13661 {WE_WOWL_DEL_PTRN,
13662 IW_PRIV_TYPE_CHAR | 512,
13663 0,
13664 "wowlDelPtrn"},
13665
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013666 /* handlers for sub-ioctl */
13667 {WE_NEIGHBOR_REPORT_REQUEST,
13668 IW_PRIV_TYPE_CHAR | 512,
13669 0,
13670 "neighbor"},
Deepak Dhamdhere641bf322016-01-06 15:19:03 -080013671
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013672 {WE_SET_AP_WPS_IE,
13673 IW_PRIV_TYPE_CHAR | 512,
13674 0,
13675 "set_ap_wps_ie"},
13676
13677 {WE_SET_CONFIG,
13678 IW_PRIV_TYPE_CHAR | 512,
13679 0,
13680 "setConfig"},
13681
13682 /* handlers for main ioctl */
13683 {WLAN_PRIV_SET_THREE_INT_GET_NONE,
13684 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13685 0,
13686 ""},
13687
13688 /* handlers for sub-ioctl */
13689 {WE_SET_WLAN_DBG,
13690 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13691 0,
13692 "setwlandbg"},
13693
13694 /* handlers for sub-ioctl */
13695 {WE_SET_DP_TRACE,
13696 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13697 0,
13698 "set_dp_trace"},
13699
13700 {WE_SET_SAP_CHANNELS,
13701 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13702 0,
13703 "setsapchannels"},
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +053013704
13705 {WE_SET_FW_TEST,
13706 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13707 0, "fw_test"},
13708
Manikandan Mohandcc21ba2016-03-15 14:31:56 -070013709 /* handlers for main ioctl */
13710 {WLAN_PRIV_SET_NONE_GET_THREE_INT,
13711 0,
13712 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13713 "" },
13714 {WE_GET_TSF,
13715 0,
13716 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13717 "get_tsf" },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013718
13719 {WE_SET_DUAL_MAC_SCAN_CONFIG,
13720 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
13721 0,
13722 "set_scan_cfg"},
13723
13724 /* handlers for main ioctl */
13725 {WLAN_PRIV_GET_CHAR_SET_NONE,
13726 0,
13727 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13728 ""},
13729
13730 /* handlers for sub-ioctl */
13731 {WE_WLAN_VERSION,
13732 0,
13733 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13734 "version"},
13735 {WE_GET_STATS,
13736 0,
13737 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13738 "getStats"},
Dustin Brownd9322482017-01-09 12:46:03 -080013739 {WE_GET_SUSPEND_RESUME_STATS,
13740 0,
13741 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13742 "getSuspendStats"},
Govind Singha471e5e2015-10-12 17:11:14 +053013743 {WE_LIST_FW_PROFILE,
13744 0,
13745 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13746 "listProfile"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013747 {WE_GET_STATES,
13748 0,
13749 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13750 "getHostStates"},
13751 {WE_GET_CFG,
13752 0,
13753 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13754 "getConfig"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013755 {WE_GET_RSSI,
13756 0,
13757 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13758 "getRSSI"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013759 {WE_GET_WMM_STATUS,
13760 0,
13761 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13762 "getWmmStatus"},
13763 {
13764 WE_GET_CHANNEL_LIST,
13765 0,
13766 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13767 "getChannelList"
13768 },
13769#ifdef FEATURE_WLAN_TDLS
13770 {
13771 WE_GET_TDLS_PEERS,
13772 0,
13773 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13774 "getTdlsPeers"
13775 },
13776#endif
13777#ifdef WLAN_FEATURE_11W
13778 {
13779 WE_GET_11W_INFO,
13780 0,
13781 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13782 "getPMFInfo"
13783 },
13784#endif
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013785 {
13786 WE_GET_IBSS_STA_INFO,
13787 0,
13788 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13789 "getIbssSTAs"
13790 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013791 {WE_GET_PHYMODE,
13792 0,
13793 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13794 "getphymode"},
Naveen Rawat910726a2017-03-06 11:42:51 -080013795#if defined(FEATURE_OEM_DATA_SUPPORT) || defined(WIFI_POS_CONVERGED)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013796 {WE_GET_OEM_DATA_CAP,
13797 0,
13798 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13799 "getOemDataCap"},
Naveen Rawat910726a2017-03-06 11:42:51 -080013800#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013801 {WE_GET_SNR,
13802 0,
13803 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
13804 "getSNR"},
13805
13806 /* handlers for main ioctl */
13807 {WLAN_PRIV_SET_NONE_GET_NONE,
13808 0,
13809 0,
13810 ""},
13811
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013812 /* handlers for sub-ioctl */
13813 {
13814 WE_IBSS_GET_PEER_INFO_ALL,
13815 0,
13816 0,
13817 "ibssPeerInfoAll"
13818 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013819 {WE_GET_RECOVERY_STAT,
13820 0,
13821 0,
13822 "getRecoverStat"},
Govind Singha471e5e2015-10-12 17:11:14 +053013823
13824 {WE_GET_FW_PROFILE_DATA,
13825 0,
13826 0,
13827 "getProfileData"},
13828
13829 {WE_SET_REASSOC_TRIGGER,
13830 0,
13831 0,
13832 "reassoc"},
13833
Sandeep Puligilla93a29ec2016-02-12 16:10:56 -080013834 {WE_STOP_OBSS_SCAN,
13835 0,
13836 0,
13837 "stop_obss_scan"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013838 /* handlers for main ioctl */
13839 {WLAN_PRIV_SET_VAR_INT_GET_NONE,
13840 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13841 0,
13842 ""},
13843
13844 /* handlers for sub-ioctl */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -080013845 {WE_IBSS_GET_PEER_INFO,
13846 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13847 0,
13848 "ibssPeerInfo"},
13849
13850 /* handlers for sub-ioctl */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013851 {WE_MTRACE_SELECTIVE_MODULE_LOG_ENABLE_CMD,
13852 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13853 0,
13854 "setdumplog"},
13855
13856 {WE_MTRACE_DUMP_CMD,
13857 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13858 0,
13859 "dumplog"},
Krunal Sonia6e505b2017-01-12 12:25:18 -080013860
13861 {WE_POLICY_MANAGER_CINFO_CMD,
13862 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13863 0,
13864 "pm_cinfo"},
13865
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013866#ifdef MPC_UT_FRAMEWORK
13867 {WE_POLICY_MANAGER_CLIST_CMD,
13868 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13869 0,
13870 "pm_clist"},
13871
13872 {WE_POLICY_MANAGER_DLIST_CMD,
13873 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13874 0,
13875 "pm_dlist"},
13876
13877 {WE_POLICY_MANAGER_DBS_CMD,
13878 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13879 0,
13880 "pm_dbs"},
13881
13882 {WE_POLICY_MANAGER_PCL_CMD,
13883 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13884 0,
13885 "pm_pcl"},
13886
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013887 {WE_POLICY_MANAGER_ULIST_CMD,
13888 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13889 0,
13890 "pm_ulist"},
13891
13892 {WE_POLICY_MANAGER_QUERY_ACTION_CMD,
13893 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13894 0,
13895 "pm_query_action"},
13896
13897 {WE_POLICY_MANAGER_QUERY_ALLOW_CMD,
13898 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13899 0,
13900 "pm_query_allow"},
13901
13902 {WE_POLICY_MANAGER_SCENARIO_CMD,
13903 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13904 0,
13905 "pm_run_scenario"},
13906
13907 {WE_POLICY_SET_HW_MODE_CMD,
13908 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13909 0,
13910 "pm_set_hw_mode"},
13911#endif
13912#ifdef FEATURE_WLAN_TDLS
13913 /* handlers for sub ioctl */
13914 {
13915 WE_TDLS_CONFIG_PARAMS,
13916 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13917 0,
13918 "setTdlsConfig"
13919 },
13920#endif
13921 {
13922 WE_UNIT_TEST_CMD,
13923 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13924 0,
13925 "setUnitTestCmd"
13926 },
Manjeet Singhf82ed072016-07-08 11:40:00 +053013927 {
13928 WE_MAC_PWR_DEBUG_CMD,
13929 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13930 0,
13931 "halPwrDebug"
13932 },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013933
13934#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
13935 {WE_LED_FLASHING_PARAM,
13936 IW_PRIV_TYPE_INT | MAX_VAR_ARGS,
13937 0,
13938 "gpio_control"},
13939#endif
13940 /* handlers for main ioctl */
Jeff Johnson6fa1e012017-04-05 06:40:53 -070013941 {WLAN_PRIV_FIPS_TEST,
13942 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13943 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13944 "fips_test"},
13945
13946 /* handlers for main ioctl */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013947 {WLAN_PRIV_ADD_TSPEC,
13948 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | HDD_WLAN_WMM_PARAM_COUNT,
13949 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13950 "addTspec"},
13951
13952 /* handlers for main ioctl */
13953 {WLAN_PRIV_DEL_TSPEC,
13954 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13955 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13956 "delTspec"},
13957
13958 /* handlers for main ioctl */
13959 {WLAN_PRIV_GET_TSPEC,
13960 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13961 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
13962 "getTspec"},
13963
13964 /* handlers for main ioctl - host offload */
13965 {
13966 WLAN_PRIV_SET_HOST_OFFLOAD,
Srinivas Girigowda077143e2017-03-25 10:47:27 -070013967 IW_PRIV_TYPE_BYTE | sizeof(struct host_offload_req),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013968 0,
13969 "setHostOffload"
13970 }
13971 ,
13972
13973 {
13974 WLAN_GET_WLAN_STATISTICS,
13975 0,
13976 IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN,
13977 "getWlanStats"
13978 }
13979 ,
13980
13981 {
13982 WLAN_SET_KEEPALIVE_PARAMS,
Mahesh A Saptasagar72d2e4b2016-04-20 12:44:17 +053013983 IW_PRIV_TYPE_BYTE | sizeof(tSirKeepAliveReq) |
13984 IW_PRIV_SIZE_FIXED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013985 0,
13986 "setKeepAlive"
13987 }
13988 ,
13989#ifdef WLAN_FEATURE_PACKET_FILTERING
13990 {
13991 WLAN_SET_PACKET_FILTER_PARAMS,
Hanumanth Reddy Pothulab3ef4162016-10-25 15:13:26 +053013992 IW_PRIV_TYPE_BYTE |
13993 sizeof(struct pkt_filter_cfg),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080013994 0,
13995 "setPktFilter"
13996 }
13997 ,
13998#endif
13999#ifdef FEATURE_WLAN_SCAN_PNO
14000 {
14001 WLAN_SET_PNO,
14002 IW_PRIV_TYPE_CHAR | WE_MAX_STR_LEN,
14003 0,
14004 "setpno"
14005 }
14006 ,
14007#endif
14008 {
14009 WLAN_SET_BAND_CONFIG,
14010 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14011 0,
14012 "SETBAND"
14013 }
14014 ,
14015 {
Dustin Brown0cbc7572016-12-16 13:54:40 -080014016 WLAN_PRIV_SET_MCBC_FILTER,
Dustin Brown860566f2017-01-31 15:24:43 -080014017 0,
Dustin Brown0cbc7572016-12-16 13:54:40 -080014018 0,
14019 "setMCBCFilter"
14020 }
14021 ,
Dustin Brown0cbc7572016-12-16 13:54:40 -080014022
14023 {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014024 WLAN_GET_LINK_SPEED,
14025 IW_PRIV_TYPE_CHAR | 18,
14026 IW_PRIV_TYPE_CHAR | 5, "getLinkSpeed"
14027 }
14028 ,
14029
14030 /* handlers for main ioctl */
14031 {WLAN_PRIV_SET_TWO_INT_GET_NONE,
14032 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14033 0,
14034 ""}
14035 ,
14036 {WE_SET_SMPS_PARAM,
14037 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14038 0, "set_smps_param"}
14039 ,
14040 {WLAN_SET_DOT11P_CHANNEL_SCHED,
14041 IW_PRIV_TYPE_BYTE | sizeof(struct dot11p_channel_sched),
14042 0, "set_dot11p" }
14043 ,
Srinivas Girigowda6147c582016-10-18 12:26:15 -070014044#ifdef WLAN_DEBUG
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014045 {WE_SET_FW_CRASH_INJECT,
14046 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14047 0, "crash_inject"}
14048 ,
Dustin Brown8d2d0f52017-04-03 17:02:08 -070014049 {WE_LOG_BUFFER,
14050 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14051 0, "log_buffer"}
14052 ,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014053#endif
Rajeev Kumara78a0a42016-07-13 19:28:20 -070014054#ifdef WLAN_SUSPEND_RESUME_TEST
14055 {WE_SET_WLAN_SUSPEND,
14056 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14057 0, "wlan_suspend"}
14058 ,
14059 {WE_SET_WLAN_RESUME,
14060 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14061 0, "wlan_resume"}
14062 ,
14063#endif
Govind Singha471e5e2015-10-12 17:11:14 +053014064 {WE_ENABLE_FW_PROFILE,
14065 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14066 0, "enableProfile"}
14067 ,
14068 {WE_SET_FW_PROFILE_HIST_INTVL,
14069 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14070 0, "set_hist_intvl"}
14071 ,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014072 {WE_SET_DUAL_MAC_FW_MODE_CONFIG,
14073 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14074 0, "set_fw_mode_cfg"}
14075 ,
14076 {WE_DUMP_DP_TRACE_LEVEL,
14077 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14078 0, "dump_dp_trace"}
14079 ,
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -070014080 {WE_SET_MON_MODE_CHAN,
14081 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
14082 0, "setMonChan"}
14083 ,
Varun Reddy Yeturu5ab47462016-05-08 18:08:11 -070014084
14085 {WE_GET_ROAM_SYNCH_DELAY,
14086 0,
14087 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14088 "hostroamdelay"}
14089 ,
Krishna Kumaar Natarajan9e5339d2016-12-05 14:12:13 -080014090 {WE_SET_11AX_RATE,
14091 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14092 0,
14093 "set_11ax_rate"}
14094 ,
Krishna Kumaar Natarajan1a71ec72017-03-23 12:26:31 -070014095 {WE_SET_DCM,
14096 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14097 0,
14098 "enable_dcm"}
14099 ,
Krishna Kumaar Natarajan150cd012017-03-23 12:29:10 -070014100 {WE_SET_RANGE_EXT,
14101 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
14102 0,
14103 "enable_range_ext"}
14104 ,
Naveen Rawatc921c7b2017-06-13 17:29:51 -070014105
14106 {WLAN_PRIV_SET_FTIES,
14107 IW_PRIV_TYPE_CHAR | MAX_FTIE_SIZE,
14108 0,
14109 "set_ft_ies"},
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014110};
14111
14112const struct iw_handler_def we_handler_def = {
Anurag Chouhan6d760662016-02-20 16:05:43 +053014113 .num_standard = QDF_ARRAY_SIZE(we_handler),
14114 .num_private = QDF_ARRAY_SIZE(we_private),
14115 .num_private_args = QDF_ARRAY_SIZE(we_private_args),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014116
14117 .standard = (iw_handler *) we_handler,
14118 .private = (iw_handler *) we_private,
14119 .private_args = we_private_args,
14120 .get_wireless_stats = NULL,
14121};
14122
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014123/* hdd_set_wext() - configures bss parameters
14124 * @pAdapter: handle to adapter context
14125 *
14126 * Returns: none
14127 */
Jeff Johnsonaf2a0932016-10-05 14:52:57 -070014128static int hdd_set_wext(hdd_adapter_t *pAdapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014129{
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014130 hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
14131 hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014132
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014133 ENTER();
14134
14135 if (!pwextBuf) {
14136 hdd_err("ERROR: pwextBuf is NULL");
14137 return QDF_STATUS_E_FAILURE;
14138 }
14139
14140 if (!pHddStaCtx) {
14141 hdd_err("ERROR: pHddStaCtx is NULL");
14142 return QDF_STATUS_E_FAILURE;
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014143 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014144
14145 /* Now configure the roaming profile links. To SSID and bssid. */
14146 pwextBuf->roamProfile.SSIDs.numOfSSIDs = 0;
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014147 pwextBuf->roamProfile.SSIDs.SSIDList = &pHddStaCtx->conn_info.SSID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014148
14149 pwextBuf->roamProfile.BSSIDs.numOfBSSIDs = 0;
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014150 pwextBuf->roamProfile.BSSIDs.bssid = &pHddStaCtx->conn_info.bssId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014151
14152 /*Set the numOfChannels to zero to scan all the channels */
14153 pwextBuf->roamProfile.ChannelInfo.numOfChannels = 0;
14154 pwextBuf->roamProfile.ChannelInfo.ChannelList = NULL;
14155
14156 /* Default is no encryption */
14157 pwextBuf->roamProfile.EncryptionType.numEntries = 1;
14158 pwextBuf->roamProfile.EncryptionType.encryptionType[0] =
14159 eCSR_ENCRYPT_TYPE_NONE;
14160
14161 pwextBuf->roamProfile.mcEncryptionType.numEntries = 1;
14162 pwextBuf->roamProfile.mcEncryptionType.encryptionType[0] =
14163 eCSR_ENCRYPT_TYPE_NONE;
14164
14165 pwextBuf->roamProfile.BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
14166
14167 /* Default is no authentication */
14168 pwextBuf->roamProfile.AuthType.numEntries = 1;
14169 pwextBuf->roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
14170
14171 pwextBuf->roamProfile.phyMode = eCSR_DOT11_MODE_AUTO;
14172 pwextBuf->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
14173
14174 /*Set the default scan mode */
14175 pAdapter->scan_info.scan_mode = eSIR_ACTIVE_SCAN;
14176
14177 hdd_clear_roam_profile_ie(pAdapter);
14178
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014179 EXIT();
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014180 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014181
14182}
14183
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014184/**
14185 * hdd_register_wext() - register wext context
14186 * @dev: net device handle
14187 *
14188 * Registers wext interface context for a given net device
14189 *
14190 * Returns: 0 on success, errno on failure
14191 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014192int hdd_register_wext(struct net_device *dev)
14193{
14194 hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014195 hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
Anurag Chouhance0dc992016-02-16 18:18:03 +053014196 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014197
14198 ENTER();
14199
Deepak Dhamdhere8360d4c2016-06-01 13:24:31 -070014200 if (!pwextBuf) {
14201 hdd_err(FL("ERROR: pwextBuf is NULL"));
14202 return QDF_STATUS_E_FAILURE;
14203 }
Deepak Dhamdhere5cdce842016-05-31 10:39:12 -070014204
14205 /* Zero the memory. This zeros the profile structure */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014206 memset(pwextBuf, 0, sizeof(hdd_wext_state_t));
14207
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014208 status = hdd_set_wext(pAdapter);
14209
Anurag Chouhance0dc992016-02-16 18:18:03 +053014210 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070014211 hdd_err("ERROR: hdd_set_wext failed!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014212 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014213 }
14214
Srinivas Girigowdafba82a02017-03-24 21:26:35 -070014215 status = qdf_event_create(&pwextBuf->hdd_qdf_event);
14216 if (!QDF_IS_STATUS_SUCCESS(status)) {
Jeff Johnson99bac312016-06-28 10:38:18 -070014217 hdd_err("ERROR: HDD qdf event init failed!!");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053014218 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014219 }
14220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014221 /* Register as a wireless device */
14222 dev->wireless_handlers = (struct iw_handler_def *)&we_handler_def;
14223
14224 EXIT();
14225 return 0;
14226}
14227
14228int hdd_unregister_wext(struct net_device *dev)
14229{
Srinivas Girigowdaaf2bfa42017-03-06 18:45:13 -080014230 hdd_debug("dev(%p)", dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080014231
14232 if (dev != NULL) {
14233 rtnl_lock();
14234 dev->wireless_handlers = NULL;
14235 rtnl_unlock();
14236 }
14237
14238 return 0;
14239}