summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c47
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.h1
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_desc.c9
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c42
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c19
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_internal.h7
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h10
-rw-r--r--CORE/DXE/src/wlan_qct_dxe.c62
-rw-r--r--CORE/HDD/inc/qc_sap_ioctl.h1
-rw-r--r--CORE/HDD/inc/wlan_hdd_assoc.h2
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h39
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h11
-rw-r--r--CORE/HDD/inc/wlan_hdd_p2p.h1
-rw-r--r--CORE/HDD/inc/wlan_hdd_tx_rx.h4
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c5
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c44
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c19
-rw-r--r--CORE/HDD/src/wlan_hdd_ftm.c10
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c17
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c70
-rw-r--r--CORE/HDD/src/wlan_hdd_p2p.c313
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c57
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c8
-rw-r--r--CORE/HDD/src/wlan_hdd_wmm.c9
-rw-r--r--CORE/MAC/inc/qwlan_version.h6
-rw-r--r--CORE/MAC/inc/sirApi.h6
-rw-r--r--CORE/MAC/src/pe/lim/limFT.c2
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c6
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c24
-rw-r--r--CORE/MAC/src/pe/lim/limScanResultUtils.c10
-rw-r--r--CORE/MAC/src/pe/lim/limSendSmeRspMessages.c1
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c26
-rw-r--r--CORE/SAP/src/sapModule.c11
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c7
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h7
-rw-r--r--CORE/SERVICES/COMMON/ol_htt_tx_api.h29
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h10
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_osif_api.h14
-rw-r--r--CORE/SERVICES/WMA/wma.c134
-rw-r--r--CORE/SERVICES/WMA/wma.h12
-rw-r--r--CORE/SME/inc/csrInternal.h6
-rw-r--r--CORE/SME/inc/sme_Api.h10
-rw-r--r--CORE/SME/src/QoS/sme_Qos.c2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c47
-rw-r--r--CORE/SME/src/csr/csrApiScan.c7
-rw-r--r--CORE/SME/src/csr/csrUtil.c12
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c23
-rw-r--r--CORE/SME/src/sme_common/sme_FTApi.c4
-rw-r--r--CORE/SYS/common/src/wlan_qct_sys.c25
-rw-r--r--CORE/SYS/legacy/src/platform/src/VossWrapper.c17
-rw-r--r--CORE/SYS/legacy/src/utils/src/macTrace.c11
-rw-r--r--CORE/TL/inc/wlan_qct_tl.h6
-rw-r--r--CORE/TL/src/wlan_qct_tl.c41
-rw-r--r--CORE/UTILS/FWLOG/dbglog_host.c4
-rw-r--r--CORE/VOSS/inc/vos_packet.h7
-rw-r--r--CORE/VOSS/src/vos_api.c24
-rw-r--r--CORE/VOSS/src/vos_nvitem.c8
-rw-r--r--CORE/VOSS/src/vos_packet.c15
-rw-r--r--CORE/VOSS/src/vos_timer.c10
-rw-r--r--CORE/WDA/src/wlan_qct_wda.c17
-rw-r--r--CORE/WDA/src/wlan_qct_wda_ds.c5
-rw-r--r--CORE/WDI/WPAL/src/wlan_qct_pal_packet.c22
-rwxr-xr-xfirmware_bin/WCNSS_qcom_cfg.ini8
64 files changed, 1069 insertions, 378 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 1c41e725f9a1..d13287ebb76c 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -1365,6 +1365,9 @@ VOS_STATUS WLANTL_RegisterMgmtFrmClient(void *vos_ctx,
VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pGetRssiReq)
{
tp_wma_handle wma_handle;
+ struct txrx_tl_shim_ctx *tl_shim;
+ struct tlshim_sta_info *sta_info;
+ v_S7_t first_rssi;
ENTER();
@@ -1374,12 +1377,26 @@ VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pG
return VOS_STATUS_E_FAILURE;
}
+ tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx);
+ if (!tl_shim) {
+ TLSHIM_LOGE("tl_shim is NULL");
+ return VOS_STATUS_E_FAULT;
+ }
+
+ if (sta_id >= WLAN_MAX_STA_COUNT) {
+ TLSHIM_LOGE("Invalid sta id :%d", sta_id);
+ return VOS_STATUS_E_INVAL;
+ }
+
+ sta_info = &tl_shim->sta_info[sta_id];
+ first_rssi = sta_info->first_rssi;
+
if(VOS_STATUS_SUCCESS !=
- wma_send_snr_request(wma_handle, pGetRssiReq))
- {
+ wma_send_snr_request(wma_handle, pGetRssiReq, first_rssi)) {
TLSHIM_LOGE("Failed to Trigger wma stats request");
return VOS_STATUS_E_FAILURE;
}
+
/* dont send success, otherwise call back
* will released with out values */
return VOS_STATUS_E_BUSY;
@@ -1493,6 +1510,7 @@ VOS_STATUS WLANTL_ClearSTAClient(void *vos_ctx, u_int8_t sta_id)
adf_os_spin_lock_bh(&tl_shim->sta_info[sta_id].stainfo_lock);
tl_shim->sta_info[sta_id].registered = 0;
tl_shim->sta_info[sta_id].data_rx = NULL;
+ tl_shim->sta_info[sta_id].first_rssi = 0;
adf_os_spin_unlock_bh(&tl_shim->sta_info[sta_id].stainfo_lock);
return VOS_STATUS_SUCCESS;
@@ -1536,6 +1554,7 @@ VOS_STATUS WLANTL_RegisterSTAClient(void *vos_ctx,
adf_os_spin_lock_bh(&sta_info->stainfo_lock);
sta_info->data_rx = rxcb;
sta_info->registered = true;
+ sta_info->first_rssi = rssi;
adf_os_spin_unlock_bh(&sta_info->stainfo_lock);
param.qos_capable = sta_desc->ucQosEnabled;
@@ -1760,7 +1779,9 @@ void *tl_shim_get_vdev_by_sta_id(void *vos_context, uint8_t sta_id)
v_BOOL_t WLANTL_GetTxResource
(
void *vos_context,
- uint8_t sta_id
+ uint8_t sta_id,
+ unsigned int low_watermark,
+ unsigned int high_watermark_offset
)
{
struct ol_txrx_peer_t *peer = NULL;
@@ -1776,7 +1797,9 @@ v_BOOL_t WLANTL_GetTxResource
return VOS_TRUE;
}
- return (v_BOOL_t)wdi_in_get_tx_resource(peer->vdev);
+ return (v_BOOL_t)wdi_in_get_tx_resource(peer->vdev,
+ low_watermark,
+ high_watermark_offset);
}
/*=============================================================================
@@ -1802,29 +1825,27 @@ v_BOOL_t WLANTL_GetTxResource
void WLANTL_TXFlowControlCb
(
void *tlContext,
+ v_U8_t peer_idx,
v_U8_t sessionId,
v_BOOL_t resume_tx
)
{
struct txrx_tl_shim_ctx *tl_shim;
- v_U8_t sta_loop;
WLANTL_TxFlowControlCBType flow_control_cb = NULL;
void *adpter_ctxt = NULL;
tl_shim = (struct txrx_tl_shim_ctx *)tlContext;
if (!tl_shim) {
+ TLSHIM_LOGE("%s, tl_shim is NULL", __func__);
/* Invalid instace */
return;
}
- for (sta_loop = 0; sta_loop < WLAN_MAX_STA_COUNT; sta_loop++) {
- if ((tl_shim->sta_info[sta_loop].sessionId == sessionId) &&
- (tl_shim->sta_info[sta_loop].flowControl))
- {
- flow_control_cb = tl_shim->sta_info[sta_loop].flowControl;
- adpter_ctxt = tl_shim->sta_info[sta_loop].adpaterCtxt;
- break;
- }
+ if ((peer_idx < WLAN_MAX_STA_COUNT) &&
+ (tl_shim->sta_info[peer_idx].sessionId == sessionId) &&
+ (tl_shim->sta_info[peer_idx].flowControl)) {
+ flow_control_cb = tl_shim->sta_info[peer_idx].flowControl;
+ adpter_ctxt = tl_shim->sta_info[peer_idx].adpaterCtxt;
}
if ((flow_control_cb) && (adpter_ctxt)) {
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
index 0530a8f61506..292b6f8875fd 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h
@@ -60,6 +60,7 @@ struct tlshim_sta_info {
v_U8_t sessionId;
void *adpaterCtxt;
#endif /* QCA_LL_TX_FLOW_CT */
+ v_S7_t first_rssi;
};
struct txrx_tl_shim_ctx {
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
index 2ca6b8bd5339..0cfb13947df9 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -282,11 +282,14 @@ void ol_tx_desc_frame_free_nonstd(
{
int mgmt_type;
ol_txrx_mgmt_tx_cb ota_ack_cb;
+ char *trace_str;
adf_os_atomic_init(&tx_desc->ref_cnt); /* clear the ref cnt */
#ifdef QCA_SUPPORT_SW_TXRX_ENCAP
OL_TX_RESTORE_HDR(tx_desc, (tx_desc->netbuf)); /* restore original hdr offset */
#endif
+ trace_str = (had_error) ? "OT:C:F:" : "OT:C:S:";
+ adf_nbuf_trace_update(tx_desc->netbuf, trace_str);
if (tx_desc->pkt_type == ol_tx_frm_no_free) {
/* free the tx desc but don't unmap or free the frame */
if (pdev->tx_data_callback.func) {
@@ -314,7 +317,8 @@ void ol_tx_desc_frame_free_nonstd(
/* free the netbuf */
adf_nbuf_set_next(tx_desc->netbuf, NULL);
adf_nbuf_tx_free(tx_desc->netbuf, had_error);
- } else if (tx_desc->pkt_type >= OL_TXRX_MGMT_TYPE_BASE) {
+ } else if ((tx_desc->pkt_type >= OL_TXRX_MGMT_TYPE_BASE) &&
+ (tx_desc->pkt_type != 0xff)) {
/* FIX THIS -
* The FW currently has trouble using the host's fragments table
* for management frames. Until this is fixed, rather than
@@ -327,7 +331,6 @@ void ol_tx_desc_frame_free_nonstd(
mgmt_type = tx_desc->pkt_type - OL_TXRX_MGMT_TYPE_BASE;
/*
- * KW# 6158
* we already checked the value when the mgmt frame was provided to the txrx layer.
* no need to check it a 2nd time.
*/
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
index 24337792928a..5518a6313367 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -109,6 +109,28 @@
#define OL_TX_TARGET_CREDIT_INCR_INT(pdev, delta) /* no-op */
#endif
+#ifdef QCA_LL_TX_FLOW_CT
+#define OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev) \
+do { \
+ struct ol_txrx_vdev_t *vdev; \
+ TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { \
+ if (adf_os_atomic_read(&vdev->os_q_paused)) { \
+ adf_os_spin_lock(&pdev->tx_mutex); \
+ if (pdev->tx_desc.num_free > vdev->tx_fl_hwm) { \
+ vdev->osif_flow_control_cb(vdev->osif_dev, \
+ vdev->last_real_peer->local_id, \
+ vdev->vdev_id, A_TRUE); \
+ adf_os_atomic_set(&vdev->os_q_paused, 0); \
+ } \
+ adf_os_spin_unlock(&pdev->tx_mutex); \
+ } \
+ } \
+} while(0)
+#else
+#define OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev)
+#endif /* QCA_LL_TX_FLOW_CT */
+
+
static inline u_int16_t
ol_tx_send_base(
struct ol_txrx_pdev_t *pdev,
@@ -212,6 +234,8 @@ ol_tx_send_nonstd(
failed = htt_tx_send_nonstd(
pdev->htt_pdev, msdu, id, pkt_type);
if (failed) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "Error: freeing tx frame after htt_tx failed");
OL_TX_TARGET_CREDIT_INCR_INT(pdev, msdu_credit_consumed);
ol_tx_desc_frame_free_nonstd(pdev, tx_desc, 1 /* had error */);
}
@@ -456,7 +480,6 @@ ol_tx_completion_handler(
u_int16_t tx_desc_id;
struct ol_tx_desc_t *tx_desc;
char *trace_str;
- struct ol_txrx_vdev_t *vdev;
uint32_t byte_cnt = 0;
union ol_tx_desc_list_elem_t *td_array = pdev->tx_desc.array;
@@ -518,19 +541,8 @@ ol_tx_completion_handler(
OL_TX_TARGET_CREDIT_ADJUST(num_msdus, pdev, NULL);
}
-#ifdef QCA_LL_TX_FLOW_CT
- adf_os_spin_lock(&pdev->tx_mutex);
- TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem)
- {
- if (vdev->os_q_paused &&
- (pdev->tx_desc.num_free > TXRX_LL_FLOW_CT_FREE_D_HWM)) {
- vdev->osif_flow_control_cb(vdev->osif_dev, vdev->vdev_id, A_TRUE);
- vdev->os_q_paused = A_FALSE;
- }
- }
- adf_os_spin_unlock(&pdev->tx_mutex);
-#endif /* QCA_LL_TX_FLOW_CT */
-
+ /* UNPAUSE OS Q */
+ OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev);
/* Do one shot statistics */
TXRX_STATS_UPDATE_TX_STATS(pdev, status, num_msdus, byte_cnt);
}
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index a5acafe26aa6..b104633cf8a9 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -838,11 +838,11 @@ ol_txrx_vdev_attach(
&vdev->ll_pause.timer,
ol_tx_vdev_ll_pause_queue_send,
vdev);
-
-#ifdef QCA_LL_TX_FLOW_CT
- vdev->os_q_paused = A_FALSE;
+ adf_os_atomic_init(&vdev->os_q_paused);
+ adf_os_atomic_set(&vdev->os_q_paused, 0);
+ vdev->tx_fl_lwm = 0;
+ vdev->tx_fl_hwm = 0;
vdev->osif_flow_control_cb = NULL;
-#endif /* QCA_LL_TX_FLOW_CT */
/* add this vdev into the pdev's list */
TAILQ_INSERT_TAIL(&pdev->vdev_list, vdev, vdev_list_elem);
@@ -1957,14 +1957,17 @@ ol_vdev_rx_set_intrabss_fwd(
#ifdef QCA_LL_TX_FLOW_CT
a_bool_t
ol_txrx_get_tx_resource(
- ol_txrx_vdev_handle vdev
+ ol_txrx_vdev_handle vdev,
+ unsigned int low_watermark,
+ unsigned int high_watermark_offset
)
{
adf_os_spin_lock_bh(&vdev->pdev->tx_mutex);
- if ((vdev->pdev->tx_desc.num_free) <
- TXRX_LL_FLOW_CT_FREE_D_LWM) {
+ if (vdev->pdev->tx_desc.num_free < (u_int16_t)low_watermark) {
+ vdev->tx_fl_lwm = (u_int16_t)low_watermark;
+ vdev->tx_fl_hwm = (u_int16_t)(low_watermark + high_watermark_offset);
/* Not enough free resource, stop TX OS Q */
- vdev->os_q_paused = A_TRUE;
+ adf_os_atomic_set(&vdev->os_q_paused, 1);
adf_os_spin_unlock_bh(&vdev->pdev->tx_mutex);
return A_FALSE;
}
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h b/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
index 43894a50fece..6b8a6f6b85fa 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h
@@ -667,11 +667,4 @@ do {
#define QCA_SUPPORT_TXRX_VDEV_LL_TXQ
#endif
-#ifdef QCA_LL_TX_FLOW_CT
-#define TXRX_LL_FLOW_CT_FREE_Q_LWM 100
-#define TXRX_LL_FLOW_CT_FREE_Q_HWM 300
-#define TXRX_LL_FLOW_CT_FREE_D_LWM 500
-#define TXRX_LL_FLOW_CT_FREE_D_HWM 550
-#endif /* QCA_LL_TX_FLOW_CT */
-
#endif /* _OL_TXRX_INTERNAL__H_ */
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
index 66cf4a31576e..bee76236be29 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h
@@ -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.
*
@@ -754,10 +754,10 @@ struct ol_txrx_vdev_t {
adf_os_timer_t timer;
} ll_pause;
a_bool_t disable_intrabss_fwd;
-#ifdef QCA_LL_TX_FLOW_CT
- a_bool_t os_q_paused;
- ol_txrx_tx_fc_fp osif_flow_control_cb;
-#endif /* QCA_LL_TX_FLOW_CT */
+ adf_os_atomic_t os_q_paused;
+ u_int16_t tx_fl_lwm;
+ u_int16_t tx_fl_hwm;
+ ol_txrx_tx_flow_control_fp osif_flow_control_cb;
};
struct ol_rx_reorder_array_elem_t {
diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c
index b2f71097c1e8..487143a2b88a 100644
--- a/CORE/DXE/src/wlan_qct_dxe.c
+++ b/CORE/DXE/src/wlan_qct_dxe.c
@@ -1955,13 +1955,17 @@ void dxeRXPacketAvailableCB
dxeCtxt->freeRXPacket = freePacket;
/* Serialize RX Packet Available message upon RX thread */
- HDXE_ASSERT(NULL != dxeCtxt->rxPktAvailMsg);
-
+ if (NULL == dxeCtxt->rxPktAvailMsg)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "DXE NULL pkt");
+ HDXE_ASSERT(0);
+ return;
+ }
status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
dxeCtxt->rxPktAvailMsg);
if(eWLAN_PAL_STATUS_SUCCESS != status)
{
- HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status);
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
"dxeRXPacketAvailableCB serialize fail");
}
@@ -2068,8 +2072,13 @@ static wpt_status dxeRXFrameSingleBufferAlloc
status = wpalAllocateShadowRxFrame(currentPalPacketBuffer,
&physicalAddressPCIe,
&virtualAddressPCIe);
- HDXE_ASSERT(0 != physicalAddressPCIe);
- HDXE_ASSERT(0 != virtualAddressPCIe);
+ if((0 == physicalAddressPCIe) || (0 = virtualAddressPCIe))
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
+ "RX NULL Shadow Memory");
+ HDXE_ASSERT(0);
+ return eWLAN_PAL_STATUS_E_FAULT;
+ }
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED,
"RX Shadow Memory Va 0x%x, Pa 0x%x",
virtualAddressPCIe, physicalAddressPCIe);
@@ -3027,12 +3036,18 @@ static void dxeRXISR
}
/* Serialize RX Ready interrupt upon RX thread */
- HDXE_ASSERT(NULL != dxeCtxt->rxIsrMsg);
+ if(NULL == dxeCtxt->rxIsrMsg)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "dxeRXFrameReadyISR NULL message");
+ HDXE_ASSERT(0);
+ return;
+ }
+
status = wpalPostRxMsg(WDI_GET_PAL_CTX(),
dxeCtxt->rxIsrMsg);
if(eWLAN_PAL_STATUS_SUCCESS != status)
{
- HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status);
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
"dxeRXFrameReadyISR interrupt serialize fail");
}
@@ -3141,8 +3156,21 @@ static wpt_status dxeTXPushFrame
sourcePhysicalAddress = (void *)frameVector.frg[fragCount].pa;
xferSize = frameVector.frg[fragCount].size;
fragCount++;
- HDXE_ASSERT(0 != xferSize);
- HDXE_ASSERT(NULL != sourcePhysicalAddress);
+ if(0 == xferSize)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "dxeTXPushFrame invalid transfer size");
+
+ HDXE_ASSERT(0);
+ return eWLAN_PAL_STATUS_E_FAILURE;
+ }
+ if(NULL == sourcePhysicalAddress)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "dxeTXPushFrame invalid sourcePhysicalAddress");
+ HDXE_ASSERT(0);
+ return eWLAN_PAL_STATUS_E_FAILURE;
+ }
#else
status = wpalIteratorNext(&iterator,
palPacket,
@@ -3507,7 +3535,13 @@ static wpt_status dxeTXCompFrame
break;
}
- HDXE_ASSERT(currentCtrlBlk->xfrFrame != NULL);
+ if(currentCtrlBlk->xfrFrame == NULL)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "Invalid transfer frame");
+ HDXE_ASSERT(0);
+ break;
+ }
channelEntry->numFreeDesc++;
channelEntry->numRsvdDesc--;
@@ -4195,7 +4229,13 @@ static void dxeTXISR
dxeCtxt->ucTxMsgCnt = 1;
/* Serialize TX complete interrupt upon TX thread */
- HDXE_ASSERT(NULL != dxeCtxt->txIsrMsg);
+ if(NULL == dxeCtxt->txIsrMsg)
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "Invalid message");
+ HDXE_ASSERT(0);
+ return;
+ }
status = wpalPostTxMsg(WDI_GET_PAL_CTX(),
dxeCtxt->txIsrMsg);
if(eWLAN_PAL_STATUS_SUCCESS != status)
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h
index 7c470ea1a8d4..8feb16b88c0c 100644
--- a/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/CORE/HDD/inc/qc_sap_ioctl.h
@@ -299,6 +299,7 @@ typedef struct
#ifdef QCA_PKT_PROTO_TRACE
#define QCASAP_SET_DEBUG_LOG 68
#endif /* QCA_PKT_PROTO_TRACE */
+#define QCASAP_SET_TM_LEVEL 69
#endif /* QCA_WIFI_2_0 */
enum {
diff --git a/CORE/HDD/inc/wlan_hdd_assoc.h b/CORE/HDD/inc/wlan_hdd_assoc.h
index 7ba62db11533..158ed3d184a7 100644
--- a/CORE/HDD/inc/wlan_hdd_assoc.h
+++ b/CORE/HDD/inc/wlan_hdd_assoc.h
@@ -117,6 +117,8 @@ typedef struct connection_info_s
/** Dot11Mode */
tANI_U32 dot11Mode;
+ v_U8_t proxyARPService;
+
}connection_info_t;
/*Forward declaration of Adapter*/
typedef struct hdd_adapter_s hdd_adapter_t;
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 5f8f15056a33..15b81987f7ea 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1445,6 +1445,16 @@ typedef enum
#define CFG_VHT_ENABLE_GID_FEATURE_DEFAULT ( 0 )
#endif
+#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK "gSetTxChainmask1x1"
+#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MIN ( 1 )
+#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MAX ( 2 )
+#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_DEFAULT ( 1 )
+
+#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK "gSetRxChainmask1x1"
+#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MIN ( 1 )
+#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MAX ( 2 )
+#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_DEFAULT ( 1 )
+
#define CFG_ENABLE_AMPDUPS_FEATURE "gEnableAMPDUPS"
#define CFG_ENABLE_AMPDUPS_FEATURE_MIN ( 0 )
#define CFG_ENABLE_AMPDUPS_FEATURE_MAX ( 1 )
@@ -2272,6 +2282,27 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_SET_TXPOWER_LIMIT5G_MAX ( 30 )
#define CFG_SET_TXPOWER_LIMIT5G_DEFAULT ( 15 )
+#ifdef QCA_LL_TX_FLOW_CT
+#define CFG_LL_TX_STA_FLOW_LWM "TxStaFlowLowWaterMark"
+#define CFG_LL_TX_STA_FLOW_LWM_MIN ( 0 )
+#define CFG_LL_TX_STA_FLOW_LWM_MAX ( 1000 )
+#define CFG_LL_TX_STA_FLOW_LWM_DEFAULT ( 406 )
+
+#define CFG_LL_TX_STA_FLOW_HWM_OFFSET "TxStaFlowHighWaterMarkOffset"
+#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_MIN ( 0 )
+#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_MAX ( 300 )
+#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_DEFAULT ( 50 )
+
+#define CFG_LL_TX_IBSS_FLOW_LWM "TxIbssFlowLowWaterMark"
+#define CFG_LL_TX_IBSS_FLOW_LWM_MIN ( 0 )
+#define CFG_LL_TX_IBSS_FLOW_LWM_MAX ( 1000 )
+#define CFG_LL_TX_IBSS_FLOW_LWM_DEFAULT ( 550 )
+
+#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET "TxIbssFlowHighWaterMarkOffset"
+#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MIN ( 0 )
+#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MAX ( 300 )
+#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_DEFAULT ( 50 )
+#endif /* QCA_LL_TX_FLOW_CT */
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -2616,6 +2647,8 @@ typedef struct
v_U8_t vhtRxMCS2x2;
v_U8_t vhtTxMCS2x2;
v_BOOL_t enable2x2;
+ v_BOOL_t txchainmask1x1;
+ v_BOOL_t rxchainmask1x1;
v_BOOL_t enableMuBformee;
v_BOOL_t enableVhtpAid;
v_BOOL_t enableVhtGid;
@@ -2744,6 +2777,12 @@ typedef struct
char acsAllowedChnls[CFG_MAX_STR_LEN];
v_BOOL_t fRegChangeDefCountry;
v_U8_t acsScanBandPreference;
+#ifdef QCA_LL_TX_FLOW_CT
+ v_U32_t TxStaFlowLowWaterMark;
+ v_U32_t TxStaFlowHighWaterMarkOffset;
+ v_U32_t TxIbssFlowLowWaterMark;
+ v_U32_t TxIbssFlowHighWaterMarkOffset;
+#endif /* QCA_LL_TX_FLOW_CT */
} hdd_config_t;
/*---------------------------------------------------------------------------
Function declarations and documenation
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index ddc921d65974..2ff15b6f6449 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -579,6 +579,13 @@ typedef struct
v_BOOL_t qBlocked;
} hdd_thermal_mitigation_info_t;
+typedef struct action_pkt_buffer
+{
+ tANI_U8* frame_ptr;
+ tANI_U32 frame_length;
+ tANI_U16 freq;
+}action_pkt_buffer_t;
+
typedef struct hdd_remain_on_chan_ctx
{
struct net_device *dev;
@@ -588,6 +595,8 @@ typedef struct hdd_remain_on_chan_ctx
u64 cookie;
rem_on_channel_request_type_t rem_on_chan_request;
v_U32_t p2pRemOnChanTimeStamp;
+ vos_timer_t hdd_remain_on_chan_timer;
+ action_pkt_buffer_t action_pkt_buff;
}hdd_remain_on_chan_ctx_t;
typedef enum{
@@ -1036,7 +1045,6 @@ struct hdd_adapter_s
v_U8_t psbChanged;
/* UAPSD psb value configured through framework */
v_U8_t configuredPsb;
- v_BOOL_t internalRoCinProgress;
#ifdef IPA_OFFLOAD
void *ipa_context;
#endif
@@ -1044,6 +1052,7 @@ struct hdd_adapter_s
unsigned long prev_rx_packets;
unsigned long prev_tx_packets;
#endif
+ v_BOOL_t is_roc_inprogress;
};
#define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)
diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h
index 3337760d6627..f0cd804ac172 100644
--- a/CORE/HDD/inc/wlan_hdd_p2p.h
+++ b/CORE/HDD/inc/wlan_hdd_p2p.h
@@ -40,6 +40,7 @@
#define WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX 3000
#define READY_EVENT_PROPOGATE_TIME 2
#define ESTIMATED_ROC_DUR_REQD_FOR_ACTION_TX 20
+#define COMPLETE_EVENT_PROPOGATE_TIME 10
#define ACTION_FRAME_DEFAULT_WAIT 200
diff --git a/CORE/HDD/inc/wlan_hdd_tx_rx.h b/CORE/HDD/inc/wlan_hdd_tx_rx.h
index 96377948a27f..1a7674f9821a 100644
--- a/CORE/HDD/inc/wlan_hdd_tx_rx.h
+++ b/CORE/HDD/inc/wlan_hdd_tx_rx.h
@@ -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.
*
@@ -321,6 +321,6 @@ void hdd_wmm_acquire_access_required(hdd_adapter_t *pAdapter,
@return : NONE
===========================================================================*/
void hdd_tx_resume_cb(void *adapter_context,
- v_U8_t tx_resume);
+ v_BOOL_t tx_resume);
#endif /* QCA_LL_TX_FLOW_CT */
#endif // end #if !defined( WLAN_HDD_TX_RX_H )
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index c86b6c4bda80..c0b45ef7678e 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -307,6 +307,8 @@ void hdd_connSaveConnectInfo( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
// Save dot11mode in which STA associated to AP
pHddStaCtx->conn_info.dot11Mode = pRoamInfo->u.pConnectedProfile->dot11Mode;
+
+ pHddStaCtx->conn_info.proxyARPService = pRoamInfo->u.pConnectedProfile->proxyARPService;
}
}
@@ -603,7 +605,9 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo
int we_event;
char *msg;
int type = -1;
+#ifdef MSM_PLATFORM
unsigned long flags;
+#endif
#ifdef QCA_WIFI_2_0
v_MACADDR_t peerMacAddr;
#endif
@@ -773,6 +777,7 @@ void hdd_connRemoveConnectInfo( hdd_station_ctx_t *pHddStaCtx )
// Set not-connected state
pHddStaCtx->conn_info.connDot11DesiredBssType = eCSR_BSS_TYPE_ANY;
hdd_connSetConnectionState( pHddStaCtx, eConnectionState_NotConnected );
+ pHddStaCtx->conn_info.proxyARPService = 0;
vos_mem_zero( &pHddStaCtx->conn_info.SSID, sizeof( tCsrSSIDInfo ) );
}
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 35508a2195c1..5ae8a6dd790f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2501,6 +2501,20 @@ REG_VARIABLE( CFG_VHT_ENABLE_GID_FEATURE, WLAN_PARAM_Integer,
CFG_VHT_ENABLE_GID_FEATURE_MAX ),
#endif
+REG_VARIABLE( CFG_VHT_ENABLE_1x1_TX_CHAINMASK, WLAN_PARAM_Integer,
+ hdd_config_t, txchainmask1x1,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_VHT_ENABLE_1x1_TX_CHAINMASK_DEFAULT,
+ CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MIN,
+ CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MAX ),
+
+REG_VARIABLE( CFG_VHT_ENABLE_1x1_RX_CHAINMASK, WLAN_PARAM_Integer,
+ hdd_config_t, rxchainmask1x1,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_VHT_ENABLE_1x1_RX_CHAINMASK_DEFAULT,
+ CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MIN,
+ CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MAX ),
+
REG_VARIABLE( CFG_ENABLE_AMPDUPS_FEATURE, WLAN_PARAM_Integer,
hdd_config_t, enableAmpduPs,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3193,6 +3207,36 @@ REG_VARIABLE( CFG_SAP_SCAN_BAND_PREFERENCE, WLAN_PARAM_Integer,
CFG_SAP_SCAN_BAND_PREFERENCE_DEFAULT,
CFG_SAP_SCAN_BAND_PREFERENCE_MIN,
CFG_SAP_SCAN_BAND_PREFERENCE_MAX ),
+
+#ifdef QCA_LL_TX_FLOW_CT
+REG_VARIABLE( CFG_LL_TX_STA_FLOW_LWM, WLAN_PARAM_Integer,
+ hdd_config_t, TxStaFlowLowWaterMark,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_LL_TX_STA_FLOW_LWM_DEFAULT,
+ CFG_LL_TX_STA_FLOW_LWM_MIN,
+ CFG_LL_TX_STA_FLOW_LWM_MAX ),
+
+REG_VARIABLE( CFG_LL_TX_STA_FLOW_HWM_OFFSET, WLAN_PARAM_Integer,
+ hdd_config_t, TxStaFlowHighWaterMarkOffset,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_LL_TX_STA_FLOW_HWM_OFFSET_DEFAULT,
+ CFG_LL_TX_STA_FLOW_HWM_OFFSET_MIN,
+ CFG_LL_TX_STA_FLOW_HWM_OFFSET_MAX ),
+
+REG_VARIABLE( CFG_LL_TX_IBSS_FLOW_LWM, WLAN_PARAM_Integer,
+ hdd_config_t, TxIbssFlowLowWaterMark,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_LL_TX_IBSS_FLOW_LWM_DEFAULT,
+ CFG_LL_TX_IBSS_FLOW_LWM_MIN,
+ CFG_LL_TX_IBSS_FLOW_LWM_MAX ),
+
+REG_VARIABLE( CFG_LL_TX_IBSS_FLOW_HWM_OFFSET, WLAN_PARAM_Integer,
+ hdd_config_t, TxIbssFlowHighWaterMarkOffset,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_DEFAULT,
+ CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MIN,
+ CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MAX ),
+#endif /* QCA_LL_TX_FLOW_CT */
};
/*
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 09ca767f67bc..d091b716c32a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -8079,7 +8079,7 @@ static int wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *d
tANI_U32 j=0;
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
tHalHandle halHandle;
- eHalStatus result;
+ eHalStatus result = eHAL_STATUS_SUCCESS;
int status;
tANI_U8 BSSIDMatched = 0;
hdd_context_t *pHddCtx;
@@ -8157,7 +8157,7 @@ static int wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *d
result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId,
PMKIDCache,
PMKIDCacheIndex);
- return 0;
+ return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL;
}
@@ -8171,7 +8171,7 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d
int status;
tANI_U8 BSSIDMatched = 0;
hdd_context_t *pHddCtx;
- int result = 0;
+ eHalStatus result = eHAL_STATUS_SUCCESS;
hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: deleting PMKSA for " MAC_ADDRESS_STR,
__func__, MAC_ADDR_ARRAY(pmksa->bssid));
@@ -8236,7 +8236,7 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d
/*delete the last PMKID cache in CSR*/
result = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pmksa->bssid);
- if (0 != result)
+ if (!HAL_STATUS_SUCCESS(result))
{
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: cannot delete PMKSA %d CONTENT.",
__func__,PMKIDCacheIndex);
@@ -8259,7 +8259,8 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d
dump_pmkid(halHandle, pmksa->pmkid);
return -EINVAL;
}
- return result;
+
+ return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL;
}
@@ -8272,6 +8273,7 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device
hdd_context_t *pHddCtx;
tANI_U8 *pBSSId;
int status = -1;
+ eHalStatus result = eHAL_STATUS_SUCCESS;
hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: flushing PMKSA ",__func__);
@@ -8310,9 +8312,9 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device
pBSSId =(tANI_U8 *)(PMKIDCache[j].BSSID);
/*delete the PMKID in CSR*/
- status = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pBSSId);
+ result = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pBSSId);
- if (0 != status)
+ if (!HAL_STATUS_SUCCESS(result))
{
hddLog(VOS_TRACE_LEVEL_ERROR ,"%s cannot flush PMKIDCache %d.",
__func__,j);
@@ -8323,7 +8325,8 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device
}
PMKIDCacheIndex = 0;
- return status;
+
+ return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL;
}
#endif
diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c
index f99f2bbc4436..421915046082 100644
--- a/CORE/HDD/src/wlan_hdd_ftm.c
+++ b/CORE/HDD/src/wlan_hdd_ftm.c
@@ -1134,9 +1134,13 @@ VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext )
VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
"vos prestart");
-
-
- VOS_ASSERT( NULL != pVosContext->pWDAContext);
+ if (NULL == pVosContext->pWDAContext)
+ {
+ VOS_ASSERT(0);
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "%s: WDA NULL context", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
/* call macPreStart */
vStatus = macPreStart(pVosContext->pMACContext);
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 6461d8bb2be0..ec15c13e56b4 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -1757,6 +1757,18 @@ static iw_softap_setparam(struct net_device *dev,
}
#endif /* QCA_PKT_PROTO_TRACE */
+ case QCASAP_SET_TM_LEVEL:
+ {
+ hddLog(VOS_TRACE_LEVEL_INFO, "Set Thermal Mitigation Level %d",
+ set_value);
+#ifdef QCA_WIFI_ISOC
+ hddLog(VOS_TRACE_LEVEL_ERROR, " 'setTmLevel' Command Not supported for this mode");
+#else
+ (void)sme_SetThermalLevel(hHal, set_value);
+#endif
+ break;
+ }
+
#endif /* QCA_WIFI_2_0 */
default:
hddLog(LOGE, FL("Invalid setparam command %d value %d"),
@@ -3973,6 +3985,11 @@ static const struct iw_priv_args hostapd_private_args[] = {
"setDbgLvl" },
#endif /* QCA_PKT_PROTO_TRACE */
+ { QCASAP_SET_TM_LEVEL,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0,
+ "setTmLevel" },
+
#endif /* QCA_WIFI_2_0 */
{ QCSAP_IOCTL_GETPARAM,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 4f1866dea34d..501dca00ed5c 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -7245,6 +7245,34 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
pHddCtx->current_intf_count++;
}
+
+#ifdef QCA_WIFI_2_0
+ if (!pHddCtx->cfg_ini->enable2x2)
+ {
+ int ret;
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_PDEV_PARAM_TX_CHAIN_MASK,
+ (int)pHddCtx->cfg_ini->txchainmask1x1,
+ PDEV_CMD);
+ if (ret != 0)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: WMI_PDEV_PARAM_TX_CHAIN_MASK set"
+ " failed %d", __func__, ret);
+ goto err_free_netdev;
+ }
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_PDEV_PARAM_RX_CHAIN_MASK,
+ (int)pHddCtx->cfg_ini->rxchainmask1x1,
+ PDEV_CMD);
+ if (ret != 0)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"%s: WMI_PDEV_PARAM_RX_CHAIN_MASK set"
+ " failed %d", __func__, ret);
+ goto err_free_netdev;
+ }
+ }
+#endif
+
return pAdapter;
err_free_netdev:
@@ -7394,6 +7422,7 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter )
eHalStatus halStatus = eHAL_STATUS_SUCCESS;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
union iwreq_data wrqu;
+ v_U8_t retry = 0;
ENTER();
@@ -7427,7 +7456,23 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter )
{
hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId);
}
-
+ if (pAdapter->device_mode != WLAN_HDD_INFRA_STATION) {
+ while (pAdapter->is_roc_inprogress) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC in progress for session %d!!!",
+ __func__, pAdapter->sessionId);
+ msleep(500);
+ if (retry++ > 3) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC completion is not received.!!!", __func__);
+ sme_CancelRemainOnChannel(WLAN_HDD_GET_HAL_CTX(pAdapter),
+ pAdapter->sessionId);
+ wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var,
+ msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
+ break;
+ }
+ }
+ }
if (test_bit(SME_SESSION_OPENED, &pAdapter->event_flags))
{
INIT_COMPLETION(pAdapter->session_close_comp_var);
@@ -7447,6 +7492,24 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter )
case WLAN_HDD_SOFTAP:
case WLAN_HDD_P2P_GO:
//Any softap specific cleanup here...
+ if (pAdapter->device_mode == WLAN_HDD_P2P_GO) {
+ while (pAdapter->is_roc_inprogress) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC in progress for session %d!!!",
+ __func__, pAdapter->sessionId);
+ msleep(500);
+ if (retry++ > 3) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: ROC completion is not received.!!!", __func__);
+ WLANSAP_CancelRemainOnChannel(
+ (WLAN_HDD_GET_CTX(pAdapter))->pvosContext);
+ wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var,
+ msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
+ break;
+ }
+ }
+ }
+
mutex_lock(&pHddCtx->sap_lock);
if (test_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags))
{
@@ -10324,7 +10387,6 @@ static int __init hdd_module_init ( void)
}
#endif /* #ifdef MODULE */
-
/**---------------------------------------------------------------------------
\brief hdd_driver_exit() - Exit function
@@ -11042,6 +11104,10 @@ void hdd_ch_avoid_cb
wlan_hdd_send_avoid_freq_event(hdd_ctxt, &hdd_avoid_freq_list);
+ /* clear existing unsafe channel cache */
+ hdd_ctxt->unsafe_channel_count = 0;
+ vos_mem_zero(hdd_ctxt->unsafe_channel_list, sizeof(v_U16_t) * NUM_20MHZ_RF_CHANNELS);
+
if (0 == ch_avoid_indi->avoid_range_count) {
hdd_ctxt->unsafe_channel_count = 0;
} else {
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 533650fe433b..027d75db90ca 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -152,11 +152,12 @@ eHalStatus wlan_hdd_remain_on_channel_callback( tHalHandle hHal, void* pCtx,
}
hddLog( LOG1, "Received remain on channel rsp");
+ vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer);
+ vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
cfgState->remain_on_chan_ctx = NULL;
- if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request &&
- (pAdapter->internalRoCinProgress == VOS_FALSE) )
+ if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request)
{
if( cfgState->buf )
{
@@ -202,8 +203,15 @@ eHalStatus wlan_hdd_remain_on_channel_callback( tHalHandle hHal, void* pCtx,
NULL, 0 );
}
+ if(pRemainChanCtx->action_pkt_buff.frame_ptr != NULL
+ && pRemainChanCtx->action_pkt_buff.frame_length != 0 )
+ {
+ vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
+ }
vos_mem_free( pRemainChanCtx );
complete(&pAdapter->cancel_rem_on_chan_var);
+ pAdapter->is_roc_inprogress = FALSE;
+ hdd_allow_suspend();
return eHAL_STATUS_SUCCESS;
}
@@ -261,6 +269,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter)
"%s: timeout waiting for cancel remain on channel ready indication",
__func__);
}
+ hdd_allow_suspend();
}
}
@@ -290,6 +299,49 @@ int wlan_hdd_check_remain_on_channel(hdd_adapter_t *pAdapter)
return status;
}
+void wlan_hdd_remain_on_chan_timeout(void *data)
+{
+ hdd_adapter_t *pAdapter = (hdd_adapter_t *)data;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_cfg80211_state_t *cfgState;
+
+ if(NULL == pAdapter)
+ {
+ hddLog( LOGE,"%s: pAdapter is NULL !!!", __func__);
+ return;
+ }
+
+ cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
+
+ if(NULL == pRemainChanCtx)
+ {
+ hddLog( LOGE,"%s: No Remain on channel is pending", __func__);
+ return;
+ }
+
+ hddLog( LOG1,"%s: Cancel Remain on Channel on timeout", __func__);
+
+ if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
+ ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
+ ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode )
+ )
+ {
+ sme_CancelRemainOnChannel( WLAN_HDD_GET_HAL_CTX( pAdapter ),
+ pAdapter->sessionId );
+ }
+ else if ( (WLAN_HDD_SOFTAP== pAdapter->device_mode) ||
+ (WLAN_HDD_P2P_GO == pAdapter->device_mode)
+ )
+ {
+ WLANSAP_CancelRemainOnChannel(
+ (WLAN_HDD_GET_CTX(pAdapter))->pvosContext);
+ }
+
+ hdd_allow_suspend();
+
+}
+
static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
struct net_device *dev,
struct ieee80211_channel *chan,
@@ -302,6 +354,13 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_remain_on_chan_ctx_t *pRemainChanCtx;
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+ VOS_STATUS vos_status = VOS_STATUS_E_FAILURE;
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
+ hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
+ hdd_adapter_t *pAdapter_temp;
+ VOS_STATUS status;
+ v_BOOL_t isGoPresent = VOS_FALSE;
+
hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d",
__func__,pAdapter->device_mode);
@@ -359,6 +418,41 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
cfgState->remain_on_chan_ctx = pRemainChanCtx;
cfgState->current_freq = chan->center_freq;
+ pRemainChanCtx->action_pkt_buff.freq = 0;
+ pRemainChanCtx->action_pkt_buff.frame_ptr = NULL;
+ pRemainChanCtx->action_pkt_buff.frame_length = 0;
+
+ /* Initialize Remain on chan timer */
+ vos_status = vos_timer_init(&pRemainChanCtx->hdd_remain_on_chan_timer,
+ VOS_TIMER_TYPE_SW,
+ wlan_hdd_remain_on_chan_timeout,
+ pAdapter);
+ if (vos_status != VOS_STATUS_SUCCESS)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Not able to initalize remain_on_chan timer",__func__);
+ }
+
+ status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
+ while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
+ {
+ pAdapter_temp = pAdapterNode->pAdapter;
+ if(pAdapter_temp->device_mode == WLAN_HDD_P2P_GO)
+ {
+ isGoPresent = VOS_TRUE;
+ }
+ status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext );
+ pAdapterNode = pNext;
+ }
+
+ //Extending duration for proactive extension logic for RoC
+ if (isGoPresent == VOS_TRUE)
+ duration = 3 * duration;
+ else
+ duration = 5 * duration;
+
+
+ hdd_prevent_suspend();
INIT_COMPLETION(pAdapter->rem_on_chan_ready_event);
//call sme API to start remain on channel.
@@ -369,6 +463,7 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
{
tANI_U8 sessionId = pAdapter->sessionId;
//call sme API to start remain on channel.
+
sme_RemainOnChannel(
WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId,
chan->hw_value, duration,
@@ -398,6 +493,7 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
"%s: WLANSAP_RemainOnChannel returned fail", __func__);
cfgState->remain_on_chan_ctx = NULL;
vos_mem_free (pRemainChanCtx);
+ hdd_allow_suspend();
return -EINVAL;
}
@@ -411,10 +507,12 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy,
"%s: WLANSAP_RegisterMgmtFrame returned fail", __func__);
WLANSAP_CancelRemainOnChannel(
(WLAN_HDD_GET_CTX(pAdapter))->pvosContext);
+ hdd_allow_suspend();
return -EINVAL;
}
}
+ pAdapter->is_roc_inprogress = TRUE;
return 0;
}
@@ -447,6 +545,7 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter )
{
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
hdd_remain_on_chan_ctx_t* pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ VOS_STATUS status;
hddLog( LOG1, "Ready on chan ind");
@@ -457,8 +556,15 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter )
pRemainChanCtx->p2pRemOnChanTimeStamp =
vos_timer_get_system_time() - READY_EVENT_PROPOGATE_TIME;
- if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request
- && (pAdapter->internalRoCinProgress == VOS_FALSE) )
+ //start timer for actual duration
+ status = vos_timer_start(&pRemainChanCtx->hdd_remain_on_chan_timer,
+ (pRemainChanCtx->duration + COMPLETE_EVENT_PROPOGATE_TIME));
+ if (status != VOS_STATUS_SUCCESS)
+ {
+ hddLog( LOGE, "Remain on Channel timer start failed");
+ }
+
+ if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request)
{
cfg80211_ready_on_channel(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
@@ -474,12 +580,39 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter )
pRemainChanCtx->duration, GFP_KERNEL );
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
- else if( OFF_CHANNEL_ACTION_TX == pRemainChanCtx->rem_on_chan_request
- || (pAdapter->internalRoCinProgress == VOS_TRUE))
+ else if( OFF_CHANNEL_ACTION_TX == pRemainChanCtx->rem_on_chan_request)
{
complete(&pAdapter->offchannel_tx_event);
}
#endif
+
+ // Check for cached action frame
+ if(pRemainChanCtx->action_pkt_buff.frame_length != 0)
+ {
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
+ cfg80211_rx_mgmt( pAdapter->dev->ieee80211_ptr,pRemainChanCtx->action_pkt_buff.freq, 0,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ GFP_ATOMIC );
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
+ cfg80211_rx_mgmt( pAdapter->dev, pRemainChanCtx->action_pkt_buff.freq, 0,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ GFP_ATOMIC );
+#else
+ cfg80211_rx_mgmt( pAdapter->dev, pRemainChanCtx->action_pkt_buff.freq,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ GFP_ATOMIC );
+#endif //LINUX_VERSION_CODE
+
+ hddLog( LOGE,"%s: Sent cached action frame to supplicant", __func__);
+ vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
+ pRemainChanCtx->action_pkt_buff.frame_length = 0;
+ pRemainChanCtx->action_pkt_buff.freq = 0;
+ pRemainChanCtx->action_pkt_buff.frame_ptr = NULL;
+ }
complete(&pAdapter->rem_on_chan_ready_event);
}
else
@@ -566,6 +699,7 @@ int wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy,
}
wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var,
msecs_to_jiffies(WAIT_CANCEL_REM_CHAN));
+ hdd_allow_suspend();
return 0;
}
@@ -746,60 +880,28 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev,
if( offchan && wait)
{
int status;
- hdd_remain_on_chan_ctx_t old_roc_ctx;
rem_on_channel_request_type_t req_type = OFF_CHANNEL_ACTION_TX;
// In case of P2P Client mode if we are already
// on the same channel then send the frame directly
- //For remain on channel we issue a passive scan to firmware
- //but currently there is no provision for dynamically extending
- //the dwell time therefore cancelling the ongoing remain on channel
- //and requesting for new one.
- //The below logic will be extended for request type action frames if
- //needed in future.
if ((type == SIR_MAC_MGMT_FRAME) &&
- (subType == SIR_MAC_MGMT_ACTION) &&
- hdd_p2p_is_action_type_rsp(&buf[WLAN_HDD_PUBLIC_ACTION_FRAME_BODY_OFFSET]) &&
- cfgState->remain_on_chan_ctx &&
- cfgState->current_freq == chan->center_freq ) {
-
- tANI_U32 current_time = vos_timer_get_system_time();
-
- // In case of P2P Client mode if we are already
- // on the same channel then send the frame directly only if
- // there is enough remain on channel time left.
- // If remain on channel time is about to expire in next 20ms
- // then dont send frame without a fresh remain on channel as this
- // may cause a race condition with lim remain_on_channel_timer
- // which might expire by the time the action frame reaches lim
- // layer.
- // For Rome check remaining time of RoC only in case of GO NEG CNF.
- // For other RSPs always extend
- actionFrmType = buf[WLAN_HDD_PUBLIC_ACTION_FRAME_TYPE_OFFSET];
-
- if (
-#if defined (QCA_WIFI_2_0) && !defined (QCA_WIFI_ISOC)
- (actionFrmType != WLAN_HDD_GO_NEG_CNF) ||
-#endif
- ((int)(cfgState->remain_on_chan_ctx->duration -
- (current_time -
- cfgState->remain_on_chan_ctx->p2pRemOnChanTimeStamp)) <
- ESTIMATED_ROC_DUR_REQD_FOR_ACTION_TX))
- {
- hddLog(LOG1,"action frame: Extending the RoC");
- pAdapter->internalRoCinProgress = VOS_TRUE;
- // saved old RoC Context
- vos_mem_copy(&old_roc_ctx,cfgState->remain_on_chan_ctx,
- sizeof(hdd_remain_on_chan_ctx_t));
- status = wlan_hdd_check_remain_on_channel(pAdapter);
- if ( status )
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "Failed to cancel the existing RoC");
- pAdapter->internalRoCinProgress = VOS_FALSE;
- }
- }
- }
+ (subType == SIR_MAC_MGMT_ACTION) &&
+ hdd_p2p_is_action_type_rsp(&buf[WLAN_HDD_PUBLIC_ACTION_FRAME_BODY_OFFSET]) &&
+ cfgState->remain_on_chan_ctx &&
+ cfgState->current_freq == chan->center_freq )
+ {
+ if(wait)
+ {
+ vos_timer_stop(&cfgState->remain_on_chan_ctx->hdd_remain_on_chan_timer);
+ status = vos_timer_start(&cfgState->remain_on_chan_ctx->hdd_remain_on_chan_timer,
+ wait);
+ if(status != VOS_STATUS_SUCCESS)
+ {
+ hddLog( LOGE, "Remain on Channel timer start failed");
+ }
+ }
+ goto send_frame;
+ }
if((cfgState->remain_on_chan_ctx != NULL) &&
(cfgState->current_freq == chan->center_freq)
@@ -811,9 +913,6 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev,
}
INIT_COMPLETION(pAdapter->offchannel_tx_event);
- // Restore request type if it is internal RoC.
- if(pAdapter->internalRoCinProgress == VOS_TRUE)
- req_type = old_roc_ctx.rem_on_chan_request;
status = wlan_hdd_request_remain_on_channel(wiphy, dev,
chan,
@@ -822,35 +921,8 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev,
#endif
wait, cookie,
req_type);
-
- // Assign the preserved cookie value here to appear as
- // same RoC to supplicant
- if (cfgState->remain_on_chan_ctx &&
- (pAdapter->internalRoCinProgress == VOS_TRUE))
- cfgState->remain_on_chan_ctx->cookie = old_roc_ctx.cookie;
-
if(0 != status)
{
- // If new RoC request fails then indicate complete RoC
- // to supplicant if internalRoCinProgress using old RoC Context
- if(pAdapter->internalRoCinProgress == VOS_TRUE)
- {
- hddLog( LOGE, "Indicate Complete RoC to supplicant for"
- "cookie %llu",old_roc_ctx.cookie);
- cfg80211_remain_on_channel_expired(
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
- old_roc_ctx.dev->ieee80211_ptr,
-#else
- old_roc_ctx.dev,
-#endif
- old_roc_ctx.cookie,
- &old_roc_ctx.chan,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
- old_roc_ctx.chan_type,
-#endif
- GFP_KERNEL);
- pAdapter->internalRoCinProgress = VOS_FALSE;
- }
if( (-EBUSY == status) &&
(cfgState->current_freq == chan->center_freq) )
{
@@ -869,32 +941,10 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev,
msecs_to_jiffies(WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX));
if(!status)
{
- // If Ready indication timeout occuers then indicate complete
- // RoC to supplicant is internalRoCin Progress is set
- if(cfgState->remain_on_chan_ctx &&
- (pAdapter->internalRoCinProgress == VOS_TRUE))
- {
- hddLog( LOGE, "Indicate Complete RoC to supplicant for"
- "cookie %llu Timeout",cfgState->remain_on_chan_ctx->cookie);
- cfg80211_remain_on_channel_expired(
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
- cfgState->remain_on_chan_ctx->dev->ieee80211_ptr,
-#else
- cfgState->remain_on_chan_ctx->dev,
-#endif
- cfgState->remain_on_chan_ctx->cookie,
- &cfgState->remain_on_chan_ctx->chan,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))
- cfgState->remain_on_chan_ctx->chan_type,
-#endif
- GFP_KERNEL);
- pAdapter->internalRoCinProgress = VOS_FALSE;
- }
hddLog( LOGE, "Not able to complete remain on channel request"
" within timeout period");
goto err_rem_channel;
}
- pAdapter->internalRoCinProgress = VOS_FALSE;
}
else if ( offchan )
{
@@ -1531,10 +1581,13 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter,
tANI_S8 rxRssi )
{
tANI_U16 freq;
+ tANI_U16 extend_time;
tANI_U8 type = 0;
tANI_U8 subType = 0;
tActionFrmType actionFrmType;
hdd_cfg80211_state_t *cfgState = NULL;
+ VOS_STATUS status;
+ hdd_remain_on_chan_ctx_t* pRemainChanCtx = NULL;
hddLog(VOS_TRACE_LEVEL_INFO, "%s: Frame Type = %d Frame Length = %d\n",
__func__, frameType, nFrameLength);
@@ -1622,6 +1675,7 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter,
}
cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
if ((type == SIR_MAC_MGMT_FRAME) &&
(subType == SIR_MAC_MGMT_ACTION))
@@ -1668,6 +1722,51 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter,
}
}
#endif
+ if (pRemainChanCtx != NULL)
+ {
+ if(actionFrmType == WLAN_HDD_GO_NEG_REQ ||
+ actionFrmType == WLAN_HDD_GO_NEG_RESP ||
+ actionFrmType == WLAN_HDD_INVITATION_REQ ||
+ actionFrmType == WLAN_HDD_DEV_DIS_REQ ||
+ actionFrmType == WLAN_HDD_PROV_DIS_REQ )
+ {
+ hddLog( LOG1, "Extend RoC timer on reception of Action Frame");
+
+ if ((actionFrmType == WLAN_HDD_GO_NEG_REQ)
+ || (actionFrmType == WLAN_HDD_GO_NEG_RESP))
+ extend_time = 2 * ACTION_FRAME_DEFAULT_WAIT;
+ else
+ extend_time = ACTION_FRAME_DEFAULT_WAIT;
+
+ if(completion_done(&pAdapter->rem_on_chan_ready_event))
+ {
+ vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer);
+ status = vos_timer_start(&pRemainChanCtx->hdd_remain_on_chan_timer,
+ extend_time);
+ if (status != VOS_STATUS_SUCCESS)
+ {
+ hddLog( LOGE, "Remain on Channel timer start failed");
+ }
+ } else {
+ // Buffer Packet
+ if(pRemainChanCtx->action_pkt_buff.frame_length == 0)
+ {
+ pRemainChanCtx->action_pkt_buff.frame_length = nFrameLength;
+ pRemainChanCtx->action_pkt_buff.freq = freq;
+ pRemainChanCtx->action_pkt_buff.frame_ptr
+ = vos_mem_malloc(nFrameLength);
+ vos_mem_copy(pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pbFrames, nFrameLength);
+ hddLog( LOGE,"%s:"
+ "Action Pkt Cached successfully !!!", __func__);
+ } else {
+ hddLog( LOGE,"%s:"
+ "Frames are pending. dropping frame !!!", __func__);
+ }
+ return;
+ }
+ }
+ }
if (((actionFrmType == WLAN_HDD_PROV_DIS_RESP) &&
(cfgState->actionFrmState == HDD_PD_REQ_ACK_PENDING)) ||
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index e8190a30814e..22a56e2fe189 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -567,7 +567,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
/* Proto Trace enabled */
proto_type = vos_pkt_get_proto_type(skb,
- hddCtxt->cfg_ini->gEnableDebugLog);
+ hddCtxt->cfg_ini->gEnableDebugLog, 0);
if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
{
vos_pkt_trace_buf_update("HA:T:EPL");
@@ -1669,7 +1669,7 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
(pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
{
proto_type = vos_pkt_get_proto_type(skb,
- pHddCtx->cfg_ini->gEnableDebugLog);
+ pHddCtx->cfg_ini->gEnableDebugLog, 0);
if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
{
vos_pkt_trace_buf_update("HA:R:EPL");
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 7633775a4cbc..efbc79a68d97 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -820,7 +820,7 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
@return : NONE
===========================================================================*/
void hdd_tx_resume_cb(void *adapter_context,
- v_U8_t tx_resume)
+ v_BOOL_t tx_resume)
{
hdd_adapter_t *pAdapter = (hdd_adapter_t *)adapter_context;
@@ -860,11 +860,19 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
v_U8_t STAId = WLAN_MAX_STA_COUNT;
hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station;
+#if defined(QCA_PKT_PROTO_TRACE) || defined (QCA_LL_TX_FLOW_CT)
+ hdd_context_t *hddCtxt = WLAN_HDD_GET_CTX(pAdapter);
+#endif /* defined(QCA_PKT_PROTO_TRACE) || defined (QCA_LL_TX_FLOW_CT) */
+
#ifdef QCA_PKT_PROTO_TRACE
- hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx;
v_U8_t proto_type = 0;
#endif /* QCA_PKT_PROTO_TRACE */
+#ifdef QCA_LL_TX_FLOW_CT
+ unsigned int low_watermark;
+ unsigned int high_watermark_offset;
+#endif /* QCA_LL_TX_FLOW_CT */
+
#ifdef QCA_WIFI_FTM
if (hdd_get_conparam() == VOS_FTM_MODE) {
kfree_skb(skb);
@@ -898,19 +906,33 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}
#ifdef QCA_LL_TX_FLOW_CT
- if(VOS_FALSE == WLANTL_GetTxResource((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- STAId))
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG,
- "%s: Out of TX resource, stop Q", __func__);
- netif_tx_stop_all_queues(dev);
- }
+ low_watermark = hddCtxt->cfg_ini->TxIbssFlowLowWaterMark;
+ high_watermark_offset = hddCtxt->cfg_ini->TxIbssFlowHighWaterMarkOffset;
#endif /* QCA_LL_TX_FLOW_CT */
}
else
{
STAId = pHddStaCtx->conn_info.staId[0];
+#ifdef QCA_LL_TX_FLOW_CT
+ low_watermark = hddCtxt->cfg_ini->TxStaFlowLowWaterMark;
+ high_watermark_offset = hddCtxt->cfg_ini->TxStaFlowHighWaterMarkOffset;
+#endif /* QCA_LL_TX_FLOW_CT */
}
+
+#ifdef QCA_LL_TX_FLOW_CT
+ if (VOS_FALSE == WLANTL_GetTxResource((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+ STAId,
+ low_watermark,
+ high_watermark_offset))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
+ "%s: Out of TX resource, stop Q, LWM %d, HWM %d, dev 0x%x",
+ __func__, low_watermark,
+ (low_watermark + high_watermark_offset), (unsigned int)dev);
+ netif_tx_stop_all_queues(dev);
+ }
+#endif /* QCA_LL_TX_FLOW_CT */
+
//Get TL AC corresponding to Qdisc queue index/AC.
ac = hdd_QdiscAcToTlAC[skb->queue_mapping];
@@ -1000,7 +1022,7 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
(hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
{
proto_type = vos_pkt_get_proto_type(skb,
- hddCtxt->cfg_ini->gEnableDebugLog);
+ hddCtxt->cfg_ini->gEnableDebugLog, 0);
if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
{
vos_pkt_trace_buf_update("ST:T:EPL");
@@ -2023,6 +2045,7 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
#ifdef QCA_PKT_PROTO_TRACE
v_U8_t proto_type;
#endif /* QCA_PKT_PROTO_TRACE */
+ hdd_station_ctx_t *pHddStaCtx = NULL;
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
@@ -2055,12 +2078,22 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
return eHAL_STATUS_FAILURE;
}
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ if ((pHddStaCtx->conn_info.proxyARPService) &&
+ cfg80211_is_gratuitous_arp_unsolicited_na(skb))
+ {
+ ++pAdapter->hdd_stats.hddTxRxStats.rxDropped;
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Dropping HS 2.0 Gratuitous ARP or Unsolicited NA", __func__);
+ kfree_skb(skb);
+ return VOS_STATUS_SUCCESS;
+ }
+
#ifdef FEATURE_WLAN_TDLS
#ifndef QCA_WIFI_2_0
if ((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) &&
0 != pHddCtx->connected_peer_count)
{
- hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station;
u8 mac[6];
wlan_hdd_tdls_extract_sa(skb, mac);
@@ -2093,7 +2126,7 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
(pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
{
proto_type = vos_pkt_get_proto_type(skb,
- pHddCtx->cfg_ini->gEnableDebugLog);
+ pHddCtx->cfg_ini->gEnableDebugLog, 0);
if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
{
vos_pkt_trace_buf_update("ST:R:EPL");
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 7d14d61dc148..648126e8733c 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -7682,8 +7682,14 @@ static int iw_qcom_set_wapi_assoc_info(struct net_device *dev, struct iw_request
"%s:LOGP in Progress. Ignore!!!", __func__);
return -EBUSY;
}
- VOS_ASSERT(pWapiAssocInfo);
+ if (NULL == pWapiAssocInfo)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "%s: WDA NULL context", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_FAILURE;
+ }
hddLog(LOG1, "%s: INPUT DATA:\nElement ID:0x%02x Length:0x%02x Version:0x%04x\n",__func__,pWapiAssocInfo->elementID,pWapiAssocInfo->length,pWapiAssocInfo->version);
hddLog(LOG1,"%s: akm Suite Cnt:0x%04x",__func__,pWapiAssocInfo->akmSuiteCount);
for(i =0 ; i < 16 ; i++)
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index 03bad2d8c540..d0d49e4c3d0c 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -1229,9 +1229,12 @@ static eHalStatus hdd_wmm_sme_callback (tHalHandle hHal,
pAc->wmmAcAccessAllowed = VOS_FALSE;
}
- // if ACM bit is not set, allow access
- if (!(pAc->wmmAcAccessRequired))
- pAc->wmmAcAccessAllowed = VOS_TRUE;
+ // if we have valid Tpsec or if ACM bit is not set, allow access
+ if ((pAc->wmmAcTspecValid &&
+ (pAc->wmmAcTspecInfo.ts_info.direction != SME_QOS_WMM_TS_DIR_DOWNLINK)) ||
+ !pAc->wmmAcAccessRequired) {
+ pAc->wmmAcAccessAllowed = VOS_TRUE;
+ }
#endif
VOS_TRACE(VOS_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO,
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 9aa62855bdc2..6f6594213e0a 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2013,2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 65
+#define QWLAN_VERSION_BUILD 68
-#define QWLAN_VERSIONSTR "1.0.0.65"
+#define QWLAN_VERSIONSTR "1.0.0.68"
#ifdef QCA_WIFI_2_0
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 23c7453e453c..b917cdb161dd 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4789,9 +4789,9 @@ typedef struct sSirChanChangeRequest
{
tANI_U16 messageType;
tANI_U16 messageLen;
- tANI_U8 sessionId;
tANI_U8 targetChannel;
tANI_U8 cbMode;
+ tANI_U8 bssid[WNI_CFG_BSSID_LEN];
}tSirChanChangeRequest, *tpSirChanChangeRequest;
typedef struct sSirChanChangeResponse
@@ -4806,8 +4806,8 @@ typedef struct sSirStartBeaconIndication
{
tANI_U16 messageType;
tANI_U16 messageLen;
- tANI_U8 sessionId;
tANI_U8 beaconStartStatus;
+ tANI_U8 bssid[WNI_CFG_BSSID_LEN];
}tSirStartBeaconIndication, *tpSirStartBeaconIndication;
/* Message format for requesting channel switch announcement to lower layers */
@@ -4815,9 +4815,9 @@ typedef struct sSirDfsCsaIeRequest
{
tANI_U16 msgType;
tANI_U16 msgLen;
- tANI_U8 sessionId;
tANI_U8 targetChannel;
tANI_U8 csaIeRequired;
+ tANI_U8 bssid[WNI_CFG_BSSID_LEN];
}tSirDfsCsaIeRequest, *tpSirDfsCsaIeRequest;
/* Indication from lower layer indicating the completion of first beacon send
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index 9ba936035fda..791d6c213369 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -1430,6 +1430,8 @@ tANI_BOOLEAN limProcessFTUpdateKey(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf )
PELOG1(limLog(pMac, LOG1,
FL("BSSID = "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pKeyInfo->bssId));)
+ sirCopyMacAddr(pAddBssParams->extSetStaKeyParam.peerMacAddr, pKeyInfo->bssId);
+
if(pAddBssParams->extSetStaKeyParam.key[0].keyLength == 16)
{
PELOG1(limLog(pMac, LOG1,
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index 04bef5d98ac1..ba70ba4e1e21 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -2931,6 +2931,12 @@ limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_
pMlmDisassocReq->reasonCode,
pMlmDisassocReq->peerMacAddr,
psessionEntry, TRUE);
+ /*
+ * Abort Tx so that data frames won't be sent to the AP
+ * after sending Disassoc.
+ */
+ if (eLIM_STA_ROLE == psessionEntry->limSystemRole)
+ WDA_TxAbort(psessionEntry->smeSessionId);
}
}
else
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index a5f7868dce02..7f543026be96 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -5799,12 +5799,14 @@ limProcessSmeStartBeaconReq(tpAniSirGlobal pMac, tANI_U32 * pMsg)
}
pBeaconStartInd = (tpSirStartBeaconIndication)pMsg;
- sessionId = pBeaconStartInd->sessionId;
-
- if((psessionEntry = peFindSessionBySessionId(pMac, sessionId)) == NULL)
+ if((psessionEntry =
+ peFindSessionByBssid(pMac, pBeaconStartInd->bssid, &sessionId))
+ == NULL)
{
- limLog(pMac, LOGW, "Session does not exist for given sessionId %d",
- pBeaconStartInd->sessionId);
+ limPrintMacAddr(pMac, pBeaconStartInd->bssid, LOGE);
+ PELOGE(limLog(pMac, LOGE,
+ "%s[%d]: Session does not exist for given bssId",
+ __func__, __LINE__ );)
return;
}
@@ -5845,12 +5847,15 @@ limProcessSmeChannelChangeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg)
return;
}
pChannelChangeReq = (tpSirChanChangeRequest)pMsg;
- sessionId = pChannelChangeReq->sessionId;
- if((psessionEntry = peFindSessionBySessionId(pMac, sessionId)) == NULL)
+ if((psessionEntry =
+ peFindSessionByBssid(pMac, pChannelChangeReq->bssid, &sessionId))
+ == NULL)
{
- limLog(pMac, LOGW, "Session does not exist for given sessionId %d",
- pChannelChangeReq->sessionId);
+ limPrintMacAddr(pMac, pChannelChangeReq->bssid, LOGE);
+ PELOGE(limLog(pMac, LOGE,
+ "%s[%d]: Session does not exist for given bssId",
+ __func__, __LINE__ );)
return;
}
@@ -5973,7 +5978,6 @@ limProcessSmeDfsCsaIeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg)
{
tpSirDfsCsaIeRequest pDfsCsaIeRequest = (tSirDfsCsaIeRequest *)pMsg;
- //tANI_U8 sessionId = pDfsCsaIeRequest->sessionId;
tpPESession psessionEntry = NULL;
int i;
diff --git a/CORE/MAC/src/pe/lim/limScanResultUtils.c b/CORE/MAC/src/pe/lim/limScanResultUtils.c
index 0042fd505083..3d7cf39e3da6 100644
--- a/CORE/MAC/src/pe/lim/limScanResultUtils.c
+++ b/CORE/MAC/src/pe/lim/limScanResultUtils.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -193,7 +193,13 @@ limCollectBssDescription(tpAniSirGlobal pMac,
pBssDescr->beaconInterval = pBPR->beaconInterval;
pBssDescr->capabilityInfo = limGetU16((tANI_U8 *) &pBPR->capabilityInfo);
-
+ if(!pBssDescr->beaconInterval )
+ {
+ limLog(pMac, LOGW,
+ FL("Beacon Interval is ZERO, making it to default 100 "
+ MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHdr->bssId));
+ pBssDescr->beaconInterval= 100;
+ }
/*
* There is a narrow window after Channel Switch msg is sent to HAL and before the AGC is shut
* down and beacons/Probe Rsps can trickle in and we may report the incorrect channel in 5Ghz
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 8df37ba099f1..3e7aa2ed1d45 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -2783,7 +2783,6 @@ void limHandleDeleteBssRsp(tpAniSirGlobal pMac,tpSirMsgQ MsgQ)
{
limLog(pMac, LOGE,FL("Session Does not exist for given sessionID %d"),
pDelBss->sessionId);
- vos_mem_free(pDelBss);
return;
}
if (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index cb75ece63303..fe6a944c0675 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -3948,7 +3948,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
if(overlap)
{
psessionEntry->gLimOlbcParams.protectionEnabled = true;
- PELOGE(limLog(pMac, LOGE, FL("protection from olbc is enabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("protection from olbc is enabled"));)
if(true == psessionEntry->htCapability)
{
if((eSIR_HT_OP_MODE_OVERLAP_LEGACY != psessionEntry->htOperMode) &&
@@ -3967,7 +3967,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
else
{
psessionEntry->gLim11bParams.protectionEnabled = true;
- PELOGE(limLog(pMac, LOGE, FL("protection from 11b is enabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("protection from 11b is enabled"));)
if(true == psessionEntry->htCapability)
{
if(eSIR_HT_OP_MODE_MIXED != psessionEntry->htOperMode)
@@ -4056,7 +4056,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
{
//Disable protection from 11B stations.
psessionEntry->gLim11bParams.protectionEnabled = false;
- PELOGE(limLog(pMac, LOGE, FL("===> 11B Protection Disabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("===> 11B Protection Disabled"));)
//Check if any other non-HT protection enabled.
if(!psessionEntry->gLim11gParams.protectionEnabled)
{
@@ -4071,7 +4071,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
psessionEntry->gLimOverlapNonGfParams.protectionEnabled)
{
psessionEntry->htOperMode = eSIR_HT_OP_MODE_OVERLAP_LEGACY;
- PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));)
limEnableHtRifsProtection(pMac, true, overlap, pBeaconParams,psessionEntry);
}
else if(psessionEntry->gLimHt20Params.protectionEnabled)
@@ -4079,7 +4079,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
//Commenting because of CR 258588 WFA cert
//psessionEntry->htOperMode = eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT;
psessionEntry->htOperMode = eSIR_HT_OP_MODE_PURE;
- PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));)
limEnableHtRifsProtection(pMac, false, overlap, pBeaconParams,psessionEntry);
}
else
@@ -4092,7 +4092,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable,
if(!psessionEntry->gLimOlbcParams.protectionEnabled &&
!psessionEntry->gLim11bParams.protectionEnabled)
{
- PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));)
+ PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));)
pBeaconParams->llbCoexist = psessionEntry->beaconParams.llbCoexist = false;
pBeaconParams->paramChangeBitmap |= PARAM_llBCOEXIST_CHANGED;
}
@@ -5608,7 +5608,7 @@ limProcessAddBaInd(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
if((eBA_DISABLE == pSta->tcCfg[tid].fUseBATx) &&
(pBaCandidate->baInfo[tid].fBaEnable))
{
- limLog(pMac, LOGE, FL("BA setup for staId = %d, TID: %d, SSN: %d"),
+ limLog(pMac, LOG1, FL("BA setup for staId = %d, TID: %d, SSN: %d"),
pSta->staIndex, tid, pBaCandidate->baInfo[tid].startingSeqNum);
limPostMlmAddBAReq(pMac, pSta, tid, pBaCandidate->baInfo[tid].startingSeqNum,psessionEntry);
}
@@ -6845,7 +6845,7 @@ limPrepareFor11hChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry)
if(pMac->lim.gLimSmeState == eLIM_SME_LINK_EST_WT_SCAN_STATE ||
pMac->lim.gLimSmeState == eLIM_SME_CHANNEL_SCAN_STATE)
{
- PELOGE(limLog(pMac, LOGE, FL("Posting finish scan as we are in scan state"));)
+ PELOGE(limLog(pMac, LOG1, FL("Posting finish scan as we are in scan state"));)
/* Stop ongoing scanning if any */
if (GET_LIM_PROCESS_DEFD_MESGS(pMac))
{
@@ -6862,7 +6862,7 @@ limPrepareFor11hChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry)
}
else
{
- PELOGE(limLog(pMac, LOGE, FL("Not in scan state, start channel switch timer"));)
+ PELOGE(limLog(pMac, LOG1, FL("Not in scan state, start channel switch timer"));)
/** We are safe to switch channel at this point */
limStopTxAndSwitchChannel(pMac, psessionEntry->peSessionId);
}
@@ -7011,8 +7011,8 @@ void limSetTspecUapsdMask(tpAniSirGlobal pMac, tSirMacTSInfo *pTsInfo, tANI_U32
}
}
- limLog(pMac, LOGE, FL("New pMac->lim.gUapsdPerAcTriggerEnableMask = 0x%x "), pMac->lim.gUapsdPerAcTriggerEnableMask );
- limLog(pMac, LOGE, FL("New pMac->lim.gUapsdPerAcDeliveryEnableMask = 0x%x "), pMac->lim.gUapsdPerAcDeliveryEnableMask );
+ limLog(pMac, LOG1, FL("New pMac->lim.gUapsdPerAcTriggerEnableMask = 0x%x "), pMac->lim.gUapsdPerAcTriggerEnableMask );
+ limLog(pMac, LOG1, FL("New pMac->lim.gUapsdPerAcDeliveryEnableMask = 0x%x "), pMac->lim.gUapsdPerAcDeliveryEnableMask );
return;
}
@@ -7060,10 +7060,10 @@ void limSetTspecUapsdMaskPerSession(tpAniSirGlobal pMac,
}
}
- limLog(pMac, LOGE,
+ limLog(pMac, LOG1,
FL("New psessionEntry->gUapsdPerAcTriggerEnableMask = 0x%x "),
psessionEntry->gUapsdPerAcTriggerEnableMask );
- limLog(pMac, LOGE,
+ limLog(pMac, LOG1,
FL("New psessionEntry->gUapsdPerAcDeliveryEnableMask = 0x%x "),
psessionEntry->gUapsdPerAcDeliveryEnableMask );
diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c
index 440ec1485146..87ac5ac99663 100644
--- a/CORE/SAP/src/sapModule.c
+++ b/CORE/SAP/src/sapModule.c
@@ -2429,8 +2429,9 @@ WLANSAP_ChannelChangeRequest(v_PVOID_t pSapCtx, tANI_U8 tArgetChannel)
return VOS_STATUS_E_FAULT;
}
- halStatus = sme_RoamChannelChangeReq( hHal, sapContext->sessionId, tArgetChannel,
- sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode));
+ halStatus = sme_RoamChannelChangeReq( hHal, sapContext->bssid,
+ tArgetChannel,
+ sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode) );
if (halStatus == eHAL_STATUS_SUCCESS)
{
@@ -2495,7 +2496,7 @@ VOS_STATUS WLANSAP_StartBeaconReq(v_PVOID_t pSapCtx)
/* CAC Wait done without any Radar Detection */
dfsCacWaitStatus = VOS_TRUE;
halStatus = sme_RoamStartBeaconReq( hHal,
- sapContext->sessionId, dfsCacWaitStatus);
+ sapContext->bssid, dfsCacWaitStatus);
if (halStatus == eHAL_STATUS_SUCCESS)
{
return VOS_STATUS_SUCCESS;
@@ -2549,9 +2550,11 @@ WLANSAP_DfsSendCSAIeRequest(v_PVOID_t pSapCtx)
return VOS_STATUS_E_FAULT;
}
- halStatus = sme_RoamCsaIeRequest(hHal, sapContext->sessionId,
+ halStatus = sme_RoamCsaIeRequest(hHal,
+ sapContext->bssid,
sapContext->SapDfsInfo.target_channel,
sapContext->SapDfsInfo.csaIERequired);
+
if (halStatus == eHAL_STATUS_SUCCESS)
{
return VOS_STATUS_SUCCESS;
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index 5dae20e3ca4a..22adfd25d25b 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-14 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.
*
@@ -421,6 +421,11 @@ __adf_nbuf_trace_update(struct sk_buff *buf, char *event_string)
adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
"DHC",
NBUF_PKT_TRAC_PROTO_STRING);
+ } else if (NBUF_PKT_TRAC_TYPE_MGMT_ACTION &
+ adf_nbuf_trace_get_proto_type(buf)) {
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "MACT",
+ NBUF_PKT_TRAC_PROTO_STRING);
}
trace_update_cb(string_buf);
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 8afc5b88e2e2..9abfc2c5b08f 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -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.
*
@@ -50,8 +50,9 @@
#define NBUF_PKT_TRAC_TYPE_EAPOL 0x02
#define NBUF_PKT_TRAC_TYPE_DHCP 0x04
-#define NBUF_PKT_TRAC_MAX_STRING 11
-#define NBUF_PKT_TRAC_PROTO_STRING 3
+#define NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08
+#define NBUF_PKT_TRAC_MAX_STRING 12
+#define NBUF_PKT_TRAC_PROTO_STRING 4
/**
* @brief Platform indepedent packet abstraction
diff --git a/CORE/SERVICES/COMMON/ol_htt_tx_api.h b/CORE/SERVICES/COMMON/ol_htt_tx_api.h
index 916a010db672..03d816831094 100644
--- a/CORE/SERVICES/COMMON/ol_htt_tx_api.h
+++ b/CORE/SERVICES/COMMON/ol_htt_tx_api.h
@@ -385,10 +385,10 @@ htt_tx_desc_init(
struct htt_msdu_info_t *msdu_info)
{
u_int32_t *word0, *word1, *word3;
+ u_int32_t local_word0, local_word1;
struct htt_host_tx_desc_t *htt_host_tx_desc = (struct htt_host_tx_desc_t *)
(((char *) htt_tx_desc) - HTT_TX_DESC_VADDR_OFFSET);
-
word0 = (u_int32_t *) htt_tx_desc;
word1 = word0 + 1;
/*
@@ -397,18 +397,25 @@ htt_tx_desc_init(
*/
word3 = word0 + 3; // Dword 3
- *word0 = 0;
+ /*
+ * HTT Tx Desc is in uncached memory. Used cached writes per word, to
+ * reduce unnecessary memory access.
+ */
+
+ local_word0 = 0;
+ HTT_H2T_MSG_TYPE_SET(local_word0, HTT_H2T_MSG_TYPE_TX_FRM);
+ HTT_TX_DESC_PKT_TYPE_SET(local_word0, msdu_info->info.l2_hdr_type);
+ HTT_TX_DESC_VDEV_ID_SET(local_word0, msdu_info->info.vdev_id);
+ HTT_TX_DESC_EXT_TID_SET(local_word0, msdu_info->info.ext_tid);
+ HTT_TX_DESC_CKSUM_OFFLOAD_SET(local_word0, msdu_info->action.cksum_offload);
+ HTT_TX_DESC_NO_ENCRYPT_SET(local_word0, msdu_info->action.do_encrypt ? 0 : 1);
+ *word0 = local_word0;
- HTT_H2T_MSG_TYPE_SET(*word0, HTT_H2T_MSG_TYPE_TX_FRM);
- HTT_TX_DESC_PKT_TYPE_SET(*word0, msdu_info->info.l2_hdr_type);
- HTT_TX_DESC_VDEV_ID_SET(*word0, msdu_info->info.vdev_id);
- HTT_TX_DESC_EXT_TID_SET(*word0, msdu_info->info.ext_tid);
- HTT_TX_DESC_CKSUM_OFFLOAD_SET(*word0, msdu_info->action.cksum_offload);
- HTT_TX_DESC_NO_ENCRYPT_SET(*word0, msdu_info->action.do_encrypt ? 0 : 1);
+ local_word1 = 0;
+ HTT_TX_DESC_FRM_LEN_SET(local_word1, adf_nbuf_len(msdu));
+ HTT_TX_DESC_FRM_ID_SET(local_word1, msdu_id);
+ *word1 = local_word1;
- *word1 = 0;
- HTT_TX_DESC_FRM_LEN_SET(*word1, adf_nbuf_len(msdu));
- HTT_TX_DESC_FRM_ID_SET(*word1, msdu_id);
/* Initialize peer_id to INVALID_PEER bcoz this is NOT Reinjection path*/
*word3 = HTT_INVALID_PEER;
diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
index 22ada2a448b9..d3642544222f 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h
@@ -1004,10 +1004,18 @@ void ol_vdev_rx_set_intrabss_fwd(ol_txrx_vdev_handle vdev, a_bool_t val);
* OS IF will query TX resource status to decide back pressuring or not
*
* @param vdev - the virtual device
+ * @param low_watermark - low free descriptor count to pause os tx q
+ * @param high_watermark_offset - high free descriptor count to resume os tx q
+ * offset value from low watermark.
+ * high watermark = low watermark + high_watermark_offset
+ * @return boolean- true if tx data path has enough resource
+ false if tx data path does not have enough resource
*/
a_bool_t
ol_txrx_get_tx_resource(
- ol_txrx_vdev_handle vdev
+ ol_txrx_vdev_handle vdev,
+ unsigned int low_watermark,
+ unsigned int high_watermark_offset
);
#endif /* QCA_LL_TX_FLOW_CT */
diff --git a/CORE/SERVICES/COMMON/ol_txrx_osif_api.h b/CORE/SERVICES/COMMON/ol_txrx_osif_api.h
index 5e7c102cacee..e3c1b3d1f6d6 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_osif_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_osif_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012, 2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -93,10 +93,12 @@ typedef void (*ol_txrx_rx_fp)(void *osif_dev, adf_nbuf_t msdus);
* @typedef ol_txrx_tx_fc_fp
* @brief tx flow control notification function from txrx to OS shim
* @param osif_dev - the virtual device's OS shim object
+ * @param peer_id - peer id belongs to virtual device
* @param vdev_id - virtual device id
* @param tx_resume - tx os q should be resumed or not
*/
-typedef void (*ol_txrx_tx_fc_fp)(void *osif_dev, u_int8_t vdev_id, a_bool_t tx_resume);
+typedef void (*ol_txrx_tx_flow_control_fp)(void *osif_dev, u_int8_t peer_id,
+ u_int8_t vdev_id, a_bool_t tx_resume);
/**
* @typedef ol_txrx_rx_fp
@@ -106,11 +108,9 @@ typedef void (*ol_txrx_tx_fc_fp)(void *osif_dev, u_int8_t vdev_id, a_bool_t tx_r
struct ol_txrx_osif_ops {
/* tx function pointers - specified by txrx, stored by OS shim */
struct {
- ol_txrx_tx_fp std;
- ol_txrx_tx_non_std_fp non_std;
-#ifdef QCA_LL_TX_FLOW_CT
- ol_txrx_tx_fc_fp flow_control_cb;
-#endif /* QCA_LL_TX_FLOW_CT */
+ ol_txrx_tx_fp std;
+ ol_txrx_tx_non_std_fp non_std;
+ ol_txrx_tx_flow_control_fp flow_control_cb;
} tx;
/* rx function pointers - specified by OS shim, stored by txrx */
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 934f97ecd451..d413ff62ab1b 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -227,6 +227,9 @@ void wma_set_dfs_regdomain(tp_wma_handle wma);
static VOS_STATUS wma_set_thermal_mgmt(tp_wma_handle wma_handle,
t_thermal_cmd_params thermal_info);
+static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info,
+ v_BOOL_t sendResp);
+
static void *wma_find_vdev_by_addr(tp_wma_handle wma, u_int8_t *addr,
u_int8_t *vdev_id)
{
@@ -1062,21 +1065,40 @@ static void wma_update_vdev_stats(tp_wma_handle wma,
if (pGetRssiReq &&
pGetRssiReq->sessionId == vdev_stats->vdev_id) {
- if((vdev_stats->vdev_snr.dat_snr > 0) &&
- (vdev_stats->vdev_snr.bcn_snr > 0))
- rssi = (vdev_stats->vdev_snr.dat_snr + vdev_stats->vdev_snr.bcn_snr)/2;
- else
- rssi = vdev_stats->vdev_snr.bcn_snr;
+ if ((vdev_stats->vdev_snr.bcn_snr == WMA_TGT_INVALID_SNR) &&
+ (vdev_stats->vdev_snr.dat_snr == WMA_TGT_INVALID_SNR)) {
+ /*
+ * Firmware sends invalid snr till it sees
+ * Beacon/Data after connection since after
+ * vdev up fw resets the snr to invalid.
+ * In this duartion Host will return the last know
+ * rssi during connection.
+ */
+ rssi = wma->first_rssi;
+ } else {
+ if (((vdev_stats->vdev_snr.dat_snr > 0) &&
+ (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR)) &&
+ ((vdev_stats->vdev_snr.bcn_snr > 0) &&
+ (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR))) {
+ rssi = (vdev_stats->vdev_snr.dat_snr +
+ vdev_stats->vdev_snr.bcn_snr)/2;
+ } else if (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR) {
+ rssi = vdev_stats->vdev_snr.bcn_snr;
+ } else if (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR) {
+ rssi = vdev_stats->vdev_snr.dat_snr;
+ }
+
+ /*
+ * Get the absolute rssi value from the current rssi value
+ * the sinr value is hardcoded into 0 in the core stack
+ */
+ rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM;
+ }
- /* Get the absolute rssi value from the current rssi value
- * the sinr value is hardcoded into 0 in the core stack
- */
WMA_LOGD("vdev id %d beancon snr %d data snr %d",
vdev_stats->vdev_id,
vdev_stats->vdev_snr.bcn_snr,
vdev_stats->vdev_snr.dat_snr);
-
- rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM;
WMA_LOGD("Average Rssi = %d, vdev id= %d", rssi,
pGetRssiReq->sessionId);
@@ -3033,6 +3055,11 @@ void wma_vdev_detach_callback(void *ctx)
}
if(iface->addBssStaContext)
adf_os_mem_free(iface->addBssStaContext);
+
+#if defined WLAN_FEATURE_VOWIFI_11R
+ if (iface->staKeyParams)
+ adf_os_mem_free(iface->staKeyParams);
+#endif
vos_mem_zero(iface, sizeof(*iface));
param->status = VOS_STATUS_SUCCESS;
@@ -3131,6 +3158,10 @@ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
out:
if(iface->addBssStaContext)
adf_os_mem_free(iface->addBssStaContext);
+#if defined WLAN_FEATURE_VOWIFI_11R
+ if (iface->staKeyParams)
+ adf_os_mem_free(iface->staKeyParams);
+#endif
vos_mem_zero(iface, sizeof(*iface));
pdel_sta_self_req_param->status = status;
if (generateRsp)
@@ -4118,7 +4149,8 @@ error:
}
-VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq)
+VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq,
+ v_S7_t first_rssi)
{
wmi_buf_t buf;
wmi_request_stats_cmd_fixed_param *cmd;
@@ -4129,6 +4161,8 @@ VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq)
if(NULL != wma_handle->pGetRssiReq)
return VOS_STATUS_SUCCESS;
+ wma_handle->first_rssi = first_rssi;
+
/* create a copy of csrRssiCallback to send rssi value
* after wmi event
*/
@@ -6046,6 +6080,10 @@ void wma_vdev_resp_timer(void *data)
(void *)iface->del_staself_req, 0);
if(iface->addBssStaContext)
adf_os_mem_free(iface->addBssStaContext);
+#if defined WLAN_FEATURE_VOWIFI_11R
+ if (iface->staKeyParams)
+ adf_os_mem_free(iface->staKeyParams);
+#endif
vos_mem_zero(iface, sizeof(*iface));
} else if (tgt_req->msg_type == WDA_ADD_BSS_REQ) {
tpAddBssParams params = (tpAddBssParams)tgt_req->user_data;
@@ -7027,6 +7065,25 @@ wmi_unified_vdev_set_gtx_cfg_send(wmi_unified_t wmi_handle, u_int32_t if_id,
return wmi_unified_cmd_send(wmi_handle, buf, len, WMI_VDEV_SET_GTX_PARAMS_CMDID);
}
+void wma_update_txrx_chainmask(int num_rf_chains, int *cmd_value)
+{
+ if (*cmd_value > WMA_MAX_RF_CHAINS(num_rf_chains)) {
+ WMA_LOGE("%s: Chainmask value exceeds the maximum"
+ " supported range setting it to"
+ " maximum value. Requested value %d"
+ " Updated value %d", __func__, *cmd_value,
+ WMA_MAX_RF_CHAINS(num_rf_chains));
+ *cmd_value = WMA_MAX_RF_CHAINS(num_rf_chains);
+ } else if (*cmd_value < WMA_MIN_RF_CHAINS) {
+ WMA_LOGE("%s: Chainmask value is less than the minimum"
+ " supported range setting it to"
+ " minimum value. Requested value %d"
+ " Updated value %d", __func__, *cmd_value,
+ WMA_MIN_RF_CHAINS);
+ *cmd_value = WMA_MIN_RF_CHAINS;
+ }
+}
+
static void wma_process_cli_set_cmd(tp_wma_handle wma,
wda_cli_set_cmd_t *privcmd)
{
@@ -7070,6 +7127,11 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
case PDEV_CMD:
WMA_LOGD("pdev pid %d pval %d", privcmd->param_id,
privcmd->param_value);
+ if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) ||
+ (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) {
+ wma_update_txrx_chainmask(wma->num_rf_chains,
+ &privcmd->param_value);
+ }
ret = wmi_unified_pdev_set_param(wma->wmi_handle,
privcmd->param_id,
privcmd->param_value);
@@ -8233,6 +8295,22 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
}
adf_os_mem_copy(iface->addBssStaContext, &add_bss->staContext,
sizeof(tAddStaParams));
+
+#if defined WLAN_FEATURE_VOWIFI_11R
+ if (iface->staKeyParams) {
+ adf_os_mem_free(iface->staKeyParams);
+ iface->staKeyParams = NULL;
+ }
+ if (add_bss->extSetStaKeyParamValid) {
+ iface->staKeyParams = adf_os_mem_alloc(NULL, sizeof(tSetStaKeyParams));
+ if (!iface->staKeyParams) {
+ WMA_LOGE("%s Failed to allocat memory", __func__);
+ goto send_fail_resp;
+ }
+ adf_os_mem_copy(iface->staKeyParams, &add_bss->extSetStaKeyParam,
+ sizeof(tSetStaKeyParams));
+ }
+#endif
// Save parameters later needed by WDA_ADD_STA_REQ
iface->rmfEnabled = add_bss->rmfEnabled;
iface->beaconInterval = add_bss->beaconInterval;
@@ -8958,6 +9036,14 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
}
}
#endif /* WLAN_FEATURE_11W */
+#if defined WLAN_FEATURE_VOWIFI_11R
+ /*
+ * Set the PTK in 11r mode because we already have it.
+ */
+ if (iface->staKeyParams) {
+ wma_set_stakey(wma, (tpSetStaKeyParams) iface->staKeyParams, FALSE);
+ }
+#endif
}
#if defined WLAN_FEATURE_VOWIFI
maxTxPower = params->maxTxPower;
@@ -9427,7 +9513,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, tpSetBssKeyParams k
}
}
-static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
+static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info, v_BOOL_t sendResp)
{
wmi_buf_t buf;
int32_t status, i;
@@ -9535,7 +9621,8 @@ static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
/* TODO: Should we wait till we get HTT_T2H_MSG_TYPE_SEC_IND? */
key_info->status = eHAL_STATUS_SUCCESS;
out:
- wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0);
+ if (sendResp)
+ wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0);
}
static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
@@ -13468,8 +13555,10 @@ static void wma_data_tx_ack_work_handler(struct work_struct *ack_work)
wma_handle = work->wma_handle;
ack_cb = wma_handle->umac_data_ota_ack_cb;
- WMA_LOGD("Data Tx Ack Cb Status %d",
- work->status);
+ if (work->status)
+ WMA_LOGE("Data Tx Ack Cb Status %d", work->status);
+ else
+ WMA_LOGD("Data Tx Ack Cb Status %d", work->status);
/* Call the Ack Cb registered by UMAC */
ack_cb((tpAniSirGlobal)(wma_handle->mac_context),
@@ -15234,7 +15323,7 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
break;
case WDA_SET_STAKEY_REQ:
wma_set_stakey(wma_handle,
- (tpSetStaKeyParams)msg->bodyptr);
+ (tpSetStaKeyParams)msg->bodyptr, TRUE);
break;
case WDA_DELETE_STA_REQ:
wma_delete_sta(wma_handle,
@@ -17412,6 +17501,7 @@ v_VOID_t wma_rx_service_ready_event(WMA_HANDLE handle, void *cmd_param_info)
wma_handle->phy_capability = ev->phy_capability;
wma_handle->max_frag_entry = ev->max_frag_entry;
+ wma_handle->num_rf_chains = ev->num_rf_chains;
vos_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities,
sizeof(HAL_REG_CAPABILITIES));
wma_handle->ht_cap_info = ev->ht_cap_info;
@@ -17786,6 +17876,9 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
#endif /* WLAN_FEATURE_11W */
struct wma_txrx_node *iface;
tpAniSirGlobal pMac;
+#ifdef QCA_PKT_PROTO_TRACE
+ v_U8_t proto_type = 0;
+#endif
if (NULL == wma_handle)
{
@@ -17963,6 +18056,15 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
wma_handle->umac_ota_ack_cb[pFc->subType] =
tx_frm_ota_comp_cb;
}
+#ifdef QCA_PKT_PROTO_TRACE
+ if (pFc->subType == SIR_MAC_MGMT_ACTION)
+ proto_type = vos_pkt_get_proto_type(tx_frame,
+ pMac->fEnableDebugLog,
+ NBUF_PKT_TRAC_TYPE_MGMT_ACTION);
+ if (proto_type & NBUF_PKT_TRAC_TYPE_MGMT_ACTION)
+ vos_pkt_trace_buf_update("WM:T:MACT");
+ adf_nbuf_trace_set_proto_type(tx_frame, proto_type);
+#endif /* QCA_PKT_PROTO_TRACE */
} else {
if(downld_comp_required)
tx_frm_index =
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index e20dac5c15da..7f7edd21d52e 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -162,6 +162,10 @@
#define WMA_INVALID_KEY_IDX 0xff
#define WMA_DFS_RADAR_FOUND 1
+
+#define WMA_MAX_RF_CHAINS(x) ((1 << x) - 1)
+#define WMA_MIN_RF_CHAINS (1)
+
typedef struct {
HTC_ENDPOINT_ID endpoint_id;
}t_cfg_nv_param;
@@ -456,6 +460,9 @@ struct wma_txrx_node {
tPowerdBm tx_power; /* TX power in dBm */
tPowerdBm max_tx_power; /* max Tx power in dBm */
u_int32_t nwType;
+#if defined WLAN_FEATURE_VOWIFI_11R
+ void *staKeyParams;
+#endif
};
#if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC)
@@ -570,6 +577,7 @@ typedef struct {
u_int8_t powersave_mode;
v_BOOL_t ptrn_match_enable_all_vdev;
void* pGetRssiReq;
+ v_S7_t first_rssi;
t_thermal_mgmt thermal_mgmt_info;
u_int32_t roam_offload_vdev_id;
v_BOOL_t roam_offload_enabled;
@@ -1240,7 +1248,8 @@ VOS_STATUS wma_trigger_uapsd_params(tp_wma_handle wma_handle, u_int32_t vdev_id,
tp_wma_trigger_uapsd_params trigger_uapsd_params);
/* added to get average snr for both data and beacon */
-VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq);
+VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq,
+ v_S7_t first_rssi);
#ifdef FEATURE_WLAN_SCAN_PNO
@@ -1496,4 +1505,5 @@ enum uapsd_up {
UAPSD_UP_MAX
};
+#define WMA_TGT_INVALID_SNR (-1)
#endif
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index e15b1e3c34fe..33fa9ff11cca 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -1435,14 +1435,14 @@ tANI_BOOLEAN csrRoamIsStaMode(tpAniSirGlobal pMac, tANI_U32 sessionId);
/* Post Channel Change Indication */
-eHalStatus csrRoamChannelChangeReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
+eHalStatus csrRoamChannelChangeReq(tpAniSirGlobal pMac, tCsrBssid bssid,
tANI_U8 targetChannel, tANI_U8 cbMode);
/* Post Beacon Tx Start Indication */
eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac,
- tANI_U32 sessionId, tANI_U8 dfsCacWaitStatus);
+ tCsrBssid bssid, tANI_U8 dfsCacWaitStatus);
eHalStatus
-csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId,
+csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tCsrBssid bssid,
tANI_U8 targetChannel, tANI_U8 csaIeReqd);
#endif
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 8e89a79bed48..2c8e0bacc5f9 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3450,20 +3450,20 @@ eHalStatus sme_AddChAvoidCallback
);
#endif /* FEATURE_WLAN_CH_AVOID */
-eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tANI_U8 sessionId,
- tANI_U8 targetChannel, eCsrPhyMode phyMode);
+eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tCsrBssid bssid,
+ tANI_U8 targetChannel, eCsrPhyMode phyMode );
eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal,
- tANI_U8 sessionId, tANI_U8 dfsCacWaitStatus);
+ tCsrBssid bssid, tANI_U8 dfsCacWaitStatus);
/* -------------------------------------------------------------------------
\fn sme_RoamCsaIeRequest
\brief API to request CSA IE transmission from PE
\param hHal - The handle returned by macOpen
- \param sessionId - session ID
\param pDfsCsaReq - CSA IE request
+ \param bssid - SAP bssid
\return eHalStatus
---------------------------------------------------------------------------*/
-eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId,
+eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tCsrBssid bssid,
tANI_U8 targetChannel, tANI_U8 csaIeReqd);
#ifndef QCA_WIFI_ISOC
diff --git a/CORE/SME/src/QoS/sme_Qos.c b/CORE/SME/src/QoS/sme_Qos.c
index c89e3d9e58fd..82bf97aac2eb 100644
--- a/CORE/SME/src/QoS/sme_Qos.c
+++ b/CORE/SME/src/QoS/sme_Qos.c
@@ -5537,7 +5537,7 @@ eHalStatus sme_QosProcessAddTsSuccessRsp(tpAniSirGlobal pMac,
pACInfo->curr_QoSInfo[tspec_pending - 1].medium_time =
pRsp->tspec.mediumTime;
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: %d: On session %d AddTspec Medium Time %d",
__func__, __LINE__,
sessionId, pRsp->tspec.mediumTime);
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 6ff643d94f22..5d3e757b3d7d 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -7146,7 +7146,10 @@ eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionI
pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
pConnectProfile->operationChannel = pSirBssDesc->channelId;
pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
-
+ if (!pConnectProfile->beaconInterval)
+ {
+ smsLog(pMac, LOGW, FL("ERROR: Beacon interval is ZERO"));
+ }
vos_mem_copy(&pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
/* saving the addional IE`s like Hot spot indication element and extended capabilities */
if(pProfile->nAddIEAssocLength)
@@ -17382,19 +17385,11 @@ VOS_STATUS csrRoamReadTSF(tpAniSirGlobal pMac, tANI_U8 *pTimestamp)
* Channel Change Req for SAP
*/
eHalStatus
-csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
- tANI_U8 targetChannel, tANI_U8 cbMode)
+csrRoamChannelChangeReq( tpAniSirGlobal pMac, tCsrBssid bssid,
+ tANI_U8 targetChannel, tANI_U8 cbMode )
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tSirChanChangeRequest *pMsg;
- tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
- if (NULL == pSession)
- {
- smsLog( pMac, LOGE, FL
- ( " Session does not exist for session id %d" ), sessionId);
- return eHAL_STATUS_FAILURE;
- }
pMsg = vos_mem_malloc( sizeof(tSirChanChangeRequest) );
if (!pMsg)
@@ -17422,9 +17417,9 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_CHANNEL_CHANGE_REQ);
pMsg->messageLen = sizeof(tSirChanChangeRequest);
- pMsg->sessionId = pSession->sessionId;
pMsg->targetChannel = targetChannel;
pMsg->cbMode = cbMode;
+ vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN);
status = palSendMBMessage(pMac->hHdd, pMsg);
@@ -17436,19 +17431,11 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
* immediately after SAP CAC WAIT is
* completed without any RADAR indications.
*/
-eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
- tANI_U8 dfsCacWaitStatus)
+eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tCsrBssid bssid,
+ tANI_U8 dfsCacWaitStatus)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tSirStartBeaconIndication *pMsg;
- tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
- if (NULL == pSession)
- {
- smsLog( pMac, LOGE, FL
- ( " Session does not exist for session id %d" ), sessionId);
- return eHAL_STATUS_FAILURE;
- }
pMsg = vos_mem_malloc(sizeof(tSirStartBeaconIndication));
@@ -17460,8 +17447,8 @@ eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
vos_mem_set((void *)pMsg, sizeof( tSirStartBeaconIndication ), 0);
pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BEACON_REQ);
pMsg->messageLen = sizeof(tSirStartBeaconIndication);
- pMsg->sessionId = pSession->sessionId;
pMsg->beaconStartStatus = dfsCacWaitStatus;
+ vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN);
status = palSendMBMessage(pMac->hHdd, pMsg);
@@ -17478,19 +17465,11 @@ eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId,
\- return Success or failure
-----------------------------------------------------------------------------*/
eHalStatus
-csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId,
- tANI_U8 targetChannel, tANI_U8 csaIeReqd)
+csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tCsrBssid bssid,
+ tANI_U8 targetChannel, tANI_U8 csaIeReqd)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tSirDfsCsaIeRequest *pMsg;
- tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
-
- if (NULL == pSession)
- {
- smsLog( pMac, LOGE, FL
- ( " Session does not exist for session id %d" ), sessionId);
- return eHAL_STATUS_FAILURE;
- }
pMsg = vos_mem_malloc(sizeof(tSirDfsCsaIeRequest));
if (!pMsg)
@@ -17503,9 +17482,9 @@ csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId,
pal_cpu_to_be16((tANI_U16)eWNI_SME_DFS_BEACON_CHAN_SW_IE_REQ);
pMsg->msgLen = sizeof(tSirDfsCsaIeRequest);
- pMsg->sessionId = pSession->sessionId;
pMsg->targetChannel = targetChannel;
pMsg->csaIeRequired = csaIeReqd;
+ vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN);
status = palSendMBMessage(pMac->hHdd, pMsg);
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index f6185de9e50d..51ae60eb9c12 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -8104,6 +8104,13 @@ eHalStatus csrScanSavePreferredNetworkFound(tpAniSirGlobal pMac,
pBssDescr->sinr = 0;
pBssDescr->rssi = -1 * pPrefNetworkFoundInd->rssi;
pBssDescr->beaconInterval = pParsedFrame->beaconInterval;
+ if (!pBssDescr->beaconInterval)
+ {
+ smsLog(pMac, LOGW,
+ FL("Bcn Interval is Zero , default to 100" MAC_ADDRESS_STR),
+ MAC_ADDR_ARRAY(pBssDescr->bssId) );
+ pBssDescr->beaconInterval = 100;
+ }
pBssDescr->timeStamp[0] = pParsedFrame->timeStamp[0];
pBssDescr->timeStamp[1] = pParsedFrame->timeStamp[1];
pBssDescr->capabilityInfo = *((tANI_U16 *)&pParsedFrame->capabilityInfo);
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 87c0f4cddcf5..6b6cf2d9c0fb 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -2894,6 +2894,16 @@ tANI_U16 csrCalculateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U16 sta_bi, tAN
else
go_cbi = 100 + (go_gbi % 100);
+ if ( sta_bi == 0 )
+ {
+ /* There is possibility to receive zero as value.
+ Which will cause divide by zero. Hence initialise with 100
+ */
+ sta_bi = 100;
+ smsLog(pMac, LOGW,
+ FL("sta_bi 2nd parameter is zero, initialise to %d"), sta_bi);
+ }
+
// check, if either one is multiple of another
if (sta_bi > go_cbi)
{
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 5326df0b36e8..a3ebea7919c9 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -11484,12 +11484,11 @@ eHalStatus sme_AddChAvoidCallback
\fn sme_RoamChannelChangeReq
\brief API to Indicate Channel change to new target channel
\param hHal - The handle returned by macOpen
- \param sessionId - session ID
\param targetChannel - New Channel to move the SAP to.
\return eHalStatus
---------------------------------------------------------------------------*/
-eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal,
- tANI_U8 sessionId, tANI_U8 targetChannel, eCsrPhyMode phyMode)
+eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tCsrBssid bssid,
+ tANI_U8 targetChannel, eCsrPhyMode phyMode )
{
eHalStatus status = eHAL_STATUS_FAILURE;
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -11498,8 +11497,8 @@ eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal,
{
sme_SelectCBMode(hHal, phyMode, targetChannel);
- status = csrRoamChannelChangeReq( pMac, sessionId, targetChannel,
- pMac->roam.configParam.channelBondingMode5GHz);
+ status = csrRoamChannelChangeReq( pMac, bssid, targetChannel,
+ pMac->roam.configParam.channelBondingMode5GHz );
sme_ReleaseGlobalLock( &pMac->sme );
}
@@ -11571,8 +11570,8 @@ eHalStatus sme_ProcessChannelChangeResp(tpAniSirGlobal pMac,
\param dfsCacWaitStatus - CAC WAIT status flag
\return eHalStatus
---------------------------------------------------------------------------*/
-eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId,
- tANI_U8 dfsCacWaitStatus)
+eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tCsrBssid bssid,
+ tANI_U8 dfsCacWaitStatus)
{
eHalStatus status = eHAL_STATUS_FAILURE;
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -11580,7 +11579,7 @@ eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId,
if ( HAL_STATUS_SUCCESS( status ) )
{
- status = csrRoamStartBeaconReq( pMac, sessionId, dfsCacWaitStatus);
+ status = csrRoamStartBeaconReq( pMac, bssid, dfsCacWaitStatus);
sme_ReleaseGlobalLock( &pMac->sme );
}
return (status);
@@ -11590,11 +11589,11 @@ eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId,
\fn sme_RoamCsaIeRequest
\brief API to request CSA IE transmission from PE
\param hHal - The handle returned by macOpen
- \param sessionId - session ID
\param pDfsCsaReq - CSA IE request
+ \param bssid - SAP bssid
\return eHalStatus
---------------------------------------------------------------------------*/
-eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId,
+eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tCsrBssid bssid,
tANI_U8 targetChannel, tANI_U8 csaIeReqd)
{
eHalStatus status = eHAL_STATUS_FAILURE;
@@ -11602,8 +11601,8 @@ eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId,
status = sme_AcquireGlobalLock( &pMac->sme );
if ( HAL_STATUS_SUCCESS( status ) )
{
- status = csrRoamSendChanSwIERequest(pMac, sessionId,
- targetChannel, csaIeReqd);
+ status = csrRoamSendChanSwIERequest(pMac, bssid, targetChannel,
+ csaIeReqd);
sme_ReleaseGlobalLock( &pMac->sme );
}
return (status);
diff --git a/CORE/SME/src/sme_common/sme_FTApi.c b/CORE/SME/src/sme_common/sme_FTApi.c
index 6501391ff91b..9f3d3526142c 100644
--- a/CORE/SME/src/sme_common/sme_FTApi.c
+++ b/CORE/SME/src/sme_common/sme_FTApi.c
@@ -374,7 +374,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo )
switch(pMac->ft.ftSmeContext.FTState)
{
case eFT_SET_KEY_WAIT:
-#ifdef QCA_WIFI_ISOC
if (sme_GetFTPreAuthState (hHal) == TRUE)
{
status = sme_FTSendUpdateKeyInd(pMac, pFTKeyInfo);
@@ -393,9 +392,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo )
}
sme_SetFTPreAuthState(hHal, FALSE);
}
-#else
- status = eHAL_STATUS_FT_PREAUTH_KEY_FAILED;
-#endif /* QCA_WIFI_ISOC */
pMac->ft.ftSmeContext.FTState = eFT_START_READY;
#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
diff --git a/CORE/SYS/common/src/wlan_qct_sys.c b/CORE/SYS/common/src/wlan_qct_sys.c
index 96cd5967a65a..521df3ef0227 100644
--- a/CORE/SYS/common/src/wlan_qct_sys.c
+++ b/CORE/SYS/common/src/wlan_qct_sys.c
@@ -317,7 +317,13 @@ VOS_STATUS sysMcProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
v_VOID_t *hHal;
- VOS_ASSERT( pMsg );
+ if (NULL == pMsg)
+ {
+ VOS_ASSERT(0);
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "%s: NULL pointer to vos_msg_t", __func__);
+ return VOS_STATUS_E_INVAL;
+ }
// All 'new' SYS messages are identified by a cookie in the reserved
// field of the message as well as the message type. This prevents
@@ -436,8 +442,13 @@ VOS_STATUS sysTxProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
{
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
- VOS_ASSERT( pMsg );
-
+ if (NULL == pMsg)
+ {
+ VOS_ASSERT(0);
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "%s: NULL pointer to vos_msg_t", __func__);
+ return VOS_STATUS_E_INVAL;
+ }
// All 'new' SYS messages are identified by a cookie in the reserved
// field of the message as well as the message type. This prevents
// the possibility of overlap in the message types defined for new
@@ -502,7 +513,13 @@ VOS_STATUS sysRxProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
{
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
- VOS_ASSERT( pMsg );
+ if (NULL == pMsg)
+ {
+ VOS_ASSERT(0);
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "%s: NULL pointer to vos_msg_t", __func__);
+ return VOS_STATUS_E_INVAL;
+ }
// All 'new' SYS messages are identified by a cookie in the reserved
// field of the message as well as the message type. This prevents
diff --git a/CORE/SYS/legacy/src/platform/src/VossWrapper.c b/CORE/SYS/legacy/src/platform/src/VossWrapper.c
index 57c01ab33cfc..56a5a72e6002 100644
--- a/CORE/SYS/legacy/src/platform/src/VossWrapper.c
+++ b/CORE/SYS/legacy/src/platform/src/VossWrapper.c
@@ -313,8 +313,22 @@ v_UINT_t tx_timer_create_intern_debug( v_PVOID_t pMacGlobal, TX_TIMER *timer_ptr
{
VOS_STATUS status;
- VOS_ASSERT((NULL != expiration_function) && (NULL != name_ptr));
+ if (NULL == expiration_function)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "NULL timer expiration");
+ VOS_ASSERT(0);
+ return TX_TIMER_ERROR;
+ }
+ if(NULL == name_ptr)
+ {
+
+ VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
+ "NULL name pointer for timer");
+ VOS_ASSERT(0);
+ return TX_TIMER_ERROR;
+ }
if (!initScheduleTimeInTicks)
return TX_TICK_ERROR;
@@ -371,7 +385,6 @@ v_UINT_t tx_timer_create_intern( v_PVOID_t pMacGlobal, TX_TIMER *timer_ptr,
{
VOS_STATUS status;
- VOS_ASSERT((NULL != expiration_function) && (NULL != name_ptr));
if((NULL == name_ptr) || (NULL == expiration_function))
return TX_TIMER_ERROR;
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index 0c1c01df25f5..dcf2eb52f39e 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -1134,8 +1134,15 @@ void macTraceDumpAll(tpAniSirGlobal pMac, tANI_U8 code, tANI_U8 session, tANI_U3
}
}
- if ((i >= 0 && i < MAX_TRACE_RECORDS))
- pRecord = &gTraceTbl[i];
+ if (i < 0)
+ {
+ i = 0;
+ }
+ else if (i >= MAX_TRACE_RECORDS)
+ {
+ i = MAX_TRACE_RECORDS - 1;
+ }
+ pRecord = &gTraceTbl[i];
for (;;)
{
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index a23ba91ca460..bb09685b8321 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -3045,7 +3045,9 @@ WLANTL_TLDebugMessage
v_BOOL_t WLANTL_GetTxResource
(
void *vos_context,
- uint8_t sta_id
+ uint8_t sta_id,
+ unsigned int low_watermark,
+ unsigned int high_watermark_offset
);
/*=============================================================================
@@ -3059,6 +3061,7 @@ v_BOOL_t WLANTL_GetTxResource
PARAMETERS
IN
tlContext : Pointer to TL SHIM context
+ peer_idx : peer index belongs to virtual device
sessionId : STA/VDEV instance to query TX resource
resume_tx : Resume OS TX Q or not
@@ -3071,6 +3074,7 @@ v_BOOL_t WLANTL_GetTxResource
void WLANTL_TXFlowControlCb
(
void *tlContext,
+ v_U8_t peer_idx,
v_U8_t sessionId,
v_BOOL_t resume_tx
);
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 14380bb1bce9..38247e51dde8 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -4082,7 +4082,11 @@ WLANTL_GetFrames
WDA_TLI_PROCESS_FRAME_LEN( pTLCb->tlMgmtFrmClient.vosPendingDataBuff,
usPktLen, uResLen, uTotalPktLen);
- VOS_ASSERT(usPktLen <= WLANTL_MAX_ALLOWED_LEN);
+ if (usPktLen > WLANTL_MAX_ALLOWED_LEN)
+ {
+ usPktLen = WLANTL_MAX_ALLOWED_LEN;
+ VOS_ASSERT(0);
+ }
if ( ( pTLCb->uResCount > uResLen ) &&
( uRemaining > uTotalPktLen ) &&
@@ -4120,7 +4124,11 @@ WLANTL_GetFrames
WDA_TLI_PROCESS_FRAME_LEN( pTLCb->tlBAPClient.vosPendingDataBuff,
usPktLen, uResLen, uTotalPktLen);
- VOS_ASSERT(usPktLen <= WLANTL_MAX_ALLOWED_LEN);
+ if (usPktLen > WLANTL_MAX_ALLOWED_LEN)
+ {
+ usPktLen = WLANTL_MAX_ALLOWED_LEN;
+ VOS_ASSERT(0);
+ }
if ( ( pTLCb->uResCount > (uResLen + WDA_TLI_MIN_RES_MF ) ) &&
( uRemaining > uTotalPktLen ))
@@ -4220,7 +4228,11 @@ WLANTL_GetFrames
{
WDA_TLI_PROCESS_FRAME_LEN( vosTempBuf, usPktLen, uResLen, uTotalPktLen);
- VOS_ASSERT( usPktLen <= WLANTL_MAX_ALLOWED_LEN);
+ if (usPktLen > WLANTL_MAX_ALLOWED_LEN)
+ {
+ usPktLen = WLANTL_MAX_ALLOWED_LEN;
+ VOS_ASSERT(0);
+ }
TLLOG4(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
"WLAN TL:Resources needed by frame: %d", uResLen));
@@ -4368,8 +4380,11 @@ WLANTL_GetFrames
{
WDA_TLI_PROCESS_FRAME_LEN( vosTempBuf, usPktLen, uResLen, uTotalPktLen);
- VOS_ASSERT( usPktLen <= WLANTL_MAX_ALLOWED_LEN);
-
+ if (usPktLen > WLANTL_MAX_ALLOWED_LEN)
+ {
+ usPktLen = WLANTL_MAX_ALLOWED_LEN;
+ VOS_ASSERT(0);
+ }
TLLOG4(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
"WLAN TL:Resources needed by frame: %d", uResLen));
@@ -4462,8 +4477,14 @@ WLANTL_GetFrames
vos_pkt_walk_packet_chain( vosRoot, &vosDataBuff, 1/*true*/ );
*pvosDataBuff = vosDataBuff;
- VOS_ASSERT( pbUrgent );
- *pbUrgent = pTLCb->bUrgent;
+ if (pbUrgent)
+ {
+ *pbUrgent = pTLCb->bUrgent;
+ }
+ else
+ {
+ VOS_ASSERT( pbUrgent );
+ }
return ucResult;
}/* WLANTL_GetFrames */
@@ -5142,7 +5163,6 @@ WLANTL_ProcessBAPFrame
/* Send packet to BAP client*/
- VOS_ASSERT(pTLCb->tlBAPClient.pfnTlBAPRx != NULL);
if ( VOS_STATUS_SUCCESS != WDA_DS_TrimRxPacketInfo( vosTempBuff ) )
{
@@ -5173,7 +5193,10 @@ WLANTL_ProcessBAPFrame
pTLCb->tlBAPClient.pfnTlBAPRx( vos_get_global_context(VOS_MODULE_ID_TL,pTLCb),
vosTempBuff,
(WLANTL_BAPFrameEnumType)usType );
-
+ else
+ {
+ VOS_ASSERT(0);
+ }
return VOS_TRUE;
}
else
diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c
index 15d3fa13ab1c..01f970b856ca 100644
--- a/CORE/UTILS/FWLOG/dbglog_host.c
+++ b/CORE/UTILS/FWLOG/dbglog_host.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.
*
@@ -1634,7 +1634,7 @@ dbglog_parse_debug_logs(ol_scn_t scn, u_int8_t *data, u_int32_t datalen)
dropped = *((A_UINT32 *)datap);
if (dropped > 0) {
- AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%d log buffers are dropped \n", dropped));
+ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("%d log buffers are dropped \n", dropped));
}
datap += sizeof(dropped);
len -= sizeof(dropped);
diff --git a/CORE/VOSS/inc/vos_packet.h b/CORE/VOSS/inc/vos_packet.h
index 586479d43338..853282e8ce56 100644
--- a/CORE/VOSS/inc/vos_packet.h
+++ b/CORE/VOSS/inc/vos_packet.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2012,2014 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -63,6 +63,7 @@ typedef struct vos_pkt_t vos_pkt_t;
#define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL
#define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP
+#define VOS_PKT_TRAC_TYPE_MGMT_ACTION NBUF_PKT_TRAC_TYPE_MGMT_ACTION /* Managment action frame */
#define VOS_PKT_TRAC_DUMP_CMD 9999
@@ -73,12 +74,14 @@ typedef struct vos_pkt_t vos_pkt_t;
* skb Packet Pointer
* tracking_map packet type want to track
+ * dot11_type, frame type when the frame is in dot11 format
---------------------------------------------------------------------------*/
v_U8_t vos_pkt_get_proto_type
(
struct sk_buff *skb,
- v_U8_t tracking_map
+ v_U8_t tracking_map,
+ v_BOOL_t dot11_type
);
/*---------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 9e8e5e138aa4..97cddeffc503 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -649,11 +649,29 @@ VOS_STATUS vos_preStart( v_CONTEXT_t vosContext )
VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO,
"vos prestart");
- VOS_ASSERT(gpVosContext == pVosContext);
+ if (gpVosContext != pVosContext)
+ {
+ VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Context mismatch", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_INVAL;
+ }
- VOS_ASSERT( NULL != pVosContext->pMACContext);
+ if (pVosContext->pMACContext == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: MAC NULL context", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_INVAL;
+ }
- VOS_ASSERT( NULL != pVosContext->pWDAContext);
+ if (pVosContext->pWDAContext == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: WDA NULL context", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_INVAL;
+ }
#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC)
scn = vos_get_context(VOS_MODULE_ID_HIF, gpVosContext);
diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c
index 2c1a02e0bae8..9dd2ad73425c 100644
--- a/CORE/VOSS/src/vos_nvitem.c
+++ b/CORE/VOSS/src/vos_nvitem.c
@@ -3243,6 +3243,14 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy,
__func__, wiphy->bands[i]->channels[j].center_freq);
wiphy->bands[i]->channels[j].flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
}
+
+ if (!(reg_rule->flags & NL80211_RRF_NO_IBSS))
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s: Remove no ibss restriction for %u",
+ __func__, wiphy->bands[i]->channels[j].center_freq);
+ wiphy->bands[i]->channels[j].flags &= ~IEEE80211_CHAN_NO_IBSS;
+ }
}
if (wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_DISABLED)
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 8bb6bfae99b6..283b8aec82ff 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -245,12 +245,14 @@ VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket,
* skb Packet Pointer
* tracking_map packet type want to track
+ * dot11_type, type of dot11 frame
---------------------------------------------------------------------------*/
v_U8_t vos_pkt_get_proto_type
(
struct sk_buff *skb,
- v_U8_t tracking_map
+ v_U8_t tracking_map,
+ v_U8_t dot11_type
)
{
v_U8_t pkt_proto_type = 0;
@@ -258,6 +260,15 @@ v_U8_t vos_pkt_get_proto_type
v_U16_t SPort;
v_U16_t DPort;
+ if (dot11_type)
+ {
+ if (dot11_type == (VOS_PKT_TRAC_TYPE_MGMT_ACTION & tracking_map))
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_MGMT_ACTION;
+
+ /* Protocol type map */
+ return pkt_proto_type;
+ }
+
/* EAPOL Tracking enabled */
if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map)
{
@@ -309,6 +320,8 @@ void vos_pkt_trace_buf_update
slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF;
trace_buffer[slot].order = trace_buffer_order;
trace_buffer[slot].event_time = vos_timer_get_system_time();
+ vos_mem_zero(trace_buffer[slot].event_string,
+ sizeof(trace_buffer[slot].event_string));
vos_mem_copy(trace_buffer[slot].event_string,
event_string,
(VOS_PKT_TRAC_MAX_STRING_LEN < strlen(event_string))?
diff --git a/CORE/VOSS/src/vos_timer.c b/CORE/VOSS/src/vos_timer.c
index 79da562f7cc4..badb44c4899d 100644
--- a/CORE/VOSS/src/vos_timer.c
+++ b/CORE/VOSS/src/vos_timer.c
@@ -178,8 +178,14 @@ static void vos_linux_timer_callback (unsigned long data)
tryAllowingSleep( type );
- VOS_ASSERT( callback );
-
+ if (callback == NULL)
+ {
+ VOS_ASSERT(0);
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: No TIMER callback, Could not enqueue timer to any queue",
+ __func__);
+ return;
+ }
// If timer has expired then call vos_client specific callback
if ( vos_sched_is_tx_thread( threadId ) )
{
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 6fc2dbc33063..7f53abcd122b 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -10156,7 +10156,13 @@ void WDA_GTKOffloadRespCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparam
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
- VOS_ASSERT(NULL != pWdaParams);
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
vos_mem_free(pWdaParams->wdaMsgParam) ;
vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
@@ -10288,8 +10294,13 @@ void WDA_GtkOffloadGetInfoRespCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkO
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
- VOS_ASSERT(NULL != pWdaParams);
-
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __func__);
+ VOS_ASSERT(0);
+ return;
+ }
pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
diff --git a/CORE/WDA/src/wlan_qct_wda_ds.c b/CORE/WDA/src/wlan_qct_wda_ds.c
index a271ebbb3021..c188f93d799a 100644
--- a/CORE/WDA/src/wlan_qct_wda_ds.c
+++ b/CORE/WDA/src/wlan_qct_wda_ds.c
@@ -498,7 +498,8 @@ WDA_DS_BuildTxPacketInfo
WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ),
(v_PVOID_t)pvDestMacAddr,
&usMacAddrSize );
- if ( VOS_STATUS_SUCCESS != vosStatus )
+ if ((VOS_STATUS_SUCCESS != vosStatus) ||
+ (usMacAddrSize != VOS_MAC_ADDR_SIZE))
{
VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
"WDA:Failed while attempting to extract MAC Addr %d",
@@ -507,8 +508,6 @@ WDA_DS_BuildTxPacketInfo
return VOS_STATUS_E_FAULT;
}
- VOS_ASSERT(usMacAddrSize == VOS_MAC_ADDR_SIZE);
-
vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr );
// ADDR2
diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
index 60f2ed948769..71c86420f590 100644
--- a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
+++ b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c
@@ -289,9 +289,14 @@ wpt_status wpalPacketRawTrimHead(wpt_packet *pPkt, wpt_uint32 size)
return eWLAN_PAL_STATUS_E_INVAL;
}
- VOS_ASSERT( (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ||
- (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) );
-
+ if (!((eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ||
+ (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt))))
+ {
+ WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s : neither 80211 managment packet nor RAW packet", __func__);
+ VOS_ASSERT(0);
+ return eWLAN_PAL_STATUS_E_INVAL;
+ }
if( !VOS_IS_STATUS_SUCCESS(vos_pkt_trim_head(WPAL_TO_VOS_PKT(pPkt), (v_SIZE_t)size)) )
{
WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s Invalid trim(%d)",
@@ -322,8 +327,15 @@ wpt_status wpalPacketRawTrimTail(wpt_packet *pPkt, wpt_uint32 size)
return eWLAN_PAL_STATUS_E_INVAL;
}
- VOS_ASSERT( (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ||
- (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) );
+ if (!((eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) ||
+ (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt))))
+ {
+ WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "%s : neither 80211 managment packet nor RAW packet", __func__);
+ VOS_ASSERT(0);
+ return eWLAN_PAL_STATUS_E_INVAL;
+ }
+
if( !VOS_IS_STATUS_SUCCESS(vos_pkt_trim_tail(WPAL_TO_VOS_PKT(pPkt), (v_SIZE_t)size)) )
{
WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s Invalid trim(%d)",
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index 5d781979e49f..d620b70f93c2 100755
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -384,6 +384,14 @@ gEnable2x2=1
gVhtRxMCS2x2=2
gVhtTxMCS2x2=2
+# Set txchainmask and rxchainmask
+# These parameters are used only if gEnable2x2 is 0
+# Valid values are 1,2
+# Set gSetTxChainmask1x1=1 or gSetRxChainmask1x1=1 to select chain0.
+# Set gSetTxChainmask1x1=2 or gSetRxChainmask1x1=2 to select chain1.
+gSetTxChainmask1x1=1
+gSetRxChainmask1x1=1
+
# Enable CRDA regulatory support by settings default country code
#gCrdaDefaultCountryCode=TW