diff options
| author | Pitani Venkata Rajesh Kumar <vpitan@codeaurora.org> | 2014-06-10 18:42:35 +0530 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <vpitan@codeaurora.org> | 2014-06-10 18:45:51 +0530 |
| commit | fd4552d2f5ffd7962f0e3bf2be935f490275da24 (patch) | |
| tree | 8976def29a0b8e32a5ab55bb1fd31437f4011f09 | |
| parent | 2b0968cafd644be3ad810905386791a281aa9db9 (diff) | |
| parent | 4bedb6a5d35e5256b1d35a318e8201a31089bf0d (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
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 Binary files differindex 024cc49500a7..32d441117674 100755 --- a/firmware_bin/WCNSS_cfg.dat +++ b/firmware_bin/WCNSS_cfg.dat |
