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