summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakash Dhavali <pdhavali@codeaurora.org>2014-01-25 16:06:56 -0800
committerPrakash Dhavali <pdhavali@codeaurora.org>2014-01-25 16:06:56 -0800
commitc250630184bee5ceefb3a0f3563ced46234dc003 (patch)
tree1acbf2dc974fff287f4b64d2b68afea551180d67
parent1824264942a6c9b8da64b84759200a714841c632 (diff)
parent5fa70148de427fd0a903bdbc1dfb4476c3c800da (diff)
Merge remote-tracking branch 'origin/caf/caf-wlan/master'
-rw-r--r--CORE/BAP/src/bapModule.c9
-rw-r--r--CORE/BAP/src/bapRsn8021xAuthFsm.c6
-rw-r--r--CORE/BAP/src/bapRsn8021xPrf.c8
-rw-r--r--CORE/BAP/src/bapRsnSsmAesKeyWrap.c4
-rw-r--r--CORE/BAP/src/bapRsnSsmEapol.c7
-rw-r--r--CORE/CLD_TXRX/HTT/htt_rx.c29
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c7
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h7
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx.c25
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_defrag.c2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_pn.c2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_reorder.c2
-rw-r--r--CORE/HDD/src/bap_hdd_main.c68
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c2
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c3
-rw-r--r--CORE/HDD/src/wlan_hdd_tdls.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_wmm.c4
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/src/pe/lim/limSendSmeRspMessages.c25
-rw-r--r--CORE/SAP/src/sapApiLinkCntl.c15
-rw-r--r--CORE/SAP/src/sapFsm.c205
-rw-r--r--CORE/SAP/src/sapInternal.h26
-rw-r--r--CORE/SERVICES/COMMON/ol_htt_rx_api.h19
-rw-r--r--CORE/SERVICES/COMMON/wdi_out.h6
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h3
-rw-r--r--CORE/SERVICES/COMMON/wmi_version.h2
-rw-r--r--CORE/SERVICES/HIF/PCIe/ar6320def.h4
-rw-r--r--CORE/SERVICES/HIF/PCIe/ar9888def.h4
-rw-r--r--CORE/SERVICES/HIF/PCIe/regtable.h4
-rw-r--r--CORE/SERVICES/WMA/wma.c57
-rw-r--r--CORE/SERVICES/WMI/wmi_unified.c5
-rw-r--r--CORE/VOSS/inc/vos_api.h4
-rw-r--r--CORE/VOSS/src/vos_api.c21
33 files changed, 517 insertions, 79 deletions
diff --git a/CORE/BAP/src/bapModule.c b/CORE/BAP/src/bapModule.c
index 2fd8c37725d7..88b27af5c30d 100644
--- a/CORE/BAP/src/bapModule.c
+++ b/CORE/BAP/src/bapModule.c
@@ -1223,8 +1223,13 @@ WLANBAP_ReadMacConfig
ccmCfgGetStr( pMac, WNI_CFG_STA_ID, pBtStaOwnMacAddr, &len );
- VOS_ASSERT( WNI_CFG_BSSID_LEN == len );
-
+ if (WNI_CFG_BSSID_LEN != len)
+ {
+ VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR,
+ "len is improper %s", __func__);
+ return;
+ }
+
/* Form the SSID from Mac address */
VOS_SNPRINTF( pBtStaOwnSsid, WLAN_BAP_SSID_MAX_LEN,
"AMP-%02x-%02x-%02x-%02x-%02x-%02x",
diff --git a/CORE/BAP/src/bapRsn8021xAuthFsm.c b/CORE/BAP/src/bapRsn8021xAuthFsm.c
index 2ce59a78c530..98ba3d16483f 100644
--- a/CORE/BAP/src/bapRsn8021xAuthFsm.c
+++ b/CORE/BAP/src/bapRsn8021xAuthFsm.c
@@ -1017,7 +1017,11 @@ int derivePtk(tAuthRsnFsm *fsm, tAniEapolKeyAvailEventData *data)
v_U32_t prfLen;
tAniEapolRsnKeyDesc *rxDesc;
- VOS_ASSERT(fsm->staCtx->pmk);
+ if (NULL == fsm->staCtx->pmk)
+ {
+ VOS_ASSERT(0);
+ return ANI_E_NULL_VALUE;
+ }
switch (fsm->staCtx->pwCipherType)
{
diff --git a/CORE/BAP/src/bapRsn8021xPrf.c b/CORE/BAP/src/bapRsn8021xPrf.c
index ebd50fa7de4d..4b8a7e01be54 100644
--- a/CORE/BAP/src/bapRsn8021xPrf.c
+++ b/CORE/BAP/src/bapRsn8021xPrf.c
@@ -249,8 +249,12 @@ aagPrf(v_U32_t cryptHandle,
for (i = 0; i < numLoops; i++)
{
- VOS_ASSERT((resultOffset - result + VOS_DIGEST_SHA1_SIZE)
- <= AAG_PRF_MAX_OUTPUT_SIZE);
+ if ((resultOffset - result + VOS_DIGEST_SHA1_SIZE) > AAG_PRF_MAX_OUTPUT_SIZE)
+ {
+ VOS_ASSERT(0);
+ return ANI_ERROR;
+ }
+
hmacText[loopCtrPos] = i;
if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, hmacText, loopCtrPos + 1, key, keyLen, resultOffset) ) )
{
diff --git a/CORE/BAP/src/bapRsnSsmAesKeyWrap.c b/CORE/BAP/src/bapRsnSsmAesKeyWrap.c
index 0e8858cb4fc1..398a0be95e23 100644
--- a/CORE/BAP/src/bapRsnSsmAesKeyWrap.c
+++ b/CORE/BAP/src/bapRsnSsmAesKeyWrap.c
@@ -273,8 +273,6 @@ aes(v_U32_t cryptHandle, tANI_U8 *keyBytes, tANI_U32 keyLen,
tANI_U8 in[AES_BLOCK_SIZE];
tANI_U8 *out;
- VOS_ASSERT (AES_BLOCK_SIZE == ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE*2);
-
// Concatenate A and R[i]
vos_mem_copy(in, a, ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE);
vos_mem_copy(in + ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE,
@@ -317,8 +315,6 @@ aes_1(v_U32_t cryptHandle, tANI_U8 *keyBytes, tANI_U32 keyLen,
tANI_U8 in[AES_BLOCK_SIZE];
tANI_U8 *out;
- VOS_ASSERT (AES_BLOCK_SIZE == ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE*2);
-
// Concatenate A and R[i]
vos_mem_copy(in, at, ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE);
vos_mem_copy(in + ANI_SSM_AES_KEY_WRAP_BLOCK_SIZE,
diff --git a/CORE/BAP/src/bapRsnSsmEapol.c b/CORE/BAP/src/bapRsnSsmEapol.c
index ea39c7bd4cd3..14f2f93a9c79 100644
--- a/CORE/BAP/src/bapRsnSsmEapol.c
+++ b/CORE/BAP/src/bapRsnSsmEapol.c
@@ -1099,7 +1099,12 @@ int bapRsnFormPktFromVosPkt( tAniPacket **ppPacket, vos_pkt_t *pVosPacket )
if( !ANI_IS_STATUS_SUCCESS( retVal ) ) break;
//Get the rest of the data in
uPktLen -= BAP_RSN_ETHERNET_3_HEADER_LEN;
- VOS_ASSERT( uPktLen > 0 );
+ if (uPktLen <= 0){
+ VOS_ASSERT(0);
+ retVal = ANI_ERROR;
+ break;
+ }
+
retVal = aniAsfPacketAppendBuffer( pAniPacket, pFrame + BAP_RSN_ETHERNET_3_HEADER_LEN,
uPktLen );
if( !ANI_IS_STATUS_SUCCESS( retVal ) )
diff --git a/CORE/CLD_TXRX/HTT/htt_rx.c b/CORE/CLD_TXRX/HTT/htt_rx.c
index 11783cfcfad0..2d66b252d8cf 100644
--- a/CORE/CLD_TXRX/HTT/htt_rx.c
+++ b/CORE/CLD_TXRX/HTT/htt_rx.c
@@ -1414,6 +1414,10 @@ a_bool_t (*htt_rx_mpdu_is_encrypted)(
htt_pdev_handle pdev,
void *mpdu_desc);
+a_bool_t (*htt_rx_msdu_desc_key_id)(
+ htt_pdev_handle pdev,
+ void *mpdu_desc, u_int8_t *key_id);
+
void *
htt_rx_mpdu_desc_list_next_ll(htt_pdev_handle pdev, adf_nbuf_t rx_ind_msg)
{
@@ -1485,6 +1489,29 @@ a_bool_t htt_rx_mpdu_is_encrypted_hl(htt_pdev_handle pdev, void *mpdu_desc)
}
}
+a_bool_t
+htt_rx_msdu_desc_key_id_ll(htt_pdev_handle pdev, void *mpdu_desc,
+ u_int8_t *key_id)
+{
+ struct htt_host_rx_desc_base *rx_desc = (struct htt_host_rx_desc_base *)
+ mpdu_desc;
+
+ if (!htt_rx_msdu_first_msdu_flag_ll(pdev, mpdu_desc))
+ return A_FALSE;
+
+ *key_id = ((*(((u_int32_t *) &rx_desc->msdu_end) + 1)) &
+ (RX_MSDU_END_1_KEY_ID_OCT_MASK >> RX_MSDU_END_1_KEY_ID_OCT_LSB));
+
+ return A_TRUE;
+}
+
+a_bool_t
+htt_rx_msdu_desc_key_id_hl(htt_pdev_handle htt_pdev, void *mpdu_desc, u_int8_t *key_id)
+{
+ /* TODO: Implement it for HL */
+ return A_FALSE;
+}
+
void
htt_rx_desc_frame_free(
htt_pdev_handle htt_pdev,
@@ -1671,6 +1698,7 @@ htt_rx_attach(struct htt_pdev_t *pdev)
htt_rx_msdu_is_frag = htt_rx_msdu_is_frag_ll;
htt_rx_msdu_desc_retrieve = htt_rx_msdu_desc_retrieve_ll;
htt_rx_mpdu_is_encrypted = htt_rx_mpdu_is_encrypted_ll;
+ htt_rx_msdu_desc_key_id = htt_rx_msdu_desc_key_id_ll;
} else {
pdev->rx_ring.size = HTT_RX_RING_SIZE_MIN;
HTT_ASSERT2(IS_PWR2(pdev->rx_ring.size));
@@ -1690,6 +1718,7 @@ htt_rx_attach(struct htt_pdev_t *pdev)
htt_rx_msdu_is_frag = htt_rx_msdu_is_frag_hl;
htt_rx_msdu_desc_retrieve = htt_rx_msdu_desc_retrieve_hl;
htt_rx_mpdu_is_encrypted = htt_rx_mpdu_is_encrypted_hl;
+ htt_rx_msdu_desc_key_id = htt_rx_msdu_desc_key_id_hl;
/*
* HL case, the rx descriptor can be different sizes for
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index dcce0648fe31..1fe8e9bae6f1 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -24,6 +24,7 @@
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
+
#include "vos_sched.h"
#include "wlan_qct_tl.h"
#include "wdi_in.h"
@@ -1298,12 +1299,10 @@ VOS_STATUS WLANTL_Close(void *vos_ctx)
ENTER();
tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
-#ifdef WLAN_OPEN_SOURCE
#ifdef FEATURE_WLAN_CCX
- cancel_work_sync(&tl_shim->iapp_work.deferred_work);
-#endif
- cancel_work_sync(&tl_shim->cache_flush_work);
+ vos_flush_work(&tl_shim->iapp_work.deferred_work);
#endif
+ vos_flush_work(&tl_shim->cache_flush_work);
wdi_in_pdev_detach(((pVosContextType) vos_ctx)->pdev_txrx_ctx, 1);
// Delete beacon buffer hanging off tl_shim
diff --git a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
index 5fa0ded29853..7b9674402b9a 100644
--- a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
+++ b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h
@@ -114,6 +114,8 @@ void ol_rx_err_statistics(ol_pdev_handle pdev,
* one of the fragments that when reassembled, constitute the rx frame
* @param err_type - what kind of error occurred
* @param rx_frame - the rx frame that had an error
+ * @pn - Packet sequence number
+ * @key_id - Key index octet received in IV of the frame
*/
void
ol_rx_err(
@@ -123,7 +125,9 @@ ol_rx_err(
int tid,
u_int32_t tsf32,
enum ol_rx_err_type err_type,
- adf_nbuf_t rx_frame);
+ adf_nbuf_t rx_frame,
+ u_int64_t *pn,
+ u_int8_t key_id);
enum ol_rx_notify_type {
@@ -187,7 +191,6 @@ ol_rx_notify(
void
ol_tx_paused_peer_data(ol_peer_handle peer, int has_tx_data);
-
#ifdef QCA_WIFI_ISOC
/**
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c
index b3b3f2add740..1e40017e0340 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx.c
@@ -112,16 +112,6 @@ static void ol_rx_process_inv_peer(
#endif
}
-void ol_rx_err(ol_pdev_handle pdev,
- u_int8_t vdev_id, u_int8_t *peer_mac_addr, int tid,
- u_int32_t tsf32, enum ol_rx_err_type err_type,
- adf_nbuf_t rx_frame)
-{
- /*
- * TODO: Report mic error to cfg80211
- */
-}
-
#ifdef QCA_SUPPORT_PEER_DATA_RX_RSSI
static inline int16_t
ol_rx_rssi_avg(struct ol_txrx_pdev_t *pdev, int16_t rssi_old, int16_t rssi_new)
@@ -369,9 +359,18 @@ ol_rx_indication_handler(
if (status == htt_rx_status_tkip_mic_err &&
vdev != NULL && peer != NULL)
{
- ol_rx_err(
- pdev->ctrl_pdev, vdev->vdev_id, peer->mac_addr.raw,
- tid, 0, OL_RX_ERR_TKIP_MIC, msdu);
+ union htt_rx_pn_t pn;
+ u_int8_t key_id;
+ htt_rx_mpdu_desc_pn(pdev->htt_pdev,
+ htt_rx_msdu_desc_retrieve(pdev->htt_pdev,
+ msdu), &pn, 48);
+ if (htt_rx_msdu_desc_key_id(pdev->htt_pdev,
+ htt_rx_msdu_desc_retrieve(pdev->htt_pdev,
+ msdu), &key_id) == A_TRUE) {
+ ol_rx_err(pdev->ctrl_pdev, vdev->vdev_id,
+ peer->mac_addr.raw, tid, 0,
+ OL_RX_ERR_TKIP_MIC, msdu, &pn.pn48, key_id);
+ }
}
#ifdef WDI_EVENT_ENABLE
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
index 2fc976e8d030..a7537056e66c 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
@@ -502,7 +502,7 @@ ol_rx_defrag(
ol_rx_err(
pdev->ctrl_pdev,
vdev->vdev_id, peer->mac_addr.raw, tid, 0, OL_RX_DEFRAG_ERR,
- msdu);
+ msdu, NULL, 0);
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
"\n ol_rx_defrag: TKIP demic failed\n");
return;
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_pn.c b/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
index 1e46ff6d4270..a7961acbb48c 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_pn.c
@@ -185,7 +185,7 @@ ol_rx_pn_check_base(
pdev->ctrl_pdev,
vdev->vdev_id, peer->mac_addr.raw, tid,
htt_rx_mpdu_desc_tsf32(pdev->htt_pdev, rx_desc),
- OL_RX_ERR_PN, mpdu);
+ OL_RX_ERR_PN, mpdu, NULL, 0);
/* free all MSDUs within this MPDU */
do {
adf_nbuf_t next_msdu;
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
index 7db868671f78..1d1156b8a4d0 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
@@ -652,7 +652,7 @@ ol_rx_pn_ind_handler(
pdev->ctrl_pdev,
vdev->vdev_id, peer->mac_addr.raw, tid,
htt_rx_mpdu_desc_tsf32(htt_pdev, rx_desc),
- OL_RX_ERR_PN, mpdu_head);
+ OL_RX_ERR_PN, mpdu_head, NULL, 0);
/* free all MSDUs within this MPDU */
do {
next_msdu = adf_nbuf_next(msdu);
diff --git a/CORE/HDD/src/bap_hdd_main.c b/CORE/HDD/src/bap_hdd_main.c
index c2620a2c1f85..f567dc6f9fce 100644
--- a/CORE/HDD/src/bap_hdd_main.c
+++ b/CORE/HDD/src/bap_hdd_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -24,6 +24,7 @@
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
+
/**========================================================================
\file bap_hdd_main.c
@@ -795,11 +796,17 @@ static void BslReleasePhyCtx
{
VosStatus = vos_list_remove_node( &pPhyCtx->pClientCtx->PhyLinks,
&((BslPhyLinksNodeType*)pPhyCtx->pPhyLinkDescNode)->node);
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
- //Return the PhyLink handle to the free pool
- VosStatus = vos_list_insert_front(&BslPhyLinksDescPool,&((BslPhyLinksNodeType*)pPhyCtx->pPhyLinkDescNode)->node);
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
-
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: vos_list_remove_node() is not succses", __func__);
+ } else {
+ //Return the PhyLink handle to the free pool
+ VosStatus = vos_list_insert_front(&BslPhyLinksDescPool,&((BslPhyLinksNodeType*)pPhyCtx->pPhyLinkDescNode)->node);
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: vos_list_insert_front() is not succses", __func__);
+ }
+ }
pPhyCtx->pPhyLinkDescNode = NULL;
}
pPhyCtx->pClientCtx = NULL;//Moved here to bebug the exception
@@ -1447,7 +1454,12 @@ static VOS_STATUS WLANBAP_EventCB
}
}
- VOS_ASSERT(Written <= BSL_MAX_EVENT_SIZE);
+ if (BSL_MAX_EVENT_SIZE < Written)
+ {
+ VosStatus = vos_pkt_return_packet( pVosPkt );
+ VOS_ASSERT(0);
+ return(VOS_STATUS_E_FAILURE);
+ }
// stick the event into a VoS pkt
VosStatus = vos_pkt_push_head( pVosPkt, Buff, Written );
@@ -1481,7 +1493,11 @@ static VOS_STATUS WLANBAP_EventCB
//JEZ100922: We are free to return the enclosing VOSS packet.
VosStatus = vos_pkt_return_packet( pVosPkt );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ));
+ if(VOS_STATUS_SUCCESS != VosStatus)
+ {
+ // just print no action required
+ VOS_ASSERT(0);
+ }
//JEZ100809: While an skb is being handled by the kernel, is "skb->dev" de-ref'd?
skb->dev = (struct net_device *) gpBslctx->hdev;
@@ -1600,7 +1616,12 @@ static BOOL BslFindAndInitClientCtx
// init the PhyLinks queue to keep track of the assoc's of this client
VosStatus = vos_list_init( &pctx->PhyLinks );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ pctx->used = FALSE;
+ VOS_ASSERT(0);
+ return(FALSE);
+ }
*pctx_ = pctx;
@@ -1636,8 +1657,11 @@ static void BslReleaseClientCtx
// consume resulting HCI events, so after this we will not get any HCI events. we will also
// not see any FetchPktCB and RxPktCB. We can still expect TxCompletePktCB
VosStatus = WLANBAP_ReleaseHndl( pctx->bapHdl );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
-
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ // just print no action required
+ VOS_ASSERT(0);
+ }
// find and free all of the association contexts belonging to this app
while ( VOS_IS_STATUS_SUCCESS( VosStatus = vos_list_remove_front( &pctx->PhyLinks, &pLink ) ) )
@@ -1655,7 +1679,11 @@ static void BslReleaseClientCtx
// destroy the PhyLinks queue
VosStatus = vos_list_destroy( &pctx->PhyLinks );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ // just print no action required
+ VOS_ASSERT(0);
+ }
pctx->used = FALSE;
@@ -1744,9 +1772,6 @@ static BOOL BslFindAndInitPhyCtx
for ( j=0; j<WLANTL_MAX_AC; j++ )
{
hdd_list_init( &BslPhyLinkCtx[i].ACLTxQueue[j], HDD_TX_QUEUE_MAX_LEN );
- //VosStatus = vos_list_init( &BslPhyLinkCtx[i].ACLTxQueue[j] );
- //VosStatus = vos_list_init( &(BslPhyLinkCtx+i)->ACLTxQueue );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
}
// need to add this Phy context to the client list of associations,
@@ -3903,7 +3928,11 @@ static int BSL_Open( struct hci_dev *hdev )
for ( i=0; i<BSL_MAX_PHY_LINKS; i++ )
{
VosStatus = vos_list_insert_front( &BslPhyLinksDescPool, &BslPhyLinksDesc[i].node );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ VOS_ASSERT(0);
+ return 0;
+ }
}
// This is redundent. See the check above on (fp->private_data != NULL)
@@ -3985,8 +4014,11 @@ static int BSL_Close ( struct hci_dev *hdev )
}
VosStatus = vos_list_destroy( &BslPhyLinksDescPool );
- VOS_ASSERT(VOS_IS_STATUS_SUCCESS( VosStatus ) );
-
+ if (VOS_STATUS_SUCCESS != VosStatus)
+ {
+ VOS_ASSERT(0);
+ return FALSE;
+ }
bBslInited = FALSE;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index acdfd9a8ceaf..8facceb8c21a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1880,6 +1880,8 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
}
else
{
+ pConfig->countryCode[0] = pHddCtx->reg.alpha2[0];
+ pConfig->countryCode[1] = pHddCtx->reg.alpha2[1];
pConfig->ieee80211d = 0;
}
/*
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 500f73ad0f30..abb82d93b15a 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -6004,7 +6004,8 @@ static eHalStatus hdd_smeCloseSessionCallback(void *pContext)
clear_bit(SME_SESSION_OPENED, &pAdapter->event_flags);
-#ifndef WLAN_OPEN_SOURCE
+#if !defined (CONFIG_CNSS) && \
+ !defined (WLAN_OPEN_SOURCE)
/* need to make sure all of our scheduled work has completed.
* This callback is called from MC thread context, so it is safe to
* to call below flush workqueue API from here.
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index f8f7e6cd42de..bd10340037c5 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -800,10 +800,9 @@ void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
hddLog(VOS_TRACE_LEVEL_WARN, "%s TDLS not enabled, exiting!", __func__);
return;
}
-#ifdef WLAN_OPEN_SOURCE
- cancel_work_sync(&pHddTdlsCtx->implicit_setup);
- cancel_delayed_work_sync(&pHddCtx->tdls_scan_ctxt.tdls_scan_work);
-#endif
+
+ vos_flush_work(&pHddTdlsCtx->implicit_setup);
+ vos_flush_delayed_work(&pHddCtx->tdls_scan_ctxt.tdls_scan_work);
/* must stop timer here before freeing peer list, because peerIdleTimer is
part of peer list structure. */
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index ff0bede2fbae..784b37fed87f 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -1629,9 +1629,7 @@ VOS_STATUS hdd_wmm_adapter_close ( hdd_adapter_t* pAdapter )
#ifdef FEATURE_WLAN_CCX
hdd_wmm_disable_inactivity_timer(pQosContext);
#endif
-#ifdef WLAN_OPEN_SOURCE
- cancel_work_sync(&pQosContext->wmmAcSetupImplicitQos);
-#endif
+ vos_flush_work(&pQosContext->wmmAcSetupImplicitQos);
hdd_wmm_free_context(pQosContext);
}
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index a7005395ecaa..19fc0c29812e 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,8 +42,8 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 72
+#define QWLAN_VERSION_BUILD 73
-#define QWLAN_VERSIONSTR "4.0.0.72"
+#define QWLAN_VERSIONSTR "4.0.0.73"
#endif /* QWLAN_VERSION_H */
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 960917d8aec9..f5958a58a2e9 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -3029,6 +3029,7 @@ limSendSmeAPChannelSwitchResp(tpAniSirGlobal pMac,
{
tSirMsgQ mmhMsg;
tpSwitchChannelParams pSmeSwithChnlParams;
+ tANI_U8 channelId;
pSmeSwithChnlParams = (tSwitchChannelParams *)
vos_mem_malloc(sizeof(tSwitchChannelParams));
@@ -3045,11 +3046,35 @@ limSendSmeAPChannelSwitchResp(tpAniSirGlobal pMac,
vos_mem_copy(pSmeSwithChnlParams, pChnlParams,
sizeof(tSwitchChannelParams));
+ channelId = pSmeSwithChnlParams->channelNumber;
+
mmhMsg.type = eWNI_SME_CHANNEL_CHANGE_RSP;
mmhMsg.bodyptr = (void *)pSmeSwithChnlParams;
mmhMsg.bodyval = 0;
limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+ /*
+ * We should start beacon transmission only if the new
+ * channel after channel change is Non-DFS. For a DFS
+ * channel, PE will receive an explicit request from
+ * upper layers to start the beacon transmission .
+ */
+
+ if (NV_CHANNEL_DFS != vos_nv_getChannelEnabledState(channelId))
+ {
+ if (channelId == psessionEntry->currentOperChannel)
+ {
+ limApplyConfiguration(pMac,psessionEntry);
+ limSendBeaconInd(pMac, psessionEntry);
+ }
+ else
+ {
+ PELOG1(limLog(pMac, LOG1,
+ FL("Failed to Transmit Beacons on channel = %d"
+ "after AP channel change response"),
+ psessionEntry->bcnLen);)
+ }
+ }
return;
}
diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c
index 7b4a18a91f62..71c52932af3e 100644
--- a/CORE/SAP/src/sapApiLinkCntl.c
+++ b/CORE/SAP/src/sapApiLinkCntl.c
@@ -24,6 +24,7 @@
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
+
/*===========================================================================
s a p A p i L i n k C n t l . C
@@ -586,6 +587,20 @@ WLANSAP_RoamCallback
sapEvent.params = pCsrRoamInfo;
sapEvent.u1 = roamStatus;
sapEvent.u2 = roamResult;
+
+ /*
+ * If the Channel on which BSS started is a DFS channel
+ * then initialize the NOL list in the sapDfsInfo to
+ * a manitain a list of radar found DFS channels and
+ * to make sure that SAP does not use these channels
+ * for the next 30 mins.
+ */
+ if (vos_nv_getChannelEnabledState(sapContext->channel) ==
+ NV_CHANNEL_DFS)
+ {
+ sapInitDfsChannelNolList(sapContext);
+ }
+
vosStatus = sapFsm(sapContext, &sapEvent);
if(!VOS_IS_STATUS_SUCCESS(vosStatus))
{
diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c
index 7664e054c79e..4e479a75e15e 100644
--- a/CORE/SAP/src/sapFsm.c
+++ b/CORE/SAP/src/sapFsm.c
@@ -24,6 +24,7 @@
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
+
/*===========================================================================
s a p F s m . C
@@ -171,6 +172,91 @@ static inline void sapEventInit(ptWLAN_SAPEvent sapEvent)
sapEvent->u2 = 0;
}
+/*
+ * This Function Checks if a given channel is AVAILABLE or USABLE
+ * for DFS operation.
+ */
+static v_BOOL_t
+sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber)
+{
+ int i;
+ unsigned long timeElapsedSinceLastRadar,timeWhenRadarFound,currentTime = 0;
+
+ for (i =0 ; i< sapContext->SapDfsInfo.numCurrentRegDomainDfsChannels; i++)
+ {
+ if(sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .dfs_channel_number == channelNumber)
+ {
+ if ( (sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_status_flag == eSAP_DFS_CHANNEL_USABLE)
+ ||
+ (sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) )
+ {
+ /*
+ * Allow SAP operation on this channel
+ * either the DFS channel has not been used
+ * for SAP operation or it is available for
+ * SAP operation since it is past Non-Occupancy-Period
+ * so, return FALSE.
+ */
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d]: Channel = %d"
+ "Not in NOL LIST, CHANNEL AVAILABLE",
+ __func__, __LINE__, sapContext->SapDfsInfo
+ .sapDfsChannelNolList[i]
+ .dfs_channel_number);
+ return VOS_FALSE;
+ }
+ else if (sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE)
+ {
+ /*
+ * If a DFS Channel is UNAVAILABLE then
+ * check to see if it is past Non-occupancy-period
+ * of 30 minutes. If it is past 30 mins then
+ * mark the channel as AVAILABLE and return FALSE
+ * as the channel is not anymore in NON-Occupancy-Period.
+ */
+ timeWhenRadarFound = sapContext->SapDfsInfo
+ .sapDfsChannelNolList[i]
+ .radar_found_timestamp;
+ currentTime = vos_timer_get_system_time();
+ timeElapsedSinceLastRadar = currentTime - timeWhenRadarFound;
+ if (timeElapsedSinceLastRadar >= SAP_DFS_NON_OCCUPANCY_PERIOD)
+ {
+ sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE;
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d]:Channel=%d"
+ "Not in NOL LIST,CHANNEL AVAILABLE",
+ __func__, __LINE__, sapContext->SapDfsInfo
+ .sapDfsChannelNolList[i]
+ .dfs_channel_number);
+ return VOS_FALSE;
+ }
+ else
+ {
+ /*
+ * Channel is not still available for SAP operation
+ * so return TRUE; As the Channel is still
+ * in Non-occupancy-Period.
+ */
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d]:Channel=%d"
+ "still in NOL LIST,CHANNEL UNAVAILABLE",
+ __func__, __LINE__, sapContext->SapDfsInfo
+ .sapDfsChannelNolList[i]
+ .dfs_channel_number);
+ return VOS_TRUE;
+ }
+ }
+ }
+ }
+ return VOS_FALSE;
+}
+
/*==========================================================================
FUNCTION sapGotoChannelSel
@@ -557,7 +643,11 @@ sapSignalHDDevent
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Format the Start BSS Complete event to return... */
- VOS_ASSERT(sapContext->pfnSapEventCallback);
+ if (NULL == sapContext->pfnSapEventCallback)
+ {
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_FAILURE;
+ }
switch (sapHddevent)
{
@@ -888,7 +978,6 @@ sapFsm
VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
"ENTERTRED eSAP_DISCONNECTED-->eSAP_DFS_CAC_WAIT\n");
-
sapStartDfsCacTimer(sapContext);
}
else
@@ -1716,6 +1805,7 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext,tSirSmeDfsEventInd *dfs_event)
v_U8_t total_num_channels = 0;
v_U8_t target_channel = 0;
int i;
+ v_BOOL_t isChannelNol = VOS_FALSE;
if (NULL == sapContext || NULL == dfs_event)
{
@@ -1759,6 +1849,30 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext,tSirSmeDfsEventInd *dfs_event)
numAChannels = (total_num_channels - numGChannels);
/*
+ * Mark the current channel on which Radar is found
+ * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE.
+ */
+
+ for (i = 0; i<= sapContext->SapDfsInfo.numCurrentRegDomainDfsChannels; i++)
+ {
+ if (sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .dfs_channel_number ==
+ dfs_event->ieee_chan_number)
+ {
+ // Capture the Radar Found timestamp on the Current Channel in ms.
+ sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_found_timestamp = vos_timer_get_system_time();
+ // Mark the Channel to be UNAVAILABLE for next 30 mins.
+ sapContext->SapDfsInfo.sapDfsChannelNolList[i]
+ .radar_status_flag = eSAP_DFS_CHANNEL_UNAVAILABLE;
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+ "%s[%d]: Channel = %d Added to NOL LIST",
+ __func__, __LINE__, dfs_event->ieee_chan_number);
+ }
+ }
+
+ /*
* (1) skip static turbo channel as it will require STA to be in
* static turbo to work.
* (2) skip channel which's marked with radar detction
@@ -1767,13 +1881,41 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext,tSirSmeDfsEventInd *dfs_event)
* (5) Create the available channel list with the above rules
*/
- for(i = 0, available_chan_count = 0; i<= total_num_channels; i++)
+ for (i = 0, available_chan_count = 0; i< total_num_channels; i++)
{
if (sapContext->SapAllChnlList.channelList[i] ==
dfs_event->ieee_chan_number)
{
continue;//skip the channel on which radar is found
}
+
+ /*
+ * Now Check if the channel is DFS and if
+ * the channel is not in NOL list and add
+ * it available_chan_idx otherwise skip this
+ * channel index.
+ */
+
+ if (vos_nv_getChannelEnabledState(sapContext->SapAllChnlList
+ .channelList[i]) ==
+ NV_CHANNEL_DFS)
+ {
+ isChannelNol = sapDfsIsChannelInNolList(sapContext,
+ sapContext->SapAllChnlList.channelList[i]);
+ if (VOS_TRUE == isChannelNol)
+ {
+ /*
+ * Skip this channel since it is still in
+ * DFS Non-Occupancy-Period which is 30 mins.
+ */
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d]: Channel = %d Present in NOL LIST",
+ __func__, __LINE__,
+ sapContext->SapAllChnlList.channelList[i]);
+
+ continue;
+ }
+ }
available_chan_idx[available_chan_count++] =
sapContext->SapAllChnlList.channelList[i];
}
@@ -1849,6 +1991,8 @@ void sapDfsCacTimerCallback(void *data)
int sapStartDfsCacTimer(ptSapContext sapContext)
{
VOS_STATUS status;
+ v_U32_t cacTimeOut;
+ v_REGDOMAIN_t regDomain;
if (sapContext == NULL)
{
return 0;
@@ -1861,12 +2005,20 @@ int sapStartDfsCacTimer(ptSapContext sapContext)
*/
return 2;
}
+ cacTimeOut = DEFAULT_CAC_TIMEOUT;
+ vos_nv_getRegDomainFromCountryCode(&regDomain,
+ sapContext->csrRoamProfile.countryCode, COUNTRY_QUERY);
+ if ((regDomain == REGDOMAIN_ETSI) &&
+ (IS_ETSI_WEATHER_CH(sapContext->SapDfsInfo.target_channel)))
+ {
+ cacTimeOut = ETSI_WEATHER_CH_CAC_TIMEOUT;
+ }
vos_timer_init(&sapContext->SapDfsInfo.sap_dfs_cac_timer,
VOS_TIMER_TYPE_SW,
sapDfsCacTimerCallback, (v_PVOID_t)sapContext);
/*Start the CAC timer for 60 Seconds*/
- status = vos_timer_start(&sapContext->SapDfsInfo.sap_dfs_cac_timer, 60000);
+ status = vos_timer_start(&sapContext->SapDfsInfo.sap_dfs_cac_timer, cacTimeOut);
if (status == VOS_STATUS_SUCCESS)
{
sapContext->SapDfsInfo.is_dfs_cac_timer_running = VOS_TRUE;
@@ -1877,3 +2029,48 @@ int sapStartDfsCacTimer(ptSapContext sapContext)
return 0;
}
}
+
+/*
+ * This function initializes the NOL list
+ * parameters required to track the radar
+ * found DFS channels in the current Reg. Domain .
+ */
+VOS_STATUS sapInitDfsChannelNolList(ptSapContext sapContext)
+{
+ v_U8_t count = 0;
+ int i;
+ if (NULL == sapContext)
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ "Invalid sapContext pointer on sapInitDfsChannelNolList");
+ return VOS_STATUS_E_FAULT;
+ }
+ for ( i = RF_CHAN_36; i <= RF_CHAN_165; i++ )
+ {
+ if ( regChannels[i].enabled == NV_CHANNEL_DFS )
+ {
+ sapContext->SapDfsInfo.sapDfsChannelNolList[count]
+ .dfs_channel_number = rfChannels[i].channelNum;
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d] CHANNEL = %d", __func__, __LINE__,
+ sapContext->SapDfsInfo
+ .sapDfsChannelNolList[count].dfs_channel_number);
+
+ sapContext->SapDfsInfo.sapDfsChannelNolList[count]
+ .radar_status_flag = eSAP_DFS_CHANNEL_USABLE;
+ sapContext->SapDfsInfo.sapDfsChannelNolList[count]
+ .radar_found_timestamp = 0;
+ count++;
+ }
+ }
+ sapContext->SapDfsInfo.numCurrentRegDomainDfsChannels = count;
+
+ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
+ "%s[%d] NUMBER OF DFS CHANNELS = %d",
+ __func__, __LINE__,
+ sapContext->SapDfsInfo.numCurrentRegDomainDfsChannels);
+
+ return VOS_STATUS_SUCCESS;
+}
+
diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h
index 248614ac45b0..ebf51b3915ab 100644
--- a/CORE/SAP/src/sapInternal.h
+++ b/CORE/SAP/src/sapInternal.h
@@ -24,6 +24,7 @@
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
+
#ifndef WLAN_QCT_WLANSAP_INTERNAL_H
#define WLAN_QCT_WLANSAP_INTERNAL_H
@@ -89,6 +90,9 @@ when who what, where, why
/*----------------------------------------------------------------------------
* Defines
* -------------------------------------------------------------------------*/
+//DFS Non Occupancy Period =30 minutes, in milliseconds
+#define SAP_DFS_NON_OCCUPANCY_PERIOD (30 * 60 * 1000 )
+
#define SAP_DEBUG
// Used to enable or disable security on the BT-AMP link
#define WLANSAP_SECURITY_ENABLED_STATE VOS_TRUE
@@ -99,6 +103,10 @@ when who what, where, why
//MAC Address length
#define ANI_EAPOL_KEY_RSN_NONCE_SIZE 32
+#define IS_ETSI_WEATHER_CH(_ch) ((_ch >= 120) && (_ch <= 130))
+#define DEFAULT_CAC_TIMEOUT (60 * 1000) //msecs - 1 min
+#define ETSI_WEATHER_CH_CAC_TIMEOUT (10 * 60 * 1000) //msecs - 10 min
+
extern sRegulatoryChannel *regChannels;
extern const tRfChannelProps rfChannels[NUM_RF_CHANNELS];
@@ -138,6 +146,18 @@ typedef struct sSapQosCfg {
v_U8_t WmmIsEnabled;
} tSapQosCfg;
+typedef enum {
+ eSAP_DFS_CHANNEL_USABLE,
+ eSAP_DFS_CHANNEL_AVAILABLE,
+ eSAP_DFS_CHANNEL_UNAVAILABLE
+}eSapDfsChanStatus_t;
+
+typedef struct sSapDfsNolInfo {
+ v_U8_t dfs_channel_number;
+ eSapDfsChanStatus_t radar_status_flag;
+ unsigned long radar_found_timestamp;
+}tSapDfsNolInfo;
+
typedef struct sSapDfsInfo {
vos_timer_t sap_dfs_cac_timer;
v_U8_t sap_radar_found_status;
@@ -155,6 +175,9 @@ typedef struct sSapDfsInfo {
* generation and transmission
*/
v_U8_t csaIERequired;
+ v_U8_t numCurrentRegDomainDfsChannels;
+ tSapDfsNolInfo sapDfsChannelNolList[NUM_5GHZ_CHANNELS];
+
}tSapDfsInfo;
typedef struct sSapContext {
@@ -821,6 +844,9 @@ SIDE EFFECTS
v_U8_t
sapIndicateRadar(ptSapContext sapContext,tSirSmeDfsEventInd *dfs_event);
+VOS_STATUS
+sapInitDfsChannelNolList(ptSapContext sapContext);
+
#ifdef __cplusplus
}
#endif
diff --git a/CORE/SERVICES/COMMON/ol_htt_rx_api.h b/CORE/SERVICES/COMMON/ol_htt_rx_api.h
index 8d046c08d4b8..bb867d642841 100644
--- a/CORE/SERVICES/COMMON/ol_htt_rx_api.h
+++ b/CORE/SERVICES/COMMON/ol_htt_rx_api.h
@@ -533,6 +533,25 @@ htt_rx_msdu_actions(
int *forward,
int *inspect);
+/**
+ * @brief Get the key id sent in IV of the frame
+ * @details
+ * Provide the key index octet which is taken from IV.
+ * This is valid only for the first MSDU.
+ *
+ * @param pdev - the HTT instance the rx data was received on
+ * @param msdu_desc - the abstract descriptor for the MSDU in question
+ * @key_id - Key id octet
+ * @return indication of whether key id access is successful
+ * A_TRUE - Success
+ * A_FALSE - if this is not first msdu
+ */
+extern a_bool_t
+(*htt_rx_msdu_desc_key_id)(
+ htt_pdev_handle pdev,
+ void *mpdu_desc,
+ u_int8_t *key_id);
+
/*====================== rx MSDU + descriptor delivery ======================*/
/**
diff --git a/CORE/SERVICES/COMMON/wdi_out.h b/CORE/SERVICES/COMMON/wdi_out.h
index 726ad369329a..c7a67676af31 100644
--- a/CORE/SERVICES/COMMON/wdi_out.h
+++ b/CORE/SERVICES/COMMON/wdi_out.h
@@ -450,6 +450,8 @@ void wdi_out_rx_err_statistics(ol_pdev_handle pdev,
* one of the fragments that when reassembled, constitute the rx frame
* @param err_type - what kind of error occurred
* @param rx_frame - the rx frame that had an error
+ * @pn - Packet sequence number
+ * @key_id - Key index octet received in IV of the frame
*/
void
wdi_out_rx_err(
@@ -459,7 +461,9 @@ wdi_out_rx_err(
int tid,
u_int32_t tsf32,
enum ol_rx_err_type err_type,
- adf_nbuf_t rx_frame);
+ adf_nbuf_t rx_frame,
+ u_int64_t *pn,
+ u_int8_t key_id);
enum ol_rx_notify_type {
OL_RX_NOTIFY_IPV4_IGMP,
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index 594d6679dabe..7e00d21e27f8 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -2936,6 +2936,9 @@ typedef enum {
* thought to be gone. */
WMI_VDEV_PARAM_IBSS_MAX_BCN_LOST_MS,
+ /** max rate in kpbs, transmit rate can't go beyond it */
+ WMI_VDEV_PARAM_MAX_RATE,
+
} WMI_VDEV_PARAM;
enum wmi_pkt_type {
diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h
index 04d63e61281d..f7f98447a234 100644
--- a/CORE/SERVICES/COMMON/wmi_version.h
+++ b/CORE/SERVICES/COMMON/wmi_version.h
@@ -35,7 +35,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_ 31
+#define __WMI_REVISION_ 32
/** The Version Namespace should not be normally changed. Only
* host and firmware of the same WMI namespace will work
diff --git a/CORE/SERVICES/HIF/PCIe/ar6320def.h b/CORE/SERVICES/HIF/PCIe/ar6320def.h
index d9de7b513298..a5c2f5bf1d80 100644
--- a/CORE/SERVICES/HIF/PCIe/ar6320def.h
+++ b/CORE/SERVICES/HIF/PCIe/ar6320def.h
@@ -116,6 +116,8 @@
#define AR6320_RX_MPDU_START_0_SEQ_NUM_MASK 0x0fff0000
#define AR6320_RX_MPDU_START_2_PN_47_32_LSB 0
#define AR6320_RX_MPDU_START_2_PN_47_32_MASK 0x0000ffff
+#define AR6320_RX_MSDU_END_1_KEY_ID_OCT_MASK 0x000000ff
+#define AR6320_RX_MSDU_END_1_KEY_ID_OCT_LSB 0
#define AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB 16
#define AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK 0xffff0000
#define AR6320_RX_MSDU_END_4_LAST_MSDU_LSB 15
@@ -372,6 +374,8 @@ struct targetdef_s ar6320_targetdef = {
.d_RX_MPDU_START_0_SEQ_NUM_LSB = AR6320_RX_MPDU_START_0_SEQ_NUM_LSB,
.d_RX_MPDU_START_2_PN_47_32_LSB = AR6320_RX_MPDU_START_2_PN_47_32_LSB,
.d_RX_MPDU_START_2_PN_47_32_MASK = AR6320_RX_MPDU_START_2_PN_47_32_MASK,
+ .d_RX_MSDU_END_1_KEY_ID_OCT_MASK = AR6320_RX_MSDU_END_1_KEY_ID_OCT_MASK,
+ .d_RX_MSDU_END_1_KEY_ID_OCT_LSB = AR6320_RX_MSDU_END_1_KEY_ID_OCT_LSB,
.d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK = AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK,
.d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB = AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB,
.d_RX_MSDU_END_4_LAST_MSDU_MASK = AR6320_RX_MSDU_END_4_LAST_MSDU_MASK,
diff --git a/CORE/SERVICES/HIF/PCIe/ar9888def.h b/CORE/SERVICES/HIF/PCIe/ar9888def.h
index 2309a44d4f1c..512abf65df1a 100644
--- a/CORE/SERVICES/HIF/PCIe/ar9888def.h
+++ b/CORE/SERVICES/HIF/PCIe/ar9888def.h
@@ -119,6 +119,8 @@
#define AR9888_RX_MPDU_START_0_SEQ_NUM_MASK 0x0fff0000
#define AR9888_RX_MPDU_START_2_PN_47_32_LSB 0
#define AR9888_RX_MPDU_START_2_PN_47_32_MASK 0x0000ffff
+#define AR9888_RX_MSDU_END_1_KEY_ID_OCT_MASK 0x000000ff
+#define AR9888_RX_MSDU_END_1_KEY_ID_OCT_LSB 0
#define AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB 16
#define AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK 0xffff0000
#define AR9888_RX_MSDU_END_4_LAST_MSDU_LSB 15
@@ -374,6 +376,8 @@ struct targetdef_s ar9888_targetdef = {
.d_RX_MPDU_START_2_PN_47_32_MASK = AR9888_RX_MPDU_START_2_PN_47_32_MASK,
.d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK = AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK,
.d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB = AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB,
+ .d_RX_MSDU_END_1_KEY_ID_OCT_MASK = AR9888_RX_MSDU_END_1_KEY_ID_OCT_MASK,
+ .d_RX_MSDU_END_1_KEY_ID_OCT_LSB = AR9888_RX_MSDU_END_1_KEY_ID_OCT_LSB,
.d_RX_MSDU_END_4_LAST_MSDU_MASK = AR9888_RX_MSDU_END_4_LAST_MSDU_MASK,
.d_RX_MSDU_END_4_LAST_MSDU_LSB = AR9888_RX_MSDU_END_4_LAST_MSDU_LSB,
.d_RX_ATTENTION_0_MCAST_BCAST_MASK = AR9888_RX_ATTENTION_0_MCAST_BCAST_MASK,
diff --git a/CORE/SERVICES/HIF/PCIe/regtable.h b/CORE/SERVICES/HIF/PCIe/regtable.h
index 7f4573258dce..76320fca502b 100644
--- a/CORE/SERVICES/HIF/PCIe/regtable.h
+++ b/CORE/SERVICES/HIF/PCIe/regtable.h
@@ -124,6 +124,8 @@ typedef struct targetdef_s {
u_int32_t d_RX_MPDU_START_2_PN_47_32_MASK;
u_int32_t d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK;
u_int32_t d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB;
+ u_int32_t d_RX_MSDU_END_1_KEY_ID_OCT_MASK;
+ u_int32_t d_RX_MSDU_END_1_KEY_ID_OCT_LSB;
u_int32_t d_RX_MSDU_END_4_LAST_MSDU_MASK;
u_int32_t d_RX_MSDU_END_4_LAST_MSDU_LSB;
u_int32_t d_RX_ATTENTION_0_MCAST_BCAST_MASK;
@@ -318,6 +320,8 @@ typedef struct targetdef_s {
#define RX_MPDU_START_0_SEQ_NUM_LSB (pdev->targetdef->d_RX_MPDU_START_0_SEQ_NUM_LSB)
#define RX_MPDU_START_2_PN_47_32_LSB (pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_LSB)
#define RX_MPDU_START_2_PN_47_32_MASK (pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_MASK)
+#define RX_MSDU_END_1_KEY_ID_OCT_MASK (pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_MASK)
+#define RX_MSDU_END_1_KEY_ID_OCT_LSB (pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_LSB)
#define RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK (pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK)
#define RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB (pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB)
#define RX_MSDU_END_4_LAST_MSDU_MASK (pdev->targetdef->d_RX_MSDU_END_4_LAST_MSDU_MASK)
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 207cd2910088..a83b9939f08a 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -535,13 +535,12 @@ static int wma_vdev_start_resp_handler(void *handle, u_int8_t *cmd_param_info,
params->chainMask = resp_event->chain_mask;
params->smpsMode = host_map_smps_mode(resp_event->smps_mode);
params->status = resp_event->status;
- if (resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT &&
- (iface->type == WMI_VDEV_TYPE_AP)) {
- wmi_unified_vdev_up_send(wma->wmi_handle,
- resp_event->vdev_id,
- iface->aid,
- iface->bssid);
- }
+ /*
+ * Marking the VDEV UP STATUS to FALSE
+ * since, VDEV RESTART will do a VDEV DOWN
+ * in the firmware.
+ */
+ iface->vdev_up = FALSE;
wma_send_msg(wma, WDA_SWITCH_CHANNEL_RSP, (void *)params, 0);
} else if (req_msg->msg_type == WDA_ADD_BSS_REQ) {
tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data;
@@ -13597,13 +13596,11 @@ VOS_STATUS wma_stop(v_VOID_t *vos_ctx, tANI_U8 reason)
}
#endif
-#ifdef WLAN_OPEN_SOURCE
if (wma_handle->ack_work_ctx) {
- cancel_work_sync(&wma_handle->ack_work_ctx->ack_cmp_work);
+ vos_flush_work(&wma_handle->ack_work_ctx->ack_cmp_work);
adf_os_mem_free(wma_handle->ack_work_ctx);
wma_handle->ack_work_ctx = NULL;
}
-#endif
#ifdef QCA_WIFI_ISOC
wma_hal_stop_isoc(wma_handle);
@@ -15998,3 +15995,43 @@ VOS_STATUS WMA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
snprintf(pVersion, versionBufferSize, "%x", (unsigned int)wma_handle->target_fw_version);
return VOS_STATUS_SUCCESS;
}
+
+void ol_rx_err(ol_pdev_handle pdev, u_int8_t vdev_id,
+ u_int8_t *peer_mac_addr, int tid, u_int32_t tsf32,
+ enum ol_rx_err_type err_type, adf_nbuf_t rx_frame,
+ u_int64_t *pn, u_int8_t key_id)
+{
+ void *g_vos_ctx = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
+ tp_wma_handle wma = vos_get_context(VOS_MODULE_ID_WDA, g_vos_ctx);
+ tpSirSmeMicFailureInd mic_err_ind;
+ struct ether_header *eth_hdr;
+
+ if (err_type != OL_RX_ERR_TKIP_MIC)
+ return;
+
+ if (adf_nbuf_len(rx_frame) < sizeof(*eth_hdr))
+ return;
+ eth_hdr = (struct ether_header *) adf_nbuf_data(rx_frame);
+ mic_err_ind = adf_os_mem_alloc(NULL, sizeof(*mic_err_ind));
+ if (!mic_err_ind) {
+ WMA_LOGE("%s: Failed to allocate memory for MIC indication message", __func__);
+ return;
+ }
+ adf_os_mem_set((void *) mic_err_ind, 0, sizeof(*mic_err_ind));
+
+ mic_err_ind->messageType = eWNI_SME_MIC_FAILURE_IND;
+ mic_err_ind->length = sizeof(*mic_err_ind);
+ adf_os_mem_copy(mic_err_ind->bssId,
+ (v_MACADDR_t *) wma->interfaces[vdev_id].bssid,
+ sizeof(tSirMacAddr));
+ adf_os_mem_copy(mic_err_ind->info.taMacAddr,
+ (v_MACADDR_t *) peer_mac_addr, sizeof(tSirMacAddr));
+ adf_os_mem_copy(mic_err_ind->info.srcMacAddr,
+ (v_MACADDR_t *) eth_hdr->ether_shost, sizeof(tSirMacAddr));
+ adf_os_mem_copy(mic_err_ind->info.dstMacAddr,
+ (v_MACADDR_t *) eth_hdr->ether_dhost, sizeof(tSirMacAddr));
+ mic_err_ind->info.keyId = key_id;
+ mic_err_ind->info.multicast = IEEE80211_IS_MULTICAST(eth_hdr->ether_dhost);
+ adf_os_mem_copy(mic_err_ind->info.TSC, pn, SIR_CIPHER_SEQ_CTR_SIZE);
+ wma_send_msg(wma, SIR_HAL_MIC_FAILURE_IND, (void *) mic_err_ind, 0);
+}
diff --git a/CORE/SERVICES/WMI/wmi_unified.c b/CORE/SERVICES/WMI/wmi_unified.c
index ea96411f46e0..991f07fa8c5b 100644
--- a/CORE/SERVICES/WMI/wmi_unified.c
+++ b/CORE/SERVICES/WMI/wmi_unified.c
@@ -351,9 +351,8 @@ wmi_unified_detach(struct wmi_unified* wmi_handle)
{
#ifndef QCA_WIFI_ISOC
wmi_buf_t buf;
-#ifdef WLAN_OPEN_SOURCE
- cancel_work_sync(&wmi_handle->rx_event_work);
-#endif
+
+ vos_flush_work(&wmi_handle->rx_event_work);
adf_os_spin_lock_bh(&wmi_handle->eventq_lock);
buf = adf_nbuf_queue_remove(&wmi_handle->event_queue);
while (buf) {
diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h
index a68d2d1527d1..a6f037873fa2 100644
--- a/CORE/VOSS/inc/vos_api.h
+++ b/CORE/VOSS/inc/vos_api.h
@@ -324,4 +324,8 @@ VOS_STATUS vos_wlanRestart(void);
*/
v_VOID_t vos_fwDumpReq(tANI_U32 cmd, tANI_U32 arg1, tANI_U32 arg2,
tANI_U32 arg3, tANI_U32 arg4);
+
+v_VOID_t vos_flush_work(v_VOID_t *work);
+v_VOID_t vos_flush_delayed_work(v_VOID_t *dwork);
+
#endif // if !defined __VOS_NVITEM_H
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 9d0e324e4f08..dd17d6526bb1 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -68,6 +68,9 @@
#include "wlan_hdd_main.h"
#include <linux/vmalloc.h>
#include "wlan_hdd_cfg80211.h"
+#ifdef CONFIG_CNSS
+#include <net/cnss.h>
+#endif
#include "sapApi.h"
@@ -2483,3 +2486,21 @@ VOS_STATUS vos_get_vdev_types(tVOS_CON_MODE mode, tANI_U32 *type,
#endif
return status;
}
+
+v_VOID_t vos_flush_work(v_VOID_t *work)
+{
+#if defined (CONFIG_CNSS)
+ cnss_flush_work(work);
+#elif defined (WLAN_OPEN_SOURCE)
+ cancel_work_sync(work);
+#endif
+}
+
+v_VOID_t vos_flush_delayed_work(v_VOID_t *dwork)
+{
+#if defined (CONFIG_CNSS)
+ cnss_flush_delayed_work(dwork);
+#elif defined (WLAN_OPEN_SOURCE)
+ cancel_delayed_work_sync(dwork);
+#endif
+}