summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-07-14 19:36:37 -0600
committerLinux Build Service Account <lnxbuild@localhost>2016-07-14 19:36:37 -0600
commitfeb21f72f844e7472dbd3c673ddbe0d1396b8069 (patch)
treee931b69a2e2ce616c37bf53a1c643f577cb13715
parenta91fd91b65138d01d1962df5cad86b8c4f50b039 (diff)
parente9456090d9f86fb758691e331300bb1be1504bd7 (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
-rw-r--r--CORE/CLD_TXRX/HTT/htt.h1228
-rw-r--r--CORE/CLD_TXRX/HTT/htt_t2h.c35
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c8
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_defrag.c8
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx.c3
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c2
-rw-r--r--CORE/EPPING/src/epping_tx.c25
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h16
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg80211.h15
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c32
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c14
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c217
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c9
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c22
-rwxr-xr-xCORE/HDD/src/wlan_hdd_main.c77
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c64
-rw-r--r--CORE/HDD/src/wlan_hdd_wmm.c17
-rw-r--r--CORE/MAC/inc/aniGlobal.h7
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h61
-rw-r--r--CORE/MAC/inc/wniApi.h1
-rw-r--r--CORE/MAC/src/include/sirParams.h5
-rw-r--r--CORE/MAC/src/pe/include/limApi.h16
-rw-r--r--CORE/MAC/src/pe/include/limGlobal.h4
-rw-r--r--CORE/MAC/src/pe/include/limSession.h4
-rw-r--r--CORE/MAC/src/pe/lim/limAIDmgmt.c9
-rw-r--r--CORE/MAC/src/pe/lim/limApi.c7
-rw-r--r--CORE/MAC/src/pe/lim/limFT.c15
-rw-r--r--CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c28
-rw-r--r--CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c29
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMessageQueue.c11
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c4
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c3
-rw-r--r--CORE/MAC/src/pe/lim/limProcessProbeReqFrame.c15
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c57
-rw-r--r--CORE/MAC/src/pe/lim/limScanResultUtils.c3
-rw-r--r--CORE/MAC/src/pe/lim/limSerDesUtils.c6
-rw-r--r--CORE/MAC/src/pe/lim/limSession.c5
-rw-r--r--CORE/MAC/src/pe/lim/limTimerUtils.c58
-rw-r--r--CORE/MAC/src/pe/lim/limTimerUtils.h3
-rw-r--r--CORE/MAC/src/pe/lim/limTypes.h2
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c4
-rw-r--r--CORE/MAC/src/pe/sch/schBeaconGen.c2
-rw-r--r--CORE/SAP/inc/sapApi.h12
-rw-r--r--CORE/SAP/src/sapApiLinkCntl.c22
-rw-r--r--CORE/SAP/src/sapFsm.c170
-rw-r--r--CORE/SAP/src/sapInternal.h11
-rw-r--r--CORE/SAP/src/sapModule.c147
-rw-r--r--CORE/SERVICES/BMI/ar6320v2_dbg_regtable.h277
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c264
-rw-r--r--CORE/SERVICES/BMI/ol_fw.h18
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c62
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h46
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_trace.c6
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h51
-rw-r--r--CORE/SERVICES/COMMON/wmi_services.h18
-rw-r--r--CORE/SERVICES/COMMON/wmi_tlv_defs.h70
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h225
-rw-r--r--CORE/SERVICES/COMMON/wmi_version.h2
-rw-r--r--CORE/SERVICES/DFS/src/dfs.c37
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c4
-rw-r--r--CORE/SERVICES/WMA/wma.c275
-rw-r--r--CORE/SERVICES/WMA/wma.h29
-rw-r--r--CORE/SERVICES/WMI/wmi_unified.c113
-rw-r--r--CORE/SME/inc/csrApi.h8
-rw-r--r--CORE/SME/inc/csrInternal.h4
-rw-r--r--CORE/SME/inc/sme_Api.h18
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c93
-rw-r--r--CORE/SME/src/csr/csrApiScan.c64
-rw-r--r--CORE/SME/src/csr/csrInsideApi.h3
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c11
-rw-r--r--CORE/SME/src/csr/csrTdlsProcess.c6
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c278
-rw-r--r--CORE/SVC/src/logging/wlan_logging_sock_svc.c2
-rw-r--r--CORE/SVC/src/nlink/wlan_nlink_srv.c2
-rw-r--r--CORE/SYS/legacy/src/utils/src/macTrace.c1
-rw-r--r--CORE/UTILS/FWLOG/dbglog_host.c6
-rw-r--r--CORE/WDA/inc/legacy/halMsgApi.h2
-rw-r--r--CORE/WDA/inc/wlan_qct_wda.h6
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, &param,
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);