diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-07-14 19:36:37 -0600 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2016-07-14 19:36:37 -0600 |
| commit | feb21f72f844e7472dbd3c673ddbe0d1396b8069 (patch) | |
| tree | e931b69a2e2ce616c37bf53a1c643f577cb13715 | |
| parent | a91fd91b65138d01d1962df5cad86b8c4f50b039 (diff) | |
| parent | e9456090d9f86fb758691e331300bb1be1504bd7 (diff) | |
Promotion of wlan-cld2.driver.lnx.1.0-00052.
CRs Change ID Subject
--------------------------------------------------------------------------------------------------------------
1038603 Icdd4a382685471c0d3cf8115cec30fcb307eedfb qcacld-2.0: Fix memory leak issue
1036267 I8f2c04c76c19ed6c14a33426c38b94e82c3b8b63 qcacld-2.0: Block scan done callback and reset variables
1040839 Ie13bf3e3902e21718a2f3474602b87d0e8e9a4be qcacld-2.0: Enable IRAM Dump for HL Platforms
688141 I80a89e0699c841b61912ef42f9306ddd4a73d56d Release 4.0.11.116
688141 I11f3532d16c12fb491e219265f2bdfbdf492511e Release 4.0.11.115
1039104 I3263dd02691000d83d4aef61c75b72d78c28f582 qcacld-2.0: If BSS is unreachable remove it from scan ca
865207 I74f0948061bee593dc15a0ceaab0a25633bb6dd4 qcacld-2.0: CL 1532157 - update fw common interface file
1035577 Icdcb0e83432299014fb46507bdd5978b76919ab5 qcacld-2.0: Extend cfg80211 configure API
1020078 Iea92c6ed42caad9ba2441ce194a04f67a870c10a qcacld-2.0: Convert beacon data rate to hw code
865207 I71f7d6ece056fb6efae535c3a571446e53b16a18 qcacld-2.0: CL 1525510 - update fw common interface file
1040612 Ifba9de788b11ce8cb323827d10f8005029609231 qcacld-2.0: Move NBUF_UPDATE_TX_PKT_COUNT before freeing
865207 I19d96379a93e2d860cce249704834f06f271efb0 qcacld-2.0: CL 1534810 - update fw common interface file
968572 I3c4f8da14dbc70a3102fb1892bb101eb1a90a00d qcacld-2.0: Fix firmware assertion caused by vdev delete
865207 I896b4b53f596df96ec7f023b9301f6a695cd325a qcacld-2.0: CL 1535058 - update fw common interface file
1020078 Ib86c9aacdb52141890b224262d55abbe58b1604d qcacld-2.0: Pass sta_inactivity_timeout to FW
688141 Iff2e1e4fc0a4af16daaf79558ae95f1eae05e6d7 Release 4.0.11.114
658580 I469bf11a506a2901eae2865a69b75a058e276e75 qcacld-2.0: Remove unused gLimSendDisassocFrameThreshold
1038254 Id7f2e8b16767cd4b03671e34d999ef14e7a1c6ce qcacld-2.0: skip VOS_BUG if SSR is already in progress
1020078 Ia2714ba07a67602e552a6f43928f02de0d4d0b9b qcacld-2.0: Add access policy for vendor IE
1040168 I63d143251a0f0f4c54d786de1dd2bb6d6c410e4f qcacld-2.0: Increase SSR Timeout to 250sec
865207 Ib90306a871febe43a076ae8b104442bbc3a4960c qcacld-2.0: CL 1529540 - update fw common interface file
865207 I97ca72f102faecfc3d20409b0d4819a09968417c qcacld-2.0: CL 1527207 - update fw common interface file
1036774 I70f19731e576c65432919588348c19ccbf7bca61 qcacld-2.0: Add debug logs
1038593 I2ea9ae2aa5c6f1bbec65b724de35a0071ea26804 qcacld-2.0: Change print type from %d to %u for unsigned
688141 Ic836dc958e9a68341b46b5662b064d41f8b700e2 Release 4.0.11.119
688141 Id9db35be67b28b3bf9ed156cd24328560faac602 Release 4.0.11.117
1041575 Ieeb7b348ec49c4befdfc1641a97b5a060cadedf4 qcacld-2.0: Pass tx_pkt_fail_cnt_threshold to FW-1
1041062 I1030a2f33e467f752bdded237e5321f0a59a2ea5 qcacld-2.0: Fix TDLS setup failure
1040386 Ie9bb6e7125ea47872530d41d383e885c039e22a2 qcacld-2.0: Fix SAP ACS channel selection failure
1036923 I41dbc6c7a05ea2887e3a63272b02012035bb7fec qcacld-2.0: Reduce log level while processing mgmt rx fr
865207 Ia483de75c1ea7caa6526aaddd15886fe6a4404bd qcacld-2.0: CL 1535819 - update fw common interface file
1039070 I91f028491f0ecc1daa1f6c5ca95d8b97f5c6fa58 qcacld-2.0: Avoid simultaneous execution of SSR in two c
865207 Ib1ba4b9b4ae60ee6e8095d6cfe754bbf2a1c69b2 qcacld-2.0: CL 1527757 - update fw common interface file
1022454 I17d05e265612059410463b7577bb5e8ca1176962 qcacld-2.0: Parse tx packets only once in tx datapath
865207 I31ad0432a0d5f49eed55603ae7d9eeedbdd19876 qcacld-2.0: CL 1524945 - update fw common interface file
1037430 I03528a395e1d88ca2c5aaeca27fa505c3426f778 qcacld-2.0: Don't Tag Non-WoW packets as Runtime PM pack
865207 I2baf13e0ab8f669153b0fb66f2b286c40f1fcc20 qcacld-2.0: CL 1530684 - update fw common interface file
865207 If5855fb1f1bc2a85fd27a34575a009b9f6b1e008 qcacld-2.0: CL 1528698 - update fw common interface file
1037612 Ia90ece227c32fd9aad4a3cb69372e9cb8cf981a8 qcacld-2.0: Fix index error of array element
688141 Icc0dfd75144008ea06951da98d89163c29046a55 Release 4.0.11.118
865207 I9662d4cfee0910706486ae1709749aacd938fa3c qcacld-2.0: CL 1536911 - update fw common interface file
1037455 I13653701e7ed6fb2eb643bbb8e20e7c0102c2ec2 qcacld-2.0: Allow different beacon intervals for SAP
534624 Idd0a23a8180dddabfdd353c0861899411aecfa16 qcacld-2.0: Fix for potential buffer overflow and null p
1036988 Id8c45ff88731288144fe39f5da56748f403dfdb7 qcacld-2.0: Add BSSID entry even if mismatch is seen
1038668 I06696bb2588620244fafde431c4cd56bcb8a4301 qcacld-2.0: Avoid NULL pointer dereference when ASSERT d
1020078 Icb45c37358dcfacbea8e3b3f40b93189d62e1be4 qcacld-2.0: Pass short_retry_limit and long_retry_limit
1039070 Ie56da3e84fcfd3a4742d7cfedbc216ecb915296d Revert "qcacld-2.0: Avoid simultaneous execution of SSR
1037640 Ic9c4e996c4078d09ef7cd9b3b073105d94eb53fb qcacld-2.0: Fix pmfComebackTimer during roaming
1039867 Ia111476e44a3dce24afd6b935ff0eca06accc73a qcacld-2.0: Don't log if netlink_broadcast fails with er
1040737 I553c1691d5d7e98c2db8c9e56e2ba68ae27af506 qcacld-2.0: Remove hardcoded value and set qpower approp
1035768 I3226438b908a96f1b1bd3c2968a0c20eef81a799 qcacld-2.0: Populate correct supported rates from hostap
1020078 I46dc401c26c3eeeb41b345d0fe1b4406394971fb qcacld-2.0: Pass tx_pkt_fail_cnt_threshold to FW
1041698 I99465eeddf75ee6a3f525d43c227e2a8972a73e5 qcacld-2.0: Don't update channel list in 1st scan when S
1039135 I977ed9109a476a092dfb298386625a707bc98191 qcacld-2.0: Fix skb corruption in fragment RX handling
865207 Icc1553c69ab5cf11e499c02922a5b8b28b948055 qcacld-2.0: CL 1525577 - update fw common interface file
Change-Id: I4fd230cf8a3a44a8e0657b38a5c134ac8e43f376
CRs-Fixed: 1038593, 1035577, 1040839, 1037612, 1037455, 1040386, 1038603, 1035768, 1041575, 1020078, 865207, 1040737, 1040612, 1036988, 1039135, 1038668, 1041062, 968572, 1039070, 534624, 1036923, 658580, 1036774, 688141, 1040168, 1039867, 1039104, 1036267, 1037640, 1041698, 1038254, 1037430, 1022454
79 files changed, 3705 insertions, 813 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt.h b/CORE/CLD_TXRX/HTT/htt.h index aa968503817f..c608cf59413a 100644 --- a/CORE/CLD_TXRX/HTT/htt.h +++ b/CORE/CLD_TXRX/HTT/htt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -135,9 +135,13 @@ * 3.27 Add a new interface for flow-control. The following t2h messages have * been included: HTT_T2H_MSG_TYPE_FLOW_POOL_MAP and * HTT_T2H_MSG_TYPE_FLOW_POOL_UNMAP + * 3.28 Add a new interface for ring interface change. The following two h2t + * and one t2h messages have been included: + * HTT_H2T_MSG_TYPE_SRING_SETUP, HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG, + * and HTT_T2H_MSG_TYPE_SRING_SETUP_DONE */ #define HTT_CURRENT_VERSION_MAJOR 3 -#define HTT_CURRENT_VERSION_MINOR 27 +#define HTT_CURRENT_VERSION_MINOR 28 #define HTT_NUM_TX_FRAG_DESC 1024 @@ -458,17 +462,19 @@ PREPACK struct htt_option_tlv_support_tx_msdu_desc_ext_t { /*=== host -> target messages ===============================================*/ enum htt_h2t_msg_type { - HTT_H2T_MSG_TYPE_VERSION_REQ = 0x0, - HTT_H2T_MSG_TYPE_TX_FRM = 0x1, - HTT_H2T_MSG_TYPE_RX_RING_CFG = 0x2, - HTT_H2T_MSG_TYPE_STATS_REQ = 0x3, - HTT_H2T_MSG_TYPE_SYNC = 0x4, - HTT_H2T_MSG_TYPE_AGGR_CFG = 0x5, - HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 0x6, - DEPRECATED_HTT_H2T_MSG_TYPE_MGMT_TX = 0x7, /* no longer used */ - HTT_H2T_MSG_TYPE_WDI_IPA_CFG = 0x8, - HTT_H2T_MSG_TYPE_WDI_IPA_OP_REQ = 0x9, - HTT_H2T_MSG_TYPE_AGGR_CFG_EX = 0xa, /* per vdev amsdu subfrm limit */ + HTT_H2T_MSG_TYPE_VERSION_REQ = 0x0, + HTT_H2T_MSG_TYPE_TX_FRM = 0x1, + HTT_H2T_MSG_TYPE_RX_RING_CFG = 0x2, + HTT_H2T_MSG_TYPE_STATS_REQ = 0x3, + HTT_H2T_MSG_TYPE_SYNC = 0x4, + HTT_H2T_MSG_TYPE_AGGR_CFG = 0x5, + HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 0x6, + DEPRECATED_HTT_H2T_MSG_TYPE_MGMT_TX = 0x7, /* no longer used */ + HTT_H2T_MSG_TYPE_WDI_IPA_CFG = 0x8, + HTT_H2T_MSG_TYPE_WDI_IPA_OP_REQ = 0x9, + HTT_H2T_MSG_TYPE_AGGR_CFG_EX = 0xa, /* per vdev amsdu subfrm limit */ + HTT_H2T_MSG_TYPE_SRING_SETUP = 0xb, + HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG = 0xc, /* keep this last */ HTT_H2T_NUM_MSGS }; @@ -2908,6 +2914,1125 @@ PREPACK struct htt_wdi_ipa_op_request_t ((_var) |= ((_val) << HTT_WDI_IPA_OP_REQUEST_OP_CODE_S)); \ } while (0) +/* + * @brief host -> target HTT_SRING_SETUP message + * + * @details + * After target is booted up, Host can send SRING setup message for + * each host facing LMAC SRING. Target setups up HW registers based + * on setup message and confirms back to Host if response_required is set. + * Host should wait for confirmation message before sending new SRING + * setup message + * + * The message would appear as follows: + * |31 24|23 20|19|18 16|15|14 8|7 0| + * |--------------- +-----------------+----------------+------------------| + * | ring_type | ring_id | pdev_id | msg_type | + * |----------------------------------------------------------------------| + * | ring_base_addr_lo | + * |----------------------------------------------------------------------| + * | ring_base_addr_hi | + * |----------------------------------------------------------------------| + * |ring_misc_cfg_flag|ring_entry_size| ring_size | + * |----------------------------------------------------------------------| + * | ring_head_offset32_remote_addr_lo | + * |----------------------------------------------------------------------| + * | ring_head_offset32_remote_addr_hi | + * |----------------------------------------------------------------------| + * | ring_tail_offset32_remote_addr_lo | + * |----------------------------------------------------------------------| + * | ring_tail_offset32_remote_addr_hi | + * |----------------------------------------------------------------------| + * | ring_msi_addr_lo | + * |----------------------------------------------------------------------| + * | ring_msi_addr_hi | + * |----------------------------------------------------------------------| + * | ring_msi_data | + * |----------------------------------------------------------------------| + * | intr_timer_th |IM| intr_batch_counter_th | + * |----------------------------------------------------------------------| + * | reserved |RR|PTCF| intr_low_threshold | + * |----------------------------------------------------------------------| + * Where + * IM = sw_intr_mode + * RR = response_required + * PTCF = prefetch_timer_cfg + * + * The message is interpreted as follows: + * dword0 - b'0:7 - msg_type: This will be set to + * HTT_H2T_MSG_TYPE_SRING_SETUP + * b'8:15 - pdev_id: + * 0 (for rings at SOC/UMAC level), + * 1/2/3 mac id (for rings at LMAC level) + * b'16:23 - ring_id: identify which ring is to setup, + * more details can be got from enum htt_srng_ring_id + * b'24:31 - ring_type: identify type of host rings, + * more details can be got from enum htt_srng_ring_type + * dword1 - b'0:31 - ring_base_addr_lo: Lower 32bits of ring base address + * dword2 - b'0:31 - ring_base_addr_hi: Upper 32bits of ring base address + * dword3 - b'0:15 - ring_size: size of the ring in unit of 4-bytes words + * b'16:23 - ring_entry_size: Size of each entry in 4-byte word units + * b'24:31 - ring_misc_cfg_flag: Valid only for HW_TO_SW_RING and + * SW_TO_HW_RING. + * Refer to HTT_SRING_SETUP_RING_MISC_CFG_RING defs. + * dword4 - b'0:31 - ring_head_offset32_remote_addr_lo: + * Lower 32 bits of memory address of the remote variable + * storing the 4-byte word offset that identifies the head + * element within the ring. + * (The head offset variable has type A_UINT32.) + * Valid for HW_TO_SW and SW_TO_SW rings. + * dword5 - b'0:31 - ring_head_offset32_remote_addr_hi: + * Upper 32 bits of memory address of the remote variable + * storing the 4-byte word offset that identifies the head + * element within the ring. + * (The head offset variable has type A_UINT32.) + * Valid for HW_TO_SW and SW_TO_SW rings. + * dword6 - b'0:31 - ring_tail_offset32_remote_addr_lo: + * Lower 32 bits of memory address of the remote variable + * storing the 4-byte word offset that identifies the tail + * element within the ring. + * (The tail offset variable has type A_UINT32.) + * Valid for HW_TO_SW and SW_TO_SW rings. + * dword7 - b'0:31 - ring_tail_offset32_remote_addr_hi: + * Upper 32 bits of memory address of the remote variable + * storing the 4-byte word offset that identifies the tail + * element within the ring. + * (The tail offset variable has type A_UINT32.) + * Valid for HW_TO_SW and SW_TO_SW rings. + * dword8 - b'0:31 - ring_msi_addr_lo: Lower 32bits of MSI cfg address + * valid only for HW_TO_SW_RING and SW_TO_HW_RING + * dword9 - b'0:31 - ring_msi_addr_hi: Upper 32bits of MSI cfg address + * valid only for HW_TO_SW_RING and SW_TO_HW_RING + * dword10 - b'0:31 - ring_msi_data: MSI data + * Refer to HTT_SRING_SETUP_RING_MSC_CFG_xxx defs + * valid only for HW_TO_SW_RING and SW_TO_HW_RING + * dword11 - b'0:14 - intr_batch_counter_th: + * batch counter threshold is in units of 4-byte words. + * HW internally maintains and increments batch count. + * (see SRING spec for detail description). + * When batch count reaches threshold value, an interrupt + * is generated by HW. + * b'15 - sw_intr_mode: + * This configuration shall be static. + * Only programmed at power up. + * 0: generate pulse style sw interrupts + * 1: generate level style sw interrupts + * b'16:31 - intr_timer_th: + * The timer init value when timer is idle or is + * initialized to start downcounting. + * In 8us units (to cover a range of 0 to 524 ms) + * dword12 - b'0:15 - intr_low_threshold: + * Used only by Consumer ring to generate ring_sw_int_p. + * Ring entries low threshold water mark, that is used + * in combination with the interrupt timer as well as + * the the clearing of the level interrupt. + * b'16:18 - prefetch_timer_cfg: + * Used only by Consumer ring to set timer mode to + * support Application prefetch handling. + * The external tail offset/pointer will be updated + * at following intervals: + * 3'b000: (Prefetch feature disabled; used only for debug) + * 3'b001: 1 usec + * 3'b010: 4 usec + * 3'b011: 8 usec (default) + * 3'b100: 16 usec + * Others: Reserverd + * b'19 - response_required: + * Host needs HTT_T2H_MSG_TYPE_SRING_SETUP_DONE as response + * b'20:31 - reserved: reserved for future use + */ +PREPACK struct htt_sring_setup_t { + A_UINT32 msg_type: 8, + pdev_id: 8, + ring_id: 8, + ring_type: 8; + A_UINT32 ring_base_addr_lo; + A_UINT32 ring_base_addr_hi; + A_UINT32 ring_size: 16, + ring_entry_size: 8, + ring_misc_cfg_flag: 8; + A_UINT32 ring_head_offset32_remote_addr_lo; + A_UINT32 ring_head_offset32_remote_addr_hi; + A_UINT32 ring_tail_offset32_remote_addr_lo; + A_UINT32 ring_tail_offset32_remote_addr_hi; + A_UINT32 ring_msi_addr_lo; + A_UINT32 ring_msi_addr_hi; + A_UINT32 ring_msi_data; + A_UINT32 intr_batch_counter_th: 15, + sw_intr_mode: 1, + intr_timer_th: 16; + A_UINT32 intr_low_threshold: 16, + prefetch_timer_cfg: 3, + response_required: 1, + reserved1: 12; +} POSTPACK; + +enum htt_srng_ring_type { + HTT_HW_TO_SW_RING = 0, + HTT_SW_TO_HW_RING, + HTT_SW_TO_SW_RING, + /* Insert new ring types above this line */ +}; + +enum htt_srng_ring_id { + HTT_RXDMA_HOST_BUF_RING = 0, /* Used by FW to feed remote buffers and update remote packets */ + HTT_RXDMA_MONITOR_STATUS_RING, /* For getting all PPDU/MPDU/MSDU status deescriptors on host for monitor VAP or packet log purposes */ + HTT_RXDMA_MONITOR_BUF_RING, /* For feeding free host buffers to RxDMA for monitor traffic upload */ + HTT_RXDMA_MONITOR_DESC_RING, /* For providing free LINK_DESC to RXDMA for monitor traffic upload */ + HTT_RXDMA_MONITOR_DEST_RING, /* Per MPDU indication to host for monitor traffic upload */ + HTT_HOST1_TO_FW_RXBUF_RING, /* (mobile only) used by host to provide remote RX buffers */ + HTT_HOST2_TO_FW_RXBUF_RING, /* (mobile only) second ring used by host to provide remote RX buffers */ + /* Add Other SRING which can't be directly configured by host software above this line */ +}; + +#define HTT_SRING_SETUP_SZ (sizeof(struct htt_sring_setup_t)) + +#define HTT_SRING_SETUP_PDEV_ID_M 0x0000ff00 +#define HTT_SRING_SETUP_PDEV_ID_S 8 +#define HTT_SRING_SETUP_PDEV_ID_GET(_var) \ + (((_var) & HTT_SRING_SETUP_PDEV_ID_M) >> \ + HTT_SRING_SETUP_PDEV_ID_S) +#define HTT_SRING_SETUP_PDEV_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_PDEV_ID, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_PDEV_ID_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_ID_M 0x00ff0000 +#define HTT_SRING_SETUP_RING_ID_S 16 +#define HTT_SRING_SETUP_RING_ID_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_ID_M) >> \ + HTT_SRING_SETUP_RING_ID_S) +#define HTT_SRING_SETUP_RING_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_ID, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_ID_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_TYPE_M 0xff000000 +#define HTT_SRING_SETUP_RING_TYPE_S 24 +#define HTT_SRING_SETUP_RING_TYPE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_TYPE_M) >> \ + HTT_SRING_SETUP_RING_TYPE_S) +#define HTT_SRING_SETUP_RING_TYPE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_TYPE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_TYPE_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_BASE_ADDR_LO_M 0xffffffff +#define HTT_SRING_SETUP_RING_BASE_ADDR_LO_S 0 +#define HTT_SRING_SETUP_RING_BASE_ADDR_LO_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_BASE_ADDR_LO_M) >> \ + HTT_SRING_SETUP_RING_BASE_ADDR_LO_S) +#define HTT_SRING_SETUP_RING_BASE_ADDR_LO_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_BASE_ADDR_LO, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_BASE_ADDR_LO_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_BASE_ADDR_HI_M 0xffffffff +#define HTT_SRING_SETUP_RING_BASE_ADDR_HI_S 0 +#define HTT_SRING_SETUP_RING_BASE_ADDR_HI_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_BASE_ADDR_HI_M) >> \ + HTT_SRING_SETUP_RING_BASE_ADDR_HI_S) +#define HTT_SRING_SETUP_RING_BASE_ADDR_HI_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_BASE_ADDR_HI, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_BASE_ADDR_HI_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_SIZE_M 0x0000ffff +#define HTT_SRING_SETUP_RING_SIZE_S 0 +#define HTT_SRING_SETUP_RING_SIZE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_SIZE_M) >> \ + HTT_SRING_SETUP_RING_SIZE_S) +#define HTT_SRING_SETUP_RING_SIZE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_SIZE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_SIZE_S)); \ + } while (0) + +#define HTT_SRING_SETUP_ENTRY_SIZE_M 0x00ff00000 +#define HTT_SRING_SETUP_ENTRY_SIZE_S 16 +#define HTT_SRING_SETUP_ENTRY_SIZE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_ENTRY_SIZE_M) >> \ + HTT_SRING_SETUP_ENTRY_SIZE_S) +#define HTT_SRING_SETUP_ENTRY_SIZE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_ENTRY_SIZE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_ENTRY_SIZE_S)); \ + } while (0) + +#define HTT_SRING_SETUP_MISC_CFG_FLAG_M 0xff0000000 +#define HTT_SRING_SETUP_MISC_CFG_FLAG_S 24 +#define HTT_SRING_SETUP_MISC_CFG_FLAG_GET(_var) \ + (((_var) & HTT_SRING_SETUP_MISC_CFG_FLAG_M) >> \ + HTT_SRING_SETUP_MISC_CFG_FLAG_S) +#define HTT_SRING_SETUP_MISC_CFG_FLAG_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_MISC_CFG_FLAG, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_MISC_CFG_FLAG_S)); \ + } while (0) + +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_M 0xffffffff +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_S 0 +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_GET(_var) \ + (((_var) & HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_M) >> \ + HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_S) +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_LO_S)); \ + } while (0) + +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_M 0xffffffff +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_S 0 +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_GET(_var) \ + (((_var) & HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_M) >> \ + HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_S) +#define HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_HEAD_OFFSET32_REMOTE_BASE_ADDR_HI_S)); \ + } while (0) + +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_M 0xffffffff +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_S 0 +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_GET(_var) \ + (((_var) & HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_M) >> \ + HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_S) +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_LO_S)); \ + } while (0) + +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_M 0xffffffff +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_S 0 +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_GET(_var) \ + (((_var) & HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_M) >> \ + HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_S) +#define HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_TAIL_OFFSET32_REMOTE_BASE_ADDR_HI_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_MISC_ADDR_LO_M 0xffffffff +#define HTT_SRING_SETUP_RING_MISC_ADDR_LO_S 0 +#define HTT_SRING_SETUP_RING_MISC_ADDR_LO_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_ADDR_LO_M) >> \ + HTT_SRING_SETUP_RING_MISC_ADDR_LO_S) +#define HTT_SRING_SETUP_RING_MISC_ADDR_LO_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_ADDR_LO, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_ADDR_LO_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_MISC_ADDR_HI_M 0xffffffff +#define HTT_SRING_SETUP_RING_MISC_ADDR_HI_S 0 +#define HTT_SRING_SETUP_RING_MISC_ADDR_HI_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_ADDR_HI_M) >> \ + HTT_SRING_SETUP_RING_MISC_ADDR_HI_S) +#define HTT_SRING_SETUP_RING_MISC_ADDR_HI_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_ADDR_HI, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_ADDR_HI_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_MISC_DATA_M 0xffffffff +#define HTT_SRING_SETUP_RING_MISC_DATA_S 0 +#define HTT_SRING_SETUP_RING_MISC_DATA_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_S)); \ + } while (0) + +/* This control bit is applicable to only Producer, which updates Ring ID field + * of each descriptor before pushing into the ring. + * 0: updates ring_id(default) + * 1: ring_id updating disabled */ +#define HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_M 0x01 +#define HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_S 0 +#define HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_RING_ID_DISABLE_S)); \ + } while (0) + +/* This control bit is applicable to only Producer, which updates Loopcnt field + * of each descriptor before pushing into the ring. + * 0: updates Loopcnt(default) + * 1: Loopcnt updating disabled */ +#define HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_M 0x02 +#define HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_S 1 +#define HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_LOOPCOUNT_DISABLE_S)); \ + } while (0) + +/* Secured access enable/disable bit. SRNG drives value of this register bit + * into security_id port of GXI/AXI. */ +#define HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_M 0x04 +#define HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_S 2 +#define HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_SECURITY, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_SECURITY_S)); \ + } while (0) + +/* During MSI write operation, SRNG drives value of this register bit into + * swap bit of GXI/AXI. */ +#define HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_M 0x08 +#define HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_S 3 +#define HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_MSI_SWAP_S)); \ + } while (0) + +/* During Pointer write operation, SRNG drives value of this register bit into + * swap bit of GXI/AXI. */ +#define HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_M 0x10 +#define HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_S 4 +#define HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_HOST_FW_SWAP_S)); \ + } while (0) + +/* During any data or TLV write operation, SRNG drives value of this register + * bit into swap bit of GXI/AXI. */ +#define HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_M 0x20 +#define HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_S 5 +#define HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_M) >> \ + HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_S) +#define HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RING_MISC_DATA_TLV_SWAP_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RING_MISC_CFG_RESERVED1 0x40 +#define HTT_SRING_SETUP_RING_MISC_CFG_RESERVED2 0x80 + +#define HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_M 0x00007fff +#define HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_S 0 +#define HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_GET(_var) \ + (((_var) & HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_M) >> \ + HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_S) +#define HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_INTR_BATCH_COUNTER_TH_S)); \ + } while (0) + +#define HTT_SRING_SETUP_SW_INTR_MODE_M 0x00008000 +#define HTT_SRING_SETUP_SW_INTR_MODE_S 15 +#define HTT_SRING_SETUP_SW_INTR_MODE_GET(_var) \ + (((_var) & HTT_SRING_SETUP_SW_INTR_MODE_M) >> \ + HTT_SRING_SETUP_SW_INTR_MODE_S) +#define HTT_SRING_SETUP_SW_INTR_MODE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_SW_INTR_MODE, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_SW_INTR_MODE_S)); \ + } while (0) + +#define HTT_SRING_SETUP_INTR_TIMER_TH_M 0xffff0000 +#define HTT_SRING_SETUP_INTR_TIMER_TH_S 16 +#define HTT_SRING_SETUP_INTR_TIMER_TH_GET(_var) \ + (((_var) & HTT_SRING_SETUP_INTR_TIMER_TH_M) >> \ + HTT_SRING_SETUP_INTR_TIMER_TH_S) +#define HTT_SRING_SETUP_INTR_TIMER_TH_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_INTR_TIMER_TH, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_INTR_TIMER_TH_S)); \ + } while (0) + +#define HTT_SRING_SETUP_INTR_LOW_TH_M 0x0000ffff +#define HTT_SRING_SETUP_INTR_LOW_TH_S 0 +#define HTT_SRING_SETUP_INTR_LOW_TH_GET(_var) \ + (((_var) & HTT_SRING_SETUP_INTR_LOW_TH_M) >> \ + HTT_SRING_SETUP_INTR_LOW_TH_S) +#define HTT_SRING_SETUP_INTR_LOW_TH_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_INTR_LOW_TH, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_INTR_LOW_TH_S)); \ + } while (0) + +#define HTT_SRING_SETUP_PREFETCH_TIMER_CFG_M 0x00070000 +#define HTT_SRING_SETUP_PREFETCH_TIMER_CFG_S 16 +#define HTT_SRING_SETUP_PREFETCH_TIMER_CFG_GET(_var) \ + (((_var) & HTT_SRING_SETUP_PREFETCH_TIMER_CFG_M) >> \ + HTT_SRING_SETUP_PREFETCH_TIMER_CFG_S) +#define HTT_SRING_SETUP_PREFETCH_TIMER_CFG_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_PREFETCH_TIMER_CFG, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_PREFETCH_TIMER_CFG_S)); \ + } while (0) + +#define HTT_SRING_SETUP_RESPONSE_REQUIRED_M 0x00080000 +#define HTT_SRING_SETUP_RESPONSE_REQUIRED_S 19 +#define HTT_SRING_SETUP_RESPONSE_REQUIRED_GET(_var) \ + (((_var) & HTT_SRING_SETUP_RESPONSE_REQUIRED_M) >> \ + HTT_SRING_SETUP_RESPONSE_REQUIRED_S) +#define HTT_SRING_SETUP_RESPONSE_REQUIRED_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_RESPONSE_REQUIRED, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_RESPONSE_REQUIRED_S)); \ + } while (0) + + +/** + * @brief HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG Message + * + * @details + * HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG message is sent by host to + * configure RXDMA rings. + * The configuration is per ring based and includes both packet subtypes + * and PPDU/MPDU TLVs. + * + * The message would appear as follows: + * + * |31 26|25|24|23 16|15 8|7 0| + * |-----------------+----------------+----------------+---------------| + * | rsvd1 |PS|SS| ring_id | pdev_id | msg_type | + * |-------------------------------------------------------------------| + * | rsvd2 | ring_buffer_size | + * |-------------------------------------------------------------------| + * | packet_type_enable_flags_0 | + * |-------------------------------------------------------------------| + * | packet_type_enable_flags_1 | + * |-------------------------------------------------------------------| + * | packet_type_enable_flags_2 | + * |-------------------------------------------------------------------| + * | packet_type_enable_flags_3 | + * |-------------------------------------------------------------------| + * | tlv_filter_in_flags | + * |-------------------------------------------------------------------| + * Where: + * PS = pkt_swap + * SS = status_swap + * The message is interpreted as follows: + * dword0 - b'0:7 - msg_type: This will be set to + * HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG + * b'8:15 - pdev_id: + * 0 (for rings at SOC/UMAC level), + * 1/2/3 mac id (for rings at LMAC level) + * b'16:23 - ring_id : Identify the ring to configure. + * More details can be got from enum htt_srng_ring_id + * b'24 - status_swap: 1 is to swap status TLV + * b'25 - pkt_swap: 1 is to swap packet TLV + * b'26:31 - rsvd1: reserved for future use + * dword1 - b'0:16 - ring_buffer_size: size of bufferes referenced by rx ring, + * in byte units. + * Valid only for HW_TO_SW_RING and SW_TO_HW_RING + * - b'16:31 - rsvd2: Reserved for future use + * dword2 - b'0:31 - packet_type_enable_flags_0: + * Enable MGMT packet from 0b0000 to 0b1001 + * bits from low to high: FP, MD, MO - 3 bits + * FP: Filter_Pass + * MD: Monitor_Direct + * MO: Monitor_Other + * 10 mgmt subtypes * 3 bits -> 30 bits + * Refer to PKT_TYPE_ENABLE_FLAG0_xxx_MGMT_xxx defs + * dword3 - b'0:31 - packet_type_enable_flags_1: + * Enable MGMT packet from 0b1010 to 0b1111 + * bits from low to high: FP, MD, MO - 3 bits + * Refer to PKT_TYPE_ENABLE_FLAG1_xxx_MGMT_xxx defs + * dword4 - b'0:31 - packet_type_enable_flags_2: + * Enable CTRL packet from 0b0000 to 0b1001 + * bits from low to high: FP, MD, MO - 3 bits + * Refer to PKT_TYPE_ENABLE_FLAG2_xxx_CTRL_xxx defs + * dword5 - b'0:31 - packet_type_enable_flags_3: + * Enable CTRL packet from 0b1010 to 0b1111, + * MCAST_DATA, UCAST_DATA, NULL_DATA + * bits from low to high: FP, MD, MO - 3 bits + * Refer to PKT_TYPE_ENABLE_FLAG3_xxx_CTRL_xxx defs + * dword6 - b'0:31 - tlv_filter_in_flags: + * Filter in Attention/MPDU/PPDU/Header/User tlvs + * Refer to CFG_TLV_FILTER_IN_FLAG defs + */ +PREPACK struct htt_rx_ring_selection_cfg_t { + A_UINT32 msg_type: 8, + pdev_id: 8, + ring_id: 8, + status_swap: 1, + pkt_swap: 1, + rsvd1: 6; + A_UINT32 ring_buffer_size: 16, + rsvd2: 16; + A_UINT32 packet_type_enable_flags_0; + A_UINT32 packet_type_enable_flags_1; + A_UINT32 packet_type_enable_flags_2; + A_UINT32 packet_type_enable_flags_3; + A_UINT32 tlv_filter_in_flags; +} POSTPACK; + +#define HTT_RX_RING_SELECTION_CFG_SZ (sizeof(struct htt_rx_ring_selection_cfg_t)) + +#define HTT_RX_RING_SELECTION_CFG_PDEV_ID_M 0x0000ff00 +#define HTT_RX_RING_SELECTION_CFG_PDEV_ID_S 8 +#define HTT_RX_RING_SELECTION_CFG_PDEV_ID_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PDEV_ID_M) >> \ + HTT_RX_RING_SELECTION_CFG_PDEV_ID_S) +#define HTT_RX_RING_SELECTION_CFG_PDEV_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PDEV_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PDEV_ID_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_RING_ID_M 0x00ff0000 +#define HTT_RX_RING_SELECTION_CFG_RING_ID_S 16 +#define HTT_RX_RING_SELECTION_CFG_RING_ID_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_RING_ID_M) >> \ + HTT_RX_RING_SELECTION_CFG_RING_ID_S) +#define HTT_RX_RING_SELECTION_CFG_RING_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_RING_ID, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_RING_ID_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP_M 0x01000000 +#define HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP_S 24 +#define HTT_RX_RING_SELECTION_CFG_STATUS_TLV_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP_M) >> \ + HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP_S) +#define HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_STATUS_TLV_SWAP_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP_M 0x02000000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP_S 25 +#define HTT_RX_RING_SELECTION_CFG_PKT_TLV_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP_M) >> \ + HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP_S) +#define HTT_RX_RING_SELECTION_CFG_PKT_TLV_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PKT_TLV_SWAP_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_M 0x0000ffff +#define HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_S 0 +#define HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_M) >> \ + HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_S) +#define HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_RING_BUFFER_SIZE_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_M 0xffffffff +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_S 0 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_M) >> \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_S) +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_0_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_M 0xffffffff +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_S 0 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_M) >> \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_S) +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_1_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_M 0xffffffff +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_S 0 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_M) >> \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_S) +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_2_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_M 0xffffffff +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_S 0 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_M) >> \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_S) +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG_3_S)); \ + } while (0) + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_M 0xffffffff +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_S 0 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_GET(_var) \ + (((_var) & HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_M) >> \ + HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_S) +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG, _val); \ + ((_var) |= ((_val) << HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_S)); \ + } while (0) + +/* + * Subtype based MGMT frames enable bits. + * FP: Filter_Pass, MD: Monitor_Direct MO: Monitor_Other + */ +/* association request */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0000_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0000_S 0 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0000_M 0x00000002 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0000_S 1 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0000_M 0x00000004 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0000_S 2 + +/* association response */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0001_M 0x00000008 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0001_S 3 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0001_M 0x00000010 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0001_S 4 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0001_M 0x00000020 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0001_S 5 + +/* Reassociation request */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0010_M 0x00000040 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0010_S 6 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0010_M 0x00000080 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0010_S 7 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0010_M 0x00000100 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0010_S 8 + +/* Reassociation response */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0011_M 0x00000200 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0011_S 9 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0011_M 0x00000400 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0011_S 10 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0011_M 0x00000800 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0011_S 11 + +/* Probe request */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0100_M 0x00001000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0100_S 12 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0100_M 0x00002000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0100_S 13 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0100_M 0x00004000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0100_S 14 + +/* Probe response */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0101_M 0x00008000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0101_S 15 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0101_M 0x00010000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0101_S 16 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0101_M 0x00020000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0101_S 17 + +/* Timing Advertisement */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0110_M 0x00040000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0110_S 18 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0110_M 0x00080000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0110_S 19 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0110_M 0x00100000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0110_S 20 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0111_M 0x00200000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_0111_S 21 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0111_M 0x00400000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_0111_S 22 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0111_M 0x00800000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_0111_S 23 + +/* Beacon */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_1000_M 0x01000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_1000_S 24 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_1000_M 0x02000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_1000_S 25 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_1000_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_1000_S 26 + +/* ATIM */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_FP_MGMT_1001_S 27 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MD_MGMT_1001_S 28 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG0_MO_MGMT_1001_S 29 + +/* Disassociation */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1010_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1010_S 0 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1010_M 0x00000002 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1010_S 1 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1010_M 0x00000004 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1010_S 2 + +/* Authentication */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1011_M 0x00000008 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1011_S 3 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1011_M 0x00000010 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1011_S 4 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1011_M 0x00000020 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1011_S 5 + +/* Deauthentication */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1100_M 0x00000040 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1100_S 6 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1100_M 0x00000080 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1100_S 7 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1100_M 0x00000100 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1100_S 8 + +/* Action */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1101_M 0x00000200 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1101_S 9 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1101_M 0x00000400 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1101_S 10 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1101_M 0x00000800 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1101_S 11 + +/* Action No Ack */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1110_M 0x00001000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1110_S 12 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1110_M 0x00002000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1110_S 13 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1110_M 0x00004000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1110_S 14 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1111_M 0x00008000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_FP_MGMT_1111_S 15 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1111_M 0x00010000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MD_MGMT_1111_S 16 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1111_M 0x00020000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG1_MO_MGMT_1111_S 17 + +/* + * Subtype based CTRL frames enable bits. + * FP: Filter_Pass, MD: Monitor_Direct, MO: Monitor_Other + */ +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0000_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0000_S 0 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0000_M 0x00000002 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0000_S 1 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0000_M 0x00000004 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0000_S 2 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0001_M 0x00000008 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0001_S 3 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0001_M 0x00000010 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0001_S 4 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0001_M 0x00000020 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0001_S 5 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0010_M 0x00000040 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0010_S 6 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0010_M 0x00000080 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0010_S 7 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0010_M 0x00000100 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0010_S 8 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0011_M 0x00000200 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0011_S 9 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0011_M 0x00000400 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0011_S 10 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0011_M 0x00000800 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0011_S 11 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0100_M 0x00001000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0100_S 12 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0100_M 0x00002000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0100_S 13 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0100_M 0x00004000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0100_S 14 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0101_M 0x00008000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0101_S 15 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0101_M 0x00010000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0101_S 16 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0101_M 0x00020000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0101_S 17 + +/* Reserved */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0110_M 0x00040000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0110_S 18 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0110_M 0x00080000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0110_S 19 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0110_M 0x00100000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0110_S 20 + +/* Control Wrapper */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0111_M 0x00200000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_0111_S 21 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0111_M 0x00400000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_0111_S 22 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0111_M 0x00800000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_0111_S 23 + +/* Block Ack Request */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_1000_M 0x01000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_1000_S 24 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_1000_M 0x02000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_1000_S 25 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_1000_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_1000_S 26 + +/* Block Ack*/ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_FP_CTRL_1001_S 27 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MD_CTRL_1001_S 28 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_1001_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG2_MO_CTRL_1001_S 29 + +/* PS-POLL */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1010_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1010_S 0 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1010_M 0x00000002 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1010_S 1 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1010_M 0x00000004 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1010_S 2 + +/* RTS */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1011_M 0x00000008 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1011_S 3 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1011_M 0x00000010 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1011_S 4 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1011_M 0x00000020 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1011_S 5 + +/* CTS */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1100_M 0x00000040 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1100_S 6 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1100_M 0x00000080 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1100_S 7 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1100_M 0x00000100 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1100_S 8 + +/* ACK */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1101_M 0x00000200 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1101_S 9 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1101_M 0x00000400 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1101_S 10 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1101_M 0x00000800 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1101_S 11 + +/* CF-END */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1110_M 0x00001000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1110_S 12 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1110_M 0x00002000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1110_S 13 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1110_M 0x00004000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1110_S 14 + +/* CF-END + CF-ACK */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1111_M 0x00008000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_CTRL_1111_S 15 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1111_M 0x00010000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_CTRL_1111_S 16 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1111_M 0x00020000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_CTRL_1111_S 17 + +/* Multicast data */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_MCAST_M 0x00040000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_MCAST_S 18 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_MCAST_M 0x00080000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_MCAST_S 19 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_MCAST_M 0x00100000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_MCAST_S 20 + +/* Unicast data */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_UCAST_M 0x00200000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_UCAST_S 21 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_UCAST_M 0x00400000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_UCAST_S 22 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_UCAST_M 0x00800000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_UCAST_S 23 + +/* NULL data */ +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_NULL_M 0x01000000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_FP_DATA_NULL_S 24 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_NULL_M 0x02000000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MD_DATA_NULL_S 25 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_NULL_M 0x04000000 +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_FLAG3_MO_DATA_NULL_S 26 + +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_SET(word, httsym, value) \ + do { \ + HTT_CHECK_SET_VAL(httsym, value); \ + (word) |= (value) << httsym##_S; \ + } while (0) +#define HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_GET(word, httsym) \ + (((word) & httsym##_M) >> httsym##_S) + +#define htt_rx_ring_pkt_enable_subtype_set( \ + word, flag, mode, type, subtype, val) \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_SET( \ + word, HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_##flag##_##mode##_##type##_##subtype, val) + +#define htt_rx_ring_pkt_enable_subtype_get( \ + word, flag, mode, type, subtype) \ + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_GET( \ + word, HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_##flag##_##mode##_##type##_##subtype) + +/* Definition to filter in TLVs */ +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MPDU_START_M 0x00000001 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MPDU_START_S 0 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MSDU_START_M 0x00000002 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MSDU_START_S 1 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PACKET_M 0x00000004 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PACKET_S 2 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MSDU_END_M 0x00000008 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MSDU_END_S 3 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MPDU_END_M 0x00000010 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_MPDU_END_S 4 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PACKET_HEADER_M 0x00000020 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PACKET_HEADER_S 5 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_RESERVED_M 0x00000040 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_RESERVED_S 6 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_ATTENTION_M 0x00000080 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_ATTENTION_S 7 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_START_M 0x00000100 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_START_S 8 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_M 0x00000200 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_S 9 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_USER_STATS_M 0x00000400 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_USER_STATS_S 10 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_USER_STATS_EXT_M 0x00000800 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_USER_STATS_EXT_S 11 + +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_STATUS_DONE_M 0x00001000 +#define HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_PPDU_END_STATUS_DONE_S 12 + +#define HTT_RX_RING_TLV_ENABLE_SET(word, httsym, enable) \ + do { \ + HTT_CHECK_SET_VAL(httsym, enable); \ + (word) |= (enable) << httsym##_S; \ + } while (0) +#define HTT_RX_RING_TLV_ENABLE_GET(word, httsym) \ + (((word) & httsym##_M) >> httsym##_S) + +#define htt_rx_ring_tlv_filter_in_enable_set(word, tlv, enable) \ + HTT_RX_RING_TLV_ENABLE_SET( \ + word, HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_##tlv, enable) + +#define htt_rx_ring_tlv_filter_in_enable_get(word, tlv) \ + HTT_RX_RING_TLV_ENABLE_GET( \ + word, HTT_RX_RING_SELECTION_CFG_TLV_FILTER_IN_FLAG_RX_##tlv) @@ -2942,6 +4067,7 @@ enum htt_t2h_msg_type { HTT_T2H_MSG_TYPE_RATE_REPORT = 0x17, HTT_T2H_MSG_TYPE_FLOW_POOL_MAP = 0x18, HTT_T2H_MSG_TYPE_FLOW_POOL_UNMAP = 0x19, + HTT_T2H_MSG_TYPE_SRING_SETUP_DONE = 0x1a, HTT_T2H_MSG_TYPE_TEST, /* keep this last */ @@ -6921,4 +8047,80 @@ PREPACK struct htt_flow_pool_unmap_t { ((_var) |= ((_val) << HTT_FLOW_POOL_UNMAP_FLOW_POOL_ID_S)); \ } while (0) +/** + * @brief HTT_T2H_MSG_TYPE_SRING_SETUP_DONE Message + * + * @details + * HTT_T2H_MSG_TYPE_SRING_SETUP_DONE message is sent by the target when + * SRNG ring setup is done + * + * This message indicates whether the last setup operation is successful. + * It will be sent to host when host set respose_required bit in + * HTT_H2T_MSG_TYPE_SRING_SETUP. + * The message would appear as follows: + * + * |31 24|23 16|15 8|7 0| + * |--------------- +----------------+----------------+----------------| + * | setup_status | ring_id | pdev_id | msg_type | + * |-------------------------------------------------------------------| + * + * The message is interpreted as follows: + * dword0 - b'0:7 - msg_type: This will be set to + * HTT_T2H_MSG_TYPE_SRING_SETUP_DONE + * b'8:15 - pdev_id: + * 0 (for rings at SOC/UMAC level), + * 1/2/3 mac id (for rings at LMAC level) + * b'16:23 - ring_id: Identify the ring which is set up + * More details can be got from enum htt_srng_ring_id + * b'24:31 - setup_status: Indicate status of setup operation + * Refer to htt_ring_setup_status + */ + +PREPACK struct htt_sring_setup_done_t { + A_UINT32 msg_type: 8, + pdev_id: 8, + ring_id: 8, + setup_status: 8; +} POSTPACK; + +enum htt_ring_setup_status { + htt_ring_setup_status_ok = 0, + htt_ring_setup_status_error, +}; + +#define HTT_SRING_SETUP_DONE_SZ (sizeof(struct htt_sring_setup_done_t)) + +#define HTT_SRING_SETUP_DONE_PDEV_ID_M 0x0000ff00 +#define HTT_SRING_SETUP_DONE_PDEV_ID_S 8 +#define HTT_SRING_SETUP_DONE_PDEV_ID_GET(_var) \ + (((_var) & HTT_SRING_SETUP_DONE_PDEV_ID_M) >> \ + HTT_SRING_SETUP_DONE_PDEV_ID_S) +#define HTT_SRING_SETUP_DONE_PDEV_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_DONE_PDEV_ID, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_DONE_PDEV_ID_S)); \ + } while (0) + +#define HTT_SRING_SETUP_DONE_RING_ID_M 0x00ff0000 +#define HTT_SRING_SETUP_DONE_RING_ID_S 16 +#define HTT_SRING_SETUP_DONE_RING_ID_GET(_var) \ + (((_var) & HTT_SRING_SETUP_DONE_RING_ID_M) >> \ + HTT_SRING_SETUP_DONE_RING_ID_S) +#define HTT_SRING_SETUP_DONE_RING_ID_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_DONE_RING_ID, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_DONE_RING_ID_S)); \ + } while (0) + +#define HTT_SRING_SETUP_DONE_STATUS_M 0xff000000 +#define HTT_SRING_SETUP_DONE_STATUS_S 24 +#define HTT_SRING_SETUP_DONE_STATUS_GET(_var) \ + (((_var) & HTT_SRING_SETUP_DONE_STATUS_M) >> \ + HTT_SRING_SETUP_DONE_STATUS_S) +#define HTT_SRING_SETUP_DONE_STATUS_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_SRING_SETUP_DONE_STATUS, _val); \ + ((_var) |= ((_val) << HTT_SRING_SETUP_DONE_STATUS_S)); \ + } while (0) + #endif diff --git a/CORE/CLD_TXRX/HTT/htt_t2h.c b/CORE/CLD_TXRX/HTT/htt_t2h.c index aa8c43cafa42..b736a970c575 100644 --- a/CORE/CLD_TXRX/HTT/htt_t2h.c +++ b/CORE/CLD_TXRX/HTT/htt_t2h.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -214,11 +214,44 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg ) tid = HTT_RX_FRAG_IND_EXT_TID_GET(*msg_word); HTT_RX_FRAG_SET_LAST_MSDU(pdev, htt_t2h_msg); + /* If packet len is invalid, will discard this frame. */ + if (pdev->cfg.is_high_latency) { + u_int32_t rx_pkt_len = 0; + + rx_pkt_len = adf_nbuf_len(htt_t2h_msg); + + if (rx_pkt_len < (HTT_RX_FRAG_IND_BYTES + + sizeof(struct hl_htt_rx_ind_base)+ + sizeof(struct ieee80211_frame))) { + + adf_os_print("%s: invalid packet len, %u\n", + __FUNCTION__, + rx_pkt_len); + /* + * This buf will be freed before + * exiting this function. + */ + break; + } + } + ol_rx_frag_indication_handler( pdev->txrx_pdev, htt_t2h_msg, peer_id, tid); + + if (pdev->cfg.is_high_latency) { + /* + * For high latency solution, HTT_T2H_MSG_TYPE_RX_FRAG_IND + * message and RX packet share the same buffer. All buffer will + * be freed by ol_rx_frag_indication_handler or upper layer to + * avoid double free issue. + * + */ + return; + } + break; } case HTT_T2H_MSG_TYPE_RX_ADDBA: diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index 9bc1e5bb3bdb..32125d41baf2 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -873,17 +873,17 @@ static int tlshim_mgmt_rx_wmi_handler(void *context, u_int8_t *data, VOS_STATUS ret = VOS_STATUS_SUCCESS; if (vos_is_logp_in_progress(VOS_MODULE_ID_TL, NULL)) { - TLSHIM_LOGE("%s: LOGP in progress\n", __func__); + TLSHIM_LOGD("%s: LOGP in progress\n", __func__); return (-1); } if (vos_is_load_unload_in_progress(VOS_MODULE_ID_TL, NULL)) { - TLSHIM_LOGE("%s: load/unload in progress\n", __func__); + TLSHIM_LOGD("%s: load/unload in progress\n", __func__); return (-1); } if (!tl_shim) { - TLSHIM_LOGE("%s: tl shim ctx is NULL\n", __func__); + TLSHIM_LOGD("%s: tl shim ctx is NULL\n", __func__); return (-1); } @@ -1789,6 +1789,7 @@ VOS_STATUS WLANTL_ClearSTAClient(void *vos_ctx, u_int8_t sta_id) } #endif + TLSHIM_LOGD("%s: called for sta_id %d", __func__, sta_id); /* Purge the cached rx frame queue */ tl_shim_flush_rx_frames(vos_ctx, tl_shim, sta_id, 1); adf_os_spin_lock_bh(&tl_shim->bufq_lock); @@ -1845,6 +1846,7 @@ VOS_STATUS WLANTL_RegisterSTAClient(void *vos_ctx, sta_info->vdev_id = peer->vdev->vdev_id; adf_os_spin_unlock_bh(&sta_info->stainfo_lock); + TLSHIM_LOGD("%s: called for sta_id %d", __func__, sta_desc->ucSTAId); param.qos_capable = sta_desc->ucQosEnabled; wdi_in_peer_update(peer->vdev, peer->mac_addr.raw, ¶m, ol_txrx_peer_update_qos_capable); diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c index cdbcc7667d07..b084889eb040 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -128,14 +128,11 @@ static inline void OL_RX_FRAG_PULL_HDR(htt_pdev_handle htt_pdev, rx_desc_len = htt_rx_msdu_rx_desc_size_hl(htt_pdev, rx_desc); adf_nbuf_pull_head(frag, rx_desc_len + hdrsize); } -#define OL_RX_FRAG_CLONE(frag) \ - adf_nbuf_clone(frag) #else #define OL_RX_FRAG_GET_MAC_HDR(pdev, frag) \ (struct ieee80211_frame *) adf_nbuf_data(frag) #define OL_RX_FRAG_PULL_HDR(pdev, frag, hdrsize) \ adf_nbuf_pull_head(frag, hdrsize); -#define OL_RX_FRAG_CLONE(frag) NULL/* no-op */ #endif /* CONFIG_HL_SUPPORT */ static inline void @@ -353,11 +350,8 @@ ol_rx_fraglist_insert( struct ieee80211_frame *mac_hdr, *cmac_hdr, *next_hdr, *lmac_hdr; u_int8_t fragno, cur_fragno, lfragno, next_fragno; u_int8_t last_morefrag = 1, count = 0; - adf_nbuf_t frag_clone; adf_os_assert(frag); - frag_clone = OL_RX_FRAG_CLONE(frag); - frag = frag_clone ? frag_clone : frag; mac_hdr = (struct ieee80211_frame *) OL_RX_FRAG_GET_MAC_HDR(htt_pdev, frag); fragno = adf_os_le16_to_cpu(*(u_int16_t *) mac_hdr->i_seq) & diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c index dae35b756bbc..890303999a85 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx.c @@ -671,8 +671,7 @@ ol_tx_hl_base( if (adf_os_atomic_read(&pdev->tx_queue.rsrc_cnt) > TXRX_HL_TX_DESC_HI_PRIO_RESERVED) { tx_desc = ol_tx_desc_hl(pdev, vdev, msdu, &tx_msdu_info); - } else if ((adf_nbuf_is_dhcp_pkt(msdu) == A_STATUS_OK) - || (adf_nbuf_is_eapol_pkt(msdu) == A_STATUS_OK)) { + } else if (ADF_NBUF_GET_IS_DHCP(msdu) || ADF_NBUF_GET_IS_EAPOL(msdu)) { tx_desc = ol_tx_desc_hl(pdev, vdev, msdu, &tx_msdu_info); TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "Provided tx descriptor from reserve pool for DHCP/EAPOL\n"); diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c index 8616dea07206..f6b187eda600 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -555,6 +555,7 @@ ol_tx_completion_handler( tx_desc = td_array[tx_desc_id].tx_desc; tx_desc->status = status; netbuf = tx_desc->netbuf; + NBUF_UPDATE_TX_PKT_COUNT(netbuf, NBUF_TX_PKT_FREE); DPTRACE(adf_dp_trace_ptr(netbuf, ADF_DP_TRACE_FREE_PACKET_PTR_RECORD, adf_nbuf_data_addr(netbuf), @@ -580,7 +581,6 @@ ol_tx_completion_handler( pdev, tx_desc, tx_descs, netbuf, lcl_freelist, tx_desc_last, status); } - NBUF_UPDATE_TX_PKT_COUNT(netbuf, NBUF_TX_PKT_FREE); #ifdef QCA_SUPPORT_TXDESC_SANITY_CHECKS tx_desc->pkt_type = 0xff; #ifdef QCA_COMPUTE_TX_DELAY diff --git a/CORE/EPPING/src/epping_tx.c b/CORE/EPPING/src/epping_tx.c index 74277147b279..8de0b1cb9520 100644 --- a/CORE/EPPING/src/epping_tx.c +++ b/CORE/EPPING/src/epping_tx.c @@ -353,15 +353,28 @@ void epping_tx_complete_multiple(void *ctx, pktSkb=GET_HTC_PACKET_NET_BUF_CONTEXT(htc_pkt); cookie = htc_pkt->pPktContext; - ASSERT(pktSkb); - ASSERT(htc_pkt->pBuffer == adf_nbuf_data(pktSkb)); + if (!pktSkb) { + EPPING_LOG(VOS_TRACE_LEVEL_ERROR, + "%s: pktSkb is NULL", __func__); + ASSERT(0); + } else { + if (htc_pkt->pBuffer != adf_nbuf_data(pktSkb)) { + EPPING_LOG(VOS_TRACE_LEVEL_ERROR, + "%s: htc_pkt buffer not equal to skb->data", __func__); + ASSERT(0); + } - /* add this to the list, use faster non-lock API */ - adf_nbuf_queue_add(&skb_queue,pktSkb); + /* add this to the list, use faster non-lock API */ + adf_nbuf_queue_add(&skb_queue,pktSkb); - if (A_SUCCESS(status)) { - ASSERT(htc_pkt->ActualLength == adf_nbuf_len(pktSkb)); + if (A_SUCCESS(status)) + if (htc_pkt->ActualLength != adf_nbuf_len(pktSkb)) { + EPPING_LOG(VOS_TRACE_LEVEL_ERROR, + "%s: htc_pkt length not equal to skb->len", __func__); + ASSERT(0); + } } + EPPING_LOG(VOS_TRACE_LEVEL_INFO, "%s skb=%p data=%p len=0x%x eid=%d ", __func__, pktSkb, htc_pkt->pBuffer, diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index e0ea1955ec4b..bab5442a5877 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -3944,6 +3944,21 @@ enum dot11p_mode { #define CFG_BUG_ON_REINIT_FAILURE_MAX (1) #define CFG_BUG_ON_REINIT_FAILURE_DEFAULT (1) +/* + * This parameter will avoid updating ap_sta_inactivity from hostapd.conf + * file. If a station does not send anything in ap_max_inactivity seconds, an + * empty data frame is sent to it in order to verify whether it is + * still in range. If this frame is not ACKed, the station will be + * disassociated and then deauthenticated. This feature is used to + * clear station table of old entries when the STAs move out of the + * range. + * Default : Disable + */ +#define CFG_SAP_MAX_INACTIVITY_OVERRIDE_NAME "gSapMaxInactivityOverride" +#define CFG_SAP_MAX_INACTIVITY_OVERRIDE_DEFAULT (0) +#define CFG_SAP_MAX_INACTIVITY_OVERRIDE_MIN (0) +#define CFG_SAP_MAX_INACTIVITY_OVERRIDE_MAX (1) + /*--------------------------------------------------------------------------- Type declarations -------------------------------------------------------------------------*/ @@ -4723,6 +4738,7 @@ struct hdd_config { bool bug_on_reinit_failure; /* parameter to force sap into 11n */ bool sap_force_11n_for_11ac; + uint8_t sap_max_inactivity_override; }; typedef struct hdd_config hdd_config_t; diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index 86225855b675..86769a7d22dc 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -1567,6 +1567,13 @@ enum qca_wlan_vendor_acs_hw_mode { * Tx aggregation size (8-bit unsigned value) * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION: * Rx aggregation size (8-bit unsigned value) + * @QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY: + * Non aggregrate/11g sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY: aggregrate sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY: management frame sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY: control frame sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY: + * propagtion delay for 2G/5G band(Units in ms) * @QCA_WLAN_VENDOR_ATTR_CONFIG_LAST: last config * @QCA_WLAN_VENDOR_ATTR_CONFIG_MAX: max config */ @@ -1581,6 +1588,12 @@ enum qca_wlan_vendor_config { QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND, QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION, QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION, + QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY, + QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY, + QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY, + QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY, + QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY, + /* keep last */ QCA_WLAN_VENDOR_ATTR_CONFIG_LAST, QCA_WLAN_VENDOR_ATTR_CONFIG_MAX = @@ -2033,7 +2046,7 @@ void hdd_rssi_threshold_breached(void *hddctx, struct rssi_breach_event *data); struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list( - hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo); + hdd_adapter_t *pAdapter, tSirMacAddr bssid); int wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy, struct cfg80211_wowlan *wow); diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index 92af328f73ef..65ec664f2edb 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -1157,6 +1157,16 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo * } } else { sta_id = pHddStaCtx->conn_info.staId[0]; + + /* clear scan cache for Link Lost */ + if (pRoamInfo && !pRoamInfo->reasonCode && + (eCSR_ROAM_RESULT_DEAUTH_IND == roamResult)) { + wlan_hdd_cfg80211_update_bss_list(pAdapter, + pHddStaCtx->conn_info.bssId); + sme_remove_bssid_from_scan_list(pHddCtx->hHal, + pHddStaCtx->conn_info.bssId); + } + //We should clear all sta register with TL, for now, only one. vstatus = hdd_roamDeregisterSTA( pAdapter, sta_id ); if (!VOS_IS_STATUS_SUCCESS(vstatus)) { @@ -2139,6 +2149,17 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs } } + if ((eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE == roamResult) || + (pRoamInfo && + ((eSIR_SME_JOIN_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) || + (eSIR_SME_AUTH_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) || + (eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode)))) { + wlan_hdd_cfg80211_update_bss_list(pAdapter, + pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId); + sme_remove_bssid_from_scan_list(hHal, + pRoamInfo ? pRoamInfo->bssid : pWextState->req_bssId); + } + /* CR465478: Only send up a connection failure result when CSR has * completed operation - with a ASSOCIATION_FAILURE status.*/ if ( eCSR_ROAM_ASSOCIATION_FAILURE == roamStatus && !hddDisconInProgress ) @@ -2154,7 +2175,7 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs __func__, MAC_ADDR_ARRAY(pWextState->req_bssId), roamResult, roamStatus); - hddLog(LOGE, FL("Invoking packetdump deregistration API")); + hddLog(LOG1, FL("Invoking packetdump deregistration API")); wlan_deregister_txrx_packetdump(); /* inform association failure event to nl80211 */ @@ -2191,14 +2212,6 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs } - if (pRoamInfo) { - if ((eSIR_SME_JOIN_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) || - (eSIR_SME_AUTH_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode) || - (eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE == pRoamInfo->statusCode)) { - wlan_hdd_cfg80211_update_bss_list(pAdapter, pRoamInfo); - } - } - hdd_wmm_init( pAdapter ); hddLog(LOG1, FL("Disabling queues")); @@ -3819,6 +3832,7 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, case eCSR_ROAM_SESSION_OPENED: set_bit(SME_SESSION_OPENED, &pAdapter->event_flags); complete(&pAdapter->session_open_comp_var); + hddLog(LOG1, FL("session %d opened"), pAdapter->sessionId); break; #if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR) diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 5c248fd0556d..6c7627b72b87 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -4659,7 +4659,15 @@ REG_TABLE_ENTRY g_registry_table[] = VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, CFG_SAP_FORCE_11N_FOR_11AC_DEFAULT, CFG_SAP_FORCE_11N_FOR_11AC_MIN, - CFG_SAP_FORCE_11N_FOR_11AC_MAX) + CFG_SAP_FORCE_11N_FOR_11AC_MAX), + + REG_VARIABLE(CFG_SAP_MAX_INACTIVITY_OVERRIDE_NAME, WLAN_PARAM_Integer, + hdd_config_t, sap_max_inactivity_override, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_SAP_MAX_INACTIVITY_OVERRIDE_DEFAULT, + CFG_SAP_MAX_INACTIVITY_OVERRIDE_MIN, + CFG_SAP_MAX_INACTIVITY_OVERRIDE_MAX) + }; @@ -5500,6 +5508,10 @@ void print_hdd_cfg(hdd_context_t *pHddCtx) hddLog(LOG2, "Name = [%s] Value = [%u]", CFG_SAP_FORCE_11N_FOR_11AC_NAME, pHddCtx->cfg_ini->sap_force_11n_for_11ac); + hddLog(LOG2, "Name = [%s] Value = [%u]", + CFG_SAP_MAX_INACTIVITY_OVERRIDE_NAME, + pHddCtx->cfg_ini->sap_max_inactivity_override); + hdd_ndp_print_ini_config(pHddCtx); } diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index f77e2946abd4..fa8c537567ea 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -7894,6 +7894,10 @@ static int wlan_hdd_cfg80211_start_acs(hdd_adapter_t *adapter) int status; sap_config = &adapter->sessionCtx.ap.sapConfig; + if (hdd_ctx->acs_policy.acs_channel) + sap_config->channel = hdd_ctx->acs_policy.acs_channel; + else + sap_config->channel = AUTO_CHANNEL_SELECT; status = wlan_hdd_sap_cfg_dfs_override(adapter); if (status < 0) { return status; @@ -8361,6 +8365,11 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX [QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND] = {.type = NLA_U8 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] = {.type = NLA_U8 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY] = {.type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY] = {.type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY] = {.type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY] = {.type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY] = {.type = NLA_U8}, }; /** @@ -8452,6 +8461,8 @@ static int __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, u32 modulated_dtim; uint16_t stats_avg_factor, tx_rate; uint8_t set_value; + uint8_t retry; + uint8_t delay; u32 guard_time; u32 ftm_capab; eHalStatus status; @@ -8578,6 +8589,62 @@ static int __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, ret_val = -EINVAL; } } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY]) { + retry = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY]); + + /* Maximum value is 31 */ + retry = retry > 31 ? 31 : retry; + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY]) { + retry = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY]); + + /* Maximum value is 31(0x1f), 0 disable */ + retry = retry > 31 ? 31 : retry; + + /* Value less than 5 has side effect to t-put */ + retry = ((retry > 0) && (retry < 5)) ? 5 : retry; + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_AGG_SW_RETRY_TH, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY]) { + retry = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY]); + + /* Maximum value is 31 */ + retry = retry > 31 ? 31 : retry; + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_MGMT_RETRY_LIMIT, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY]) { + retry = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY]); + /* Maximum value is 31 */ + retry = retry > 31 ? 31 : retry; + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_CTRL_RETRY_LIMIT, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY]) { + delay = nla_get_u8( + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY]); + /* Maximum value is 63 */ + delay = delay > 63 ? 63 : delay; + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_PROPAGATION_DELAY, + delay, PDEV_CMD); + } return ret_val; } @@ -12063,7 +12130,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, #ifdef CHANNEL_SWITCH_SUPPORTED wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; #endif - + wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER; EXIT(); return 0; } @@ -13934,6 +14001,33 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, } } + pIe = wlan_hdd_cfg80211_get_ie_ptr(&pMgmt_frame->u.beacon.variable[0], + pBeacon->head_len, WLAN_EID_SUPP_RATES); + if (pIe != NULL) { + pIe++; + pConfig->supported_rates.numRates = pIe[0]; + pIe++; + for (i = 0; i < pConfig->supported_rates.numRates; i++) + if (pIe[i]) { + pConfig->supported_rates.rate[i]= pIe[i]; + hddLog(LOG1, FL("Configured Supported rate is %2x"), + pConfig->supported_rates.rate[i]); + } + } + pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail, pBeacon->tail_len, + WLAN_EID_EXT_SUPP_RATES); + if (pIe != NULL) { + pIe++; + pConfig->extended_rates.numRates = pIe[0]; + pIe++; + for (i = 0; i < pConfig->extended_rates.numRates; i++) + if (pIe[i]){ + pConfig->extended_rates.rate[i]= pIe[i]; + hddLog(LOG1, FL("Configured extended Supported rate is %2x"), + pConfig->extended_rates.rate[i]); + } + } + wlan_hdd_set_sapHwmode(pHostapdAdapter); if (pHddCtx->cfg_ini->sap_force_11n_for_11ac) { @@ -14669,6 +14763,9 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, } } hdd_change_ch_avoidance_status(pHddCtx, false); + if (pHddCtx->cfg_ini->sap_max_inactivity_override) + sme_update_sta_inactivity_timeout(WLAN_HDD_GET_HAL_CTX(pAdapter), + pAdapter->sessionId, params->inactivity_timeout); } EXIT(); @@ -16493,50 +16590,24 @@ static int wlan_hdd_cfg80211_set_default_key( struct wiphy *wiphy, } /* - * FUNCTION: wlan_hdd_cfg80211_update_bss_list - * This function is used to inform nl80211 interface that BSS might have - * been lost. + * wlan_hdd_cfg80211_update_bss_list :to inform nl80211 + * interface that BSS might have been lost. + * @pAdapter: adaptor + * @bssid: bssid which might have been lost + * + * Return: bss which is unlinked from kernel cache */ struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list( - hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo) + hdd_adapter_t *pAdapter, tSirMacAddr bssid) { struct net_device *dev = pAdapter->dev; struct wireless_dev *wdev = dev->ieee80211_ptr; struct wiphy *wiphy = wdev->wiphy; - tSirBssDescription *pBssDesc = pRoamInfo->pBssDesc; - int chan_no; - unsigned int freq; - struct ieee80211_channel *chan; struct cfg80211_bss *bss = NULL; - if (NULL == pBssDesc) { - hddLog(LOGE, FL("pBssDesc is NULL")); - return bss; - } - - if (NULL == pRoamInfo->pProfile) { - hddLog(LOGE, FL("Roam profile is NULL")); - return bss; - } - - chan_no = pBssDesc->channelId; - - if (chan_no <= ARRAY_SIZE(hdd_channels_2_4_GHZ)) { - freq = ieee80211_channel_to_frequency(chan_no, IEEE80211_BAND_2GHZ); - } else { - freq = ieee80211_channel_to_frequency(chan_no, IEEE80211_BAND_5GHZ); - } - - chan = __ieee80211_get_channel(wiphy, freq); - - if (!chan) { - hddLog(LOGE, FL("chan pointer is NULL")); - return NULL; - } - - bss = cfg80211_get_bss(wiphy, chan, pBssDesc->bssId, - &pRoamInfo->pProfile->SSIDs.SSIDList->SSID.ssId[0], - pRoamInfo->pProfile->SSIDs.SSIDList->SSID.length, + bss = cfg80211_get_bss(wiphy, NULL, bssid, + NULL, + 0, #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && !defined(WITH_BACKPORTS) \ && !defined(IEEE80211_PRIVACY) WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); @@ -16547,7 +16618,7 @@ struct cfg80211_bss* wlan_hdd_cfg80211_update_bss_list( hddLog(LOGE, FL("BSS not present")); } else { hddLog(LOG1, FL("cfg80211_unlink_bss called for BSSID " - MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pBssDesc->bssId)); + MAC_ADDRESS_STR), MAC_ADDR_ARRAY(bssid)); cfg80211_unlink_bss(wiphy, bss); } return bss; @@ -17026,6 +17097,9 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, unsigned long rc; unsigned int current_timestamp, time_elapsed; int ret = 0; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) + bool iface_down = false; +#endif ENTER(); @@ -17040,6 +17114,13 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, return eHAL_STATUS_FAILURE; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) + if (!(pAdapter->dev->flags & IFF_UP)) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("Interface is down")); + iface_down = true; + } +#endif + hddLog(VOS_TRACE_LEVEL_INFO, "%s called with halHandle = %p, pContext = %p," "scanID = %d, returned status = %d", @@ -17072,32 +17153,35 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, "scanId = %d", __func__, (int) pScanInfo->scanId, (int) scanId); } - - ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) + if (!iface_down) +#endif + { + ret = wlan_hdd_cfg80211_update_bss((WLAN_HDD_GET_CTX(pAdapter))->wiphy, pAdapter); + if (0 > ret) { + hddLog(VOS_TRACE_LEVEL_INFO, "%s: NO SCAN result", __func__); - if (0 > ret) { - hddLog(VOS_TRACE_LEVEL_INFO, "%s: NO SCAN result", __func__); + if (pHddCtx->cfg_ini->bug_report_for_scan_results) { + current_timestamp = jiffies_to_msecs(jiffies); + time_elapsed = current_timestamp - + pHddCtx->last_scan_bug_report_timestamp; - if (pHddCtx->cfg_ini->bug_report_for_scan_results) { - current_timestamp = jiffies_to_msecs(jiffies); - time_elapsed = current_timestamp - - pHddCtx->last_scan_bug_report_timestamp; - - /* check if we have generated bug report in - * MIN_TIME_REQUIRED_FOR_NEXT_BUG_REPORT time. - * */ - if (time_elapsed > MIN_TIME_REQUIRED_FOR_NEXT_BUG_REPORT) { - vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL, - WLAN_LOG_INDICATOR_HOST_DRIVER, - WLAN_LOG_REASON_NO_SCAN_RESULTS, - true); - pHddCtx->last_scan_bug_report_timestamp = current_timestamp; + /* check if we have generated bug report in + * MIN_TIME_REQUIRED_FOR_NEXT_BUG_REPORT time. + * + */ + if (time_elapsed > MIN_TIME_REQUIRED_FOR_NEXT_BUG_REPORT) { + vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL, + WLAN_LOG_INDICATOR_HOST_DRIVER, + WLAN_LOG_REASON_NO_SCAN_RESULTS, + true); + pHddCtx->last_scan_bug_report_timestamp = current_timestamp; + } } } } - /* If any client wait scan result through WEXT * send scan done event to client */ if (pAdapter->scan_info.waitScanResult) @@ -17128,16 +17212,16 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, req = pAdapter->request; pAdapter->request = NULL; + /* Scan is no longer pending */ + pScanInfo->mScanPending = VOS_FALSE; + if (!req || req->wiphy == NULL) { hddLog(VOS_TRACE_LEVEL_ERROR, "request is became NULL"); - pScanInfo->mScanPending = VOS_FALSE; complete(&pScanInfo->abortscan_event_var); goto allow_suspend; } - /* Scan is no longer pending */ - pScanInfo->mScanPending = VOS_FALSE; /* * cfg80211_scan_done informing NL80211 about completion @@ -17148,7 +17232,7 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, aborted = true; } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) - if (pAdapter->dev->flags & IFF_UP) + if (!iface_down) #endif cfg80211_scan_done(req, aborted); @@ -17165,12 +17249,15 @@ allow_suspend: * to process the connect request to AP */ hdd_prevent_suspend_timeout(1000, WIFI_POWER_EVENT_WAKELOCK_SCAN); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) + if (!iface_down) +#endif + { #ifdef FEATURE_WLAN_TDLS - if (!(eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) - { - wlan_hdd_tdls_scan_done_callback(pAdapter); - } + if (!(eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)) + wlan_hdd_tdls_scan_done_callback(pAdapter); #endif + } EXIT(); return 0; diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index 56d90e678936..7de428e2a081 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -100,11 +100,14 @@ #endif #include "ol_fw.h" -/* Time in msec */ +/* Time in msec. + * Time includes 60sec timeout of request_firmware for various binaries + * (OTP, BDWLAN, QWLAN) and other cleanup and re-init sequence + */ #ifdef CONFIG_SLUB_DEBUG_ON -#define HDD_SSR_BRING_UP_TIME 50000 +#define HDD_SSR_BRING_UP_TIME 250000 #else -#define HDD_SSR_BRING_UP_TIME 40000 +#define HDD_SSR_BRING_UP_TIME 240000 #endif static eHalStatus g_full_pwr_status; diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 480aafb07d5b..042ecda1c346 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -6579,6 +6579,8 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) v_CONTEXT_t pVosContext = (WLAN_HDD_GET_CTX(pAdapter))->pvosContext; v_CONTEXT_t sapContext=NULL; enum dfs_mode mode; + tVOS_CON_MODE device_mode; + uint32_t session_id = CSR_SESSION_ID_INVALID; #endif int ret; @@ -6608,13 +6610,27 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) wlan_hdd_get_dfs_mode(mode); - status = WLANSAP_Start(sapContext); + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + device_mode = VOS_P2P_GO_MODE; + } else if (pAdapter->device_mode == WLAN_HDD_SOFTAP) { + device_mode = VOS_STA_SAP_MODE; + } else { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + FL("Invalid device_mode for AP: %d"), pAdapter->device_mode); + return VOS_STATUS_E_FAILURE; + } + + status = WLANSAP_Start(sapContext, device_mode, + pAdapter->macAddressCurrent.bytes, + &session_id); if ( ! VOS_IS_STATUS_SUCCESS( status ) ) { VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: WLANSAP_Start failed!!")); WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; return status; } + pAdapter->sessionId = session_id; #endif // Allocate the Wireless Extensions state structure @@ -6632,6 +6648,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,("ERROR: hdd_set_hostapd failed!!")); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6642,6 +6659,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, ("ERROR: Hostapd HDD vos event init failed!!")); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6654,6 +6672,7 @@ VOS_STATUS hdd_init_ap_mode( hdd_adapter_t *pAdapter ) "ERROR: Hostapd HDD stop bss event init failed!!"); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif return status; } @@ -6705,6 +6724,7 @@ error_wmm_init: hdd_softap_deinit_tx_rx( pAdapter ); #ifdef WLAN_FEATURE_MBSSID WLANSAP_Close(sapContext); + pAdapter->sessionCtx.ap.sapContext = NULL; #endif EXIT(); return status; diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index d30ed2fbd7a0..571ac3c9e60f 100755 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -4510,13 +4510,14 @@ hdd_parse_get_cckm_ie(tANI_U8 *pValue, tANI_U8 **pCckmIe, tANI_U8 *pCckmIeLen) * * Return: status */ -static int drv_cmd_set_fcc_channel(hdd_context_t *hdd_ctx, uint8_t *cmd, +static int drv_cmd_set_fcc_channel(hdd_adapter_t *adapter, uint8_t *cmd, uint8_t cmd_len) { uint8_t *value; uint8_t fcc_constraint; eHalStatus status; int ret = 0; + hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); value = cmd + cmd_len + 1; @@ -4530,7 +4531,8 @@ static int drv_cmd_set_fcc_channel(hdd_context_t *hdd_ctx, uint8_t *cmd, return -EINVAL; } - status = sme_handle_set_fcc_channel(hdd_ctx->hHal, !fcc_constraint); + status = sme_handle_set_fcc_channel(hdd_ctx->hHal, !fcc_constraint, + adapter->scan_info.mScanPending); if (status != eHAL_STATUS_SUCCESS) ret = -EPERM; @@ -7900,7 +7902,7 @@ static int hdd_driver_command(hdd_adapter_t *pAdapter, * country code is set */ - ret = drv_cmd_set_fcc_channel(pHddCtx, command, 15); + ret = drv_cmd_set_fcc_channel(pAdapter, command, 15); } else if (strncmp(command, "RXFILTER-REMOVE", 15) == 0) { @@ -11412,6 +11414,43 @@ void wlan_hdd_reset_prob_rspies(hdd_adapter_t* pHostapdAdapter) } } +/** + * hdd_wait_for_sme_close_sesion() - Close and wait for SME session close + * @hdd_ctx: HDD context which is already NULL validated + * @adapter: HDD adapter which is already NULL validated + * + * Close the SME session and wait for its completion, if needed. + * + * Return: None + */ +static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx, + hdd_adapter_t *adapter) +{ + unsigned long rc; + + if (!test_bit(SME_SESSION_OPENED, &adapter->event_flags)) { + hddLog(LOGE, FL("session is not opened:%d"), adapter->sessionId); + return; + } + + INIT_COMPLETION(adapter->session_close_comp_var); + if (eHAL_STATUS_SUCCESS == + sme_CloseSession(hdd_ctx->hHal, adapter->sessionId, + hdd_smeCloseSessionCallback, + adapter)) { + /* + * Block on a completion variable. Can't wait + * forever though. + */ + rc = wait_for_completion_timeout( + &adapter->session_close_comp_var, + msecs_to_jiffies + (WLAN_WAIT_TIME_SESSIONOPENCLOSE)); + if (!rc) + hddLog(LOGE, FL("failure waiting for session_close_comp_var")); + } +} + VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, const v_BOOL_t bCloseSession) { @@ -11469,11 +11508,11 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, { hddLog(LOGE, "%s: failed to post disconnect event to SME", __func__); - } - memset(&wrqu, '\0', sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); - wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); + } + memset(&wrqu, '\0', sizeof(wrqu)); + wrqu.ap_addr.sa_family = ARPHRD_ETHER; + memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); + wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); } else { @@ -11499,24 +11538,8 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, /* It is possible that the caller of this function does not * wish to close the session */ - if (VOS_TRUE == bCloseSession && - test_bit(SME_SESSION_OPENED, &pAdapter->event_flags)) - { - INIT_COMPLETION(pAdapter->session_close_comp_var); - if (eHAL_STATUS_SUCCESS == - sme_CloseSession(pHddCtx->hHal, pAdapter->sessionId, - hdd_smeCloseSessionCallback, pAdapter)) - { - //Block on a completion variable. Can't wait forever though. - rc = wait_for_completion_timeout( - &pAdapter->session_close_comp_var, - msecs_to_jiffies(WLAN_WAIT_TIME_SESSIONOPENCLOSE)); - if (!rc) { - hddLog(LOGE, "%s: failure waiting for session_close_comp_var", - __func__); - } - } - } + if (bCloseSession) + hdd_wait_for_sme_close_sesion(pHddCtx, pAdapter); break; case WLAN_HDD_SOFTAP: @@ -11602,6 +11625,8 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, pAdapter->sessionCtx.ap.beacon = NULL; } mutex_unlock(&pHddCtx->sap_lock); + if (bCloseSession) + hdd_wait_for_sme_close_sesion(pHddCtx, pAdapter); break; case WLAN_HDD_OCB: diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index f86e99f5cf28..cfe12b02face 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -91,38 +91,6 @@ const v_U8_t hdd_QdiscAcToTlAC[] = { Function definitions and documentation -------------------------------------------------------------------------*/ -/** - * wlan_hdd_is_wai() - Check if frame is EAPOL or WAPI - * @skb: skb data - * - * This function checks if the frame is EAPOL or WAPI. - * single routine call will check for both types, thus avoiding - * data path performance penalty. - * - * Return: true (1) if packet is EAPOL or WAPI - * - */ -static bool wlan_hdd_is_eapol_or_wai(struct sk_buff *skb) -{ - uint16_t ether_type; - - if (!skb) { - hddLog(VOS_TRACE_LEVEL_ERROR, FL("skb is NULL")); - return false; - } - - ether_type = (uint16_t)(*(uint16_t *) - (skb->data + HDD_ETHERTYPE_802_1_X_FRAME_OFFSET)); - - if (ether_type == VOS_SWAP_U16(HDD_ETHERTYPE_802_1_X) || - ether_type == VOS_SWAP_U16(HDD_ETHERTYPE_WAI)) - return true; - - /* No error msg handled since this will happen often */ - return false; -} - - /**============================================================================ @brief hdd_flush_tx_queues() - Utility function to flush the TX queues @@ -404,6 +372,33 @@ void hdd_drop_skb_list(hdd_adapter_t *adapter, struct sk_buff *skb, } } +/** + * wlan_hdd_classify_pkt() - classify skb packet type. + * @data: Pointer to skb + * + * This function classifies skb packet type. + * + * Return: none + */ +void wlan_hdd_classify_pkt(struct sk_buff *skb) +{ + /* classify broadcast/multicast packet */ + if (adf_nbuf_is_bcast_pkt(skb)) + ADF_NBUF_SET_BCAST(skb); + else if (adf_nbuf_is_multicast_pkt(skb)) + ADF_NBUF_SET_MCAST(skb); + + /* classify eapol/arp/dhcp/wai packet */ + if (adf_nbuf_is_eapol_pkt(skb)) + ADF_NBUF_SET_EAPOL(skb); + else if (adf_nbuf_is_ipv4_arp_pkt(skb)) + ADF_NBUF_SET_ARP(skb); + else if (adf_nbuf_is_dhcp_pkt(skb)) + ADF_NBUF_SET_DHCP(skb); + else if (adf_nbuf_is_wai_pkt(skb)) + ADF_NBUF_SET_WAPI(skb); +} + /**============================================================================ @brief hdd_hard_start_xmit() - Function registered with the Linux OS for transmitting packets. This version of the function directly passes the packet @@ -453,6 +448,9 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) while (skb) { skb_next = skb->next; + /* memset skb control block */ + vos_mem_zero(skb->cb, sizeof(skb->cb)); + wlan_hdd_classify_pkt(skb); if (WLAN_HDD_IBSS == pAdapter->device_mode) { v_MACADDR_t *pDestMacAddress = (v_MACADDR_t*)skb->data; @@ -561,7 +559,7 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) likely( pAdapter->hddWmmStatus.wmmAcStatus[ac].wmmAcAccessAllowed)) || ((pHddStaCtx->conn_info.uIsAuthenticated == VOS_FALSE) && - wlan_hdd_is_eapol_or_wai(skb))) + (ADF_NBUF_GET_IS_EAPOL(skb) || ADF_NBUF_GET_IS_WAPI(skb)))) { granted = VOS_TRUE; } diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c index ff929711f767..5d586e9d50fa 100644 --- a/CORE/HDD/src/wlan_hdd_wmm.c +++ b/CORE/HDD/src/wlan_hdd_wmm.c @@ -1634,23 +1634,6 @@ VOS_STATUS hdd_wmm_adapter_close ( hdd_adapter_t* pAdapter ) } /**============================================================================ - @brief is_dhcp_packet() - Function which will check OS packet for - DHCP packet - - @param skb : [in] pointer to OS packet (sk_buff) - @return : VOS_TRUE if the OS packet is DHCP packet - : otherwise VOS_FALSE - ===========================================================================*/ -v_BOOL_t is_dhcp_packet(struct sk_buff *skb) -{ - if (*((u16*)((u8*)skb->data+34)) == DHCP_SOURCE_PORT || - *((u16*)((u8*)skb->data+34)) == DHCP_DESTINATION_PORT) - return VOS_TRUE; - - return VOS_FALSE; -} - -/**============================================================================ @brief hdd_wmm_classify_pkt() - Function which will classify an OS packet into a WMM AC based on either 802.1Q or DSCP diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index 4c1235f8dabc..fb9fd50b78d3 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -366,9 +366,6 @@ typedef struct sLimTimers // CNF_WAIT timer TX_TIMER *gpLimCnfWaitTimer; - // Send Disassociate frame threshold parameters - TX_TIMER gLimSendDisassocFrameThresholdTimer; - TX_TIMER gLimAddtsRspTimer; // max wait for a response // Update OLBC Cache Timer @@ -843,10 +840,6 @@ typedef struct sAniSirLim // Place holder for Pre-authentication node list struct tLimPreAuthNode * pLimPreAuthList; - // Send Disassociate frame threshold parameters - tANI_U16 gLimDisassocFrameThreshold; - tANI_U16 gLimDisassocFrameCredit; - // Assoc or ReAssoc Response Data/Frame void *gLimAssocResponseData; diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 4249b312cf84..07da3a58192c 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 11 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 113 +#define QWLAN_VERSION_BUILD 119 -#define QWLAN_VERSIONSTR "4.0.11.113" +#define QWLAN_VERSIONSTR "4.0.11.119" #define AR6320_REV1_VERSION 0x5000000 diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index c4b2bfcd456d..d051825dc984 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -694,7 +694,7 @@ typedef struct sSirSmeStartBssReq tANI_BOOLEAN obssEnabled; uint8_t sap_dot11mc; bool vendor_vht_for_24ghz_sap; - uint8_t beacon_tx_rate; + uint16_t beacon_tx_rate; } tSirSmeStartBssReq, *tpSirSmeStartBssReq; #define GET_IE_LEN_IN_BSS(lenInBss) ( lenInBss + sizeof(lenInBss) - \ @@ -7470,4 +7470,63 @@ struct sir_set_tx_rx_aggregation_size { uint32_t rx_aggregation_size; }; +/** + * struct sme_update_access_policy_vendor_ie - update vendor ie and access + * policy + * @msg_type: message id + * @msg_len: message length + * @sme_session_id: sme session id + * @ie: vendor ie + * @access_policy: access policy for vendor ie + */ +struct sme_update_access_policy_vendor_ie { + uint16_t msg_type; + uint16_t length; + uint32_t sme_session_id; + uint8_t ie[SIR_MAC_MAX_IE_LENGTH]; + uint8_t access_policy; +}; + +/** + * struct sme_tx_fail_cnt_threshold - tx failure count for disconnect to fw + * @session_id: Session id + * @tx_fail_cnt_threshold: Tx failure count to do disconnect + */ +struct sme_tx_fail_cnt_threshold { + uint8_t session_id; + uint32_t tx_fail_cnt_threshold; +}; + +/** + * struct sme_short_retry_limit - transmission retry limit for short frames. + * @session_id: Session id + * @short_retry_limit: tranmission retry limit for short frame. + * + */ +struct sme_short_retry_limit { + uint8_t session_id; + uint32_t short_retry_limit; +}; + +/** + * struct sme_long_retry_limit - tranmission retry limit for long frames + * @session_id: Session id + * @short_retry_limit: tranmission retry limit for long frames. + * + */ +struct sme_long_retry_limit { + uint8_t session_id; + uint32_t long_retry_limit; +}; + +/** + * struct sme_sta_inactivity_timeout - set sta_inactivity_timeout + * @session_id: session Id. + * @sta_inactivity_timeout: Timeout to disconnect STA after there + * is no activity. + */ +struct sme_sta_inactivity_timeout { + uint8_t session_id; + uint32_t sta_inactivity_timeout; +}; #endif /* __SIR_API_H */ diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h index 3fc70f4f59f0..ee0e37bfcddb 100644 --- a/CORE/MAC/inc/wniApi.h +++ b/CORE/MAC/inc/wniApi.h @@ -418,6 +418,7 @@ enum eWniMsgTypes eWNI_SME_NDP_PEER_DEPARTED_IND, eWNI_SME_NDP_END_IND, eWNI_SME_REGISTER_P2P_ACK_CB, + eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE, eWNI_SME_MSG_TYPES_END }; diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h index cac8fc34a8e8..63ff542921cf 100644 --- a/CORE/MAC/src/include/sirParams.h +++ b/CORE/MAC/src/include/sirParams.h @@ -776,6 +776,10 @@ typedef struct sSirMbMsgP2p #define SIR_HAL_SEND_FREQ_RANGE_CONTROL_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 359) #define SIR_BTC_BT_WLAN_INTERVAL_CMD (SIR_HAL_ITC_MSG_TYPES_BEGIN + 360) #define SIR_HAL_SET_ALLOWED_ACTION_FRAMES (SIR_HAL_ITC_MSG_TYPES_BEGIN + 361) +#define SIR_HAL_UPDATE_TX_FAIL_CNT_TH (SIR_HAL_ITC_MSG_TYPES_BEGIN + 362) +#define SIR_HAL_SHORT_RETRY_LIMIT_CNT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 363) +#define SIR_HAL_LONG_RETRY_LIMIT_CNT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 364) +#define SIR_HAL_STA_INACTIVITY_TIMEOUT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 365) #define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF) @@ -845,7 +849,6 @@ typedef struct sSirMbMsgP2p #define SIR_LIM_PROBE_HB_FAILURE_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0xB) #define SIR_LIM_ADDTS_RSP_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0xC) #define SIR_LIM_LINK_TEST_DURATION_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x13) -#define SIR_LIM_HASH_MISS_THRES_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x16) #define SIR_LIM_CNF_WAIT_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x17) #define SIR_LIM_KEEPALIVE_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x18) #define SIR_LIM_UPDATE_OLBC_CACHEL_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x19) diff --git a/CORE/MAC/src/pe/include/limApi.h b/CORE/MAC/src/pe/include/limApi.h index 5c9fc02e4a1c..05c1921a4786 100644 --- a/CORE/MAC/src/pe/include/limApi.h +++ b/CORE/MAC/src/pe/include/limApi.h @@ -95,6 +95,22 @@ #define LIM_SET_RADAR_DETECTED(pMac, val) (pMac->lim.gLimSpecMgmt.fRadarDetCurOperChan = val) #define LIM_MIN_BCN_PR_LENGTH 12 #define LIM_BCN_PR_CAPABILITY_OFFSET 10 +#define LIM_ASSOC_REQ_IE_OFFSET 4 + +/** + * enum lim_vendor_ie_access_policy - vendor ie access policy + * @LIM_ACCESS_POLICY_NONE: access policy not valid + * @LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT: respond only if vendor ie + * is present in probe request and assoc request frames + * @LIM_ACCESS_POLICY_DONOT_RESPOND_IF_IE_IS_PRESENT: do not respond if vendor + * ie is present in probe request or assoc request frames + */ +enum lim_vendor_ie_access_policy { + LIM_ACCESS_POLICY_NONE, + LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT, + LIM_ACCESS_POLICY_DONOT_RESPOND_IF_IE_IS_PRESENT, +}; + typedef enum eMgmtFrmDropReason { eMGMT_DROP_NO_DROP, diff --git a/CORE/MAC/src/pe/include/limGlobal.h b/CORE/MAC/src/pe/include/limGlobal.h index 19c9f8e7f24f..f9b16a7a7e3f 100644 --- a/CORE/MAC/src/pe/include/limGlobal.h +++ b/CORE/MAC/src/pe/include/limGlobal.h @@ -54,10 +54,6 @@ /// Maximum number of scan hash table entries #define LIM_MAX_NUM_OF_SCAN_RESULTS 256 -// Sending Disassociate frames threshold -#define LIM_SEND_DISASSOC_FRAME_THRESHOLD 2 -#define LIM_HASH_MISS_TIMER_MS 10000 - // Deferred Message Queue Length #define MAX_DEFERRED_QUEUE_LEN 80 diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h index 73b5eebbf7bf..b085edb4f27f 100644 --- a/CORE/MAC/src/pe/include/limSession.h +++ b/CORE/MAC/src/pe/include/limSession.h @@ -505,8 +505,8 @@ typedef struct sPESession // Added to Support BT-AMP uint8_t vendor_specific_vht_ie_type; uint8_t vendor_specific_vht_ie_sub_type; bool vendor_vht_for_24ghz_sap; - uint8_t beacon_tx_rate; - uint8_t *vendor_ie; + uint16_t beacon_tx_rate; + uint8_t *access_policy_vendor_ie; uint8_t access_policy; } tPESession, *tpPESession; diff --git a/CORE/MAC/src/pe/lim/limAIDmgmt.c b/CORE/MAC/src/pe/lim/limAIDmgmt.c index 3d3d7a3aad8f..5e286287c251 100644 --- a/CORE/MAC/src/pe/lim/limAIDmgmt.c +++ b/CORE/MAC/src/pe/lim/limAIDmgmt.c @@ -136,16 +136,19 @@ limAssignPeerIdx(tpAniSirGlobal pMac, tpPESession pSessionEntry) tANI_U16 peerId; uint8 max_peer = 0; + + limLog(pMac, LOG1, FL("pePersona:%d"), + pSessionEntry->pePersona); + if (pSessionEntry->pePersona == VOS_STA_SAP_MODE) max_peer = pMac->lim.glim_assoc_sta_limit_ap; - - if (pSessionEntry->pePersona == VOS_P2P_GO_MODE) + else if (pSessionEntry->pePersona == VOS_P2P_GO_MODE) max_peer = pMac->lim.glim_assoc_sta_limit_go; // make sure we haven't exceeded the configurable limit on associations // This count is global to ensure that it doesnt exceed the hardware limits. if (peGetCurrentSTAsCount(pMac) >= pMac->lim.gLimAssocStaLimit || - pSessionEntry->gLimNumOfCurrentSTAs >= max_peer) + (max_peer != 0 && pSessionEntry->gLimNumOfCurrentSTAs >= max_peer)) { // too many associations already active return 0; diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c index 4b41ef7f6d2e..1d81811f8da9 100644 --- a/CORE/MAC/src/pe/lim/limApi.c +++ b/CORE/MAC/src/pe/lim/limApi.c @@ -335,10 +335,6 @@ static void __limInitAssocVars(tpAniSirGlobal pMac) // Place holder for Pre-authentication node list pMac->lim.pLimPreAuthList = NULL; - // Send Disassociate frame threshold parameters - pMac->lim.gLimDisassocFrameThreshold = LIM_SEND_DISASSOC_FRAME_THRESHOLD; - pMac->lim.gLimDisassocFrameCredit = 0; - //One cache for each overlap and associated case. vos_mem_set(pMac->lim.protStaOverlapCache, sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE, 0); @@ -1108,9 +1104,6 @@ tANI_U8 limIsTimerAllowedInPowerSaveState(tpAniSirGlobal pMac, tSirMsgQ *pMsg) case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT: retStatus = FALSE; break; - /* May allow following timer messages in sleep mode */ - case SIR_LIM_HASH_MISS_THRES_TIMEOUT: - /* Safe to allow as of today, this triggers background scan * which will not be started if the device is in power-save mode * might need to block in the future if we decide to implement diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c index f6f86b0340ba..5d285fe5b907 100644 --- a/CORE/MAC/src/pe/lim/limFT.c +++ b/CORE/MAC/src/pe/lim/limFT.c @@ -827,6 +827,7 @@ void limFillFTSession(tpAniSirGlobal pMac, tSchBeaconStruct *pBeaconStruct; tANI_U32 selfDot11Mode; ePhyChanBondState cbEnabledMode; + VOS_STATUS vosStatus; pBeaconStruct = vos_mem_malloc(sizeof(tSchBeaconStruct)); if (NULL == pBeaconStruct) { @@ -989,6 +990,20 @@ void limFillFTSession(tpAniSirGlobal pMac, pftSessionEntry->encryptType = psessionEntry->encryptType; #ifdef WLAN_FEATURE_11W pftSessionEntry->limRmfEnabled = psessionEntry->limRmfEnabled; + + if (psessionEntry->limRmfEnabled) { + psessionEntry->pmfComebackTimerInfo.pMac = pMac; + psessionEntry->pmfComebackTimerInfo.sessionID = + psessionEntry->smeSessionId; + vosStatus = vos_timer_init(&psessionEntry->pmfComebackTimer, + VOS_TIMER_TYPE_SW, + limPmfComebackTimerCallback, + (void *)&psessionEntry->pmfComebackTimerInfo); + if (VOS_STATUS_SUCCESS != vosStatus) { + limLog(pMac, LOGP, + FL("cannot init pmf comeback timer.")); + } + } #endif if (pftSessionEntry->limRFBand == SIR_BAND_2_4_GHZ) diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c index c3934ef6bd0d..a8ba21458016 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c @@ -368,6 +368,24 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, return; } + /* check for the presence of vendor IE */ + if ((psessionEntry->access_policy_vendor_ie) && + (psessionEntry->access_policy == + LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT)) { + if (!cfg_get_vendor_ie_ptr_from_oui(pMac, + &psessionEntry->access_policy_vendor_ie[2], + 3, pBody + LIM_ASSOC_REQ_IE_OFFSET, framelen)) { + limLog(pMac, LOGE, + FL("Vendor ie not present and access policy is %x, Rejected association"), + psessionEntry->access_policy); + limSendAssocRspMgmtFrame(pMac, + eSIR_MAC_UNSPEC_FAILURE_STATUS, + 1, + pHdr->sa, + subType, 0,psessionEntry); + return; + } + } // Allocate memory for the Assoc Request frame pAssocReq = vos_mem_malloc(sizeof(*pAssocReq)); if (NULL == pAssocReq) @@ -848,21 +866,21 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, /// Extract pre-auth context for the STA, if any. pStaPreAuthContext = limSearchPreAuthList(pMac, pHdr->sa); - limLog(pMac, LOG1, FL( "max:%d ap:%d go:%d mode:%d"), + limLog(pMac, LOG1, FL( "max:%d ap:%d go:%d mode:%d pePersona:%d"), pMac->lim.gLimAssocStaLimit, pMac->lim.glim_assoc_sta_limit_ap, - pMac->lim.glim_assoc_sta_limit_go, psessionEntry->pePersona); + pMac->lim.glim_assoc_sta_limit_go, psessionEntry->pePersona, + psessionEntry->pePersona); if (psessionEntry->pePersona == VOS_STA_SAP_MODE) max_peer = pMac->lim.glim_assoc_sta_limit_ap; - - if (psessionEntry->pePersona == VOS_P2P_GO_MODE) + else if (psessionEntry->pePersona == VOS_P2P_GO_MODE) max_peer = pMac->lim.glim_assoc_sta_limit_go; if (pStaDs == NULL) { /// Requesting STA is not currently associated if ((peGetCurrentSTAsCount(pMac) == pMac->lim.gLimAssocStaLimit)|| - (psessionEntry->gLimNumOfCurrentSTAs == max_peer)) + (max_peer != 0 && psessionEntry->gLimNumOfCurrentSTAs == max_peer)) { /** * Maximum number of STAs that AP can handle reached. diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c index 722a6c3f97bf..cf803cb8add7 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -676,8 +676,15 @@ limProcessAssocRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U8 sub if (pAssocRsp->statusCode != eSIR_MAC_SUCCESS_STATUS #ifdef WLAN_FEATURE_11W + /* + * Consider eSIR_MAC_TRY_AGAIN_LATER as failure in re-assoc + * case as waiting for come back time and retrying reassociation + * again will increase roam time. Its better to allow supplicant + * to select new candiadte + */ && (!psessionEntry->limRmfEnabled || - pAssocRsp->statusCode != eSIR_MAC_TRY_AGAIN_LATER) + pAssocRsp->statusCode != eSIR_MAC_TRY_AGAIN_LATER || + (subType == LIM_REASSOC)) #endif /* WLAN_FEATURE_11W */ ) { @@ -747,11 +754,29 @@ limProcessAssocRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U8 sub timeout_value)) { PELOGE(limLog(pMac, LOGE, FL("Failed to start comeback timer."));) + + mlmAssocCnf.resultCode = eSIR_SME_ASSOC_REFUSED; + mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS; + + /* Delete Pre-auth context for the associated BSS */ + if (limSearchPreAuthList(pMac, pHdr->sa)) + limDeletePreAuthNode(pMac, pHdr->sa); + + goto assocReject; } } else { PELOGE(limLog(pMac, LOG1, FL("ASSOC response with eSIR_MAC_TRY_AGAIN_LATER recvd." "But try again time interval IE is wrong."));) + + mlmAssocCnf.resultCode = eSIR_SME_ASSOC_REFUSED; + mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS; + + /* Delete Pre-auth context for the associated BSS */ + if (limSearchPreAuthList(pMac, pHdr->sa)) + limDeletePreAuthNode(pMac, pHdr->sa); + + goto assocReject; } /* callback will send Assoc again */ /* DO NOT send ASSOC CNF to MLM state machine */ diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c index 2b7eb3f7830e..582219163cc6 100644 --- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c +++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c @@ -1386,6 +1386,7 @@ limProcessMessages(tpAniSirGlobal pMac, tpSirMsgQ limMsg) case eWNI_SME_TDLS_LINK_ESTABLISH_REQ: #endif case eWNI_SME_RESET_AP_CAPS_CHANGED: + case eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE: // These messages are from HDD limProcessNormalHddMsg(pMac, limMsg, true); //need to response to hdd break; @@ -1834,16 +1835,6 @@ limProcessMessages(tpAniSirGlobal pMac, tpSirMsgQ limMsg) limTriggerBackgroundScan(pMac); break; - - case SIR_LIM_HASH_MISS_THRES_TIMEOUT: - - /* - ** clear the credit to the send disassociate frame bucket - **/ - - pMac->lim.gLimDisassocFrameCredit = 0; - break; - case SIR_LIM_CNF_WAIT_TIMEOUT: /* diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c index f00bee1b0cb5..10255771f83b 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c @@ -4270,6 +4270,8 @@ limProcessAuthFailureTimeout(tpAniSirGlobal pMac) break; } + /* Reinit scan results to remove the unreachable BSS*/ + limReInitScanResults(pMac); } /*** limProcessAuthFailureTimeout() ***/ @@ -4508,6 +4510,8 @@ limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType) eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry); } } + /* Reinit scan results to remove the unreachable BSS*/ + limReInitScanResults(pMac); } /*** limProcessAssocFailureTimeout() ***/ diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c index 64939fe8a436..9df20b3955f1 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c @@ -2342,7 +2342,8 @@ void limProcessMlmDelStaRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ ) if(NULL == pDeleteStaParams || NULL == (psessionEntry = peFindSessionBySessionId(pMac, pDeleteStaParams->sessionId))) { - limLog(pMac, LOGP,FL("Session Does not exist or invalid body pointer in message")); + limLog(pMac, LOGP,FL("Session Does not exist or invalid body pointer in message: %d"), + pDeleteStaParams->sessionId); if(pDeleteStaParams != NULL) { vos_mem_free(pDeleteStaParams); diff --git a/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c b/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c index a00327363d16..4cef79044b99 100644 --- a/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c @@ -391,6 +391,20 @@ limProcessProbeReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession // Get pointer to Probe Request frame body pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo); + /* check for vendor IE presence */ + if ((psessionEntry->access_policy_vendor_ie) && + (psessionEntry->access_policy == + LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT)) { + if (!cfg_get_vendor_ie_ptr_from_oui(pMac, + &psessionEntry->access_policy_vendor_ie[2], + 3, pBody, frameLen)) { + limLog(pMac, LOG1, FL( + "Vendor IE is not present and access policy is %x, dropping probe request"), + psessionEntry->access_policy); + break; + } + } + // Parse Probe Request frame if (sirConvertProbeReqFrame2Struct(pMac, pBody, frameLen, &probeReq)==eSIR_FAILURE) { @@ -552,6 +566,7 @@ limProcessProbeReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession /*We are returning from here as probe request contains the broadcast SSID. So no need to send the probe resp*/ return; + limSendProbeRspMgmtFrame(pMac, pHdr->sa, &ssId, DPH_USE_MGMT_STAID, DPH_NON_KEEPALIVE_FRAME, psessionEntry, probeReq.p2pIePresent); diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index c03a833856ae..47572ad2ed18 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -5943,6 +5943,60 @@ static void __lim_process_send_disassoc_frame(tpAniSirGlobal mac_ctx, } /** + * lim_process_sme_update_access_policy_vendor_ie: function updates vendor IE + * access policy + * @mac_ctx: pointer to mac context + * @msg: message buffer + * + * function processes vendor IE and access policy from SME and updates PE + * session entry + * + * return: none + */ +static void lim_process_sme_update_access_policy_vendor_ie( + tpAniSirGlobal mac_ctx, + uint32_t *msg) +{ + struct sme_update_access_policy_vendor_ie *update_vendor_ie; + struct sPESession *pe_session_entry; + uint8_t num_bytes; + + if (!msg) { + limLog(mac_ctx, LOGE,FL("Buffer is Pointing to NULL")); + return; + } + + update_vendor_ie = (struct sme_update_access_policy_vendor_ie*) msg; + + pe_session_entry = pe_find_session_by_sme_session_id(mac_ctx, + update_vendor_ie->sme_session_id); + if (!pe_session_entry) { + limLog(mac_ctx, LOGE, + FL("Session does not exist for given sme session id(%hu)"), + update_vendor_ie->sme_session_id); + return; + } + + if (pe_session_entry->access_policy_vendor_ie) + vos_mem_free(pe_session_entry->access_policy_vendor_ie); + + num_bytes = update_vendor_ie->ie[1] + 2; + pe_session_entry->access_policy_vendor_ie = vos_mem_malloc(num_bytes); + + if (!pe_session_entry->access_policy_vendor_ie) { + limLog(mac_ctx, LOGE, + FL("Failed to allocate memory for vendor ie")); + return; + } + + vos_mem_copy(pe_session_entry->access_policy_vendor_ie, + &update_vendor_ie->ie[0], num_bytes); + pe_session_entry->access_policy = update_vendor_ie->access_policy; + + return; +} + +/** * limProcessSmeReqMessages() * *FUNCTION: @@ -6295,6 +6349,9 @@ limProcessSmeReqMessages(tpAniSirGlobal pMac, tpSirMsgQ pMsg) case eWNI_SME_REGISTER_P2P_ACK_CB: lim_register_p2p_ack_ind_cb(pMac, pMsgBuf); break; + case eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE: + lim_process_sme_update_access_policy_vendor_ie(pMac, pMsgBuf); + break; default: vos_mem_free((v_VOID_t*)pMsg->bodyptr); pMsg->bodyptr = NULL; diff --git a/CORE/MAC/src/pe/lim/limScanResultUtils.c b/CORE/MAC/src/pe/lim/limScanResultUtils.c index 09ec15a768e1..e482609ef8e7 100644 --- a/CORE/MAC/src/pe/lim/limScanResultUtils.c +++ b/CORE/MAC/src/pe/lim/limScanResultUtils.c @@ -819,9 +819,6 @@ limLookupNaddHashEntry(tpAniSirGlobal pMac, } } - if ((false == found) && dontUpdateAll) - return eHAL_STATUS_FAILURE; - //for now, only rssi, we can add more if needed if ((action == LIM_HASH_UPDATE) && dontUpdateAll && rssi && rssi_raw) { diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c index 7658b03e853a..c911c50d0f3f 100644 --- a/CORE/MAC/src/pe/lim/limSerDesUtils.c +++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c @@ -699,8 +699,10 @@ limStartBssReqSerDes(tpAniSirGlobal pMac, tpSirSmeStartBssReq pStartBssReq, tANI len -= sizeof(pStartBssReq->vendor_vht_for_24ghz_sap); pBuf += sizeof(pStartBssReq->vendor_vht_for_24ghz_sap); - pStartBssReq->beacon_tx_rate = *pBuf++; - len--; + vos_mem_copy(&(pStartBssReq->beacon_tx_rate), pBuf, + sizeof(pStartBssReq->beacon_tx_rate)); + len -= sizeof(pStartBssReq->beacon_tx_rate); + pBuf += sizeof(pStartBssReq->beacon_tx_rate); if (len) { diff --git a/CORE/MAC/src/pe/lim/limSession.c b/CORE/MAC/src/pe/lim/limSession.c index 6fe267edca26..9a5096a195b6 100644 --- a/CORE/MAC/src/pe/lim/limSession.c +++ b/CORE/MAC/src/pe/lim/limSession.c @@ -803,6 +803,11 @@ void peDeleteSession(tpAniSirGlobal pMac, tpPESession psessionEntry) } #endif + if (psessionEntry->access_policy_vendor_ie) + vos_mem_free(psessionEntry->access_policy_vendor_ie); + + psessionEntry->access_policy_vendor_ie = NULL; + psessionEntry->valid = FALSE; if (LIM_IS_AP_ROLE(psessionEntry)) diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c index 8953530cb524..05be3fc41a74 100644 --- a/CORE/MAC/src/pe/lim/limTimerUtils.c +++ b/CORE/MAC/src/pe/lim/limTimerUtils.c @@ -471,27 +471,6 @@ limCreateTimers(tpAniSirGlobal pMac) } } - - cfgValue = SYS_MS_TO_TICKS(LIM_HASH_MISS_TIMER_MS); - - if (tx_timer_create( - &pMac->lim.limTimers.gLimSendDisassocFrameThresholdTimer, - "Disassoc throttle TIMEOUT", - limSendDisassocFrameThresholdHandler, - SIR_LIM_HASH_MISS_THRES_TIMEOUT, - cfgValue, - cfgValue, - TX_AUTO_ACTIVATE) != TX_SUCCESS) - { - /// Could not start Send Disassociate Frame Threshold timer. - // Log error - limLog(pMac, LOGP, - FL("create Disassociate throttle timer failed")); - goto err_timer; - } - PELOG1(limLog(pMac, LOG1, - FL("Created Disassociate throttle timer "));) - /** * Create keep alive timer and activate it right away for AP role */ @@ -755,7 +734,6 @@ limCreateTimers(tpAniSirGlobal pMac) tx_timer_delete(&pMac->lim.limTimers.gpLimCnfWaitTimer[i]); } tx_timer_delete(&pMac->lim.limTimers.gLimKeepaliveTimer); - tx_timer_delete(&pMac->lim.limTimers.gLimSendDisassocFrameThresholdTimer); tx_timer_delete(&pMac->lim.limTimers.gLimBackgroundScanTimer); tx_timer_delete(&pMac->lim.limTimers.gLimProbeAfterHBTimer); tx_timer_delete(&pMac->lim.limTimers.gLimHeartBeatTimer); @@ -2085,42 +2063,6 @@ void limActivateAuthRspTimer(tpAniSirGlobal pMac, tLimPreAuthNode *pAuthNode) } } - -/** - * limSendDisassocFrameThresholdHandler() - * - *FUNCTION: - * This function reloads the credit to the send disassociate frame bucket - * - *LOGIC: - * - *ASSUMPTIONS: - * - *NOTE: - * NA - * - * @param - * - * @return None - */ - -void -limSendDisassocFrameThresholdHandler(void *pMacGlobal, tANI_U32 param) -{ - tSirMsgQ msg; - tANI_U32 statusCode; - tpAniSirGlobal pMac = (tpAniSirGlobal)pMacGlobal; - - msg.type = SIR_LIM_HASH_MISS_THRES_TIMEOUT; - msg.bodyval = 0; - msg.bodyptr = NULL; - - if ((statusCode = limPostMsgApi(pMac, &msg)) != eSIR_SUCCESS) - limLog(pMac, LOGE, - FL("posting to LIM failed, reason=%d"), statusCode); - -} - /** * limAssocCnfWaitTmerHandler() * diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.h b/CORE/MAC/src/pe/lim/limTimerUtils.h index ef833472bf7f..3f4243a8ae56 100644 --- a/CORE/MAC/src/pe/lim/limTimerUtils.h +++ b/CORE/MAC/src/pe/lim/limTimerUtils.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -96,7 +96,6 @@ void limDeactivateAndChangeTimer(tpAniSirGlobal, tANI_U32); void limHeartBeatDeactivateAndChangeTimer(tpAniSirGlobal, tpPESession); void limReactivateHeartBeatTimer(tpAniSirGlobal, tpPESession); void limDummyPktExpTimerHandler(void *, tANI_U32); -void limSendDisassocFrameThresholdHandler(void *, tANI_U32); void limCnfWaitTmerHandler(void *, tANI_U32); void limKeepaliveTmerHandler(void *, tANI_U32); void limDeactivateAndChangePerStaIdTimer(tpAniSirGlobal, tANI_U32, tANI_U16); diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h index fd2d640a95e9..42bc2ffbac2c 100644 --- a/CORE/MAC/src/pe/lim/limTypes.h +++ b/CORE/MAC/src/pe/lim/limTypes.h @@ -193,7 +193,7 @@ typedef struct sLimMlmStartReq tANI_U8 ssidHidden; tANI_U8 wps_state; tANI_U8 obssProtEnabled; - uint8_t beacon_tx_rate; + uint16_t beacon_tx_rate; } tLimMlmStartReq, *tpLimMlmStartReq; typedef struct sLimMlmStartCnf diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index 156c2c795ef2..f4569d25a3ea 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -726,10 +726,6 @@ limCleanupMlm(tpAniSirGlobal pMac) tx_timer_delete(&pAuthNode[n]->timer); } - // Deactivate and delete Hash Miss throttle timer - tx_timer_deactivate(&pMac->lim.limTimers.gLimSendDisassocFrameThresholdTimer); - tx_timer_delete(&pMac->lim.limTimers.gLimSendDisassocFrameThresholdTimer); - tx_timer_deactivate(&pMac->lim.limTimers.gLimUpdateOlbcCacheTimer); tx_timer_delete(&pMac->lim.limTimers.gLimUpdateOlbcCacheTimer); tx_timer_deactivate(&pMac->lim.limTimers.gLimPreAuthClnupTimer); diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c index 6969d29322db..7a8a96cba6cd 100644 --- a/CORE/MAC/src/pe/sch/schBeaconGen.c +++ b/CORE/MAC/src/pe/sch/schBeaconGen.c @@ -241,7 +241,7 @@ tSirRetStatus schSetFixedBeaconFields(tpAniSirGlobal pMac,tpPESession psessionEn /* Skip over the time stamp (it'll be updated later). */ - pBcn1->BeaconInterval.interval = pMac->sch.schObject.gSchBeaconInterval; + pBcn1->BeaconInterval.interval = psessionEntry->beaconParams.beaconInterval; PopulateDot11fCapabilities( pMac, &pBcn1->Capabilities, psessionEntry ); if (psessionEntry->ssidHidden) { diff --git a/CORE/SAP/inc/sapApi.h b/CORE/SAP/inc/sapApi.h index eec577d5c3c0..a3cbbd68d7ba 100644 --- a/CORE/SAP/inc/sapApi.h +++ b/CORE/SAP/inc/sapApi.h @@ -543,8 +543,7 @@ typedef struct sap_Config { v_PVOID_t pProbeRespBcnIEsBuffer; /* buffer for addn ies comes from hostapd*/ uint8_t sap_dot11mc; /* Specify if 11MC is enabled or disabled*/ enum sap_acs_dfs_mode acs_dfs_mode; - - uint8_t beacon_tx_rate; + uint16_t beacon_tx_rate; uint8_t *vendor_ie; enum vendor_ie_access_policy vendor_ie_access_policy; uint16_t sta_inactivity_timeout; @@ -552,8 +551,8 @@ typedef struct sap_Config { uint8_t short_retry_limit; uint8_t long_retry_limit; uint8_t ampdu_size; - tSirMacRateSet supp_rate_set; - tSirMacRateSet extended_rate_set; + tSirMacRateSet supported_rates; + tSirMacRateSet extended_rates; } tsap_Config_t; #ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE @@ -993,7 +992,10 @@ v_PVOID_t WLANSAP_Open(v_PVOID_t pvosGCtx); VOS_STATUS WLANSAP_Start ( - v_PVOID_t pvosGCtx + v_PVOID_t pvosGCtx, + tVOS_CON_MODE mode, + uint8_t *addr, + uint32_t *session_id ); /*========================================================================== diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c index 1fe613868e1f..92d0e8f16ce3 100644 --- a/CORE/SAP/src/sapApiLinkCntl.c +++ b/CORE/SAP/src/sapApiLinkCntl.c @@ -533,20 +533,6 @@ WLANSAP_PreStartBssAcsScanCallback eSAP_ACS_CHANNEL_SELECTED, (v_PVOID_t) eSAP_STATUS_SUCCESS); } - - if (psapContext->isScanSessionOpen) - { - if(eHAL_STATUS_SUCCESS != sme_CloseSession(halHandle, - psapContext->sessionId, NULL, NULL)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "In %s CloseSession error", __func__); - } else { - psapContext->isScanSessionOpen = eSAP_FALSE; - } - } - psapContext->sessionId = 0xff; - return halStatus; } @@ -615,12 +601,10 @@ WLANSAP_RoamCallback case eCSR_ROAM_SESSION_OPENED: { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - FL("Before switch on roamStatus = %d"), - roamStatus); + FL("Session %d opened successfully"), + sapContext->sessionId); sapContext->isSapSessionOpen = eSAP_TRUE; - halStatus = sme_RoamConnect(hHal, sapContext->sessionId, - &sapContext->csrRoamProfile, - &sapContext->csrRoamId); + vos_event_set(&sapContext->sap_session_opened_evt); break; } diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c index 02927477f793..5f55eb805e2e 100644 --- a/CORE/SAP/src/sapFsm.c +++ b/CORE/SAP/src/sapFsm.c @@ -1627,8 +1627,8 @@ static v_U8_t sapRandomChannelSel(ptSapContext sapContext) channelBitmap.chanBondingSet[1].startChannel = 52; channelBitmap.chanBondingSet[2].startChannel = 100; channelBitmap.chanBondingSet[3].startChannel = 116; - channelBitmap.chanBondingSet[3].startChannel = 132; - channelBitmap.chanBondingSet[4].startChannel = 149; + channelBitmap.chanBondingSet[4].startChannel = 132; + channelBitmap.chanBondingSet[5].startChannel = 149; /* now loop through whatever is left of channel list */ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, FL("sapdfs: Moving temp channel list to final.")); @@ -2423,31 +2423,22 @@ sapGotoChannelSel return VOS_STATUS_SUCCESS; }// sapGotoChannelSel +#define SAP_OPEN_SESSION_TIMEOUT 500 -/*========================================================================== - FUNCTION sap_OpenSession - - DESCRIPTION - Function for opening SME and SAP sessions when system is in SoftAP role - - DEPENDENCIES - NA. - - PARAMETERS - - IN - hHal : Hal handle - sapContext : Sap Context value - - RETURN VALUE - The VOS_STATUS code associated with performing the operation - - VOS_STATUS_SUCCESS: Success +/** + * sap_OpenSession() - Opens a SAP session + * @hHal: Hal handle + * @sapContext: Sap Context value + * @session_id: Pointer to the session id + * + * Function for opening SME and SAP sessions when system is in SoftAP role + * + * Return: eHalStatus + */ - SIDE EFFECTS -============================================================================*/ -VOS_STATUS -sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) +eHalStatus +sap_OpenSession (tHalHandle hHal, ptSapContext sapContext, + uint32_t *session_id) { tANI_U32 type, subType; eHalStatus halStatus; @@ -2464,6 +2455,7 @@ sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "failed to get vdev type"); return VOS_STATUS_E_FAILURE; } + vos_event_reset(&sapContext->sap_session_opened_evt); /* Open SME Session for Softap */ halStatus = sme_OpenSession(hHal, &WLANSAP_RoamCallback, @@ -2482,12 +2474,22 @@ sap_OpenSession (tHalHandle hHal, ptSapContext sapContext) } sme_set_allowed_action_frames(hHal, ALLOWED_ACTION_FRAMES_BITMAP0_SAP); + status = vos_wait_single_event( + &sapContext->sap_session_opened_evt, + SAP_OPEN_SESSION_TIMEOUT); + if (!VOS_IS_STATUS_SUCCESS(status)) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "wait for sap open session event timed out"); + return VOS_STATUS_E_FAILURE; + } pMac->sap.sapCtxList [ sapContext->sessionId ].sessionID = sapContext->sessionId; pMac->sap.sapCtxList [ sapContext->sessionId ].pSapContext = sapContext; pMac->sap.sapCtxList [ sapContext->sessionId ].sapPersona= sapContext->csrRoamProfile.csrPersona; + *session_id = sapContext->sessionId; + sapContext->isSapSessionOpen = eSAP_TRUE; return VOS_STATUS_SUCCESS; } @@ -2555,17 +2557,17 @@ sapGotoStarting eSME_REASON_OTHER); } - halStatus = sap_OpenSession(hHal, sapContext); + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, + "%s: session: %d", __func__, sapContext->sessionId); - if(eHAL_STATUS_SUCCESS != halStatus ) - { + halStatus = sme_RoamConnect(hHal, sapContext->sessionId, + &sapContext->csrRoamProfile, + &sapContext->csrRoamId); + if (eHAL_STATUS_SUCCESS != halStatus) VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sap_OpenSession status = %d", - __func__, halStatus); - return VOS_STATUS_E_FAILURE; - } + "%s: Failed to issue sme_RoamConnect", __func__); + return halStatus; - return VOS_STATUS_SUCCESS; }// sapGotoStarting /*========================================================================== @@ -3145,6 +3147,7 @@ eHalStatus sap_CloseSession(tHalHandle hHal, sapContext->isCacStartNotified = VOS_FALSE; sapContext->isCacEndNotified = VOS_FALSE; pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = NULL; + sapContext->isSapSessionOpen = false; if (NULL == sap_find_valid_concurrent_session(hHal)) { @@ -3417,44 +3420,37 @@ sapFsm if ((msg == eSAP_HDD_START_INFRA_BSS)) { /* Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT (both without substates) */ - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, new from state %s => %s", - __func__, "eSAP_DISCONNECTED", "eSAP_CH_SELECT"); - - /* There can be one SAP Session for softap */ - if (sapContext->isSapSessionOpen == eSAP_TRUE) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, - "%s:SME Session is already opened\n",__func__); - return VOS_STATUS_E_EXISTS; - } - - sapContext->sessionId = 0xff; - - if ((sapContext->channel == AUTO_CHANNEL_SELECT) && - (sapContext->isScanSessionOpen == eSAP_FALSE)) - { - tANI_U32 type, subType; - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (NULL == hHal) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "In %s, NULL hHal in state %s, msg %d", - __func__, "eSAP_DISCONNECTED", msg); + VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, new from state %s => %s, session id %d", + __func__, "eSAP_DISCONNECTED", "eSAP_CH_SELECT", sapContext->sessionId); + + if (sapContext->isSapSessionOpen == eSAP_FALSE) { + uint32_t type, subtype; + if (sapContext->csrRoamProfile.csrPersona == + VOS_P2P_GO_MODE) + vosStatus = vos_get_vdev_types(VOS_P2P_GO_MODE, + &type, &subtype); + else + vosStatus = vos_get_vdev_types(VOS_STA_SAP_MODE, + &type, &subtype); + if (VOS_STATUS_SUCCESS != vosStatus) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_FATAL, + "failed to get vdev type"); + return VOS_STATUS_E_FAILURE; } - else if(VOS_STATUS_SUCCESS == vos_get_vdev_types(VOS_STA_MODE, - &type, &subType)) { - /* Open SME Session for scan */ - if(eHAL_STATUS_SUCCESS != sme_OpenSession(hHal, - NULL, sapContext, sapContext->self_mac_addr, - &sapContext->sessionId, type, subType)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sme_OpenSession", __func__); - } else { - sapContext->isScanSessionOpen = eSAP_TRUE; - } + /* Open SME Session for scan */ + vosStatus = sme_OpenSession(hHal, NULL, + sapContext, sapContext->self_mac_addr, + &sapContext->sessionId, type, subtype); + if (VOS_STATUS_SUCCESS != vosStatus) { + VOS_TRACE(VOS_MODULE_ID_SAP, + VOS_TRACE_LEVEL_ERROR, + FL("Error: calling sme_OpenSession")); + return VOS_STATUS_E_FAILURE; } + sapContext->isSapSessionOpen = eSAP_TRUE; } + /* init dfs channel nol */ sapInitDfsChannelNolList(sapContext); @@ -3512,26 +3508,6 @@ sapFsm break; case eSAP_CH_SELECT: - if (sapContext->isScanSessionOpen == eSAP_TRUE) - { - /* scan completed, so close the session */ - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (NULL == hHal) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, NULL hHal in state %s, msg %d", - __func__, "eSAP_CH_SELECT", msg); - } else { - if(eHAL_STATUS_SUCCESS != sme_CloseSession(hHal, - sapContext->sessionId, NULL, NULL)) - { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s CloseSession error event msg %d", - __func__, msg); - } else { - sapContext->isScanSessionOpen = eSAP_FALSE; - } - } - sapContext->sessionId = 0xff; - } if (msg == eSAP_MAC_SCAN_COMPLETE) { @@ -3924,7 +3900,7 @@ sapFsm else { sapContext->isSapSessionOpen = eSAP_FALSE; - if (!HAL_STATUS_SUCCESS( + if (!(eHAL_STATUS_SUCCESS == sap_CloseSession(hHal, sapContext, sapRoamSessionCloseCallback, TRUE))) @@ -4137,6 +4113,22 @@ sapconvertToCsrProfile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType, t } profile->sap_dot11mc = pconfig_params->sap_dot11mc; + if (pconfig_params->supported_rates.numRates) { + vos_mem_copy(profile->supported_rates.rate, + pconfig_params->supported_rates.rate, + pconfig_params->supported_rates.numRates); + profile->supported_rates.numRates = + pconfig_params->supported_rates.numRates; + } + + if (pconfig_params->extended_rates.numRates) { + vos_mem_copy(profile->extended_rates.rate, + pconfig_params->extended_rates.rate, + pconfig_params->extended_rates.numRates); + profile->extended_rates.numRates = + pconfig_params->extended_rates.numRates; + } + return eSAP_STATUS_SUCCESS; /* Success. */ } diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h index 7a7d7aedbd2e..e4054623b289 100644 --- a/CORE/SAP/src/sapInternal.h +++ b/CORE/SAP/src/sapInternal.h @@ -296,10 +296,10 @@ typedef struct sSapContext { #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ enum sap_acs_dfs_mode dfs_mode; - uint8_t beacon_tx_rate; + uint16_t beacon_tx_rate; tSirMacRateSet supp_rate_set; tSirMacRateSet extended_rate_set; - + vos_event_t sap_session_opened_evt; } *ptSapContext; @@ -1086,6 +1086,13 @@ void sap_config_acs_result(tHalHandle hal, ptSapContext sap_ctx, */ bool sap_check_in_avoid_ch_list(ptSapContext sap_ctx, uint8_t channel); #endif + +eHalStatus sap_OpenSession(tHalHandle hHal, ptSapContext sapContext, + uint32_t *session_id); +eHalStatus sap_CloseSession(tHalHandle hHal, + ptSapContext sapContext, + csrRoamSessionCloseCallback callback, + v_BOOL_t valid); #ifdef __cplusplus } #endif diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c index ec75cbf419fe..cf04ef96e5b6 100644 --- a/CORE/SAP/src/sapModule.c +++ b/CORE/SAP/src/sapModule.c @@ -146,68 +146,63 @@ v_PVOID_t WLANSAP_Open(v_PVOID_t pvosGCtx) return pSapCtx; }// WLANSAP_Open -/*========================================================================== - FUNCTION WLANSAP_Start - - DESCRIPTION - Called as part of the overall start procedure (vos_start). SAP will - use this call to register with TL as the SAP entity for - SAP RSN frames. - - DEPENDENCIES - - PARAMETERS - - IN - pCtx : Pointer to the global vos context; a handle to SAP's - control block can be extracted from its context - When MBSSID feature is enabled, SAP context is directly - passed to SAP APIs - - RETURN VALUE - The result code associated with performing the operation - - VOS_STATUS_E_FAULT: Pointer to SAP cb is NULL ; access would cause a page - fault - VOS_STATUS_SUCCESS: Success - - SIDE EFFECTS -============================================================================*/ - +/** + * WLANSAP_Start() - wlan start SAP. + * @pCtx: Pointer to the global cds context; a handle to SAP's + * control block can be extracted from its context + * When MBSSID feature is enabled, SAP context is directly + * passed to SAP APIs + * @mode: Device mode + * @addr: MAC address of the SAP + * @session_id: Pointer to the session id + * + * Called as part of the overall start procedure (cds_enable). SAP will + * use this call to register with TL as the SAP entity for SAP RSN frames. + * + * Return: The result code associated with performing the operation + * VOS_STATUS_E_FAULT: Pointer to SAP cb is NULL; + * access would cause a page fault. + * VOS_STATUS_SUCCESS: Success + */ VOS_STATUS WLANSAP_Start ( - v_PVOID_t pCtx + v_PVOID_t pCtx, + tVOS_CON_MODE mode, + uint8_t *addr, + uint32_t *session_id ) { ptSapContext pSapCtx = NULL; + VOS_STATUS vos_status; + tHalHandle hal; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, - "WLANSAP_Start invoked successfully"); + "WLANSAP_Start invoked successfully"); /*------------------------------------------------------------------------ - Sanity check - Extract SAP control block - ------------------------------------------------------------------------*/ + Sanity check + Extract SAP control block + ------------------------------------------------------------------------*/ pSapCtx = VOS_GET_SAP_CB(pCtx); if ( NULL == pSapCtx ) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: Invalid SAP pointer from pCtx", __func__); + "%s: Invalid SAP pointer from pCtx", __func__); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ - For now, presume security is not enabled. - -----------------------------------------------------------------------*/ + For now, presume security is not enabled. + -----------------------------------------------------------------------*/ pSapCtx->ucSecEnabled = WLANSAP_SECURITY_ENABLED_STATE; /*------------------------------------------------------------------------ - Now configure the roaming profile links. To SSID and bssid. - ------------------------------------------------------------------------*/ + Now configure the roaming profile links. To SSID and bssid. + ------------------------------------------------------------------------*/ // We have room for two SSIDs. pSapCtx->csrRoamProfile.SSIDs.numOfSSIDs = 1; // This is true for now. pSapCtx->csrRoamProfile.SSIDs.SSIDList = pSapCtx->SSIDList; //Array of two @@ -217,6 +212,9 @@ WLANSAP_Start pSapCtx->csrRoamProfile.BSSIDs.numOfBSSIDs = 1; // This is true for now. pSapCtx->csrRoamProfile.BSSIDs.bssid = &pSapCtx->bssid; + pSapCtx->csrRoamProfile.csrPersona = mode; + vos_mem_copy(pSapCtx->self_mac_addr, addr, VOS_MAC_ADDR_SIZE); + vos_event_init(&pSapCtx->sap_session_opened_evt); // Now configure the auth type in the roaming profile. To open. pSapCtx->csrRoamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; // open is the default @@ -224,10 +222,17 @@ WLANSAP_Start if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pSapCtx->SapGlobalLock))) { VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "WLANSAP_Start failed init lock"); + "WLANSAP_Start failed init lock"); return VOS_STATUS_E_FAULT; } - + hal = (tHalHandle) VOS_GET_HAL_CB(pSapCtx->pvosGCtx); + vos_status = sap_OpenSession(hal, pSapCtx, session_id); + if (VOS_STATUS_SUCCESS != vos_status) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, + "Error: In %s calling sap_OpenSession status = %d", + __func__, vos_status); + return VOS_STATUS_E_FAILURE; + } return VOS_STATUS_SUCCESS; }/* WLANSAP_Start */ @@ -383,6 +388,7 @@ WLANSAP_CleanCB v_U32_t freeFlag // 0 /*do not empty*/); ) { + tHalHandle hal; /*------------------------------------------------------------------------ Sanity check SAP control block ------------------------------------------------------------------------*/ @@ -399,6 +405,13 @@ WLANSAP_CleanCB ------------------------------------------------------------------------*/ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "WLANSAP_CleanCB"); + hal = (tHalHandle) VOS_GET_HAL_CB(pSapCtx->pvosGCtx); + if (eSAP_TRUE == pSapCtx->isSapSessionOpen && hal) { + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, + "close existing SAP session"); + sap_CloseSession(hal, pSapCtx, NULL, false); + } + vos_mem_zero( pSapCtx, sizeof(tSapContext)); pSapCtx->pvosGCtx = NULL; @@ -409,7 +422,6 @@ WLANSAP_CleanCB __func__, pSapCtx->sapsMachine, pSapCtx); pSapCtx->sessionId = 0; pSapCtx->channel = 0; - pSapCtx->isSapSessionOpen = eSAP_FALSE; return VOS_STATUS_SUCCESS; }// WLANSAP_CleanCB @@ -3770,44 +3782,11 @@ WLANSAP_ACS_CHSelect(v_PVOID_t pvosGCtx, return VOS_STATUS_E_FAULT; } - if (sapContext->isSapSessionOpen == eSAP_TRUE) { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, - "%s:SME Session is already opened\n",__func__); - return VOS_STATUS_E_EXISTS; - } - - sapContext->sessionId = 0xff; pMac = PMAC_STRUCT( hHal ); sapContext->acs_cfg = &pConfig->acs_cfg; sapContext->csrRoamProfile.phyMode = sapContext->acs_cfg->hw_mode; - if (sapContext->isScanSessionOpen == eSAP_FALSE) { - tANI_U32 type, subType; - -#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE - if((sapContext->acs_cfg->skip_scan_status != eSAP_SKIP_ACS_SCAN) && - (VOS_STATUS_SUCCESS == - vos_get_vdev_types(VOS_STA_MODE, &type, &subType))) { -#else - if(VOS_STATUS_SUCCESS == - vos_get_vdev_types(VOS_STA_MODE, &type, &subType)) { -#endif - /* - * Open SME Session for scan - */ - if(eHAL_STATUS_SUCCESS != sme_OpenSession(hHal, NULL, sapContext, - sapContext->self_mac_addr, - &sapContext->sessionId, - type, subType)) { - VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "Error: In %s calling sme_OpenSession", __func__); - return VOS_STATUS_E_FAILURE; - } - else - sapContext->isScanSessionOpen = eSAP_TRUE; - } - /* * Copy the HDD callback function to report the * ACS result after scan in SAP context callback function. @@ -3855,32 +3834,12 @@ WLANSAP_ACS_CHSelect(v_PVOID_t pvosGCtx, FL("Scan Req Failed/ACS Overridden, Selected channel = %d"), sapContext->channel); - if (sapContext->isScanSessionOpen == eSAP_TRUE) { - /* acs scan not needed so close the session */ - tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx); - if (hHal == NULL) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: HAL Handle NULL. ACS Scan session close fail!", - __func__); - return VOS_STATUS_E_FAILURE; - } - if (eHAL_STATUS_SUCCESS == sme_CloseSession(hHal, - sapContext->sessionId, NULL, NULL)) { - sapContext->isScanSessionOpen = eSAP_FALSE; - } else { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, - "%s: ACS Scan session close fail!", __func__); - } - sapContext->sessionId = 0xff; - } - return sapSignalHDDevent(sapContext, NULL, eSAP_ACS_CHANNEL_SELECTED, (v_PVOID_t) eSAP_STATUS_SUCCESS); } else if (VOS_STATUS_SUCCESS == vosStatus) VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, FL("Successfully Issued a Pre Start Bss Scan Request")); - } return vosStatus; } /** diff --git a/CORE/SERVICES/BMI/ar6320v2_dbg_regtable.h b/CORE/SERVICES/BMI/ar6320v2_dbg_regtable.h index e75534a5d49d..722154cb2b7f 100644 --- a/CORE/SERVICES/BMI/ar6320v2_dbg_regtable.h +++ b/CORE/SERVICES/BMI/ar6320v2_dbg_regtable.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012,2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2012,2014,2016, The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -606,4 +606,279 @@ static const tgt_reg_section ar6320v3_reg_table[] = {0x80010, 0x80020}, }; #endif +#ifdef HIF_SDIO +static const tgt_reg_section ar6320v3_reg_table[] = { + {0x800, 0x810}, + {0x820, 0x82C}, + {0x830, 0x8F4}, + {0x90C, 0x91C}, + {0xA14, 0xA18}, + {0xA84, 0xA94}, + {0xAA8, 0xAD4}, + {0xADC, 0xB40}, + {0x1000, 0x10A4}, + {0x10BC, 0x111C}, + {0x1134, 0x1138}, + {0x1144, 0x114C}, + {0x1150, 0x115C}, + {0x1160, 0x1178}, + {0x1240, 0x1260}, + {0x2000, 0x207C}, + {0x3000, 0x3014}, + {0x4000, 0x4014}, + {0x5000, 0x5124}, + {0x6000, 0x6040}, + {0x6080, 0x60CC}, + {0x6100, 0x611C}, + {0x6140, 0x61D8}, + {0x6200, 0x6238}, + {0x6240, 0x628C}, + {0x62C0, 0x62EC}, + {0x6380, 0x63E8}, + {0x6400, 0x6440}, + {0x6480, 0x64CC}, + {0x6500, 0x651C}, + {0x6540, 0x6580}, + {0x6600, 0x6638}, + {0x6640, 0x668C}, + {0x66C0, 0x66EC}, + {0x6780, 0x67E8}, + {0x7080, 0x708C}, + {0x70C0, 0x70C8}, + {0x7400, 0x741C}, + {0x7440, 0x7454}, + {0x7800, 0x7818}, + {0x8010, 0x8060}, + {0x8080, 0x8084}, + {0x80A0, 0x80A4}, + {0x80C0, 0x80C4}, + {0x80E0, 0x80ec}, + {0x8110, 0x8128}, + {0x9000, 0x9004}, + {0xF000, 0xF0E0}, + {0xF140, 0xF190}, + {0xF250, 0xF25C}, + {0xF260, 0xF268}, + {0xF26C, 0xF2A8}, + {0x10008, 0x1000C}, + {0x10014, 0x10018}, + {0x1001C, 0x10020}, + {0x10024, 0x10028}, + {0x10030, 0x10034}, + {0x10040, 0x10054}, + {0x10058, 0x1007C}, + {0x10080, 0x100C4}, + {0x100C8, 0x10114}, + {0x1012C, 0x10130}, + {0x10138, 0x10144}, + {0x10200, 0x10220}, + {0x10230, 0x10250}, + {0x10260, 0x10280}, + {0x10290, 0x102B0}, + {0x102C0, 0x102DC}, + {0x102E0, 0x102F4}, + {0x102FC, 0x1037C}, + {0x10380, 0x10390}, + {0x10800, 0x10828}, + {0x10840, 0x10844}, + {0x10880, 0x10884}, + {0x108C0, 0x108E8}, + {0x10900, 0x10928}, + {0x10940, 0x10944}, + {0x10980, 0x10984}, + {0x109C0, 0x109E8}, + {0x10A00, 0x10A28}, + {0x10A40, 0x10A50}, + {0x11000, 0x11028}, + {0x11030, 0x11034}, + {0x11038, 0x11068}, + {0x11070, 0x11074}, + {0x11078, 0x110A8}, + {0x110B0, 0x110B4}, + {0x110B8, 0x110E8}, + {0x110F0, 0x110F4}, + {0x110F8, 0x11128}, + {0x11138, 0x11144}, + {0x11178, 0x11180}, + {0x111B8, 0x111C0}, + {0x111F8, 0x11200}, + {0x11238, 0x1123C}, + {0x11270, 0x11274}, + {0x11278, 0x1127C}, + {0x112B0, 0x112B4}, + {0x112B8, 0x112BC}, + {0x112F0, 0x112F4}, + {0x112F8, 0x112FC}, + {0x11338, 0x1133C}, + {0x11378, 0x1137C}, + {0x113B8, 0x113BC}, + {0x113F8, 0x113FC}, + {0x11438, 0x11440}, + {0x11478, 0x11480}, + {0x114B8, 0x114BC}, + {0x114F8, 0x114FC}, + {0x11538, 0x1153C}, + {0x11578, 0x1157C}, + {0x115B8, 0x115BC}, + {0x115F8, 0x115FC}, + {0x11638, 0x1163C}, + {0x11678, 0x1167C}, + {0x116B8, 0x116BC}, + {0x116F8, 0x116FC}, + {0x11738, 0x1173C}, + {0x11778, 0x1177C}, + {0x117B8, 0x117BC}, + {0x117F8, 0x117FC}, + {0x17000, 0x1701C}, + {0x17020, 0x170AC}, + {0x18000, 0x18050}, + {0x18054, 0x18074}, + {0x18080, 0x180D4}, + {0x180DC, 0x18104}, + {0x18108, 0x1813C}, + {0x18144, 0x18148}, + {0x18168, 0x18174}, + {0x18178, 0x18180}, + {0x181C8, 0x181E0}, + {0x181E4, 0x181E8}, + {0x181EC, 0x1820C}, + {0x1825C, 0x18280}, + {0x18284, 0x18290}, + {0x18294, 0x182A0}, + {0x18300, 0x18304}, + {0x18314, 0x18320}, + {0x18328, 0x18350}, + {0x1835C, 0x1836C}, + {0x18370, 0x18390}, + {0x18398, 0x183AC}, + {0x183BC, 0x183D8}, + {0x183DC, 0x183F4}, + {0x18400, 0x186F4}, + {0x186F8, 0x1871C}, + {0x18720, 0x18790}, + {0x19800, 0x19830}, + {0x19834, 0x19840}, + {0x19880, 0x1989C}, + {0x198A4, 0x198B0}, + {0x198BC, 0x19900}, + {0x19C00, 0x19C88}, + {0x19D00, 0x19D20}, + {0x19E00, 0x19E7C}, + {0x19E80, 0x19E94}, + {0x19E98, 0x19EAC}, + {0x19EB0, 0x19EBC}, + {0x19F70, 0x19F74}, + {0x19F80, 0x19F8C}, + {0x19FA0, 0x19FB4}, + {0x19FC0, 0x19FD8}, + {0x1A000, 0x1A200}, + {0x1A204, 0x1A210}, + {0x1A228, 0x1A22C}, + {0x1A230, 0x1A248}, + {0x1A250, 0x1A270}, + {0x1A280, 0x1A290}, + {0x1A2A0, 0x1A2A4}, + {0x1A2C0, 0x1A2EC}, + {0x1A300, 0x1A3BC}, + {0x1A3F0, 0x1A3F4}, + {0x1A3F8, 0x1A434}, + {0x1A438, 0x1A444}, + {0x1A448, 0x1A468}, + {0x1A580, 0x1A58C}, + {0x1A644, 0x1A654}, + {0x1A670, 0x1A698}, + {0x1A6AC, 0x1A6B0}, + {0x1A6D0, 0x1A6D4}, + {0x1A6EC, 0x1A70C}, + {0x1A710, 0x1A738}, + {0x1A7C0, 0x1A7D0}, + {0x1A7D4, 0x1A7D8}, + {0x1A7DC, 0x1A7E4}, + {0x1A7F0, 0x1A7F8}, + {0x1A888, 0x1A89C}, + {0x1A8A8, 0x1A8AC}, + {0x1A8C0, 0x1A8DC}, + {0x1A8F0, 0x1A8FC}, + {0x1AE04, 0x1AE08}, + {0x1AE18, 0x1AE24}, + {0x1AF80, 0x1AF8C}, + {0x1AFA0, 0x1AFB4}, + {0x1B000, 0x1B200}, + {0x1B284, 0x1B288}, + {0x1B2D0, 0x1B2D8}, + {0x1B2DC, 0x1B2EC}, + {0x1B300, 0x1B340}, + {0x1B374, 0x1B378}, + {0x1B380, 0x1B384}, + {0x1B388, 0x1B38C}, + {0x1B404, 0x1B408}, + {0x1B420, 0x1B428}, + {0x1B440, 0x1B444}, + {0x1B448, 0x1B44C}, + {0x1B450, 0x1B458}, + {0x1B45C, 0x1B468}, + {0x1B584, 0x1B58C}, + {0x1B68C, 0x1B690}, + {0x1B6AC, 0x1B6B0}, + {0x1B7F0, 0x1B7F8}, + {0x1C800, 0x1CC00}, + {0x1CE00, 0x1CE04}, + {0x1CF80, 0x1CF84}, + {0x1D200, 0x1D800}, + {0x1E000, 0x20014}, + {0x20100, 0x20124}, + {0x21400, 0x217A8}, + {0x21800, 0x21BA8}, + {0x21C00, 0x21FA8}, + {0x22000, 0x223A8}, + {0x22400, 0x227A8}, + {0x22800, 0x22BA8}, + {0x22C00, 0x22FA8}, + {0x23000, 0x233A8}, + {0x24000, 0x24034}, + + /* + * EFUSE0,1,2 is disabled here + * because it's state may be reset + * + * {0x24800, 0x24804}, + * {0x25000, 0x25004}, + * {0x25800, 0x25804}, + */ + + {0x26000, 0x26064}, + {0x27000, 0x27024}, + {0x34000, 0x3400C}, + {0x34400, 0x3445C}, + {0x34800, 0x3485C}, + {0x34C00, 0x34C5C}, + {0x35000, 0x3505C}, + {0x35400, 0x3545C}, + {0x35800, 0x3585C}, + {0x35C00, 0x35C5C}, + {0x36000, 0x3605C}, + {0x38000, 0x38064}, + {0x38070, 0x380E0}, + {0x3A000, 0x3A074}, + + /* + * DBI windows is skipped here, it can be only accessed when pcie + * is active (not in reset) and CORE_CTRL_PCIE_LTSSM_EN = 0 && + * PCIE_CTRL_APP_LTSSM_ENALBE=0. + * {0x3C000 , 0x3C004}, + */ + + {0x40000, 0x400A4}, + + /* + * SI register is skiped here. + * Because it will cause bus hang + * + * {0x50000, 0x50018}, + */ + + {0x80000, 0x8000C}, + {0x80010, 0x80020}, +}; +#endif #endif /* #ifndef _AR6320V2_DBG_REGTABLE_H_ */ diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 378ffa3d17c0..df4844f8bb1f 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -2359,7 +2359,7 @@ int ol_diag_read(struct ol_softc *scn, u_int8_t *buffer, } } -#if defined(HIF_PCI) +#ifdef HIF_PCI static int ol_ath_get_reg_table(A_UINT32 target_version, tgt_reg_table *reg_table) { @@ -2394,6 +2394,35 @@ static int ol_ath_get_reg_table(A_UINT32 target_version, return section_len; } +#elif defined(HIF_SDIO) +static int ol_ath_get_reg_table(uint32_t target_version, + tgt_reg_table *reg_table) +{ + int len = 0; + + if (!reg_table) { + ASSERT(0); + return len; + } + + switch (target_version) { + case AR6320_REV3_VERSION: + case AR6320_REV3_2_VERSION: + reg_table->section = (tgt_reg_section *)&ar6320v3_reg_table[0]; + reg_table->section_size = sizeof(ar6320v3_reg_table)/ + sizeof(ar6320v3_reg_table[0]); + len = AR6320_REV3_REG_SIZE; + break; + default: + reg_table->section = (void *)NULL; + reg_table->section_size = 0; + len = 0; + break; + } + + return len; +} +#endif static int ol_diag_read_reg_loc(struct ol_softc *scn, u_int8_t *buffer, u_int32_t buffer_len) @@ -2460,7 +2489,8 @@ out: return result; } -void ol_dump_target_memory(HIF_DEVICE *hif_device, void *memoryBlock) +#ifdef HIF_PCI +static void ol_dump_target_memory(HIF_DEVICE *hif_device, void *memoryBlock) { char *bufferLoc = memoryBlock; u_int32_t sectionCount = 0; @@ -2484,6 +2514,99 @@ void ol_dump_target_memory(HIF_DEVICE *hif_device, void *memoryBlock) bufferLoc += size; } } + +static uint32_t ol_get_max_section_count(struct ol_softc *scn) +{ + return 5; +} + +static int ol_get_iram1_len_and_pos(struct ol_softc *scn, uint32_t *pos, + uint32_t *len) +{ + int status = scn->target_status; + int ret = hif_pci_set_ram_config_reg(scn->hif_sc, IRAM1_LOCATION >> 20); + + if ((status != OL_TRGET_STATUS_RESET) || ret) { + pr_debug("%s: Skip IRAM1 Section; Target Status:%d; ret:%d\n", + __func__, status, ret); + return -EBUSY; + } + + *pos = IRAM1_LOCATION; + *len = IRAM1_SIZE; + + return 0; +} + +static int ol_get_iram2_len_and_pos(struct ol_softc *scn, uint32_t *pos, + uint32_t *len) +{ + int ret = hif_pci_set_ram_config_reg(scn->hif_sc, IRAM2_LOCATION >> 20); + + if (ret) { + pr_debug("Skipping IRAM2 Section; ret:%d\n", ret); + return -EBUSY; + } + + *pos = IRAM2_LOCATION; + *len = IRAM2_SIZE; + + return 0; +} + +static int ol_get_iram_len_and_pos(struct ol_softc *scn, uint32_t *pos, uint32_t + *len, uint32_t section) +{ + switch (section) { + case 3: + pr_info("%s: Dumping IRAM1 section\n", __func__); + return ol_get_iram1_len_and_pos(scn, pos, len); + case 4: + pr_info("%s: Dumping IRAM2 section\n", __func__); + return ol_get_iram2_len_and_pos(scn, pos, len); + default: + pr_err("%s: Invalid Arguments\n", __func__); + return -EINVAL; + } + + return 0; +} +#else /* HIF_PCI */ +static uint32_t ol_get_max_section_count(struct ol_softc *scn) +{ + return 4; +} + +static int ol_get_iram_len_and_pos(struct ol_softc *scn, uint32_t *pos, uint32_t + *len, uint32_t section) +{ + *pos = IRAM_LOCATION; + *len = IRAM_SIZE; + + pr_info("%s: Dumping IRAM Section\n", __func__); + return 0; +} +#endif + +static int ol_read_reg_section(struct ol_softc *scn, char *ptr, uint32_t len) +{ + return ol_diag_read_reg_loc(scn, ptr, len); +} + +#ifndef CONFIG_HL_SUPPORT +static int ol_dump_fail_debug_info(struct ol_softc *scn, void *ptr) +{ + dump_CE_register(scn); + dump_CE_debug_register(scn->hif_sc); + ol_dump_target_memory(scn->hif_hdl, ptr); + + return -EACCES; +} +#else +static int ol_dump_fail_debug_info(struct ol_softc *scn, void *ptr) +{ + return 0; +} #endif /**--------------------------------------------------------------------------- @@ -2503,130 +2626,67 @@ int ol_target_coredump(void *inst, void *memoryBlock, u_int32_t blockLength) char *bufferLoc = memoryBlock; int result = 0; int ret = 0; - u_int32_t amountRead = 0; - u_int32_t sectionCount = 0; - u_int32_t pos = 0; - u_int32_t readLen = 0; - - /* - * SECTION = DRAM - * START = 0x00400000 - * LENGTH = 0x000a8000 - * - * SECTION = AXI - * START = 0x000a0000 - * LENGTH = 0x00018000 - * - * SECTION = REG - * START = 0x00000800 - * LENGTH = 0x0007F820 - * - * SECTION = IRAM1 - * START = 0x00980000 - * LENGTH = 0x00080000 - * - * SECTION = IRAM2 - * START = 0x00a00000 - * LENGTH = 0x00040000 - */ -#ifdef TARGET_DUMP_FOR_NON_QC_PLATFORM - while ((sectionCount < 4) && (amountRead < blockLength)) { -#else -#ifdef HIF_PCI - while ((sectionCount < 5) && (amountRead < blockLength)) { -#else - while ((sectionCount < 3) && (amountRead < blockLength)) { -#endif -#endif + uint32_t amountRead = 0; + uint32_t sectionCount = 0; + uint32_t pos = 0; + uint32_t readLen = 0; + uint32_t max_count = ol_get_max_section_count(scn); + + while ((sectionCount < max_count) && (amountRead < blockLength)) { switch (sectionCount) { case 0: - /* DRAM SECTION */ pos = DRAM_LOCATION; readLen = DRAM_SIZE; pr_err("%s: Dumping DRAM section...\n", __func__); break; case 1: - /* AXI SECTION */ pos = AXI_LOCATION; readLen = AXI_SIZE; pr_err("%s: Dumping AXI section...\n", __func__); break; case 2: - /* REG SECTION */ pos = REGISTER_LOCATION; - /* ol_diag_read_reg_loc checks for buffer overrun */ readLen = 0; pr_err("%s: Dumping Register section...\n", __func__); break; -#ifdef TARGET_DUMP_FOR_NON_QC_PLATFORM case 3: - /* IRAM SECTION */ - pos = IRAM_LOCATION; - readLen = IRAM_SIZE; - pr_err("%s: Dumping IRAM section...\n", __func__); - break; -#else -#ifdef HIF_PCI - case 3: - if ((scn->target_status != OL_TRGET_STATUS_RESET) || - hif_pci_set_ram_config_reg(scn->hif_sc, - IRAM1_LOCATION >> 20)) { - pr_debug("%s: Skipping IRAM1 section...\n", - __func__); - return 0; - } - - /* IRAM1 SECTION */ - pos = IRAM1_LOCATION; - readLen = IRAM1_SIZE; - pr_err("%s: Dumping IRAM1 section...\n", __func__); - break; case 4: - if (hif_pci_set_ram_config_reg(scn->hif_sc, - IRAM2_LOCATION >> 20)) { - pr_debug("%s: Skipping IRAM2 section...\n", - __func__); - return 0; + ret = ol_get_iram_len_and_pos(scn, &pos, &readLen, + sectionCount); + if (ret) { + pr_err("%s: Fail to Dump IRAM Section ret:%d\n", + __func__, ret); + return ret; } - - /* IRAM2 SECTION */ - pos = IRAM2_LOCATION; - readLen = IRAM2_SIZE; - pr_err("%s: Dumping IRAM2 section...\n", __func__); break; -#endif -#endif + default: + pr_err("%s: INVALID SECTION_:%d\n", __func__, + sectionCount); + return 0; } - if ((blockLength - amountRead) >= readLen) { -#if !defined(HIF_SDIO) - if (pos == REGISTER_LOCATION) - result = ol_diag_read_reg_loc(scn, bufferLoc, - blockLength - amountRead); - else -#endif - result = ol_diag_read(scn, bufferLoc, - pos, readLen); - if (result != -EIO) { - amountRead += result; - bufferLoc += result; - sectionCount++; - } else { -#ifdef CONFIG_HL_SUPPORT -#else - pr_err("Could not read dump section!\n"); - dump_CE_register(scn); - dump_CE_debug_register(scn->hif_sc); - ol_dump_target_memory(scn->hif_hdl, memoryBlock); - ret = -EACCES; -#endif - break; /* Could not read the section */ - } - } else { - pr_err("Insufficient room in dump buffer!\n"); - break; /* Insufficient room in buffer */ + if (blockLength - amountRead < readLen) { + pr_err("%s: No memory to dump section:%d buffer!\n", + __func__, sectionCount); + return -ENOMEM; } + + if (pos == REGISTER_LOCATION) + result = ol_read_reg_section(scn, bufferLoc, + blockLength-amountRead); + else + result = ol_diag_read(scn, bufferLoc, pos, readLen); + + if (result == -EIO) + return ol_dump_fail_debug_info(scn, memoryBlock); + + pr_info("%s: Section:%d Bytes Read:%0x\n", __func__, + sectionCount, result); + amountRead += result; + bufferLoc += result; + sectionCount++; } + return ret; } #endif diff --git a/CORE/SERVICES/BMI/ol_fw.h b/CORE/SERVICES/BMI/ol_fw.h index d0ccadea3a84..4dd7e48370d0 100644 --- a/CORE/SERVICES/BMI/ol_fw.h +++ b/CORE/SERVICES/BMI/ol_fw.h @@ -82,20 +82,28 @@ #define AXI_LOCATION 0x000a0000 #define AXI_SIZE 0x0001FFFC -#else + +#else /* ELSE TARGET_DUMP_FOR_NON_QC_PLATFORM */ #define DRAM_LOCATION 0x00400000 -#define DRAM_SIZE 0x000a8000 #define DRAM_LOCAL_BASE_ADDRESS (0x100000) +#ifdef HIF_PCI +#define DRAM_SIZE 0x000a8000 +#else +#define DRAM_SIZE 0x00098000 +#endif #ifdef HIF_PCI #define IRAM1_LOCATION 0x00980000 #define IRAM1_SIZE 0x00080000 #define IRAM2_LOCATION 0x00a00000 #define IRAM2_SIZE 0x00040000 -#else +#elif defined(HIF_SDIO) +#define IRAM_LOCATION 0x00980000 +#define IRAM_SIZE 0x000C0000 +#else /* ELSE HIF_PCI */ #define IRAM_LOCATION 0x00980000 #define IRAM_SIZE 0x00038000 -#endif +#endif /* END HIF_PCI */ #define AXI_LOCATION 0x000a0000 #ifdef HIF_PCI @@ -103,7 +111,7 @@ #else #define AXI_SIZE 0x00020000 #endif /* #ifdef HIF_PCIE */ -#endif +#endif /* END of ELSE TARGET_DUMP_FOR_NON_QC_PLATFORM*/ #define CE_OFFSET 0x00000400 #define CE_USEFUL_SIZE 0x00000058 diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index 944894f25531..81494f127492 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -1159,3 +1159,65 @@ __adf_nbuf_validate_skb_cb(void) BUILD_BUG_ON(sizeof(struct cvg_nbuf_cb) > FIELD_SIZEOF(struct sk_buff, cb)); } + +/** + * __adf_nbuf_is_wai() - Check if frame is WAI + * @data: pointer to skb data buffer + * + * This function checks if the frame is WAPI. + * + * Return: true (1) if WAPI + * + */ +bool __adf_nbuf_is_wai_pkt(uint8_t *data) +{ + uint16_t ether_type; + + ether_type = (uint16_t)(*(uint16_t *) + (data + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); + + if (ether_type == VOS_SWAP_U16(ADF_NBUF_TRAC_WAI_ETH_TYPE)) + return true; + + return false; +} + +/** + * __adf_nbuf_is_group_pkt() - Check if frame is multicast packet + * @data: pointer to skb data buffer + * + * This function checks if the frame is multicast packet. + * + * Return: true (1) if multicast + * + */ +bool __adf_nbuf_is_multicast_pkt(uint8_t *data) +{ + struct adf_mac_addr *mac_addr = (struct adf_mac_addr*)data; + + if ( mac_addr->bytes[0] & 0x01 ) + return true; + + return false; +} + +/** + * __adf_nbuf_is_bcast_pkt() - Check if frame is broadcast packet + * @data: pointer to skb data buffer + * + * This function checks if the frame is broadcast packet. + * + * Return: true (1) if broadcast + * + */ +bool __adf_nbuf_is_bcast_pkt(uint8_t *data) +{ + struct adf_mac_addr *mac_addr = (struct adf_mac_addr*)data; + struct adf_mac_addr bcast_addr = VOS_MAC_ADDR_BROADCAST_INITIALIZER; + + if (!memcmp( mac_addr, &bcast_addr, VOS_MAC_ADDR_SIZE)) + return true; + + return false; +} + diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index 860aa7f77d28..d827ac23393c 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -74,6 +74,7 @@ #define ADF_NBUF_TRAC_TCP_TYPE 6 #define ADF_NBUF_TRAC_UDP_TYPE 17 #define ADF_NBUF_TRAC_ICMPv6_TYPE 0x3a +#define ADF_NBUF_TRAC_WAI_ETH_TYPE 0x88b4 /* EAPOL Related MASK */ #define EAPOL_PACKET_TYPE_OFFSET 15 @@ -1829,6 +1830,51 @@ adf_nbuf_update_skb_mark(adf_nbuf_t skb, uint32_t mask) __adf_nbuf_update_skb_mark(skb, mask); } +/** + * adf_nbuf_is_wai() - Check if frame is WAI + * @skb: Pointer to skb + * + * This function checks if the frame is WAPI. + * + * Return: true (1) if WAPI + * + */ +static inline bool adf_nbuf_is_wai_pkt(struct sk_buff *skb) +{ + return __adf_nbuf_is_wai_pkt(skb->data); +} + +/** + * adf_nbuf_is_multicast_pkt() - Check if frame is multicast packet + * @skb: Pointer to skb + * + * This function checks if the frame is multicast packet. + * + * Return: true (1) if multicast + * + */ +static inline bool adf_nbuf_is_multicast_pkt(struct sk_buff *skb) +{ + return __adf_nbuf_is_multicast_pkt(skb->data); +} + +/** + * adf_nbuf_is_bcast_pkt() - Check if frame is broadcast packet + * @skb: Pointer to skb + * + * This function checks if the frame is broadcast packet. + * + * Return: true (1) if broadcast + * + */ +static inline bool adf_nbuf_is_bcast_pkt(struct sk_buff *skb) +{ + return __adf_nbuf_is_bcast_pkt(skb->data); +} + + + + void adf_nbuf_set_state(adf_nbuf_t nbuf, uint8_t current_state); void adf_nbuf_tx_desc_count_display(void); void adf_nbuf_tx_desc_count_clear(void); diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.c b/CORE/SERVICES/COMMON/adf/adf_trace.c index 0a4fddb95ff3..7720aa6fdc2d 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.c +++ b/CORE/SERVICES/COMMON/adf/adf_trace.c @@ -436,7 +436,7 @@ bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, enum adf_proto_subtype subtype; if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_EAPOL) && - adf_nbuf_is_eapol_pkt(skb) == A_STATUS_OK) { + ADF_NBUF_GET_IS_EAPOL(skb)) { subtype = adf_nbuf_get_eapol_subtype(skb); DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_EAPOL_PACKET_RECORD, @@ -467,7 +467,7 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, enum adf_proto_subtype subtype = ADF_PROTO_INVALID; if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_DHCP) && - adf_nbuf_is_dhcp_pkt(skb) == A_STATUS_OK) { + ADF_NBUF_GET_IS_DHCP(skb)) { subtype = adf_nbuf_get_dhcp_subtype(skb); DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_DHCP_PACKET_RECORD, @@ -499,7 +499,7 @@ bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, enum adf_proto_subtype proto_subtype; if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_ARP) && - adf_nbuf_is_ipv4_arp_pkt(skb) == true) { + ADF_NBUF_GET_IS_ARP(skb)) { proto_subtype = adf_nbuf_get_arp_subtype(skb); diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index 70fd459f891b..7230e5f14444 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -153,6 +153,15 @@ struct cvg_nbuf_cb { unsigned char tx_htt2_frm: 1; unsigned char tx_htt2_reserved: 7; #endif /* QCA_TX_HTT2_SUPPORT */ + struct { + uint8_t is_eapol: 1; + uint8_t is_arp: 1; + uint8_t is_dhcp: 1; + uint8_t is_wapi: 1; + uint8_t is_mcast: 1; + uint8_t is_bcast: 1; + uint8_t reserved: 2; + } packet_type; } __packed; #ifdef QCA_ARP_SPOOFING_WAR @@ -224,6 +233,25 @@ struct cvg_nbuf_cb { #define NBUF_SET_PACKET_TRACK(skb, pkt_track) \ (((struct cvg_nbuf_cb *)((skb)->cb))->trace.packet_track = \ pkt_track) +#define ADF_NBUF_SET_EAPOL(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_eapol = \ + true) +#define ADF_NBUF_SET_ARP(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_arp = \ + true) +#define ADF_NBUF_SET_DHCP(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_dhcp = \ + true) +#define ADF_NBUF_SET_WAPI(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_wapi = \ + true) +#define ADF_NBUF_SET_MCAST(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_mcast = \ + true) +#define ADF_NBUF_SET_BCAST(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_bcast = \ + true) + #define NBUF_GET_PACKET_TRACK(skb) \ (((struct cvg_nbuf_cb *)((skb)->cb))->trace.packet_track) @@ -233,6 +261,26 @@ struct cvg_nbuf_cb { #define ADF_NBUF_CB_TX_DP_TRACE(skb) \ (((struct cvg_nbuf_cb *)((skb)->cb))->trace.dp_trace) +#define ADF_NBUF_GET_IS_EAPOL(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_eapol) + +#define ADF_NBUF_GET_IS_ARP(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_arp) + +#define ADF_NBUF_GET_IS_DHCP(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_dhcp) + +#define ADF_NBUF_GET_IS_WAPI(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_wapi) + +#define ADF_NBUF_GET_IS_BCAST(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_bcast) + +#define ADF_NBUF_GET_IS_MCAST(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->packet_type.is_mcast) + + + #define __adf_nbuf_get_num_frags(skb) \ /* assume the OS provides a single fragment */ \ (NBUF_NUM_EXTRA_FRAGS(skb) + 1) @@ -356,6 +404,9 @@ enum adf_proto_subtype __adf_nbuf_data_get_eapol_subtype(uint8_t *data); enum adf_proto_subtype __adf_nbuf_data_get_arp_subtype(uint8_t *data); enum adf_proto_subtype __adf_nbuf_data_get_icmp_subtype(uint8_t *data); enum adf_proto_subtype __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data); +bool __adf_nbuf_is_bcast_pkt(uint8_t *data); +bool __adf_nbuf_is_multicast_pkt(uint8_t *data); +bool __adf_nbuf_is_wai_pkt(uint8_t *data); #ifdef QCA_PKT_PROTO_TRACE diff --git a/CORE/SERVICES/COMMON/wmi_services.h b/CORE/SERVICES/COMMON/wmi_services.h index 37dc6f93eb1c..d88b4e797ffb 100644 --- a/CORE/SERVICES/COMMON/wmi_services.h +++ b/CORE/SERVICES/COMMON/wmi_services.h @@ -166,6 +166,24 @@ typedef enum { * the host from suspend */ WMI_SERVICE_MARK_FIRST_WAKEUP_PACKET, + /* FW supports command that can add/delete multiple mcast filters */ + WMI_SERVICE_MULTIPLE_MCAST_FILTER_SET, + /* WMI_SERVICE_HOST_MANAGED_RX_REORDER - + * FW supports host-managed RX reorder. + * Host managed RX reorder involves RX BA state machine handling + * on peer/TID basis, REO configuration for HW based reordering/PN + * check and processing reorder exceptions generated by HW. + */ + WMI_SERVICE_HOST_MANAGED_RX_REORDER, + /* Specify whether the target supports the following WMI messages + * for reading / writing its flash memory: + * WMI_READ_DATA_FROM_FLASH_CMDID, + * WMI_READ_DATA_FROM_FLASH_EVENTID, + * WMI_TRANSFER_DATA_TO_FLASH_CMDID, + * WMI_TRANSFER_DATA_TO_FLASH_COMPLETE_EVENTID, + */ + WMI_SERVICE_FLASH_RDWR_SUPPORT, + WMI_MAX_SERVICE=128 /* max service */ } WMI_SERVICE; diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h index 640244e4d260..566e1c68baff 100644 --- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h +++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h @@ -714,6 +714,14 @@ typedef enum { WMITLV_TAG_STRUC_wmi_p2p_lo_start_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_p2p_lo_stop_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_p2p_lo_stopped_event_fixed_param, + WMITLV_TAG_STRUC_wmi_peer_reorder_queue_setup_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_peer_reorder_queue_remove_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_set_multiple_mcast_filter_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_mgmt_tx_compl_bundle_event_fixed_param, + WMITLV_TAG_STRUC_wmi_read_data_from_flash_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_read_data_from_flash_event_fixed_param, + WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param, } WMITLV_TAG_ID; /* @@ -1003,6 +1011,12 @@ typedef enum { OP(WMI_DBGLOG_TIME_STAMP_SYNC_CMDID) \ OP(WMI_P2P_LISTEN_OFFLOAD_START_CMDID) \ OP(WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID) \ + OP(WMI_PEER_REORDER_QUEUE_SETUP_CMDID) \ + OP(WMI_PEER_REORDER_QUEUE_REMOVE_CMDID) \ + OP(WMI_SET_MULTIPLE_MCAST_FILTER_CMDID) \ + OP(WMI_READ_DATA_FROM_FLASH_CMDID) \ + OP(WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID) \ + OP(WMI_PEER_SET_RX_BLOCKSIZE_CMDID) \ /* add new CMD_LIST elements above this line */ /* @@ -1154,6 +1168,8 @@ typedef enum { OP(WMI_PDEV_SET_MAC_CONFIG_RESP_EVENTID) \ OP(WMI_RADIO_TX_POWER_LEVEL_STATS_EVENTID) \ OP(WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID) \ + OP(WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID) \ + OP(WMI_READ_DATA_FROM_FLASH_EVENTID) \ /* add new EVT_LIST elements above this line */ @@ -1163,7 +1179,8 @@ typedef enum { #define WMITLV_TABLE_WMI_INIT_CMDID(id,op,buf,len)\ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_init_cmd_fixed_param, wmi_init_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX)\ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_resource_config, wmi_resource_config, resource_config, WMITLV_SIZE_FIX)\ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wlan_host_memory_chunk, host_mem_chunks, WMITLV_SIZE_VAR) + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wlan_host_memory_chunk, host_mem_chunks, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_set_hw_mode_cmd_fixed_param, wmi_pdev_set_hw_mode_cmd_fixed_param, hw_mode, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_INIT_CMDID); @@ -1651,13 +1668,13 @@ WMITLV_CREATE_PARAM_STRUC(WMI_RTT_MEASREQ_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_RTT_TSF_CMDID); -/*RTT OEM req Cmd - DEPRECATED */ +/* RTT OEM req Cmd */ #define WMITLV_TABLE_WMI_OEM_REQ_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_OEM_REQ_CMDID); -/* RTT OEM request Cmd */ +/* RTT OEM request Cmd - DEPRECATED */ #define WMITLV_TABLE_WMI_OEM_REQUEST_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) @@ -1801,6 +1818,12 @@ WMITLV_CREATE_PARAM_STRUC(WMI_FORCE_FW_HANG_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param, WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_SET_MCASTBCAST_FILTER_CMDID); +/* Enhanced Mcast add/delete filter list cmd */ +#define WMITLV_TABLE_WMI_SET_MULTIPLE_MCAST_FILTER_CMDID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_set_multiple_mcast_filter_cmd_fixed_param, WMI_SET_MULTIPLE_MCAST_FILTER_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_FIXED_STRUC, wmi_mac_addr, mcast_list, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_SET_MULTIPLE_MCAST_FILTER_CMDID); + /* Set dbglog time stamp sync cmd */ #define WMITLV_TABLE_WMI_DBGLOG_TIME_STAMP_SYNC_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_dbglog_time_stamp_sync_cmd_fixed_param, WMI_DBGLOG_TIME_STAMP_SYNC_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) @@ -2698,6 +2721,10 @@ WMITLV_CREATE_PARAM_STRUC(WMI_LRO_CONFIG_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_TRANSFER_DATA_TO_FLASH_CMDID); +#define WMITLV_TABLE_WMI_READ_DATA_FROM_FLASH_CMDID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_read_data_from_flash_cmd_fixed_param, wmi_read_data_from_flash_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_READ_DATA_FROM_FLASH_CMDID); + #define WMITLV_TABLE_WMI_CONFIG_ENHANCED_MCAST_FILTER_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_config_enhanced_mcast_filter_fixed_param, wmi_config_enhanced_mcast_filter_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_CONFIG_ENHANCED_MCAST_FILTER_CMDID); @@ -2876,12 +2903,33 @@ WMITLV_CREATE_PARAM_STRUC(WMI_SET_PERIODIC_CHANNEL_STATS_CONFIG_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, args, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_WAL_POWER_DEBUG_CMDID); +/* pdev set reorder timeout val */ +#define WMITLV_TABLE_WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param, wmi_pdev_set_reorder_timeout_val_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID); + +/* peer set rx blocksize cmd */ +#define WMITLV_TABLE_WMI_PEER_SET_RX_BLOCKSIZE_CMDID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param, wmi_peer_set_rx_blocksize_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_PEER_SET_RX_BLOCKSIZE_CMDID); + /* Bandwidth Fairness (BWF) peer configure commands */ #define WMITLV_TABLE_WMI_PEER_BWF_REQUEST_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_bwf_request_fixed_param, wmi_peer_bwf_request_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_bwf_peer_info, peer_info, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_PEER_BWF_REQUEST_CMDID); +/* peer reorder queue setup cmd */ +#define WMITLV_TABLE_WMI_PEER_REORDER_QUEUE_SETUP_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_reorder_queue_setup_cmd_fixed_param, wmi_peer_reorder_queue_setup_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_PEER_REORDER_QUEUE_SETUP_CMDID); + +/* peer reorder queue remove cmd */ +#define WMITLV_TABLE_WMI_PEER_REORDER_QUEUE_REMOVE_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_reorder_queue_remove_cmd_fixed_param, wmi_peer_reorder_queue_remove_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_PEER_REORDER_QUEUE_REMOVE_CMDID); + + /************************** TLV definitions of WMI events *******************************/ /* Service Ready event */ @@ -3004,6 +3052,13 @@ WMITLV_CREATE_PARAM_STRUC(WMI_TX_PAUSE_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_mgmt_tx_compl_event_fixed_param, wmi_mgmt_tx_compl_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_MGMT_TX_COMPLETION_EVENTID); +/* Bundled Mgmt TX completion event */ +#define WMITLV_TABLE_WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_mgmt_tx_compl_bundle_event_fixed_param, wmi_mgmt_tx_compl_bundle_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, desc_ids, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, status, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID); + /* VDEV Start response Event */ #define WMITLV_TABLE_WMI_VDEV_START_RESP_EVENTID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_vdev_start_response_event_fixed_param, wmi_vdev_start_response_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) @@ -3076,7 +3131,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_channel, wmi_channel, chan, WMITLV_SIZE_FIX) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_key_material, key, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, status, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, reassoc_req_frame, WMITLV_SIZE_VAR) + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, reassoc_req_frame, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_hw_mode_transition_event_fixed_param, hw_mode_transition_fixed_param, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_set_hw_mode_response_vdev_mac_entry, wmi_pdev_set_hw_mode_response_vdev_mac_mapping, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_SYNCH_EVENTID); /* WOW Wakeup Host Event */ @@ -3147,6 +3204,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_RSSI_BREACH_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_transfer_data_to_flash_complete_event_fixed_param, wmi_transfer_data_to_flash_complete_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_TRANSFER_DATA_TO_FLASH_COMPLETE_EVENTID); +#define WMITLV_TABLE_WMI_READ_DATA_FROM_FLASH_EVENTID(id, op, buf, len) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_read_data_from_flash_event_fixed_param, wmi_read_data_from_flash_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) +WMITLV_CREATE_PARAM_STRUC(WMI_READ_DATA_FROM_FLASH_EVENTID); + /* Diagnostics Event */ #define WMITLV_TABLE_WMI_DIAG_EVENTID(id,op,buf,len)\ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, bufp, WMITLV_SIZE_VAR) diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h index fcfba3b5de9e..f4294262a7a9 100644 --- a/CORE/SERVICES/COMMON/wmi_unified.h +++ b/CORE/SERVICES/COMMON/wmi_unified.h @@ -343,8 +343,10 @@ typedef enum { WMI_SET_PERIODIC_CHANNEL_STATS_CONFIG_CMDID, /** WMI command for power debug framework */ WMI_PDEV_WAL_POWER_DEBUG_CMDID, + /** set per-AC rx reorder timeouts */ + WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID, - /* VDEV(virtual device) specific commands */ + /* VDEV (virtual device) specific commands */ /** vdev create */ WMI_VDEV_CREATE_CMDID=WMI_CMD_GRP_START_ID(WMI_GRP_VDEV), /** vdev delete */ @@ -436,6 +438,13 @@ typedef enum { WMI_PEER_ATF_REQUEST_CMDID, /** bandwidth fairness (BWF) peer configuration request command */ WMI_PEER_BWF_REQUEST_CMDID, + /** rx reorder queue setup for peer/tid */ + WMI_PEER_REORDER_QUEUE_SETUP_CMDID, + /** rx reorder queue remove for peer/tid */ + WMI_PEER_REORDER_QUEUE_REMOVE_CMDID, + /** specify a limit for rx A-MPDU block size */ + WMI_PEER_SET_RX_BLOCKSIZE_CMDID, + /* beacon/management specific commands */ @@ -770,6 +779,10 @@ typedef enum { WMI_VDEV_WISA_CMDID, /** set debug log time stamp sync up with host */ WMI_DBGLOG_TIME_STAMP_SYNC_CMDID, + /** Command for host to set/delete multiple mcast filters */ + WMI_SET_MULTIPLE_MCAST_FILTER_CMDID, + /** upload a requested section of data from firmware flash to host */ + WMI_READ_DATA_FROM_FLASH_CMDID, /* GPIO Configuration */ WMI_GPIO_CONFIG_CMDID=WMI_CMD_GRP_START_ID(WMI_GRP_GPIO), @@ -1082,6 +1095,9 @@ typedef enum { WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID, /** Event for Mgmt TX completion event */ WMI_MGMT_TX_COMPLETION_EVENTID, + /** Event for Mgmt TX bundle completion event */ + WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID, + /*ADDBA Related WMI Events*/ /** Indication the completion of the prior @@ -1242,6 +1258,9 @@ typedef enum { /** event to report SCPC calibrated data to host */ WMI_PDEV_UTF_SCPC_EVENTID, + /** event to provide requested data from the target's flash memory */ + WMI_READ_DATA_FROM_FLASH_EVENTID, + /* GPIO Event */ WMI_GPIO_INPUT_EVENTID=WMI_EVT_GRP_START_ID(WMI_GRP_GPIO), /** upload H_CV info WMI event @@ -2239,6 +2258,9 @@ typedef struct { #define WMI_RSRC_CFG_FLAG_QWRAP_MODE_ENABLE_S 8 #define WMI_RSRC_CFG_FLAG_QWRAP_MODE_ENABLE_M 0x100 + #define WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_S 9 + #define WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_M 0x200 + A_UINT32 flag1; /** @brief smart_ant_cap - Smart Antenna capabilities information @@ -2343,6 +2365,11 @@ typedef struct { #define WMI_RSRC_CFG_FLAG_QWRAP_MODE_ENABLE_GET(word32) \ WMI_RSRC_CFG_FLAG_GET((word32), QWRAP_MODE_ENABLE) +#define WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_SET(word32, value) \ + WMI_RSRC_CFG_FLAG_SET((word32), MGMT_COMP_EVT_BUNDLE_SUPPORT, (value)) +#define WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_GET(word32) \ + WMI_RSRC_CFG_FLAG_GET((word32), MGMT_COMP_EVT_BUNDLE_SUPPORT) + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_init_cmd_fixed_param */ @@ -2353,9 +2380,17 @@ typedef struct { wmi_abi_version host_abi_vers; A_UINT32 num_host_mem_chunks; /** size of array host_mem_chunks[] */ - /* The TLVs for resource_config and host_mem_chunks[] will follow. + + /* The TLVs for resource_config, host_mem_chunks[], and hw_mode_config + * will follow. * wmi_resource_config resource_config; * wlan_host_memory_chunk host_mem_chunks[]; + * wmi_pdev_set_hw_mode_cmd_fixed_param hw_mode_config; + * Note that the hw_mode_config, in spite of its "pdev" name, + * applies to the entire target rather than for a single pdev + * within the target. + * To avoid specifying a HW mode for the target, the host should + * fill hw_mode_config's fields with 0x0. */ } wmi_init_cmd_fixed_param; @@ -2529,6 +2564,10 @@ typedef struct { /** always do passive scan on passive channels */ #define WMI_SCAN_FLAG_STRICT_PASSIVE_ON_PCHN 0x10000 +/** set HALF (10MHz) rate support */ +#define WMI_SCAN_FLAG_HALF_RATE_SUPPORT 0x20000 +/** set Quarter (5MHz) rate support */ +#define WMI_SCAN_FLAG_QUARTER_RATE_SUPPORT 0x40000 /** for adaptive scan mode using 3 bits (21 - 23 bits) */ #define WMI_SCAN_DWELL_MODE_MASK 0x00E00000 @@ -3551,6 +3590,17 @@ typedef enum { WMI_PDEV_PARAM_CUST_TXPOWER_SCALE, /** ATF enabe/disabe dynamically */ WMI_PDEV_PARAM_ATF_DYNAMIC_ENABLE, + /** Set tx retry limit for control frames. 0 = disable, 31 = max */ + WMI_PDEV_PARAM_CTRL_RETRY_LIMIT, + /** Set propagation delay for 2G / 5G band. + * The propagation delay is fundamentally a per-peer property, but + * the target may not support per-peer settings for ack timeouts. + * This pdev parameter allows the MAC-level ack timeout to be set to + * a value suitable for the worst-case propagation delay of any peer + * within that pdev. + * Units are microseconds. + */ + WMI_PDEV_PARAM_PROPAGATION_DELAY, } WMI_PDEV_PARAM; @@ -3718,6 +3768,15 @@ typedef struct { A_UINT32 status; /* WMI_MGMT_TX_COMP_STATUS_TYPE */ } wmi_mgmt_tx_compl_event_fixed_param; +typedef struct { + A_UINT32 tlv_header; + A_UINT32 num_reports; + /* tlv for completion + * A_UINT32 desc_ids[num_reports]; <- from tx_send_cmd + * A_UINT32 status[num_reports]; <- WMI_MGMT_TX_COMP_STATUS_TYPE + */ +} wmi_mgmt_tx_compl_bundle_event_fixed_param; + #define WMI_TPC_RATE_MAX 160 /* WMI_TPC_TX_NUM_CHAIN macro can't be changed without breaking the WMI compatibility */ #define WMI_TPC_TX_NUM_CHAIN 4 @@ -6219,6 +6278,23 @@ typedef struct { wmi_mac_addr peer_macaddr; } wmi_peer_delete_cmd_fixed_param; +typedef struct { + /** + * TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param + */ + A_UINT32 tlv_header; + /** unique id identifying the VDEV, generated by the caller */ + A_UINT32 vdev_id; + /** peer MAC address */ + wmi_mac_addr peer_macaddr; + /** + * maximum block ack window size to use during a rx block ack negotiation, + * i.e. the maximum number of MPDUs per A-MPDU that will be received + */ + A_UINT32 rx_block_ack_win_limit; +} wmi_peer_set_rx_blocksize_cmd_fixed_param; + typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_peer_flush_tids_cmd_fixed_param */ /** unique id identifying the VDEV, generated by the caller */ @@ -6453,6 +6529,14 @@ typedef struct { #define WMI_PEER_SET_MAX_TX_RATE 0x11 /** Set peer minimal tx rate (MCS) in adaptive rate ctrl */ #define WMI_PEER_SET_MIN_TX_RATE 0x12 +/** + * default ring routing for peer data packets, + * param_value = bit 0 for hash based routing enabled or not + * (value 1 is enabled, value 0 is disabled) + * bits 1:5 are for ring 32 (i.e. ring id value + * selected from 0 to 31 values) + */ +#define WMI_PEER_SET_DEFAULT_ROUTING 0x13 /** mimo ps values for the parameter WMI_PEER_MIMO_PS_STATE */ #define WMI_PEER_MIMO_PS_NONE 0x0 @@ -7410,7 +7494,9 @@ typedef struct{ #define WMI_ROAM_INVOKE_FLAG_ADD_CH_TO_CACHE 0 /* indicate to host of failure if WMI_ROAM_INVOKE_CMDID. */ #define WMI_ROAM_INVOKE_FLAG_REPORT_FAILURE 1 -/* from bit 2 to bit 31 are reserved */ +/* during host-invoked roaming, don't send null data frame to AP */ +#define WMI_ROAM_INVOKE_FLAG_NO_NULL_FRAME_TO_AP 2 +/* from bit 3 to bit 31 are reserved */ #define WMI_SET_ROAM_INVOKE_ADD_CH_TO_CACHE(flag) do { \ (flag) |= (1 << WMI_SET_ROAM_INVOKE_ADD_CH_TO_CACHE); \ @@ -9207,8 +9293,12 @@ typedef struct { A_UINT32 type; /*0:unused 1: ASSERT, 2: not respond detect command,3: simulate ep-full(),4:...*/ A_UINT32 delay_time_ms; /*0xffffffff means the simulate will delay for random time (0 ~0xffffffff ms)*/ }WMI_FORCE_FW_HANG_CMD_fixed_param; -#define WMI_MCAST_FILTER_SET 1 -#define WMI_MCAST_FILTER_DELETE 2 + +typedef enum { + WMI_MCAST_FILTER_SET = 1, + WMI_MCAST_FILTER_DELETE +} WMI_SET_SINGLE_MCAST_FILTER_OP; + typedef struct { A_UINT32 tlv_header; A_UINT32 vdev_id; @@ -9217,6 +9307,28 @@ typedef struct { wmi_mac_addr mcastbdcastaddr; } WMI_SET_MCASTBCAST_FILTER_CMD_fixed_param; +typedef enum { + WMI_MULTIPLE_MCAST_FILTER_CLEAR = 1, /* clear all previous mc list */ + /* clear all previous mc list, and set new list */ + WMI_MULTIPLE_MCAST_FILTER_SET, + WMI_MULTIPLE_MCAST_FILTER_DELETE, /* delete one/multiple mc list */ + WMI_MULTIPLE_MCAST_FILTER_ADD /* add one/multiple mc list */ +} WMI_MULTIPLE_MCAST_FILTER_OP; + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 operation; /* refer WMI_MULTIPLE_MCAST_FILTER_OP */ + /* number of elements in the subsequent mcast addr list */ + A_UINT32 num_mcastaddrs; + /** + * TLV (tag length value) parameters follow the + * structure. The TLV's are: + * wmi_mac_addr mcastaddr_list[num_mcastaddrs]; + */ +} WMI_SET_MULTIPLE_MCAST_FILTER_CMD_fixed_param; + + /* WMI_DBGLOG_TIME_STAMP_SYNC_CMDID */ typedef enum { WMI_TIME_STAMP_SYNC_MODE_MS, /* millisecond units */ @@ -9752,6 +9864,16 @@ enum wmi_tdls_peer_reason { WMI_TDLS_ENTER_BT_BUSY_MODE, /** BT exited busy mode, TDLS connection tracker needs to handle this */ WMI_TDLS_EXIT_BT_BUSY_MODE, + /* + * TDLS module received a scan start event, TDLS connection tracker + * needs to handle this + */ + WMI_TDLS_SCAN_STARTED_EVENT, + /* + * TDLS module received a scan complete event, TDLS connection tracker + * needs to handle this + */ + WMI_TDLS_SCAN_COMPLETED_EVENT, }; /* WMI_TDLS_PEER_EVENTID */ @@ -13744,6 +13866,55 @@ typedef struct { */ } wmi_pdev_hw_mode_transition_event_fixed_param; +/** + * This command is sent from WLAN host driver to firmware for + * plugging in reorder queue desc to lithium hw. + * + * Example: plug-in queue desc for TID 5 + * host->target: WMI_PEER_REORDER_QUEUE_SETUP_CMDID, + * (vdev_id = PEER vdev id, + * peer_macaddr = PEER mac addr, + * tid = 5, + * queue_ptr_lo = queue desc addr lower 32 bits, + * queue_ptr_hi = queue desc addr higher 32 bits, + * queue_no = 16-bit number assigned by host for queue, + * stored in bits 15:0 of queue_no field) + */ +typedef struct { + /* TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_peer_reorder_queue_setup_cmd_fixed_param + */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + wmi_mac_addr peer_macaddr; /* peer mac address */ + A_UINT32 tid; /* 0 to 15 = QoS TIDs, 16 = non-qos TID */ + A_UINT32 queue_ptr_lo; /* lower 32 bits of queue desc adddress */ + A_UINT32 queue_ptr_hi; /* upper 32 bits of queue desc adddress */ + A_UINT32 queue_no; /* 16-bit number assigned by host for queue, + stored in bits 15:0 of queue_no field */ +} wmi_peer_reorder_queue_setup_cmd_fixed_param; + +/** + * This command is sent from WLAN host driver to firmware for + * removing one or more reorder queue desc to lithium hw. + * + * Example: remove queue desc for all TIDs + * host->target: WMI_PEER_REORDER_REMOVE_CMDID, + * (vdev_id = PEER vdev id, + * peer_macaddr = PEER mac addr, + * tid = 0x1FFFF, + */ +typedef struct { + /* TLV tag and len; + * tag equals WMITLV_TAG_STRUC_wmi_peer_reorder_queue_remove_cmd_fixed_param + */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + wmi_mac_addr peer_macaddr; /* peer mac address */ + A_UINT32 tid_mask; /* bits 0 to 15 = QoS TIDs, bit 16 = non-qos TID */ +} wmi_peer_reorder_queue_remove_cmd_fixed_param; + + /* DEPRECATED - use wmi_pdev_set_mac_config_response_event_fixed_param instead */ typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_soc_set_dual_mac_config_response_event_fixed_param */ @@ -14166,10 +14337,6 @@ typedef struct { A_UINT32 toeplitz_hash_ipv6_40; } wmi_lro_info_cmd_fixed_param; -/* - * This structure is used to set the pattern for WOW host wakeup pin pulse - * pattern confirguration. - */ typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_transfer_data_to_flash_cmd_fixed_param */ A_UINT32 offset; /* flash offset to write, starting from 0 */ @@ -14182,6 +14349,25 @@ typedef struct { A_UINT32 status; } wmi_transfer_data_to_flash_complete_event_fixed_param; +typedef struct { + /* TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_read_data_from_flash_cmd_fixed_param + */ + A_UINT32 tlv_header; + A_UINT32 offset; /* flash offset to read, starting from 0 */ + A_UINT32 length; /* data length to read, unit: byte */ +} wmi_read_data_from_flash_cmd_fixed_param; + +typedef struct { + /* TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_read_data_from_flash_event_fixed_param + */ + A_UINT32 tlv_header; + A_UINT32 status; /* Return status. 0 for success, non-zero otherwise */ + A_UINT32 offset; /* flash offset reading from, starting from 0 */ + A_UINT32 length; /* length of data being reported, unit: byte */ +} wmi_read_data_from_flash_event_fixed_param; + typedef enum { ENHANCED_MCAST_FILTER_DISABLED, ENHANCED_MCAST_FILTER_ENABLED @@ -14816,6 +15002,27 @@ typedef struct { **/ } wmi_pdev_wal_power_debug_cmd_fixed_param; +typedef struct { + /** + * TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param + */ + A_UINT32 tlv_header; + /** + * @brief rx_timeout_pri - what rx reorder timeout (ms) to use for the AC + * @details + * Each WMM access category (voice, video, best-effort, background) + * will have its own timeout value to dictate how long to wait for + * missing rx MPDUs to arrive before releasing subsequent MPDUs that + * have already been received. + * This parameter specifies the timeout in milliseconds for each + * access category. + * The array elements are indexed by the WMI_AC enum to identify + * which array element corresponds to which AC / traffic type. + */ + A_UINT32 rx_timeout_pri[WMI_AC_MAX]; +} wmi_pdev_set_reorder_timeout_val_cmd_fixed_param; + typedef enum { WLAN_2G_CAPABILITY = 0x1, WLAN_5G_CAPABILITY = 0x2, diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h index f2e272c931e4..1997bd36481e 100644 --- a/CORE/SERVICES/COMMON/wmi_version.h +++ b/CORE/SERVICES/COMMON/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 260 +#define __WMI_REVISION_ 271 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work diff --git a/CORE/SERVICES/DFS/src/dfs.c b/CORE/SERVICES/DFS/src/dfs.c index 04cafdd2cccc..5a918ff6660a 100644 --- a/CORE/SERVICES/DFS/src/dfs.c +++ b/CORE/SERVICES/DFS/src/dfs.c @@ -260,6 +260,24 @@ error: return status; } +/** + * dfs_free_filter() - free memory allocated for dfs ft_filters + * @radarf: pointer holding ft_filters + * + * Return: NA +*/ +static void dfs_free_filter(struct dfs_filtertype *radarf) +{ + int i; + + for (i = 0; i < DFS_MAX_NUM_RADAR_FILTERS; i++) { + if (radarf->ft_filters[i]) { + vos_mem_free(radarf->ft_filters[i]); + radarf->ft_filters[i] = NULL; + } + } +} + int dfs_attach(struct ieee80211com *ic) { @@ -417,6 +435,7 @@ bad2: bad1: for (n=0; n<DFS_MAX_RADAR_TYPES; n++) { if (dfs->dfs_radarf[n] != NULL) { + dfs_free_filter(dfs->dfs_radarf[n]); OS_FREE(dfs->dfs_radarf[n]); dfs->dfs_radarf[n] = NULL; } @@ -438,24 +457,6 @@ bad1: #undef N } -/** - * dfs_free_filter() - free memory allocated for dfs ft_filters - * @radarf: pointer holding ft_filters - * - * Return: NA -*/ -static void dfs_free_filter(struct dfs_filtertype *radarf) -{ - int i; - - for (i = 0; i < DFS_MAX_NUM_RADAR_FILTERS; i++) { - if (radarf->ft_filters[i]) { - vos_mem_free(radarf->ft_filters[i]); - radarf->ft_filters[i] = NULL; - } - } -} - void dfs_detach(struct ieee80211com *ic) { diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index c2b093cdbdb9..af339871abad 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -1287,7 +1287,9 @@ static int __hif_pci_runtime_resume(struct pci_dev *pdev) out: /* In Resume we should never fail */ hif_pci_runtime_pm_warn(sc, "Runtime Resume Failed"); - VOS_BUG(0); + /* skip VOS_BUG if SSR is already in progress */ + if (!vos_is_logp_in_progress(VOS_MODULE_ID_HIF, NULL)) + VOS_BUG(0); return ret; } diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 1886c09950a7..56509bc5d48b 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -221,6 +221,7 @@ static int wma_nlo_scan_cmp_evt_handler(void *handle, u_int8_t *event, u_int32_t len); #endif +static enum powersave_qpower_mode wma_get_qpower_config(tp_wma_handle wma); #ifdef FEATURE_WLAN_EXTSCAN /** * enum extscan_report_events_type - extscan report events type @@ -12340,6 +12341,40 @@ VOS_STATUS wma_switch_channel(tp_wma_handle wma, struct wma_vdev_start_req *req) return VOS_STATUS_SUCCESS; } + +uint32_t wma_get_bcn_rate_code(uint16_t rate) +{ + /* rate in multiples of 100 Kbps */ + switch (rate) { + case WMA_BEACON_TX_RATE_1_M: + return WMA_BEACON_TX_RATE_HW_CODE_1_M; + case WMA_BEACON_TX_RATE_2_M: + return WMA_BEACON_TX_RATE_HW_CODE_2_M; + case WMA_BEACON_TX_RATE_5_5_M: + return WMA_BEACON_TX_RATE_HW_CODE_5_5_M; + case WMA_BEACON_TX_RATE_11_M: + return WMA_BEACON_TX_RATE_HW_CODE_11M; + case WMA_BEACON_TX_RATE_6_M: + return WMA_BEACON_TX_RATE_HW_CODE_6_M; + case WMA_BEACON_TX_RATE_9_M: + return WMA_BEACON_TX_RATE_HW_CODE_9_M; + case WMA_BEACON_TX_RATE_12_M: + return WMA_BEACON_TX_RATE_HW_CODE_12_M; + case WMA_BEACON_TX_RATE_18_M: + return WMA_BEACON_TX_RATE_HW_CODE_18_M; + case WMA_BEACON_TX_RATE_24_M: + return WMA_BEACON_TX_RATE_HW_CODE_24_M; + case WMA_BEACON_TX_RATE_36_M: + return WMA_BEACON_TX_RATE_HW_CODE_36_M; + case WMA_BEACON_TX_RATE_48_M: + return WMA_BEACON_TX_RATE_HW_CODE_48_M; + case WMA_BEACON_TX_RATE_54_M: + return WMA_BEACON_TX_RATE_HW_CODE_54_M; + default: + return WMA_BEACON_TX_RATE_HW_CODE_1_M; + } +} + VOS_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req, v_BOOL_t isRestart) { @@ -12511,11 +12546,15 @@ VOS_STATUS wma_vdev_start(tp_wma_handle wma, cmd->beacon_interval = req->beacon_intval; cmd->dtim_period = req->dtim_period; + cmd->flags &= ~WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT; if (req->beacon_tx_rate) { - WMA_LOGI("%s[%d]: beacon_tx_rate present [%hu]", - __func__, __LINE__, req->beacon_tx_rate); + WMA_LOGI("%s: beacon_tx_rate present. beacon tx rate [%hu * 100 Kbps]", + __func__, req->beacon_tx_rate); cmd->flags |= WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT; - cmd->bcn_tx_rate = req->beacon_tx_rate; + /* beacon_tx_rate is in multiples of 100 Kbps. Convert the + * data rate to hw rate code */ + cmd->bcn_tx_rate = wma_get_bcn_rate_code(req->beacon_tx_rate); + WMA_LOGI("bcn rate code %02x", cmd->bcn_tx_rate); } /* FIXME: Find out min, max and regulatory power levels */ @@ -19199,6 +19238,7 @@ int32_t wma_set_qpower_force_sleep(tp_wma_handle wma, u_int32_t vdev_id, (struct sAniSirGlobal*)vos_get_context(VOS_MODULE_ID_PE, wma->vos_context); u_int32_t pspoll_count = WMA_DEFAULT_MAX_PSPOLL_BEFORE_WAKE; + enum powersave_qpower_mode qpower_config = wma_get_qpower_config(wma); WMA_LOGE("Set QPower Force(1)/Normal(0) Sleep vdevId %d val %d", vdev_id, enable); @@ -19218,15 +19258,17 @@ int32_t wma_set_qpower_force_sleep(tp_wma_handle wma, u_int32_t vdev_id, pspoll_count = (u_int32_t)cfg_data_val; } - /* Enable QPower */ - ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, - WMI_STA_PS_ENABLE_QPOWER, 1); + if (qpower_config) { + /* Enable QPower */ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_ENABLE_QPOWER, qpower_config); - if (ret) { - WMA_LOGE("Enable QPower Failed vdevId %d", vdev_id); - return ret; + if (ret) { + WMA_LOGE("Enable QPower Failed vdevId %d", vdev_id); + return ret; + } + WMA_LOGD("QPower Enabled vdevId %d", vdev_id); } - WMA_LOGD("QPower Enabled vdevId %d", vdev_id); /* Set the Wake Policy to WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD*/ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, @@ -21153,7 +21195,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, uint16_t pkt_len, key_len, seq_num; uint32_t transaction_id, tcp_seq_num; - WMA_LOGD("wow_buf_pkt_len: %d", buf_len); + WMA_LOGD("wow_buf_pkt_len: %u", buf_len); if (buf_len >= ADF_NBUF_TRAC_ETH_TYPE_OFFSET) WMA_LOGE("Src_mac: " MAC_ADDRESS_STR " Dst_mac: " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(data + ADF_NBUF_SRC_MAC_OFFSET), @@ -21174,7 +21216,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, EAPOL_PKT_LEN_OFFSET)); key_len = (uint16_t)(*(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET)); - WMA_LOGE("Pkt_len: %d, Key_len: %d", + WMA_LOGE("Pkt_len: %u, Key_len: %u", adf_os_cpu_to_be16(pkt_len), adf_os_cpu_to_be16(key_len)); } @@ -21195,7 +21237,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, DHCP_PKT_LEN_OFFSET)); transaction_id = (uint32_t)(*(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET)); - WMA_LOGE("Pkt_len: %d, Transaction_id: %d", + WMA_LOGE("Pkt_len: %u, Transaction_id: %u", adf_os_cpu_to_be16(pkt_len), adf_os_cpu_to_be32(transaction_id)); } @@ -21216,7 +21258,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, IPV4_PKT_LEN_OFFSET)); seq_num = (uint16_t)(*(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET)); - WMA_LOGE("Pkt_len: %d, Seq_num: %d", + WMA_LOGE("Pkt_len: %u, Seq_num: %u", adf_os_cpu_to_be16(pkt_len), adf_os_cpu_to_be16(seq_num)); } @@ -21231,7 +21273,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, IPV6_PKT_LEN_OFFSET)); seq_num = (uint16_t)(*(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET)); - WMA_LOGE("Pkt_len: %d, Seq_num: %d", + WMA_LOGE("Pkt_len: %u, Seq_num: %u", adf_os_cpu_to_be16(pkt_len), adf_os_cpu_to_be16(seq_num)); } @@ -21244,12 +21286,12 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, if (buf_len >= WMA_IPV4_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV4_PKT_LEN_OFFSET)); - WMA_LOGE("Pkt_len: %d", + WMA_LOGE("Pkt_len: %u", adf_os_cpu_to_be16(pkt_len)); if (proto_subtype == ADF_PROTO_IPV4_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET)); - WMA_LOGE("TCP_seq_num: %d", + WMA_LOGE("TCP_seq_num: %u", adf_os_cpu_to_be32(tcp_seq_num)); } } @@ -21262,12 +21304,12 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, if (buf_len >= WMA_IPV6_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV6_PKT_LEN_OFFSET)); - WMA_LOGE("Pkt_len: %d", + WMA_LOGE("Pkt_len: %u", adf_os_cpu_to_be16(pkt_len)); if (proto_subtype == ADF_PROTO_IPV6_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET)); - WMA_LOGE("TCP_seq_num: %d", + WMA_LOGE("TCP_seq_num: %u", adf_os_cpu_to_be32(tcp_seq_num)); } } @@ -21275,7 +21317,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, default: end: - WMA_LOGE("wow_buf_pkt_len: %d", buf_len); + WMA_LOGE("wow_buf_pkt_len: %u", buf_len); WMA_LOGE("Invalid Packet Type or Smaller WOW packet buffer than expected"); break; } @@ -21298,7 +21340,7 @@ static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer, { struct ieee80211_frame_addr4 *wh; - WMA_LOGD("wow_buf_pkt_len: %d", buf_len); + WMA_LOGD("wow_buf_pkt_len: %u", buf_len); wh = (struct ieee80211_frame_addr4 *) (wow_packet_buffer + 4); if (buf_len >= sizeof(struct ieee80211_frame)) { @@ -21309,7 +21351,7 @@ static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer, MAC_ADDR_ARRAY(wh->i_addr1), MAC_ADDR_ARRAY(wh->i_addr2)); - WMA_LOGE("TO_DS: %d, FROM_DS: %d", + WMA_LOGE("TO_DS: %u, FROM_DS: %u", wh->i_fc[1] & IEEE80211_FC1_DIR_TODS, wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS); @@ -21344,7 +21386,7 @@ static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer, IEEE80211_SEQ_FRAG_MASK) >> IEEE80211_SEQ_FRAG_SHIFT); - WMA_LOGE("SEQ_NUM: %d, FRAG_NUM: %d", + WMA_LOGE("SEQ_NUM: %u, FRAG_NUM: %u", seq_num, frag_num); } else { WMA_LOGE("Insufficient buffer length for mgmt. packet"); @@ -30160,6 +30202,174 @@ void wma_process_set_allowed_action_frames_ind(tp_wma_handle wma_handle, return; } +/** + * wma_update_tx_fail_cnt_th() - Set threshold for TX pkt fail + * @wma_handle: WMA handle + * @tx_fail_cnt_th: sme_tx_fail_cnt_threshold parameter + * + * This function is used to set Tx pkt fail count threshold, + * FW will do disconnect with station once this threshold is reached. + * + * Return: VOS_STATUS_SUCCESS on success, error number otherwise + */ +static VOS_STATUS wma_update_tx_fail_cnt_th(tp_wma_handle wma, + struct sme_tx_fail_cnt_threshold *tx_fail_cnt_th) +{ + u_int8_t vdev_id; + u_int32_t tx_fail_disconn_th; + int ret = -EIO; + + if (!wma || !wma->wmi_handle) { + WMA_LOGE(FL("WMA is closed, can not issue Tx pkt fail count threshold")); + return VOS_STATUS_E_INVAL; + } + vdev_id = tx_fail_cnt_th->session_id; + tx_fail_disconn_th = tx_fail_cnt_th->tx_fail_cnt_threshold; + WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d", + vdev_id, tx_fail_disconn_th); + + + ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_DISCONNECT_TH, + tx_fail_disconn_th); + + if (ret) { + WMA_LOGE(FL("Failed to send TX pkt fail count threshold command")); + return VOS_STATUS_E_FAILURE; + } + + return VOS_STATUS_SUCCESS; +} + +/** + * wma_update_short_retry_limit() - Set retry limit for short frames + * @wma_handle: WMA handle + * @short_retry_limit_th: retry limir count for Short frames. + * + * This function is used to configure the transmission retry limit at which + * short frames needs to be retry. + * + * Return: VOS_STATUS_SUCCESS on success, error number otherwise + */ +static VOS_STATUS wma_update_short_retry_limit(tp_wma_handle wma, + struct sme_short_retry_limit *short_retry_limit_th) +{ + u_int8_t vdev_id; + u_int32_t short_retry_limit; + int ret = -EIO; + + if (!wma || !wma->wmi_handle) { + WMA_LOGE(FL("WMA is closed, can not issue short retry limit threshold")); + return VOS_STATUS_E_INVAL; + } + vdev_id = short_retry_limit_th->session_id; + short_retry_limit = short_retry_limit_th->short_retry_limit; + WMA_LOGD("Set short retry limit threshold vdevId %d count %d", + vdev_id, short_retry_limit); + + + ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH , + short_retry_limit); + + if (ret) { + WMA_LOGE(FL("Failed to send short limit threshold command")); + return VOS_STATUS_E_FAILURE; + } + + return VOS_STATUS_SUCCESS; +} + +/** + * wma_update_long_retry_limit() - Set retry limit for long frames + * @wma_handle: WMA handle + * @long_retry_limit_th: retry limir count for long frames + * + * This function is used to configure the transmission retry limit at which + * long frames needs to be retry + * + * Return: VOS_STATUS_SUCCESS on success, error number otherwise + */ +static VOS_STATUS wma_update_long_retry_limit(tp_wma_handle wma, + struct sme_long_retry_limit *long_retry_limit_th) +{ + u_int8_t vdev_id; + u_int32_t long_retry_limit; + int ret = -EIO; + + if (!wma || !wma->wmi_handle) { + WMA_LOGE(FL("WMA is closed, can not issue long retry limit threshold")); + return VOS_STATUS_E_INVAL; + } + vdev_id = long_retry_limit_th->session_id; + long_retry_limit = long_retry_limit_th->long_retry_limit; + WMA_LOGD("Set TX pkt fail count threshold vdevId %d count %d", + vdev_id, long_retry_limit); + + ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_AGG_SW_RETRY_TH, + long_retry_limit); + + if (ret) { + WMA_LOGE(FL("Failed to send long limit threshold command")); + return VOS_STATUS_E_FAILURE; + } + + return VOS_STATUS_SUCCESS; +} + +/* + * wma_update_sta_inactivity_timeout() - Set sta_inactivity_timeout to fw + * @wma_handle: WMA handle + * @sta_inactivity_timer: sme_sta_inactivity_timeout + * + * This function is used to set sta_inactivity_timeout. + * If a station does not send anything in sta_inactivity_timeout seconds, an + * empty data frame is sent to it in order to verify whether it is + * still in range. If this frame is not ACKed, the station will be + * disassociated and then deauthenticated. + * + * Return: None + */ +static void wma_update_sta_inactivity_timeout(tp_wma_handle wma, + struct sme_sta_inactivity_timeout *sta_inactivity_timer) +{ + u_int8_t vdev_id; + u_int32_t max_unresponsive_time; + u_int32_t min_inactive_time, max_inactive_time; + + if (!wma || !wma->wmi_handle) { + WMA_LOGE(FL("WMA is closed, can not issue sta_inactivity_timeout")); + return; + } + vdev_id = sta_inactivity_timer->session_id; + max_unresponsive_time = sta_inactivity_timer->sta_inactivity_timeout; + max_inactive_time = max_unresponsive_time* 2/3; + min_inactive_time = max_unresponsive_time - max_inactive_time ; + + if (wmi_unified_vdev_set_param_send(wma->wmi_handle, + vdev_id, + WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, + min_inactive_time)) + WMA_LOGE("Failed to Set AP MIN IDLE INACTIVE TIME"); + + if (wmi_unified_vdev_set_param_send(wma->wmi_handle, + vdev_id, + WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, + max_inactive_time)) + WMA_LOGE("Failed to Set AP MAX IDLE INACTIVE TIME"); + + + if (wmi_unified_vdev_set_param_send(wma->wmi_handle, + vdev_id, + WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, + max_unresponsive_time)) + WMA_LOGE("%s:vdev_id:%d min_inactive_time: %u max_inactive_time: %u" + " max_unresponsive_time: %u", __func__, vdev_id, + min_inactive_time, max_inactive_time, max_unresponsive_time); + + return; +} /* * function : wma_mc_process_msg @@ -31040,6 +31250,23 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) msg->bodyptr); vos_mem_free(msg->bodyptr); break; + case WDA_UPDATE_TX_FAIL_CNT_TH: + wma_update_tx_fail_cnt_th(wma_handle, msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; + case WDA_UPDATE_LONG_RETRY_LIMIT_CNT: + wma_update_long_retry_limit(wma_handle, msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; + case WDA_UPDATE_SHORT_RETRY_LIMIT_CNT: + wma_update_short_retry_limit(wma_handle, msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; + case WDA_UPDATE_STA_INACTIVITY_TIMEOUT: + wma_update_sta_inactivity_timeout(wma_handle, + msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; default: WMA_LOGD("unknow msg type %x", msg->type); /* Do Nothing? MSG Body should be freed at here */ @@ -36534,7 +36761,7 @@ static void wma_set_vdev_resume_dtim(tp_wma_handle wma, v_U8_t vdev_id) ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, WMI_STA_PS_ENABLE_QPOWER, - 1); + qpower_config); if (ret) WMA_LOGE("Failed to enable Qpower in resume mode!"); } diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 990ecf5f4259..5baee7588daf 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -197,6 +197,33 @@ #define WMA_IPV6_PKT_INFO_GET_MIN_LEN 62 #define WMA_ICMPV6_SUBTYPE_GET_MIN_LEN 55 +/* Beacon data rate changes */ +#define WMA_BEACON_TX_RATE_HW_CODE_1_M 0x43 +#define WMA_BEACON_TX_RATE_HW_CODE_2_M 0x42 +#define WMA_BEACON_TX_RATE_HW_CODE_5_5_M 0x41 +#define WMA_BEACON_TX_RATE_HW_CODE_11M 0x40 +#define WMA_BEACON_TX_RATE_HW_CODE_6_M 0x03 +#define WMA_BEACON_TX_RATE_HW_CODE_9_M 0x07 +#define WMA_BEACON_TX_RATE_HW_CODE_12_M 0x02 +#define WMA_BEACON_TX_RATE_HW_CODE_18_M 0x06 +#define WMA_BEACON_TX_RATE_HW_CODE_24_M 0x01 +#define WMA_BEACON_TX_RATE_HW_CODE_36_M 0x05 +#define WMA_BEACON_TX_RATE_HW_CODE_48_M 0x00 +#define WMA_BEACON_TX_RATE_HW_CODE_54_M 0x04 + +#define WMA_BEACON_TX_RATE_1_M 10 +#define WMA_BEACON_TX_RATE_2_M 20 +#define WMA_BEACON_TX_RATE_5_5_M 55 +#define WMA_BEACON_TX_RATE_11_M 110 +#define WMA_BEACON_TX_RATE_6_M 60 +#define WMA_BEACON_TX_RATE_9_M 90 +#define WMA_BEACON_TX_RATE_12_M 120 +#define WMA_BEACON_TX_RATE_18_M 180 +#define WMA_BEACON_TX_RATE_24_M 240 +#define WMA_BEACON_TX_RATE_36_M 360 +#define WMA_BEACON_TX_RATE_48_M 480 +#define WMA_BEACON_TX_RATE_54_M 540 + /* * ds_mode: distribution system mode * @IEEE80211_NO_DS: NO DS at either side @@ -1340,7 +1367,7 @@ struct wma_vdev_start_req { u_int8_t dot11_mode; bool is_half_rate; bool is_quarter_rate; - u_int8_t beacon_tx_rate; + u_int16_t beacon_tx_rate; }; struct wma_set_key_params { diff --git a/CORE/SERVICES/WMI/wmi_unified.c b/CORE/SERVICES/WMI/wmi_unified.c index 2154a8688321..4a75b89c270c 100644 --- a/CORE/SERVICES/WMI/wmi_unified.c +++ b/CORE/SERVICES/WMI/wmi_unified.c @@ -705,6 +705,12 @@ static u_int8_t* get_wmi_cmd_string(WMI_CMD_ID wmi_command) CASE_RETURN_STRING(_place_holder_cmd_1); CASE_RETURN_STRING(WMI_P2P_LISTEN_OFFLOAD_START_CMDID); CASE_RETURN_STRING(WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID); + CASE_RETURN_STRING(WMI_PEER_REORDER_QUEUE_SETUP_CMDID); + CASE_RETURN_STRING(WMI_PEER_REORDER_QUEUE_REMOVE_CMDID); + CASE_RETURN_STRING(WMI_SET_MULTIPLE_MCAST_FILTER_CMDID); + CASE_RETURN_STRING(WMI_READ_DATA_FROM_FLASH_CMDID); + CASE_RETURN_STRING(WMI_PDEV_SET_REORDER_TIMEOUT_VAL_CMDID); + CASE_RETURN_STRING(WMI_PEER_SET_RX_BLOCKSIZE_CMDID); } return "Invalid WMI cmd"; } @@ -716,6 +722,70 @@ inline bool wmi_get_runtime_pm_inprogress(wmi_unified_t wmi_handle) } #endif +static uint16_t wmi_tag_vdev_set_cmd(wmi_unified_t wmi_hdl, wmi_buf_t buf) +{ + wmi_vdev_set_param_cmd_fixed_param *set_cmd; + + set_cmd = (wmi_vdev_set_param_cmd_fixed_param *)wmi_buf_data(buf); + + switch(set_cmd->param_id) { + case WMI_VDEV_PARAM_LISTEN_INTERVAL: + case WMI_VDEV_PARAM_DTIM_POLICY: + return HTC_TX_PACKET_TAG_AUTO_PM; + default: + break; + } + + return 0; +} + +static uint16_t wmi_tag_sta_powersave_cmd(wmi_unified_t wmi_hdl, wmi_buf_t buf) +{ + wmi_sta_powersave_param_cmd_fixed_param *ps_cmd; + + ps_cmd = (wmi_sta_powersave_param_cmd_fixed_param *)wmi_buf_data(buf); + + switch(ps_cmd->param) { + case WMI_STA_PS_ENABLE_QPOWER: + return HTC_TX_PACKET_TAG_AUTO_PM; + default: + break; + } + + return 0; +} + +static uint16_t wmi_tag_common_cmd(wmi_unified_t wmi_hdl, wmi_buf_t buf, + WMI_CMD_ID cmd_id) +{ + tp_wma_handle wma = wmi_hdl->scn_handle; + + if (adf_os_atomic_read(&wma->is_wow_bus_suspended)) + return 0; + + switch(cmd_id) { + case WMI_VDEV_SET_PARAM_CMDID: + return wmi_tag_vdev_set_cmd(wmi_hdl, buf); + case WMI_STA_POWERSAVE_PARAM_CMDID: + return wmi_tag_sta_powersave_cmd(wmi_hdl, buf); + default: + break; + } + + return 0; +} + +static uint16_t wmi_tag_fw_hang_cmd(wmi_unified_t wmi_handle) +{ + uint16_t tag = 0; + + if (wmi_handle->tag_crash_inject) + tag = HTC_TX_PACKET_TAG_AUTO_PM; + + wmi_handle->tag_crash_inject = false; + return tag; +} + /** * wmi_set_htc_tx_tag() - set HTC TX tag for WMI commands * @wmi_handle: WMI handle @@ -729,9 +799,6 @@ static uint16_t wmi_set_htc_tx_tag(wmi_unified_t wmi_handle, WMI_CMD_ID cmd_id) { uint16_t htc_tx_tag = 0; - uint16_t cur_tx_tag = 0; - wmi_vdev_set_param_cmd_fixed_param *set_cmd; - wmi_sta_powersave_param_cmd_fixed_param *ps_cmd; switch(cmd_id) { case WMI_WOW_ENABLE_CMDID: @@ -746,45 +813,17 @@ static uint16_t wmi_set_htc_tx_tag(wmi_unified_t wmi_handle, case WMI_D0_WOW_ENABLE_DISABLE_CMDID: #endif htc_tx_tag = HTC_TX_PACKET_TAG_AUTO_PM; + break; case WMI_FORCE_FW_HANG_CMDID: - if (wmi_handle->tag_crash_inject) { - htc_tx_tag = HTC_TX_PACKET_TAG_AUTO_PM; - wmi_handle->tag_crash_inject = false; - } + htc_tx_tag = wmi_tag_fw_hang_cmd(wmi_handle); + break; + case WMI_VDEV_SET_PARAM_CMDID: + case WMI_STA_POWERSAVE_PARAM_CMDID: + htc_tx_tag = wmi_tag_common_cmd(wmi_handle, buf, cmd_id); default: break; } - if(!adf_os_atomic_read(&wmi_handle->is_target_suspended)) - cur_tx_tag = HTC_TX_PACKET_TAG_AUTO_PM; - - if(cmd_id == WMI_VDEV_SET_PARAM_CMDID) - { - set_cmd = (wmi_vdev_set_param_cmd_fixed_param *) - wmi_buf_data(buf); - - switch(set_cmd->param_id) { - case WMI_VDEV_PARAM_LISTEN_INTERVAL: - case WMI_VDEV_PARAM_DTIM_POLICY: - htc_tx_tag = cur_tx_tag; - default: - break; - } - } - - if(cmd_id == WMI_STA_POWERSAVE_PARAM_CMDID) - { - ps_cmd = (wmi_sta_powersave_param_cmd_fixed_param *) - wmi_buf_data(buf); - - switch(ps_cmd->param) { - case WMI_STA_PS_ENABLE_QPOWER: - htc_tx_tag = cur_tx_tag; - default: - break; - } - } - return htc_tx_tag; } diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h index 06965b4b713c..3f7f473334b2 100644 --- a/CORE/SME/inc/csrApi.h +++ b/CORE/SME/inc/csrApi.h @@ -653,6 +653,8 @@ typedef enum eCSR_ROAM_RESULT_NDP_END_RSP, eCSR_ROAM_RESULT_NDP_PEER_DEPARTED_IND, eCSR_ROAM_RESULT_NDP_END_IND, + /* If Scan for SSID failed to found proper BSS */ + eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE, }eCsrRoamResult; @@ -1015,9 +1017,9 @@ typedef struct tagCsrRoamProfile tSirAddIeParams addIeParams; uint8_t sap_dot11mc; bool do_not_roam; - uint8_t beacon_tx_rate; - tSirMacRateSet supp_rate_set; - tSirMacRateSet extended_rate_set; + uint16_t beacon_tx_rate; + tSirMacRateSet supported_rates; + tSirMacRateSet extended_rates; }tCsrRoamProfile; diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index 57a960ab838d..2c69f5fd8b65 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -387,8 +387,7 @@ typedef struct tagCsrRoamStartBssParams tSirAddIeParams addIeParams; uint8_t sap_dot11mc; - uint8_t beacon_tx_rate; - + uint16_t beacon_tx_rate; }tCsrRoamStartBssParams; @@ -854,6 +853,7 @@ typedef struct tagCsrScanStruct eCsrBand scanBandPreference; //This defines the band perference for scan csrScanCompleteCallback callback11dScanDone; bool fcc_constraint; + bool defer_update_channel_list; }tCsrScanStruct; //Save the connected information. This structure + connectedProfile diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h index 1fd6aa541408..ce3f3ad7d70c 100644 --- a/CORE/SME/inc/sme_Api.h +++ b/CORE/SME/inc/sme_Api.h @@ -4472,7 +4472,8 @@ void sme_add_set_thermal_level_callback(tHalHandle hHal, tSmeSetThermalLevelCallback callback); eHalStatus sme_handle_set_fcc_channel(tHalHandle hHal, - bool fcc_constraint); + bool fcc_constraint, + uint32_t scan_pending); eHalStatus sme_set_rssi_monitoring(tHalHandle hal, struct rssi_monitor_req *input); @@ -4577,12 +4578,25 @@ VOS_STATUS sme_is_session_valid(tHalHandle hal_handle, uint8_t session_id); eHalStatus sme_enable_disable_chanavoidind_event(tHalHandle hHal, tANI_U8 set_value); - +eHalStatus sme_remove_bssid_from_scan_list(tHalHandle hal, + tSirMacAddr bssid); eHalStatus sme_update_sta_roam_policy(tHalHandle hal_handle, enum sta_roam_policy_dfs_mode dfs_mode, bool skip_unsafe_channels, uint8_t session_id); eHalStatus sme_register_p2p_ack_ind_callback(tHalHandle hal, sir_p2p_ack_ind_callback callback); + void sme_set_allowed_action_frames(tHalHandle hal, uint32_t bitmap0); + +eHalStatus sme_update_access_policy_vendor_ie(tHalHandle hal, + uint8_t session_id, uint8_t *vendor_ie, int access_policy); +eHalStatus sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t tx_fail_count); +eHalStatus sme_update_short_retry_limit_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t short_limit_count_th); +eHalStatus sme_update_long_retry_limit_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t long_limit_count_th); +eHalStatus sme_update_sta_inactivity_timeout(tHalHandle hal_handle, + uint8_t session_id, uint32_t sta_inactivity_timeout); #endif //#if !defined( __SME_API_H ) diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index cee45d62034e..6f65413a57e9 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -6970,6 +6970,20 @@ eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, sizeof(tSirAddIeParams)); pDstProfile->beacon_tx_rate = pSrcProfile->beacon_tx_rate; + if (pSrcProfile->supported_rates.numRates) { + vos_mem_copy(pDstProfile->supported_rates.rate, + pSrcProfile->supported_rates.rate, + pSrcProfile->supported_rates.numRates); + pDstProfile->supported_rates.numRates = + pSrcProfile->supported_rates.numRates; + } + if (pSrcProfile->extended_rates.numRates) { + vos_mem_copy(pDstProfile->extended_rates.rate, + pSrcProfile->extended_rates.rate, + pSrcProfile->extended_rates.numRates); + pDstProfile->extended_rates.numRates = + pSrcProfile->extended_rates.numRates; + } }while(0); @@ -12621,23 +12635,30 @@ static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProf pParam->extendedRateSet.numRates = 0; + if (pProfile->supported_rates.numRates) { + pParam->operationalRateSet.numRates = + pProfile->supported_rates.numRates; + vos_mem_copy(pParam->operationalRateSet.rate, + pProfile->supported_rates.rate, + pProfile->supported_rates.numRates); + } + + if (pProfile->extended_rates.numRates) { + pParam->extendedRateSet.numRates = + pProfile->extended_rates.numRates; + vos_mem_copy(pParam->extendedRateSet.rate, + pProfile->extended_rates.rate, + pProfile->extended_rates.numRates); + } + + + switch ( nwType ) { default: smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)"), nwType); case eSIR_11A_NW_TYPE: - pParam->operationalRateSet.numRates = 8; - - pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9; - pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18; - pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36; - pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48; - pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54; - if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel ) { channel = csrRoamGetIbssStartChannelNumber50( pMac ); @@ -12650,11 +12671,6 @@ static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProf //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO nwType = eSIR_11B_NW_TYPE; channel = csrRoamGetIbssStartChannelNumber24( pMac ); - pParam->operationalRateSet.numRates = 4; - pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK; } } else @@ -12664,11 +12680,6 @@ static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProf break; case eSIR_11B_NW_TYPE: - pParam->operationalRateSet.numRates = 4; - pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK; if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel ) { channel = csrRoamGetIbssStartChannelNumber24( pMac ); @@ -12680,42 +12691,6 @@ static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProf break; case eSIR_11G_NW_TYPE: - /* For P2P Client and P2P GO, disable 11b rates */ - if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) || - (pProfile->csrPersona == VOS_P2P_GO_MODE) || - (eCSR_CFG_DOT11_MODE_11G_ONLY == pParam->uCfgDot11Mode) - ) - { - pParam->operationalRateSet.numRates = 8; - - pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9; - pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18; - pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36; - pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48; - pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54; - } - else - { - pParam->operationalRateSet.numRates = 4; - pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK; - pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK; - - pParam->extendedRateSet.numRates = 8; - pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6; - pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9; - pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12; - pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18; - pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24; - pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36; - pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48; - pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54; - } - if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel ) { channel = csrRoamGetIbssStartChannelNumber24( pMac ); @@ -15388,7 +15363,9 @@ eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCs sizeof(pMac->roam.configParam.vendor_vht_for_24ghz_sap)); pBuf += sizeof(pMac->roam.configParam.vendor_vht_for_24ghz_sap); - *pBuf++ = (tANI_U8)pParam->beacon_tx_rate; + vos_mem_copy(pBuf, &pParam->beacon_tx_rate, + sizeof(pParam->beacon_tx_rate)); + pBuf += sizeof(pParam->beacon_tx_rate); msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg pMsg->length = pal_cpu_to_be16(msgLen); diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c index 01f2300ded05..92643371695b 100644 --- a/CORE/SME/src/csr/csrApiScan.c +++ b/CORE/SME/src/csr/csrApiScan.c @@ -1730,8 +1730,10 @@ eHalStatus csrScanHandleSearchForSSID(tpAniSirGlobal pMac, tSmeCmd *pCommand) csrScanResultPurge(pMac, hBSSList); } //We haven't done anything to this profile - csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.scanCmd.roamId, - eCSR_ROAM_ASSOCIATION_FAILURE, eCSR_ROAM_RESULT_FAILURE); + csrRoamCallCallback(pMac, sessionId, NULL, + pCommand->u.scanCmd.roamId, + eCSR_ROAM_ASSOCIATION_FAILURE, + eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE); //In case we have nothing else to do, restart idle scan if(csrIsConnStateDisconnected(pMac, sessionId) && !csrIsRoamCommandWaiting(pMac)) { @@ -1825,14 +1827,14 @@ eHalStatus csrScanHandleSearchForSSIDFailure(tpAniSirGlobal pMac, tSmeCmd *pComm csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.scanCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, - eCSR_ROAM_RESULT_FAILURE); + eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE); } else { csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.scanCmd.roamId, eCSR_ROAM_ASSOCIATION_FAILURE, - eCSR_ROAM_RESULT_FAILURE); + eCSR_ROAM_RESULT_SCAN_FOR_SSID_FAILURE); } } else @@ -5153,6 +5155,7 @@ static tANI_BOOLEAN csrScanProcessScanResults( tpAniSirGlobal pMac, tSmeCmd *pCo tANI_U32 cbParsed; tSirBssDescription *pSirBssDescription; tANI_U32 cbBssDesc; + eHalStatus status; tANI_U32 cbScanResult = GET_FIELD_OFFSET( tSirSmeScanRsp, bssDescription ) + sizeof(tSirBssDescription); //We need at least one CB tpCsrNeighborRoamControlInfo pNeighborRoamInfo = @@ -5299,6 +5302,21 @@ static tANI_BOOLEAN csrScanProcessScanResults( tpAniSirGlobal pMac, tSmeCmd *pCo { *pfRemoveCommand = fRemoveCommand; } + /* + * Currently SET_FCC_CHANNEL issues updated channel list to fw. + * At the time of driver load, if scan is issued followed with + * SET_FCC_CHANNEL, driver will send update channel list to fw. + * Fw will stop ongoing scan because of that GUI will have very less + * scan list. + * Update channel list should be sent to fw once scan is done + */ + if (pMac->scan.defer_update_channel_list) { + status = csrUpdateChannelList(pMac); + if (eHAL_STATUS_SUCCESS != status) + smsLog(pMac, LOGE, + FL( "failed to update the supported channel list")); + pMac->scan.defer_update_channel_list = false; + } #ifdef WLAN_AP_STA_CONCURRENCY if (pMac->fScanOffload) @@ -6927,6 +6945,44 @@ static void csrScanResultCfgAgingTimerHandler(void *pv) CSR_SCAN_RESULT_CFG_AGING_INTERVAL/VOS_TIMER_TO_MS_UNIT); } +/** + * csr_remove_bssid_from_scan_list() - remove the bssid from + * scan list + * @mac_tx: mac context. + * @bssid: bssid to be removed + * + * This function remove the given bssid from scan list. + * + * Return: void. + */ +void csr_remove_bssid_from_scan_list(tpAniSirGlobal mac_ctx, + tSirMacAddr bssid) +{ + tListElem *entry,*free_elem; + tCsrScanResult *bss_desc; + tDblLinkList *list = &mac_ctx->scan.scanResultList; + + csrLLLock(list); + entry = csrLLPeekHead(list, LL_ACCESS_NOLOCK); + while (entry != NULL) { + bss_desc = GET_BASE_ADDR( entry, tCsrScanResult, Link); + if (vos_mem_compare(bss_desc->Result.BssDescriptor.bssId, + bssid, sizeof(tSirMacAddr))) { + free_elem = entry; + entry = csrLLNext(list, entry, LL_ACCESS_NOLOCK); + csrLLRemoveEntry(list, free_elem, LL_ACCESS_NOLOCK); + csrFreeScanResultEntry(mac_ctx, bss_desc); + smsLog(mac_ctx, LOGW, FL("Removed BSS entry:%pM"), + bssid); + continue; + } + + entry = csrLLNext(list, entry, LL_ACCESS_NOLOCK); + } + + csrLLUnlock(list); +} + eHalStatus csrScanStartIdleScanTimer(tpAniSirGlobal pMac, tANI_U32 interval) { eHalStatus status; diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h index f42fca4f31a9..1987e39ffe7e 100644 --- a/CORE/SME/src/csr/csrInsideApi.h +++ b/CORE/SME/src/csr/csrInsideApi.h @@ -1093,6 +1093,9 @@ void csrRoamPrepareBssParams(tpAniSirGlobal mac_ctx, uint32_t session_id, tCsrRoamProfile *profile, tSirBssDescription *bss_desc, tBssConfigParam *bss_cfg, tDot11fBeaconIEs *ies); +void csr_remove_bssid_from_scan_list(tpAniSirGlobal mac_ctx, + tSirMacAddr bssid); + eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal mac_ctx, uint32_t session_id, tCsrRoamProfile *profile, tSirBssDescription *bss_desc, tBssConfigParam *bss_cfg, tDot11fBeaconIEs *ies, diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c index 3a65e325e6b4..6fa7ce23476e 100644 --- a/CORE/SME/src/csr/csrNeighborRoam.c +++ b/CORE/SME/src/csr/csrNeighborRoam.c @@ -4397,6 +4397,9 @@ VOS_STATUS csrNeighborRoamTransitToCFGChanScan(tpAniSirGlobal pMac, else { numOfChannels = pMac->scan.occupiedChannels[sessionId].numChannels; + if (numOfChannels > WNI_CFG_VALID_CHANNEL_LIST_LEN) { + numOfChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN; + } if (numOfChannels #ifdef FEATURE_WLAN_LFR && ((pNeighborRoamInfo->uScanMode == SPLIT_SCAN_OCCUPIED_LIST) || @@ -4428,10 +4431,6 @@ VOS_STATUS csrNeighborRoamTransitToCFGChanScan(tpAniSirGlobal pMac, } else { - if (numOfChannels > WNI_CFG_VALID_CHANNEL_LIST_LEN) - { - numOfChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN; - } vos_mem_copy(channelList, pMac->scan.occupiedChannels[sessionId].channelList, numOfChannels * sizeof(tANI_U8)); @@ -4466,10 +4465,6 @@ VOS_STATUS csrNeighborRoamTransitToCFGChanScan(tpAniSirGlobal pMac, smsLog(pMac, LOGE, FL("Memory allocation for Channel list failed")); return VOS_STATUS_E_RESOURCES; } - if (numOfChannels > WNI_CFG_VALID_CHANNEL_LIST_LEN) - { - numOfChannels = WNI_CFG_VALID_CHANNEL_LIST_LEN; - } currChannelListInfo->numOfChannels = outputNumOfChannels; vos_mem_copy(currChannelListInfo->ChannelList, scanChannelList, diff --git a/CORE/SME/src/csr/csrTdlsProcess.c b/CORE/SME/src/csr/csrTdlsProcess.c index e76e7e3884b1..f7c2922eefaf 100644 --- a/CORE/SME/src/csr/csrTdlsProcess.c +++ b/CORE/SME/src/csr/csrTdlsProcess.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -149,7 +149,7 @@ eHalStatus csrTdlsSendMgmtReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsSendMg } /* - * TDLS request API, called from HDD to add a TDLS peer + * TDLS request API, called from HDD to modify an existing TDLS peer */ eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId, @@ -160,6 +160,8 @@ eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tSmeCmd *tdlsAddStaCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; + if (NULL == pstaParams) + return status; //If connected and in Infra. Only then allow this if (CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 3030059a2dad..e8d4fd300495 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -17830,7 +17830,8 @@ eHalStatus vos_send_flush_logs_cmd_to_fw(tpAniSirGlobal mac) * * Return: eHalStatus. */ -eHalStatus sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint) +eHalStatus sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint, + uint32_t scan_pending) { eHalStatus status = eHAL_STATUS_SUCCESS; tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal); @@ -17838,16 +17839,17 @@ eHalStatus sme_handle_set_fcc_channel(tHalHandle hal, bool fcc_constraint) status = sme_AcquireGlobalLock(&mac_ptr->sme); if (eHAL_STATUS_SUCCESS == status) { - if (fcc_constraint != mac_ptr->scan.fcc_constraint) { mac_ptr->scan.fcc_constraint = fcc_constraint; - - /* update the channel list to the firmware */ - status = csrUpdateChannelList(mac_ptr); + if (scan_pending == TRUE) { + mac_ptr->scan.defer_update_channel_list = true; + } else { + /* update the channel list to the firmware */ + status = csrUpdateChannelList(mac_ptr); + } } - - sme_ReleaseGlobalLock(&mac_ptr->sme); } + sme_ReleaseGlobalLock(&mac_ptr->sme); return status; } @@ -19113,6 +19115,31 @@ VOS_STATUS sme_oem_get_capability(tHalHandle hal, } /** + * sme_remove_bssid_from_scan_list() - wrapper to remove the bssid from + * scan list + * @hal: hal context. + * @bssid: bssid to be removed + * + * This function remove the given bssid from scan list. + * + * Return: hal status. + */ +eHalStatus sme_remove_bssid_from_scan_list(tHalHandle hal, + tSirMacAddr bssid) +{ + eHalStatus status = eHAL_STATUS_FAILURE; + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); + + status = sme_AcquireGlobalLock(&mac_ctx->sme); + if (HAL_STATUS_SUCCESS(status)) { + csr_remove_bssid_from_scan_list(mac_ctx, bssid); + sme_ReleaseGlobalLock(&mac_ctx->sme); + } + + return status; +} + +/** * sme_sta_roam_offload_scan() - update sta roam policy for * unsafe and DFS channels for roaming. * @hal_handle: hal handle for getting global mac struct @@ -19190,3 +19217,240 @@ eHalStatus sme_update_sta_roam_policy(tHalHandle hal_handle, sme_sta_roam_offload_scan(mac_ctx, session_id, reason); return status; } + +/** + * sme_update_access_policy_vendor_ie() - update vendor ie and access policy. + * @hal: Pointer to the mac context + * @session_id: sme session id + * @vendor_ie: vendor ie + * @access_policy: vendor ie access policy + * + * This function updates the vendor ie and access policy to lim. + * + * Return: success or failure. + */ +eHalStatus sme_update_access_policy_vendor_ie(tHalHandle hal, + uint8_t session_id, uint8_t *vendor_ie, int access_policy) +{ + struct sme_update_access_policy_vendor_ie *msg; + uint16_t msg_len; + eHalStatus status = eHAL_STATUS_FAILURE; + tpAniSirGlobal mac = PMAC_STRUCT(hal); + + msg_len = sizeof(*msg); + + msg = vos_mem_malloc(msg_len); + if (!msg) { + smsLog(mac, LOGE, + "failed to allocate memory for sme_update_access_policy_vendor_ie"); + return eHAL_STATUS_FAILURE; + } + + vos_mem_set(msg, msg_len, 0); + msg->msg_type = pal_cpu_to_be16( + (tANI_U16)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE); + msg->length = pal_cpu_to_be16(msg_len); + + vos_mem_copy(&msg->ie[0], vendor_ie, sizeof(msg->ie)); + + msg->sme_session_id = session_id; + msg->access_policy = access_policy; + + smsLog(mac, LOG1, "sme_session_id %hu, access_policy %d", session_id, + access_policy); + + status = palSendMBMessage(mac->hHdd, msg); + + return status; +} + +/** + * sme_update_tx_fail_cnt_threshold() - update tx fail count Threshold + * @hal: Handle returned by mac_open + * @session_id: Session ID on which tx fail count needs to be updated to FW + * @tx_fail_count: Count for tx fail threshold after which FW will disconnect + * + * This function is used to set tx fail count threshold to firmware. + * firmware will issue disocnnect with peer device once this threshold is + * reached. + * + * Return: eHAL_STATUS_SUCCESS or non-zero on failure. + */ +eHalStatus sme_update_tx_fail_cnt_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t tx_fail_count) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle); + eHalStatus status = eHAL_STATUS_SUCCESS; + struct sme_tx_fail_cnt_threshold *tx_fail_cnt; + vos_msg_t msg; + + tx_fail_cnt = vos_mem_malloc(sizeof(*tx_fail_cnt)); + if (NULL == tx_fail_cnt) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "%s: fail to alloc filter_param", __func__); + return eHAL_STATUS_FAILURE; + } + smsLog(mac_ctx, LOG1, FL("session_id %d tx_fail_count: %d"), + session_id, tx_fail_count); + tx_fail_cnt->session_id = session_id; + tx_fail_cnt->tx_fail_cnt_threshold = tx_fail_count; + + vos_mem_zero(&msg, sizeof(vos_msg_t)); + msg.type = WDA_UPDATE_TX_FAIL_CNT_TH; + msg.reserved = 0; + msg.bodyptr = tx_fail_cnt; + status = vos_mq_post_message(VOS_MQ_ID_WDA, &msg); + + if(status != eHAL_STATUS_SUCCESS) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + FL("Not able to post Tx fail count message to WDA")); + vos_mem_free(tx_fail_cnt); + return eHAL_STATUS_FAILURE; + } + + return status; +} + +/** + * sme_update_short_retry_limit_threshold() - update short frame retry limit TH + * @hal: Handle returned by mac_open + * @session_id: Session ID on which short frame retry limit needs to be + * updated to FW + * @short_limit_count_th: Retry count TH to retry short frame. + * + * This function is used to configure count to retry short frame. + * + * Return: VOS_STATUS + */ +eHalStatus sme_update_short_retry_limit_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t short_limit_count_th) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle); + eHalStatus status = eHAL_STATUS_SUCCESS; + struct sme_short_retry_limit *srl; + vos_msg_t msg; + + srl = vos_mem_malloc(sizeof(*srl)); + if (NULL == srl) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "%s: fail to alloc short retry limit", __func__); + return eHAL_STATUS_FAILURE; + } + smsLog(mac_ctx, LOG1, FL("session_id %d short retry limit count: %d"), + session_id, short_limit_count_th); + srl->session_id = session_id; + srl->short_retry_limit = short_limit_count_th; + + vos_mem_zero(&msg, sizeof(vos_msg_t)); + msg.type = WDA_UPDATE_SHORT_RETRY_LIMIT_CNT; + msg.reserved = 0; + msg.bodyptr = srl; + status = vos_mq_post_message(VOS_MQ_ID_WDA, &msg); + if(status != eHAL_STATUS_SUCCESS) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + FL("Not able to post short retry limit count to WDA")); + vos_mem_free(srl); + return eHAL_STATUS_FAILURE; + } + + return status; +} + +/** + * sme_update_long_retry_limit_threshold() - update long retry limit TH + * @hal: Handle returned by mac_open + * @session_id: Session ID on which long frames retry TH needs to be updated + * to FW + * @long_limit_count_th: Retry count to retry long frame. + * + * This function is used to configure TH to retry long frame. + * + * Return: VOS_STATUS + */ +eHalStatus sme_update_long_retry_limit_threshold(tHalHandle hal_handle, + uint8_t session_id, uint32_t long_limit_count_th) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle); + eHalStatus status = eHAL_STATUS_SUCCESS; + struct sme_long_retry_limit *lrl; + vos_msg_t msg; + + lrl = vos_mem_malloc(sizeof(*lrl)); + if (NULL == lrl) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "%s: fail to alloc long retry limit", __func__); + return eHAL_STATUS_FAILURE; + } + smsLog(mac_ctx, LOG1, FL("session_id %d long retry limit count: %d"), + session_id, long_limit_count_th); + lrl->session_id = session_id; + lrl->long_retry_limit = long_limit_count_th; + + vos_mem_zero(&msg, sizeof(vos_msg_t)); + msg.type = WDA_UPDATE_LONG_RETRY_LIMIT_CNT; + msg.reserved = 0; + msg.bodyptr = lrl; + status = vos_mq_post_message(VOS_MQ_ID_WDA, &msg); + + if(status != eHAL_STATUS_SUCCESS) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + FL("Not able to post long retry limit count to WDA")); + vos_mem_free(lrl); + return eHAL_STATUS_FAILURE; + } + return status; +} + +/** + * sme_update_sta_inactivity_timeout(): Update sta_inactivity_timeout to FW + * @hal: Handle returned by mac_open + * @session_id: Session ID on which sta_inactivity_timeout needs + * to be updated to FW + * @sta_inactivity_timeout: sta inactivity timeout. + * + * If a station does not send anything in sta_inactivity_timeout seconds, an + * empty data frame is sent to it in order to verify whether it is + * still in range. If this frame is not ACKed, the station will be + * disassociated and then deauthenticated. + * + * Return: eHAL_STATUS_SUCCESS or non-zero on failure. + */ +eHalStatus sme_update_sta_inactivity_timeout(tHalHandle hal_handle, + uint8_t session_id, uint32_t sta_inactivity_timeout) +{ + tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_handle); + eHalStatus status = eHAL_STATUS_SUCCESS; + struct sme_sta_inactivity_timeout *inactivity_time; + vos_msg_t msg; + + inactivity_time = vos_mem_malloc(sizeof(*inactivity_time)); + if (NULL == inactivity_time) { + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "%s: fail to alloc inactivity_time", __func__); + return eHAL_STATUS_FAILURE; + } + smsLog(mac_ctx, LOG1, FL("sta_inactivity_timeout: %d"), + sta_inactivity_timeout); + inactivity_time->session_id = session_id; + inactivity_time->sta_inactivity_timeout = sta_inactivity_timeout; + + if (eHAL_STATUS_SUCCESS == sme_AcquireGlobalLock(&mac_ctx->sme)) { + vos_mem_zero(&msg, sizeof(vos_msg_t)); + msg.type = WDA_UPDATE_STA_INACTIVITY_TIMEOUT; + msg.reserved = 0; + msg.bodyptr = inactivity_time; + status = vos_mq_post_message(VOS_MQ_ID_WDA, &msg); + + if(status != eHAL_STATUS_SUCCESS) { + status = eHAL_STATUS_FAILURE; + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "%s: sta_inactivity_timeout ", + __func__); + vos_mem_free(inactivity_time); + } + sme_ReleaseGlobalLock(&mac_ctx->sme); + return status; + } + + return eHAL_STATUS_FAILURE; +} diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c index 104659e91446..16423c1daf4c 100644 --- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c +++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c @@ -553,7 +553,7 @@ int pktlog_send_per_pkt_stats_to_user(void) goto err; } ret = nl_srv_bcast(pstats_msg->skb); - if (ret < 0) { + if ((ret < 0) && (ret != -ESRCH)) { pr_info("%s: Send Failed %d drop_count = %u\n", __func__, ret, ++gwlan_logging.pkt_stat_drop_cnt); diff --git a/CORE/SVC/src/nlink/wlan_nlink_srv.c b/CORE/SVC/src/nlink/wlan_nlink_srv.c index 96ae6c509993..2a5b2fddbcab 100644 --- a/CORE/SVC/src/nlink/wlan_nlink_srv.c +++ b/CORE/SVC/src/nlink/wlan_nlink_srv.c @@ -395,7 +395,7 @@ int nl_srv_bcast(struct sk_buff *skb) } else { dev_kfree_skb(skb); } - if (err < 0) + if ((err < 0) && (err != -ESRCH)) { VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN, "NLINK: netlink_broadcast failed err = %d", err); diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c index 6258e6309002..c0a74f28e5bb 100644 --- a/CORE/SYS/legacy/src/utils/src/macTrace.c +++ b/CORE/SYS/legacy/src/utils/src/macTrace.c @@ -1035,7 +1035,6 @@ tANI_U8* macTraceGetLimMsgString(tANI_U16 limMsg) CASE_RETURN_STRING(SIR_LIM_PROBE_HB_FAILURE_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_ADDTS_RSP_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_LINK_TEST_DURATION_TIMEOUT); - CASE_RETURN_STRING(SIR_LIM_HASH_MISS_THRES_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_CNF_WAIT_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_KEEPALIVE_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_UPDATE_OLBC_CACHEL_TIMEOUT); diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c index 5fff3b4759ea..255e8a2d5768 100644 --- a/CORE/UTILS/FWLOG/dbglog_host.c +++ b/CORE/UTILS/FWLOG/dbglog_host.c @@ -2043,7 +2043,7 @@ send_fw_diag_nl_data(const u_int8_t *buffer, memcpy(nlmsg_data(nlh) + sizeof(radio), buffer, len); res = nl_srv_bcast(skb_out); - if (res < 0) + if ((res < 0) && (res != -ESRCH)) { AR_DEBUG_PRINTF(ATH_DEBUG_RSVD1, ("%s: nl_srv_bcast failed 0x%x \n", __func__, res)); @@ -2105,7 +2105,7 @@ send_diag_netlink_data(const u_int8_t *buffer, A_UINT32 len, A_UINT32 cmd) memcpy(slot->payload, buffer, len); res = nl_srv_bcast(skb_out); - if (res < 0) { + if ((res < 0) && (res != -ESRCH)) { AR_DEBUG_PRINTF(ATH_DEBUG_RSVD1, ("%s: nl_srv_bcast failed 0x%x \n", __func__, res)); return res; @@ -2168,7 +2168,7 @@ dbglog_process_netlink_data(wmi_unified_t wmi_handle, const u_int8_t *buffer, memcpy(slot->payload, buffer, len); res = nl_srv_bcast(skb_out); - if (res < 0) + if ((res < 0) && (res != -ESRCH)) { AR_DEBUG_PRINTF(ATH_DEBUG_RSVD1, ("%s: nl_srv_bcast failed 0x%x \n", __func__, res)); diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h index 6b3bea85fdb4..618c0316ffe5 100644 --- a/CORE/WDA/inc/legacy/halMsgApi.h +++ b/CORE/WDA/inc/legacy/halMsgApi.h @@ -544,7 +544,7 @@ typedef struct uint8_t nss_5g; uint32_t tx_aggregation_size; uint32_t rx_aggregation_size; - uint8_t beacon_tx_rate; + uint16_t beacon_tx_rate; } tAddBssParams, * tpAddBssParams; typedef struct diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h index f969cfae4672..180f6dafc61d 100644 --- a/CORE/WDA/inc/wlan_qct_wda.h +++ b/CORE/WDA/inc/wlan_qct_wda.h @@ -1094,6 +1094,12 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb); #define WDA_REMOVE_BCN_FILTER_CMDID SIR_HAL_REMOVE_BCN_FILTER_CMDID #define WDA_UPDATE_TX_RATE SIR_HAL_UPDATE_TX_RATE +#define WDA_UPDATE_TX_FAIL_CNT_TH SIR_HAL_UPDATE_TX_FAIL_CNT_TH +#define WDA_UPDATE_SHORT_RETRY_LIMIT_CNT SIR_HAL_SHORT_RETRY_LIMIT_CNT +#define WDA_UPDATE_LONG_RETRY_LIMIT_CNT SIR_HAL_LONG_RETRY_LIMIT_CNT + + +#define WDA_UPDATE_STA_INACTIVITY_TIMEOUT SIR_HAL_STA_INACTIVITY_TIMEOUT tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg); |
