diff options
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 |
