summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2013-12-04 06:47:51 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2013-12-04 06:47:51 -0800
commit85095b353cf04ab9cf879b9e22131b09117bc671 (patch)
tree9164dec761652f639d4721e1094a2b2fa74dd9ed
parent527ae6e1cdd2b330b25c2b225760ac42f22f3f8d (diff)
parent91e8d0f56544c7190831e74d6e48f3deabbefc6b (diff)
Merge "Merge remote-tracking branch 'origin/caf/caf-wlan/master'"
-rw-r--r--CORE/HDD/inc/qc_sap_ioctl.h15
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h25
-rw-r--r--CORE/HDD/inc/wlan_hdd_power.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c15
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c26
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c69
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c107
-rw-r--r--CORE/HDD/src/wlan_hdd_ftm.c27
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c139
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c33
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c54
-rw-r--r--CORE/HDD/src/wlan_hdd_wowl.c8
-rw-r--r--CORE/MAC/inc/aniGlobal.h11
-rw-r--r--CORE/MAC/inc/qwlan_version.h8
-rw-r--r--CORE/MAC/inc/sirApi.h1
-rw-r--r--CORE/MAC/inc/wniCfgAp.h20
-rw-r--r--CORE/MAC/inc/wniCfgSta.h10
-rw-r--r--CORE/MAC/src/cfg/cfgUtil/cfg.txt4
-rw-r--r--CORE/MAC/src/pe/include/limSession.h3
-rw-r--r--CORE/MAC/src/pe/include/rrmGlobal.h5
-rw-r--r--CORE/MAC/src/pe/lim/limAdmitControl.c21
-rw-r--r--CORE/MAC/src/pe/lim/limAssocUtils.c13
-rw-r--r--CORE/MAC/src/pe/lim/limFT.c7
-rw-r--r--CORE/MAC/src/pe/lim/limIbssPeerMgmt.c8
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMessageQueue.c17
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c2
-rw-r--r--CORE/MAC/src/pe/lim/limSerDesUtils.c7
-rw-r--r--CORE/MAC/src/pe/lim/limUtils.c19
-rw-r--r--CORE/MAC/src/pe/rrm/rrmApi.c177
-rw-r--r--CORE/MAC/src/pe/sch/schBeaconGen.c5
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c171
-rw-r--r--CORE/SERVICES/BMI/ol_fw.h18
-rw-r--r--CORE/SERVICES/COMMON/dbglog_id.h43
-rw-r--r--CORE/SERVICES/COMMON/hif.h11
-rw-r--r--CORE/SERVICES/COMMON/htc_api.h1
-rw-r--r--CORE/SERVICES/COMMON/wlan_module_ids.h2
-rw-r--r--CORE/SERVICES/COMMON/wlan_tgt_def_config.h5
-rw-r--r--CORE/SERVICES/COMMON/wma_api.h6
-rw-r--r--CORE/SERVICES/COMMON/wmi_services.h3
-rw-r--r--CORE/SERVICES/COMMON/wmi_tlv_defs.h81
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h204
-rw-r--r--CORE/SERVICES/COMMON/wmi_version.h2
-rw-r--r--CORE/SERVICES/HIF/PCIe/copy_engine.c28
-rw-r--r--CORE/SERVICES/HIF/PCIe/copy_engine_api.h3
-rw-r--r--CORE/SERVICES/HIF/PCIe/copy_engine_internal.h1
-rw-r--r--CORE/SERVICES/HIF/PCIe/hif_pci.c11
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c390
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.h4
-rw-r--r--CORE/SERVICES/HTC/htc.c11
-rw-r--r--CORE/SERVICES/WMA/wma.c1665
-rw-r--r--CORE/SERVICES/WMA/wma.h28
-rw-r--r--CORE/SME/inc/csrApi.h3
-rw-r--r--CORE/SME/inc/csrInternal.h2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c22
-rw-r--r--CORE/SME/src/rrm/sme_rrm.c99
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c3
-rw-r--r--CORE/UTILS/FWLOG/dbglog_host.c434
-rw-r--r--CORE/VOSS/src/vos_api.c40
-rw-r--r--CORE/VOSS/src/vos_sched.c2
-rw-r--r--CORE/WDA/inc/legacy/halMsgApi.h4
-rw-r--r--CORE/WDA/inc/wlan_qct_wda.h3
-rw-r--r--CORE/WDA/src/wlan_qct_wda.c22
-rwxr-xr-xKbuild7
-rw-r--r--firmware_bin/WCNSS_qcom_cfg.ini13
-rw-r--r--tools/fwdebuglog/cld-fwlog-parser.c93
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*) &reg_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;
+}
diff --git a/Kbuild b/Kbuild
index b9c2c4b73ad0..7314e91a5651 100755
--- a/Kbuild
+++ b/Kbuild
@@ -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];