diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2013-12-04 06:47:51 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2013-12-04 06:47:51 -0800 |
| commit | 85095b353cf04ab9cf879b9e22131b09117bc671 (patch) | |
| tree | 9164dec761652f639d4721e1094a2b2fa74dd9ed | |
| parent | 527ae6e1cdd2b330b25c2b225760ac42f22f3f8d (diff) | |
| parent | 91e8d0f56544c7190831e74d6e48f3deabbefc6b (diff) | |
Merge "Merge remote-tracking branch 'origin/caf/caf-wlan/master'"
65 files changed, 3697 insertions, 596 deletions
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h index e0d1fe9d44c7..c3e4ed7f2a62 100644 --- a/CORE/HDD/inc/qc_sap_ioctl.h +++ b/CORE/HDD/inc/qc_sap_ioctl.h @@ -246,6 +246,21 @@ typedef struct #define MAX_VAR_ARGS 7 #define QCSAP_IOCTL_PRIV_GET_SOFTAP_LINK_SPEED (SIOCIWFIRSTPRIV + 31) +#ifdef QCA_WIFI_2_0 +/* Private ioctl for firmware debug log */ +#define QCSAP_DBGLOG_LOG_LEVEL 31 +#define QCSAP_DBGLOG_VAP_ENABLE 32 +#define QCSAP_DBGLOG_VAP_DISABLE 33 +#define QCSAP_DBGLOG_MODULE_ENABLE 34 +#define QCSAP_DBGLOG_MODULE_DISABLE 35 +#define QCSAP_DBGLOG_MOD_LOG_LEVEL 36 +#define QCSAP_DBGLOG_TYPE 37 +#define QCSAP_DBGLOG_REPORT_ENABLE 38 +#ifdef DEBUG +#define QCSAP_FW_CRASH_INJECT 39 +#endif +#endif /* QCA_WIFI_2_0 */ + enum { QCSAP_PARAM_MAX_ASSOC = 1, QCSAP_PARAM_GET_WLAN_DBG = 4, diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index f93d13ba0d0e..895b6dd074c6 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -1814,6 +1814,28 @@ typedef enum #define CFG_VHT_MPDU_LEN_DEFAULT ( 0 ) #endif +#define CFG_MAX_WOW_FILTERS_NAME "gMaxWoWFilters" +#define CFG_MAX_WOW_FILTERS_MIN ( 0 ) +#define CFG_MAX_WOW_FILTERS_MAX ( 22 ) +#define CFG_MAX_WOW_FILTERS_DEFAULT ( 22 ) + +/* + * WOW Enable/Disable. + * 0 - Disable both magic pattern match and pattern byte match. + * 1 - Enable magic pattern match on all interfaces. + * 2 - Enable pattern byte match on all interfaces. + * 3 - Enable both magic patter and pattern byte match on all interfaces. + */ +#define CFG_WOW_STATUS_NAME "gEnableWoW" +#define CFG_WOW_ENABLE_MIN ( 0 ) +#define CFG_WOW_ENABLE_MAX ( 3 ) +#define CFG_WOW_STATUS_DEFAULT ( 3 ) + +#define CFG_COALESING_IN_IBSS_NAME "gCoalesingInIBSS" +#define CFG_COALESING_IN_IBSS_MIN (0) +#define CFG_COALESING_IN_IBSS_MAX (1) +#define CFG_COALESING_IN_IBSS_DEFAULT (0) //disabled + /*--------------------------------------------------------------------------- Type declarations -------------------------------------------------------------------------*/ @@ -2204,6 +2226,9 @@ typedef struct v_U8_t fVhtAmpduLenExponent; v_U32_t vhtMpduLen; #endif + v_U8_t maxWoWFilters; + v_U8_t wowEnable; + v_U8_t isCoalesingInIBSSAllowed; } hdd_config_t; /*--------------------------------------------------------------------------- Function declarations and documenation diff --git a/CORE/HDD/inc/wlan_hdd_power.h b/CORE/HDD/inc/wlan_hdd_power.h index 1759728a5520..d0d81bed8ae1 100644 --- a/CORE/HDD/inc/wlan_hdd_power.h +++ b/CORE/HDD/inc/wlan_hdd_power.h @@ -89,7 +89,7 @@ #endif /* SSR shutdown & re-init functions */ VOS_STATUS hdd_wlan_shutdown(void); - VOS_STATUS hdd_wlan_re_init(void); + VOS_STATUS hdd_wlan_re_init(void *hif_sc); void hdd_conf_mcastbcast_filter(hdd_context_t* pHddCtx, v_BOOL_t setfilter); VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t* pAdapter, v_BOOL_t fenable); diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index db6eb2d97835..762689a7374d 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -749,8 +749,12 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo * netif_tx_disable(dev); netif_carrier_off(dev); - INIT_COMPLETION(pAdapter->disconnect_comp_var); - hdd_connSetConnectionState( pHddStaCtx, eConnectionState_Disconnecting ); + if(pHddStaCtx->conn_info.connState != eConnectionState_Disconnecting) + { + INIT_COMPLETION(pAdapter->disconnect_comp_var); + hdd_connSetConnectionState( pHddStaCtx, eConnectionState_Disconnecting ); + } + /* If only STA mode is on */ if((pHddCtx->concurrency_mode <= 1) && (pHddCtx->no_of_sessions[WLAN_HDD_INFRA_STATION] <=1)) { @@ -2411,6 +2415,13 @@ eHalStatus hdd_smeRoamCallback( void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U3 } break; case eCSR_ROAM_LOSTLINK: + if(roamResult == eCSR_ROAM_RESULT_LOSTLINK) { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, + "Roaming started due to connection lost"); + netif_tx_disable(pAdapter->dev); + netif_carrier_off(pAdapter->dev); + break; + } case eCSR_ROAM_DISASSOCIATED: { hdd_context_t* pHddCtx = (hdd_context_t*)pAdapter->pHddCtx; diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 683672055dab..cc9e69353064 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -2326,6 +2326,26 @@ REG_VARIABLE( CFG_VHT_MPDU_LEN_NAME, WLAN_PARAM_Integer, CFG_VHT_MPDU_LEN_MAX), #endif +REG_VARIABLE( CFG_MAX_WOW_FILTERS_NAME, WLAN_PARAM_Integer, + hdd_config_t, maxWoWFilters, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK , + CFG_MAX_WOW_FILTERS_DEFAULT, + CFG_MAX_WOW_FILTERS_MIN, + CFG_MAX_WOW_FILTERS_MAX), + +REG_VARIABLE( CFG_WOW_STATUS_NAME, WLAN_PARAM_Integer, + hdd_config_t, wowEnable, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_WOW_STATUS_DEFAULT, + CFG_WOW_ENABLE_MIN, + CFG_WOW_ENABLE_MAX), + +REG_VARIABLE( CFG_COALESING_IN_IBSS_NAME , WLAN_PARAM_Integer, + hdd_config_t, isCoalesingInIBSSAllowed, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_COALESING_IN_IBSS_DEFAULT, + CFG_COALESING_IN_IBSS_MIN, + CFG_COALESING_IN_IBSS_MAX ), }; /* @@ -2706,6 +2726,7 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [enableRxSTBC] Value = [%u] ",pHddCtx->cfg_ini->enableRxSTBC); VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableLpwrImgTransition] Value = [%u] ",pHddCtx->cfg_ini->enableLpwrImgTransition); VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableSSR] Value = [%u] ",pHddCtx->cfg_ini->enableSSR); + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gCoalesingInIBSS] Value = [%lu] " ,pHddCtx->cfg_ini->isCoalesingInIBSSAllowed); } @@ -4145,6 +4166,11 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx ) smeConfig.csrConfig.enableTxLdpc = pConfig->enableTxLdpc; + smeConfig.csrConfig.isCoalesingInIBSSAllowed = + pHddCtx->cfg_ini->isCoalesingInIBSSAllowed; + + + /* update SSR config */ sme_UpdateEnableSSR((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->enableSSR); /* Update the Directed scan offload setting */ diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index de8d832b6a3a..2b853e02923c 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -932,9 +932,6 @@ int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter, if (!params->head && !old) return -EINVAL; - if (params->tail && !params->tail_len) - return -EINVAL; - #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)) /* Kernel 3.0 is not updating dtim_period for set beacon */ if (!params->dtim_period) @@ -1812,21 +1809,21 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) if (params->ssid != NULL) { + vos_mem_copy(pConfig->SSIDinfo.ssid.ssId, params->ssid, params->ssid_len); + pConfig->SSIDinfo.ssid.length = params->ssid_len; + switch (params->hidden_ssid) { case NL80211_HIDDEN_SSID_NOT_IN_USE: hddLog(LOG1, "HIDDEN_SSID_NOT_IN_USE"); - memcpy(pConfig->SSIDinfo.ssid.ssId, params->ssid, - params->ssid_len); - pConfig->SSIDinfo.ssid.length = params->ssid_len; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_NOT_IN_USE; break; case NL80211_HIDDEN_SSID_ZERO_LEN: hddLog(LOG1, "HIDDEN_SSID_ZERO_LEN"); - pConfig->SSIDinfo.ssidHidden = VOS_TRUE; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_ZERO_LEN; break; case NL80211_HIDDEN_SSID_ZERO_CONTENTS: hddLog(LOG1, "HIDDEN_SSID_ZERO_CONTENTS"); - pConfig->SSIDinfo.ssidHidden = VOS_TRUE; - pConfig->SSIDinfo.ssid.length = params->ssid_len; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_ZERO_CONTENTS; break; default: hddLog(LOGE, "Wrong hidden_ssid param %d", params->hidden_ssid); @@ -1836,20 +1833,21 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, #else if (ssid != NULL) { + vos_mem_copy(pConfig->SSIDinfo.ssid.ssId, ssid, ssid_len); + pConfig->SSIDinfo.ssid.length = ssid_len; + switch (hidden_ssid) { case NL80211_HIDDEN_SSID_NOT_IN_USE: hddLog(LOG1, "HIDDEN_SSID_NOT_IN_USE"); - memcpy(pConfig->SSIDinfo.ssid.ssId, ssid, ssid_len); - pConfig->SSIDinfo.ssid.length = ssid_len; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_NOT_IN_USE; break; case NL80211_HIDDEN_SSID_ZERO_LEN: hddLog(LOG1, "HIDDEN_SSID_ZERO_LEN"); - pConfig->SSIDinfo.ssidHidden = VOS_TRUE; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_ZERO_LEN; break; case NL80211_HIDDEN_SSID_ZERO_CONTENTS: hddLog(LOG1, "HIDDEN_SSID_ZERO_CONTENTS"); - pConfig->SSIDinfo.ssidHidden = VOS_TRUE; - pConfig->SSIDinfo.ssid.length = ssid_len; + pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_ZERO_CONTENTS; break; default: hddLog(LOGE, "Wrong hidden_ssid param %d", hidden_ssid); @@ -5678,7 +5676,7 @@ int wlan_hdd_disconnect( hdd_adapter_t *pAdapter, u16 reason ) /*stop tx queues*/ netif_tx_disable(pAdapter->dev); netif_carrier_off(pAdapter->dev); - pHddStaCtx->conn_info.connState = eConnectionState_NotConnected; + pHddStaCtx->conn_info.connState = eConnectionState_Disconnecting; (WLAN_HDD_GET_CTX(pAdapter))->isAmpAllowed = VOS_TRUE; INIT_COMPLETION(pAdapter->disconnect_comp_var); /*issue disconnect*/ @@ -5878,7 +5876,9 @@ static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy, hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter); tCsrRoamProfile *pRoamProfile; int status; + bool alloc_bssid = VOS_FALSE; hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); + hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); ENTER(); @@ -5908,6 +5908,37 @@ static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy, return -EINVAL; } + /* BSSID is provided by upper layers hence no need to AUTO generate */ + if (NULL != params->bssid) { + if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_IBSS_AUTO_BSSID, 0, + NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE) { + hddLog (VOS_TRACE_LEVEL_ERROR, + "%s:ccmCfgStInt faild for WNI_CFG_IBSS_AUTO_BSSID", __func__); + return -EIO; + } + } + else if(pHddCtx->cfg_ini->isCoalesingInIBSSAllowed == 0) + { + if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_IBSS_AUTO_BSSID, 0, + NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE) + { + hddLog (VOS_TRACE_LEVEL_ERROR, + "%s:ccmCfgStInt faild for WNI_CFG_IBSS_AUTO_BSSID", __func__); + return -EIO; + } + params->bssid = vos_mem_malloc(sizeof(VOS_MAC_ADDR_SIZE)); + if (!params->bssid) + { + hddLog (VOS_TRACE_LEVEL_ERROR, + "%s:Failed memory allocation", __func__); + return -EIO; + } + vos_mem_copy((v_U8_t *)params->bssid, + (v_U8_t *)&pHddCtx->cfg_ini->IbssBssid.bytes[0], + VOS_MAC_ADDR_SIZE); + alloc_bssid = VOS_TRUE; + } + /* Set Channel */ if (NULL != #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)) @@ -6000,6 +6031,14 @@ static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy, status = wlan_hdd_cfg80211_connect_start(pAdapter, params->ssid, params->ssid_len, params->bssid, 0); + if (NULL != params->bssid && + pHddCtx->cfg_ini->isCoalesingInIBSSAllowed == 0 && + alloc_bssid == VOS_TRUE) + { + vos_mem_free(params->bssid); + } + + if (0 > status) { hddLog(VOS_TRACE_LEVEL_ERROR, "%s: connect failed", __func__); diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index 529baddc5c25..e7d028bbbc7f 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -93,6 +93,11 @@ #include "wlan_hdd_power.h" #include "wlan_hdd_packet_filtering.h" +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +#include <wlan_qct_wda.h> +#include <if_pci.h> +#endif + #define HDD_SSR_BRING_UP_TIME 10000 static eHalStatus g_full_pwr_status; @@ -713,7 +718,7 @@ VOS_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, v_BOOL_t fenable) tSirHostOffloadReq offLoadRequest; hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); - hddLog(VOS_TRACE_LEVEL_ERROR, "%s: \n", __func__); + hddLog(VOS_TRACE_LEVEL_INFO, "%s: \n", __func__); if(fenable) { @@ -1103,6 +1108,9 @@ void hdd_suspend_wlan(void (*callback)(void *callbackContext), #ifdef QCA_WIFI_2_0 send_suspend_ind: + //stop all TX queues before suspend + netif_tx_disable(pAdapter->dev); + #endif /* Keep this suspend indication at the end (before processing next adaptor) * for discrete. This indication is considered as trigger point to start @@ -1385,7 +1393,13 @@ void hdd_resume_wlan(void) } } +#ifdef QCA_WIFI_2_0 + //wake the tx queues + netif_tx_wake_all_queues(pAdapter->dev); +#endif + hdd_conf_resume_ind(pAdapter); + status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext ); pAdapterNode = pNext; } @@ -1478,9 +1492,11 @@ VOS_STATUS hdd_wlan_shutdown(void) hddLog(VOS_TRACE_LEVEL_FATAL, "%s: WLAN driver shutting down! ",__func__); +#ifdef QCA_WIFI_ISOC /* if re-init never happens, then do SSR1 */ hdd_ssr_timer_init(); hdd_ssr_timer_start(HDD_SSR_BRING_UP_TIME); +#endif /* Get the global VOSS context. */ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL); @@ -1494,7 +1510,14 @@ VOS_STATUS hdd_wlan_shutdown(void) hddLog(VOS_TRACE_LEVEL_FATAL,"%s: HDD context is Null",__func__); return VOS_STATUS_E_FAILURE; } + +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + vos_set_logp_in_progress(VOS_MODULE_ID_VOSS, TRUE); + pHddCtx->isLogpInProgress = TRUE; +#endif + hdd_reset_all_adapters(pHddCtx); + #ifdef QCA_WIFI_ISOC /* DeRegister with platform driver as client for Suspend/Resume */ vosStatus = hddDeregisterPmOps(pHddCtx); @@ -1524,6 +1547,7 @@ VOS_STATUS hdd_wlan_shutdown(void) complete(&vosSchedContext->ResumeMcEvent); pHddCtx->isMcThreadSuspended= FALSE; } +#ifdef QCA_WIFI_ISOC if(TRUE == pHddCtx->isTxThreadSuspended){ complete(&vosSchedContext->ResumeTxEvent); pHddCtx->isTxThreadSuspended= FALSE; @@ -1532,6 +1556,8 @@ VOS_STATUS hdd_wlan_shutdown(void) complete(&vosSchedContext->ResumeRxEvent); pHddCtx->isRxThreadSuspended= FALSE; } +#endif + /* Reset the Suspend Variable */ pHddCtx->isWlanSuspended = FALSE; @@ -1545,7 +1571,7 @@ VOS_STATUS hdd_wlan_shutdown(void) set_bit(MC_POST_EVENT_MASK, &vosSchedContext->mcEventFlag); wake_up_interruptible(&vosSchedContext->mcWaitQueue); wait_for_completion_interruptible(&vosSchedContext->McShutdown); - +#ifdef QCA_WIFI_ISOC /* Wait for TX to exit */ hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Shutting down TX thread",__func__); set_bit(TX_SHUTDOWN_EVENT_MASK, &vosSchedContext->txEventFlag); @@ -1559,6 +1585,7 @@ VOS_STATUS hdd_wlan_shutdown(void) set_bit(RX_POST_EVENT_MASK, &vosSchedContext->rxEventFlag); wake_up_interruptible(&vosSchedContext->rxWaitQueue); wait_for_completion_interruptible(&vosSchedContext->RxShutdown); +#endif #ifdef WLAN_BTAMP_FEATURE vosStatus = WLANBAP_Stop(pVosContext); @@ -1568,8 +1595,21 @@ VOS_STATUS hdd_wlan_shutdown(void) "%s: Failed to stop BAP",__func__); } #endif //WLAN_BTAMP_FEATURE + +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + vosStatus = WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL); + + if (!VOS_IS_STATUS_SUCCESS(vosStatus)) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: Failed to stop WDA", __func__); + VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus)); + WDA_setNeedShutdown(pVosContext); + } +#else vosStatus = vos_wda_shutdown(pVosContext); VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus)); +#endif hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Doing SME STOP",__func__); /* Stop SME - Cannot invoke vos_stop as vos_stop relies @@ -1588,12 +1628,18 @@ VOS_STATUS hdd_wlan_shutdown(void) vosStatus = WLANTL_Stop(pVosContext); VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus)); +#ifndef QCA_WIFI_ISOC + hif_disable_isr(((VosContextType*)pVosContext)->pHIFContext); +#endif + hdd_unregister_mcast_bcast_filter(pHddCtx); hddLog(VOS_TRACE_LEVEL_INFO, "%s: Flush Queues",__func__); /* Clean up message queues of TX and MC thread */ vos_sched_flush_mc_mqs(vosSchedContext); +#ifdef QCA_WIFI_ISOC vos_sched_flush_tx_mqs(vosSchedContext); vos_sched_flush_rx_mqs(vosSchedContext); +#endif /* Deinit all the TX and MC queues */ vos_sched_deinit_mqs(vosSchedContext); @@ -1621,7 +1667,7 @@ VOS_STATUS hdd_wlan_shutdown(void) /* the HDD interface to WLAN driver re-init. * This is called to initialize/start WLAN driver after a shutdown. */ -VOS_STATUS hdd_wlan_re_init(void) +VOS_STATUS hdd_wlan_re_init(void *hif_sc) { VOS_STATUS vosStatus; v_CONTEXT_t pVosContext = NULL; @@ -1635,9 +1681,17 @@ VOS_STATUS hdd_wlan_re_init(void) WLANBAP_ConfigType btAmpConfig; #endif +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + adf_os_device_t adf_ctx; +#endif + +#ifdef QCA_WIFI_ISOC hdd_ssr_timer_del(); +#endif + hdd_prevent_suspend(); +#ifdef QCA_WIFI_ISOC #ifdef HAVE_WCNSS_CAL_DOWNLOAD /* wait until WCNSS driver downloads NV */ while (!wcnss_device_ready() && 5 >= ++max_retries) { @@ -1648,6 +1702,42 @@ VOS_STATUS hdd_wlan_re_init(void) goto err_re_init; } #endif +#endif + + /* Get the VOS context */ + pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL); + if(pVosContext == NULL) + { + hddLog(VOS_TRACE_LEVEL_FATAL, "%s: Failed vos_get_global_context", + __func__); + goto err_re_init; + } + + /* Get the HDD context */ + pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, pVosContext); + if(!pHddCtx) + { + hddLog(VOS_TRACE_LEVEL_FATAL, "%s: HDD context is Null", __func__); + goto err_re_init; + } + +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + /* Initialize the adf_ctx handle */ + adf_ctx = vos_mem_malloc(sizeof(adf_os_device_t)); + + if (!adf_ctx) { + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: Failed to allocate adf_ctx"); + goto err_re_init; + } + vos_mem_zero(adf_ctx, sizeof(adf_os_device_t)); + + hif_init_adf_ctx(adf_ctx, hif_sc); + ((VosContextType*)pVosContext)->pHIFContext = hif_sc; + + /* Store target type and target version info in HDD ctx */ + pHddCtx->target_type = ((struct ol_softc *)hif_sc)->target_type; + ((VosContextType*)(pVosContext))->adf_ctx = adf_ctx; +#endif /* The driver should always be initialized in STA mode after SSR */ hdd_set_conparam(0); @@ -1660,13 +1750,10 @@ VOS_STATUS hdd_wlan_re_init(void) goto err_re_init; } - /* Get the HDD context. */ - pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, pVosContext); - if(!pHddCtx) - { - hddLog(VOS_TRACE_LEVEL_FATAL,"%s: HDD context is Null",__func__); - goto err_vosclose; - } +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) && !defined(REMOVE_PKT_LOG) + hif_init_pdev_txrx_handle(hif_sc, + vos_get_context(VOS_MODULE_ID_TXRX, pVosContext)); +#endif /* Save the hal context in Adapter */ pHddCtx->hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME, pVosContext ); diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c index c37523f46a1e..0db2bf880376 100644 --- a/CORE/HDD/src/wlan_hdd_ftm.c +++ b/CORE/HDD/src/wlan_hdd_ftm.c @@ -1043,7 +1043,9 @@ VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext ) { VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, "Failed to WDA prestart "); +#ifdef QCA_WIFI_ISOC macStop(pVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP); +#endif ccmStop(pVosContext->pMACContext); VOS_ASSERT(0); return VOS_STATUS_E_FAILURE; @@ -1073,7 +1075,9 @@ VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext ) { VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_FATAL, "Failed to Start HTC"); +#ifdef QCA_WIFI_ISOC macStop(gpVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP); +#endif ccmStop(gpVosContext->pMACContext); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAILURE; @@ -1343,7 +1347,9 @@ static VOS_STATUS wlan_ftm_send_response(hdd_context_t *pHddCtx){ static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx) { VOS_STATUS vStatus = VOS_STATUS_SUCCESS; +#ifdef QCA_WIFI_ISOC tSirRetStatus sirStatus = eSIR_SUCCESS; +#endif pVosContextType pVosContext = (pVosContextType)(pHddCtx->pvosContext); tHalMacStartParameters halStartParams; @@ -1427,6 +1433,7 @@ static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx) halStartParams.driverType = eDRIVER_TYPE_MFG; +#ifdef QCA_WIFI_ISOC /* Start the MAC */ sirStatus = macStart(pVosContext->pMACContext,(v_PVOID_t)&halStartParams); @@ -1438,6 +1445,7 @@ static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx) goto err_wda_stop; } +#endif /* #ifdef QCA_WIFI_ISOC */ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: MAC correctly started",__func__); @@ -1447,6 +1455,7 @@ static int wlan_hdd_ftm_start(hdd_context_t *pHddCtx) return VOS_STATUS_SUCCESS; +#ifdef QCA_WIFI_ISOC err_wda_stop: vos_event_reset(&(pVosContext->wdaCompleteEvent)); WDA_stop(pVosContext, HAL_STOP_TYPE_RF_KILL); @@ -1466,6 +1475,7 @@ err_wda_stop: } VOS_ASSERT(0); } +#endif /* #ifdef QCA_WIFI_ISOC */ err_status_failure: @@ -1473,10 +1483,18 @@ err_status_failure: } +#if defined(QCA_WIFI_2_0) && defined(QCA_WIFI_FTM) +int hdd_ftm_start(hdd_context_t *pHddCtx) +{ + return wlan_hdd_ftm_start(pHddCtx); +} +#endif static int wlan_ftm_stop(hdd_context_t *pHddCtx) { +#ifdef QCA_WIFI_ISOC VOS_STATUS vosStatus; +#endif if(pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED) { @@ -1496,6 +1514,7 @@ static int wlan_ftm_stop(hdd_context_t *pHddCtx) } else { +#ifdef QCA_WIFI_ISOC vosStatus = macStop(hHal, HAL_STOP_TYPE_SYS_DEEP_SLEEP ); if (!VOS_IS_STATUS_SUCCESS(vosStatus)) { @@ -1503,6 +1522,7 @@ static int wlan_ftm_stop(hdd_context_t *pHddCtx) "%s: Failed to stop SYS", __func__); VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) ); } +#endif } @@ -1512,6 +1532,13 @@ static int wlan_ftm_stop(hdd_context_t *pHddCtx) return WLAN_FTM_SUCCESS; } +#if defined(QCA_WIFI_2_0) && defined(QCA_WIFI_FTM) +int hdd_ftm_stop(hdd_context_t *pHddCtx) +{ + return wlan_ftm_stop(pHddCtx); +} +#endif + /**--------------------------------------------------------------------------- \brief wlan_hdd_ftm_get_nv_table() - diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 23e350104cd9..3f2ff86cc49e 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -78,6 +78,13 @@ #include <bap_hdd_main.h> #include "wlan_hdd_p2p.h" +#ifdef QCA_WIFI_2_0 +#include "wma.h" +#ifdef DEBUG +#include "wma_api.h" +#endif +#endif /* QCA_WIFI_2_0 */ + #define IS_UP(_dev) \ (((_dev)->flags & (IFF_RUNNING|IFF_UP)) == (IFF_RUNNING|IFF_UP)) #define IS_UP_AUTO(_ic) \ @@ -1075,6 +1082,89 @@ static iw_softap_setparam(struct net_device *dev, break; } +#ifdef QCA_WIFI_2_0 + /* Firmware debug log */ + case QCSAP_DBGLOG_LOG_LEVEL: + { + hddLog(LOG1, "QCSAP_DBGLOG_LOG_LEVEL val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_LOG_LEVEL, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_VAP_ENABLE: + { + hddLog(LOG1, "QCSAP_DBGLOG_VAP_ENABLE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_VAP_ENABLE, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_VAP_DISABLE: + { + hddLog(LOG1, "QCSAP_DBGLOG_VAP_DISABLE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_VAP_DISABLE, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_MODULE_ENABLE: + { + hddLog(LOG1, "QCSAP_DBGLOG_MODULE_ENABLE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_MODULE_ENABLE, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_MODULE_DISABLE: + { + hddLog(LOG1, "QCSAP_DBGLOG_MODULE_DISABLE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_MODULE_DISABLE, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_MOD_LOG_LEVEL: + { + hddLog(LOG1, "QCSAP_DBGLOG_MOD_LOG_LEVEL val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_MOD_LOG_LEVEL, + set_value, DBG_CMD); + break; + } + + case QCSAP_DBGLOG_TYPE: + { + hddLog(LOG1, "QCSAP_DBGLOG_TYPE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_TYPE, + set_value, DBG_CMD); + break; + } + case QCSAP_DBGLOG_REPORT_ENABLE: + { + hddLog(LOG1, "QCSAP_DBGLOG_REPORT_ENABLE val %d", set_value); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)WMI_DBGLOG_REPORT_ENABLE, + set_value, DBG_CMD); + break; + } +#ifdef DEBUG + case QCSAP_FW_CRASH_INJECT: + { + hddLog(LOGE, "WE_FW_CRASH_INJECT"); + ret = process_wma_set_command((int)pHostapdAdapter->sessionId, + (int)GEN_PARAM_CRASH_INJECT, + 0, GEN_CMD); + break; + } +#endif +#endif /* QCA_WIFI_2_0 */ default: hddLog(LOGE, FL("Invalid setparam command %d value %d"), sub_cmd, set_value); @@ -2751,6 +2841,55 @@ static const struct iw_priv_args hostapd_private_args[] = { IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hideSSID" }, { QCSAP_PARAM_SET_MC_RATE, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setMcRate" }, + +#ifdef QCA_WIFI_2_0 + /* Sub-cmds DBGLOG specific commands */ + { QCSAP_DBGLOG_LOG_LEVEL , + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_loglevel" }, + + { QCSAP_DBGLOG_VAP_ENABLE , + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_vapon" }, + + { QCSAP_DBGLOG_VAP_DISABLE , + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_vapoff" }, + + { QCSAP_DBGLOG_MODULE_ENABLE , + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_modon" }, + + { QCSAP_DBGLOG_MODULE_DISABLE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_modoff" }, + + { QCSAP_DBGLOG_MOD_LOG_LEVEL, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_mod_loglevel" }, + + { QCSAP_DBGLOG_TYPE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_type" }, + { QCSAP_DBGLOG_REPORT_ENABLE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "dl_report" }, +#ifdef DEBUG + { QCSAP_FW_CRASH_INJECT, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "crash_inject" }, +#endif +#endif /* QCA_WIFI_2_0 */ + { QCSAP_IOCTL_GETPARAM, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam" }, diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 60f90013c11e..f3487a847cc1 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -186,6 +186,12 @@ struct completion wlan_start_comp; extern void hif_init_adf_ctx(adf_os_device_t adf_ctx, v_VOID_t *hif_sc); extern int hif_register_driver(void); extern void hif_unregister_driver(void); + +#if defined(QCA_WIFI_2_0) && defined(QCA_WIFI_FTM) +extern int hdd_ftm_start(hdd_context_t *pHddCtx); +extern int hdd_ftm_stop(hdd_context_t *pHddCtx); +#endif + #endif static int hdd_netdev_notifier_call(struct notifier_block * nb, @@ -4992,7 +4998,14 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx) if (VOS_FTM_MODE == hdd_get_conparam()) { +#if defined(QCA_WIFI_2_0) && defined(QCA_WIFI_FTM) + if (hdd_ftm_stop(pHddCtx)) + { + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: hdd_ftm_stop Failed",__func__); + } +#endif wlan_hdd_ftm_close(pHddCtx); + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: FTM driver unloaded",__func__); goto free_hdd_ctx; } //Stop the Interface TX queue. @@ -5042,7 +5055,8 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx) // we are about to Request Full Power, and since that is synchronized, // the expectation is that by the time Request Full Power has completed, // all scans will be cancelled. - hdd_abort_mac_scan( pHddCtx, pAdapter->sessionId); + if(pAdapter) + hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId); if(!pConfig->enablePowersaveOffload) { @@ -5243,7 +5257,7 @@ void __hdd_wlan_exit(void) return; /* module exit should never proceed if SSR is not completed */ - while(isWDresetInProgress()){ + while(pHddCtx->isLogpInProgress){ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL, "%s:SSR in Progress; block rmmod for 1 second!!!", __func__); @@ -5654,6 +5668,9 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) goto err_config; } +#ifndef QCA_WIFI_2_0 + pHddCtx->cfg_ini->maxWoWFilters = WOWL_MAX_PTRNS_ALLOWED; +#endif /* INI has been read, initialise the configuredMcastBcastFilter with * INI value as this will serve as the default value */ @@ -5771,7 +5788,17 @@ register_wiphy: hddLog(VOS_TRACE_LEVEL_FATAL,"%s: wlan_hdd_ftm_open Failed",__func__); goto err_free_hdd_context; } - hddLog(VOS_TRACE_LEVEL_FATAL,"%s: FTM driver loaded success fully",__func__); + +#if defined(QCA_WIFI_2_0) && defined(QCA_WIFI_FTM) + if (hdd_ftm_start(pHddCtx)) + { + wiphy_unregister(wiphy); + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: hdd_ftm_start Failed",__func__); + goto err_free_hdd_context; + } +#endif + hddLog(VOS_TRACE_LEVEL_FATAL,"%s: FTM driver loaded",__func__); + #if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) complete(&wlan_start_comp); #endif diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 77a2679f75e8..2c50b3dde26d 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -200,6 +200,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2}, #define WE_SET_VHT_RATE 39 #define WE_DBGLOG_REPORT_ENABLE 40 #define WE_TXRX_FWSTATS_RESET 41 +#define WE_SET_POWER_GATING 42 #endif /* Private ioctls and their sub-ioctls */ @@ -234,6 +235,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2}, #define WE_GET_AMSDU 28 #define WE_GET_TXPOW_2G 29 #define WE_GET_TXPOW_5G 30 +#define WE_GET_POWER_GATING 31 #endif /* Private ioctls and their sub-ioctls */ @@ -292,6 +294,9 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2}, #define WE_DUMP_CHANINFO_START 11 #define WE_DUMP_CHANINFO 12 #define WE_DUMP_WATCHDOG 13 +#ifdef DEBUG +#define WE_SET_FW_CRASH_INJECT 14 +#endif #endif /* Private ioctls and their sub-ioctls */ #define WLAN_PRIV_SET_VAR_INT_GET_NONE (SIOCIWFIRSTPRIV + 7) @@ -3652,7 +3657,7 @@ static int iw_set_mlme(struct net_device *dev, } #ifdef QCA_WIFI_2_0 -static int process_wma_set_command(int sessid, int paramid, +int process_wma_set_command(int sessid, int paramid, int sval, int vpdev) { int ret = 0; @@ -4546,6 +4551,16 @@ static int iw_setint_getnone(struct net_device *dev, struct iw_request_info *inf break; } + case WE_SET_POWER_GATING: + { + hddLog(LOG1, "WMI_PDEV_PARAM_POWER_GATING_SLEEP val %d", + set_value); + ret = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_POWER_GATING_SLEEP, + (set_value)? true:false, PDEV_CMD); + break; + } + /* Firmware debug log */ case WE_DBGLOG_LOG_LEVEL: { @@ -5030,6 +5045,17 @@ static int iw_setnone_getint(struct net_device *dev, struct iw_request_info *inf hddLog(LOG1, "5G tx_power %d", txpow5g); break; } + + case WE_GET_POWER_GATING: + { + hddLog(LOG1, "GET WMI_PDEV_PARAM_POWER_GATING_SLEEP"); + *value = wma_cli_get_command(wmapvosContext, + (int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_POWER_GATING_SLEEP, + PDEV_CMD); + break; + } + #endif default: @@ -5584,6 +5610,16 @@ static int iw_setnone_getnone(struct net_device *dev, struct iw_request_info *in 0, GEN_CMD); break; } +#ifdef DEBUG + case WE_SET_FW_CRASH_INJECT: + { + hddLog(LOGE, "WE_FW_CRASH_INJECT"); + ret = process_wma_set_command((int) pAdapter->sessionId, + (int) GEN_PARAM_CRASH_INJECT, + 0, GEN_CMD); + break; + } +#endif #endif default: { @@ -7797,6 +7833,11 @@ static const struct iw_priv_args we_private_args[] = { 0, "txpow5g" }, + { WE_SET_POWER_GATING, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "pwrgating" }, + /* Sub-cmds DBGLOG specific commands */ { WE_DBGLOG_LOG_LEVEL , IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, @@ -8000,6 +8041,11 @@ static const struct iw_priv_args we_private_args[] = { IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_txpow5g" }, + { WE_GET_POWER_GATING, + 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_pwrgating" }, + #endif /* handlers for main ioctl */ @@ -8183,6 +8229,12 @@ static const struct iw_priv_args we_private_args[] = { 0, 0, "dump_watchdog" }, +#ifdef DEBUG + { WE_SET_FW_CRASH_INJECT, + 0, + 0, + "crash_inject" }, +#endif #endif /* handlers for main ioctl */ { WLAN_PRIV_SET_VAR_INT_GET_NONE, diff --git a/CORE/HDD/src/wlan_hdd_wowl.c b/CORE/HDD/src/wlan_hdd_wowl.c index aa349de1eb56..b686de67ffe5 100644 --- a/CORE/HDD/src/wlan_hdd_wowl.c +++ b/CORE/HDD/src/wlan_hdd_wowl.c @@ -120,6 +120,7 @@ v_BOOL_t hdd_add_wowl_ptrn (hdd_adapter_t *pAdapter, const char * ptrn) const char *temp; tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter); v_U8_t sessionId = pAdapter->sessionId; + hdd_context_t *pHddCtx = pAdapter->pHddCtx; len = find_ptrn_len(ptrn); @@ -130,7 +131,7 @@ v_BOOL_t hdd_add_wowl_ptrn (hdd_adapter_t *pAdapter, const char * ptrn) first_empty_slot = -1; // Find an empty slot to store the pattern - for (i=0; i<WOWL_MAX_PTRNS_ALLOWED; i++) + for (i=0; i<pHddCtx->cfg_ini->maxWoWFilters; i++) { if(g_hdd_wowl_ptrns[i] == NULL) { first_empty_slot = i; @@ -147,7 +148,7 @@ v_BOOL_t hdd_add_wowl_ptrn (hdd_adapter_t *pAdapter, const char * ptrn) } // Detect duplicate pattern - for (i=0; i<WOWL_MAX_PTRNS_ALLOWED; i++) + for (i=0; i<pHddCtx->cfg_ini->maxWoWFilters; i++) { if(g_hdd_wowl_ptrns[i] == NULL) continue; @@ -289,9 +290,10 @@ v_BOOL_t hdd_del_wowl_ptrn (hdd_adapter_t *pAdapter, const char * ptrn) v_BOOL_t patternFound = VOS_FALSE; eHalStatus halStatus; v_U8_t sessionId = pAdapter->sessionId; + hdd_context_t *pHddCtx = pAdapter->pHddCtx; // Detect pattern - for (id=0; id<WOWL_MAX_PTRNS_ALLOWED && g_hdd_wowl_ptrns[id] != NULL; id++) + for (id=0; id<pHddCtx->cfg_ini->maxWoWFilters && g_hdd_wowl_ptrns[id] != NULL; id++) { if(!strcmp(ptrn, g_hdd_wowl_ptrns[id])) { diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index 15e708872e17..b21549c5d2fc 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -956,7 +956,9 @@ typedef struct sMacOpenParameters tANI_U16 maxBssId; tANI_U32 frameTransRequired; tANI_U8 powersaveOffloadEnabled; + tANI_U8 wowEnable; tDriverType driverType; + tANI_U8 maxWoWFilters; } tMacOpenParameters; typedef enum @@ -1058,8 +1060,17 @@ typedef struct sAniSirGlobal csrReadyToSuspendCallback readyToSuspendCallback; void *readyToSuspendContext; + tANI_U8 isCoalesingInIBSSAllowed; + } tAniSirGlobal; +typedef enum +{ + eHIDDEN_SSID_NOT_IN_USE, + eHIDDEN_SSID_ZERO_LEN, + eHIDDEN_SSID_ZERO_CONTENTS +} tHiddenssId; + #ifdef FEATURE_WLAN_TDLS #define RFC1042_HDR_LENGTH (6) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 791396e74f4a..bfa5a78c4677 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,12 +42,12 @@ BRIEF DESCRIPTION: Qualcomm Technologies Confidential and Proprietary ===========================================================================*/ -#define QWLAN_VERSION_MAJOR 3 -#define QWLAN_VERSION_MINOR 2 +#define QWLAN_VERSION_MAJOR 4 +#define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 71 +#define QWLAN_VERSION_BUILD 56 -#define QWLAN_VERSIONSTR "3.2.0.71" +#define QWLAN_VERSIONSTR "4.0.0.56" #endif /* QWLAN_VERSION_H */ diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index 1ff0bdd6089c..ab51322a069e 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -633,6 +633,7 @@ typedef struct sSirSmeStartBssReq tAniAuthType authType; tANI_U32 dtimPeriod; tANI_U8 wps_state; + tANI_U8 isCoalesingInIBSSAllowed; //Coalesing on/off knob tVOS_CON_MODE bssPersona; tANI_U8 txLdpcIniFeatureEnabled; diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h index 667077b5ffe1..bfdb2f10627b 100644 --- a/CORE/MAC/inc/wniCfgAp.h +++ b/CORE/MAC/inc/wniCfgAp.h @@ -481,11 +481,11 @@ #define WNI_CFG_EXCLUDE_UNENCRYPTED_APDEF 0 #define WNI_CFG_RTS_THRESHOLD_STAMIN 0 -#define WNI_CFG_RTS_THRESHOLD_STAMAX 2347 +#define WNI_CFG_RTS_THRESHOLD_STAMAX 192000 #define WNI_CFG_RTS_THRESHOLD_STADEF 2347 #define WNI_CFG_RTS_THRESHOLD_APMIN 0 -#define WNI_CFG_RTS_THRESHOLD_APMAX 2347 +#define WNI_CFG_RTS_THRESHOLD_APMAX 192000 #define WNI_CFG_RTS_THRESHOLD_APDEF 2347 #define WNI_CFG_SHORT_RETRY_LIMIT_STAMIN 0 @@ -1463,11 +1463,11 @@ #define WNI_CFG_EXT_HT_CAP_INFO_RESERVED2 12 #define WNI_CFG_TX_BF_CAP_STAMIN 0 -#define WNI_CFG_TX_BF_CAP_STAMAX 2147483647 +#define WNI_CFG_TX_BF_CAP_STAMAX 4294967295 #define WNI_CFG_TX_BF_CAP_STADEF 0 #define WNI_CFG_TX_BF_CAP_APMIN 0 -#define WNI_CFG_TX_BF_CAP_APMAX 2147483647 +#define WNI_CFG_TX_BF_CAP_APMAX 4294967295 #define WNI_CFG_TX_BF_CAP_APDEF 0 #define WNI_CFG_AS_CAP_STAMIN 0 @@ -2088,11 +2088,11 @@ #define WNI_CFG_WPS_REQUEST_TYPE_APDEF 3 #define WNI_CFG_WPS_CFG_METHOD_STAMIN 0 -#define WNI_CFG_WPS_CFG_METHOD_STAMAX 2147483647 +#define WNI_CFG_WPS_CFG_METHOD_STAMAX 4294967295 #define WNI_CFG_WPS_CFG_METHOD_STADEF 8 #define WNI_CFG_WPS_CFG_METHOD_APMIN 0 -#define WNI_CFG_WPS_CFG_METHOD_APMAX 2147483647 +#define WNI_CFG_WPS_CFG_METHOD_APMAX 4294967295 #define WNI_CFG_WPS_CFG_METHOD_APDEF 25952654 #define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY_STAMIN 0 @@ -2104,11 +2104,11 @@ #define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY_APDEF 6 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMIN 0 -#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMAX 2147483647 +#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMAX 4294967295 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STADEF 5304836 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_APMIN 0 -#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_APMAX 2147483647 +#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_APMAX 4294967295 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_APDEF 5304836 #define WNI_CFG_WPS_DEVICE_SUB_CATEGORY_STAMIN 0 @@ -2136,11 +2136,11 @@ #define WNI_CFG_WPS_CONFIGURATION_ERROR_APDEF 0 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMIN 0 -#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMAX 2147483647 +#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMAX 4294967295 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STADEF 0 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_APMIN 0 -#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_APMAX 2147483647 +#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_APMAX 4294967295 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_APDEF 0 #define WNI_CFG_WPS_ASSOC_METHOD_STAMIN 0 diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h index 5e7b8222b2a7..0e6e96d2c9d2 100644 --- a/CORE/MAC/inc/wniCfgSta.h +++ b/CORE/MAC/inc/wniCfgSta.h @@ -443,7 +443,7 @@ #define WNI_CFG_EXCLUDE_UNENCRYPTED_STADEF 0 #define WNI_CFG_RTS_THRESHOLD_STAMIN 0 -#define WNI_CFG_RTS_THRESHOLD_STAMAX 2347 +#define WNI_CFG_RTS_THRESHOLD_STAMAX 192000 #define WNI_CFG_RTS_THRESHOLD_STADEF 2347 #define WNI_CFG_SHORT_RETRY_LIMIT_STAMIN 0 @@ -1041,7 +1041,7 @@ #define WNI_CFG_EXT_HT_CAP_INFO_RESERVED2 12 #define WNI_CFG_TX_BF_CAP_STAMIN 0 -#define WNI_CFG_TX_BF_CAP_STAMAX 2147483647 +#define WNI_CFG_TX_BF_CAP_STAMAX 4294967295 #define WNI_CFG_TX_BF_CAP_STADEF 0 #define WNI_CFG_AS_CAP_STAMIN 0 @@ -1406,7 +1406,7 @@ #define WNI_CFG_WPS_REQUEST_TYPE_STADEF 0 #define WNI_CFG_WPS_CFG_METHOD_STAMIN 0 -#define WNI_CFG_WPS_CFG_METHOD_STAMAX 2147483647 +#define WNI_CFG_WPS_CFG_METHOD_STAMAX 4294967295 #define WNI_CFG_WPS_CFG_METHOD_STADEF 8 #define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY_STAMIN 0 @@ -1414,7 +1414,7 @@ #define WNI_CFG_WPS_PRIMARY_DEVICE_CATEGORY_STADEF 1 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMIN 0 -#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMAX 2147483647 +#define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STAMAX 4294967295 #define WNI_CFG_WPS_PIMARY_DEVICE_OUI_STADEF 5304836 #define WNI_CFG_WPS_DEVICE_SUB_CATEGORY_STAMIN 0 @@ -1430,7 +1430,7 @@ #define WNI_CFG_WPS_CONFIGURATION_ERROR_STADEF 0 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMIN 0 -#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMAX 2147483647 +#define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STAMAX 4294967295 #define WNI_CFG_WPS_DEVICE_PASSWORD_ID_STADEF 0 #define WNI_CFG_WPS_ASSOC_METHOD_STAMIN 0 diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt index 2d752930f90e..0a2debcda2cb 100644 --- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt +++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt @@ -330,10 +330,10 @@ LIM WNI_CFG_RTS_THRESHOLD I 4 6 V RW NP HAL -0 2347 2347 +0 192000 2347 V RW NP HAL -0 2347 2347 +0 192000 2347 * * Short Retry Limit diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h index 23d2c48174eb..a18b132c5d73 100644 --- a/CORE/MAC/src/pe/include/limSession.h +++ b/CORE/MAC/src/pe/include/limSession.h @@ -400,6 +400,9 @@ typedef struct sPESession // Added to Support BT-AMP /* Power Save Off load Parameters */ tPowersaveoffloadInfo pmmOffloadInfo; + + tANI_U8 isCoalesingInIBSSAllowed; + }tPESession, *tpPESession; #define LIM_MAX_ACTIVE_SESSIONS 4 diff --git a/CORE/MAC/src/pe/include/rrmGlobal.h b/CORE/MAC/src/pe/include/rrmGlobal.h index fb01f515c874..e97df4bec584 100644 --- a/CORE/MAC/src/pe/include/rrmGlobal.h +++ b/CORE/MAC/src/pe/include/rrmGlobal.h @@ -41,7 +41,8 @@ ========================================================================*/ -#define SIR_BCN_REPORT_MAX_BSS_DESC 4 +#define SIR_BCN_REPORT_MAX_BSS_DESC_PER_ACTION_FRAME 3 +#define SIR_BCN_REPORT_MAX_BSS_PER_CHANNEL 15 typedef enum eRrmRetStatus { @@ -83,7 +84,7 @@ typedef struct sSirBeaconReportXmitInd tANI_U16 duration; tANI_U8 regClass; tANI_U8 numBssDesc; - tpSirBssDescription pBssDescription[SIR_BCN_REPORT_MAX_BSS_DESC]; + tpSirBssDescription pBssDescription[SIR_BCN_REPORT_MAX_BSS_DESC_PER_ACTION_FRAME]; } tSirBeaconReportXmitInd, * tpSirBeaconReportXmitInd; typedef struct sSirNeighborReportReqInd diff --git a/CORE/MAC/src/pe/lim/limAdmitControl.c b/CORE/MAC/src/pe/lim/limAdmitControl.c index 1eecd32e8cd1..17496131fd61 100644 --- a/CORE/MAC/src/pe/lim/limAdmitControl.c +++ b/CORE/MAC/src/pe/lim/limAdmitControl.c @@ -1152,6 +1152,7 @@ limSendHalMsgDelTs( { tSirMsgQ msg; tpDelTsParams pDelTsParam; + tpPESession psessionEntry = NULL; if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pDelTsParam, sizeof(tDelTsParams))) { @@ -1168,16 +1169,30 @@ limSendHalMsgDelTs( pDelTsParam->staIdx = staIdx; pDelTsParam->tspecIdx = tspecIdx; + psessionEntry = peFindSessionBySessionId(pMac, sessionId); + if(psessionEntry == NULL) + { + PELOGE(limLog(pMac, LOGE, + FL("Session does Not exist with given sessionId :%d "), + sessionId);) + goto err; + } + pDelTsParam->sessionId = psessionEntry->smeSessionId; + pDelTsParam->userPrio = delts.tsinfo.traffic.userPrio; + PELOGW(limLog(pMac, LOGW, FL("calling wdaPostCtrlMsg()"));) MTRACE(macTraceMsgTx(pMac, sessionId, msg.type)); if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg)) { PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg() failed"));) - palFreeMemory(pMac->hHdd, (tANI_U8*)pDelTsParam); - return eSIR_FAILURE; + goto err; } - return eSIR_SUCCESS; + return eSIR_SUCCESS; + +err: + palFreeMemory(pMac->hHdd, (tANI_U8*)pDelTsParam); + return eSIR_FAILURE; } /** ------------------------------------------------------------- diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c index 13293367992b..046289231790 100644 --- a/CORE/MAC/src/pe/lim/limAssocUtils.c +++ b/CORE/MAC/src/pe/lim/limAssocUtils.c @@ -2277,6 +2277,8 @@ limAddSta( /* Update SME session ID */ pAddStaParams->smesessionId = psessionEntry->smeSessionId; + pAddStaParams->maxTxPower = psessionEntry->maxTxPower; + if (psessionEntry->parsedAssocReq != NULL) { // Get a copy of the already parsed Assoc Request @@ -2602,6 +2604,8 @@ limAddStaSelf(tpAniSirGlobal pMac,tANI_U16 staIdx, tANI_U8 updateSta, tpPESessio /* Update SME session ID */ pAddStaParams->smesessionId = psessionEntry->smeSessionId; + + pAddStaParams->maxTxPower = psessionEntry->maxTxPower; // This will indicate HAL to "allocate" a new STA index pAddStaParams->staIdx = staIdx; @@ -3236,7 +3240,14 @@ tSirRetStatus limStaSendAddBss( tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp, palCopyMemory( pMac->hHdd, pAddBssParams->rateSet.rate, pAssocRsp->supportedRates.rate, pAssocRsp->supportedRates.numRates ); - pAddBssParams->nwType = bssDescription->nwType; + if (psessionEntry->dot11mode == WNI_CFG_DOT11_MODE_11B) + { + pAddBssParams->nwType = eSIR_11B_NW_TYPE; + } + else + { + pAddBssParams->nwType = bssDescription->nwType; + } pAddBssParams->shortSlotTimeSupported = (tANI_U8)pAssocRsp->capabilityInfo.shortSlotTime; pAddBssParams->llaCoexist = (tANI_U8) psessionEntry->beaconParams.llaCoexist; diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c index 90535f34b597..b29a303e5c9c 100644 --- a/CORE/MAC/src/pe/lim/limFT.c +++ b/CORE/MAC/src/pe/lim/limFT.c @@ -1158,13 +1158,6 @@ void limProcessMlmFTReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf, return; } - if (limSetLinkState(pMac, eSIR_LINK_PREASSOC_STATE, psessionEntry->bssId, - psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS) - { - palFreeMemory(pMac->hHdd, pMlmReassocReq); - return; - } - pMlmReassocReq->listenInterval = (tANI_U16) val; psessionEntry->pLimMlmReassocReq = pMlmReassocReq; diff --git a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c index 9f95dccea238..71ff87c1a77f 100644 --- a/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c +++ b/CORE/MAC/src/pe/lim/limIbssPeerMgmt.c @@ -1400,7 +1400,8 @@ limIbssCoalesce( limLog(pMac, LOG1, FL("Current BSSID :" MAC_ADDRESS_STR " Received BSSID :" MAC_ADDRESS_STR ), MAC_ADDR_ARRAY(currentBssId), MAC_ADDR_ARRAY(pHdr->bssId)); /* Check for IBSS Coalescing only if Beacon is from different BSS */ - if ( !palEqualMemory( pMac->hHdd, currentBssId, pHdr->bssId, sizeof( tSirMacAddr ) ) ) + if ( !vos_mem_compare(currentBssId, pHdr->bssId, sizeof( tSirMacAddr )) + && psessionEntry->isCoalesingInIBSSAllowed) { if (! fTsfLater) // No Coalescing happened. { @@ -1420,6 +1421,11 @@ limIbssCoalesce( ibss_bss_delete(pMac,psessionEntry); return eSIR_SUCCESS; } + else + { + if (!vos_mem_compare(currentBssId, pHdr->bssId, sizeof( tSirMacAddr ))) + return eSIR_LIM_IGNORE_BEACON; + } // STA in IBSS mode and SSID matches with ours pPeerNode = ibss_peer_find(pMac, pHdr->sa); diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c index 06b32d655fba..fc5d2a0f6975 100644 --- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c +++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c @@ -1258,12 +1258,17 @@ limProcessMessages(tpAniSirGlobal pMac, tpSirMsgQ limMsg) case eWNI_SME_SCAN_ABORT_IND: { - tANI_U8 *pSessionId = (tANI_U8 *)limMsg->bodyptr; - limProcessAbortScanInd(pMac, *pSessionId); - vos_mem_free((v_VOID_t *)limMsg->bodyptr); - limMsg->bodyptr = NULL; - break; - } + tSirMbMsg *pMsg = limMsg->bodyptr; + tANI_U8 sessionId; + if (pMsg) + { + sessionId = (tANI_U8) pMsg->data[0]; + limProcessAbortScanInd(pMac, sessionId); + vos_mem_free((v_VOID_t *)limMsg->bodyptr); + limMsg->bodyptr = NULL; + } + } + break; case eWNI_SME_START_REQ: case eWNI_SME_SYS_READY_IND: #ifndef WNI_ASKEY_NON_SUPPORT_FEATURE diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index b975d489f05a..c79b90fcfd32 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -680,6 +680,8 @@ __limHandleSmeStartBssRequest(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) break; case eSIR_IBSS_MODE: psessionEntry->limSystemRole = eLIM_STA_IN_IBSS_ROLE; + psessionEntry->isCoalesingInIBSSAllowed = + pSmeStartBssReq->isCoalesingInIBSSAllowed; break; case eSIR_BTAMP_AP_MODE: diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c index 51d925a48234..27983e623295 100644 --- a/CORE/MAC/src/pe/lim/limSerDesUtils.c +++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c @@ -648,6 +648,13 @@ limStartBssReqSerDes(tpAniSirGlobal pMac, tpSirSmeStartBssReq pStartBssReq, tANI if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE) return eSIR_FAILURE; + // Extract isCoalesingInIBSSAllowed + pStartBssReq->isCoalesingInIBSSAllowed = *pBuf++; + len--; + if (limCheckRemainingLength(pMac, len) == eSIR_FAILURE) + return eSIR_FAILURE; + + // Extract bssPersona pStartBssReq->bssPersona = *pBuf++; len--; diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index 5b55324aa94b..f9f23bcbda1d 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -64,15 +64,6 @@ * this information. */ static tAniBool glimTriggerBackgroundScanDuringQuietBss_Status = eSIR_TRUE; -/* 11A Channel list to decode RX BD channel information */ -static const tANI_U8 abChannel[]= {36,40,44,48,52,56,60,64,100,104,108,112,116, - 120,124,128,132,136,140,149,153,157,161,165}; - -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD -static const tANI_U8 aUnsortedChannelList[]= {52,56,60,64,100,104,108,112,116, - 120,124,128,132,136,140,36,40,44,48,149,153,157,161,165}; -#endif - //#define LIM_MAX_ACTIVE_SESSIONS 3 //defined temporarily for BT-AMP SUPPORT #define SUCCESS 1 //defined temporarily for BT-AMP @@ -7378,15 +7369,7 @@ void limProcessDelStaSelfRsp(tpAniSirGlobal pMac,tpSirMsgQ limMsgQ) *****************************************************************/ tANI_U8 limUnmapChannel(tANI_U8 mapChannel) { - if( mapChannel > 0 && mapChannel < 25 ) -#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD - if (IS_ROAM_SCAN_OFFLOAD_FEATURE_ENABLE) - return aUnsortedChannelList[mapChannel -1]; - else -#endif - return abChannel[mapChannel -1]; - else - return 0; + return WDA_MapChannel(mapChannel); } diff --git a/CORE/MAC/src/pe/rrm/rrmApi.c b/CORE/MAC/src/pe/rrm/rrmApi.c index a7312be23809..559c3f4f6a2a 100644 --- a/CORE/MAC/src/pe/rrm/rrmApi.c +++ b/CORE/MAC/src/pe/rrm/rrmApi.c @@ -769,107 +769,149 @@ rrmProcessBeaconReportXmit( tpAniSirGlobal pMac, tpSirBeaconReportXmitInd pBcnReport) { tSirRetStatus status = eSIR_SUCCESS; - tSirMacRadioMeasureReport report, *pReport; + tSirMacRadioMeasureReport *pReport; tpRRMReq pCurrentReq = pMac->rrm.rrmPEContext.pCurrentReq; tpPESession pSessionEntry ; tANI_U8 sessionId; - v_U8_t flagBSSPresent = FALSE; + v_U8_t flagBSSPresent = FALSE, bssDescCnt = 0; #if defined WLAN_VOWIFI_DEBUG PELOGE(limLog( pMac, LOGE, "Received beacon report xmit indication");) #endif - if(NULL == pBcnReport) + + + if (NULL == pBcnReport) + { + PELOGE(limLog( pMac, LOGE, + "Received pBcnReport is NULL in PE");) return eSIR_FAILURE; + } - if ( pCurrentReq == NULL ) + if (NULL == pCurrentReq) { - PELOGE(limLog( pMac, LOGE, "Received report xmit while there is no request pending in PE");) + PELOGE(limLog( pMac, LOGE, + "Received report xmit while there is no request pending in PE");) return eSIR_FAILURE; } - if ((pSessionEntry = peFindSessionByBssid(pMac,pBcnReport->bssId,&sessionId))==NULL) + + if (NULL == (pSessionEntry = peFindSessionByBssid(pMac, + pBcnReport->bssId, + &sessionId))) { PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));) return eSIR_FAILURE; } - pReport = &report; - palZeroMemory( pMac->hHdd, pReport, sizeof(tSirMacRadioMeasureReport) ); - //Prepare the beacon report and send it to the peer. - pReport->token = pBcnReport->uDialogToken; - pReport->refused = 0; - pReport->incapable = 0; - pReport->type = SIR_MAC_RRM_BEACON_TYPE; + pReport = vos_mem_malloc(pBcnReport->numBssDesc * + sizeof(tSirMacRadioMeasureReport)); - //If the scan result is NULL then send report request with option subelement as NULL.. - if ( NULL != pBcnReport->pBssDescription[0] ) + if (NULL == pReport) { - flagBSSPresent = TRUE; + PELOGE(limLog(pMac, LOGE,FL("RRM Report is NULL, allocation failed"));) + return eSIR_FAILURE; } - //Valid response is included if the size of beacon xmit is == size of beacon xmit ind + ies - if ( pBcnReport->length >= sizeof( tSirBeaconReportXmitInd ) ) - { - pReport->report.beaconReport.regClass = pBcnReport->regClass; - if ( flagBSSPresent ) - { - pReport->report.beaconReport.channel = pBcnReport->pBssDescription[0]->channelId; - palCopyMemory( pMac->hHdd, pReport->report.beaconReport.measStartTime, - pBcnReport->pBssDescription[0]->startTSF, - sizeof( pBcnReport->pBssDescription[0]->startTSF) ); - pReport->report.beaconReport.measDuration = SYS_MS_TO_TU(pBcnReport->duration); - pReport->report.beaconReport.phyType = pBcnReport->pBssDescription[0]->nwType; - pReport->report.beaconReport.bcnProbeRsp = 1; - pReport->report.beaconReport.rsni = pBcnReport->pBssDescription[0]->sinr; - pReport->report.beaconReport.rcpi = pBcnReport->pBssDescription[0]->rssi; - - pReport->report.beaconReport.antennaId = 0; - pReport->report.beaconReport.parentTSF = pBcnReport->pBssDescription[0]->parentTSF; - palCopyMemory(pMac->hHdd, pReport->report.beaconReport.bssid, - pBcnReport->pBssDescription[0]->bssId, sizeof(tSirMacAddr)); - } + vos_mem_zero( pReport, + pBcnReport->numBssDesc * sizeof(tSirMacRadioMeasureReport) ); - switch ( pCurrentReq->request.Beacon.reportingDetail ) - { - case BEACON_REPORTING_DETAIL_NO_FF_IE: //0 No need to include any elements. + for (bssDescCnt = 0; bssDescCnt < pBcnReport->numBssDesc; bssDescCnt++) + { + //Prepare the beacon report and send it to the peer. + pReport[bssDescCnt].token = pBcnReport->uDialogToken; + pReport[bssDescCnt].refused = 0; + pReport[bssDescCnt].incapable = 0; + pReport[bssDescCnt].type = SIR_MAC_RRM_BEACON_TYPE; + + //If the scan result is NULL then send report request with + //option subelement as NULL.. + if ( NULL != pBcnReport->pBssDescription[bssDescCnt] ) + { + flagBSSPresent = TRUE; + } + + //Valid response is included if the size of beacon xmit + //is == size of beacon xmit ind + ies + if ( pBcnReport->length >= sizeof( tSirBeaconReportXmitInd ) ) + { + pReport[bssDescCnt].report.beaconReport.regClass = pBcnReport->regClass; + if ( flagBSSPresent ) + { + pReport[bssDescCnt].report.beaconReport.channel = + pBcnReport->pBssDescription[bssDescCnt]->channelId; + vos_mem_copy( pReport[bssDescCnt].report.beaconReport.measStartTime, + pBcnReport->pBssDescription[bssDescCnt]->startTSF, + sizeof( pBcnReport->pBssDescription[bssDescCnt]->startTSF) ); + pReport[bssDescCnt].report.beaconReport.measDuration = + SYS_MS_TO_TU(pBcnReport->duration); + pReport[bssDescCnt].report.beaconReport.phyType = + pBcnReport->pBssDescription[bssDescCnt]->nwType; + pReport[bssDescCnt].report.beaconReport.bcnProbeRsp = 1; + pReport[bssDescCnt].report.beaconReport.rsni = + pBcnReport->pBssDescription[bssDescCnt]->sinr; + pReport[bssDescCnt].report.beaconReport.rcpi = + pBcnReport->pBssDescription[bssDescCnt]->rssi; + + pReport[bssDescCnt].report.beaconReport.antennaId = 0; + pReport[bssDescCnt].report.beaconReport.parentTSF = + pBcnReport->pBssDescription[bssDescCnt]->parentTSF; + vos_mem_copy( pReport[bssDescCnt].report.beaconReport.bssid, + pBcnReport->pBssDescription[bssDescCnt]->bssId, + sizeof(tSirMacAddr)); + } + + switch ( pCurrentReq->request.Beacon.reportingDetail ) + { + case BEACON_REPORTING_DETAIL_NO_FF_IE: + //0 No need to include any elements. #if defined WLAN_VOWIFI_DEBUG - PELOGE(limLog(pMac, LOGE, "No reporting detail requested");) + PELOGE(limLog(pMac, LOGE, "No reporting detail requested");) #endif - break; - case BEACON_REPORTING_DETAIL_ALL_FF_REQ_IE: //1: Include all FFs and Requested Ies. + break; + case BEACON_REPORTING_DETAIL_ALL_FF_REQ_IE: + //1: Include all FFs and Requested Ies. #if defined WLAN_VOWIFI_DEBUG - PELOGE(limLog(pMac, LOGE, "Only requested IEs in reporting detail requested");) + PELOGE(limLog(pMac, LOGE, + "Only requested IEs in reporting detail requested");) #endif - if ( flagBSSPresent ) - { - rrmFillBeaconIes( pMac, (tANI_U8*) &pReport->report.beaconReport.Ies[0], - (tANI_U8*) &pReport->report.beaconReport.numIes, BEACON_REPORT_MAX_IES, - pCurrentReq->request.Beacon.reqIes.pElementIds, pCurrentReq->request.Beacon.reqIes.num, - pBcnReport->pBssDescription[0] ); - } + if ( flagBSSPresent ) + { + rrmFillBeaconIes( pMac, + (tANI_U8*) &pReport[bssDescCnt].report.beaconReport.Ies[0], + (tANI_U8*) &pReport[bssDescCnt].report.beaconReport.numIes, + BEACON_REPORT_MAX_IES, + pCurrentReq->request.Beacon.reqIes.pElementIds, + pCurrentReq->request.Beacon.reqIes.num, + pBcnReport->pBssDescription[bssDescCnt] ); + } - break; - case BEACON_REPORTING_DETAIL_ALL_FF_IE: //2 / default - Include all FFs and all Ies. - default: + break; + case BEACON_REPORTING_DETAIL_ALL_FF_IE: + //2 / default - Include all FFs and all Ies. + default: #if defined WLAN_VOWIFI_DEBUG - PELOGE(limLog(pMac, LOGE, "Default all IEs and FFs");) + PELOGE(limLog(pMac, LOGE, "Default all IEs and FFs");) #endif - if ( flagBSSPresent ) - { - rrmFillBeaconIes( pMac, (tANI_U8*) &pReport->report.beaconReport.Ies[0], - (tANI_U8*) &pReport->report.beaconReport.numIes, BEACON_REPORT_MAX_IES, + if ( flagBSSPresent ) + { + rrmFillBeaconIes( pMac, + (tANI_U8*) &pReport[bssDescCnt].report.beaconReport.Ies[0], + (tANI_U8*) &pReport[bssDescCnt].report.beaconReport.numIes, + BEACON_REPORT_MAX_IES, NULL, 0, - pBcnReport->pBssDescription[0] ); - } - break; - } + pBcnReport->pBssDescription[bssDescCnt] ); + } + break; + } + } + } #if defined WLAN_VOWIFI_DEBUG - PELOGE(limLog( pMac, LOGE, "Sending Action frame ");) + PELOGE(limLog( pMac, LOGE, "Sending Action frame ");) #endif - limSendRadioMeasureReportActionFrame( pMac, pCurrentReq->dialog_token, 1, + limSendRadioMeasureReportActionFrame( pMac, pCurrentReq->dialog_token, bssDescCnt, pReport, pBcnReport->bssId, pSessionEntry ); - } + if( pBcnReport->fMeasureDone ) { @@ -877,6 +919,9 @@ rrmProcessBeaconReportXmit( tpAniSirGlobal pMac, rrmCleanup(pMac); } + + vos_mem_free(pReport); + return status; } diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c index 999fabd49601..ade5d42f80e1 100644 --- a/CORE/MAC/src/pe/sch/schBeaconGen.c +++ b/CORE/MAC/src/pe/sch/schBeaconGen.c @@ -37,7 +37,7 @@ * -------------------------------------------------------------------- * */ - + #include "palTypes.h" #include "wniCfgSta.h" #include "aniGlobal.h" @@ -256,7 +256,8 @@ tSirRetStatus schSetFixedBeaconFields(tpAniSirGlobal pMac,tpPESession psessionEn if (psessionEntry->ssidHidden) { pBcn1->SSID.present = 1; //rest of the fileds are 0 for hidden ssid - if(psessionEntry->ssId.length) + if((psessionEntry->ssId.length) && + (psessionEntry->ssidHidden == eHIDDEN_SSID_ZERO_CONTENTS)) pBcn1->SSID.num_ssid = psessionEntry->ssId.length; } else diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index 25f6728ba541..7b180512b420 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -40,6 +40,10 @@ #include "fw_one_bin.h" #include "bin_sig.h" +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +#include <net/cnss.h> +#endif + extern int dbglog_parse_debug_logs(ol_scn_t scn, u_int8_t *datap, u_int32_t len); @@ -456,6 +460,48 @@ u_int32_t host_interest_item_address(u_int32_t target_type, u_int32_t item_offse } } +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +static struct ol_softc *ramdump_scn; + +static void ramdump_work_handler(struct work_struct *ramdump) +{ + void __iomem *ramdump_base; + unsigned long address; + unsigned long size; + + /* Get RAM dump memory address and size */ + if (cnss_get_ramdump_mem(&address, &size)) { + printk("No RAM dump will be collected since failed to get " + "memory address or size!\n"); + goto out; + } + + ramdump_base = ioremap(address, size); + if (!ramdump_base) { + printk("No RAM dump will be collected since ramdump_base is NULL!\n"); + goto out; + } + + if (ramdump_scn) { + ol_target_coredump(ramdump_scn, ramdump_base, TOTAL_DUMP_SIZE); + + printk("%s: RAM dump collecting completed!\n", __func__); + msleep(1000); + } else { + printk("No RAM dump will be collected since ramdump_scn is NULL!\n"); + } + + iounmap(ramdump_base); + +out: + /* Notify SSR framework the target has crashed. */ + cnss_device_crashed(); + return; +} + +static DECLARE_WORK(ramdump_work, ramdump_work_handler); +#endif + #define REGISTER_DUMP_LEN_MAX 60 #define REG_DUMP_COUNT 60 @@ -522,6 +568,12 @@ void ol_target_failure(void *instance, A_STATUS status) return; } +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + /* Collect the RAM dump through a workqueue */ + ramdump_scn = scn; + schedule_work(&ramdump_work); +#endif + dbglog_hdr.dbuf = (struct dbglog_buf_s *)dbglog_hdr_temp.dbuf; dbglog_hdr.dropped = dbglog_hdr_temp.dropped; @@ -815,3 +867,122 @@ int ol_download_firmware(struct ol_softc *scn) return EOK; } + +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +int ol_diag_read(struct ol_softc *scn, u_int8_t* buffer, + u_int32_t pos, size_t count) +{ + int result = 0; + + if ((count == 4) && ((pos & 3) == 0)) { + result = HIFDiagReadAccess(scn->hif_hdl, pos, + (u_int32_t*)buffer); + } else { + size_t amountRead = 0; + size_t readSize = PCIE_READ_LIMIT; + size_t remainder = 0; + if (count > PCIE_READ_LIMIT) { + while ((amountRead < count) && (0 == result)) { + result = HIFDiagReadMem(scn->hif_hdl, pos, + buffer, readSize); + if (0 == result) { + buffer += readSize; + pos += readSize; + amountRead += readSize; + remainder = count - amountRead; + if (remainder < PCIE_READ_LIMIT) + readSize = remainder; + } + } + } else { + result = HIFDiagReadMem(scn->hif_hdl, pos, + buffer, count); + } + } + + if (!result) { + return count; + } else { + return -EIO; + } +} + +/**--------------------------------------------------------------------------- + * \brief ol_target_coredump + * + * Function to perform core dump for the target + * + * \param: scn - ol_softc handler + * memoryBlock - non-NULL reserved memory location + * blockLength - size of the dump to collect + * + * \return: None + * --------------------------------------------------------------------------*/ +void ol_target_coredump(void *inst, void* memoryBlock, u_int32_t blockLength) +{ + struct ol_softc *scn = (struct ol_softc *)inst; + char* bufferLoc = memoryBlock; + int result = 0; + u_int32_t reg_dump_area = 0; + u_int32_t amountRead = 0; + u_int32_t sectionCount = 0; + u_int32_t pos = 0; + u_int32_t readLen = 0; + + /* + * SECTION = REGISTER + * START = 0x4000 + * LENGTH = 0x6c000 + * + * SECTION = DRAM + * START = 0x400000 + * LENGTH = 0x50000 + * + * SECTION = IRAM + * START = 0x980000 + * LENGTH = 0x38000 + * + */ + + if (HIFDiagReadMem(scn->hif_hdl, + host_interest_item_address(scn->target_type, + offsetof(struct host_interest_s, hi_failure_state)), + (A_UCHAR*) ®_dump_area, sizeof(u_int32_t)) != A_OK) { + return; + } + + while ((sectionCount < 3) && (amountRead < blockLength)) { + switch (sectionCount) { + case 0: + /* REGISTER SECTION */ + pos = reg_dump_area; + readLen = REGISTER_SIZE; + break; + case 1: + /* DRAM SECTION */ + pos = DRAM_LOCATION; + readLen = DRAM_SIZE; + break; + case 2: + /* IRAM SECTION */ + pos = IRAM_LOCATION; + readLen = IRAM_SIZE; + break; + } + + if ((blockLength - amountRead) >= readLen) { + result = ol_diag_read(scn, bufferLoc, pos, readLen); + if (result != EIO) { + amountRead += result; + bufferLoc += result; + sectionCount++; + } else { + break; /* Could not read the section */ + } + } else { + break; /* Insufficient room in buffer */ + } + } +} +#endif + diff --git a/CORE/SERVICES/BMI/ol_fw.h b/CORE/SERVICES/BMI/ol_fw.h index 9d0391cba052..09b6335b1176 100644 --- a/CORE/SERVICES/BMI/ol_fw.h +++ b/CORE/SERVICES/BMI/ol_fw.h @@ -48,6 +48,24 @@ #define VDEV_DEFAULT_STATS_UPDATE_PERIOD 500 #define PEER_DEFAULT_STATS_UPDATE_PERIOD 500 +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +#define REGISTER_LOCATION 0x4000 +#define REGISTER_SIZE 0x6c000 + +#define DRAM_LOCATION 0x400000 +#define DRAM_SIZE 0x50000 + +#define IRAM_LOCATION 0x980000 +#define IRAM_SIZE 0x38000 + +#define TOTAL_DUMP_SIZE REGISTER_SIZE + DRAM_SIZE + IRAM_SIZE +#define PCIE_READ_LIMIT 0x5000 + +void ol_target_coredump(void *instance, void* memoryBlock, + u_int32_t blockLength); +int ol_diag_read(struct ol_softc *scn, u_int8_t* buffer, + u_int32_t pos, size_t count); +#endif int ol_download_firmware(struct ol_softc *scn); int ol_configure_target(struct ol_softc *scn); void ol_target_failure(void *instance, A_STATUS status); diff --git a/CORE/SERVICES/COMMON/dbglog_id.h b/CORE/SERVICES/COMMON/dbglog_id.h index e369732067fc..9b644ed77ed0 100644 --- a/CORE/SERVICES/COMMON/dbglog_id.h +++ b/CORE/SERVICES/COMMON/dbglog_id.h @@ -743,8 +743,9 @@ extern "C" { #define WLAN_CHATTER_FILTER_MISS 4 #define WLAN_CHATTER_FILTER_FULL 5 #define WLAN_CHATTER_FILTER_TM_ADJ 6 -#define WLAN_CHATTER_DBGID_DEFINITION_END 7 - +#define WLAN_CHATTER_BUFFER_FULL 7 +#define WLAN_CHATTER_TIMEOUT 8 +#define WLAN_CHATTER_DBGID_DEFINITION_END 9 #define WOW_DBGID_DEFINITION_START 0 #define WOW_ENABLE_CMDID 1 @@ -827,6 +828,27 @@ extern "C" { #define TDLS_DBGID_PEER_EVT_DISCOVER 18 #define TDLS_DBGID_PEER_EVT_DELETE 19 +/* TXBF Module IDs */ +#define TXBFEE_DBGID_START 0 +#define TXBFEE_DBGID_NDPA_RECEIVED 1 +#define TXBFEE_DBGID_HOST_CONFIG_TXBFEE_TYPE 2 +#define TXBFER_DBGID_SEND_NDPA 3 +#define TXBFER_DBGID_GET_NDPA_BUF_FAIL 4 +#define TXBFER_DBGID_SEND_NDPA_FAIL 5 +#define TXBFER_DBGID_GET_NDP_BUF_FAIL 6 +#define TXBFER_DBGID_SEND_NDP_FAIL 7 +#define TXBFER_DBGID_GET_BRPOLL_BUF_FAIL 8 +#define TXBFER_DBGID_SEND_BRPOLL_FAIL 9 +#define TXBFER_DBGID_HOST_CONFIG_CMDID 10 +#define TXBFEE_DBGID_HOST_CONFIG_CMDID 11 +#define TXBFEE_DBGID_ENABLED_ENABLED_UPLOAD_H 12 +#define TXBFEE_DBGID_UPLOADH_CV_TAG 13 +#define TXBFEE_DBGID_UPLOADH_H_TAG 14 +#define TXBFEE_DBGID_CAPTUREH_RECEIVED 15 +#define TXBFEE_DBGID_PACKET_IS_STEERED 16 +#define TXBFEE_UPLOADH_EVENT_ALLOC_MEM_FAIL 17 +#define TXBFEE_DBGID_END 18 + /* SMPS module DBGIDs */ #define STA_SMPS_DBGID_DEFINITION_START 0 #define STA_SMPS_DBGID_CREATE_PDEV_INSTANCE 1 @@ -857,6 +879,23 @@ extern "C" { #define RTT_CHANNEL_SWITCH_PREEMPT 18 #define RTT_CHANNEL_SWITCH_STOP 19 #define RTT_TIMER_START 20 +/* WLAN HB module DBGIDs */ +#define WLAN_HB_DBGID_DEFINITION_START 0 +#define WLAN_HB_DBGID_INIT 1 +#define WLAN_HB_DBGID_TCP_GET_TXBUF_FAIL 2 +#define WLAN_HB_DBGID_TCP_SEND_FAIL 3 +#define WLAN_HB_DBGID_BSS_PEER_NULL 4 +#define WLAN_HB_DBGID_UDP_GET_TXBUF_FAIL 5 +#define WLAN_HB_DBGID_UDP_SEND_FAIL 6 +#define WLAN_HB_DBGID_WMI_CMD_INVALID_PARAM 7 +#define WLAN_HB_DBGID_WMI_CMD_INVALID_OP 8 +#define WLAN_HB_DBGID_WOW_NOT_ENTERED 9 +#define WLAN_HB_DBGID_ALLOC_SESS_FAIL 10 +#define WLAN_HB_DBGID_CTX_NULL 11 +#define WLAN_HB_DBGID_CHKSUM_ERR 12 +#define WLAN_HB_DBGID_UDP_TX 13 +#define WLAN_HB_DBGID_TCP_TX 14 +#define WLAN_HB_DBGID_DEFINITION_END 15 #ifdef __cplusplus } diff --git a/CORE/SERVICES/COMMON/hif.h b/CORE/SERVICES/COMMON/hif.h index b1b752d3755a..0154f1a3a525 100644 --- a/CORE/SERVICES/COMMON/hif.h +++ b/CORE/SERVICES/COMMON/hif.h @@ -588,7 +588,13 @@ inline int HIFDiagWriteMem(HIF_DEVICE *hif_device, A_UINT32 address, A_UINT8 *da * For maximum performance and no power management, set this to 1. * For power management at the cost of performance, set this to 0. */ -#define CONFIG_ATH_PCIE_MAX_PERF 1 +#define CONFIG_ATH_PCIE_MAX_PERF 0 + +/* + * For keeping the target awake till the driver is + * loaded, set this to 1 + */ +#define CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD 1 /* * When CONFIG_ATH_PCIE_MAX_PERF is 0: @@ -632,6 +638,8 @@ inline int HIFDiagWriteMem(HIF_DEVICE *hif_device, A_UINT32 address, A_UINT8 *da extern A_target_id_t HIFGetTargetId(HIF_DEVICE *hifDevice); extern void HIFTargetSleepStateAdjust(A_target_id_t targid, A_BOOL sleep_ok, A_BOOL wait_for_it); +extern void +HIFSetTargetSleep(HIF_DEVICE *hif_device, A_BOOL sleep_ok, A_BOOL wait_for_it); extern A_BOOL HIFTargetForcedAwake(A_target_id_t targid); #define A_TARGET_ID(hifDevice) HIFGetTargetId(hifDevice) @@ -665,6 +673,7 @@ void WAR_PCI_WRITE32(char *addr, u32 offset, u32 value); #else /* CONFIG_ATH_PCIE_MAX_PERF */ +void WAR_PCI_WRITE32(char *addr, u32 offset, u32 value); #define A_TARGET_ACCESS_BEGIN(targid) \ HIFTargetSleepStateAdjust((targid), FALSE, TRUE) diff --git a/CORE/SERVICES/COMMON/htc_api.h b/CORE/SERVICES/COMMON/htc_api.h index 79f70a438b96..8199b8e971b5 100644 --- a/CORE/SERVICES/COMMON/htc_api.h +++ b/CORE/SERVICES/COMMON/htc_api.h @@ -685,4 +685,5 @@ struct s_htc_msg{ #endif void *htc_get_targetdef(HTC_HANDLE htc_handle); +void HTCSetTargetToSleep(void *context); #endif /* _HTC_API_H_ */ diff --git a/CORE/SERVICES/COMMON/wlan_module_ids.h b/CORE/SERVICES/COMMON/wlan_module_ids.h index f4392728a8a4..0b8e43de35f8 100644 --- a/CORE/SERVICES/COMMON/wlan_module_ids.h +++ b/CORE/SERVICES/COMMON/wlan_module_ids.h @@ -72,6 +72,8 @@ typedef enum { WLAN_MODULE_SWBMISS, WLAN_MODULE_WMMAC, WLAN_MODULE_TDLS, + WLAN_MODULE_HB, + WLAN_MODULE_TXBF, WLAN_MODULE_ID_MAX, WLAN_MODULE_ID_INVALID = WLAN_MODULE_ID_MAX, } WLAN_MODULE_ID; diff --git a/CORE/SERVICES/COMMON/wlan_tgt_def_config.h b/CORE/SERVICES/COMMON/wlan_tgt_def_config.h index 258c7d442712..8ebfde5d55c5 100644 --- a/CORE/SERVICES/COMMON/wlan_tgt_def_config.h +++ b/CORE/SERVICES/COMMON/wlan_tgt_def_config.h @@ -183,4 +183,9 @@ */ #define CFG_TGT_MAX_FRAG_TABLE_ENTRIES 10 +/* + * Maximum number of VDEV that beacon tx offload will support + */ +#define CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV 2 + #endif /*__WLAN_TGT_DEF_CONFIG_H__ */ diff --git a/CORE/SERVICES/COMMON/wma_api.h b/CORE/SERVICES/COMMON/wma_api.h index a88533e3f01a..e98cfcb0b03d 100644 --- a/CORE/SERVICES/COMMON/wma_api.h +++ b/CORE/SERVICES/COMMON/wma_api.h @@ -74,6 +74,7 @@ typedef enum { GEN_PARAM_DUMP_CHANINFO_START, GEN_PARAM_DUMP_CHANINFO, GEN_PARAM_DUMP_WATCHDOG, + GEN_PARAM_CRASH_INJECT, } GEN_PARAM; #define VDEV_CMD 1 @@ -106,6 +107,8 @@ v_BOOL_t wma_needshutdown(v_VOID_t *vos_context); VOS_STATUS wma_wait_for_ready_event(WMA_HANDLE handle); +tANI_U8 wma_map_channel(tANI_U8 mapChannel); + int wma_cli_get_command(void *wmapvosContext, int vdev_id, int param_id, int vpdev); eHalStatus wma_set_htconfig(tANI_U8 vdev_id, tANI_U16 ht_capab, int value); @@ -130,5 +133,8 @@ u_int8_t *wma_get_vdev_address_by_vdev_id(u_int8_t vdev_id); void *wma_get_beacon_buffer_by_vdev_id(u_int8_t vdev_id, u_int32_t *buffer_size); #endif /* QCA_WIFI_ISOC */ + +int process_wma_set_command(int sessid, int paramid, + int sval, int vpdev); tANI_U8 wma_getFwWlanFeatCaps(tANI_U8 featEnumValue); #endif diff --git a/CORE/SERVICES/COMMON/wmi_services.h b/CORE/SERVICES/COMMON/wmi_services.h index bf9da5e3b87e..577f5b095a71 100644 --- a/CORE/SERVICES/COMMON/wmi_services.h +++ b/CORE/SERVICES/COMMON/wmi_services.h @@ -86,6 +86,9 @@ typedef enum { WMI_SERVICE_MCC_BCN_INTERVAL_CHANGE, /* Dynamic beaocn interval change for SAP/P2p GO in MCC scenario */ WMI_SERVICE_ADAPTIVE_OCS, /* Service to support adaptive off-channel scheduler */ WMI_SERVICE_BA_SSN_SUPPORT, /* target will provide Sequence number for the peer/tid combo */ + WMI_SERVICE_FILTER_IPSEC_NATKEEPALIVE, + WMI_SERVICE_WLAN_HB, /* wlan HB service */ + WMI_SERVICE_LTE_ANT_SHARE_SUPPORT, /* support LTE/WLAN antenna sharing */ WMI_MAX_SERVICE=64 /* max service */ } WMI_SERVICE; diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h index 9c9f0c853406..ec155a9038d4 100644 --- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h +++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h @@ -357,6 +357,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_upload_h_hdr, WMITLV_TAG_STRUC_wmi_capture_h_event_hdr, WMITLV_TAG_STRUC_WMI_VDEV_WNM_SLEEPMODE_CMD_fixed_param, + WMITLV_TAG_STRUC_WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param, WMITLV_TAG_STRUC_wmi_vdev_wmm_addts_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_vdev_wmm_delts_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_vdev_set_wmm_params_cmd_fixed_param, @@ -383,6 +384,15 @@ typedef enum { WMITLV_TAG_STRUC_wmi_mcc_sched_traffic_stats_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_mcc_sched_sta_traffic_stats, WMITLV_TAG_STRUC_wmi_offload_bcn_tx_status_event_fixed_param, + WMITLV_TAG_STRUC_wmi_p2p_noa_event_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_set_enable_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_set_tcp_params_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_set_tcp_pkt_filter_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_set_udp_params_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_set_udp_pkt_filter_cmd_fixed_param, + WMITLV_TAG_STRUC_wmi_hb_ind_event_fixed_param, + WMITLV_TAG_STRUC_wmi_tx_pause_event_fixed_param, + WMITLV_TAG_STRUC_wmi_rfkill_event_fixed_param, } WMITLV_TAG_ID; /* @@ -492,6 +502,7 @@ typedef enum { OP(WMI_TXBF_CMDID) \ OP(WMI_DBGLOG_CFG_CMDID) \ OP(WMI_VDEV_WNM_SLEEPMODE_CMDID) \ + OP(WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID) \ OP(WMI_VDEV_WMM_ADDTS_CMDID) \ OP(WMI_VDEV_WMM_DELTS_CMDID) \ OP(WMI_VDEV_SET_WMM_PARAMS_CMDID) \ @@ -509,7 +520,13 @@ typedef enum { OP(WMI_P2P_SET_OPPPS_PARAM_CMDID) \ OP(WMI_FWTEST_P2P_SET_NOA_PARAM_CMDID) \ OP(WMI_STA_SMPS_PARAM_CMDID) \ - OP(WMI_MCC_SCHED_TRAFFIC_STATS_CMDID) + OP(WMI_MCC_SCHED_TRAFFIC_STATS_CMDID) \ + OP(WMI_HB_SET_ENABLE_CMDID) \ + OP(WMI_HB_SET_TCP_PARAMS_CMDID) \ + OP(WMI_HB_SET_TCP_PKT_FILTER_CMDID) \ + OP(WMI_HB_SET_UDP_PARAMS_CMDID) \ + OP(WMI_HB_SET_UDP_PKT_FILTER_CMDID) + /* * IMPORTANT: Please add _ALL_ WMI Events Here. * Otherwise, these WMI TLV Functions will be process them. @@ -557,7 +574,10 @@ typedef enum { OP(WMI_TDLS_PEER_EVENTID) \ OP(WMI_VDEV_MCC_BCN_INTERVAL_CHANGE_REQ_EVENTID) \ OP(WMI_BA_RSP_SSN_EVENTID) \ - OP(WMI_OFFLOAD_BCN_TX_STATUS_EVENTID) + OP(WMI_OFFLOAD_BCN_TX_STATUS_EVENTID) \ + OP(WMI_P2P_NOA_EVENTID) \ + OP(WMI_TX_PAUSE_EVENTID) \ + OP(WMI_RFKILL_STATE_CHANGE_EVENTID) /* TLV definitions of WMI commands */ @@ -803,6 +823,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_VDEV_INSTALL_KEY_CMDID); WMITLV_CREATE_PARAM_STRUC(WMI_VDEV_WNM_SLEEPMODE_CMDID); +#define WMITLV_TABLE_WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param, WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID); + /* Peer Assoc Cmd */ #define WMITLV_TABLE_WMI_PEER_ASSOC_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_assoc_complete_cmd_fixed_param, wmi_peer_assoc_complete_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ @@ -1289,6 +1314,41 @@ WMITLV_CREATE_PARAM_STRUC(WMI_RESMGR_SET_CHAN_LATENCY_CMDID); WMITLV_CREATE_PARAM_STRUC(WMI_STA_SMPS_FORCE_MODE_CMDID); +/* wlan hb enable/disable CMD */ +#define WMITLV_TABLE_WMI_HB_SET_ENABLE_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_hb_set_enable_cmd_fixed_param, \ + wmi_hb_set_enable_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_HB_SET_ENABLE_CMDID); + +/* wlan hb set tcp params CMD */ +#define WMITLV_TABLE_WMI_HB_SET_TCP_PARAMS_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_hb_set_tcp_params_cmd_fixed_param, \ + wmi_hb_set_tcp_params_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_HB_SET_TCP_PARAMS_CMDID); + +/* wlan hb set tcp pkt filter CMD */ +#define WMITLV_TABLE_WMI_HB_SET_TCP_PKT_FILTER_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_hb_set_tcp_pkt_filter_cmd_fixed_param, \ + wmi_hb_set_tcp_pkt_filter_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_HB_SET_TCP_PKT_FILTER_CMDID); + +/* wlan set udp params CMD */ +#define WMITLV_TABLE_WMI_HB_SET_UDP_PARAMS_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_hb_set_udp_params_cmd_fixed_param, \ + wmi_hb_set_udp_params_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_HB_SET_UDP_PARAMS_CMDID); + +/* wlan hb set udp pkt filter CMD */ +#define WMITLV_TABLE_WMI_HB_SET_UDP_PKT_FILTER_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_hb_set_udp_pkt_filter_cmd_fixed_param, \ + wmi_hb_set_udp_pkt_filter_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) + +WMITLV_CREATE_PARAM_STRUC(WMI_HB_SET_UDP_PKT_FILTER_CMDID); + /* STA SMPS Param CMD */ #define WMITLV_TABLE_WMI_STA_SMPS_PARAM_CMDID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_sta_smps_param_cmd_fixed_param, \ @@ -1341,6 +1401,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_CHAN_INFO_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, bufp, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_PHYERR_EVENTID); +/* TX Pause/Unpause event */ +#define WMITLV_TABLE_WMI_TX_PAUSE_EVENTID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_tx_pause_event_fixed_param, wmi_tx_pause_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_TX_PAUSE_EVENTID); + /* VDEV Start response Event */ #define WMITLV_TABLE_WMI_VDEV_START_RESP_EVENTID(id,op,buf,len) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_vdev_start_response_event_fixed_param, wmi_vdev_start_response_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) @@ -1400,6 +1465,7 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_WOW_EVENT_INFO_fixed_param, WOW_EVENT_INFO_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WOW_EVENT_INFO_SECTION_BITMAP, wow_bitmap_info, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, wow_packet_buffer, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_hb_ind_event_fixed_param, hb_indevt, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WMI_GTK_OFFLOAD_STATUS_EVENT_fixed_param, wow_gtkigtk, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_WOW_WAKEUP_HOST_EVENTID); @@ -1435,6 +1501,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_GPIO_INPUT_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_csa_event_fixed_param, wmi_csa_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_CSA_HANDLING_EVENTID); +/* Rfkill state change Event */ +#define WMITLV_TABLE_WMI_RFKILL_STATE_CHANGE_EVENTID(id,op,buf,len)\ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rfkill_event_fixed_param, wmi_rfkill_mode_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_RFKILL_STATE_CHANGE_EVENTID); + /* Debug Message Event */ #define WMITLV_TABLE_WMI_DEBUG_MESG_EVENTID(id,op,buf,len)\ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, bufp, WMITLV_SIZE_VAR) @@ -1543,6 +1614,12 @@ WMITLV_CREATE_PARAM_STRUC(WMI_VDEV_MCC_BCN_INTERVAL_CHANGE_REQ_EVENTID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_offload_bcn_tx_status_event_fixed_param, wmi_offload_bcn_tx_status_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_OFFLOAD_BCN_TX_STATUS_EVENTID); +/* NOA Event */ +#define WMITLV_TABLE_WMI_P2P_NOA_EVENTID(id,op,buf,len) \ +WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_noa_event_fixed_param, wmi_p2p_noa_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \ +WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_p2p_noa_info, wmi_p2p_noa_info, p2p_noa_info, WMITLV_SIZE_FIX) + WMITLV_CREATE_PARAM_STRUC(WMI_P2P_NOA_EVENTID); + #ifdef __cplusplus } #endif diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h index 388a3c230ca8..ffbcd86e3d15 100644 --- a/CORE/SERVICES/COMMON/wmi_unified.h +++ b/CORE/SERVICES/COMMON/wmi_unified.h @@ -165,6 +165,7 @@ typedef enum { WMI_GRP_TDLS, WMI_GRP_RESMGR, WMI_GRP_STA_SMPS, + WMI_GRP_WLAN_HB } WMI_GRP_ID; #define WMI_CMD_GRP_START_ID(grp_id) (((grp_id) << 12) | 0x1) @@ -253,6 +254,7 @@ typedef enum { WMI_VDEV_WMM_DELTS_CMDID, WMI_VDEV_SET_WMM_PARAMS_CMDID, WMI_VDEV_SET_GTX_PARAMS_CMDID, + WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID, /* peer specific commands */ @@ -526,6 +528,18 @@ typedef enum { WMI_STA_SMPS_FORCE_MODE_CMDID = WMI_CMD_GRP_START_ID(WMI_GRP_STA_SMPS), /** set SMPS parameters */ WMI_STA_SMPS_PARAM_CMDID, + + /* Wlan HB commands*/ + /* enalbe/disable wlan HB */ + WMI_HB_SET_ENABLE_CMDID = WMI_CMD_GRP_START_ID(WMI_GRP_WLAN_HB), + /* set tcp parameters for wlan HB */ + WMI_HB_SET_TCP_PARAMS_CMDID, + /* set tcp pkt filter for wlan HB */ + WMI_HB_SET_TCP_PKT_FILTER_CMDID, + /* set udp parameters for wlan HB */ + WMI_HB_SET_UDP_PARAMS_CMDID, + /* set udp pkt filter for wlan HB */ + WMI_HB_SET_UDP_PKT_FILTER_CMDID, } WMI_CMD_ID; typedef enum { @@ -549,6 +563,9 @@ typedef enum { /** eeprom dump event */ WMI_PDEV_DUMP_EVENTID, + /** traffic pause event */ + WMI_TX_PAUSE_EVENTID, + /* VDEV specific events */ /** VDEV started event in response to VDEV_START request */ WMI_VDEV_START_RESP_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_VDEV), @@ -602,6 +619,9 @@ typedef enum { /** P2P disc found */ WMI_P2P_DISC_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_P2P), + /*send noa info to host when noa is changed for beacon tx offload enable*/ + WMI_P2P_NOA_EVENTID, + /** WOW wake up host event.generated in response to WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID. will cary wake reason */ WMI_WOW_WAKEUP_HOST_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_WOW), @@ -669,7 +689,6 @@ typedef enum { /* GPIO Event */ WMI_GPIO_INPUT_EVENTID=WMI_EVT_GRP_START_ID(WMI_GRP_GPIO), - /** upload H_CV info WMI event * to indicate uploaded H_CV info to host */ @@ -679,6 +698,9 @@ typedef enum { * to indicate captured H info to host */ WMI_CAPTUREH_EVENTID, + /* hw RFkill */ + WMI_RFKILL_STATE_CHANGE_EVENTID, + /* TDLS Event */ WMI_TDLS_PEER_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_TDLS), } WMI_EVT_ID; @@ -896,6 +918,12 @@ typedef struct { * by DMA. */ A_UINT32 num_mem_reqs; + /* Max No. scan channels target can support + * If FW is too old and doesn't indicate this number, host side value will default to + * 0, and host will take the original compatible value (62) for future scan channel + * setup. + */ + A_UINT32 max_num_scan_channels; /* The TLVs for hal_reg_capabilities, wmi_service_bitmap and mem_reqs[] will follow this TLV. * HAL_REG_CAPABILITIES hal_reg_capabilities; * A_UINT32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; @@ -1358,9 +1386,13 @@ typedef struct { A_UINT32 vdev_id; } wmi_stop_scan_cmd_fixed_param; +#define MAX_NUM_CHAN_PER_WMI_CMD 58 // each WMI cmd can hold 58 channel entries at most +#define APPEND_TO_EXISTING_CHAN_LIST 1 + typedef struct { A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_scan_chan_list_cmd_fixed_param */ A_UINT32 num_scan_chans; /** no of elements in chan_info[] */ + A_UINT32 flags; /* Flags used to control the behavior of channel list update on target side */ /** Followed by the variable length TLV chan_info: * wmi_channel chan_info[] */ } wmi_scan_chan_list_cmd_fixed_param; @@ -1953,6 +1985,8 @@ typedef enum { WMI_PDEV_PARAM_BURST_DUR, /** Set Bursting ENABLE */ WMI_PDEV_PARAM_BURST_ENABLE, + /** HW rfkill config */ + WMI_PDEV_PARAM_HW_RFKILL_CONFIG, } WMI_PDEV_PARAM; typedef enum { @@ -1996,6 +2030,28 @@ typedef struct { A_UINT32 param; } wmi_pdev_dump_cmd; +typedef enum { + PAUSE_TYPE_CHOP = 0x1, /** for MCC (switch channel), only vdev_map is valid */ + PAUSE_TYPE_PS = 0x2, /** for peer station sleep in sap mode, only peer_id is valid */ + PAUSE_TYPE_UAPSD = 0x3, /** for uapsd, only peer_id and tid_map are valid. */ + PAUSE_TYPE_P2P_CLIENT_NOA = 0x4, /** only vdev_map is valid, actually only one vdev id is set at one time */ + PAUSE_TYPE_P2P_GO_PS = 0x5, /** only vdev_map is valid, actually only one vdev id is set at one time */ + PAUSE_TYPE_STA_ADD_BA = 0x6, /** only peer_id and tid_map are valid, actually only one tid is set at one time */ +} wmi_tx_pause_type; + +typedef enum { + ACTION_PAUSE = 0x0, + ACTION_UNPAUSE = 0x1, +} wmi_tx_pause_action; + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 pause_type; + A_UINT32 action; + A_UINT32 vdev_map; + A_UINT32 peer_id; + A_UINT32 tid_map; +} wmi_tx_pause_event_fixed_param; #define WMI_TPC_RATE_MAX 160 /* WMI_TPC_TX_NUM_CHAIN macro can't be changed without breaking the WMI compatibility */ @@ -2512,6 +2568,7 @@ typedef struct { #define WMI_CIPHER_WAPI 0x5 #define WMI_CIPHER_CKIP 0x6 #define WMI_CIPHER_AES_CMAC 0x7 +#define WMI_CIPHER_ANY 0x8 typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_vdev_install_key_cmd_fixed_param */ @@ -2775,6 +2832,10 @@ typedef struct { WMI_START_EVENT_PARAM resp_type; /** status of the response */ A_UINT32 status; + /** Vdev chain mask */ + A_UINT32 chain_mask; + /** Vdev mimo power save mode */ + A_UINT32 smps_mode; } wmi_vdev_start_response_event_fixed_param; typedef struct { @@ -3316,12 +3377,26 @@ typedef struct { /* Peer Specific commands and events */ + + /* Peer Type: + * NB: This can be left DEFAULT for the normal case, and f/w will determine BSS type based + * on address and vdev opmode. This is largely here to allow host to indicate that + * peer is explicitly a TDLS peer + */ + enum wmi_peer_type { + WMI_PEER_TYPE_DEFAULT = 0, /* Generic/Non-BSS/Self Peer */ + WMI_PEER_TYPE_BSS = 1, /* Peer is BSS Peer entry */ + WMI_PEER_TYPE_TDLS = 2, /* Peer is a TDLS Peer */ + }; + typedef struct { A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_peer_create_cmd_fixed_param */ /** unique id identifying the VDEV, generated by the caller */ A_UINT32 vdev_id; /** peer MAC address */ wmi_mac_addr peer_macaddr; + /** peer type: see enum values above */ + A_UINT32 peer_type; } wmi_peer_create_cmd_fixed_param; typedef struct { @@ -3941,6 +4016,10 @@ enum { WMI_AUTH_RSNA , /* WPA2/RSNA */ WMI_AUTH_CCKM , /* CCK */ WMI_AUTH_WAPI ,/* WAPI */ + WMI_AUTH_AUTO_PSK, + WMI_AUTH_WPA_PSK, + WMI_AUTH_RSNA_PSK, + WMI_AUTH_WAPI_PSK }; typedef struct { @@ -4373,6 +4452,7 @@ typedef enum wake_reason_e { WOW_REASON_PATTERN_MATCH_FOUND, WOW_REASON_RECV_MAGIC_PATTERN, WOW_REASON_P2P_DISC, + WOW_REASON_WLAN_HB, WOW_REASON_DEBUG_TEST = 0xFF, }WOW_WAKE_REASON_TYPE; @@ -4984,6 +5064,17 @@ typedef struct { A_UINT32 keepaliveMethod; /* seconds */ } wmi_vdev_get_keepalive_event_fixed_param; +#define IPSEC_NATKEEPALIVE_FILTER_DISABLE 0 +#define IPSEC_NATKEEPALIVE_FILTER_ENABLE 1 + +typedef struct { + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 action; +} WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param; + +typedef WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD; + typedef struct { A_UINT32 tlv_header; A_UINT32 vdev_id; @@ -5487,6 +5578,88 @@ typedef struct { A_UINT32 forced_mode; } wmi_sta_smps_force_mode_cmd_fixed_param; +/** wlan HB commands */ +#define WMI_WLAN_HB_ITEM_UDP 0x1 +#define WMI_WLAN_HB_ITEM_TCP 0x2 +#define WMI_WLAN_HB_MAX_FILTER_SIZE 32 /* should be equal to WLAN_HB_MAX_FILTER_SIZE, must be a multiple of 4 bytes */ + +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_hb_set_enable_cmd_fixed_param */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 enable; + A_UINT32 item; + A_UINT32 session; +} wmi_hb_set_enable_cmd_fixed_param; + +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_hb_set_tcp_params_cmd_fixed_param */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 srv_ip; + A_UINT32 dev_ip; + A_UINT32 seq; + A_UINT32 src_port; + A_UINT32 dst_port; + A_UINT32 interval; + A_UINT32 timeout; + A_UINT32 session; +wmi_mac_addr gateway_mac; +} wmi_hb_set_tcp_params_cmd_fixed_param; + +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_hb_set_tcp_pkt_filter_cmd_fixed_param */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 length; + A_UINT32 offset; + A_UINT32 session; + A_UINT8 filter[WMI_WLAN_HB_MAX_FILTER_SIZE]; +} wmi_hb_set_tcp_pkt_filter_cmd_fixed_param; + +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_hb_set_udp_params_cmd_fixed_param */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 srv_ip; + A_UINT32 dev_ip; + A_UINT32 src_port; + A_UINT32 dst_port; + A_UINT32 interval; + A_UINT32 timeout; + A_UINT32 session; + wmi_mac_addr gateway_mac; +} wmi_hb_set_udp_params_cmd_fixed_param; + +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_hb_set_udp_pkt_filter_cmd_fixed_param */ + A_UINT32 tlv_header; + A_UINT32 vdev_id; + A_UINT32 length; + A_UINT32 offset; + A_UINT32 session; + A_UINT8 filter[WMI_WLAN_HB_MAX_FILTER_SIZE]; +} wmi_hb_set_udp_pkt_filter_cmd_fixed_param; + +/** wlan HB events */ +typedef enum { + WMI_WLAN_HB_REASON_UNKNOWN = 0, + WMI_WLAN_HB_REASON_TCP_TIMEOUT = 1, + WMI_WLAN_HB_REASON_UDP_TIMEOUT = 2, +} WMI_HB_WAKEUP_REASON; + +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_hb_ind_event_fixed_param */ + A_UINT32 vdev_id; /* unique id identifying the VDEV */ + A_UINT32 session; /* Session ID from driver */ + A_UINT32 reason; /* wakeup reason */ +} wmi_hb_ind_event_fixed_param; + /** WMI_STA_SMPS_PARAM_CMDID */ typedef enum { /** RSSI threshold to enter Dynamic SMPS mode from inactive mode */ @@ -5542,6 +5715,35 @@ typedef struct { */ } wmi_mcc_sched_traffic_stats_cmd_fixed_param; +typedef struct { + A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_p2p_noa_event_fixed_param */ + A_UINT32 vdev_id; + /* This TLV is followed by p2p_noa_info for vdev : + * wmi_p2p_noa_info p2p_noa_info; + */ +} wmi_p2p_noa_event_fixed_param; + +#define WMI_RFKILL_CFG_RADIO_LEVEL_OFFSET 6 +#define WMI_RFKILL_CFG_RADIO_LEVEL_MASK 0x1 + +#define WMI_RFKILL_CFG_GPIO_PIN_NUM_OFFSET 0 +#define WMI_RFKILL_CFG_GPIO_PIN_NUM_MASK 0x3f + +#define WMI_RFKILL_CFG_PIN_AS_GPIO_OFFSET 7 +#define WMI_RFKILL_CFG_PIN_AS_GPIO_MASK 0xf + +typedef struct { + /** TLV tag and len; tag equals + * */ + A_UINT32 tlv_header; + /** gpip pin number */ + A_UINT32 gpio_pin_num; + /** gpio interupt type */ + A_UINT32 int_type; + /** RF radio status */ + A_UINT32 radio_state; +} wmi_rfkill_mode_param; + #ifdef __cplusplus } #endif diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h index 4ce800710c27..645ccc1fe923 100644 --- a/CORE/SERVICES/COMMON/wmi_version.h +++ b/CORE/SERVICES/COMMON/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 17 +#define __WMI_REVISION_ 21 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work diff --git a/CORE/SERVICES/HIF/PCIe/copy_engine.c b/CORE/SERVICES/HIF/PCIe/copy_engine.c index 093931174e9d..6499d8c9e16f 100644 --- a/CORE/SERVICES/HIF/PCIe/copy_engine.c +++ b/CORE/SERVICES/HIF/PCIe/copy_engine.c @@ -885,6 +885,7 @@ more_completions: /* Break the receive processes by force if force_break set up */ if (adf_os_unlikely(sc->force_break)) { + adf_os_atomic_set(&CE_state->rx_pending, 1); CE_ENGINE_INT_STATUS_CLEAR(targid, ctrl_addr, HOST_IS_COPY_COMPLETE_MASK); A_TARGET_ACCESS_END(targid); return; @@ -978,6 +979,7 @@ more_watermarks: } adf_os_spin_unlock(&sc->target_lock); + adf_os_atomic_set(&CE_state->rx_pending, 0); A_TARGET_ACCESS_END(targid); } @@ -996,6 +998,19 @@ CE_per_engine_service_any(int irq, void *arg) A_UINT32 intr_summary; A_TARGET_ACCESS_BEGIN(targid); + if (!adf_os_atomic_read(&sc->tasklet_from_intr)) { + for (CE_id=0; CE_id < sc->ce_count; CE_id++) { + struct CE_state *CE_state = sc->CE_id_to_state[CE_id]; + if (adf_os_atomic_read(&CE_state->rx_pending)) { + adf_os_atomic_set(&CE_state->rx_pending, 0); + CE_per_engine_service(sc, CE_id); + } + } + + A_TARGET_ACCESS_END(targid); + return; + } + intr_summary = CE_INTERRUPT_SUMMARY(targid); for (CE_id=0; intr_summary && (CE_id < sc->ce_count); CE_id++) { @@ -1183,6 +1198,18 @@ roundup_pwr2(unsigned int n) return 0; } +bool CE_get_rx_pending(struct hif_pci_softc *sc) +{ + int CE_id; + + for (CE_id=0; CE_id < sc->ce_count; CE_id++) { + struct CE_state *CE_state = sc->CE_id_to_state[CE_id]; + if (adf_os_atomic_read(&CE_state->rx_pending)) + return true; + } + + return false; +} /* * Initialize a Copy Engine based on caller-supplied attributes. * This may be called once to initialize both source and destination @@ -1234,6 +1261,7 @@ CE_init(struct hif_pci_softc *sc, } adf_os_spin_unlock(&sc->target_lock); + adf_os_atomic_init(&CE_state->rx_pending); if (attr == NULL) { /* Already initialized; caller wants the handle */ return (struct CE_handle *)CE_state; diff --git a/CORE/SERVICES/HIF/PCIe/copy_engine_api.h b/CORE/SERVICES/HIF/PCIe/copy_engine_api.h index 885f074fecd4..deb683ea6fce 100644 --- a/CORE/SERVICES/HIF/PCIe/copy_engine_api.h +++ b/CORE/SERVICES/HIF/PCIe/copy_engine_api.h @@ -367,6 +367,9 @@ void CE_enable_any_copy_compl_intr(struct hif_pci_softc *sc); void CE_disable_any_copy_compl_intr_nolock(struct hif_pci_softc *sc); void CE_enable_any_copy_compl_intr_nolock(struct hif_pci_softc *sc); +/* API to check if any of the copy engine pipes has pending frames for prcoessing */ +bool CE_get_rx_pending(struct hif_pci_softc *sc); + /* CE_attr.flags values */ #define CE_ATTR_NO_SNOOP 0x01 /* Use NonSnooping PCIe accesses? */ #define CE_ATTR_BYTE_SWAP_DATA 0x02 /* Byte swap data words */ diff --git a/CORE/SERVICES/HIF/PCIe/copy_engine_internal.h b/CORE/SERVICES/HIF/PCIe/copy_engine_internal.h index c298271a78ab..ad54f2bdfc86 100644 --- a/CORE/SERVICES/HIF/PCIe/copy_engine_internal.h +++ b/CORE/SERVICES/HIF/PCIe/copy_engine_internal.h @@ -122,6 +122,7 @@ struct CE_state { unsigned int src_sz_max; struct CE_ring_state *src_ring; struct CE_ring_state *dest_ring; + atomic_t rx_pending; }; /* Descriptor rings must be aligned to this boundary */ diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.c b/CORE/SERVICES/HIF/PCIe/hif_pci.c index 0bf65463c703..4db4fc73df17 100644 --- a/CORE/SERVICES/HIF/PCIe/hif_pci.c +++ b/CORE/SERVICES/HIF/PCIe/hif_pci.c @@ -1974,8 +1974,8 @@ HIF_PCIDeviceProbed(hif_handle_t hif_hdl) hif_state->fw_indicator_address = FW_INDICATOR_ADDRESS; hif_state->targid = A_TARGET_ID(sc->hif_device); -#if CONFIG_ATH_PCIE_MAX_PERF - /* Force AWAKE forever */ +#if CONFIG_ATH_PCIE_MAX_PERF || CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD + /* Force AWAKE forever/till the driver is loaded */ HIFTargetSleepStateAdjust(hif_state->targid, FALSE, TRUE); #endif @@ -2299,6 +2299,13 @@ HIFTargetSleepStateAdjust(A_target_id_t targid, } } +void +HIFSetTargetSleep(HIF_DEVICE *hif_device, A_BOOL sleep_ok, A_BOOL wait_for_it) +{ + struct HIF_CE_state *hif_state = (struct HIF_CE_state *)hif_device; + HIFTargetSleepStateAdjust(hif_state->targid, sleep_ok, wait_for_it); +} + A_BOOL HIFTargetForcedAwake(A_target_id_t targid) { diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index a637a5c791b7..61255fb75dc5 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -38,6 +38,9 @@ #include <osapi_linux.h> #include "vos_api.h" #include "wma_api.h" +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +#include "wlan_hdd_power.h" +#endif #ifdef CONFIG_CNSS #include <net/cnss.h> #endif @@ -56,6 +59,8 @@ #define AR9888_DEVICE_ID (0x003c) #define AR6320_DEVICE_ID (0x003e) +#define MAX_NUM_OF_RECEIVES 1000 /* Maximum number of Rx buf to process before break out */ + unsigned int msienable = 0; module_param(msienable, int, 0644); @@ -101,6 +106,7 @@ hif_pci_interrupt_handler(int irq, void *arg) /* TBDXXX: Add support for WMAC */ sc->irq_event = irq; + adf_os_atomic_set(&sc->tasklet_from_intr, 1); tasklet_schedule(&sc->intr_tq); return IRQ_HANDLED; @@ -134,8 +140,7 @@ bool hif_max_num_receives_reached(unsigned int count) #ifdef EPPING_TEST return (count > 120); #else - /* Not implemented yet */ - return 0; + return (count > MAX_NUM_OF_RECEIVES); #endif } @@ -337,6 +342,16 @@ wlan_tasklet(unsigned long data) (irqreturn_t)HIF_fw_interrupt_handler(sc->irq_event, sc); CE_per_engine_service_any(sc->irq_event, sc); + adf_os_atomic_set(&sc->tasklet_from_intr, 0); + if (CE_get_rx_pending(sc)) { + /* + * There are frames pending, schedule tasklet to process them. + * Enable the interrupt only when there is no pending frames in + * any of the Copy Engine pipes. + */ + tasklet_schedule(&sc->intr_tq); + return; + } if (LEGACY_INTERRUPTS(sc)) { /* Enable Legacy PCI line interrupts */ A_PCI_WRITE32(sc->mem+(SOC_CORE_BASE_ADDRESS | PCIE_INTR_ENABLE_ADDRESS), @@ -548,6 +563,7 @@ again: ol_sc->enablefwlog = 0; ol_sc->enablesinglebinary = FALSE; + adf_os_atomic_init(&sc->tasklet_from_intr); init_waitqueue_head(&ol_sc->sc_osdev->event_queue); ret = hdd_wlan_startup(&pdev->dev, ol_sc); @@ -557,6 +573,9 @@ again: goto err_config; } + /* Re-enable ASPM after firmware/OTP download is complete */ + pci_write_config_dword(pdev, 0x80, lcr_val); + #ifndef REMOVE_PKT_LOG if (vos_get_conparam() != VOS_FTM_MODE) { /* @@ -615,6 +634,287 @@ err_region: return ret; } +/* This function will be called when SSR frame work wants to + * power up WLAN host driver when SSR happens. Most of this + * function is duplicated from hif_pci_probe(). + */ +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +int hif_pci_reinit(struct pci_dev *pdev, const struct pci_device_id *id) +{ + void __iomem *mem; + struct hif_pci_softc *sc; + struct ol_softc *ol_sc; + int probe_again = 0; + int ret = 0; + u_int16_t device_id; + u_int32_t hif_type; + u_int32_t target_type; + u_int32_t lcr_val; + +again: + ret = 0; + +#define BAR_NUM 0 + /* + * Without any knowledge of the Host, the Target + * may have been reset or power cycled and its + * Config Space may no longer reflect the PCI + * address space that was assigned earlier + * by the PCI infrastructure. Refresh it now. + */ + /* If PCI link is down, return from reinit() */ + pci_read_config_word(pdev,PCI_DEVICE_ID,&device_id); + printk("PCI device id is %04x :%04x\n", device_id, id->device); + if (device_id != id->device) { + printk(KERN_ERR "%s: PCI link is down!\n", __func__); + /* PCI link is down, so return with error code. */ + return -EIO; + } + + /* FIXME: Commenting out assign_resource + * call for dev_attach to work on 2.6.38 kernel + */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) && !defined(__LINUX_ARM_ARCH__) + if (pci_assign_resource(pdev, BAR_NUM)) { + printk(KERN_ERR "%s: Cannot assign PCI space!\n", __func__); + return -EIO; + } +#endif + + if (pci_enable_device(pdev)) { + printk(KERN_ERR "%s: Cannot enable PCI device!\n", __func__); + return -EIO; + } + + /* Request MMIO resources */ + ret = pci_request_region(pdev, BAR_NUM, "ath"); + if (ret) { + dev_err(&pdev->dev, "%s: PCI MMIO reservation error!\n", __func__); + ret = -EIO; + goto err_region; + } + + ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); + if (!ret) { + ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); + + if (ret) { + printk(KERN_ERR "%s: Cannot enable 64-bit consistent DMA!\n", + __func__); + goto err_dma; + } + } else { + ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); + if (!ret) { + ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); + if (ret) { + printk(KERN_ERR "%s: Cannot enable 32-bit consistent DMA!\n", + __func__); + goto err_dma; + } + } + } + + /* Set bus master bit in PCI_COMMAND to enable DMA */ + pci_set_master(pdev); + + /* Temporary FIX: disable ASPM. Will be removed after + the OTP is programmed. */ + pci_read_config_dword(pdev, 0x80, &lcr_val); + pci_write_config_dword(pdev, 0x80, (lcr_val & 0xffffff00)); + + /* Arrange for access to Target SoC registers */ + mem = pci_iomap(pdev, BAR_NUM, 0); + if (!mem) { + printk(KERN_ERR "%s: PCI iomap error!\n", __func__) ; + ret = -EIO; + goto err_iomap; + } + + sc = A_MALLOC(sizeof(*sc)); + if (!sc) { + ret = -ENOMEM; + goto err_alloc; + } + + OS_MEMZERO(sc, sizeof(*sc)); + sc->mem = mem; + sc->pdev = pdev; + sc->dev = &pdev->dev; + sc->aps_osdev.bdev = pdev; + sc->aps_osdev.device = &pdev->dev; + sc->aps_osdev.bc.bc_handle = (void *)mem; + sc->aps_osdev.bc.bc_bustype = HAL_BUS_TYPE_PCI; + sc->devid = id->device; + + adf_os_spinlock_init(&sc->target_lock); + + sc->cacheline_sz = dma_get_cache_alignment(); + + switch (id->device) { + case AR9888_DEVICE_ID: + hif_type = HIF_TYPE_AR9888; + target_type = TARGET_TYPE_AR9888; + break; + case AR6320_DEVICE_ID: + hif_type = HIF_TYPE_AR6320; + target_type = TARGET_TYPE_AR6320; + break; + default: + printk(KERN_ERR "%s: Unsupported device ID!\n", __func__); + ret = -ENODEV; + goto err_tgtstate; + } + + /* + * Attach Target register table. This is needed early on -- + * even before BMI -- since PCI and HIF initialization (and BMI init) + * directly access Target registers (e.g. CE registers). + */ + + hif_register_tbl_attach(sc, hif_type); + target_register_tbl_attach(sc, target_type); + { + A_UINT32 fw_indicator; +#if PCIE_BAR0_READY_CHECKING + int wait_limit = 200; +#endif + + /* + * Verify that the Target was started cleanly. + * + * The case where this is most likely is with an AUX-powered + * Target and a Host in WoW mode. If the Host crashes, + * loses power, or is restarted (without unloading the driver) + * then the Target is left (aux) powered and running. On a + * subsequent driver load, the Target is in an unexpected state. + * We try to catch that here in order to reset the Target and + * retry the probe. + */ + A_PCI_WRITE32(mem + PCIE_LOCAL_BASE_ADDRESS + PCIE_SOC_WAKE_ADDRESS, + PCIE_SOC_WAKE_V_MASK); + while (!hif_pci_targ_is_awake(sc, mem)) { + ; + } + +#if PCIE_BAR0_READY_CHECKING + /* Synchronization point: wait the BAR0 is configured. */ + while (wait_limit-- && + !(A_PCI_READ32(mem + PCIE_LOCAL_BASE_ADDRESS + + PCIE_SOC_RDY_STATUS_ADDRESS) & PCIE_SOC_RDY_STATUS_BAR_MASK)) { + A_MDELAY(10); + } + if (wait_limit < 0) { + /* AR6320v1 doesn't support checking of BAR0 configuration, + takes one sec to wait BAR0 ready. */ + printk(KERN_INFO "AR6320v1 waits two sec for BAR0 ready.\n"); + } +#endif + + fw_indicator = A_PCI_READ32(mem + FW_INDICATOR_ADDRESS); + A_PCI_WRITE32(mem + PCIE_LOCAL_BASE_ADDRESS + PCIE_SOC_WAKE_ADDRESS, + PCIE_SOC_WAKE_RESET); + + if (fw_indicator & FW_IND_INITIALIZED) { + probe_again++; + printk(KERN_ERR "%s: Target is in an unknown state. " + "Resetting (attempt %d).\n", __func__, probe_again); + /* hif_pci_device_reset, below will reset the target. */ + ret = -EIO; + goto err_tgtstate; + } + } + + ol_sc = A_MALLOC(sizeof(*ol_sc)); + if (!ol_sc) + goto err_attach; + + OS_MEMZERO(ol_sc, sizeof(*ol_sc)); + ol_sc->sc_osdev = &sc->aps_osdev; + ol_sc->hif_sc = (void *)sc; + sc->ol_sc = ol_sc; + ol_sc->target_type = target_type; + + if (hif_pci_configure(sc, &ol_sc->hif_hdl)) + goto err_config; + + ol_sc->enableuartprint = 0; + ol_sc->enablefwlog = 0; + ol_sc->enablesinglebinary = FALSE; + + init_waitqueue_head(&ol_sc->sc_osdev->event_queue); + + if (VOS_STATUS_SUCCESS == hdd_wlan_re_init(ol_sc)) { + ret = 0; + } + + if (ret) { + hif_nointrs(sc); + goto err_config; + } + +#ifndef REMOVE_PKT_LOG + if (vos_get_conparam() != VOS_FTM_MODE) { + /* + * pktlog initialization + */ + ol_pl_sethandle(&ol_sc->pdev_txrx_handle->pl_dev, ol_sc); + + if (pktlogmod_init(ol_sc)) + printk(KERN_ERR "%s: pktlogmod_init failed!\n", __func__); + } +#endif + +#ifdef WLAN_BTAMP_FEATURE + /* Send WLAN UP indication to Nlink Service */ + send_btc_nlink_msg(WLAN_MODULE_UP_IND, 0); +#endif + + printk("%s: WLAN host driver reinitiation completed!\n", __func__); + return 0; + +err_config: + A_FREE(ol_sc); +err_attach: + ret = -EIO; +err_tgtstate: + pci_set_drvdata(pdev, NULL); + hif_pci_device_reset(sc); + A_FREE(sc); +err_alloc: + /* Call HIF PCI free here */ + printk("%s: HIF PCI free needs to happen here.\n", __func__); + pci_iounmap(pdev, mem); +err_iomap: + pci_clear_master(pdev); +err_dma: + pci_release_region(pdev, BAR_NUM); +err_region: + pci_disable_device(pdev); + + if (probe_again && (probe_again <= ATH_PCI_PROBE_RETRY_MAX)) { + int delay_time; + + /* + * We can get here after a Host crash or power fail when + * the Target has aux power. We just did a device_reset, + * so we need to delay a short while before we try to + * reinitialize. Typically only one retry with the smallest + * delay is needed. Target should never need more than a 100Ms + * delay; that would not conform to the PCIe std. + */ + + printk(KERN_INFO "%s: PCI rereinit\n", __func__); + /* 10, 40, 90, 100, 100, ... */ + delay_time = max(100, 10 * (probe_again * probe_again)); + A_MDELAY(delay_time); + goto again; + } + + return ret; +} +#endif + void hif_nointrs(struct hif_pci_softc *sc) { @@ -858,16 +1158,6 @@ hif_pci_remove(struct pci_dev *pdev) mem = (void __iomem *)sc->mem; - hif_nointrs(sc); -#if CONFIG_PCIE_64BIT_MSI - OS_FREE_CONSISTENT(scn->sc_osdev, 4, scn->MSI_magic, scn->MSI_magic_dma, - OS_GET_DMA_MEM_CONTEXT(scn, MSI_dmacontext)); - scn->MSI_magic = NULL; - scn->MSI_magic_dma = 0; -#endif - /* Cancel the pending tasklet */ - tasklet_kill(&sc->intr_tq); - #if defined(CPU_WARM_RESET_WAR) /* Currently CPU warm reset sequence is tested only for AR9888_REV2 * Need to enable for AR9888_REV1 once CPU warm reset sequence is @@ -894,6 +1184,62 @@ hif_pci_remove(struct pci_dev *pdev) printk(KERN_INFO "pci_remove\n"); } +/* This function will be called when SSR framework wants to + * shutdown WLAN host driver when SSR happens. Most of this + * function is duplicated from hif_pci_remove(). + */ +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) +void hif_pci_shutdown(struct pci_dev *pdev) +{ + void __iomem *mem; + struct hif_pci_softc *sc; + struct ol_softc *scn; + + sc = pci_get_drvdata(pdev); + /* Attach did not succeed, all resources have been + * freed in error handler. + */ + if (!sc) + return; + + scn = sc->ol_sc; + +#ifndef REMOVE_PKT_LOG + if (vos_get_conparam() != VOS_FTM_MODE) + pktlogmod_exit(scn); +#endif + + hdd_wlan_shutdown(); + + mem = (void __iomem *)sc->mem; + +#if defined(CPU_WARM_RESET_WAR) + /* Currently CPU warm reset sequence is tested only for AR9888_REV2 + * Need to enable for AR9888_REV1 once CPU warm reset sequence is + * verified for AR9888_REV1. + */ + if (scn->target_version == AR9888_REV2_VERSION) { + hif_pci_device_warm_reset(sc); + } + else { + hif_pci_device_reset(sc); + } +#else + hif_pci_device_reset(sc); +#endif + + pci_disable_msi(pdev); + A_FREE(scn); + A_FREE(sc); + pci_set_drvdata(pdev, NULL); + pci_iounmap(pdev, mem); + pci_release_region(pdev, BAR_NUM); + pci_clear_master(pdev); + pci_disable_device(pdev); + + printk("%s: WLAN host driver shutting down completed!\n", __func__); +} +#endif #define OL_ATH_PCI_PM_CONTROL 0x44 @@ -1018,6 +1364,8 @@ struct cnss_wlan_driver cnss_wlan_drv_id = { .id_table = hif_pci_id_table, .probe = hif_pci_probe, .remove = hif_pci_remove, + .reinit = hif_pci_reinit, + .shutdown = hif_pci_shutdown, #ifdef ATH_BUS_PM .suspend = hif_pci_suspend, .resume = hif_pci_resume, @@ -1060,3 +1408,21 @@ void hif_init_pdev_txrx_handle(void *ol_sc, void *txrx_handle) struct ol_softc *sc = (struct ol_softc *)ol_sc; sc->pdev_txrx_handle = txrx_handle; } + +void hif_disable_isr(void *ol_sc) +{ + struct ol_softc *sc = (struct ol_softc *)ol_sc; + struct hif_pci_softc *hif_sc = sc->hif_sc; + struct ol_softc *scn; + + scn = hif_sc->ol_sc; + hif_nointrs(hif_sc); +#if CONFIG_PCIE_64BIT_MSI + OS_FREE_CONSISTENT(scn->sc_osdev, 4, scn->MSI_magic, scn->MSI_magic_dma, + OS_GET_DMA_MEM_CONTEXT(scn, MSI_dmacontext)); + scn->MSI_magic = NULL; + scn->MSI_magic_dma = 0; +#endif + /* Cancel the pending tasklet */ + tasklet_kill(&hif_sc->intr_tq); +} diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.h b/CORE/SERVICES/HIF/PCIe/if_pci.h index 79f6159fa197..f3a658dd1090 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.h +++ b/CORE/SERVICES/HIF/PCIe/if_pci.h @@ -85,6 +85,7 @@ struct hif_pci_softc { u16 devid; struct targetdef_s *targetdef; struct hostdef_s *hostdef; + atomic_t tasklet_from_intr; }; #define TARGID(sc) ((A_target_id_t)(&(sc)->mem)) #define TARGID_TO_HIF(targid) (((struct hif_pci_softc *)((char *)(targid) - (char *)&(((struct hif_pci_softc *)0)->mem)))->hif_device) @@ -108,6 +109,9 @@ adf_os_size_t initBufferCount(adf_os_size_t maxSize); /* Function to set the TXRX handle in the ol_sc context */ void hif_init_pdev_txrx_handle(void *ol_sc, void *txrx_handle); +void hif_disable_isr(void *ol_sc); + +void hif_init_adf_ctx(adf_os_device_t adf_dev, void *ol_sc); #ifndef REMOVE_PKT_LOG extern int pktlogmod_init(void *context); diff --git a/CORE/SERVICES/HTC/htc.c b/CORE/SERVICES/HTC/htc.c index 64a93168b8b8..0d917df950d2 100644 --- a/CORE/SERVICES/HTC/htc.c +++ b/CORE/SERVICES/HTC/htc.c @@ -771,3 +771,14 @@ void *htc_get_targetdef(HTC_HANDLE htc_handle) return hif_get_targetdef(target->hif_dev); } + +void HTCSetTargetToSleep(void *context) +{ +#if CONFIG_ATH_PCIE_MAX_PERF == 0 +#if CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD + struct ol_softc *sc = (struct ol_softc *)context; + + HIFSetTargetSleep(sc->hif_hdl, true, false); +#endif +#endif +} diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 974f15869950..6b7caa1c1036 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -125,9 +125,22 @@ #define CHAN_DUMP 2 #define WD_DUMP 3 +#define WMI_DEFAULT_NOISE_FLOOR_DBM (-96) + static void wma_send_msg(tp_wma_handle wma_handle, u_int16_t msg_type, void *body_ptr, u_int32_t body_val); +#ifdef QCA_IBSS_SUPPORT +static void wma_send_beacon_tmpl(WMA_HANDLE handle, + u_int8_t vdev_id); +static void wma_data_tx_ack_comp_hdlr(void *wma_context, + adf_nbuf_t netbuf, + int32_t status); +static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, + tpDelStaSelfParams pdel_sta_self_req_param, + u_int8_t generateRsp); +#endif + static tANI_U32 gFwWlanFeatCaps; #if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC) @@ -229,6 +242,31 @@ static bool wma_is_vdev_in_ap_mode(tp_wma_handle wma, u_int8_t vdev_id) return false; } +#ifdef QCA_IBSS_SUPPORT +/* Function : wma_is_vdev_in_ibss_mode + s_vdev_in_ibss_mode* Descriptin : Helper function to know whether given vdev id + * is in IBSS mode or not. + * Args : @wma - wma handle, @ vdev_id - vdev ID. + * Retruns : True - if given vdev id is in IBSS mode. + * False - if given vdev id is not in IBSS mode. + */ +static bool wma_is_vdev_in_ibss_mode(tp_wma_handle wma, u_int8_t vdev_id) +{ + struct wma_txrx_node *intf = wma->interfaces; + + if (vdev_id > wma->max_bssid) { + WMA_LOGP("%s: Invalid vdev_id %hu", __func__, vdev_id); + VOS_ASSERT(0); + return false; + } + + if (intf[vdev_id].type == WMI_VDEV_TYPE_IBSS) + return true; + + return false; +} +#endif + /* * Function : wma_find_bssid_by_vdev_id * Description : Get the BSS ID corresponding to the vdev ID @@ -330,12 +368,23 @@ static void wma_vdev_start_rsp(tp_wma_handle wma, #ifndef QCA_WIFI_ISOC struct beacon_info *bcn; #endif + +#ifdef QCA_IBSS_SUPPORT + WMA_LOGD("%s: vdev start response received for %s mode\n", __func__, + add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS ? "IBSS" : "non-IBSS"); +#endif + if (resp_event->status) { add_bss->status = VOS_STATUS_E_FAILURE; goto send_fail_resp; } + #ifndef QCA_WIFI_ISOC - if (add_bss->operMode == BSS_OPERATIONAL_MODE_AP) { + if ((add_bss->operMode == BSS_OPERATIONAL_MODE_AP) +#ifdef QCA_IBSS_SUPPORT + || (add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS) +#endif + ) { wma->interfaces[resp_event->vdev_id].beacon = vos_mem_malloc(sizeof(struct beacon_info)); @@ -510,8 +559,9 @@ static v_VOID_t wma_set_default_tgt_config(tp_wma_handle wma_handle) CFG_TGT_MAX_FRAG_TABLE_ENTRIES, 0, 0, - 0, + CFG_TGT_DEFAULT_BEACON_TX_OFFLOAD_MAX_VDEV, CFG_TGT_MAX_MULTICAST_FILTER_ENTRIES, + 0, }; WMITLV_SET_HDR(&tgt_cfg.tlv_header,WMITLV_TAG_STRUC_wmi_resource_config, @@ -670,6 +720,9 @@ static int wma_vdev_stop_resp_handler(void *handle, u_int8_t *cmd_param_info, ol_txrx_peer_handle peer; ol_txrx_pdev_handle pdev; u_int8_t peer_id; +#ifdef QCA_IBSS_SUPPORT + tDelStaSelfParams del_sta_param; +#endif param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info; if (!param_buf) { @@ -714,6 +767,16 @@ static int wma_vdev_stop_resp_handler(void *handle, u_int8_t *cmd_param_info, wma->interfaces[resp_event->vdev_id].beacon = NULL; } #endif + +#ifdef QCA_IBSS_SUPPORT + if (wma_is_vdev_in_ibss_mode(wma, params->sessionId)) { + del_sta_param.sessionId = params->sessionId; + vos_mem_copy((void *)del_sta_param.selfMacAddr, + (void *)params->bssid, VOS_MAC_ADDR_SIZE); + wma_vdev_detach(wma, &del_sta_param, 0); + } +#endif + params->status = VOS_STATUS_SUCCESS; wma_send_msg(wma, WDA_DELETE_BSS_RSP, (void *)params, 0); } @@ -1291,6 +1354,67 @@ static int wma_oem_data_error_report_event_callback(void *handle, } #endif /* FEATURE_OEM_DATA_SUPPORT */ +static int wma_p2p_noa_event_handler(void *handle, u_int8_t *event, u_int32_t len) +{ + tp_wma_handle wma = (tp_wma_handle) handle; + WMI_P2P_NOA_EVENTID_param_tlvs *param_buf; + wmi_p2p_noa_event_fixed_param *p2p_noa_event; + u_int8_t vdev_id, i; + wmi_p2p_noa_info *p2p_noa_info; + struct p2p_sub_element_noa noa_ie; + u_int8_t *buf_ptr; + u_int32_t descriptors; + + param_buf = (WMI_P2P_NOA_EVENTID_param_tlvs *) event; + if (!param_buf) { + WMA_LOGE("Invalid P2P NoA event buffer"); + return -EINVAL; + } + + p2p_noa_event = param_buf->fixed_param; + buf_ptr = (u_int8_t *) p2p_noa_event; + buf_ptr += sizeof(wmi_p2p_noa_event_fixed_param); + p2p_noa_info = (wmi_p2p_noa_info *) (buf_ptr); + vdev_id = p2p_noa_event->vdev_id; + + if (WMI_UNIFIED_NOA_ATTR_IS_MODIFIED(p2p_noa_info)) { + + vos_mem_zero(&noa_ie, sizeof(noa_ie)); + noa_ie.index = (u_int8_t)WMI_UNIFIED_NOA_ATTR_INDEX_GET(p2p_noa_info); + noa_ie.oppPS = (u_int8_t)WMI_UNIFIED_NOA_ATTR_OPP_PS_GET(p2p_noa_info); + noa_ie.ctwindow = (u_int8_t)WMI_UNIFIED_NOA_ATTR_CTWIN_GET(p2p_noa_info); + descriptors = WMI_UNIFIED_NOA_ATTR_NUM_DESC_GET(p2p_noa_info); + noa_ie.num_descriptors = (u_int8_t)descriptors; + + WMA_LOGI("%s: index %lu, oppPs %lu, ctwindow %lu, " + "num_descriptors = %lu", __func__, noa_ie.index, + noa_ie.oppPS, noa_ie.ctwindow, noa_ie.num_descriptors); + for(i = 0; i < noa_ie.num_descriptors; i++) { + noa_ie.noa_descriptors[i].type_count = + (u_int8_t)p2p_noa_info->noa_descriptors[i].type_count; + noa_ie.noa_descriptors[i].duration = + p2p_noa_info->noa_descriptors[i].duration; + noa_ie.noa_descriptors[i].interval = + p2p_noa_info->noa_descriptors[i].interval; + noa_ie.noa_descriptors[i].start_time = + p2p_noa_info->noa_descriptors[i].start_time; + WMA_LOGI("%s: NoA descriptor[%d] type_count %lu, " + "duration %lu, interval %lu, start_time = %lu", + __func__, i, + noa_ie.noa_descriptors[i].type_count, + noa_ie.noa_descriptors[i].duration, + noa_ie.noa_descriptors[i].interval, + noa_ie.noa_descriptors[i].start_time); + } + + /* Send a msg to LIM to update the NoA IE in probe response + * frames transmitted by the host */ + wma_update_probe_resp_noa(wma, &noa_ie); + } + + return 0; +} + /* * Allocate and init wmi adaptation layer. */ @@ -1363,6 +1487,7 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx, mac_params->maxBssId = WMA_MAX_SUPPORTED_BSS; mac_params->frameTransRequired = 0; + wma_handle->wlan_resource_config.num_wow_filters = mac_params->maxWoWFilters; wma_handle->max_station = mac_params->maxStation; wma_handle->max_bssid = mac_params->maxBssId; wma_handle->frame_xln_reqd = mac_params->frameTransRequired; @@ -1446,6 +1571,29 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx, WMA_LOGP("Firmware Dbglog initialization failed"); goto err_event_init; } + + /* + * Update Powersave mode + * 1 - Legacy Powersave + Deepsleep Disabled + * 2 - QPower + Deepsleep Disabled + * 3 - Legacy Powersave + Deepsleep Enabled + * 4 - QPower + Deepsleep Enabled + */ + wma_handle->powersave_mode = mac_params->powersaveOffloadEnabled; + + /* + * Value of mac_params->wowEnable can be, + * 0 - Disable both magic pattern match and pattern byte match. + * 1 - Enable magic pattern match on all interfaces. + * 2 - Enable pattern byte match on all interfaces. + * 3 - Enable both magic patter and pattern byte match on + * all interfaces. + */ + wma_handle->wow.magic_ptrn_enable = + (mac_params->wowEnable & 0x01) ? TRUE : FALSE; + wma_handle->ptrn_match_enable_all_vdev = + (mac_params->wowEnable & 0x02) ? TRUE : FALSE; + WMA_LOGD("%s: Exit", __func__); return VOS_STATUS_SUCCESS; @@ -1561,7 +1709,11 @@ enum wlan_op_mode wma_get_txrx_vdev_type(u_int32_t type) case WMI_VDEV_TYPE_STA: vdev_type = wlan_op_mode_sta; break; +#ifdef QCA_IBSS_SUPPORT case WMI_VDEV_TYPE_IBSS: + vdev_type = wlan_op_mode_ibss; + break; +#endif case WMI_VDEV_TYPE_MONITOR: default: WMA_LOGE("Invalid vdev type %u", type); @@ -1649,7 +1801,8 @@ static int wma_unified_vdev_delete_send(wmi_unified_t wmi_handle, u_int8_t if_id * Returns : */ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, - tpDelStaSelfParams pdel_sta_self_req_param) + tpDelStaSelfParams pdel_sta_self_req_param, + u_int8_t generateRsp) { VOS_STATUS status = VOS_STATUS_SUCCESS; void *txrx_hdl; @@ -1699,7 +1852,11 @@ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, WMA_LOGA("vdev_id:%hu vdev_hdl:%p\n", pdel_sta_self_req_param->sessionId, txrx_hdl); - wma_send_msg(wma_handle, WDA_DEL_STA_SELF_RSP, (void *)pdel_sta_self_req_param, 0); +#ifdef QCA_IBSS_SUPPORT + if (generateRsp) +#endif + wma_send_msg(wma_handle, WDA_DEL_STA_SELF_RSP, (void *)pdel_sta_self_req_param, 0); + return status; } @@ -1886,7 +2043,8 @@ static void wma_set_sap_keepalive(tp_wma_handle wma, u_int8_t vdev_id) * Returns : */ static ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle, - tpAddStaSelfParams self_sta_req) + tpAddStaSelfParams self_sta_req, + u_int8_t generateRsp) { ol_txrx_vdev_handle txrx_vdev_handle = NULL; ol_txrx_pdev_handle txrx_pdev = vos_get_context(VOS_MODULE_ID_TXRX, @@ -1936,6 +2094,28 @@ static ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle, goto end; } wma_handle->interfaces[self_sta_req->sessionId].handle = txrx_vdev_handle; + + wma_handle->interfaces[self_sta_req->sessionId].ptrn_match_enable = + wma_handle->ptrn_match_enable_all_vdev ? TRUE : FALSE; + + if (wlan_cfgGetInt(mac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfg_val) + != eSIR_SUCCESS) + wma_handle->wow.deauth_enable = TRUE; + else + wma_handle->wow.deauth_enable = cfg_val ? TRUE : FALSE; + + if (wlan_cfgGetInt(mac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfg_val) + != eSIR_SUCCESS) + wma_handle->wow.disassoc_enable = TRUE; + else + wma_handle->wow.disassoc_enable = cfg_val ? TRUE : FALSE; + + if (wlan_cfgGetInt(mac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfg_val) + != eSIR_SUCCESS) + wma_handle->wow.bmiss_enable = TRUE; + else + wma_handle->wow.bmiss_enable = cfg_val ? TRUE : FALSE; + vos_mem_copy(wma_handle->interfaces[self_sta_req->sessionId].addr, self_sta_req->selfMacAddr, sizeof(wma_handle->interfaces[self_sta_req->sessionId].addr)); @@ -2015,7 +2195,12 @@ static ol_txrx_vdev_handle wma_vdev_attach(tp_wma_handle wma_handle, end: self_sta_req->status = status; - wma_send_msg(wma_handle, WDA_ADD_STA_SELF_RSP, (void *)self_sta_req, 0); + +#ifdef QCA_IBSS_SUPPORT + if (generateRsp) +#endif + wma_send_msg(wma_handle, WDA_ADD_STA_SELF_RSP, (void *)self_sta_req, 0); + return txrx_vdev_handle; } @@ -2196,6 +2381,21 @@ VOS_STATUS wma_get_buf_start_scan_cmd(tp_wma_handle wma_handle, cmd->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION; cmd->scan_ctrl_flags |= WMI_SCAN_ADD_OFDM_RATES; + for (i = 0; i < wma_handle->max_bssid; i++) { + if (wma_is_vdev_in_ap_mode(wma_handle, i)) + break; + } + if (i != wma_handle->max_bssid) + cmd->burst_duration = scan_req->maxChannelTime * + WMA_SCAN_AP_PRESENT_MAX_OFFCHANNEL_NUM; + else { + if (scan_req->scanType == eSIR_PASSIVE_SCAN) + cmd->burst_duration = scan_req->maxChannelTime * + WMA_SCAN_MAX_OFFCHANNEL_NUM_PASSIVE; + else + cmd->burst_duration = scan_req->maxChannelTime * + WMA_SCAN_MAX_OFFCHANNEL_NUM_ACTIVE; + } if (!scan_req->p2pScanType) { WMA_LOGD("Normal Scan request"); cmd->scan_ctrl_flags |= WMI_SCAN_ADD_CCK_RATES; @@ -2573,7 +2773,7 @@ error: * Returns : */ VOS_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle, u_int8_t sessionId, - A_UINT32 rssi_thresh, A_UINT32 rssi_thresh_diff) + A_INT32 rssi_thresh, A_INT32 rssi_thresh_diff) { VOS_STATUS vos_status = VOS_STATUS_SUCCESS; wmi_buf_t buf = NULL; @@ -2676,7 +2876,7 @@ error: * Returns : */ VOS_STATUS wma_roam_scan_offload_rssi_change(tp_wma_handle wma_handle, u_int8_t sessionId, - A_UINT32 rssi_change_thresh, A_UINT32 bcn_rssi_weight) + A_INT32 rssi_change_thresh, A_UINT32 bcn_rssi_weight) { VOS_STATUS vos_status = VOS_STATUS_SUCCESS; wmi_buf_t buf = NULL; @@ -2800,26 +3000,31 @@ error: A_UINT32 eCsrAuthType_to_rsn_authmode (eCsrAuthType authtype) { switch(authtype) { case eCSR_AUTH_TYPE_OPEN_SYSTEM: - return (IEEE80211_AUTH_OPEN); + return (WMI_AUTH_OPEN); case eCSR_AUTH_TYPE_WPA: + return (WMI_AUTH_WPA); case eCSR_AUTH_TYPE_WPA_PSK: - return(IEEE80211_AUTH_WPA); + return (WMI_AUTH_WPA_PSK); case eCSR_AUTH_TYPE_RSN: + return (WMI_AUTH_RSNA); case eCSR_AUTH_TYPE_RSN_PSK: + return (WMI_AUTH_RSNA_PSK); #if defined WLAN_FEATURE_VOWIFI_11R case eCSR_AUTH_TYPE_FT_RSN: + return (WMI_AUTH_RSNA); case eCSR_AUTH_TYPE_FT_RSN_PSK: - return(IEEE80211_AUTH_RSNA); + return (WMI_AUTH_RSNA_PSK); #endif #ifdef FEATURE_WLAN_WAPI case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE: + return (WMI_AUTH_WAPI); case eCSR_AUTH_TYPE_WAPI_WAI_PSK: - return(IEEE80211_AUTH_WAPI); + return(WMI_AUTH_WAPI_PSK); #endif #ifdef FEATURE_WLAN_CCX case eCSR_AUTH_TYPE_CCKM_WPA: case eCSR_AUTH_TYPE_CCKM_RSN: - return(IEEE80211_AUTH_CCKM); + return(WMI_AUTH_CCKM); #endif default: return(WMI_AUTH_NONE); @@ -2839,19 +3044,20 @@ A_UINT32 eCsrEncryptionType_to_rsn_cipherset (eCsrEncryptionType encr) { case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY: case eCSR_ENCRYPT_TYPE_WEP40: case eCSR_ENCRYPT_TYPE_WEP104: - return (IEEE80211_CIPHER_WEP); + return (WMI_CIPHER_WEP); case eCSR_ENCRYPT_TYPE_TKIP: - return (IEEE80211_CIPHER_TKIP); + return (WMI_CIPHER_TKIP); case eCSR_ENCRYPT_TYPE_AES: - return (IEEE80211_CIPHER_AES_CCM); + return (WMI_CIPHER_AES_CCM); #ifdef FEATURE_WLAN_WAPI case eCSR_ENCRYPT_TYPE_WPI: - return (IEEE80211_CIPHER_WAPI); + return (WMI_CIPHER_WAPI); #endif /* FEATURE_WLAN_WAPI */ case eCSR_ENCRYPT_TYPE_ANY: + return (WMI_CIPHER_ANY); case eCSR_ENCRYPT_TYPE_NONE: default: - return (IEEE80211_CIPHER_NONE); + return (WMI_CIPHER_NONE); } } @@ -2863,6 +3069,7 @@ A_UINT32 eCsrEncryptionType_to_rsn_cipherset (eCsrEncryptionType encr) { v_VOID_t wma_roam_scan_fill_ap_profile(tp_wma_handle wma_handle, tpAniSirGlobal pMac, tANI_U8 sessionId, wmi_ap_profile *ap_profile_p) { + vos_mem_zero(ap_profile_p, sizeof(wmi_ap_profile)); ap_profile_p->ssid.ssid_len = pMac->roam.roamSession[sessionId].connectedProfile.SSID.length; vos_mem_copy(ap_profile_p->ssid.ssid, pMac->roam.roamSession[sessionId].connectedProfile.SSID.ssId, @@ -2874,7 +3081,6 @@ tANI_U8 sessionId, wmi_ap_profile *ap_profile_p) ap_profile_p->rsn_mcastcipherset = eCsrEncryptionType_to_rsn_cipherset(pMac->roam.roamSession[sessionId].connectedProfile.mcEncryptionType); ap_profile_p->rsn_mcastmgmtcipherset = ap_profile_p->rsn_mcastcipherset; - // DPD @@ ap_profile_p->rssi_threshold = pMac->roam.configParam.vccRssiThreshold; ap_profile_p->rssi_threshold = 5; } @@ -2887,32 +3093,32 @@ tANI_U8 sessionId, wmi_ap_profile *ap_profile_p) v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle, tpAniSirGlobal pMac, tSirRoamOffloadScanReq *roam_req, wmi_start_scan_cmd_fixed_param *scan_params) { - /* Pronto values - * scan_params.dwell_time_active = tSirRoamOffloadScanReq->NeighborScanChannelMaxTime; - * scan_params.dwell_time_passive = tSirRoamOffloadScanReq->NeighborScanChannelMaxTime; - * scan_params.min_rest_time = tSirRoamOffloadScanReq->NeighborScanTimerPeriod; - * scan_params.max_rest_time = tSirRoamOffloadScanReq->NeighborScanTimerPeriod; - * scan_params.repeat_probe_time = 50; - * scan_params.probe_spacing_time = 0; - * scan_params.probe_delay = 0; - * scan_params.max_scan_time = 50000; - * scan_params.idle_time = 200; - */ - - /* - * Currently it uses default parameters similar to Windows platform. - * They will be tuned after experiments and matching with CSR parameters - * used for Pronto. - */ - scan_params->dwell_time_active = 500; - scan_params->dwell_time_passive = 500; - scan_params->min_rest_time = 50; - scan_params->max_rest_time = 500; - scan_params->repeat_probe_time = 50; - scan_params->probe_spacing_time = 0; - scan_params->probe_delay = 0; - scan_params->max_scan_time = 50000; - scan_params->idle_time = 200; + vos_mem_zero(scan_params, sizeof(wmi_start_scan_cmd_fixed_param)); + if (roam_req != NULL) { + /* Parameters updated after association is complete */ + scan_params->dwell_time_active = roam_req->NeighborScanChannelMinTime; + scan_params->dwell_time_passive = roam_req->NeighborScanChannelMaxTime; + scan_params->min_rest_time = 50; + scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod - scan_params->dwell_time_passive; + scan_params->repeat_probe_time = roam_req->NeighborScanChannelMaxTime/3; + scan_params->probe_spacing_time = 0; + scan_params->probe_delay = 0; + scan_params->max_scan_time = 50000; /* 50 seconds for full scan cycle */ + scan_params->idle_time = 200; + scan_params->burst_duration = roam_req->NeighborScanChannelMaxTime; + } else { + /* roam_req = NULL during initial or pre-assoc invocation */ + scan_params->dwell_time_active = 100; + scan_params->dwell_time_passive = 110; + scan_params->min_rest_time = 50; + scan_params->max_rest_time = 500; + scan_params->repeat_probe_time = 50; + scan_params->probe_spacing_time = 0; + scan_params->probe_delay = 0; + scan_params->max_scan_time = 50000; + scan_params->idle_time = 200; + scan_params->burst_duration = 110; + } } /* function : wma_roam_scan_offload_ap_profile * Descriptin : Send WMI_ROAM_AP_PROFILE TLV to firmware @@ -3018,6 +3224,28 @@ VOS_STATUS wma_roam_scan_offload_init_connect(tp_wma_handle wma_handle, u_int8_t return vos_status; } +/* function : wma_roam_scan_offload_end_connect + * Descriptin : Stop the roam scan by setting scan mode to 0. + * Args : + * Returns : + */ +VOS_STATUS wma_roam_scan_offload_end_connect(tp_wma_handle wma_handle, u_int8_t sessionId) +{ + VOS_STATUS vos_status; + tpAniSirGlobal pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, + wma_handle->vos_context); + wmi_start_scan_cmd_fixed_param scan_params; + + if (!pMac->roam.configParam.isFastRoamIniFeatureEnabled) { + /* Fast roaming is disabled */ + return VOS_STATUS_SUCCESS; + } + + wma_roam_scan_fill_scan_params(wma_handle, pMac, NULL, &scan_params); + vos_status = wma_roam_scan_offload_mode(wma_handle, sessionId, &scan_params, + WMI_ROAM_SCAN_MODE_NONE); + return vos_status; +} /* function : wma_process_roam_scan_req * Descriptin : Main routine to handle ROAM commands coming from CSR module. @@ -3032,7 +3260,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle, wmi_ap_profile ap_profile; tpAniSirGlobal pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, wma_handle->vos_context); - A_UINT32 mode; + A_INT8 noise_floor = WMI_DEFAULT_NOISE_FLOOR_DBM; WMA_LOGI("%s: command 0x%x\n", __func__, roam_req->Command); if (!pMac->roam.configParam.isFastRoamIniFeatureEnabled) { @@ -3041,60 +3269,61 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle, } switch (roam_req->Command) { case ROAM_SCAN_OFFLOAD_START: - case ROAM_SCAN_OFFLOAD_STOP: - /* first program the parameters */ /* * Scan/Roam threshold parameters are translated from fields of tSirRoamOffloadScanReq * to WMITLV values sent to Rome firmware. - * roam_scan_rssi_thresh = tSirRoamOffloadScanReq->LookupThreshold - * roam_rssi_thresh_diff = 50 - roam_scan_rssi_thresh (so that opportunistic low - * priority scan will trigger at rssi < 50 db) - * roam_scan_period = tSirRoamOffloadScanReq->neighborResultsRefreshPeriod, - * default is 20000 (20 seconds) - * roam_scan_age = 3 * roam_scan_period - * roam_scan_rssi_change_thresh = 7 (trigger another roam scan only if rssi changes - * more than this value). - * bcn_rssi_weight = 14 (default used for hw generated beacon rssi interrupt) + * some of these parameters are configurable in qcom_cfg.ini file. */ - /* - * Current values for roaming parameters are hardcoded for initial testing. - * They will be changed to values coming from tSirRoamOffloadScanReq after testing - * and tuning. + /* First parameter is positive rssi value to trigger rssi based scan. + * Opportunistic scan is started at 30 dB higher that trigger rssi. */ - if(wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req->sessionId, 30, 30) - != VOS_STATUS_SUCCESS) { + vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req->sessionId, + (roam_req->LookupThreshold - noise_floor), + 30); + if (vos_status != VOS_STATUS_SUCCESS) { break; } - if (wma_roam_scan_offload_scan_period(wma_handle, roam_req->sessionId, - 100000, 500000) != VOS_STATUS_SUCCESS) { + /* Opportunistic scan runs on a timer, value set by NeighborRoamScanRefreshPeriod. + * Age out the entries after 3 such cycles. + */ + vos_status = wma_roam_scan_offload_scan_period(wma_handle, roam_req->sessionId, + roam_req->NeighborRoamScanRefreshPeriod, + roam_req->NeighborRoamScanRefreshPeriod * 3); + if (vos_status != VOS_STATUS_SUCCESS) { break; } - if (wma_roam_scan_offload_rssi_change(wma_handle, roam_req->sessionId, - 15, 14) != VOS_STATUS_SUCCESS) { + /* Start new rssi triggered scan only if it changes by RoamRssiDiff value. + * Beacon weight of 14 means average rssi is taken over 14 previous samples + + * 2 times the current beacon's rssi. + */ + vos_status = wma_roam_scan_offload_rssi_change(wma_handle, roam_req->sessionId, + roam_req->RoamRssiDiff, 14); + if (vos_status != VOS_STATUS_SUCCESS) { break; } wma_roam_scan_fill_ap_profile(wma_handle, pMac, roam_req->sessionId, &ap_profile); - if (wma_roam_scan_offload_ap_profile(wma_handle, roam_req->sessionId, - &ap_profile) != VOS_STATUS_SUCCESS) { + vos_status = wma_roam_scan_offload_ap_profile(wma_handle, roam_req->sessionId, + &ap_profile); + if (vos_status != VOS_STATUS_SUCCESS) { break; } - if (wma_roam_scan_offload_chan_list(wma_handle, roam_req->sessionId, + vos_status = wma_roam_scan_offload_chan_list(wma_handle, roam_req->sessionId, roam_req->ValidChannelCount, - &roam_req->ValidChannelList[0]) != VOS_STATUS_SUCCESS) { + &roam_req->ValidChannelList[0]); + if (vos_status != VOS_STATUS_SUCCESS) { break; } wma_roam_scan_fill_scan_params(wma_handle, pMac, roam_req, &scan_params); - if (roam_req->Command == ROAM_SCAN_OFFLOAD_START) { - mode = (WMI_ROAM_SCAN_MODE_PERIODIC | WMI_ROAM_SCAN_MODE_RSSI_CHANGE); - } else { - mode = WMI_ROAM_SCAN_MODE_NONE; /* STOP */ - } vos_status = wma_roam_scan_offload_mode(wma_handle, roam_req->sessionId, &scan_params, - mode); + (WMI_ROAM_SCAN_MODE_PERIODIC | WMI_ROAM_SCAN_MODE_RSSI_CHANGE)); + break; + + case ROAM_SCAN_OFFLOAD_STOP: + wma_roam_scan_offload_end_connect(wma_handle, roam_req->sessionId); break; case ROAM_SCAN_OFFLOAD_RESTART: @@ -3105,15 +3334,20 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle, /* * Runtime (after association) changes to rssi thresholds and other parameters. */ - if (wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req->sessionId, 30, 30) - != VOS_STATUS_SUCCESS) { + vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle, roam_req->sessionId, + (roam_req->LookupThreshold - noise_floor), + 30); + if (vos_status != VOS_STATUS_SUCCESS) { break; } - if (wma_roam_scan_offload_scan_period(wma_handle, roam_req->sessionId, - 20000, 120000) != VOS_STATUS_SUCCESS) { + vos_status = wma_roam_scan_offload_scan_period(wma_handle, roam_req->sessionId, + roam_req->NeighborRoamScanRefreshPeriod, + roam_req->NeighborRoamScanRefreshPeriod * 3); + if (vos_status != VOS_STATUS_SUCCESS) { break; } - wma_roam_scan_offload_rssi_change(wma_handle, roam_req->sessionId, 15, 14); + vos_status = wma_roam_scan_offload_rssi_change(wma_handle, roam_req->sessionId, + roam_req->RoamRssiDiff, 14); break; default: @@ -3272,7 +3506,7 @@ static VOS_STATUS wma_vdev_start(tp_wma_handle wma, cmd->beacon_interval = req->beacon_intval; cmd->dtim_period = req->dtim_period; /* FIXME: Find out min, max and regulatory power levels */ - WMI_SET_CHANNEL_MIN_POWER(chan, req->max_txpow); + WMI_SET_CHANNEL_REG_POWER(chan, req->max_txpow); /* TODO: Handle regulatory class, max antenna */ @@ -3321,6 +3555,9 @@ void wma_vdev_resp_timer(void *data) ol_txrx_peer_handle peer; ol_txrx_pdev_handle pdev; u_int8_t peer_id; +#ifdef QCA_IBSS_SUPPORT + tDelStaSelfParams del_sta_param; +#endif wma = (tp_wma_handle) vos_get_context(VOS_MODULE_ID_WDA, vos_context); pdev = vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); @@ -3337,6 +3574,14 @@ void wma_vdev_resp_timer(void *data) (tpDeleteBssParams)tgt_req->user_data; peer = ol_txrx_find_peer_by_addr(pdev, params->bssid, &peer_id); wma_remove_peer(wma, params->bssid, tgt_req->vdev_id, peer); +#ifdef QCA_IBSS_SUPPORT + if (wma_is_vdev_in_ibss_mode(wma, params->sessionId)) { + del_sta_param.sessionId = params->sessionId; + vos_mem_copy((void *)del_sta_param.selfMacAddr, + (void *)params->bssid, VOS_MAC_ADDR_SIZE); + wma_vdev_detach(wma, &del_sta_param, 0); + } +#endif params->status = VOS_STATUS_E_TIMEOUT; wma_send_msg(wma, WDA_DELETE_BSS_RSP, (void *)params, 0); } @@ -3604,7 +3849,15 @@ static int32_t wmi_unified_send_peer_assoc(tp_wma_handle wma, WMITLV_TAG_STRUC_wmi_peer_assoc_complete_cmd_fixed_param, WMITLV_GET_STRUCT_TLVLEN( wmi_peer_assoc_complete_cmd_fixed_param)); - if (wma_is_vdev_in_ap_mode(wma, params->smesessionId)) + + /* in ap/ibss mode, use mac address of the peer in the other end as the + new peer address; in sta mode, use bss id to be the new peer address + */ + if ((wma_is_vdev_in_ap_mode(wma, params->smesessionId)) +#ifdef QCA_IBSS_SUPPORT + || (wma_is_vdev_in_ibss_mode(wma, params->smesessionId)) +#endif + ) WMI_CHAR_ARRAY_TO_MAC_ADDR(params->staMac, &cmd->peer_macaddr); else WMI_CHAR_ARRAY_TO_MAC_ADDR(params->bssId, &cmd->peer_macaddr); @@ -3884,6 +4137,36 @@ static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle, return ret; } +static int wmi_crash_inject(wmi_unified_t wmi_handle) +{ + int ret = 0; + WMI_FORCE_FW_HANG_CMD_fixed_param *cmd; + u_int16_t len = sizeof(*cmd); + wmi_buf_t buf; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMA_LOGE("%s: wmi_buf_alloc failed!", __func__); + return -ENOMEM; + } + + cmd = (WMI_FORCE_FW_HANG_CMD_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_WMI_FORCE_FW_HANG_CMD_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(WMI_FORCE_FW_HANG_CMD_fixed_param)); + cmd->type = 1; + cmd->delay_time_ms = 0; + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, WMI_FORCE_FW_HANG_CMDID); + if (ret < 0) { + WMA_LOGE("%s: Failed to send set param command, ret = %d", + __func__, ret); + wmi_buf_free(buf); + } + + return ret; +} + static void wma_process_cli_set_cmd(tp_wma_handle wma, wda_cli_set_cmd_t *privcmd) { @@ -3967,6 +4250,9 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, case GEN_PARAM_DUMP_WATCHDOG: HTCDump(wma->htc_handle, WD_DUMP, false); break; + case GEN_PARAM_CRASH_INJECT: + ret = wmi_crash_inject(wma->wmi_handle); + break; default: WMA_LOGE("Invalid param id 0x%x", privcmd->param_id); break; @@ -4089,6 +4375,9 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, case WMI_PDEV_PARAM_RX_CHAIN_MASK: wma->pdevconfig.rxchainmask = privcmd->param_value; break; + case WMI_PDEV_PARAM_POWER_GATING_SLEEP: + wma->pdevconfig.pwrgating = privcmd->param_value; + break; case WMI_PDEV_PARAM_TXPOWER_LIMIT2G: wma->pdevconfig.txpow2g = privcmd->param_value; if ((pMac->roam.configParam.bandCapability == @@ -4203,6 +4492,9 @@ int wma_cli_get_command(void *wmapvosContext, int vdev_id, case WMI_PDEV_PARAM_TXPOWER_LIMIT5G: ret = wma->pdevconfig.txpow5g; break; + case WMI_PDEV_PARAM_POWER_GATING_SLEEP: + ret = wma->pdevconfig.pwrgating; + break; default: WMA_LOGE("Invalid cli_get pdev command/Not" " yet implemented 0x%x", param_id); @@ -4357,7 +4649,8 @@ wma_update_cfg_params(tp_wma_handle wma, tSirMsgQ *cfgParam) static void wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id, tSirMacBeaconInterval beaconInterval, tANI_U8 dtimPeriod, - tANI_U8 shortSlotTimeSupported, tANI_U8 llbCoexist) + tANI_U8 shortSlotTimeSupported, tANI_U8 llbCoexist, + tPowerdBm maxTxPower) { int ret; uint32_t slot_time; @@ -4376,6 +4669,17 @@ wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id, if (ret) WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD\n"); + if (!maxTxPower) + { + WMA_LOGE("Setting Tx power limit to 0\n"); + } + + ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_TX_PWRLIMIT, + maxTxPower); + if (ret) + WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT\n"); + /* Slot time */ if (shortSlotTimeSupported) slot_time = WMI_VDEV_SLOT_TIME_SHORT; @@ -4436,7 +4740,7 @@ static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss) req.chan = add_bss->currentOperChannel; req.chan_offset = add_bss->currentExtChannel; req.vht_capable = add_bss->vhtCapable; -#if defined WLAN_FEATURE_VOWIF +#if defined WLAN_FEATURE_VOWIFI req.max_txpow = add_bss->maxTxPower; #else req.max_txpow = 0; @@ -4474,6 +4778,141 @@ send_fail_resp: wma_send_msg(wma, WDA_ADD_BSS_RSP, (void *)add_bss, 0); } +#ifdef QCA_IBSS_SUPPORT +static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss) +{ + ol_txrx_pdev_handle pdev; + ol_txrx_vdev_handle vdev; + struct wma_vdev_start_req req; + ol_txrx_peer_handle peer; + struct wma_target_req *msg; + u_int8_t vdev_id, peer_id; + VOS_STATUS status; + tDelStaSelfParams del_sta_param; + tAddStaSelfParams add_sta_self_param; + + WMA_LOGD("%s: add_bss->sessionId = %d\n", __func__, add_bss->sessionId); + vdev_id = add_bss->sessionId; + pdev = vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); + vdev = wma_find_vdev_by_id(wma, vdev_id); + if (vdev) { + WMA_LOGD("%s: vdev found for vdev id %d. deleting the vdev\n", + __func__, vdev_id); + + TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { + WMA_LOGE("%s: peer found for vdev id %d. deleting the peer\n", + __func__, vdev_id); + wma_remove_peer(wma, (u_int8_t *)&vdev->mac_addr, + vdev_id, peer); + ol_txrx_peer_detach(peer); + } + + vos_copy_macaddr((v_MACADDR_t *)&(del_sta_param.selfMacAddr), + (v_MACADDR_t *)&(vdev->mac_addr)); + del_sta_param.sessionId = vdev_id; + del_sta_param.status = 0; + + wma_vdev_detach(wma, &del_sta_param, 0); + + } + else { + WMA_LOGD("%s: vdev with session id %d not found \n", __func__, vdev_id); + } + + /* create new vdev for ibss */ + vos_copy_macaddr((v_MACADDR_t *)&(add_sta_self_param.selfMacAddr), + (v_MACADDR_t *)&(add_bss->bssId)); + add_sta_self_param.sessionId = vdev_id; + add_sta_self_param.type = WMI_VDEV_TYPE_IBSS; + add_sta_self_param.subType = 0; + add_sta_self_param.status = 0; + + vdev = wma_vdev_attach(wma, &add_sta_self_param, 0); + if (!vdev) { + WMA_LOGE("%s: Failed to create vdev\n", __func__); + goto send_fail_resp; + } + WLANTL_RegisterVdev(wma->vos_context, vdev); + /* Register with TxRx Module for Data Ack Complete Cb */ + wdi_in_data_tx_cb_set(vdev, wma_data_tx_ack_comp_hdlr, wma); + WMA_LOGE("%s: new vdev created for IBSS\n", __func__); + + /* create self peer */ + status = wma_create_peer(wma, pdev, vdev, add_bss->bssId, vdev_id); + if (status != VOS_STATUS_SUCCESS) { + WMA_LOGE("%s: Failed to create peer\n", __func__); + goto send_fail_resp; + } + + peer = ol_txrx_find_peer_by_addr(pdev, add_bss->bssId, &peer_id); + if (!peer) { + WMA_LOGE("%s Failed to find peer %pM\n", __func__, + add_bss->bssId); + goto send_fail_resp; + } + + /* set operation mode to be IBSS */ + add_bss->operMode = BSS_OPERATIONAL_MODE_IBSS; + + msg = wma_fill_vdev_req(wma, vdev_id, WDA_ADD_BSS_REQ, + WMA_TARGET_REQ_TYPE_VDEV_START, add_bss); + if (!msg) { + WMA_LOGP("%s Failed to allocate vdev request vdev_id %d\n", + __func__, vdev_id); + goto peer_cleanup; + } + WMA_LOGD("%s: vdev start request for IBSS enqueued\n", __func__); + + add_bss->staContext.staIdx = ol_txrx_local_peer_id(peer); + + vos_mem_zero(&req, sizeof(req)); + req.vdev_id = vdev_id; + req.chan = add_bss->currentOperChannel; /* FIXME: verify param value */ + req.chan_offset = add_bss->currentExtChannel; /* FIXME: verify param value */ + req.vht_capable = add_bss->vhtCapable; +#if defined WLAN_FEATURE_VOWIF + req.max_txpow = add_bss->maxTxPower; +#else + req.max_txpow = 0; +#endif + req.beacon_intval = add_bss->beaconInterval; + req.dtim_period = add_bss->dtimPeriod; + req.hidden_ssid = add_bss->bHiddenSSIDEn; + req.is_dfs = add_bss->bSpectrumMgtEnabled; + req.oper_mode = BSS_OPERATIONAL_MODE_IBSS; + req.ssid.length = add_bss->ssId.length; + if (req.ssid.length > 0) + vos_mem_copy(req.ssid.ssId, add_bss->ssId.ssId, + add_bss->ssId.length); + + WMA_LOGD("%s: chan %d chan_offset %d\n", __func__, req.chan, req.chan_offset); + WMA_LOGD("%s: ssid = %s\n", __func__, req.ssid.ssId); + + status = wma_vdev_start(wma, &req); + if (status != VOS_STATUS_SUCCESS) { + wma_remove_vdev_req(wma, vdev_id, + WMA_TARGET_REQ_TYPE_VDEV_START); + goto peer_cleanup; + } + WMA_LOGD("%s: vdev start request for IBSS sent to target\n", __func__); + + /* Initialize protection mode to no protection */ + if (wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_PROTECTION_MODE, + IEEE80211_PROT_NONE)) { + WMA_LOGE("Failed to initialize protection mode"); + } + + return; + +peer_cleanup: + wma_remove_peer(wma, add_bss->bssId, vdev_id, peer); +send_fail_resp: + add_bss->status = VOS_STATUS_E_FAILURE; + wma_send_msg(wma, WDA_ADD_BSS_RSP, (void *)add_bss, 0); +} +#endif + static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) { ol_txrx_pdev_handle pdev; @@ -4483,11 +4922,17 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) ol_txrx_peer_handle peer; VOS_STATUS status; struct wma_txrx_node *iface; + tPowerdBm maxTxPower = 0; pdev = vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); vdev_id = add_bss->staContext.smesessionId; iface = &wma->interfaces[vdev_id]; if (add_bss->operMode) { + // Save parameters later needed by WDA_ADD_STA_REQ + iface->beaconInterval = add_bss->beaconInterval; + iface->dtimPeriod = add_bss->dtimPeriod; + iface->llbCoexist = add_bss->llbCoexist; + iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported; if (add_bss->reassocReq) { // Called in preassoc state. BSSID peer is already added by set_linkstate peer = ol_txrx_find_peer_by_addr(pdev, add_bss->bssId, &peer_id); @@ -4510,10 +4955,12 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) req.vdev_id = vdev_id; req.chan = add_bss->currentOperChannel; req.chan_offset = add_bss->currentExtChannel; -#if defined WLAN_FEATURE_VOWIF +#if defined WLAN_FEATURE_VOWIFI req.max_txpow = add_bss->maxTxPower; + maxTxPower = add_bss->maxTxPower; #else req.max_txpow = 0; + maxTxPower = 0; #endif req.beacon_intval = add_bss->beaconInterval; req.dtim_period = add_bss->dtimPeriod; @@ -4531,11 +4978,6 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) WMA_TARGET_REQ_TYPE_VDEV_START); goto peer_cleanup; } - // Save parameters later needed by WDA_ADD_STA_REQ - iface->beaconInterval = add_bss->beaconInterval; - iface->dtimPeriod = add_bss->dtimPeriod; - iface->llbCoexist = add_bss->llbCoexist; - iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported; // ADD_BSS_RESP will be deferred to completion of VDEV_START return; @@ -4569,7 +5011,8 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) add_bss->staContext.smesessionId); wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId, add_bss->beaconInterval, add_bss->dtimPeriod, - add_bss->shortSlotTimeSupported, add_bss->llbCoexist); + add_bss->shortSlotTimeSupported, add_bss->llbCoexist, + maxTxPower); } /* * Store the bssid in interface table, bssid will @@ -4602,11 +5045,26 @@ send_fail_resp: static void wma_add_bss(tp_wma_handle wma, tpAddBssParams params) { - if ((params->halPersona == VOS_STA_SAP_MODE) || - (params->halPersona == VOS_P2P_GO_MODE)) + WMA_LOGD("%s: add_bss_param.halPersona = %d\n", + __func__, params->halPersona); + + switch(params->halPersona) { + + case VOS_STA_SAP_MODE: + case VOS_P2P_GO_MODE: wma_add_bss_ap_mode(wma, params); - else + break; + +#ifdef QCA_IBSS_SUPPORT + case VOS_IBSS_MODE: + wma_add_bss_ibss_mode(wma, params); + break; +#endif + + default: wma_add_bss_sta_mode(wma, params); + break; + } } static int wmi_unified_vdev_up_send(wmi_unified_t wmi, @@ -4841,6 +5299,34 @@ send_rsp: wma_send_msg(wma, WDA_ADD_STA_RSP, (void *)add_sta, 0); } +static int wmi_unified_nat_keepalive_enable(tp_wma_handle wma, + u_int8_t vdev_id) +{ + WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + WMA_LOGD("%s: vdev_id %d", __func__, vdev_id); + buf = wmi_buf_alloc(wma->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s:wmi_buf_alloc failed\n", __func__); + return -ENOMEM; + } + cmd = (WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMD_fixed_param)); + cmd->vdev_id = vdev_id; + cmd->action = IPSEC_NATKEEPALIVE_FILTER_ENABLE; + if (wmi_unified_cmd_send(wma->wmi_handle, buf, len, + WMI_VDEV_IPSEC_NATKEEPALIVE_FILTER_CMDID)) { + WMA_LOGP("Failed to send NAT keepalive enable command"); + wmi_buf_free(buf); + return -EIO; + } + return 0; +} + static int wmi_unified_csa_offload_enable(tp_wma_handle wma, u_int8_t vdev_id) { @@ -4875,6 +5361,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) VOS_STATUS status = VOS_STATUS_SUCCESS; ol_txrx_peer_handle peer; struct wma_txrx_node *iface; + tPowerdBm maxTxPower; pdev = vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); iface = &wma->interfaces[params->smesessionId]; @@ -4915,9 +5402,14 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) wmi_unified_send_peer_assoc(wma, params->nwType, params); } +#if defined WLAN_FEATURE_VOWIFI + maxTxPower = params->maxTxPower; +#else + maxTxPower = 0; +#endif wma_vdev_set_bss_params(wma, params->smesessionId, iface->beaconInterval, - iface->dtimPeriod, iface->shortSlotTimeSupported, iface->llbCoexist); - + iface->dtimPeriod, iface->shortSlotTimeSupported, + iface->llbCoexist, maxTxPower); wma_roam_scan_offload_init_connect(wma, params->smesessionId); params->csaOffloadEnable = 0; @@ -4930,6 +5422,14 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) } } + if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap, + WMI_SERVICE_FILTER_IPSEC_NATKEEPALIVE)) { + if (wmi_unified_nat_keepalive_enable(wma, params->smesessionId) < 0) { + WMA_LOGE("Unable to enable NAT keepalive for vdev_id:%d", + params->smesessionId); + } + } + if (wmi_unified_vdev_up_send(wma->wmi_handle, params->smesessionId, params->assocId, params->bssId) < 0) { WMA_LOGP("Failed to send vdev up cmd: vdev %d bssid %pM\n", @@ -4949,14 +5449,26 @@ static void wma_add_sta(tp_wma_handle wma, tpAddStaParams add_sta) { tANI_U8 oper_mode = BSS_OPERATIONAL_MODE_STA; + WMA_LOGD("%s: add_sta->sessionId = %d.\n", __func__, add_sta->smesessionId); + WMA_LOGD("%s: add_sta->bssId = %x:%x:%x:%x:%x:%x\n", __func__, + add_sta->bssId[0], add_sta->bssId[1], add_sta->bssId[2], + add_sta->bssId[3], add_sta->bssId[4], add_sta->bssId[5]); + if (wma_is_vdev_in_ap_mode(wma, add_sta->smesessionId)) oper_mode = BSS_OPERATIONAL_MODE_AP; +#ifdef QCA_IBSS_SUPPORT + else if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId)) + oper_mode = BSS_OPERATIONAL_MODE_IBSS; +#endif switch (oper_mode) { case BSS_OPERATIONAL_MODE_STA: wma_add_sta_req_sta_mode(wma, add_sta); break; +#ifdef QCA_IBSS_SUPPORT + case BSS_OPERATIONAL_MODE_IBSS: /* IBSS should share the same code as AP mode */ +#endif case BSS_OPERATIONAL_MODE_AP: wma_add_sta_req_ap_mode(wma, add_sta); break; @@ -5367,7 +5879,7 @@ static void wma_delete_sta_req_sta_mode(tp_wma_handle wma, { VOS_STATUS status = VOS_STATUS_SUCCESS; - wma_roam_scan_offload_init_connect(wma, params->smesessionId); + wma_roam_scan_offload_end_connect(wma, params->smesessionId); if (wmi_unified_vdev_down_send(wma->wmi_handle, params->smesessionId) < 0) { WMA_LOGP("%s: failed to bring down vdev %d\n", __func__, params->smesessionId); @@ -5384,12 +5896,21 @@ static void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta) if (wma_is_vdev_in_ap_mode(wma, del_sta->smesessionId)) oper_mode = BSS_OPERATIONAL_MODE_AP; +#ifdef QCA_IBSS_SUPPORT + if (wma_is_vdev_in_ibss_mode(wma, del_sta->smesessionId)) { + oper_mode = BSS_OPERATIONAL_MODE_IBSS; + WMA_LOGD("%s: to delete sta for IBSS mode\n", __func__); + } +#endif switch (oper_mode) { case BSS_OPERATIONAL_MODE_STA: wma_delete_sta_req_sta_mode(wma, del_sta); break; +#ifdef QCA_IBSS_SUPPORT + case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */ +#endif case BSS_OPERATIONAL_MODE_AP: wma_delete_sta_req_ap_mode(wma, del_sta); break; @@ -5636,36 +6157,104 @@ fail: return VOS_STATUS_E_FAILURE; } -static void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) +static int wmi_unified_bcn_tmpl_send(tp_wma_handle wma, + u_int8_t vdev_id, + tpSendbeaconParams bcn_info) +{ + wmi_bcn_tmpl_cmd_fixed_param *cmd; + wmi_bcn_prb_info *bcn_prb_info; + wmi_buf_t wmi_buf; + u_int32_t tmpl_len, tmpl_len_aligned, wmi_buf_len; + u_int8_t *frm, *buf_ptr; + u_int8_t bytes_to_strip; + int ret; + u_int8_t *p2p_ie; + u_int16_t p2p_ie_len = 0; + + + WMA_LOGD("Send beacon template for vdev %d", vdev_id); + + if (bcn_info->p2pIeOffset) { + p2p_ie = bcn_info->beacon + bcn_info->p2pIeOffset; + p2p_ie_len = (u_int16_t) p2p_ie[1] + 2; + } + + tmpl_len = *(u_int32_t *)&bcn_info->beacon[0]; + if (p2p_ie_len) { + tmpl_len -= (u_int32_t) p2p_ie_len; + } + + bytes_to_strip = sizeof (tANI_U32); /* Exclude beacon length field */ + + frm = bcn_info->beacon + bytes_to_strip; + tmpl_len_aligned = roundup(tmpl_len, sizeof(A_UINT32)); + + wmi_buf_len = sizeof(wmi_bcn_tmpl_cmd_fixed_param) + + sizeof(wmi_bcn_prb_info) + WMI_TLV_HDR_SIZE + + tmpl_len_aligned; + + wmi_buf = wmi_buf_alloc(wma->wmi_handle, wmi_buf_len); + if (!wmi_buf) { + WMA_LOGE("%s : wmi_buf_alloc failed", __func__); + return -ENOMEM; + } + + buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf); + + cmd = (wmi_bcn_tmpl_cmd_fixed_param *)buf_ptr; + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_bcn_tmpl_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_bcn_tmpl_cmd_fixed_param)); + cmd->vdev_id = vdev_id; + cmd->tim_ie_offset = bcn_info->timIeOffset - bytes_to_strip; + cmd->buf_len = tmpl_len; + buf_ptr += sizeof(wmi_bcn_tmpl_cmd_fixed_param); + + bcn_prb_info = (wmi_bcn_prb_info *)buf_ptr; + WMITLV_SET_HDR(&bcn_prb_info->tlv_header, + WMITLV_TAG_STRUC_wmi_bcn_prb_info, + WMITLV_GET_STRUCT_TLVLEN(wmi_bcn_prb_info)); + bcn_prb_info->caps = 0; + bcn_prb_info->erp = 0; + buf_ptr += sizeof(wmi_bcn_prb_info); + + WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, tmpl_len_aligned); + buf_ptr += WMI_TLV_HDR_SIZE; + vos_mem_copy(buf_ptr, frm, tmpl_len); + + ret = wmi_unified_cmd_send(wma->wmi_handle, + wmi_buf, wmi_buf_len, + WMI_BCN_TMPL_CMDID); + if (ret) { + WMA_LOGE("Failed to send bcn tmpl: %d", ret); + wmi_buf_free(wmi_buf); + } + + return ret; +} + +VOS_STATUS wma_store_bcn_tmpl(tp_wma_handle wma, u_int8_t vdev_id, + tpSendbeaconParams bcn_info) { - ol_txrx_vdev_handle vdev; - u_int8_t vdev_id; -#ifndef QCA_WIFI_ISOC struct beacon_info *bcn; u_int32_t len; u_int8_t *bcn_payload; struct beacon_tim_ie *tim_ie; -#endif - vdev = wma_find_vdev_by_addr(wma, bcn_info->bssId, &vdev_id); - if (!vdev) { - WMA_LOGE("%s : failed to get vdev handle\n", __func__); - return; - } -#ifndef QCA_WIFI_ISOC + bcn = wma->interfaces[vdev_id].beacon; if (!bcn || !bcn->buf) { - WMA_LOGE("%s: Memory is not allocated to hold bcn template\n", + WMA_LOGE("%s: Memory is not allocated to hold bcn template", __func__); - return; + return VOS_STATUS_E_INVAL; } len = *(u32 *)&bcn_info->beacon[0]; if (len > WMA_BCN_BUF_MAX_SIZE) { - WMA_LOGE("%s: Received beacon len %d exceeding max limit %d\n", + WMA_LOGE("%s: Received beacon len %d exceeding max limit %d", __func__, len, WMA_BCN_BUF_MAX_SIZE); - return; + return VOS_STATUS_E_INVAL; } - WMA_LOGD("%s: Storing received beacon template buf to local buffer\n", + WMA_LOGD("%s: Storing received beacon template buf to local buffer", __func__); adf_os_spin_lock_bh(&bcn->lock); @@ -5691,20 +6280,123 @@ static void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) tim_ie->tim_bitctl = 0; adf_nbuf_put_tail(bcn->buf, len); + bcn->len = len; adf_os_spin_unlock_bh(&bcn->lock); - if (!bcn->len) { + + return VOS_STATUS_SUCCESS; +} + +static int wma_p2p_go_set_beacon_ie(t_wma_handle *wma_handle, + A_UINT32 vdev_id, u_int8_t *p2pIe) +{ + int ret; + wmi_p2p_go_set_beacon_ie_fixed_param *cmd; + wmi_buf_t wmi_buf; + u_int32_t ie_len, ie_len_aligned, wmi_buf_len; + u_int8_t *buf_ptr; + + ie_len = (u_int32_t) (p2pIe[1] + 2); + + ie_len_aligned = roundup(ie_len, sizeof(A_UINT32)); + + wmi_buf_len = sizeof(wmi_p2p_go_set_beacon_ie_fixed_param) + ie_len_aligned + WMI_TLV_HDR_SIZE; + + wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, wmi_buf_len); + if (!wmi_buf) { + WMA_LOGE("%s : wmi_buf_alloc failed", __func__); + return -ENOMEM; + } + + buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf); + + cmd = (wmi_p2p_go_set_beacon_ie_fixed_param *)buf_ptr; + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_p2p_go_set_beacon_ie_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_p2p_go_set_beacon_ie_fixed_param)); + cmd->vdev_id = vdev_id; + cmd->ie_buf_len = ie_len; + + buf_ptr += sizeof(wmi_p2p_go_set_beacon_ie_fixed_param); + WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, ie_len_aligned); + buf_ptr += WMI_TLV_HDR_SIZE; + vos_mem_copy(buf_ptr, p2pIe, ie_len); + + WMA_LOGI("\n%s: Sending WMI_P2P_GO_SET_BEACON_IE", __func__); + + ret = wmi_unified_cmd_send(wma_handle->wmi_handle, + wmi_buf, wmi_buf_len, + WMI_P2P_GO_SET_BEACON_IE + ); + if (ret) { + WMA_LOGE("Failed to send bcn tmpl: %d", ret); + wmi_buf_free(wmi_buf); + } + + WMA_LOGI("\n%s: Successfully sent WMI_P2P_GO_SET_BEACON_IE", __func__); + return ret; +} + +static void wma_send_beacon(tp_wma_handle wma, tpSendbeaconParams bcn_info) +{ + ol_txrx_vdev_handle vdev; + u_int8_t vdev_id; +#ifndef QCA_WIFI_ISOC + VOS_STATUS status; #endif - if (wmi_unified_vdev_up_send(wma->wmi_handle, vdev_id, 0, - bcn_info->bssId) < 0) - WMA_LOGE("%s : failed to send vdev up\n", __func__); + u_int8_t *p2p_ie; + vdev = wma_find_vdev_by_addr(wma, bcn_info->bssId, &vdev_id); + if (!vdev) { + WMA_LOGE("%s : failed to get vdev handle\n", __func__); + return; + } + #ifndef QCA_WIFI_ISOC + if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap, + WMI_SERVICE_BEACON_OFFLOAD)) { + WMA_LOGE("%s : Beacon Offload Enabled Sending Unified command", __func__); + + if (wmi_unified_bcn_tmpl_send(wma, vdev_id, bcn_info) < 0){ + WMA_LOGE("%s : wmi_unified_bcn_tmpl_send Failed ", __func__); + return; + } + + if (bcn_info->p2pIeOffset) { + p2p_ie = bcn_info->beacon + bcn_info->p2pIeOffset; + WMA_LOGI("\n %s: p2pIe is present - vdev_id %hu, p2p_ie = %p, p2p ie len = %hu", + __func__, vdev_id, p2p_ie, p2p_ie[1]); + if (wma_p2p_go_set_beacon_ie(wma, vdev_id, p2p_ie) < 0) { + WMA_LOGE("%s : wmi_unified_bcn_tmpl_send Failed ", __func__); + return; + } + } + } else { + status = wma_store_bcn_tmpl(wma, vdev_id, bcn_info); + if (status != VOS_STATUS_SUCCESS) + return; } - bcn->len = len; #endif + if (!wma->interfaces[vdev_id].vdev_up) { + if (wmi_unified_vdev_up_send(wma->wmi_handle, vdev_id, 0, + bcn_info->bssId) < 0) { + WMA_LOGE("%s : failed to send vdev up", __func__); + return; + } + wma->interfaces[vdev_id].vdev_up = TRUE; + } + wma_set_sap_keepalive(wma, vdev_id); } +#ifdef QCA_IBSS_SUPPORT +static void wma_send_beacon_tmpl(WMA_HANDLE handle, + u_int8_t vdev_id) +{ + /*TODO: implement after beacon template is created by PE and send + to target upon received WMI_SEND_BEACON command */ +} +#endif + #if !defined(REMOVE_PKT_LOG) && !defined(QCA_WIFI_ISOC) static VOS_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle, struct ath_pktlog_wmi_params *params) @@ -5893,6 +6585,18 @@ static int32_t wma_set_force_sleep(tp_wma_handle wma, u_int32_t vdev_id, u_int8_ inactivity_time = (u_int32_t)cfg_data_val; } + /* + * QPower is enabled by default in Firmware + * So Disable QPower explicitly + */ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_ENABLE_QPOWER, 0); + if (ret) { + WMA_LOGE("Disable QPower Failed vdevId", vdev_id); + return ret; + } + WMA_LOGD("QPower Disabled vdevId %d", vdev_id); + /* Set the Wake Policy to WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD*/ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, WMI_STA_PS_PARAM_RX_WAKE_POLICY, @@ -5972,14 +6676,132 @@ static int32_t wma_set_force_sleep(tp_wma_handle wma, u_int32_t vdev_id, u_int8_ return 0; } +static int32_t wma_set_qpower_force_sleep(tp_wma_handle wma, u_int32_t vdev_id, u_int8_t enable) +{ + int32_t ret; + tANI_U32 cfg_data_val = 0; + /* get mac to acess CFG data base */ + struct sAniSirGlobal *mac = + (struct sAniSirGlobal*)vos_get_context(VOS_MODULE_ID_PE, + wma->vos_context); + u_int32_t tx_wake_threshold = WMA_DEFAULT_QPOWER_TX_WAKE_THRESHOLD; + u_int32_t pspoll_count = WMA_DEFAULT_QPOWER_MAX_PSPOLL_BEFORE_WAKE; + + WMA_LOGE("Set QPower Force(1)/Normal(0) Sleep vdevId %d val %d", + vdev_id, enable); + + /* Get Configured Ps Poll Count */ + if (wlan_cfgGetInt(mac, WNI_CFG_MAX_PS_POLL, + &cfg_data_val ) != eSIR_SUCCESS) { + VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, + "Failed to get value for WNI_CFG_MAX_PS_POLL"); + } + if (cfg_data_val) { + pspoll_count = (u_int32_t)cfg_data_val; + } + + if (enable) { + /* override normal configuration and force station asleep */ + tx_wake_threshold = WMI_STA_PS_TX_WAKE_THRESHOLD_NEVER; + } + + /* Enable QPower */ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_ENABLE_QPOWER, 1); + + if (ret) { + WMA_LOGE("Enable QPower Failed vdevId", vdev_id); + return ret; + } + WMA_LOGD("QPower Enabled vdevId %d", vdev_id); + + /* Set the Wake Policy to WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD*/ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_PARAM_RX_WAKE_POLICY, + WMI_STA_PS_RX_WAKE_POLICY_POLL_UAPSD); + + if (ret) { + WMA_LOGE("Setting wake policy to pspoll/uapsd Failed vdevId %d", vdev_id); + return ret; + } + WMA_LOGD("Wake policy set to to pspoll/uapsd vdevId %d", + vdev_id); + + /* Set the Tx Wake Threshold */ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_PARAM_TX_WAKE_THRESHOLD, + tx_wake_threshold); + + if (ret) { + WMA_LOGE("Setting TxWake Threshold vdevId %d", vdev_id); + return ret; + } + WMA_LOGD("TxWake Threshold set to %d vdevId %d", + tx_wake_threshold, vdev_id); + + /* Set the QPower Ps Poll Count */ + ret = wmi_unified_set_sta_ps_param(wma->wmi_handle, vdev_id, + WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT, + pspoll_count); + + if (ret) { + WMA_LOGE("Set QPower Ps Poll Count Failed vdevId %d ps poll cnt %d", + vdev_id, pspoll_count); + return ret; + } + WMA_LOGD("Set QPower Ps Poll Count vdevId %d ps poll cnt %d", + vdev_id, pspoll_count); + + /* Enable Sta Mode Power save */ + ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, true); + + if (ret) { + WMA_LOGE("Enable Sta Mode Ps Failed vdevId %d", vdev_id); + return ret; + } + + /* Set Listen Interval */ + if (wlan_cfgGetInt(mac, WNI_CFG_LISTEN_INTERVAL, + &cfg_data_val ) != eSIR_SUCCESS) { + VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, + "Failed to get value for WNI_CFG_LISTEN_INTERVAL"); + cfg_data_val = POWERSAVE_DEFAULT_LISTEN_INTERVAL; + } + + ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id, + WMI_VDEV_PARAM_LISTEN_INTERVAL, + cfg_data_val); + if (ret) { + /* Even it fails continue Fw will take default LI */ + WMA_LOGE("Failed to Set Listen Interval vdevId %d", + vdev_id); + } + WMA_LOGD("Set Listen Interval vdevId %d Listen Intv %d", + vdev_id, cfg_data_val); + return 0; +} + +static u_int8_t wma_is_qpower_enabled(tp_wma_handle wma) +{ + if((wma->powersave_mode == PS_QPOWER_NODEEPSLEEP) || + (wma->powersave_mode == PS_QPOWER_DEEPSLEEP)) { + return true; + } + return false; +} + static void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req) { uint32_t vdev_id = ps_req->sessionid; int32_t ret; + u_int8_t is_qpower_enabled = wma_is_qpower_enabled(wma); if (eSIR_ADDON_NOTHING == ps_req->psSetting) { WMA_LOGD("Enable Sta Mode Ps vdevId %d", vdev_id); - ret = wma_set_force_sleep(wma, vdev_id, false); + if(is_qpower_enabled) + ret = wma_set_qpower_force_sleep(wma, vdev_id, false); + else + ret = wma_set_force_sleep(wma, vdev_id, false); if (ret) { WMA_LOGE("Enable Sta Ps Failed vdevId %d", vdev_id); ps_req->status = VOS_STATUS_E_FAILURE; @@ -5999,7 +6821,11 @@ static void wma_enable_sta_ps_mode(tp_wma_handle wma, tpEnablePsParams ps_req) } WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id); - ret = wma_set_force_sleep(wma, vdev_id, true); + if(is_qpower_enabled) + ret = wma_set_qpower_force_sleep(wma, vdev_id, true); + else + ret = wma_set_force_sleep(wma, vdev_id, true); + if (ret) { WMA_LOGE("Enable Forced Sleep Failed vdevId %d", vdev_id); @@ -6052,6 +6878,7 @@ static void wma_enable_uapsd_mode(tp_wma_handle wma, int32_t ret; u_int32_t vdev_id = ps_req->sessionid; u_int32_t uapsd_val = 0; + u_int8_t is_qpower_enabled = wma_is_qpower_enabled(wma); /* Disable Sta Mode Power save */ ret = wmi_unified_set_sta_ps(wma->wmi_handle, vdev_id, false); @@ -6073,7 +6900,10 @@ static void wma_enable_uapsd_mode(tp_wma_handle wma, } WMA_LOGD("Enable Forced Sleep vdevId %d", vdev_id); - ret = wma_set_force_sleep(wma, vdev_id, true); + if(is_qpower_enabled) + ret = wma_set_qpower_force_sleep(wma, vdev_id, true); + else + ret = wma_set_force_sleep(wma, vdev_id, true); if (ret) { WMA_LOGE("Enable Forced Sleep Failed vdevId %d", vdev_id); ps_req->status = VOS_STATUS_E_FAILURE; @@ -6090,6 +6920,7 @@ static void wma_disable_uapsd_mode(tp_wma_handle wma, { int32_t ret; u_int32_t vdev_id = ps_req->sessionid; + u_int8_t is_qpower_enabled = wma_is_qpower_enabled(wma); WMA_LOGD("Disable Uapsd vdevId %d", vdev_id); @@ -6110,7 +6941,10 @@ static void wma_disable_uapsd_mode(tp_wma_handle wma, } /* Re enable Sta Mode Powersave with proper configuration */ - ret = wma_set_force_sleep(wma, vdev_id, false); + if(is_qpower_enabled) + ret = wma_set_qpower_force_sleep(wma, vdev_id, false); + else + ret = wma_set_force_sleep(wma, vdev_id, false); if (ret) { WMA_LOGE("Disable Forced Sleep Failed vdevId %d", vdev_id); ps_req->status = VOS_STATUS_E_FAILURE; @@ -6503,8 +7337,6 @@ void wma_scan_cache_updated_ind(tp_wma_handle wma) #endif -#define WMA_DUMP_WOW_PTRN - void wma_send_ready_to_suspend_ind(tp_wma_handle wma) { tSirReadyToSuspendInd *ready_to_suspend; @@ -6584,6 +7416,20 @@ static const u8 *wma_wow_wake_reason_str(A_INT32 wake_reason) return "unknown"; } +static void wma_beacon_miss_handler(tp_wma_handle wma, u_int32_t vdev_id) +{ + tSirSmeMissedBeaconInd *beacon_miss_ind; + + beacon_miss_ind = (tSirSmeMissedBeaconInd *) vos_mem_malloc + (sizeof(tSirSmeMissedBeaconInd)); + beacon_miss_ind->messageType = WDA_MISSED_BEACON_IND; + beacon_miss_ind->length = sizeof(tSirSmeMissedBeaconInd); + beacon_miss_ind->bssIdx = vdev_id; + + wma_send_msg(wma, WDA_MISSED_BEACON_IND, + (void *)beacon_miss_ind, 0); +} + /* * Handler to catch wow wakeup host event. This event will have * reason why the firmware has woken the host. @@ -6591,8 +7437,10 @@ static const u8 *wma_wow_wake_reason_str(A_INT32 wake_reason) static int wma_wow_wakeup_host_event(void *handle, u_int8_t *event, u_int32_t len) { + tp_wma_handle wma = (tp_wma_handle) handle; WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *param_buf; WOW_EVENT_INFO_fixed_param *wake_info; + struct wma_txrx_node *node; param_buf = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *) event; if (!param_buf) { @@ -6601,8 +7449,21 @@ static int wma_wow_wakeup_host_event(void *handle, u_int8_t *event, } wake_info = param_buf->fixed_param; - WMA_LOGD("WOW wakeup host event received (reason: %s)", - wma_wow_wake_reason_str(wake_info->wake_reason)); + + WMA_LOGD("WOW wakeup host event received (reason: %s) for vdev %d", + wma_wow_wake_reason_str(wake_info->wake_reason), + wake_info->vdev_id); + + if(wake_info->wake_reason == WOW_REASON_AP_ASSOC_LOST) + wma_beacon_miss_handler(wma, wake_info->vdev_id); + + if (wake_info->wake_reason == WOW_REASON_NLOD) { + node = &wma->interfaces[wake_info->vdev_id]; + if (node) { + WMA_LOGD("NLO match happened"); + node->nlo_match_evt_received = TRUE; + } + } return 0; } @@ -6648,15 +7509,18 @@ static VOS_STATUS wma_add_wow_wakeup_event(tp_wma_handle wma, /* Sends WOW patterns to FW. */ static VOS_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma, - u_int8_t ptrn_id) + u_int8_t vdev_id, u_int8_t ptrn_id, + u_int8_t *ptrn, u_int8_t ptrn_len, + u_int8_t ptrn_offset, u_int8_t *mask, + u_int8_t mask_len) + { WMI_WOW_ADD_PATTERN_CMD_fixed_param *cmd; WOW_BITMAP_PATTERN_T *bitmap_pattern; - struct wma_wow_ptrn_cache *cache; wmi_buf_t buf; - u_int8_t new_mask[SIR_WOWL_BCAST_PATTERN_MAX_SIZE]; - u_int8_t *buf_ptr, pos, bit_to_check; + u_int8_t *buf_ptr; #ifdef WMA_DUMP_WOW_PTRN + u_int8_t pos; u_int8_t *tmp; #endif int32_t len; @@ -6680,7 +7544,6 @@ static VOS_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma, return VOS_STATUS_E_NOMEM; } - cache = wma->wow.cache[ptrn_id]; cmd = (WMI_WOW_ADD_PATTERN_CMD_fixed_param *)wmi_buf_data(buf); buf_ptr = (u_int8_t *)cmd; @@ -6688,7 +7551,7 @@ static VOS_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma, WMITLV_TAG_STRUC_WMI_WOW_ADD_PATTERN_CMD_fixed_param, WMITLV_GET_STRUCT_TLVLEN( WMI_WOW_ADD_PATTERN_CMD_fixed_param)); - cmd->vdev_id = cache->vdev_id; + cmd->vdev_id = vdev_id; cmd->pattern_id = ptrn_id; cmd->pattern_type = WOW_BITMAP_PATTERN; buf_ptr += sizeof(WMI_WOW_ADD_PATTERN_CMD_fixed_param); @@ -6702,36 +7565,11 @@ static VOS_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma, WMITLV_TAG_STRUC_WOW_BITMAP_PATTERN_T, WMITLV_GET_STRUCT_TLVLEN(WOW_BITMAP_PATTERN_T)); - vos_mem_copy(&bitmap_pattern->patternbuf[0], cache->ptrn, - cache->ptrn_len); - /* - * Convert received pattern mask value from bit representaion - * to byte representation. - * - * For example, received value from umac, - * - * Mask value : A1 (equivalent binary is "1010 0001") - * Pattern value : 12:00:13:00:00:00:00:44 - * - * The value which goes to FW after the conversion from this - * function (1 in mask value will become FF and 0 will - * become 00), - * - * Mask value : FF:00:FF:00:0:00:00:FF - * Pattern value : 12:00:13:00:00:00:00:44 - */ - vos_mem_zero(new_mask, sizeof(new_mask)); - for (pos = 0; pos < cache->ptrn_len; pos++) { - bit_to_check = (WMA_NUM_BITS_IN_BYTE - 1) - - (pos % WMA_NUM_BITS_IN_BYTE); - bit_to_check = 0x1 << bit_to_check; - if (cache->mask[pos / WMA_NUM_BITS_IN_BYTE] & bit_to_check) - new_mask[pos] = WMA_WOW_PTRN_MASK_VALID; - } - vos_mem_copy(&bitmap_pattern->bitmaskbuf[0], new_mask, cache->ptrn_len); + vos_mem_copy(&bitmap_pattern->patternbuf[0], ptrn, ptrn_len); + vos_mem_copy(&bitmap_pattern->bitmaskbuf[0], mask, mask_len); - bitmap_pattern->pattern_offset = cache->ptrn_offset; - bitmap_pattern->pattern_len = cache->ptrn_len; + bitmap_pattern->pattern_offset = ptrn_offset; + bitmap_pattern->pattern_len = ptrn_len; if(bitmap_pattern->pattern_len > WOW_DEFAULT_BITMAP_PATTERN_SIZE) bitmap_pattern->pattern_len = WOW_DEFAULT_BITMAP_PATTERN_SIZE; @@ -6742,8 +7580,9 @@ static VOS_STATUS wma_send_wow_patterns_to_fw(tp_wma_handle wma, bitmap_pattern->bitmask_len = bitmap_pattern->pattern_len; bitmap_pattern->pattern_id = ptrn_id; - WMA_LOGD("pattern id: %d, pattern len: %d vdev id: %d", - cmd->pattern_id, bitmap_pattern->pattern_len, cmd->vdev_id); + WMA_LOGD("vdev id : %d, ptrn id: %d, ptrn len: %d, ptrn offset: %d", + cmd->vdev_id, cmd->pattern_id, bitmap_pattern->pattern_len, + bitmap_pattern->pattern_offset); #ifdef WMA_DUMP_WOW_PTRN printk("Pattern : "); @@ -6862,6 +7701,238 @@ static VOS_STATUS wma_enable_wow_in_fw(tp_wma_handle wma) return VOS_STATUS_SUCCESS; } +/* Sends user configured WOW patterns to the firmware. */ +static VOS_STATUS wma_wow_usr(tp_wma_handle wma, u_int8_t vdev_id) +{ + struct wma_wow_ptrn_cache *cache; + VOS_STATUS ret = VOS_STATUS_SUCCESS; + u_int8_t new_mask[SIR_WOWL_BCAST_PATTERN_MAX_SIZE]; + u_int8_t bit_to_check, ptrn_id, pos; + + WMA_LOGD("Configuring user wow patterns for vdev %d", vdev_id); + + for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) { + cache = wma->wow.cache[ptrn_id]; + if (!cache) + continue; + + if (cache->vdev_id != vdev_id) + continue; + /* + * Convert received pattern mask value from bit representaion + * to byte representation. + * + * For example, received value from umac, + * + * Mask value : A1 (equivalent binary is "1010 0001") + * Pattern value : 12:00:13:00:00:00:00:44 + * + * The value which goes to FW after the conversion from this + * function (1 in mask value will become FF and 0 will + * become 00), + * + * Mask value : FF:00:FF:00:0:00:00:FF + * Pattern value : 12:00:13:00:00:00:00:44 + */ + vos_mem_zero(new_mask, sizeof(new_mask)); + for (pos = 0; pos < cache->ptrn_len; pos++) { + bit_to_check = (WMA_NUM_BITS_IN_BYTE - 1) - + (pos % WMA_NUM_BITS_IN_BYTE); + bit_to_check = 0x1 << bit_to_check; + if (cache->mask[pos / WMA_NUM_BITS_IN_BYTE] & bit_to_check) + new_mask[pos] = WMA_WOW_PTRN_MASK_VALID; + } + + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, ptrn_id, + cache->ptrn, cache->ptrn_len, + cache->ptrn_offset, new_mask, + cache->ptrn_len); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to submit wow pattern to fw (ptrn_id %d)", + ptrn_id); + break; + } + } + return ret; +} + +/* Configures default WOW pattern for the given vdev_id which is in AP mode. */ +static VOS_STATUS wma_wow_ap(tp_wma_handle wma, u_int8_t vdev_id) +{ + u_int8_t unicast_ptrn[] = { 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08 }; + u_int8_t unicst_mask[] = { 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f }; + u_int8_t unicst_offset = 0; + u_int8_t arp_ptrn[] = { 0x08, 0x06 }; + u_int8_t arp_mask[] = { 0xff, 0xff }; + u_int8_t arp_offset = 20; + u_int8_t discvr_ptrn[] = { 0xe0, 0x00, 0x00, 0xf8 }; + u_int8_t discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; + u_int8_t discvr_offset = 38; + u_int8_t dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ }; + u_int8_t dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ }; + u_int8_t dhcp_offset = 0; + VOS_STATUS ret; + + WMA_LOGD("Configuring default AP mode wow pattern for vdev %d", + vdev_id); + + if ((wma->wow.total_free_ptrn_id - wma->wow.used_free_ptrn_id) + < WMA_AP_WOW_DEFAULT_PTRN_MAX) { + WMA_LOGE("Empty slots are not enough, avaiable only %d", + wma->wow.total_free_ptrn_id - wma->wow.used_free_ptrn_id); + return VOS_STATUS_E_FAILURE; + } + + /* Setup unicast IP, EAPOL-like and ARP pkt pattern */ + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + unicast_ptrn, sizeof(unicast_ptrn), + unicst_offset, unicst_mask, sizeof(unicst_mask)); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW unicast IP pattern"); + return ret; + } + + /* Setup all ARP pkt pattern */ + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + arp_ptrn, sizeof(arp_ptrn), arp_offset, + arp_mask, sizeof(arp_mask)); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW ARP pattern"); + return ret; + } + + /* + * Setup multicast pattern for mDNS 224.0.0.251, + * SSDP 239.255.255.250 and LLMNR 224.0.0.252 + */ + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + discvr_ptrn, sizeof(discvr_ptrn), discvr_offset, + discvr_mask, sizeof(discvr_mask)); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW mDNS/SSDP/LLMNR pattern"); + return ret; + } + + /* Setup all DHCP broadcast pkt pattern */ + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + dhcp_pattern, sizeof(dhcp_pattern), dhcp_offset, + dhcp_mask, sizeof(dhcp_mask)); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW DHCP broadcast pattern"); + return ret; + } + + return ret; +} + +/* Configures default WOW pattern for the given vdev_id which is in STA mode. */ +static VOS_STATUS wma_wow_sta(tp_wma_handle wma, u_int8_t vdev_id) +{ + u_int8_t discvr_ptrn[] = { 0xe0, 0x00, 0x00, 0xf8 }; + u_int8_t discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 }; + u_int8_t discvr_offset = 38; + u_int8_t mac_mask[ETH_ALEN]; + VOS_STATUS ret; + + WMA_LOGD("Configuring default STA mode wow pattern for vdev %d", + vdev_id); + + if ((wma->wow.total_free_ptrn_id - wma->wow.used_free_ptrn_id) + < WMA_STA_WOW_DEFAULT_PTRN_MAX) { + WMA_LOGE("Empty slots are not enough, avaiable only %d", + wma->wow.total_free_ptrn_id - wma->wow.used_free_ptrn_id); + return VOS_STATUS_E_FAILURE; + } + + /* Setup unicast pkt pattern */ + vos_mem_set(&mac_mask, ETH_ALEN, 0xFF); + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + wma->interfaces[vdev_id].addr, ETH_ALEN, 0, + mac_mask, ETH_ALEN); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW unicast pattern"); + return ret; + } + + /* + * Setup multicast pattern for mDNS 224.0.0.251, + * SSDP 239.255.255.250 and LLMNR 224.0.0.252 + */ + ret = wma_send_wow_patterns_to_fw(wma, vdev_id, + wma->wow.free_ptrn_id[wma->wow.used_free_ptrn_id++], + discvr_ptrn, sizeof(discvr_ptrn), discvr_offset, + discvr_mask, sizeof(discvr_ptrn)); + if (ret != VOS_STATUS_SUCCESS) { + WMA_LOGE("Failed to add WOW mDNS/SSDP/LLMNR pattern"); + return ret; + } + + return ret; +} + +/* Finds out list of unused slots in wow pattern cache. Those free slots number + * can be used as pattern ID while configuring default wow pattern. */ +static void wma_update_free_wow_ptrn_id(tp_wma_handle wma) +{ + struct wma_wow_ptrn_cache *cache; + u_int8_t ptrn_id; + + vos_mem_zero(wma->wow.free_ptrn_id, sizeof(wma->wow.free_ptrn_id)); + wma->wow.total_free_ptrn_id = -1; + wma->wow.used_free_ptrn_id = 0; + + for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) { + cache = wma->wow.cache[ptrn_id]; + if (!cache) { + wma->wow.free_ptrn_id[++wma->wow.total_free_ptrn_id] = + ptrn_id; + continue; + } + } + + WMA_LOGD("Total free wow pattern id for default patterns: %d", + wma->wow.total_free_ptrn_id); +} + +/* Returns true if the user configured any wow pattern for given vdev id */ +static bool wma_is_wow_prtn_cached(tp_wma_handle wma, u_int8_t vdev_id) +{ + struct wma_wow_ptrn_cache *cache; + u_int8_t ptrn_id; + + for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) { + cache = wma->wow.cache[ptrn_id]; + if (!cache) + continue; + + if (cache->vdev_id == vdev_id) + return true; + } + + return false; +} + /* * Pushes wow patterns from local cache to FW and configures * wakeup trigger events. @@ -6869,15 +7940,14 @@ static VOS_STATUS wma_enable_wow_in_fw(tp_wma_handle wma) static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) { struct wma_txrx_node *iface; - struct wma_wow_ptrn_cache *cache; VOS_STATUS ret = VOS_STATUS_SUCCESS; - v_BOOL_t ptrn_match_event_enable = FALSE; - u_int8_t ptrn_id; + u_int8_t ptrn_id, vdev_id; WMA_LOGD("Clearing already configured wow patterns in fw"); /* Clear existing wow patterns in FW. */ - for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) { + for (ptrn_id = 0; ptrn_id < wma->wlan_resource_config.num_wow_filters; + ptrn_id++) { ret = wma_del_wow_pattern_in_fw(wma, ptrn_id); if(ret != VOS_STATUS_SUCCESS) return ret; @@ -6885,29 +7955,31 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) WMA_LOGD("Configuring wow patterns to fw"); - /* Send wow patterns to FW if there are any patterns cached - * in local wow pattern cache. */ - for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) { - cache = wma->wow.cache[ptrn_id]; - if (!cache) - continue; + /* Gather list of free ptrn id. This is needed while configuring + * default wow patterns. */ + wma_update_free_wow_ptrn_id(wma); - iface = &wma->interfaces[cache->vdev_id]; + for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) { + iface = &wma->interfaces[vdev_id]; - /* Rule 1: vdev should be in connected state. - * Rule 2: Pattern match should enabled for this vdev - * by the user. */ - if(!iface->ptrn_match_enable || !iface->conn_state) + if (!iface->handle || + !iface->ptrn_match_enable || + !iface->conn_state) continue; - ret = wma_send_wow_patterns_to_fw(wma, ptrn_id); - if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGE("Failed to submit wow pattern to fw (ptrn_id %d)", - ptrn_id); - return ret; + if (wma_is_wow_prtn_cached(wma, vdev_id)) { + /* Configure wow patterns provided by the user */ + ret = wma_wow_usr(wma, vdev_id); + } else if (wma_is_vdev_in_ap_mode(wma, vdev_id)) { + /* Configure AP mode default wow patterns */ + ret = wma_wow_ap(wma, vdev_id); + } else { + /* Configure STA mode default wow patterns */ + ret = wma_wow_sta(wma, vdev_id); } - ptrn_match_event_enable = TRUE; + if (ret != VOS_STATUS_SUCCESS) + return ret; } /* @@ -6915,18 +7987,17 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) * only if pattern match event is enabled. */ ret = wma_add_wow_wakeup_event(wma, WOW_PATTERN_MATCH_EVENT, - ptrn_match_event_enable); + TRUE); if (ret != VOS_STATUS_SUCCESS) return ret; - WMA_LOGD("Pattern byte match is %s in fw", - ptrn_match_event_enable ? "enabled" : "disabled"); + WMA_LOGD("Pattern byte match is enabled in fw"); /* Configure magic pattern wakeup event */ ret = wma_add_wow_wakeup_event(wma, WOW_MAGIC_PKT_RECVD_EVENT, wma->wow.magic_ptrn_enable); if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGD("Failed to configure magic pattern matching"); + WMA_LOGE("Failed to configure magic pattern matching"); } else { WMA_LOGD("Magic pattern is %s in fw", wma->wow.magic_ptrn_enable ? "enabled" : "disabled"); @@ -6936,7 +8007,7 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) ret = wma_add_wow_wakeup_event(wma, WOW_DEAUTH_RECVD_EVENT, wma->wow.deauth_enable); if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGD("Failed to configure deauth based wakeup"); + WMA_LOGE("Failed to configure deauth based wakeup"); } else { WMA_LOGD("Deauth based wakeup is %s in fw", wma->wow.deauth_enable ? "enabled" : "disabled"); @@ -6946,7 +8017,7 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) ret = wma_add_wow_wakeup_event(wma, WOW_DISASSOC_RECVD_EVENT, wma->wow.disassoc_enable); if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGD("Failed to configure disassoc based wakeup"); + WMA_LOGE("Failed to configure disassoc based wakeup"); } else { WMA_LOGD("Disassoc based wakeup is %s in fw", wma->wow.disassoc_enable ? "enabled" : "disabled"); @@ -6956,7 +8027,7 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) ret = wma_add_wow_wakeup_event(wma, WOW_BMISS_EVENT, wma->wow.bmiss_enable); if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGD("Failed to configure beacon miss based wakeup"); + WMA_LOGE("Failed to configure beacon miss based wakeup"); } else { WMA_LOGD("Beacon miss based wakeup is %s in fw", wma->wow.bmiss_enable ? "enabled" : "disabled"); @@ -6966,7 +8037,7 @@ static VOS_STATUS wma_feed_wow_config_to_fw(tp_wma_handle wma) ret = wma_add_wow_wakeup_event(wma, WOW_GTK_ERR_EVENT, wma->wow.gtk_err_enable); if (ret != VOS_STATUS_SUCCESS) { - WMA_LOGD("Failed to configure GTK based wakeup"); + WMA_LOGE("Failed to configure GTK based wakeup"); } else { WMA_LOGD("GTK based wakeup is %s in fw", wma->wow.gtk_err_enable ? "enabled" : "disabled"); @@ -7106,7 +8177,7 @@ static VOS_STATUS wma_wow_exit(tp_wma_handle wma, static VOS_STATUS wma_suspend_req(tp_wma_handle wma, tpSirWlanSuspendParam info) { struct wma_txrx_node *iface; - v_BOOL_t connected = FALSE; + v_BOOL_t connected = FALSE, pno_in_progress = FALSE; VOS_STATUS ret; u_int8_t i; @@ -7159,9 +8230,14 @@ static VOS_STATUS wma_suspend_req(tp_wma_handle wma, tpSirWlanSuspendParam info) connected = TRUE; break; } + if (wma->interfaces[i].pno_in_progress) { + WMA_LOGD("PNO is in progress during suspend"); + pno_in_progress = TRUE; + break; + } } - if (!connected) { + if (!connected && !pno_in_progress) { WMA_LOGD("All vdev are in disconnected state, skipping wow"); vos_mem_free(info); goto send_ready_to_suspend; @@ -7585,22 +8661,136 @@ VOS_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler, #endif /* FEATURE_WLAN_CCX */ +static void wma_del_ts_req(tp_wma_handle wma, tDelTsParams *msg) +{ + wmi_vdev_wmm_delts_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + buf = wmi_buf_alloc(wma->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s : wmi_buf_alloc failed\n", __func__); + goto err; + } + cmd = (wmi_vdev_wmm_delts_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_wmm_delts_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_wmm_delts_cmd_fixed_param)); + cmd->vdev_id = msg->sessionId; + cmd->ac = TID_TO_WME_AC(msg->userPrio); + + WMA_LOGD("Delts vdev:%d, ac:%d, %s:%d\n", + cmd->vdev_id, cmd->ac, __FUNCTION__, __LINE__); + if (wmi_unified_cmd_send(wma->wmi_handle, buf, len, + WMI_VDEV_WMM_DELTS_CMDID)) { + WMA_LOGP("Failed to send vdev DELTS command\n"); + adf_nbuf_free(buf); + } + +err: + vos_mem_free(msg); +} + +/* + * @brief: A function to handle WDA_AGGR_QOS_REQ. This will send out + * ADD_TS requestes to firmware in loop for all the ACs with + * active flow. + * @param: wma_handler - handle to wma + * @param: pAggrQosRspMsg - combined struct for all ADD_TS requests. + */ +static void wma_aggr_qos_req(tp_wma_handle wma, tAggrAddTsParams *pAggrQosRspMsg) +{ + int i = 0; + wmi_vdev_wmm_addts_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ ) + { + // if flow in this AC is active + if ( ((1 << i) & pAggrQosRspMsg->tspecIdx) ) + { + /* + * as per implementation of wma_add_ts_req() we + * are not waiting any response from firmware so + * apart from sending ADDTS to firmware just send + * success to upper layers + */ + pAggrQosRspMsg->status[i] = eHAL_STATUS_SUCCESS; + + buf = wmi_buf_alloc(wma->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s : wmi_buf_alloc failed\n", __func__); + goto aggr_qos_exit; + } + cmd = (wmi_vdev_wmm_addts_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_wmm_addts_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_wmm_addts_cmd_fixed_param)); + cmd->vdev_id = pAggrQosRspMsg->sessionId; + cmd->ac = TID_TO_WME_AC(pAggrQosRspMsg->tspec[i].tsinfo.traffic.userPrio); + cmd->medium_time_us = pAggrQosRspMsg->tspec[i].mediumTime * 32; + cmd->downgrade_type = WMM_AC_DOWNGRADE_DEPRIO; + WMA_LOGD("%s:%d: Addts vdev:%d, ac:%d, mediumTime:%d\n", + __func__, __LINE__, cmd->vdev_id, cmd->ac, cmd->medium_time_us); + if (wmi_unified_cmd_send(wma->wmi_handle, buf, len, + WMI_VDEV_WMM_ADDTS_CMDID)) { + WMA_LOGP("Failed to send vdev ADDTS command\n"); + pAggrQosRspMsg->status[i] = eHAL_STATUS_FAILURE; + adf_nbuf_free(buf); + } + } + } + +aggr_qos_exit: + // send reponse to upper layers from here only. + wma_send_msg(wma, WDA_AGGR_QOS_RSP, pAggrQosRspMsg, 0); +} + static void wma_add_ts_req(tp_wma_handle wma, tAddTsParams *msg) { + wmi_vdev_wmm_addts_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + #ifdef FEATURE_WLAN_CCX - /* - * msmt_interval is in unit called TU (1 TU = 1024 us) - * max value of msmt_interval cannot make resulting - * interval_miliseconds overflow 32 bit - */ - ol_txrx_pdev_handle pdev = - vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); - tANI_U32 intervalMiliseconds = - (msg->tsm_interval*1024)/1000; - ol_tx_set_compute_interval(pdev, intervalMiliseconds); + /* + * msmt_interval is in unit called TU (1 TU = 1024 us) + * max value of msmt_interval cannot make resulting + * interval_miliseconds overflow 32 bit + */ + ol_txrx_pdev_handle pdev = + vos_get_context(VOS_MODULE_ID_TXRX, wma->vos_context); + tANI_U32 intervalMiliseconds = + (msg->tsm_interval*1024)/1000; + ol_tx_set_compute_interval(pdev, intervalMiliseconds); #endif - msg->status = eHAL_STATUS_SUCCESS; - wma_send_msg(wma, WDA_ADD_TS_RSP, msg, 0); + msg->status = eHAL_STATUS_SUCCESS; + + buf = wmi_buf_alloc(wma->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s : wmi_buf_alloc failed\n", __func__); + goto err; + } + cmd = (wmi_vdev_wmm_addts_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_wmm_addts_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_wmm_addts_cmd_fixed_param)); + cmd->vdev_id = msg->sessionId; + cmd->ac = TID_TO_WME_AC(msg->tspec.tsinfo.traffic.userPrio); + cmd->medium_time_us = msg->tspec.mediumTime * 32; + cmd->downgrade_type = WMM_AC_DOWNGRADE_DEPRIO; + WMA_LOGD("Addts vdev:%d, ac:%d, mediumTime:%d, %s:%d\n", + cmd->vdev_id, cmd->ac, cmd->medium_time_us, __func__, __LINE__); + if (wmi_unified_cmd_send(wma->wmi_handle, buf, len, + WMI_VDEV_WMM_ADDTS_CMDID)) { + WMA_LOGP("Failed to send vdev ADDTS command\n"); + msg->status = eHAL_STATUS_FAILURE; + adf_nbuf_free(buf); + } + +err: + wma_send_msg(wma, WDA_ADD_TS_RSP, msg, 0); } static void wma_data_tx_ack_work_handler(struct work_struct *ack_work) @@ -8607,7 +9797,7 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) break ; case WDA_ADD_STA_SELF_REQ: txrx_vdev_handle = wma_vdev_attach(wma_handle, - (tAddStaSelfParams *)msg->bodyptr); + (tAddStaSelfParams *)msg->bodyptr, 1); if (!txrx_vdev_handle) { WMA_LOGE("Failed to attach vdev"); } else { @@ -8619,7 +9809,8 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) } break; case WDA_DEL_STA_SELF_REQ: - wma_vdev_detach(wma_handle, (tDelStaSelfParams *)msg->bodyptr); + wma_vdev_detach(wma_handle, + (tDelStaSelfParams *)msg->bodyptr, 1); break; case WDA_START_SCAN_OFFLOAD_REQ: wma_start_scan(wma_handle, msg->bodyptr); @@ -8754,6 +9945,14 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) wma_add_ts_req(wma_handle, (tAddTsParams *)msg->bodyptr); break; + case WDA_DEL_TS_REQ: + wma_del_ts_req(wma_handle, (tDelTsParams *)msg->bodyptr); + break; + + case WDA_AGGR_QOS_REQ: + wma_aggr_qos_req(wma_handle, (tAggrAddTsParams *)msg->bodyptr); + break; + case WDA_RECEIVE_FILTER_SET_FILTER_REQ: wma_process_receive_filter_set_filter_req(wma_handle, (tSirRcvPktFilterCfgType *)msg->bodyptr); @@ -9045,19 +10244,6 @@ static VOS_STATUS wma_tx_detach(tp_wma_handle wma_handle) return VOS_STATUS_SUCCESS; } -static void wma_beacon_miss_handler(tp_wma_handle wma, u_int32_t vdev_id) -{ - tSirSmeMissedBeaconInd *beacon_miss_ind; - - beacon_miss_ind = (tSirSmeMissedBeaconInd *) vos_mem_malloc - (sizeof(tSirSmeMissedBeaconInd)); - beacon_miss_ind->messageType = WDA_MISSED_BEACON_IND; - beacon_miss_ind->length = sizeof(tSirSmeMissedBeaconInd); - beacon_miss_ind->bssIdx = vdev_id; - - wma_send_msg(wma, WDA_MISSED_BEACON_IND, - (void *)beacon_miss_ind, 0); -} /* function : wma_roam_better_ap_handler * Descriptin : Handler for WMI_ROAM_REASON_BETTER_AP event from roam firmware in Rome. * : This event means roam algorithm in Rome has found a better matching @@ -9334,14 +10520,6 @@ VOS_STATUS wma_stop(v_VOID_t *vos_ctx, tANI_U8 reason) goto end; } -#ifdef QCA_WIFI_ISOC - wma_hal_stop_isoc(wma_handle); -#else - /* Suspend the target and disable interrupt */ - if (wma_suspend_target(wma_handle, 1)) - WMA_LOGE("Failed to suspend target\n"); -#endif - #ifdef QCA_WIFI_FTM /* * Tx mgmt detach requires TXRX context which is not created @@ -9362,6 +10540,14 @@ VOS_STATUS wma_stop(v_VOID_t *vos_ctx, tANI_U8 reason) } #endif +#ifdef QCA_WIFI_ISOC + wma_hal_stop_isoc(wma_handle); +#else + /* Suspend the target and disable interrupt */ + if (wma_suspend_target(wma_handle, 1)) + WMA_LOGE("Failed to suspend target\n"); +#endif + vos_status = wma_tx_detach(wma_handle); if(vos_status != VOS_STATUS_SUCCESS) { WMA_LOGP("Failed to deregister tx management"); @@ -9412,7 +10598,8 @@ VOS_STATUS wma_close(v_VOID_t *vos_ctx) } /* Free wow pattern cache */ - for (ptrn_id = 0; ptrn_id < WOW_MAX_BITMAP_FILTERS; ptrn_id++) + for (ptrn_id = 0; ptrn_id < wma_handle->wlan_resource_config.num_wow_filters; + ptrn_id++) wma_free_wow_ptrn(wma_handle, ptrn_id); /* unregister Firmware debug log */ @@ -9940,6 +11127,15 @@ v_VOID_t wma_rx_service_ready_event(WMA_HANDLE handle, void *cmd_param_info) } } #endif + + status = wmi_unified_register_event_handler(wma_handle->wmi_handle, + WMI_P2P_NOA_EVENTID, + wma_p2p_noa_event_handler); + if (status) { + WMA_LOGE("Failed to register WMI_P2P_NOA_EVENTID callback"); + return; + } + vos_mem_copy(target_cap.wmi_service_bitmap, param_buf->wmi_service_bitmap, sizeof(wma_handle->wmi_service_bitmap)); @@ -11039,3 +12235,8 @@ void wma_send_regdomain_info(u_int32_t reg_dmn, u_int16_t regdmn2G, } return; } + +tANI_U8 wma_map_channel(tANI_U8 mapChannel) +{ + return mapChannel; +} diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 25685c5003ee..35e23bcd5e3d 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -131,7 +131,12 @@ #define WMA_HOST_SCAN_REQID_PREFIX 0xA000 /* Prefix used by scan requestor id on host */ #define WMA_HOST_SCAN_REQUESTOR_ID_PREFIX 0xA000 -#define WMA_HW_DEF_SCAN_MAX_DURATION 5000 /* 5 secs */ +#define WMA_HW_DEF_SCAN_MAX_DURATION 30000 /* 30 secs */ + +/* Max offchannel duration */ +#define WMA_SCAN_AP_PRESENT_MAX_OFFCHANNEL_NUM 5 +#define WMA_SCAN_MAX_OFFCHANNEL_NUM_ACTIVE 10 +#define WMA_SCAN_MAX_OFFCHANNEL_NUM_PASSIVE 4 #define WMA_INVALID_KEY_IDX 0xff @@ -222,6 +227,7 @@ typedef struct { u_int32_t rxchainmask; u_int32_t txpow2g; u_int32_t txpow5g; + u_int32_t pwrgating; } pdev_cli_config_t; typedef struct { @@ -240,6 +246,9 @@ typedef struct { #define WMA_WOW_PTRN_MASK_VALID 0xFF #define WMA_NUM_BITS_IN_BYTE 8 +#define WMA_AP_WOW_DEFAULT_PTRN_MAX 4 +#define WMA_STA_WOW_DEFAULT_PTRN_MAX 2 + struct wma_wow_ptrn_cache { u_int8_t vdev_id; u_int8_t *ptrn; @@ -252,6 +261,11 @@ struct wma_wow_ptrn_cache { struct wma_wow { struct wma_wow_ptrn_cache *cache[WOW_MAX_BITMAP_FILTERS]; u_int8_t no_of_ptrn_cached; + + u_int8_t free_ptrn_id[WOW_MAX_BITMAP_FILTERS]; + u_int8_t total_free_ptrn_id; + u_int8_t used_free_ptrn_id; + v_BOOL_t magic_ptrn_enable; v_BOOL_t wow_enable; v_BOOL_t deauth_enable; @@ -285,6 +299,7 @@ struct wma_txrx_node { WLAN_PHY_MODE chanmode; tANI_U8 vht_capable; tANI_U8 ht_capable; + v_BOOL_t vdev_up; }; #if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC) @@ -388,6 +403,8 @@ typedef struct { */ tSirHostOffloadReq mArpInfo; struct wma_tx_ack_work_ctx *ack_work_ctx; + u_int8_t powersave_mode; + v_BOOL_t ptrn_match_enable_all_vdev; }t_wma_handle, *tp_wma_handle; struct wma_target_cap { @@ -1122,4 +1139,13 @@ struct wma_decap_info_t { int32_t hdr_len; }; +enum powersave_mode { + PS_NOT_SUPPORTED = 0, + PS_LEGACY_NODEEPSLEEP = 1, + PS_QPOWER_NODEEPSLEEP = 2, + PS_LEGACY_DEEPSLEEP = 3, + PS_QPOWER_DEEPSLEEP = 4 +}; +#define WMA_DEFAULT_QPOWER_MAX_PSPOLL_BEFORE_WAKE 1 +#define WMA_DEFAULT_QPOWER_TX_WAKE_THRESHOLD 2 #endif diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h index e5f226e9a779..4a8546febfea 100644 --- a/CORE/SME/inc/csrApi.h +++ b/CORE/SME/inc/csrApi.h @@ -1089,6 +1089,9 @@ typedef struct tagCsrConfigParam tANI_U8 scanCfgAgingTime; tANI_U8 enableTxLdpc; + + tANI_U8 isCoalesingInIBSSAllowed; + }tCsrConfigParam; //Tush diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index 1c74303aa694..ad96bc25a89b 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -633,6 +633,8 @@ typedef struct tagCsrConfig #endif tANI_U8 txLdpcEnable; + tANI_U8 isCoalesingInIBSSAllowed; + }tCsrConfig; typedef struct tagCsrChannelPowerInfo diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index becbba0a5cd5..b457aa716dad 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -1704,6 +1704,10 @@ eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pPa pMac->roam.configParam.txMuBformee= pParam->enableMuBformee; #endif pMac->roam.configParam.txLdpcEnable = pParam->enableTxLdpc; + + pMac->roam.configParam.isCoalesingInIBSSAllowed = + pParam->isCoalesingInIBSSAllowed; + } return status; @@ -1786,6 +1790,10 @@ eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam) pParam->enableMuBformee = pMac->roam.configParam.txMuBformee; #endif pParam->enableTxLdpc = pMac->roam.configParam.txLdpcEnable; + + pParam->isCoalesingInIBSSAllowed = + pMac->roam.configParam.isCoalesingInIBSSAllowed; + csrSetChannels(pMac, pParam); status = eHAL_STATUS_SUCCESS; @@ -13055,6 +13063,11 @@ eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCs // Set wps_state *pBuf = pParam->wps_state; pBuf++; + + // set isCoalesingInIBSSAllowed + *pBuf = pMac->isCoalesingInIBSSAllowed; + pBuf++; + //Persona *pBuf = (tANI_U8)pParam->bssPersona; pBuf++; @@ -13767,6 +13780,15 @@ static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId) { return; } + /* + * Incase of station mode, immediately stop data transmission whenever + * link down is detected. + */ + if (csrRoamIsStaMode(pMac, sessionId)) { + smsLog(pMac, LOG1, FL("Inform Link lost for session %d"), sessionId); + csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK, + eCSR_ROAM_RESULT_LOSTLINK); + } /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/ csrRoamDeregStatisticsReq(pMac); pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND; diff --git a/CORE/SME/src/rrm/sme_rrm.c b/CORE/SME/src/rrm/sme_rrm.c index 4e6d72cea5d7..b770cb654287 100644 --- a/CORE/SME/src/rrm/sme_rrm.c +++ b/CORE/SME/src/rrm/sme_rrm.c @@ -172,7 +172,10 @@ void rrmIndicateNeighborReportResult(tpAniSirGlobal pMac, VOS_STATUS vosStatus) \return - 0 for success, non zero for failure --------------------------------------------------------------------------*/ -static eHalStatus sme_RrmSendBeaconReportXmitInd( tpAniSirGlobal pMac, tCsrScanResultInfo **pResultArr, tANI_U8 measurementDone ) +static eHalStatus sme_RrmSendBeaconReportXmitInd( tpAniSirGlobal pMac, + tCsrScanResultInfo **pResultArr, + tANI_U8 measurementDone, + tANI_U8 bss_count ) { tpSirBssDescription pBssDesc = NULL; tpSirBeaconReportXmitInd pBeaconRep; @@ -220,35 +223,62 @@ static eHalStatus sme_RrmSendBeaconReportXmitInd( tpAniSirGlobal pMac, tCsrScanR while (pCurResult) { pBssDesc = &pCurResult->BssDescriptor; - ie_len = GET_IE_LEN_IN_BSS( pBssDesc->length ); - pBeaconRep->pBssDescription[msgCounter] = vos_mem_malloc ( ie_len+sizeof(tSirBssDescription) ); - if (NULL == pBeaconRep->pBssDescription[msgCounter]) - break; - vos_mem_copy( pBeaconRep->pBssDescription[msgCounter], pBssDesc, sizeof(tSirBssDescription) ); - vos_mem_copy( &pBeaconRep->pBssDescription[msgCounter]->ieFields[0], pBssDesc->ieFields, ie_len ); - - pBeaconRep->numBssDesc++; - - if (++msgCounter >= SIR_BCN_REPORT_MAX_BSS_DESC) - break; - - if (csrRoamIs11rAssoc(pMac)) { + if(pBssDesc != NULL) + { + ie_len = GET_IE_LEN_IN_BSS( pBssDesc->length ); + pBeaconRep->pBssDescription[msgCounter] = vos_mem_malloc ( + ie_len+sizeof(tSirBssDescription)); + if (NULL == pBeaconRep->pBssDescription[msgCounter]) + break; + vos_mem_copy( pBeaconRep->pBssDescription[msgCounter], + pBssDesc, + sizeof(tSirBssDescription) ); + vos_mem_copy( &pBeaconRep->pBssDescription[msgCounter]->ieFields[0], + pBssDesc->ieFields, ie_len ); + smsLog( pMac, LOG1, + "...RRM Result Bssid = %02x-%02x-%02x-%02x-%02x-%02x chan= %d, rssi = -%d", + pBeaconRep->pBssDescription[msgCounter]->bssId[ 0 ], + pBeaconRep->pBssDescription[msgCounter]->bssId[ 1 ], + pBeaconRep->pBssDescription[msgCounter]->bssId[ 2 ], + pBeaconRep->pBssDescription[msgCounter]->bssId[ 3 ], + pBeaconRep->pBssDescription[msgCounter]->bssId[ 4 ], + pBeaconRep->pBssDescription[msgCounter]->bssId[ 5 ], + pBeaconRep->pBssDescription[msgCounter]->channelId, + pBeaconRep->pBssDescription[msgCounter]->rssi * (-1)); + + pBeaconRep->numBssDesc++; + + if (++msgCounter >= SIR_BCN_REPORT_MAX_BSS_DESC_PER_ACTION_FRAME) + break; + + pCurResult = pResultArr[bssCounter + msgCounter]; + } + else + { + pCurResult = NULL; break; } - - pCurResult = pResultArr[msgCounter]; } bssCounter+=msgCounter; - if (!pResultArr || !pCurResult || (bssCounter>=SIR_BCN_REPORT_MAX_BSS_DESC)) - pCurResult = NULL; + if (!pResultArr || (pCurResult == NULL) || (bssCounter >= bss_count)) + { + pCurResult = NULL; + smsLog(pMac, LOG1, + "Reached to the max/last BSS in pCurResult list"); + } else - pCurResult = pResultArr[bssCounter]; + { + pCurResult = pResultArr[bssCounter]; + smsLog(pMac, LOG1, + "Move to the next BSS set in pCurResult list"); + } pBeaconRep->fMeasureDone = (pCurResult)?false:measurementDone; - smsLog(pMac, LOGW, "SME Sending BcnRepXmit to PE numBss %d", - pBeaconRep->numBssDesc); + smsLog(pMac, LOG1, + "SME Sending BcnRepXmit to PE numBss %d msgCounter %d bssCounter %d", + pBeaconRep->numBssDesc, msgCounter, bssCounter); status = palSendMBMessage(pMac->hHdd, pBeaconRep); @@ -271,12 +301,15 @@ static eHalStatus sme_RrmSendBeaconReportXmitInd( tpAniSirGlobal pMac, tCsrScanR \return - 0 for success, non zero for failure --------------------------------------------------------------------------*/ -static eHalStatus sme_RrmSendScanResult( tpAniSirGlobal pMac, tANI_U8 num_chan, tANI_U8* chanList, tANI_U8 measurementDone ) +static eHalStatus sme_RrmSendScanResult( tpAniSirGlobal pMac, + tANI_U8 num_chan, + tANI_U8* chanList, + tANI_U8 measurementDone ) { tCsrScanResultFilter filter; tScanResultHandle pResult; tCsrScanResultInfo *pScanResult, *pNextResult; - tCsrScanResultInfo *pScanResultsArr[SIR_BCN_REPORT_MAX_BSS_DESC]; + tCsrScanResultInfo *pScanResultsArr[SIR_BCN_REPORT_MAX_BSS_PER_CHANNEL]; eHalStatus status; tANI_U8 counter=0; tpRrmSMEContext pSmeRrmContext = &pMac->rrm.rrmSmeContext; @@ -287,7 +320,7 @@ static eHalStatus sme_RrmSendScanResult( tpAniSirGlobal pMac, tANI_U8 num_chan, #endif vos_mem_zero( &filter, sizeof(filter) ); - vos_mem_zero( pScanResultsArr, sizeof(pNextResult)*SIR_BCN_REPORT_MAX_BSS_DESC ); + vos_mem_zero( pScanResultsArr, sizeof(pNextResult)*SIR_BCN_REPORT_MAX_BSS_PER_CHANNEL ); filter.BSSIDs.numOfBSSIDs = 1; filter.BSSIDs.bssid = &pSmeRrmContext->bssId; @@ -345,14 +378,14 @@ static eHalStatus sme_RrmSendScanResult( tpAniSirGlobal pMac, tANI_U8 num_chan, // send a xmit indication with moreToFollow set to MEASURMENT_DONE // so that PE can clean any context allocated. if( measurementDone ) - status = sme_RrmSendBeaconReportXmitInd( pMac, NULL, measurementDone ); + status = sme_RrmSendBeaconReportXmitInd( pMac, NULL, measurementDone, 0 ); return status; } pScanResult = sme_ScanResultGetFirst(pMac, pResult); if( NULL == pScanResult && measurementDone ) - status = sme_RrmSendBeaconReportXmitInd( pMac, NULL, measurementDone ); + status = sme_RrmSendBeaconReportXmitInd( pMac, NULL, measurementDone, 0 ); counter=0; while (pScanResult) @@ -360,13 +393,19 @@ static eHalStatus sme_RrmSendScanResult( tpAniSirGlobal pMac, tANI_U8 num_chan, pNextResult = sme_ScanResultGetNext(pMac, pResult); pScanResultsArr[counter++] = pScanResult; pScanResult = pNextResult; //sme_ScanResultGetNext(hHal, pResult); - if (counter >= SIR_BCN_REPORT_MAX_BSS_DESC) + if (counter >= SIR_BCN_REPORT_MAX_BSS_PER_CHANNEL) break; } if (counter) - status = sme_RrmSendBeaconReportXmitInd( pMac, pScanResultsArr, measurementDone); - + { + status = sme_RrmSendBeaconReportXmitInd( pMac, + pScanResultsArr, + measurementDone, + counter); + smsLog(pMac, LOG1, " Number of BSS Desc with RRM Scan %d ", + counter); + } sme_ScanResultPurge(pMac, pResult); return status; @@ -654,7 +693,7 @@ void sme_RrmProcessBeaconReportReqInd(tpAniSirGlobal pMac, void *pMsgBuf) /* Indicate measurement completion to PE */ /* If this is not done, pCurrentReq pointer will not be freed and PE will not handle subsequent Beacon requests */ - sme_RrmSendBeaconReportXmitInd(pMac, NULL, true); + sme_RrmSendBeaconReportXmitInd(pMac, NULL, true, 0); break; } diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index dd5a89cd446b..4061eed537dc 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -1477,6 +1477,9 @@ eHalStatus sme_UpdateConfig(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams) /* update p2p offload status */ pMac->pnoOffload = pSmeConfigParams->pnoOffload; + pMac->isCoalesingInIBSSAllowed = + pSmeConfigParams->csrConfig.isCoalesingInIBSSAllowed; + return status; } diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c index 516405ed65e2..57a576374a07 100644 --- a/CORE/UTILS/FWLOG/dbglog_host.c +++ b/CORE/UTILS/FWLOG/dbglog_host.c @@ -138,6 +138,8 @@ const char *dbglog_get_module_str(A_UINT32 module_id) return "STA_SMPS"; case WLAN_MODULE_TDLS: return "TDLS"; + case WLAN_MODULE_P2P: + return "P2P"; default: return "UNKNOWN"; } @@ -202,11 +204,20 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WMI_CMD_PARAMS", "WMI_EVENT_ALLOC_FAILURE", "WMI_DBGID_DCS_PARAM_CMD", + "WMI_SEND_EVENT_WRONG_TLV", + "WMI_SEND_EVENT_NO_TLV_DEF", "WMI_DBGID_DEFNITION_END", }, { "PS_STA_DEFINITION_START", "PS_STA_PM_ARB_REQUEST", + "PS_STA_DELIVER_EVENT", + "PS_STA_PSPOLL_SEQ_DONE", + "PS_STA_COEX_MODE", + "PS_STA_PSPOLL_ALLOW", + "PS_STA_SET_PARAM", + "PS_STA_SPECPOLL_TIMER_STARTED", + "PS_STA_SPECPOLL_TIMER_STOPPED", }, { "WHAL_DBGID_DEFINITION_START", @@ -247,56 +258,7 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WHAL_ERROR_INTERRUPT_BB_PANIC", "WHAL_ERROR_PAPRD_MAXGAIN_ABOVE_WINDOW", "WHAL_ERROR_QCU_HW_PAUSE_MISMATCH", - "WHAL_COEX_RESET", - "WHAL_COEX_SELF_GEN_MASK", - "WHAL_ERROR_COEX_MCI_ISR", - "WHAL_COEX_MCI_ISR_IntRaw", - "WHAL_COEX_MCI_ISR_Int1Raw", - "WHAL_COEX_MCI_ISR_RxMsgRaw", - "WHAL_COEX_SENDMSG_QUEUE", - "WHAL_COEX_TX_MCI_REMOTE_RESET", - "WHAL_COEX_TX_MCI_TYPE_UNKNOWN", - "WHAL_COEX_TX_MCI_SYS_SLEEPING", - "WHAL_COEX_TX_MCI_REQ_WAKE", - "WHAL_COEX_TX_MCI_SYS_WAKING", - "WHAL_COEX_TX_MCI_LNA_TAKE", - "WHAL_COEX_TX_MCI_LNA_TRANS", - "WHAL_COEX_TX_MCI_GPM_UNKNOWN", - "WHAL_COEX_TX_MCI_GPM_WLAN_SET_ACL_INACTIVITY", - "WHAL_COEX_TX_MCI_GPM_BT_PAUSE_PROFILE", - "WHAL_COEX_TX_MCI_GPM_WLAN_PRIO", - "WHAL_COEX_TX_MCI_GPM_BT_STATUS_UPDATE", - "WHAL_COEX_TX_MCI_GPM_BT_UPDATE_FLAGS", - "WHAL_COEX_TX_MCI_GPM_VERSION_QUERY", - "WHAL_COEX_TX_MCI_GPM_VERSION_RESPONSE", - "WHAL_COEX_TX_MCI_GPM_STATUS_QUERY", - "WHAL_COEX_TX_MCI_GPM_HALT_BT_GPM", - "WHAL_COEX_TX_MCI_GPM_WLAN_CHANNELS", - "WHAL_COEX_TX_MCI_GPM_BT_PROFILE_INFO", - "WHAL_COEX_TX_MCI_GPM_BT_CAL_REQ ", - "WHAL_COEX_TX_MCI_GPM_BT_CAL_GRANT", - "WHAL_COEX_TX_MCI_GPM_BT_CAL_DONE", - "WHAL_COEX_TX_MCI_GPM_WLAN_CAL_REQ", - "WHAL_COEX_TX_MCI_GPM_WLAN_CAL_GRANT", - "WHAL_COEX_TX_MCI_GPM_WLAN_CAL_DONE", - "WHAL_COEX_TX_MCI_GPM_BT_DEBUG", - "WHAL_COEX_WHAL_MCI_RESET", - "WHAL_COEX_POLL_BT_CAL_DONE_TIMEOUT", - "WHAL_COEX_WHAL_PAUSE", - "WHAL_COEX_RX_MCI_GPM_BT_CAL_REQ", - "WHAL_COEX_RX_MCI_GPM_BT_CAL_DONE", - "WHAL_COEX_RX_MCI_GPM_BT_CAL_GRANT", - "WHAL_COEX_WLAN_CAL_START", - "WHAL_COEX_WLAN_CAL_RESULT ", - "WHAL_COEX_BtMciState", - "WHAL_COEX_BtCalState", - "WHAL_COEX_WlanCalState", - "WHAL_COEX_RxReqWakeCount", - "WHAL_COEX_RxRemoteResetCount", - "WHAL_COEX_RESTART_CAL", - "WHAL_COEX_WHAL_COEX_RESET", - "WHAL_COEX_SELF_GEN_MASK", - "WHAL_DBGID_DEFINITION_END" + "WHAL_DBGID_DEFINITION_END", }, { "COEX_DEBUGID_START", @@ -499,53 +461,80 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "COEX_PSP_STAT_2", // 197 "COEX_PSP_RX_STATUS_STATE_2", // 198 "COEX_PSP_ERROR", // 199 - "COEX_T2BT", // 200 - "COEX_BT_DURATION", // 201 - "COEX_TX_MCI_GPM_WLAN_SCHED_INFO_TRIG", // 202 - "COEX_TX_MCI_GPM_WLAN_SCHED_INFO_TRIG_RSP", // 203 - "COEX_TX_MCI_GPM_SCAN_OP", // 204 - "COEX_TX_MCI_GPM_BT_PAUSE_GPM_TX", // 205 - "COEX_CTS2S_SEND", // 206 - "COEX_CTS2S_RESULT", // 207 - "COEX_ENTER_OCS", // 208 - "COEX_EXIT_OCS", // 209 - "COEX_UPDATE_OCS", // 210 - "COEX_STATUS_OCS", // 211 - "COEX_STATS_BT", // 212 - "COEX_DEBUG_MESSAGE_END" + "COEX_T2BT", // 200 + "COEX_BT_DURATION", // 201 + "COEX_TX_MCI_GPM_WLAN_SCHED_INFO_TRIG", // 202 + "COEX_TX_MCI_GPM_WLAN_SCHED_INFO_TRIG_RSP", // 203 + "COEX_TX_MCI_GPM_SCAN_OP", // 204 + "COEX_TX_MCI_GPM_BT_PAUSE_GPM_TX", // 205 + "COEX_CTS2S_SEND", // 206 + "COEX_CTS2S_RESULT", // 207 + "COEX_ENTER_OCS", // 208 + "COEX_EXIT_OCS", // 209 + "COEX_UPDATE_OCS", // 210 + "COEX_STATUS_OCS", // 211 + "COEX_STATS_BT", // 212 + "COEX_MWS_WLAN_INIT", + "COEX_MWS_WBTMR_SYNC", + "COEX_MWS_TYPE2_RX", + "COEX_MWS_TYPE2_TX", + "COEX_MWS_WLAN_CHAVD", + "COEX_MWS_WLAN_CHAVD_INSERT", + "COEX_MWS_WLAN_CHAVD_MERGE", + "COEX_MWS_WLAN_CHAVD_RPT", + "COEX_MWS_CP_MSG_SEND", + "COEX_MWS_CP_ESCAPE", + "COEX_MWS_CP_UNFRAME", + "COEX_MWS_CP_SYNC_UPDATE", + "COEX_MWS_CP_SYNC", + "COEX_MWS_CP_WLAN_STATE_IND", + "COEX_MWS_CP_SYNCRESP_TIMEOUT", + "COEX_MWS_SCHEME_UPDATE", + "COEX_MWS_WLAN_EVENT", + "COEX_MWS_UART_UNESCAPE", + "COEX_MWS_UART_ENCODE_SEND", + "COEX_MWS_UART_RECV_DECODE", + "COEX_MWS_UL_HDL", + "COEX_MWS_REMOTE_EVENT", + "COEX_MWS_OTHER", + "COEX_MWS_ERROR", + "COEX_MWS_ANT_DIVERSITY", + "COEX_DEBUG_ID_END" }, { - "RO_DBGID_DEFINITION_START", - "RO_REFRESH_ROAM_TABLE", - "RO_UPDATE_ROAM_CANDIDATE", - "RO_UPDATE_ROAM_CANDIDATE_CB", - "RO_UPDATE_ROAM_CANDIDATE_FINISH", - "RO_REFRESH_ROAM_TABLE_DONE", - "RO_PERIODIC_SEARCH_CB", - "RO_PERIODIC_SEARCH_TIMEOUT", - "RO_INIT", - "RO_BMISS_STATE1", - "RO_BMISS_STATE2", - "RO_SET_PERIODIC_SEARCH_ENABLE", - "RO_SET_PERIODIC_SEARCH_DISABLE", - "RO_ENABLE_SQ_THRESHOLD", - "RO_DISABLE_SQ_THRESHOLD", - "RO_ADD_BSS_TO_ROAM_TABLE", - "RO_SET_PERIODIC_SEARCH_MODE", - "RO_CONFIGURE_SQ_THRESHOLD1", - "RO_CONFIGURE_SQ_THRESHOLD2", - "RO_CONFIGURE_SQ_PARAMS", - "RO_LOW_SIGNAL_QUALITY_EVENT", - "RO_HIGH_SIGNAL_QUALITY_EVENT", - "RO_REMOVE_BSS_FROM_ROAM_TABLE", - "RO_UPDATE_CONNECTION_STATE_METRIC", - "RO_LOWRSSI_SCAN_PARAMS", - "RO_LOWRSSI_SCAN_START", - "RO_LOWRSSI_SCAN_END", - "RO_LOWRSSI_SCAN_CANCEL", - "RO_LOWRSSI_ROAM_CANCEL", - "RO_REFRESH_ROAM_CANDIDATE", - "RO_DBGID_DEFINITION_END" + "ROAM_DBGID_DEFINITION_START", + "ROAM_MODULE_INIT", + "ROAM_DEV_START", + "ROAM_CONFIG_RSSI_THRESH", + "ROAM_CONFIG_SCAN_PERIOD", + "ROAM_CONFIG_AP_PROFILE", + "ROAM_CONFIG_CHAN_LIST", + "ROAM_CONFIG_SCAN_PARAMS", + "ROAM_CONFIG_RSSI_CHANGE", + "ROAM_SCAN_TIMER_START", + "ROAM_SCAN_TIMER_EXPIRE", + "ROAM_SCAN_TIMER_STOP", + "ROAM_SCAN_STARTED", + "ROAM_SCAN_COMPLETE", + "ROAM_SCAN_CANCELLED", + "ROAM_CANDIDATE_FOUND", + "ROAM_RSSI_ACTIVE_SCAN", + "ROAM_RSSI_ACTIVE_ROAM", + "ROAM_RSSI_GOOD", + "ROAM_BMISS_FIRST_RECV", + "ROAM_DEV_STOP", + "ROAM_FW_OFFLOAD_ENABLE", + "ROAM_CANDIDATE_SSID_MATCH", + "ROAM_CANDIDATE_SECURITY_MATCH", + "ROAM_LOW_RSSI_INTERRUPT", + "ROAM_HIGH_RSSI_INTERRUPT", + "ROAM_SCAN_REQUESTED", + "ROAM_BETTER_CANDIDATE_FOUND", + "ROAM_BETTER_AP_EVENT", + "ROAM_CANCEL_LOW_PRIO_SCAN", + "ROAM_FINAL_BMISS_RECVD", + "ROAM_CONFIG_SCAN_MODE", + "ROAM_DBGID_DEFINITION_END" }, { "RESMGR_CHMGR_DEFINITION_START", @@ -554,6 +543,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "RESMGR_CHMGR_RESUME_COMPLETE", "RESMGR_CHMGR_VDEV_PAUSE", "RESMGR_CHMGR_VDEV_UNPAUSE", + "RESMGR_CHMGR_CTS2S_TX_COMP", + "RESMGR_CHMGR_CFEND_TX_COMP", "RESMGR_CHMGR_DEFINITION_END" }, { @@ -608,6 +599,15 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "RESMGR_VC_REG_UNREG_LINK", "RESMGR_VC_PRINT_LINK", "RESMGR_OCS_MISS_TOLERANCE", + "RESMGR_DYN_SCH_ALLOCRAM_SIZE", + "RESMGR_DYN_SCH_ENABLE", + "RESMGR_DYN_SCH_ACTIVE", + "RESMGR_DYN_SCH_CH_STATS_START", + "RESMGR_DYN_SCH_CH_SX_STATS", + "RESMGR_DYN_SCH_TOT_UTIL_PER", + "RESMGR_DYN_SCH_HOME_CH_QUOTA", + "RESMGR_OCS_REG_RECAL_QUOTA_NOTIF", + "RESMGR_OCS_DEREG_RECAL_QUOTA_NOTIF", "RESMGR_DEFINITION_END" }, { @@ -627,23 +627,35 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "VDEV_MGR_VDEV_START_OCS_HP_REQ_COMPLETE", "VDEV_MGR_VDEV_START_OCS_HP_REQ_STOP", "VDEV_MGR_HP_START_TIME", + "VDEV_MGR_VDEV_PAUSE_DELAY_UPDATE", + "VDEV_MGR_VDEV_PAUSE_FAIL", + "VDEV_MGR_GEN_PERIODIC_NOA", "VDEV_MGR_DEFINITION_END", }, { - "SCAN_START_COMMAND_FAILED", /* scan */ - "SCAN_STOP_COMMAND_FAILED", - "SCAN_EVENT_SEND_FAILED", - "SCAN_ENGINE_START", - "SCAN_ENGINE_CANCEL_COMMAND", - "SCAN_ENGINE_STOP_DUE_TO_TIMEOUT", - "SCAN_EVENT_SEND_TO_HOST", - "SCAN_FWLOG_EVENT_ADD", - "SCAN_FWLOG_EVENT_REM", - "SCAN_FWLOG_EVENT_PREEMPTED", - "SCAN_FWLOG_EVENT_RESTARTED", - "SCAN_FWLOG_EVENT_COMPLETED", + "SCAN_START_COMMAND_FAILED", /* scan */ + "SCAN_STOP_COMMAND_FAILED", + "SCAN_EVENT_SEND_FAILED", + "SCAN_ENGINE_START", + "SCAN_ENGINE_CANCEL_COMMAND", + "SCAN_ENGINE_STOP_DUE_TO_TIMEOUT", + "SCAN_EVENT_SEND_TO_HOST", + "SCAN_FWLOG_EVENT_ADD", + "SCAN_FWLOG_EVENT_REM", + "SCAN_FWLOG_EVENT_PREEMPTED", + "SCAN_FWLOG_EVENT_RESTARTED", + "SCAN_FWLOG_EVENT_COMPLETED", }, - { "" /* Rate ctrl*/ + { + "RATECTRL_DBGID_DEFINITION_START", /* Rate ctrl*/ + "RATECTRL_DBGID_ASSOC", + "RATECTRL_DBGID_NSS_CHANGE", + "RATECTRL_DBGID_CHAINMASK_ERR", + "RATECTRL_DBGID_UNEXPECTED_FRAME", + "RATECTRL_DBGID_WAL_RCQUERY", + "RATECTRL_DBGID_WAL_RCUPDATE", + "RATECTRL_DBGID_GTX_UPDATE", + "RATECTRL_DBGID_DEFINITION_END" }, { "AP_PS_DBGID_DEFINITION_START", @@ -663,6 +675,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "AP_PS_DBGID_UAPSD_RESPONSE", "AP_PS_DBGID_SEND_COMPLETE", "AP_PS_DBGID_SEND_N_COMPLETE", + "AP_PS_DBGID_DETECT_OUT_OF_SYNC_STA", + "AP_PS_DBGID_DELIVER_CAB", }, { "" /* Block Ack */ @@ -683,11 +697,11 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = { "" /* HOST */ }, { "" /* BEACON */ - "BEACON_EVENT_SWBA_SEND_FAILED", - "BEACON_EVENT_EARLY_RX_BMISS_STATUS", - "BEACON_EVENT_EARLY_RX_SLEEP_SLOP", - "BEACON_EVENT_EARLY_RX_CONT_BMISS_TIMEOUT", - "BEACON_EVENT_EARLY_RX_PAUSE_SKIP_BCN_NUM", + "BEACON_EVENT_SWBA_SEND_FAILED", + "BEACON_EVENT_EARLY_RX_BMISS_STATUS", + "BEACON_EVENT_EARLY_RX_SLEEP_SLOP", + "BEACON_EVENT_EARLY_RX_CONT_BMISS_TIMEOUT", + "BEACON_EVENT_EARLY_RX_PAUSE_SKIP_BCN_NUM", }, { /* Offload Mgr */ "OFFLOAD_MGR_DBGID_DEFINITION_START", @@ -754,6 +768,10 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WAL_DBGID_TX_MGMT_COMP_DESCID_STATUS", "WAL_DBGID_TX_DATA_COMP_MSDUID_STATUS", "WAL_DBGID_RESET_PCU_CYCLE_CNT", + "WAL_DBGID_SETUP_RSSI_INTERRUPTS", + "WAL_DBGID_BRSSI_CONFIG", + "WAL_DBGID_CURRENT_BRSSI_AVE", + "WAL_DBGID_BCN_TX_COMP", "WAL_DBGID_DEFINITION_END", }, { @@ -763,7 +781,28 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "" /* pcie lp */ }, { - "" /* RTT */ + /* RTT */ + "RTT_CALL_FLOW", + "RTT_REQ_SUB_TYPE", + "RTT_MEAS_REQ_HEAD", + "RTT_MEAS_REQ_BODY", + "", + "", + "RTT_INIT_GLOBAL_STATE", + "", + "RTT_REPORT", + "", + "RTT_ERROR_REPORT", + "RTT_TIMER_STOP", + "RTT_SEND_TM_FRAME", + "RTT_V3_RESP_CNT", + "RTT_V3_RESP_FINISH", + "RTT_CHANNEL_SWITCH_REQ", + "RTT_CHANNEL_SWITCH_GRANT", + "RTT_CHANNEL_SWITCH_COMPLETE", + "RTT_CHANNEL_SWITCH_PREEMPT", + "RTT_CHANNEL_SWITCH_STOP", + "RTT_TIMER_START", }, { /* RESOURCE */ "RESOURCE_DBGID_DEFINITION_START", @@ -784,7 +823,24 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "" }, { /* ANI */ - "" + "ANI_DBGID_POLL", + "ANI_DBGID_CONTROL", + "ANI_DBGID_OFDM_PARAMS", + "ANI_DBGID_CCK_PARAMS", + "ANI_DBGID_RESET", + "ANI_DBGID_RESTART", + "ANI_DBGID_OFDM_LEVEL", + "ANI_DBGID_CCK_LEVEL", + "ANI_DBGID_FIRSTEP", + "ANI_DBGID_CYCPWR", + "ANI_DBGID_MRC_CCK", + "ANI_DBGID_SELF_CORR_LOW", + "ANI_DBGID_ENABLE", + "ANI_DBGID_CURRENT_LEVEL", + "ANI_DBGID_POLL_PERIOD", + "ANI_DBGID_LISTEN_PERIOD", + "ANI_DBGID_OFDM_LEVEL_CFG", + "ANI_DBGID_CCK_LEVEL_CFG" }, { "P2P_DBGID_DEFINITION_START", @@ -823,6 +879,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "P2P_GO_NOA_NOTIF", "P2P_GO_TBTT_OFFSET", "P2P_GO_GET_NOA_INFO", + "P2P_GO_ADD_ONE_SHOT_NOA", + "P2P_GO_GET_NOA_IE", "P2P_DBGID_DEFINITION_END", }, { @@ -839,6 +897,7 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "CSA_OFFLOAD_WMI_EVENT_ERROR", "CSA_OFFLOAD_WMI_EVENT_SENT", "CSA_OFFLOAD_WMI_CHANSWITCH_RECV", + "CSA_DBGID_DEFINITION_END", }, { /* NLO offload */ "" @@ -851,6 +910,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WLAN_CHATTER_FILTER_MISS", "WLAN_CHATTER_FILTER_FULL", "WLAN_CHATTER_FILTER_TM_ADJ", + "WLAN_CHATTER_BUFFER_FULL", + "WLAN_CHATTER_TIMEOUT", "WLAN_CHATTER_DBGID_DEFINITION_END", }, { @@ -865,6 +926,7 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WOW_INIT", "WOW_RECV_MAGIC_PKT", "WOW_RECV_BITMAP_PATTERN", + "WOW_DBGID_DEFINITION_END", }, { /* WAL VDEV */ "" @@ -877,9 +939,18 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "TP_LOCAL_SEND", }, { /* STA SMPS */ - "" + "STA_SMPS_DBGID_DEFINITION_START", + "STA_SMPS_DBGID_CREATE_PDEV_INSTANCE", + "STA_SMPS_DBGID_CREATE_VIRTUAL_CHAN_INSTANCE", + "STA_SMPS_DBGID_DELETE_VIRTUAL_CHAN_INSTANCE", + "STA_SMPS_DBGID_CREATE_STA_INSTANCE", + "STA_SMPS_DBGID_DELETE_STA_INSTANCE", + "STA_SMPS_DBGID_VIRTUAL_CHAN_SMPS_START", + "STA_SMPS_DBGID_VIRTUAL_CHAN_SMPS_STOP", + "STA_SMPS_DBGID_SEND_SMPS_ACTION_FRAME", + "SMPS_DBGID_DEFINITION_END", }, - { + { /* SWBMISS */ "SWBMISS_DBGID_DEFINITION_START", "SWBMISS_ENABLED", "SWBMISS_DISABLED", @@ -910,6 +981,45 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "TDLS_DBGID_PEER_EVT_DISCOVER", "TDLS_DBGID_PEER_EVT_DELETE", }, + { /* HB */ + "WLAN_HB_DBGID_DEFINITION_START", + "WLAN_HB_DBGID_INIT", + "WLAN_HB_DBGID_TCP_GET_TXBUF_FAIL", + "WLAN_HB_DBGID_TCP_SEND_FAIL", + "WLAN_HB_DBGID_BSS_PEER_NULL", + "WLAN_HB_DBGID_UDP_GET_TXBUF_FAIL", + "WLAN_HB_DBGID_UDP_SEND_FAIL", + "WLAN_HB_DBGID_WMI_CMD_INVALID_PARAM", + "WLAN_HB_DBGID_WMI_CMD_INVALID_OP", + "WLAN_HB_DBGID_WOW_NOT_ENTERED", + "WLAN_HB_DBGID_ALLOC_SESS_FAIL", + "WLAN_HB_DBGID_CTX_NULL", + "WLAN_HB_DBGID_CHKSUM_ERR", + "WLAN_HB_DBGID_UDP_TX", + "WLAN_HB_DBGID_TCP_TX", + "WLAN_HB_DBGID_DEFINITION_END", + }, + { /* TXBF */ + "TXBFEE_DBGID_START", + "TXBFEE_DBGID_NDPA_RECEIVED", + "TXBFEE_DBGID_HOST_CONFIG_TXBFEE_TYPE", + "TXBFER_DBGID_SEND_NDPA", + "TXBFER_DBGID_GET_NDPA_BUF_FAIL", + "TXBFER_DBGID_SEND_NDPA_FAIL", + "TXBFER_DBGID_GET_NDP_BUF_FAIL", + "TXBFER_DBGID_SEND_NDP_FAIL", + "TXBFER_DBGID_GET_BRPOLL_BUF_FAIL", + "TXBFER_DBGID_SEND_BRPOLL_FAIL", + "TXBFER_DBGID_HOST_CONFIG_CMDID", + "TXBFEE_DBGID_HOST_CONFIG_CMDID", + "TXBFEE_DBGID_ENABLED_ENABLED_UPLOAD_H", + "TXBFEE_DBGID_UPLOADH_CV_TAG", + "TXBFEE_DBGID_UPLOADH_H_TAG", + "TXBFEE_DBGID_CAPTUREH_RECEIVED", + "TXBFEE_DBGID_PACKET_IS_STEERED", + "TXBFEE_UPLOADH_EVENT_ALLOC_MEM_FAIL", + "TXBFEE_DBGID_END", + }, }; int dbglog_module_log_enable(wmi_unified_t wmi_handle, A_UINT32 mod_id, @@ -1587,6 +1697,11 @@ dbglog_sta_powersave_print_handler( { "RX_WAKE_POLICY", 0 }, { "DELAYED_PAUSE_RX_LEAK", 1 }, { "TXRX_INACTIVITY_BLOCKED_RETRY", 1 }, + { "SPEC_WAKE_INTERVAL", 1 }, + { "MAX_SPEC_NODATA_PSPOLL", 0 }, + { "ESTIMATED_PSPOLL_RESP_TIME", 1 }, + { "QPOWER_MAX_PSPOLL_BEFORE_WAKE", 0 }, + { "QPOWER_ENABLE", 0 }, }; A_UINT32 param = args[0]; A_UINT32 value = args[1]; @@ -2577,6 +2692,89 @@ A_BOOL dbglog_smps_print_handler(A_UINT32 mod_id, } +A_BOOL +dbglog_p2p_print_handler( + A_UINT32 mod_id, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + static const char *states[] = { + "ACTIVE", + "DOZE", + "TX_BCN", + "CTWIN", + "OPPPS", + }; + + static const char *events[] = { + "ONESHOT_NOA", + "CTWINDOW", + "PERIODIC_NOA", + "IDLE", + "NOA_CHANGED", + "TBTT", + "TX_BCN_CMP", + "OPPPS_OK", + "OPPPS_CHANGED", + }; + + switch (dbg_id) { + case DBGLOG_DBGID_SM_FRAMEWORK_PROXY_DBGLOG_MSG: + dbglog_sm_print(timestamp, vap_id, numargs, args, "P2P GO PS", + states, ARRAY_LENGTH(states), events, ARRAY_LENGTH(events)); + break; + default: + return FALSE; + } + + return TRUE; +} + +A_BOOL +dbglog_pcielp_print_handler( + A_UINT32 mod_id, + A_UINT16 vap_id, + A_UINT32 dbg_id, + A_UINT32 timestamp, + A_UINT16 numargs, + A_UINT32 *args) +{ + static const char *states[] = { + "STOP", + "TX", + "RX", + "SLEEP", + "SUSPEND", + }; + + static const char *events[] = { + "VDEV_UP", + "ALL_VDEV_DOWN", + "AWAKE", + "SLEEP", + "TX_ACTIVITY", + "TX_INACTIVITY", + "TX_AC_CHANGE", + "SUSPEND", + "RESUME", + }; + + switch (dbg_id) { + case DBGLOG_DBGID_SM_FRAMEWORK_PROXY_DBGLOG_MSG: + dbglog_sm_print(timestamp, vap_id, numargs, args, "PCIELP", + states, ARRAY_LENGTH(states), events, ARRAY_LENGTH(events)); + break; + default: + return FALSE; + } + + return TRUE; +} + + #ifdef WLAN_OPEN_SOURCE static int dbglog_block_open(struct inode *inode, struct file *file) { @@ -2764,6 +2962,8 @@ dbglog_init(wmi_unified_t wmi_handle) dbglog_reg_modprint(WLAN_MODULE_BEACON,dbglog_beacon_print_handler); dbglog_reg_modprint(WLAN_MODULE_DATA_TXRX,dbglog_data_txrx_print_handler); dbglog_reg_modprint(WLAN_MODULE_STA_SMPS, dbglog_smps_print_handler); + dbglog_reg_modprint(WLAN_MODULE_P2P, dbglog_p2p_print_handler); + dbglog_reg_modprint(WLAN_MODULE_PCIELP, dbglog_pcielp_print_handler); res = wmi_unified_register_event_handler(wmi_handle, WMI_DEBUG_MESG_EVENTID, dbglog_parse_debug_logs); diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index f93842e89481..032614e74580 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -88,6 +88,7 @@ #include "bmi.h" #include "ol_fw.h" #include "ol_if_athvar.h" +#include "if_pci.h" #else #include "htc_api.h" #endif /* #ifndef QCA_WIFI_ISOC */ @@ -387,6 +388,8 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize ) macOpenParms.driverType = eDRIVER_TYPE_PRODUCTION; macOpenParms.powersaveOffloadEnabled = pHddCtx->cfg_ini->enablePowersaveOffload; + macOpenParms.wowEnable = pHddCtx->cfg_ini->wowEnable; + macOpenParms.maxWoWFilters = pHddCtx->cfg_ini->maxWoWFilters; vStatus = WDA_open( gpVosContext, gpVosContext->pHDDContext, #ifndef QCA_WIFI_ISOC hdd_update_tgt_cfg, @@ -671,12 +674,15 @@ VOS_STATUS vos_preStart( v_CONTEXT_t vosContext ) { VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_FATAL, "Failed to get ready event from target firmware"); + HTCSetTargetToSleep(vos_get_context(VOS_MODULE_ID_HIF, gpVosContext)); macStop(gpVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP); ccmStop(gpVosContext->pMACContext); HTCStop(gpVosContext->htc_ctx); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAILURE; } + + HTCSetTargetToSleep(vos_get_context(VOS_MODULE_ID_HIF, gpVosContext)); #endif #endif /* QCA_WIFI_2_0 */ @@ -950,6 +956,9 @@ VOS_STATUS vos_stop( v_CONTEXT_t vosContext ) VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) ); } +#ifndef QCA_WIFI_ISOC + hif_disable_isr(((VosContextType*)vosContext)->pHIFContext); +#endif return VOS_STATUS_SUCCESS; } @@ -2146,6 +2155,37 @@ VOS_STATUS vos_shutdown(v_CONTEXT_t vosContext) VOS_ASSERT( VOS_IS_STATUS_SUCCESS( vosStatus ) ); } +#if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) + if (TRUE == WDA_needShutdown(vosContext)) + { + /* If WDA stop failed, call WDA shutdown to cleanup WDA/WDI. */ + vosStatus = WDA_shutdown(vosContext, VOS_TRUE); + if (!VOS_IS_STATUS_SUCCESS(vosStatus)) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, + "%s: Failed to shutdown WDA!", __func__); + VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus)); + } + } + else + { + vosStatus = WDA_close(vosContext); + if (!VOS_IS_STATUS_SUCCESS(vosStatus)) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: Failed to close WDA!", __func__); + VOS_ASSERT(VOS_IS_STATUS_SUCCESS(vosStatus)); + } + } + + if (gpVosContext->htc_ctx) + { + HTCStop(gpVosContext->htc_ctx); + HTCDestroy(gpVosContext->htc_ctx); + gpVosContext->htc_ctx = NULL; + } +#endif + #ifndef QCA_WIFI_2_0 /* Let DXE return packets in WDA_close and then free them here */ vosStatus = vos_packet_close( vosContext ); diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c index 7d95618447f9..19fe723b3176 100644 --- a/CORE/VOSS/src/vos_sched.c +++ b/CORE/VOSS/src/vos_sched.c @@ -763,7 +763,7 @@ VosWDThread VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "%s: Trying to do WLAN re-init when it is not shutdown !!",__func__); } - vosStatus = hdd_wlan_re_init(); + vosStatus = hdd_wlan_re_init(NULL); if (! VOS_IS_STATUS_SUCCESS(vosStatus)) { diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h index c8708a4a62bb..cb72f2c023d0 100644 --- a/CORE/WDA/inc/legacy/halMsgApi.h +++ b/CORE/WDA/inc/legacy/halMsgApi.h @@ -36,6 +36,7 @@ /* operMode in ADD BSS message */ #define BSS_OPERATIONAL_MODE_AP 0 #define BSS_OPERATIONAL_MODE_STA 1 +#define BSS_OPERATIONAL_MODE_IBSS 2 /* STA entry type in add sta message */ #define STA_ENTRY_SELF 0 @@ -296,6 +297,7 @@ typedef struct tANI_U16 ht_caps; tANI_U32 vht_caps; tSirNwType nwType; + tPowerdBm maxTxPower; } tAddStaParams, *tpAddStaParams; @@ -1002,6 +1004,8 @@ typedef struct tANI_U16 staIdx; tANI_U16 tspecIdx; //TSPEC identifier uniquely identifying a TSPEC for a STA in a BSS tSirMacAddr bssId; //TO SUPPORT BT-AMP + tANI_U8 sessionId; + tANI_U8 userPrio; //TSPEC identifier uniquely identifying a TSPEC for a STA in a BSS } tDelTsParams, *tpDelTsParams; diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h index 9e33c81333d5..0d9289a82680 100644 --- a/CORE/WDA/inc/wlan_qct_wda.h +++ b/CORE/WDA/inc/wlan_qct_wda.h @@ -468,6 +468,7 @@ VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext, #ifdef QCA_WIFI_2_0 #define WDA_start wma_start +#define WDA_MapChannel wma_map_channel #ifdef QCA_WIFI_ISOC #define WDA_NVDownload_Start wma_nv_download_start @@ -560,6 +561,8 @@ VOS_STATUS WDA_PostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg) ; */ tBssSystemRole wdaGetGlobalSystemRole(tpAniSirGlobal pMac); +tANI_U8 WDA_MapChannel(tANI_U8); + /* maximum wait time for WDA complete event (correct value has to be derived) * for now giving the value 1000 ms */ #define WDA_WDI_COMPLETION_TIME_OUT 30000 /* in ms */ diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c index 57e2bed840ec..7a014a5b26a5 100644 --- a/CORE/WDA/src/wlan_qct_wda.c +++ b/CORE/WDA/src/wlan_qct_wda.c @@ -75,6 +75,16 @@ #include "vos_sched.h" #include "pttMsgApi.h" #include "wlan_qct_sys.h" + +/* 11A Channel list to decode RX BD channel information */ +static const tANI_U8 abChannel[]= {36,40,44,48,52,56,60,64,100,104,108,112,116, + 120,124,128,132,136,140,149,153,157,161,165}; + +#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD +static const tANI_U8 aUnsortedChannelList[]= {52,56,60,64,100,104,108,112,116, + 120,124,128,132,136,140,36,40,44,48,149,153,157,161,165}; +#endif + /* Used MACRO's */ /* Get WDA context from vOSS module */ #define VOS_GET_WDA_CTXT(a) vos_get_context(VOS_MODULE_ID_WDA, a) @@ -13720,3 +13730,15 @@ void WDA_SetEnableSSR(v_BOOL_t enableSSR) { WDI_SetEnableSSR(enableSSR); } + +tANI_U8 WDA_MapChannel(tANI_U8 mapChannel) +{ + if(mapChannel > 0 && mapChannel < 25) +#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD + if(IS_ROAM_SCAN_OFFLOAD_FEATURE_ENABLE) + return aUnsortedChannelList[mapChannel - 1]; +#endif + return abChannel[mapChannel - 1]; + else + return 0; +} @@ -87,6 +87,9 @@ CONFIG_HIF_PCI := 1 #Enable pci read/write config functions CONFIG_ATH_PCI := 1 +#Enable IBSS support on CLD +CONFIG_QCA_IBSS_SUPPORT := 1 + #Enable power management suspend/resume functionality to PCI CONFIG_ATH_BUS_PM := 1 @@ -960,6 +963,10 @@ CDEFINES += -DQCA_ISOC_PRONTO endif endif +ifeq ($(CONFIG_QCA_IBSS_SUPPORT), 1) +CDEFINES += -DQCA_IBSS_SUPPORT +endif + #Enable Encap/Decap on host ifeq ($(CONFIG_SUPPORT_SW_TXRX_ENCAP), 1) CDEFINES += -DQCA_SUPPORT_SW_TXRX_ENCAP diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini index 23ccb7831ef2..b64cc86bcf6b 100644 --- a/firmware_bin/WCNSS_qcom_cfg.ini +++ b/firmware_bin/WCNSS_qcom_cfg.ini @@ -145,7 +145,7 @@ gFixedRate=0 # RTS threshold -RTSThreshold=2347 +RTSThreshold=192000 # Intra-BSS forward @@ -438,6 +438,17 @@ gRrmOperChanMax=8 gRrmNonOperChanMax=8 gRrmRandIntvl=100 +# WOW Enable/Disable. +# 0 - Disable both magic pattern match and pattern byte match. +# 1 - Enable magic pattern match on all interfaces. +# 2 - Enable pattern byte match on all interfaces. +# 3 - Enable both magic patter and pattern byte match on all interfaces. +# Default value of gEnableWoW is 3. +# gEnableWoW=0 + +# Maximum number of wow filters required +#gMaxWoWFilters=22 + END # Note: Configuration parser would not read anything past the END marker diff --git a/tools/fwdebuglog/cld-fwlog-parser.c b/tools/fwdebuglog/cld-fwlog-parser.c index 87f5450acbe2..e66d8df1d890 100644 --- a/tools/fwdebuglog/cld-fwlog-parser.c +++ b/tools/fwdebuglog/cld-fwlog-parser.c @@ -117,6 +117,8 @@ const char *dbglog_get_module_str(A_UINT32 module_id) return "STA_SMPS"; case WLAN_MODULE_TDLS: return "TDLS"; + case WLAN_MODULE_P2P: + return "P2P"; default: return "UNKNOWN"; } @@ -494,37 +496,39 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "COEX_DEBUG_MESSAGE_END" }, { - "RO_DBGID_DEFINITION_START", - "RO_REFRESH_ROAM_TABLE", - "RO_UPDATE_ROAM_CANDIDATE", - "RO_UPDATE_ROAM_CANDIDATE_CB", - "RO_UPDATE_ROAM_CANDIDATE_FINISH", - "RO_REFRESH_ROAM_TABLE_DONE", - "RO_PERIODIC_SEARCH_CB", - "RO_PERIODIC_SEARCH_TIMEOUT", - "RO_INIT", - "RO_BMISS_STATE1", - "RO_BMISS_STATE2", - "RO_SET_PERIODIC_SEARCH_ENABLE", - "RO_SET_PERIODIC_SEARCH_DISABLE", - "RO_ENABLE_SQ_THRESHOLD", - "RO_DISABLE_SQ_THRESHOLD", - "RO_ADD_BSS_TO_ROAM_TABLE", - "RO_SET_PERIODIC_SEARCH_MODE", - "RO_CONFIGURE_SQ_THRESHOLD1", - "RO_CONFIGURE_SQ_THRESHOLD2", - "RO_CONFIGURE_SQ_PARAMS", - "RO_LOW_SIGNAL_QUALITY_EVENT", - "RO_HIGH_SIGNAL_QUALITY_EVENT", - "RO_REMOVE_BSS_FROM_ROAM_TABLE", - "RO_UPDATE_CONNECTION_STATE_METRIC", - "RO_LOWRSSI_SCAN_PARAMS", - "RO_LOWRSSI_SCAN_START", - "RO_LOWRSSI_SCAN_END", - "RO_LOWRSSI_SCAN_CANCEL", - "RO_LOWRSSI_ROAM_CANCEL", - "RO_REFRESH_ROAM_CANDIDATE", - "RO_DBGID_DEFINITION_END" + "ROAM_DBGID_DEFINITION_START", + "ROAM_MODULE_INIT", + "ROAM_DEV_START", + "ROAM_CONFIG_RSSI_THRESH", + "ROAM_CONFIG_SCAN_PERIOD", + "ROAM_CONFIG_AP_PROFILE", + "ROAM_CONFIG_CHAN_LIST", + "ROAM_CONFIG_SCAN_PARAMS", + "ROAM_CONFIG_RSSI_CHANGE", + "ROAM_SCAN_TIMER_START", + "ROAM_SCAN_TIMER_EXPIRE", + "ROAM_SCAN_TIMER_STOP", + "ROAM_SCAN_STARTED", + "ROAM_SCAN_COMPLETE", + "ROAM_SCAN_CANCELLED", + "ROAM_CANDIDATE_FOUND", + "ROAM_RSSI_ACTIVE_SCAN", + "ROAM_RSSI_ACTIVE_ROAM", + "ROAM_RSSI_GOOD", + "ROAM_BMISS_FIRST_RECV", + "ROAM_DEV_STOP", + "ROAM_FW_OFFLOAD_ENABLE", + "ROAM_CANDIDATE_SSID_MATCH", + "ROAM_CANDIDATE_SECURITY_MATCH", + "ROAM_LOW_RSSI_INTERRUPT", + "ROAM_HIGH_RSSI_INTERRUPT", + "ROAM_SCAN_REQUESTED", + "ROAM_BETTER_CANDIDATE_FOUND", + "ROAM_BETTER_AP_EVENT", + "ROAM_CANCEL_LOW_PRIO_SCAN", + "ROAM_FINAL_BMISS_RECVD", + "ROAM_CONFIG_SCAN_MODE", + "ROAM_DBGID_DEFINITION_END" }, { "RESMGR_CHMGR_DEFINITION_START", @@ -533,6 +537,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "RESMGR_CHMGR_RESUME_COMPLETE", "RESMGR_CHMGR_VDEV_PAUSE", "RESMGR_CHMGR_VDEV_UNPAUSE", + "RESMGR_CHMGR_CTS2S_TX_COMP", + "RESMGR_CHMGR_CFEND_TX_COMP", "RESMGR_CHMGR_DEFINITION_END" }, { @@ -587,6 +593,15 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "RESMGR_VC_REG_UNREG_LINK", "RESMGR_VC_PRINT_LINK", "RESMGR_OCS_MISS_TOLERANCE", + "RESMGR_DYN_SCH_ALLOCRAM_SIZE", + "RESMGR_DYN_SCH_ENABLE", + "RESMGR_DYN_SCH_ACTIVE", + "RESMGR_DYN_SCH_CH_STATS_START", + "RESMGR_DYN_SCH_CH_SX_STATS", + "RESMGR_DYN_SCH_TOT_UTIL_PER", + "RESMGR_DYN_SCH_HOME_CH_QUOTA", + "RESMGR_OCS_REG_RECAL_QUOTA_NOTIF", + "RESMGR_OCS_DEREG_RECAL_QUOTA_NOTIF", "RESMGR_DEFINITION_END" }, { @@ -606,6 +621,9 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "VDEV_MGR_VDEV_START_OCS_HP_REQ_COMPLETE", "VDEV_MGR_VDEV_START_OCS_HP_REQ_STOP", "VDEV_MGR_HP_START_TIME", + "VDEV_MGR_VDEV_PAUSE_DELAY_UPDATE", + "VDEV_MGR_VDEV_PAUSE_FAIL", + "VDEV_MGR_GEN_PERIODIC_NOA", "VDEV_MGR_DEFINITION_END", }, { @@ -733,6 +751,10 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WAL_DBGID_TX_MGMT_COMP_DESCID_STATUS", "WAL_DBGID_TX_DATA_COMP_MSDUID_STATUS", "WAL_DBGID_RESET_PCU_CYCLE_CNT", + "WAL_DBGID_SETUP_RSSI_INTERRUPTS", + "WAL_DBGID_BRSSI_CONFIG", + "WAL_DBGID_CURRENT_BRSSI_AVE", + "WAL_DBGID_BCN_TX_COMP", "WAL_DBGID_DEFINITION_END", }, { @@ -802,6 +824,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "P2P_GO_NOA_NOTIF", "P2P_GO_TBTT_OFFSET", "P2P_GO_GET_NOA_INFO", + "P2P_GO_ADD_ONE_SHOT_NOA", + "P2P_GO_GET_NOA_IE", "P2P_DBGID_DEFINITION_END", }, { @@ -830,6 +854,8 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = "WLAN_CHATTER_FILTER_MISS", "WLAN_CHATTER_FILTER_FULL", "WLAN_CHATTER_FILTER_TM_ADJ", + "WLAN_CHATTER_BUFFER_FULL", + "WLAN_CHATTER_TIMEOUT", "WLAN_CHATTER_DBGID_DEFINITION_END", }, { @@ -1277,6 +1303,11 @@ dbglog_sta_powersave_print_handler( { "RX_WAKE_POLICY", 0 }, { "DELAYED_PAUSE_RX_LEAK", 1 }, { "TXRX_INACTIVITY_BLOCKED_RETRY", 1 }, + { "SPEC_WAKE_INTERVAL", 1 }, + { "MAX_SPEC_NODATA_PSPOLL", 0 }, + { "ESTIMATED_PSPOLL_RESP_TIME", 1 }, + { "QPOWER_MAX_PSPOLL_BEFORE_WAKE", 0 }, + { "QPOWER_ENABLE", 0 }, }; A_UINT32 param = args[0]; A_UINT32 value = args[1]; |
