summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPitani Venkata Rajesh Kumar <vpitan@codeaurora.org>2014-06-10 18:42:35 +0530
committerPitani Venkata Rajesh Kumar <vpitan@codeaurora.org>2014-06-10 18:45:51 +0530
commitfd4552d2f5ffd7962f0e3bf2be935f490275da24 (patch)
tree8976def29a0b8e32a5ab55bb1fd31437f4011f09
parent2b0968cafd644be3ad810905386791a281aa9db9 (diff)
parent4bedb6a5d35e5256b1d35a318e8201a31089bf0d (diff)
Release 1.0.0.122 QCACLD WLAN Driver
Merge remote-tracking branch 'origin/caf/caf-wlan/master' * origin/caf/caf-wlan/master: Cafstaging Release 1.0.0.122 qcacld: wlan: complete IBSS Power Save Support qcacld: CL 971478 972063 - update fw common interface files qcacld: Add ini item to support for IBSS power save Fix for UDP-UL data-stall on ROME3.1 qcacld: CL 955960 956107 967461 - update fw common interface files qcacld: Log the init time country code qcacld: Send beacon miss after preauth attempts fail qcacld: Fix of HDD getting stuck in disconnecting state qcacld: Different scan ID for roaming scans qcacld: Revert fix for Scan Empty issue qcacld: Serialize roam pre auth events to MC thread qcacld: Improve the logging for scan path. qcacld: send response to SME when switch channel fails. Change-Id: I630ccfc457b2e80c0248595f68ba3dd90707d2f2
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h73
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h4
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c55
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c35
-rwxr-xr-xCORE/HDD/src/wlan_hdd_main.c106
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c21
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c20
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/wniCfgAp.h65
-rw-r--r--CORE/MAC/inc/wniCfgSta.h61
-rw-r--r--CORE/MAC/src/cfg/cfgParamName.c2
-rw-r--r--CORE/MAC/src/cfg/cfgUtil/cfg.txt8
-rw-r--r--CORE/MAC/src/include/sirParams.h2
-rw-r--r--CORE/MAC/src/pe/lim/limFT.c7
-rw-r--r--CORE/SERVICES/COMMON/enet.h4
-rw-r--r--CORE/SERVICES/COMMON/wlan_module_ids.h1
-rw-r--r--CORE/SERVICES/COMMON/wmi_services.h1
-rw-r--r--CORE/SERVICES/COMMON/wmi_tlv_defs.h37
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h139
-rw-r--r--CORE/SERVICES/COMMON/wmi_version.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c261
-rw-r--r--CORE/SERVICES/WMA/wma.h42
-rw-r--r--CORE/SERVICES/WMI/wmi_unified.c2
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c2
-rw-r--r--CORE/SYS/legacy/src/utils/src/parserApi.c9
-rw-r--r--CORE/UTILS/FWLOG/dbglog_host.c359
-rw-r--r--CORE/WDA/inc/wlan_qct_wda.h2
-rwxr-xr-xfirmware_bin/WCNSS_cfg.datbin10778 -> 10810 bytes
28 files changed, 1213 insertions, 111 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 3d7b2a876a56..62f1cbb45c5d 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2377,6 +2377,70 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_COALESING_IN_IBSS_MAX (1)
#define CFG_COALESING_IN_IBSS_DEFAULT (0) //disabled
+#define CFG_IBSS_ATIM_WIN_SIZE_NAME "gIbssATIMWinSize"
+#define CFG_IBSS_ATIM_WIN_SIZE_MIN (0)
+#define CFG_IBSS_ATIM_WIN_SIZE_MAX (50)
+#define CFG_IBSS_ATIM_WIN_SIZE_DEFAULT (0)
+
+/*
+ * Indicates if IBSS Power Save is
+ * supported or not. When not allowed,
+ * IBSS station has to stay awake all
+ * the time and should never set PM=1
+ * in its transmitted frames. This
+ * parameter is meaningful/valid only
+ * when gIbssATIMWinSize is non-zero
+ */
+#define CFG_IBSS_IS_POWER_SAVE_ALLOWED_NAME "gIbssIsPowerSaveAllowed"
+#define CFG_IBSS_IS_POWER_SAVE_ALLOWED_MIN (0)
+#define CFG_IBSS_IS_POWER_SAVE_ALLOWED_MAX (1)
+#define CFG_IBSS_IS_POWER_SAVE_ALLOWED_DEFAULT (1)
+
+/*
+ * Indicates if IBSS Power Collapse
+ * is allowed or not.
+ */
+#define CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_NAME "gIbssIsPowerCollapseAllowed"
+#define CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_MIN (0)
+#define CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_MAX (1)
+#define CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_DEFAULT (1)
+
+/*
+ * This parameter indicates whether IBSS station
+ * can exit power save mode and enter power active
+ * state whenever there is a TX/RX activity.
+ */
+#define CFG_IBSS_AWAKE_ON_TX_RX_NAME "gIbssAwakeOnTxRx"
+#define CFG_IBSS_AWAKE_ON_TX_RX_MIN (0)
+#define CFG_IBSS_AWAKE_ON_TX_RX_MAX (1)
+#define CFG_IBSS_AWAKE_ON_TX_RX_DEFAULT (0)
+
+/*
+ * In IBSS mode if Awake on TX/RX activity is enabled
+ * Ibss Inactivity parameter indicates the data
+ * inactivity time in number of beacon intervals
+ * after which IBSS station re-inters power save
+ * by sending Null frame with PM=1
+ */
+#define CFG_IBSS_INACTIVITY_TIME_NAME "gIbssInactivityTime"
+#define CFG_IBSS_INACTIVITY_TIME_MIN (1)
+#define CFG_IBSS_INACTIVITY_TIME_MAX (10)
+#define CFG_IBSS_INACTIVITY_TIME_DEFAULT (1)
+
+/*
+ * In IBSS mode Tx Service Period Inactivity
+ * time in msecs indicates the time after
+ * which TX Service Period is terminated by
+ * sending a Qos Null frame with EOSP.
+ * If value is 0, TX SP is terminated with the
+ * last buffered packet itself instead of waiting
+ * for the inactivity
+ */
+#define CFG_IBSS_TXSP_END_INACTIVITY_NAME "gIbssTxSpEndInactivityTime"
+#define CFG_IBSS_TXSP_END_INACTIVITY_MIN (0)
+#define CFG_IBSS_TXSP_END_INACTIVITY_MAX (100)
+#define CFG_IBSS_TXSP_END_INACTIVITY_DEFAULT (0)
+
#define CFG_SAP_MAX_NO_PEERS "gSoftApMaxPeers"
#define CFG_SAP_MAX_NO_PEERS_MIN (1)
#define CFG_SAP_MAX_NO_PEERS_MAX (32)
@@ -2961,6 +3025,15 @@ typedef struct
v_U8_t isAmsduSupportInAMPDU;
v_U8_t nSelect5GHzMargin;
v_U8_t isCoalesingInIBSSAllowed;
+
+ /* IBSS Power Save related parameters */
+ v_U32_t ibssATIMWinSize;
+ v_U8_t isIbssPowerSaveAllowed;
+ v_U8_t isIbssPowerCollapseAllowed;
+ v_U8_t isIbssAwakeOnTxRx;
+ v_U32_t ibssInactivityCount;
+ v_U32_t ibssTxSpEndInactivityTime;
+
v_BOOL_t enableTCPChkSumOffld;
v_BOOL_t enableIPChecksumOffload;
v_BOOL_t enablePowersaveOffload;
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 2e3fc4aaecd7..4b7084fd05cc 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -695,6 +695,9 @@ struct hdd_station_ctx
/* PMKID Cache */
tPmkidCacheInfo PMKIDCache[MAX_PMKSAIDS_IN_CACHE];
tANI_U32 PMKIDCacheIndex;
+
+ /* STA ctx debug variables */
+ int staDebugState;
};
#define BSS_STOP 0
@@ -1548,6 +1551,7 @@ VOS_STATUS hdd_disable_bmps_imps(hdd_context_t *pHddCtx, tANI_U8 session_type);
#ifdef QCA_WIFI_2_0
void wlan_hdd_cfg80211_update_wiphy_caps(struct wiphy *wiphy);
#endif
+VOS_STATUS hdd_setIbssPowerSaveParams(hdd_adapter_t *pAdapter);
void wlan_hdd_cfg80211_update_reg_info(struct wiphy *wiphy);
VOS_STATUS wlan_hdd_restart_driver(hdd_context_t *pHddCtx);
void hdd_exchange_version_and_caps(hdd_context_t *pHddCtx);
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 81d4b78d3e0f..42426031484d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3184,6 +3184,13 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_COALESING_IN_IBSS_MIN,
CFG_COALESING_IN_IBSS_MAX ),
+ REG_VARIABLE( CFG_IBSS_ATIM_WIN_SIZE_NAME , WLAN_PARAM_Integer,
+ hdd_config_t, ibssATIMWinSize,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_ATIM_WIN_SIZE_DEFAULT,
+ CFG_IBSS_ATIM_WIN_SIZE_MIN,
+ CFG_IBSS_ATIM_WIN_SIZE_MAX ),
+
REG_VARIABLE( CFG_SAP_MAX_NO_PEERS, WLAN_PARAM_Integer,
hdd_config_t, maxNumberOfPeers,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3191,6 +3198,41 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_SAP_MAX_NO_PEERS_MIN,
CFG_SAP_MAX_NO_PEERS_MAX),
+ REG_VARIABLE( CFG_IBSS_IS_POWER_SAVE_ALLOWED_NAME , WLAN_PARAM_Integer,
+ hdd_config_t, isIbssPowerSaveAllowed,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_IS_POWER_SAVE_ALLOWED_DEFAULT,
+ CFG_IBSS_IS_POWER_SAVE_ALLOWED_MIN,
+ CFG_IBSS_IS_POWER_SAVE_ALLOWED_MAX ),
+
+ REG_VARIABLE( CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_NAME , WLAN_PARAM_Integer,
+ hdd_config_t, isIbssPowerCollapseAllowed,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_DEFAULT,
+ CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_MIN,
+ CFG_IBSS_IS_POWER_COLLAPSE_ALLOWED_MAX ),
+
+ REG_VARIABLE( CFG_IBSS_AWAKE_ON_TX_RX_NAME , WLAN_PARAM_Integer,
+ hdd_config_t, isIbssAwakeOnTxRx,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_AWAKE_ON_TX_RX_DEFAULT,
+ CFG_IBSS_AWAKE_ON_TX_RX_MIN,
+ CFG_IBSS_AWAKE_ON_TX_RX_MAX ),
+
+ REG_VARIABLE( CFG_IBSS_INACTIVITY_TIME_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, ibssInactivityCount,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_INACTIVITY_TIME_DEFAULT,
+ CFG_IBSS_INACTIVITY_TIME_MIN,
+ CFG_IBSS_INACTIVITY_TIME_MAX ),
+
+ REG_VARIABLE( CFG_IBSS_TXSP_END_INACTIVITY_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, ibssTxSpEndInactivityTime,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_IBSS_TXSP_END_INACTIVITY_DEFAULT,
+ CFG_IBSS_TXSP_END_INACTIVITY_MIN,
+ CFG_IBSS_TXSP_END_INACTIVITY_MAX ),
+
#ifndef QCA_WIFI_ISOC
REG_VARIABLE( CFG_THERMAL_TEMP_MIN_LEVEL0_NAME, WLAN_PARAM_Integer,
hdd_config_t, thermalTempMinLevel0,
@@ -3987,6 +4029,12 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gAmsduSupportInAMPDU] Value = [%u] ",pHddCtx->cfg_ini->isAmsduSupportInAMPDU);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nSelect5GHzMargin] Value = [%u] ",pHddCtx->cfg_ini->nSelect5GHzMargin);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gCoalesingInIBSS] Value = [%u] ",pHddCtx->cfg_ini->isCoalesingInIBSSAllowed);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssATIMWinSize] Value = [%u] ",pHddCtx->cfg_ini->ibssATIMWinSize);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssIsPowerSaveAllowed] Value = [%u] ",pHddCtx->cfg_ini->isIbssPowerSaveAllowed);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssIsPowerCollapseAllowed] Value = [%u] ",pHddCtx->cfg_ini->isIbssPowerCollapseAllowed);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssAwakeOnTxRx] Value = [%u] ",pHddCtx->cfg_ini->isIbssAwakeOnTxRx);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssInactivityTime] Value = [%u] ",pHddCtx->cfg_ini->ibssInactivityCount);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gIbssTxSpEndInactivityTime] Value = [%u] ",pHddCtx->cfg_ini->ibssTxSpEndInactivityTime);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [fDfsPhyerrFilterOffload] Value = [%u] ",pHddCtx->cfg_ini->fDfsPhyerrFilterOffload);
#ifdef IPA_OFFLOAD
@@ -5534,6 +5582,13 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
}
#endif
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_IBSS_ATIM_WIN_SIZE,
+ pConfig->ibssATIMWinSize, NULL,
+ eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_IBSS_ATIM_WIN_SIZE to CCM");
+ }
return fStatus;
}
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a3479d8fcef7..12ce1e904a8d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -6202,6 +6202,20 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter,
}
if ( (WLAN_HDD_IBSS == pAdapter->device_mode) && operatingChannel)
{
+ /*
+ * Need to post the IBSS power save parameters
+ * to WMA. WMA will configure this parameters
+ * to firmware if power save is enabled by the
+ * firmware.
+ */
+ status = hdd_setIbssPowerSaveParams(pAdapter);
+
+ if (VOS_STATUS_SUCCESS != status)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Set IBSS Power Save Params Failed", __func__);
+ return -EINVAL;
+ }
hdd_select_cbmode(pAdapter,operatingChannel);
}
@@ -7004,7 +7018,8 @@ static int wlan_hdd_try_disconnect( hdd_adapter_t *pAdapter )
msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
if (0 >= ret)
{
- hddLog(LOGE, FL("Failed to receive disconnect event"));
+ hddLog(LOGE, FL("Failed to receive sme disconnect event session Id %d staDebugState %d"),
+ pAdapter->sessionId, pHddStaCtx->staDebugState);
return -EALREADY;
}
}
@@ -7016,7 +7031,8 @@ static int wlan_hdd_try_disconnect( hdd_adapter_t *pAdapter )
msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
if (0 >= ret)
{
- hddLog(LOGE, FL("Failed to receive disconnect event"));
+ hddLog(LOGE, FL("Failed to receive wait for comp disconnect event session Id %d staDebugState %d"),
+ pAdapter->sessionId, pHddStaCtx->staDebugState);
return -EALREADY;
}
}
@@ -7192,11 +7208,15 @@ int wlan_hdd_disconnect( hdd_adapter_t *pAdapter, u16 reason )
hddLog(VOS_TRACE_LEVEL_ERROR,
"%s csrRoamDisconnect failure, returned %d",
__func__, (int)status );
+ pHddStaCtx->staDebugState = status;
return -EINVAL;
}
status = wait_for_completion_interruptible_timeout(
&pAdapter->disconnect_comp_var,
msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
+
+ pHddStaCtx->conn_info.connState = eConnectionState_NotConnected;
+
if (!status)
{
hddLog(VOS_TRACE_LEVEL_ERROR,
@@ -7499,6 +7519,17 @@ static int wlan_hdd_cfg80211_join_ibss( struct wiphy *wiphy,
/* enable selected protection checks in IBSS mode */
pRoamProfile->cfg_protection = IBSS_CFG_PROTECTION_ENABLE_MASK;
+ if (eHAL_STATUS_FAILURE == ccmCfgSetInt( pHddCtx->hHal,
+ WNI_CFG_IBSS_ATIM_WIN_SIZE,
+ pHddCtx->cfg_ini->ibssATIMWinSize,
+ NULL,
+ eANI_BOOLEAN_FALSE))
+ {
+ hddLog(LOGE,
+ "%s: Could not pass on WNI_CFG_IBSS_ATIM_WIN_SIZE to CCM",
+ __func__);
+ }
+
/* 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,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 887fda325810..ef7392956183 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -133,6 +133,7 @@ void hdd_ch_avoid_cb(void *hdd_context,void *indi_param);
#elif defined(HIF_SDIO)
#include "if_ath_sdio.h"
#endif
+#include "wma.h"
#endif
#ifdef MODULE
@@ -990,6 +991,107 @@ void hdd_checkandupdate_dfssetting( hdd_adapter_t *pAdapter, char *country_code)
}
+/**---------------------------------------------------------------------------
+
+ \brief hdd_setIbssPowerSaveParams - update IBSS Power Save params to WMA.
+
+ This function sets the IBSS power save config parameters to WMA
+ which will send it to firmware if FW supports IBSS power save
+ before vdev start.
+
+ \param - hdd_adapter_t Hdd adapter.
+
+ \return - VOS_STATUS VOS_STATUS_SUCCESS on Success and VOS_STATUS_E_FAILURE
+ on failure.
+
+ --------------------------------------------------------------------------*/
+VOS_STATUS hdd_setIbssPowerSaveParams(hdd_adapter_t *pAdapter)
+{
+ VOS_STATUS ret;
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
+
+ if (pHddCtx == NULL)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: HDD context is null", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE,
+ (int)pHddCtx->cfg_ini->ibssATIMWinSize,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED,
+ (int)pHddCtx->cfg_ini->isIbssPowerSaveAllowed,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED,
+ (int)pHddCtx->cfg_ini->isIbssPowerCollapseAllowed,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX,
+ (int)pHddCtx->cfg_ini->isIbssAwakeOnTxRx,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_INACTIVITY_TIME,
+ (int)pHddCtx->cfg_ini->ibssInactivityCount,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_INACTIVITY_TIME failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME,
+ (int)pHddCtx->cfg_ini->ibssTxSpEndInactivityTime,
+ VDEV_CMD);
+ if (VOS_STATUS_SUCCESS != ret)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME failed %d",
+ __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ return ret;
+}
+
#ifdef FEATURE_WLAN_BATCH_SCAN
/**---------------------------------------------------------------------------
@@ -7570,11 +7672,7 @@ static hdd_adapter_t* hdd_alloc_station_adapter( hdd_context_t *pHddCtx, tSirMac
vos_mem_copy(pWlanDev->dev_addr, (void *)macAddr, sizeof(tSirMacAddr));
vos_mem_copy( pAdapter->macAddressCurrent.bytes, macAddr, sizeof(tSirMacAddr));
pWlanDev->watchdog_timeo = HDD_TX_TIMEOUT;
-#ifndef QCA_WIFI_2_0
pWlanDev->hard_header_len += LIBRA_HW_NEEDED_HEADROOM;
-#elif defined(HIF_USB)
- pWlanDev->hard_header_len += LIBRA_HW_NEEDED_HEADROOM;
-#endif
#ifdef QCA_WIFI_2_0
if (pHddCtx->cfg_ini->enableIPChecksumOffload)
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index 07b902e61086..2fc4f3c0f5e3 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -638,6 +638,27 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
ac = hdd_QdiscAcToTlAC[skb->queue_mapping];
++pAdapter->hdd_stats.hddTxRxStats.txXmitClassifiedAC[ac];
+#if defined (IPA_OFFLOAD)
+ if(!(NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID)) {
+#endif
+ // Check if the buffer has enough header room
+ skb = skb_unshare(skb, GFP_ATOMIC);
+ if (!skb)
+ goto drop_pkt;
+
+ if (skb_headroom(skb) < dev->hard_header_len) {
+ struct sk_buff *tmp;
+ tmp = skb;
+ skb = skb_realloc_headroom(tmp, dev->hard_header_len);
+ dev_kfree_skb(tmp);
+ if (!skb)
+ goto drop_pkt;
+ }
+#if defined (IPA_OFFLOAD)
+ }
+#endif
+
+
#ifdef QCA_PKT_PROTO_TRACE
if ((hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
(hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index f97607f8e608..ab03e606a9f3 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -986,6 +986,26 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
//Get TL AC corresponding to Qdisc queue index/AC.
ac = hdd_QdiscAcToTlAC[skb->queue_mapping];
+#ifdef IPA_OFFLOAD
+ if(!(NBUF_OWNER_ID(skb) == IPA_NBUF_OWNER_ID)) {
+#endif
+
+ /* Check if the buffer has enough header room */
+ skb = skb_unshare(skb, GFP_ATOMIC);
+ if (!skb)
+ goto drop_pkt;
+
+ if (skb_headroom(skb) < dev->hard_header_len) {
+ struct sk_buff *tmp;
+ tmp = skb;
+ skb = skb_realloc_headroom(tmp, dev->hard_header_len);
+ dev_kfree_skb(tmp);
+ if (!skb)
+ goto drop_pkt;
+ }
+#ifdef IPA_OFFLOAD
+ }
+#endif
//user priority from IP header, which is already extracted and set from
//select_queue call back function
up = skb->priority;
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 097bda6a6b3d..ba6b1b7ebb59 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 121
+#define QWLAN_VERSION_BUILD 122
-#define QWLAN_VERSIONSTR "1.0.0.121"
+#define QWLAN_VERSIONSTR "1.0.0.122"
#ifdef QCA_WIFI_2_0
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index 7fa62aef8fc7..d251c8578fc9 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -1,29 +1,29 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
- /*
- * This file was originally distributed by Qualcomm Atheros, Inc.
- * under proprietary terms before Copyright ownership was assigned
- * to the Linux Foundation.
- */
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file was originally distributed by Qualcomm Atheros, Inc.
+ * under proprietary terms before Copyright ownership was assigned
+ * to the Linux Foundation.
+ */
/*
* DO NOT EDIT - This file is generated automatically
@@ -356,6 +356,7 @@
#define WNI_CFG_RTT3_ENABLE 309
#define WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL 310
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED 311
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE 312
/*
* String parameter lengths
@@ -2610,10 +2611,18 @@
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_APMAX 1
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_APDEF 0
-#define CFG_PARAM_MAX_NUM 312
-#define CFG_AP_IBUF_MAX_SIZE 252
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STAMIN 0
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STAMAX 100
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STADEF 0
+
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_APMIN 0
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_APMAX 100
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_APDEF 0
+
+#define CFG_PARAM_MAX_NUM 313
+#define CFG_AP_IBUF_MAX_SIZE 253
#define CFG_AP_SBUF_MAX_SIZE 3414
-#define CFG_STA_IBUF_MAX_SIZE 247
+#define CFG_STA_IBUF_MAX_SIZE 248
#define CFG_STA_SBUF_MAX_SIZE 3380
#define CFG_SEM_MAX_NUM 19
diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h
index 5411fddcb927..0d40d76c230b 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -1,29 +1,29 @@
- /*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
- /*
- * This file was originally distributed by Qualcomm Atheros, Inc.
- * under proprietary terms before Copyright ownership was assigned
- * to the Linux Foundation.
- */
+/*
+ * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file was originally distributed by Qualcomm Atheros, Inc.
+ * under proprietary terms before Copyright ownership was assigned
+ * to the Linux Foundation.
+ */
/*
* DO NOT EDIT - This file is generated automatically
@@ -350,6 +350,7 @@
#define WNI_CFG_RTT3_ENABLE 309
#define WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL 310
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED 311
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE 312
/*
* String parameter lengths
@@ -1683,8 +1684,12 @@
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STAMAX 1
#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STADEF 0
-#define CFG_PARAM_MAX_NUM 312
-#define CFG_STA_IBUF_MAX_SIZE 247
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STAMIN 0
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STAMAX 100
+#define WNI_CFG_IBSS_ATIM_WIN_SIZE_STADEF 0
+
+#define CFG_PARAM_MAX_NUM 313
+#define CFG_STA_IBUF_MAX_SIZE 248
#define CFG_STA_SBUF_MAX_SIZE 3380
#define CFG_SEM_MAX_NUM 19
diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c
index e36a07ea637a..c6ef25b9f755 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -69,7 +69,6 @@ unsigned char *gCfgParamName[] = {
(unsigned char *)"OPERATIONAL_RATE_SET",
(unsigned char *)"EXTENDED_OPERATIONAL_RATE_SET",
(unsigned char *)"PROPRIETARY_OPERATIONAL_RATE_SET",
- (unsigned char *)"BSSID",
(unsigned char *)"LISTEN_INTERVAL",
(unsigned char *)"VALID_CHANNEL_LIST",
(unsigned char *)"CURRENT_CHANNEL",
@@ -342,4 +341,5 @@ unsigned char *gCfgParamName[] = {
(unsigned char *)"RTT3_ENABLE",
(unsigned char *)"DEBUG_P2P_REMAIN_ON_CHANNEL",
(unsigned char *)"TDLS_OFF_CHANNEL_ENABLED",
+ (unsigned char *)"IBSS_ATIM_WIN_SIZE",
};
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index fdca4815b5e5..4d1f67fa14e1 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -4664,3 +4664,11 @@ LIM
V RW NP
LIM
0 1 0
+
+WNI_CFG_IBSS_ATIM_WIN_SIZE I 4 7
+V RW NP
+NONE
+0 100 0
+V RW NP
+NONE
+0 100 0
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 388d51f8c10c..5200c0d1c8a5 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -681,6 +681,8 @@ typedef struct sSirMbMsgP2p
#define SIR_HAL_VDEV_START_RSP_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 262)
#define SIR_HAL_GET_LINK_SPEED (SIR_HAL_ITC_MSG_TYPES_BEGIN + 263)
+#define SIR_HAL_ROAM_PREAUTH_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 264)
+
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
// CFG message types
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index 1f811c5d2287..02f210982ad8 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -346,7 +346,7 @@ void limPerformFTPreAuth(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *data,
PELOGE(limLog( pMac, LOGE,
"%s: FTIEs for Auth Req Seq 1 is absent",
__func__);)
- return;
+ goto preauth_fail;
}
}
if (status != eHAL_STATUS_SUCCESS)
@@ -354,7 +354,7 @@ void limPerformFTPreAuth(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *data,
PELOGE(limLog( pMac, LOGE,
"%s: Change channel not successful for FT pre-auth",
__func__);)
- return;
+ goto preauth_fail;
}
pMac->ft.ftPEContext.psavedsessionEntry = psessionEntry;
@@ -401,6 +401,9 @@ MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLI
LIM_NO_WEP_IN_FC, psessionEntry);
return;
+preauth_fail:
+ limHandleFTPreAuthRsp(pMac, eSIR_FAILURE, NULL, 0, psessionEntry);
+ return;
}
diff --git a/CORE/SERVICES/COMMON/enet.h b/CORE/SERVICES/COMMON/enet.h
index 9e9c64618cf7..a9f03b7e6869 100644
--- a/CORE/SERVICES/COMMON/enet.h
+++ b/CORE/SERVICES/COMMON/enet.h
@@ -120,6 +120,10 @@ struct ethernet_vlan_hdr_t {
#define ETHERTYPE_WAI 0x88B4 /* WAPI */
#endif
+#ifndef ETHERTYPE_TDLS
+#define ETHERTYPE_TDLS 0x890D /* TDLS */
+#endif
+
#define LLC_SNAP_LSAP 0xaa
#define LLC_UI 0x3
diff --git a/CORE/SERVICES/COMMON/wlan_module_ids.h b/CORE/SERVICES/COMMON/wlan_module_ids.h
index 13578183ee10..5246b704a8d6 100644
--- a/CORE/SERVICES/COMMON/wlan_module_ids.h
+++ b/CORE/SERVICES/COMMON/wlan_module_ids.h
@@ -79,6 +79,7 @@ typedef enum {
WLAN_MODULE_RMC,
WLAN_MODULE_STATS,
WLAN_MODULE_NAN,
+ WLAN_MODULE_IBSS_PWRSAVE,
WLAN_MODULE_ID_MAX,
WLAN_MODULE_ID_INVALID = WLAN_MODULE_ID_MAX,
} WLAN_MODULE_ID;
diff --git a/CORE/SERVICES/COMMON/wmi_services.h b/CORE/SERVICES/COMMON/wmi_services.h
index 4bf2fd900545..31d1d534e69b 100644
--- a/CORE/SERVICES/COMMON/wmi_services.h
+++ b/CORE/SERVICES/COMMON/wmi_services.h
@@ -104,6 +104,7 @@ typedef enum {
WMI_SERVICE_TDLS_OFFCHAN, /* TDLS off channel support */
WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, /* TDLS UAPSD Buffer STA support */
WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, /* TDLS UAPSD Sleep STA support */
+ WMI_SERVICE_IBSS_PWRSAVE, /* IBSS power save support */
WMI_MAX_SERVICE=128 /* max service */
} WMI_SERVICE;
diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
index dffd7baf9945..6e5984a3f533 100644
--- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h
+++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
@@ -433,6 +433,10 @@ typedef enum {
WMITLV_TAG_STRUC_wmi_obss_scan_enable_cmd_fixed_param,
WMITLV_TAG_STRUC_wmi_obss_scan_disable_cmd_fixed_param,
WMITLV_TAG_STRUC_wmi_offload_prb_rsp_tx_status_event_fixed_param,
+ WMITLV_TAG_STRUC_wmi_pdev_set_led_config_cmd_fixed_param,
+ WMITLV_TAG_STRUC_wmi_host_auto_shutdown_cfg_cmd_fixed_param,
+ WMITLV_TAG_STRUC_wmi_host_auto_shutdown_event_fixed_param,
+ WMITLV_TAG_STRUC_wmi_update_whal_mib_stats_event_fixed_param,
} WMITLV_TAG_ID;
/*
@@ -589,7 +593,9 @@ typedef enum {
OP(WMI_ROAM_SCAN_CMD)\
OP(WMI_REQUEST_STATS_EXT_CMDID) \
OP(WMI_OBSS_SCAN_ENABLE_CMDID) \
- OP(WMI_OBSS_SCAN_DISABLE_CMDID)
+ OP(WMI_OBSS_SCAN_DISABLE_CMDID)\
+ OP(WMI_PDEV_SET_LED_CONFIG_CMDID)\
+ OP(WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID)
/*
* IMPORTANT: Please add _ALL_ WMI Events Here.
@@ -657,7 +663,9 @@ typedef enum {
OP(WMI_PEER_ESTIMATED_LINKSPEED_EVENTID) \
OP(WMI_AGGR_STATE_TRIG_EVENTID)\
OP(WMI_STATS_EXT_EVENTID) \
- OP(WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID)
+ OP(WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID) \
+ OP(WMI_HOST_AUTO_SHUTDOWN_EVENTID) \
+ OP(WMI_UPDATE_WHAL_MIB_STATS_EVENTID)
/* TLV definitions of WMI commands */
@@ -1263,7 +1271,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_DFS_PHYERR_FILTER_DIS_CMDID);
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WOW_IPV4_SYNC_PATTERN_T, pattern_info_ipv4, WMITLV_SIZE_VAR)\
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WOW_IPV6_SYNC_PATTERN_T, pattern_info_ipv6, WMITLV_SIZE_VAR)\
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, WOW_MAGIC_PATTERN_CMD, pattern_info_magic_pattern, WMITLV_SIZE_VAR)\
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, pattern_info_timeout, WMITLV_SIZE_VAR)
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, pattern_info_timeout, WMITLV_SIZE_VAR) \
+ WMITLV_FXAR(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, ra_ratelimit_interval, WMITLV_SIZE_FIX, 1)
WMITLV_CREATE_PARAM_STRUC(WMI_WOW_ADD_WAKE_PATTERN_CMDID);
@@ -1581,6 +1590,17 @@ WMITLV_CREATE_PARAM_STRUC(WMI_OBSS_SCAN_ENABLE_CMDID);
WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_obss_scan_disable_cmd_fixed_param, wmi_obss_scan_disable_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX)
WMITLV_CREATE_PARAM_STRUC(WMI_OBSS_SCAN_DISABLE_CMDID);
+/* Pdev Set LED Config Cmd */
+#define WMITLV_TABLE_WMI_PDEV_SET_LED_CONFIG_CMDID(id,op,buf,len) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_set_led_config_cmd_fixed_param, wmi_pdev_set_led_config_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX)
+WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_SET_LED_CONFIG_CMDID);
+
+/* host auto shut down config cmd */
+#define WMITLV_TABLE_WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID(id,op,buf,len) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_host_auto_shutdown_cfg_cmd_fixed_param, wmi_host_auto_shutdown_cfg_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX)
+WMITLV_CREATE_PARAM_STRUC(WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID);
+
+
/************************** TLV definitions of WMI events *******************************/
/* Service Ready event */
@@ -1601,6 +1621,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_READY_EVENTID);
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_scan_event_fixed_param, wmi_scan_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
WMITLV_CREATE_PARAM_STRUC(WMI_SCAN_EVENTID);
+/* Update_whal_mib_stats Event */
+#define WMITLV_TABLE_WMI_UPDATE_WHAL_MIB_STATS_EVENTID(id,op,buf,len) \
+ WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_update_whal_mib_stats_event_fixed_param, wmi_update_whal_mib_stats_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
+WMITLV_CREATE_PARAM_STRUC(WMI_UPDATE_WHAL_MIB_STATS_EVENTID);
+
/* PDEV TPC Config Event */
#define WMITLV_TABLE_WMI_PDEV_TPC_CONFIG_EVENTID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_tpc_config_event_fixed_param, wmi_pdev_tpc_config_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
@@ -1917,6 +1942,12 @@ WMITLV_CREATE_PARAM_STRUC(WMI_STATS_EXT_EVENTID);
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_offload_prb_rsp_tx_status_event_fixed_param, wmi_offload_prb_rsp_tx_status_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
WMITLV_CREATE_PARAM_STRUC(WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID);
+/* host auto shut down event */
+#define WMITLV_TABLE_WMI_HOST_AUTO_SHUTDOWN_EVENTID(id,op,buf,len) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_host_auto_shutdown_event_fixed_param, wmi_host_auto_shutdown_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
+WMITLV_CREATE_PARAM_STRUC(WMI_HOST_AUTO_SHUTDOWN_EVENTID);
+
+
#ifdef __cplusplus
}
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index ff8f45cbf422..974bfbaab241 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -234,6 +234,8 @@ typedef enum {
/* eeprom content dump , the same to bdboard data */
WMI_PDEV_DUMP_CMDID,
+ /* set LED configuration */
+ WMI_PDEV_SET_LED_CONFIG_CMDID,
/* VDEV(virtual device) specific commands */
/** vdev create */
@@ -526,6 +528,8 @@ typedef enum {
WMI_SET_MCASTBCAST_FILTER_CMDID,
/** set thermal management params **/
WMI_THERMAL_MGMT_CMDID,
+ /** set host auto shutdown params **/
+ WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID,
/* GPIO Configuration */
WMI_GPIO_CONFIG_CMDID=WMI_CMD_GRP_START_ID(WMI_GRP_GPIO),
@@ -792,6 +796,12 @@ typedef enum {
/* Container for QXDM/DIAG events */
WMI_DIAG_DATA_CONTAINER_EVENTID,
+ /* host auto shutdown event */
+ WMI_HOST_AUTO_SHUTDOWN_EVENTID,
+
+ /*update mib counters together with WMI_UPDATE_STATS_EVENTID*/
+ WMI_UPDATE_WHAL_MIB_STATS_EVENTID,
+
/* GPIO Event */
WMI_GPIO_INPUT_EVENTID=WMI_EVT_GRP_START_ID(WMI_GRP_GPIO),
/** upload H_CV info WMI event
@@ -1563,6 +1573,8 @@ typedef struct {
/**When set, certain errors are ignored and scan continues.
* Different FW scan engine may use its own logic to decide what errors to ignore*/
#define WMI_SCAN_CONTINUE_ON_ERROR 0x80
+/* Enable promiscous mode for CCXv4 */
+#define WMI_SCAN_FILTER_PROMISCOUS 0x100
/** WMI_SCAN_CLASS_MASK must be the same value as IEEE80211_SCAN_CLASS_MASK */
#define WMI_SCAN_CLASS_MASK 0xFF000000
@@ -1709,6 +1721,25 @@ typedef struct {
A_UINT32 vdev_id;
} wmi_scan_event_fixed_param;
+
+/*
+* If FW has multiple active channels due to MCC(multi channel concurrency),
+* then these stats are combined stats for all the active channels.
+*/
+typedef struct {
+ A_UINT32 tlv_header; /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_update_whal_mib_stats_event_fixed_param */
+ /** ack count, it is an incremental number, not accumulated number */
+ A_UINT32 ackRcvBad;
+ /** bad rts count, it is an incremental number, not accumulated number */
+ A_UINT32 rtsBad;
+ /** good rts, it is an incremental number, not accumulated number */
+ A_UINT32 rtsGood;
+ /** fcs count, it is an incremental number, not accumulated number */
+ A_UINT32 fcsBad;
+ /** beacon count, it is an incremental number, not accumulated number */
+ A_UINT32 noBeacons;
+} wmi_update_whal_mib_stats_event_fixed_param;
+
/*
* This defines how much headroom is kept in the
* receive frame between the descriptor and the
@@ -2208,6 +2239,10 @@ typedef enum {
WMI_PDEV_PARAM_HYST_EN,
/** Enable/ Disable POWER COLLAPSE */
WMI_PDEV_PARAM_POWER_COLLAPSE_ENABLE,
+ /** configure LED system state */
+ WMI_PDEV_PARAM_LED_SYS_STATE,
+ /** Enable/Disable LED */
+ WMI_PDEV_PARAM_LED_ENABLE,
} WMI_PDEV_PARAM;
typedef enum {
@@ -2259,6 +2294,7 @@ typedef enum {
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 */
PAUSE_TYPE_AP_PS = 0x7, /** for pausing AP vdev when all the connected clients are in PS. only vdev_map is valid */
+ PAUSE_TYPE_IBSS_PS = 0x8, /** for pausing IBSS vdev when all the peers are in PS. only vdev_map is valid */
PAUSE_TYPE_HOST = 0x15,/** host is requesting vdev pause */
} wmi_tx_pause_type;
@@ -3063,8 +3099,40 @@ typedef enum {
/* Enable Aggregation State Trigger Event */
WMI_VDEV_PARAM_AGGR_TRIG_EVENT_ENABLE,
+ /* This parameter indicates whether IBSS station can enter into power save
+ * mode by sending Null frame (with PM=1). When not allowed, IBSS station has to stay
+ * awake all the time and should never set PM=1 in its transmitted frames.
+ * This parameter is meaningful/valid only when WMI_VDEV_PARAM_ATIM_WINDOW_LENGTH
+ * is non-zero. */
+ WMI_VDEV_PARAM_IS_IBSS_POWER_SAVE_ALLOWED,
+
+ /* This parameter indicates if this station can enter into power collapse
+ * for the remaining beacon interval after the ATIM window.
+ * This parameter is meaningful/valid only when WMI_VDEV_PARAM_IS_IBSS_POWER_SAVE_ALLOWED
+ * is set to TRUE. */
+ WMI_VDEV_PARAM_IS_POWER_COLLAPSE_ALLOWED,
+
+ /* This parameter indicates whether IBSS station exit power save mode and
+ * enter power active state (by sending Null frame with PM=0 in the immediate ATIM Window)
+ * whenever there is a TX/RX activity. */
+ WMI_VDEV_PARAM_IS_AWAKE_ON_TXRX_ENABLED,
+
+ /* If Awake on TX/RX activity is enabled, this parameter indicates
+ * the data inactivity time in number of beacon intervals after which
+ * IBSS station reenters power save by sending Null frame with PM=1. */
+ WMI_VDEV_PARAM_INACTIVITY_CNT,
+
+ /* Inactivity time in msec after which TX Service Period (SP) is
+ * terminated by sending a Qos Null frame with EOSP.
+ * If value is 0, TX SP is terminated with the last buffered packet itself
+ * instead of waiting for the inactivity timeout. */
+ WMI_VDEV_PARAM_TXSP_END_INACTIVITY_TIME_MS,
+
} WMI_VDEV_PARAM;
+/* Length of ATIM Window in TU */
+#define WMI_VDEV_PARAM_ATIM_WINDOW_LENGTH WMI_VDEV_PARAM_ATIM_WINDOW
+
enum wmi_pkt_type {
WMI_PKT_TYPE_RAW = 0,
WMI_PKT_TYPE_NATIVE_WIFI = 1,
@@ -3920,6 +3988,8 @@ typedef struct {
#define WMI_PEER_CRIT_PROTO_HINT_ENABLED 0x9
/* set Tx failure count threshold for the peer - Currently unused */
#define WMI_PEER_TX_FAIL_CNT_THR 0xA
+/* Enable H/W retry and Enable H/W Send CTS2S before Data */
+#define WMI_PEER_SET_HW_RETRY_CTS2S 0xB
/** mimo ps values for the parameter WMI_PEER_MIMO_PS_STATE */
#define WMI_PEER_MIMO_PS_NONE 0x0
@@ -4750,6 +4820,7 @@ typedef enum pattern_type_e {
WOW_WILD_CARD_PATTERN,
WOW_TIMER_PATTERN,
WOW_MAGIC_PATTERN,
+ WOW_IPV6_RA_PATTERN,
WOW_PATTERN_MAX
}WOW_PATTERN_TYPE;
@@ -4769,6 +4840,8 @@ typedef enum event_type_e {
WOW_AUTH_REQ_EVENT,
WOW_ASSOC_REQ_EVENT,
WOW_HTT_EVENT,
+ WOW_RA_MATCH_EVENT,
+ WOW_HOST_AUTO_SHUTDOWN_EVENT,
}WOW_WAKE_EVENT_TYPE;
typedef enum wake_reason_e {
@@ -4791,6 +4864,8 @@ typedef enum wake_reason_e {
WOW_REASON_AUTH_REQ_RECV,
WOW_REASON_ASSOC_REQ_RECV,
WOW_REASON_HTT_EVENT,
+ WOW_REASON_RA_MATCH,
+ WOW_REASON_HOST_AUTO_SHUTDOWN,
WOW_REASON_DEBUG_TEST = 0xFF,
}WOW_WAKE_REASON_TYPE;
@@ -4851,6 +4926,7 @@ typedef struct {
* WOW_IPV6_SYNC_PATTERN_T pattern_info_ipv6[];
* WOW_MAGIC_PATTERN_CMD pattern_info_magic_pattern[];
* A_UINT32 pattern_info_timeout[];
+ * A_UINT32 ra_ratelimit_interval;
*/
}WMI_WOW_ADD_PATTERN_CMD_fixed_param;
@@ -5927,7 +6003,6 @@ typedef struct {
#define WMI_GET_TDLS_SELF_MORE_DATA_ACK_UAPSD(pset_cmd) \
WMI_TDLS_SELF_GET_QOS_FLAG(pset_cmd, WMI_TDLS_QOS_MOREDATA_FLAG)
-
typedef struct {
/** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_tdls_peer_update_cmd_fixed_param */
A_UINT32 tlv_header;
@@ -6303,6 +6378,45 @@ typedef struct {
A_UINT32 radio_state;
} wmi_rfkill_mode_param;
+typedef enum {
+ WMI_SET_LED_SYS_POWEROFF,
+ WMI_SET_LED_SYS_S3_SUSPEND,
+ WMI_SET_LED_SYS_S4_S5,
+ WMI_SET_LED_SYS_DRIVER_DISABLE,
+ WMI_SET_LED_SYS_WAKEUP,
+ WMI_SET_LED_SYS_ALWAYS_ON, //just for test!
+ WMI_SET_LED_SYS_POWERON,
+} wmi_led_sys_state_param;
+
+typedef enum {
+ WMI_CONFIG_LED_TO_VDD = 0,
+ WMI_CONFIG_LED_TO_GND = 1,
+} wmi_config_led_connect_type;
+
+typedef enum {
+ WMI_CONFIG_LED_NOT_WITH_BT = 0,
+ WMI_CONFIG_LED_WITH_BT = 1,
+} wmi_config_led_with_bt_flag;
+
+typedef enum {
+ WMI_CONFIG_LED_DISABLE = 0,
+ WMI_CONFIG_LED_ENABLE = 1,
+} wmi_config_led_enable_flag;
+
+typedef struct {
+ /** TLV tag and len; tag equals
+ * WMITLV_TAG_STRUC_wmi_peer_info_req_cmd_fixed_param */
+ A_UINT32 tlv_header;
+ /* Set GPIO pin */
+ A_UINT32 led_gpio_pin;
+ /* Set connect type defined in wmi_config_led_connect_type */
+ A_UINT32 connect_type;
+ /* Set flag defined in wmi_config_led_with_bt_flag*/
+ A_UINT32 with_bt;
+ /* Set LED enablement defined in wmi_config_led_enable_flag */
+ A_UINT32 led_enable;
+} wmi_pdev_set_led_config_cmd_fixed_param;
+
/** WMI_PEER_INFO_REQ_CMDID
* Request FW to provide peer info */
typedef struct {
@@ -6543,6 +6657,29 @@ typedef struct {
A_UINT32 temperature_degreeC;/* temperature in degree C*/
} wmi_thermal_mgmt_event_fixed_param;
+/**
+ * This command is sent from WLAN host driver to firmware to
+ * request firmware to configure auto shutdown timer in fw
+ * 0 - Disable <1-19600>-Enabled and timer value is seconds (86400 seconds = 1 day maximum>
+ */
+typedef struct {
+ A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_host_auto_shutdown_cfg_cmd_param */
+ A_UINT32 timer_value; /** timer value; 0=disable */
+} wmi_host_auto_shutdown_cfg_cmd_fixed_param;
+
+enum wmi_host_auto_shutdown_reason {
+ WMI_HOST_AUTO_SHUTDOWN_REASON_UNKNOWN = 0,
+ WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY = 1,
+ WMI_HOST_AUTO_SHUTDOWN_REASON_MAX,
+};
+
+/* WMI_HOST_AUTO_SHUTDOWN_EVENTID */
+typedef struct{
+ A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_host_auto_shutdown_event_fixed_param */
+ A_UINT32 shutdown_reason; /* value: wmi_host_auto_shutdown_reason */
+} wmi_host_auto_shutdown_event_fixed_param;
+
+
typedef struct {
A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_nan_cmd_param */
A_UINT32 data_len; /** length in byte of data[]. */
diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h
index 16b85397e9d2..07a6c80045c7 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_ 44
+#define __WMI_REVISION_ 48
/** The Version Namespace should not be normally changed. Only
* host and firmware of the same WMI namespace will work
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 8987243383dd..d10a612daefa 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -4623,8 +4623,12 @@ VOS_STATUS wma_get_buf_start_scan_cmd(tp_wma_handle wma_handle,
WMITLV_GET_STRUCT_TLVLEN(
wmi_start_scan_cmd_fixed_param));
+ if (wma_handle->scan_id >= WMA_MAX_SCAN_ID)
+ wma_handle->scan_id = 0;
+
cmd->vdev_id = scan_req->sessionId;
- /*TODO: Populate actual values */
+ /* host cycles through the lower 12 bits of
+ wma_handle->scan_id to generate ids */
cmd->scan_id = WMA_HOST_SCAN_REQID_PREFIX | ++wma_handle->scan_id;
cmd->scan_priority = WMA_DEFAULT_SCAN_PRIORITY;
cmd->scan_req_id = WMA_HOST_SCAN_REQUESTOR_ID_PREFIX |
@@ -4938,12 +4942,21 @@ VOS_STATUS wma_start_scan(tp_wma_handle wma_handle,
/* Adjust parameters for channel switch scan */
cmd->min_rest_time = WMA_ROAM_PREAUTH_REST_TIME;
cmd->max_rest_time = WMA_ROAM_PREAUTH_REST_TIME;
+ adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
+ cmd->scan_id = ( (cmd->scan_id & WMA_MAX_SCAN_ID) |
+ WMA_HOST_ROAM_SCAN_REQID_PREFIX);
+ wma_handle->roam_preauth_scan_id = cmd->scan_id;
+ adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
}
wma_set_scan_info(wma_handle, cmd->scan_id,
cmd->scan_req_id, cmd->vdev_id,
scan_req->p2pScanType);
+ WMA_LOGE("scan_id %x, vdev_id %x, scan type %x, msg_type %x",
+ cmd->scan_id, cmd->vdev_id, scan_req->p2pScanType,
+ msg_type);
+
status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf,
len, WMI_START_SCAN_CMDID);
/* Call the wmi api to request the scan */
@@ -4954,10 +4967,6 @@ VOS_STATUS wma_start_scan(tp_wma_handle wma_handle,
goto error;
}
- if (msg_type == WDA_CHNL_SWITCH_REQ) {
- wma_handle->roam_preauth_scan_id = cmd->scan_id;
- }
-
WMA_LOGI("WMA --> WMI_START_SCAN_CMDID");
/* Update the scan parameters for handler */
@@ -5877,6 +5886,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
/* First parameter is positive rssi value to trigger rssi based scan.
* Opportunistic scan is started at 30 dB higher that trigger rssi.
*/
+ wma_handle->suitable_ap_hb_failure = FALSE;
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
(roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
@@ -5935,6 +5945,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
break;
case ROAM_SCAN_OFFLOAD_STOP:
+ wma_handle->suitable_ap_hb_failure = FALSE;
wma_roam_scan_offload_end_connect(wma_handle);
if (roam_req->StartScanReason == REASON_OS_REQUESTED_ROAMING_NOW) {
vos_msg_t vosMsg;
@@ -5956,10 +5967,22 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
break;
case ROAM_SCAN_OFFLOAD_RESTART:
- /* Not needed. Rome offload engine does not stop after any scan */
+ /* Rome offload engine does not stop after any scan.
+ * If this command is sent because all preauth attempts failed
+ * and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
+ * now it is time to call it heartbeat failure.
+ */
+ if ((roam_req->StartScanReason == REASON_PREAUTH_FAILED_FOR_ALL)
+ && wma_handle->suitable_ap_hb_failure) {
+ WMA_LOGE("%s: Sending heartbeat failure after preauth failures",
+ __func__);
+ wma_beacon_miss_handler(wma_handle, wma_handle->roam_offload_vdev_id);
+ wma_handle->suitable_ap_hb_failure = FALSE;
+ }
break;
case ROAM_SCAN_OFFLOAD_UPDATE_CFG:
+ wma_handle->suitable_ap_hb_failure = FALSE;
wma_roam_scan_fill_scan_params(wma_handle, pMac, roam_req, &scan_params);
vos_status = wma_roam_scan_offload_mode(wma_handle, &scan_params,
WMI_ROAM_SCAN_MODE_NONE);
@@ -6829,6 +6852,9 @@ void wma_vdev_resp_timer(void *data)
WMA_LOGA("%s: WDA_SWITCH_CHANNEL_REQ timedout", __func__);
wma_send_msg(wma, WDA_SWITCH_CHANNEL_RSP, (void *)params, 0);
wma->roam_preauth_chan_context = NULL;
+ adf_os_spin_lock_bh(&wma->roam_preauth_lock);
+ wma->roam_preauth_scan_id = -1;
+ adf_os_spin_unlock_bh(&wma->roam_preauth_lock);
} else if (tgt_req->msg_type == WDA_DELETE_BSS_REQ) {
tpDeleteBssParams params =
(tpDeleteBssParams)tgt_req->user_data;
@@ -7032,15 +7058,12 @@ VOS_STATUS wma_roam_preauth_chan_set(tp_wma_handle wma_handle,
WMA_LOGI("%s: channel %d", __func__, params->channelNumber);
/* Check for prior operation in progress */
- adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
if (wma_handle->roam_preauth_chan_context != NULL) {
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
vos_status = VOS_STATUS_E_FAILURE;
WMA_LOGE("%s: Rejected request. Previous operation in progress", __func__);
goto send_resp;
}
wma_handle->roam_preauth_chan_context = params;
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
/* Prepare a dummy scan request and get the
* wmi_start_scan_cmd_fixed_param structure filled properly
@@ -7069,9 +7092,7 @@ VOS_STATUS wma_roam_preauth_chan_set(tp_wma_handle wma_handle,
return vos_status;
wma_handle->roam_preauth_scan_state = WMA_ROAM_PREAUTH_CHAN_NONE;
/* Failed operation. Safely clear context */
- adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
wma_handle->roam_preauth_chan_context = NULL;
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
send_resp:
WMA_LOGI("%s: sending WDA_SWITCH_CHANNEL_RSP, status = 0x%x",
@@ -7091,15 +7112,12 @@ VOS_STATUS wma_roam_preauth_chan_cancel(tp_wma_handle wma_handle,
WMA_LOGI("%s: channel %d", __func__, params->channelNumber);
/* Check for prior operation in progress */
- adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
if (wma_handle->roam_preauth_chan_context != NULL) {
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
vos_status = VOS_STATUS_E_FAILURE;
WMA_LOGE("%s: Rejected request. Previous operation in progress", __func__);
goto send_resp;
}
wma_handle->roam_preauth_chan_context = params;
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
abort_scan_req.SessionId = vdev_id;
wma_handle->roam_preauth_scan_state = WMA_ROAM_PREAUTH_CHAN_CANCEL_REQUESTED;
@@ -7107,9 +7125,7 @@ VOS_STATUS wma_roam_preauth_chan_cancel(tp_wma_handle wma_handle,
if (vos_status == VOS_STATUS_SUCCESS)
return vos_status;
/* Failed operation. Safely clear context */
- adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
wma_handle->roam_preauth_chan_context = NULL;
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
send_resp:
WMA_LOGI("%s: sending WDA_SWITCH_CHANNEL_RSP, status = 0x%x",
@@ -7170,13 +7186,32 @@ static void wma_roam_preauth_scan_event_handler(tp_wma_handle wma_handle,
params->smpsMode = SMPS_MODE_DISABLED;
params->status = vos_status;
wma_send_msg(wma_handle, WDA_SWITCH_CHANNEL_RSP, (void *)params, 0);
- adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
wma_handle->roam_preauth_chan_context = NULL;
- adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
}
}
+void wma_roam_preauth_ind(tp_wma_handle wma_handle, u_int8_t *buf) {
+ wmi_scan_event_fixed_param *wmi_event = NULL;
+ u_int8_t vdev_id;
+
+ wmi_event = (wmi_scan_event_fixed_param *)buf;
+ if (wmi_event == NULL) {
+ WMA_LOGE("%s: Invalid param wmi_event is null", __func__);
+ return;
+ }
+
+ vdev_id = wmi_event->vdev_id;
+ if (vdev_id >= wma_handle->max_bssid) {
+ WMA_LOGE("%s: Invalid vdev_id %d wmi_event %p", __func__,
+ vdev_id, wmi_event);
+ return;
+ }
+
+ wma_roam_preauth_scan_event_handler(wma_handle, vdev_id, wmi_event);
+ return;
+}
+
/*
* wma_set_channel
* If this request is called when station is connected, it should use
@@ -7987,9 +8022,58 @@ static int32_t wma_set_priv_cfg(tp_wma_handle wma_handle,
);
}
break;
+ case WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE:
+ {
+ wma_handle->wma_ibss_power_save_params.atimWindowLength =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS power save ATIM Window = %d", __func__,
+ wma_handle->wma_ibss_power_save_params.atimWindowLength);
+ }
+ break;
+ case WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED:
+ {
+ wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS is Power Save Allowed = %d", __func__,
+ wma_handle->wma_ibss_power_save_params.isPowerSaveAllowed);
+ }
+ break;
+ case WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED:
+ {
+ wma_handle->wma_ibss_power_save_params.isPowerCollapseAllowed =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS is Power Collapse Allowed = %d", __func__,
+ wma_handle->wma_ibss_power_save_params.isPowerCollapseAllowed);
+ }
+ break;
+ case WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX:
+ {
+ wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS Power Save Awake on Tx/Rx Enabled = %d", __func__,
+ wma_handle->wma_ibss_power_save_params.isAwakeonTxRxEnabled);
+ }
+ break;
+ case WMA_VDEV_IBSS_SET_INACTIVITY_TIME:
+ {
+ wma_handle->wma_ibss_power_save_params.inactivityCount =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS Power Save Data Inactivity Count = %d", __func__,
+ wma_handle->wma_ibss_power_save_params.inactivityCount);
+ }
+ break;
+ case WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME:
+ {
+ wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime =
+ privcmd->param_value;
+ WMA_LOGD("%s: IBSS Power Save Transmit EOSP inactivity time out = %d",
+ __func__,
+ wma_handle->wma_ibss_power_save_params.txSPEndInactivityTime);
+ }
+ break;
default:
WMA_LOGE("Invalid wma config command id:%d",
- privcmd->param_id);
+ privcmd->param_id);
ret = -EINVAL;
}
return ret;
@@ -9174,6 +9258,68 @@ send_fail_resp:
}
#ifdef QCA_IBSS_SUPPORT
+static VOS_STATUS
+wma_set_ibss_pwrsave_params(tp_wma_handle wma, u_int8_t vdev_id)
+{
+ int ret;
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_ATIM_WINDOW_LENGTH,
+ wma->wma_ibss_power_save_params.atimWindowLength);
+ if (ret < 0) {
+ WMA_LOGE("Failed to set WMI_VDEV_PARAM_ATIM_WINDOW_LENGTH ret = %d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_IS_IBSS_POWER_SAVE_ALLOWED,
+ wma->wma_ibss_power_save_params.isPowerSaveAllowed);
+ if (ret < 0) {
+ WMA_LOGE("Failed, set WMI_VDEV_PARAM_IS_IBSS_POWER_SAVE_ALLOWED ret=%d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_IS_POWER_COLLAPSE_ALLOWED,
+ wma->wma_ibss_power_save_params.isPowerCollapseAllowed);
+ if (ret < 0) {
+ WMA_LOGE("Failed, set WMI_VDEV_PARAM_IS_POWER_COLLAPSE_ALLOWED ret=%d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_IS_AWAKE_ON_TXRX_ENABLED,
+ wma->wma_ibss_power_save_params.isAwakeonTxRxEnabled);
+ if (ret < 0) {
+ WMA_LOGE("Failed, set WMI_VDEV_PARAM_IS_AWAKE_ON_TXRX_ENABLED ret=%d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_INACTIVITY_CNT,
+ wma->wma_ibss_power_save_params.inactivityCount);
+ if (ret < 0) {
+ WMA_LOGE("Failed, set WMI_VDEV_PARAM_INACTIVITY_CNT ret=%d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_TXSP_END_INACTIVITY_TIME_MS,
+ wma->wma_ibss_power_save_params.txSPEndInactivityTime);
+ if (ret < 0) {
+ WMA_LOGE("Failed, set WMI_VDEV_PARAM_TXSP_END_INACTIVITY_TIME_MS ret=%d",
+ ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ return VOS_STATUS_SUCCESS;
+}
+
static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
{
ol_txrx_pdev_handle pdev;
@@ -9286,6 +9432,21 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
add_bss->staContext.staIdx = ol_txrx_local_peer_id(peer);
+ /*
+ * If IBSS Power Save is supported by firmware
+ * set the IBSS power save params to firmware.
+ */
+ if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
+ WMI_SERVICE_IBSS_PWRSAVE)) {
+ status = wma_set_ibss_pwrsave_params(wma, vdev_id);
+ if (status != VOS_STATUS_SUCCESS) {
+ WMA_LOGE("%s: Failed to Set IBSS Power Save Params to firmware",
+ __func__);
+ goto peer_cleanup;
+ }
+ }
+
+
vos_mem_zero(&req, sizeof(req));
req.vdev_id = vdev_id;
req.chan = add_bss->currentOperChannel;
@@ -17111,6 +17272,11 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
vos_mem_free(msg->bodyptr);
break;
+ case WDA_ROAM_PREAUTH_IND:
+ wma_roam_preauth_ind(wma_handle, msg->bodyptr);
+ vos_mem_free(msg->bodyptr);
+ break;
+
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */
@@ -17132,6 +17298,8 @@ static int wma_scan_event_callback(WMA_HANDLE handle, u_int8_t *data,
tSirScanOffloadEvent *scan_event;
u_int8_t vdev_id;
v_U32_t scan_id;
+ u_int8_t *buf;
+ vos_msg_t vos_msg = {0};
VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
param_buf = (WMI_SCAN_EVENTID_param_tlvs *) data;
@@ -17139,15 +17307,43 @@ static int wma_scan_event_callback(WMA_HANDLE handle, u_int8_t *data,
vdev_id = wmi_event->vdev_id;
scan_id = wma_handle->interfaces[vdev_id].scan_info.scan_id;
- if (wma_handle->roam_preauth_scan_id == wmi_event->scan_id) {
- /* This is the scan requested by roam preauth set_channel operation */
+ adf_os_spin_lock_bh(&wma_handle->roam_preauth_lock);
+ if (wma_handle->roam_preauth_scan_id == wmi_event->scan_id) {
+ /* This is the scan requested by roam preauth set_channel operation */
+ adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
- if (wmi_event->event == WMI_SCAN_EVENT_COMPLETED)
+ if (wmi_event->event == WMI_SCAN_EVENT_COMPLETED) {
+ WMA_LOGE(" roam scan complete - scan_id %x, vdev_id %x",
+ wmi_event->scan_id, vdev_id);
wma_reset_scan_info(wma_handle, vdev_id);
+ }
+
+ buf = vos_mem_malloc(sizeof(wmi_scan_event_fixed_param));
+ if (!buf) {
+ WMA_LOGE("%s: Memory alloc failed for roam preauth ind",
+ __func__);
+ return -ENOMEM;
+ }
+ vos_mem_zero(buf, sizeof(wmi_scan_event_fixed_param));
+ vos_mem_copy(buf, (u_int8_t *)wmi_event,
+ sizeof(wmi_scan_event_fixed_param));
+
+ vos_msg.type = WDA_ROAM_PREAUTH_IND;
+ vos_msg.bodyptr = buf;
+ vos_msg.bodyval = 0;
+
+ if (VOS_STATUS_SUCCESS !=
+ vos_mq_post_message(VOS_MQ_ID_WDA, &vos_msg)) {
+ WMA_LOGE("%s: Failed to post WDA_ROAM_PREAUTH_IND msg",
+ __func__);
+ vos_mem_free(buf);
+ return -1;
+ }
+ WMA_LOGD("%s: WDA_ROAM_PREAUTH_IND posted", __func__);
+ return 0;
+ }
+ adf_os_spin_unlock_bh(&wma_handle->roam_preauth_lock);
- wma_roam_preauth_scan_event_handler(wma_handle, vdev_id, wmi_event);
- return 0;
- }
scan_event = (tSirScanOffloadEvent *) vos_mem_malloc
(sizeof(tSirScanOffloadEvent));
if (!scan_event) {
@@ -17185,17 +17381,22 @@ static int wma_scan_event_callback(WMA_HANDLE handle, u_int8_t *data,
scan_event->reasonCode = eSIR_SME_SCAN_FAILED;
break;
case WMI_SCAN_EVENT_PREEMPTED:
- WMA_LOGW("%s: Unhandled Scan Event WMI_SCAN_EVENT_PREEMPTED", __func__);
+ {
+ tAbortScanParams abortScan;
+ abortScan.SessionId = vdev_id;
+ wma_stop_scan(wma_handle, &abortScan);
break;
+ }
case WMI_SCAN_EVENT_RESTARTED:
- WMA_LOGW("%s: Unhandled Scan Event WMI_SCAN_EVENT_RESTARTED", __func__);
+ WMA_LOGW("%s: Unexpected Scan Event %u", __func__, wmi_event->event);
break;
}
/* Stop the scan completion timeout if the event is WMI_SCAN_EVENT_COMPLETED */
if (scan_event->event == (tSirScanEventType)WMI_SCAN_EVENT_COMPLETED) {
- WMA_LOGI("Received WMI_SCAN_EVENT_COMPLETED, Stoping the scan timer");
- vos_status = vos_timer_stop(&wma_handle->wma_scan_comp_timer);
+ WMA_LOGE(" scan complete - scan_id %x, vdev_id %x",
+ wmi_event->scan_id, vdev_id);
+ vos_status = vos_timer_stop(&wma_handle->wma_scan_comp_timer);
if (vos_status != VOS_STATUS_SUCCESS) {
WMA_LOGE("Failed to stop the scan completion timeout");
vos_mem_free(scan_event);
@@ -17450,9 +17651,11 @@ static int wma_roam_event_callback(WMA_HANDLE handle, u_int8_t *event_buf,
case WMI_ROAM_REASON_BETTER_AP:
WMA_LOGD("%s:Better AP found for vdevid %x, rssi %d", __func__,
wmi_event->vdev_id, wmi_event->rssi);
+ wma_handle->suitable_ap_hb_failure = FALSE;
wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
break;
case WMI_ROAM_REASON_SUITABLE_AP:
+ wma_handle->suitable_ap_hb_failure = TRUE;
WMA_LOGD("%s:Bmiss scan AP found for vdevid %x, rssi %d", __func__,
wmi_event->vdev_id, wmi_event->rssi);
wma_roam_better_ap_handler(wma_handle, wmi_event->vdev_id);
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index af983378f624..747607f5856a 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -124,7 +124,7 @@
#ifdef WMA_DEBUG_ALWAYS
#define WMA_LOGA(fmt, args...) \
- printk(KERN_INFO "\n%s-%d: " fmt, __func__, __LINE__, ## args)
+ printk(KERN_INFO "%s-%d: " fmt"\n", __func__, __LINE__, ## args)
#else
#define WMA_LOGA(fmt, args...)
#endif
@@ -134,6 +134,8 @@
/* Prefix used by scan req ids generated on the host */
#define WMA_HOST_SCAN_REQID_PREFIX 0xA000
+/* Prefix used by roam scan req ids generated on the host */
+#define WMA_HOST_ROAM_SCAN_REQID_PREFIX 0xA800
/* Prefix used by scan requestor id on host */
#define WMA_HOST_SCAN_REQUESTOR_ID_PREFIX 0xA000
#define WMA_HW_DEF_SCAN_MAX_DURATION 30000 /* 30 secs */
@@ -513,6 +515,15 @@ typedef struct {
}scan_timer_info;
typedef struct {
+ u_int32_t atimWindowLength;
+ u_int32_t isPowerSaveAllowed;
+ u_int32_t isPowerCollapseAllowed;
+ u_int32_t isAwakeonTxRxEnabled;
+ u_int32_t inactivityCount;
+ u_int32_t txSPEndInactivityTime;
+}ibss_power_save_params;
+
+typedef struct {
void *wmi_handle;
void *htc_handle;
void *vos_context;
@@ -639,6 +650,10 @@ typedef struct {
scan_timer_info wma_scan_timer_info;
u_int8_t dfs_phyerr_filter_offload;
+ v_BOOL_t suitable_ap_hb_failure;
+
+ /* IBSS Power Save config Parameters */
+ ibss_power_save_params wma_ibss_power_save_params;
}t_wma_handle, *tp_wma_handle;
@@ -1257,13 +1272,22 @@ typedef struct {
* does not involve sending a wmi command.
*/
enum wma_cfg_cmd_id {
- WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID = WMI_CMDID_MAX,
- WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
- /* Set time latency and time quota for MCC home channels */
- WMA_VDEV_MCC_SET_TIME_LATENCY,
- WMA_VDEV_MCC_SET_TIME_QUOTA,
- /* Add any new command before this */
- WMA_CMD_ID_MAX
+ WMA_VDEV_TXRX_FWSTATS_ENABLE_CMDID = WMI_CMDID_MAX,
+ WMA_VDEV_TXRX_FWSTATS_RESET_CMDID,
+ /* Set time latency and time quota for MCC home channels */
+ WMA_VDEV_MCC_SET_TIME_LATENCY,
+ WMA_VDEV_MCC_SET_TIME_QUOTA,
+
+ /* IBSS Power Save Parameters */
+ WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE,
+ WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED,
+ WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED,
+ WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX,
+ WMA_VDEV_IBSS_SET_INACTIVITY_TIME,
+ WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME,
+
+ /* Add any new command before this */
+ WMA_CMD_ID_MAX
};
typedef struct wma_trigger_uapsd_params
@@ -1517,6 +1541,8 @@ u_int16_t dfs_usenol(struct ieee80211com *ic);
#define WMA_SMPS_MASK_UPPER_3BITS 0x7
#define WMA_SMPS_PARAM_VALUE_S 29
+#define WMA_MAX_SCAN_ID 0x00FF
+
/* U-APSD Access Categories */
enum uapsd_ac {
UAPSD_BE,
diff --git a/CORE/SERVICES/WMI/wmi_unified.c b/CORE/SERVICES/WMI/wmi_unified.c
index 4651d8a5c3e4..35f8c8a07dee 100644
--- a/CORE/SERVICES/WMI/wmi_unified.c
+++ b/CORE/SERVICES/WMI/wmi_unified.c
@@ -527,6 +527,8 @@ static u_int8_t* get_wmi_cmd_string(WMI_CMD_ID wmi_command)
CASE_RETURN_STRING(WMI_OBSS_SCAN_DISABLE_CMDID);
CASE_RETURN_STRING(WMI_PEER_GET_ESTIMATED_LINKSPEED_CMDID);
CASE_RETURN_STRING(WMI_ROAM_SCAN_CMD);
+ CASE_RETURN_STRING(WMI_PDEV_SET_LED_CONFIG_CMDID);
+ CASE_RETURN_STRING(WMI_HOST_AUTO_SHUTDOWN_CFG_CMDID);
}
return "Invalid WMI cmd";
}
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 55e081a7132d..522e554fe417 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -323,7 +323,7 @@ eHalStatus csr_init_chan_list(tpAniSirGlobal mac, v_U8_t *alpha2)
mac->scan.countryCodeDefault[1] = alpha2[1];
mac->scan.countryCodeDefault[2] = alpha2[2];
- smsLog(mac, LOG1, FL("country Code from nvRam %.2s"),
+ smsLog(mac, LOGE, FL("init time country code %.2s"),
mac->scan.countryCodeDefault);
if ('0' == mac->scan.countryCodeDefault[0] &&
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index dbe821d6d9f2..fa581bf2aba5 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -1171,11 +1171,18 @@ void
PopulateDot11fIBSSParams(tpAniSirGlobal pMac,
tDot11fIEIBSSParams *pDot11f, tpPESession psessionEntry)
{
+ tANI_U32 val = 0;
if ( eLIM_STA_IN_IBSS_ROLE == psessionEntry->limSystemRole )
{
+ if(wlan_cfgGetInt(pMac,
+ WNI_CFG_IBSS_ATIM_WIN_SIZE, &val) != eSIR_SUCCESS)
+ {
+ PELOGE(limLog(pMac, LOGE,
+ FL("could not retrieve IBSS ATIM WIN size"));)
+ }
pDot11f->present = 1;
// ATIM duration is always set to 0
- pDot11f->atim = 0;
+ pDot11f->atim = val;
}
} // End PopulateDot11fIBSSParams.
diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c
index ff2e54688386..40cca65393ee 100644
--- a/CORE/UTILS/FWLOG/dbglog_host.c
+++ b/CORE/UTILS/FWLOG/dbglog_host.c
@@ -143,6 +143,8 @@ const char *dbglog_get_module_str(A_UINT32 module_id)
return "P2P";
case WLAN_MODULE_WOW:
return "WoW";
+ case WLAN_MODULE_IBSS_PWRSAVE:
+ return "IBSS PS";
default:
return "UNKNOWN";
}
@@ -1123,6 +1125,34 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] =
{
/* WLAN_MODULE_NAN */
},
+ {
+ /* WLAN_MODULE_IBSS_PWRSAVE */
+ "IBSS_PS_DBGID_DEFINITION_START",
+ "IBSS_PS_DBGID_PEER_CREATE",
+ "IBSS_PS_DBGID_PEER_DELETE",
+ "IBSS_PS_DBGID_VDEV_CREATE",
+ "IBSS_PS_DBGID_VDEV_DELETE",
+ "IBSS_PS_DBGID_VDEV_EVENT",
+ "IBSS_PS_DBGID_PEER_EVENT",
+ "IBSS_PS_DBGID_DELIVER_CAB",
+ "IBSS_PS_DBGID_DELIVER_UC_DATA",
+ "IBSS_PS_DBGID_DELIVER_UC_DATA_ERROR",
+ "IBSS_PS_DBGID_UC_INACTIVITY_TMR_RESTART",
+ "IBSS_PS_DBGID_MC_INACTIVITY_TMR_RESTART",
+ "IBSS_PS_DBGID_NULL_TX_COMPLETION",
+ "IBSS_PS_DBGID_ATIM_TIMER_START",
+ "IBSS_PS_DBGID_UC_ATIM_SEND",
+ "IBSS_PS_DBGID_BC_ATIM_SEND",
+ "IBSS_PS_DBGID_UC_TIMEOUT",
+ "IBSS_PS_DBGID_PWR_COLLAPSE_ALLOWED",
+ "IBSS_PS_DBGID_PWR_COLLAPSE_NOT_ALLOWED",
+ "IBSS_PS_DBGID_SET_PARAM",
+ "IBSS_PS_DBGID_HOST_TX_PAUSE",
+ "IBSS_PS_DBGID_HOST_TX_UNPAUSE",
+ "IBSS_PS_DBGID_PS_DESC_BIN_HWM",
+ "IBSS_PS_DBGID_PS_DESC_BIN_LWM",
+ "IBSS_PS_DBGID_PS_KICKOUT_PEER",
+ },
};
int dbglog_module_log_enable(wmi_unified_t wmi_handle, A_UINT32 mod_id,
@@ -1983,6 +2013,333 @@ dbglog_sta_powersave_print_handler(
return TRUE;
}
+/* IBSS PS sub modules */
+enum wlan_ibss_ps_sub_module {
+ WLAN_IBSS_PS_SUB_MODULE_IBSS_NW_SM = 0,
+ WLAN_IBSS_PS_SUB_MODULE_IBSS_SELF_PS = 1,
+ WLAN_IBSS_PS_SUB_MODULE_IBSS_PEER_PS = 2,
+ WLAN_IBSS_PS_SUB_MODULE_MAX = 3,
+};
+
+#define WLAN_IBSS_PS_SUB_MODULE_OFFSET 0x1E
+
+A_BOOL
+dbglog_ibss_powersave_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 *nw_states[] = {
+ "WAIT_FOR_TBTT",
+ "ATIM_WINDOW_PRE_BCN",
+ "ATIM_WINDOW_POST_BCN",
+ "OUT_OF_ATIM_WINDOW",
+ };
+
+ static const char *ps_states[] = {
+ "ACTIVE",
+ "SLEEP_TX_SEND",
+ "SLEEP_DOZE_PAUSE_PENDING",
+ "SLEEP_DOZE",
+ "SLEEP_AWAKE",
+ "ACTIVE_TX_SEND",
+ };
+
+ static const char *peer_ps_states[] = {
+ "ACTIVE",
+ "SLEEP_AWAKE",
+ "SLEEP_DOZE",
+ "PS_UNKNOWN",
+ };
+
+ static const char *events[] = {
+ "START",
+ "STOP",
+ "SWBA",
+ "TBTT",
+ "TX_BCN_CMP",
+ "SEND_COMPLETE",
+ "SEND_N_COMPLETE",
+ "PRE_SEND",
+ "RX",
+ "UC_INACTIVITY_TIMEOUT",
+ "BC_INACTIVITY_TIMEOUT",
+ "ATIM_WINDOW_BEGIN",
+ "ATIM_WINDOW_END",
+ "HWQ_EMPTY",
+ "UC_ATIM_RCVD",
+ "TRAFFIC_EXCHANGE_DONE",
+ "POWER_SAVE_STATE_CHANGE",
+ "NEW_PEER_JOIN",
+ "IBSS_VDEV_PAUSE",
+ "IBSS_VDEV_UNPAUSE",
+ "PS_STATE_CHANGE"
+ };
+
+ enum wlan_ibss_ps_sub_module sub_module;
+
+ switch (dbg_id) {
+ case DBGLOG_DBGID_SM_FRAMEWORK_PROXY_DBGLOG_MSG:
+ sub_module = (args[1] >> WLAN_IBSS_PS_SUB_MODULE_OFFSET) & 0x3;
+ switch(sub_module)
+ {
+ case WLAN_IBSS_PS_SUB_MODULE_IBSS_NW_SM:
+ dbglog_sm_print(timestamp, vap_id, numargs, args, "IBSS PS NW",
+ nw_states, ARRAY_LENGTH(nw_states), events,
+ ARRAY_LENGTH(events));
+ break;
+ case WLAN_IBSS_PS_SUB_MODULE_IBSS_SELF_PS:
+ dbglog_sm_print(timestamp, vap_id, numargs, args,
+ "IBSS PS Self", ps_states, ARRAY_LENGTH(ps_states),
+ events, ARRAY_LENGTH(events));
+ break;
+ case WLAN_IBSS_PS_SUB_MODULE_IBSS_PEER_PS:
+ dbglog_sm_print(timestamp, vap_id, numargs, args,
+ "IBSS PS Peer", peer_ps_states,
+ ARRAY_LENGTH(peer_ps_states), events,
+ ARRAY_LENGTH(events));
+ break;
+ default:
+ break;
+ }
+ break;
+ case IBSS_PS_DBGID_PEER_CREATE:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: peer alloc failed for peer ID:%u", args[0]);
+ } else if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: create peer ID=%u", args[0]);
+ }
+ break;
+ case IBSS_PS_DBGID_PEER_DELETE:
+ if (numargs == 4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: delete peer ID=%u num_peers:%d num_sleeping_peers:%d ps_enabled_for_this_peer:%d",
+ args[0], args[1], args[2], args[3]);
+ }
+ break;
+ case IBSS_PS_DBGID_VDEV_CREATE:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: vdev alloc failed",
+ args[0]);
+ } else if (numargs == 0) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: vdev created");
+ }
+ break;
+ case IBSS_PS_DBGID_VDEV_DELETE:
+ dbglog_printf(timestamp, vap_id, "IBSS PS: vdev deleted");
+ break;
+
+ case IBSS_PS_DBGID_VDEV_EVENT:
+ if (numargs == 1) {
+ if (args[0] == 5) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: vdev event for peer add");
+ } else if (args[0] == 7) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: vdev event for peer delete");
+ }
+ else {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: vdev event %u", args[0]);
+ }
+ }
+ break;
+
+ case IBSS_PS_DBGID_PEER_EVENT:
+ if (numargs == 4) {
+ if (args[0] == 0xFFFF) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: pre_send for peer:%u peer_type:%u sm_event_mask:%0x",
+ args[1], args[3], args[2]);
+ } else if (args[0] == 0x20000) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: send_complete for peer:%u peer_type:%u sm_event_mask:%0x",
+ args[1], args[3], args[2]);
+ } else if (args[0] == 0x10) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: send_n_complete for peer:%u peer_type:%u sm_event_mask:%0x",
+ args[1], args[3], args[2]);
+ } else if (args[0] == 0x40) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: rx event for peer:%u peer_type:%u sm_event_mask:%0x",
+ args[1], args[3], args[2]);
+ } else if (args[0] == 0x4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: hw_q_empty for peer:%u peer_type:%u sm_event_mask:%0x",
+ args[1], args[3], args[2]);
+ }
+ }
+ break;
+
+ case IBSS_PS_DBGID_DELIVER_CAB:
+ if (numargs == 4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Deliver CAB n_mpdu:%d send_flags:%0x tid_cur:%d q_depth_for_other_tid:%d",
+ args[0], args[1], args[2], args[3]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_DELIVER_UC_DATA:
+ if (numargs == 4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Deliver UC data peer:%d tid:%d n_mpdu:%d send_flags:%0x",
+ args[0], args[1], args[2], args[3]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_DELIVER_UC_DATA_ERROR:
+ if (numargs == 4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Deliver UC data error peer:%d tid:%d allowed_tidmask:%0x, pending_tidmap:%0x",
+ args[0], args[1], args[2], args[3]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_UC_INACTIVITY_TMR_RESTART:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: UC timer restart peer:%d timer_val:%0x",
+ args[0], args[1]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_MC_INACTIVITY_TMR_RESTART:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: MC timer restart timer_val:%0x",
+ args[0]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_NULL_TX_COMPLETION:
+ if (numargs == 3) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: null tx completion peer:%d tx_completion_status:%d flags:%0x",
+ args[0], args[1], args[2]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_ATIM_TIMER_START:
+ if (numargs == 4) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: ATIM timer start tsf:%0x %0x tbtt:%0x %0x",
+ args[0], args[1], args[2], args[3]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_UC_ATIM_SEND:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Send ATIM to peer:%d",
+ args[1]);
+ } else if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: no peers to send UC ATIM",
+ args[1]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_BC_ATIM_SEND:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: MC Data, num_of_peers:%d mc_atim_sent:%d",
+ args[1], args[0]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_UC_TIMEOUT:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: UC timeout for peer:%d send_null:%d",
+ args[0], args[1]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_PWR_COLLAPSE_ALLOWED:
+ dbglog_printf(timestamp, vap_id, "IBSS PS: allow power collapse");
+ break;
+
+ case IBSS_PS_DBGID_PWR_COLLAPSE_NOT_ALLOWED:
+ if (numargs == 0) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: power collapse not allowed by INI");
+ } else if (numargs == 3) {
+ if (args[0] == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: power collapse not allowed, non-zero qdepth %d %d",
+ args[1], args[2]);
+ } else if (args[0] == 3) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: power collapse not allowed by peer:%d peer_flags:%0x",
+ args[1], args[2]);
+ }
+ } else if (numargs == 5) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: power collapse not allowed by state m/c nw_cur_state:%d nw_next_state:%d ps_cur_state:%d flags:%0x",
+ args[1], args[2], args[3], args[4]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_SET_PARAM:
+ if (numargs == 2) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Set Param ID:%0x Value:%0x",
+ args[0], args[1]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_HOST_TX_PAUSE:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Pausing host, vdev_map:%0x",
+ args[0]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_HOST_TX_UNPAUSE:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Unpausing host, vdev_map:%0x",
+ args[0]);
+ }
+ break;
+ case IBSS_PS_DBGID_PS_DESC_BIN_LWM:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: LWM, vdev_map:%0x",
+ args[0]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_PS_DESC_BIN_HWM:
+ if (numargs == 1) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: HWM, vdev_map:%0x",
+ args[0]);
+ }
+ break;
+
+ case IBSS_PS_DBGID_PS_KICKOUT_PEER:
+ if (numargs == 3) {
+ dbglog_printf(timestamp, vap_id,
+ "IBSS PS: Kickout peer id:%d atim_fail_cnt:%d status:%d",
+ args[0], args[1], args[2]);
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
A_BOOL dbglog_ratectrl_print_handler(
A_UINT32 mod_id,
@@ -3490,6 +3847,8 @@ dbglog_init(wmi_unified_t wmi_handle)
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);
+ dbglog_reg_modprint(WLAN_MODULE_IBSS_PWRSAVE,
+ dbglog_ibss_powersave_print_handler);
/* Register handler for F3 or debug messages */
res = wmi_unified_register_event_handler(wmi_handle, WMI_DEBUG_MESG_EVENTID,
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 8030023408bd..3c8726bea64f 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1350,6 +1350,8 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb);
#define WDA_VDEV_START_RSP_IND SIR_HAL_VDEV_START_RSP_IND
+#define WDA_ROAM_PREAUTH_IND SIR_HAL_ROAM_PREAUTH_IND
+
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index 024cc49500a7..32d441117674 100755
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ