From 51e5dc37b48c43c35dc945535a03bd16a8012854 Mon Sep 17 00:00:00 2001 From: c_zding Date: Wed, 29 Jun 2016 10:23:17 +0800 Subject: qcacld-2.0: Clean up enum station_info_flags for Kernel upgrade The station_info_flags is removed from cfg80211.h since Kernel 4.0. Since they're duplicate information that's already in nl80211 attributes. Change-Id: I7c8e2f2dabd5713cb25523df5b25e59d0c4b06aa CRs-Fixed: 1033754 --- CORE/HDD/src/wlan_hdd_cfg80211.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index b15735a861bb..a21a026a5331 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -20691,8 +20691,13 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, } if (rssi_stats_valid) { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)) sinfo->filled |= STATION_INFO_CHAIN_SIGNAL_AVG; sinfo->filled |= STATION_INFO_SIGNAL_AVG; +#else + sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL_AVG); + sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL); +#endif } #endif -- cgit v1.2.3 From d1ce9c70ab751f0b7d8ecc267858fee94a2816d2 Mon Sep 17 00:00:00 2001 From: Yingying Tang Date: Thu, 2 Jun 2016 17:55:10 +0800 Subject: qcacld-2.0: Set number of clients separately for SAP and GO Currently there is only one ini item gSoftApMaxPeers to configure max SAP clients number, and this item will also affect GO clients. Add another ini item to set GO clients number. Change-Id: I9aaacf035efb042f8216ca0d7f1ec3f21f11b212 CRs-Fixed: 1023547 --- CORE/HDD/inc/wlan_hdd_cfg.h | 17 ++++++++++++++++- CORE/HDD/inc/wlan_hdd_cfg80211.h | 2 +- CORE/HDD/inc/wlan_hdd_main.h | 1 + CORE/HDD/src/wlan_hdd_cfg.c | 25 +++++++++++++++++++++++-- CORE/HDD/src/wlan_hdd_cfg80211.c | 6 +++--- CORE/HDD/src/wlan_hdd_hostapd.c | 2 +- CORE/HDD/src/wlan_hdd_main.c | 8 +++++++- CORE/MAC/inc/aniGlobal.h | 2 ++ CORE/MAC/inc/wniCfgAp.h | 23 ++++++++++++++++++++--- CORE/MAC/inc/wniCfgSta.h | 14 ++++++++++++-- CORE/MAC/src/cfg/cfgProcMsg.c | 16 +++++++++++++++- CORE/MAC/src/pe/lim/limAIDmgmt.c | 12 ++++++++++-- CORE/MAC/src/pe/lim/limApi.c | 13 +++++++++++++ CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c | 14 +++++++++++++- CORE/MAC/src/pe/lim/limProcessCfgUpdates.c | 18 ++++++++++++++++++ CORE/VOSS/src/vos_api.c | 6 +++--- 16 files changed, 158 insertions(+), 21 deletions(-) diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 828f126c8333..06d44639c416 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -2661,11 +2661,25 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */ #define CFG_IBSS_PS_1RX_CHAIN_IN_ATIM_WINDOW_MAX (1) #define CFG_IBSS_PS_1RX_CHAIN_IN_ATIM_WINDOW_DEFAULT (0) +/* + * Max peers number of SAP + */ #define CFG_SAP_MAX_NO_PEERS "gSoftApMaxPeers" #define CFG_SAP_MAX_NO_PEERS_MIN (1) #define CFG_SAP_MAX_NO_PEERS_MAX (32) #define CFG_SAP_MAX_NO_PEERS_DEFAULT (32) +/* + * Max peers number of P2P GO + * To make it backward compatible with old INI file which only set + * gSoftApMaxPeers, set gGoMaxPeers default value to 0, and add logic + * to set this item same as gSoftApMaxPeers if the value is 0 + */ +#define CFG_GO_MAX_NO_PEERS "gGoMaxPeers" +#define CFG_GO_MAX_NO_PEERS_MIN (0) +#define CFG_GO_MAX_NO_PEERS_MAX (32) +#define CFG_GO_MAX_NO_PEERS_DEFAULT (0) + /* * Connection related log Enable/Disable. * 0x1 - Enable mgmt pkt logs (no probe req/rsp). @@ -4399,7 +4413,8 @@ struct hdd_config { #endif v_U8_t maxWoWFilters; v_U8_t wowEnable; - v_U8_t maxNumberOfPeers; + v_U8_t max_sap_peers; + v_U8_t max_go_peers; v_U8_t disableDFSChSwitch; v_U8_t enableDFSMasterCap; v_U16_t thermalTempMinLevel0; diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index 6fc13ed3588f..86225855b675 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -1961,7 +1961,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, void wlan_hdd_cfg80211_deinit(struct wiphy *wiphy); void wlan_hdd_update_wiphy(struct wiphy *wiphy, - hdd_config_t *pCfg); + hdd_context_t *ctx); int wlan_hdd_cfg80211_register( struct wiphy *wiphy); void wlan_hdd_cfg80211_register_frames(hdd_adapter_t* pAdapter); diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index e5cdec427b15..1de463f16776 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -1835,6 +1835,7 @@ struct hdd_context_s bool driver_being_stopped; /* Track if DRIVER STOP cmd is sent */ uint8_t max_mc_addr_list; struct acs_dfs_policy acs_policy; + uint8_t max_peers; }; /*--------------------------------------------------------------------------- diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 3c1e918f7982..edd01861f435 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -3001,12 +3001,19 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_IBSS_ATIM_WIN_SIZE_MAX ), REG_VARIABLE( CFG_SAP_MAX_NO_PEERS, WLAN_PARAM_Integer, - hdd_config_t, maxNumberOfPeers, + hdd_config_t, max_sap_peers, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, CFG_SAP_MAX_NO_PEERS_DEFAULT, CFG_SAP_MAX_NO_PEERS_MIN, CFG_SAP_MAX_NO_PEERS_MAX), + REG_VARIABLE( CFG_GO_MAX_NO_PEERS, WLAN_PARAM_Integer, + hdd_config_t, max_go_peers, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_GO_MAX_NO_PEERS_DEFAULT, + CFG_GO_MAX_NO_PEERS_MIN, + CFG_GO_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, @@ -6857,7 +6864,7 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx ) } else { - val = pConfig->maxNumberOfPeers; + val = pHddCtx->max_peers; } if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ASSOC_STA_LIMIT, val, @@ -6866,6 +6873,20 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx ) fStatus = FALSE; hddLog(LOGE,"Failure: Could not pass on WNI_CFG_ASSOC_STA_LIMIT configuration info to CCM"); } + + if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ASSOC_STA_LIMIT_AP, + pConfig->max_sap_peers, NULL, eANI_BOOLEAN_FALSE) + == eHAL_STATUS_FAILURE) { + fStatus = FALSE; + hddLog(LOGE,"can't pass WNI_CFG_ASSOC_STA_LIMIT_AP to CCM"); + } + + if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ASSOC_STA_LIMIT_GO, + pConfig->max_go_peers, NULL, eANI_BOOLEAN_FALSE) + == eHAL_STATUS_FAILURE) { + fStatus = FALSE; + hddLog(LOGE,"can't pass WNI_CFG_ASSOC_STA_LIMIT_GO to CCM"); + } #endif if(ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ENABLE_LPWR_IMG_TRANSITION, pConfig->enableLpwrImgTransition, NULL, eANI_BOOLEAN_FALSE) diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index a21a026a5331..340f70c87c83 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -12055,7 +12055,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, } #endif - wiphy->max_ap_assoc_sta = pCfg->maxNumberOfPeers; + wiphy->max_ap_assoc_sta = pHddCtx->max_peers; #ifdef QCA_HT_2040_COEX wiphy->features |= NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE; #endif @@ -12098,9 +12098,9 @@ void wlan_hdd_cfg80211_deinit(struct wiphy *wiphy) * of all required members can be done here. */ void wlan_hdd_update_wiphy(struct wiphy *wiphy, - hdd_config_t *pCfg) + hdd_context_t *ctx) { - wiphy->max_ap_assoc_sta = pCfg->maxNumberOfPeers; + wiphy->max_ap_assoc_sta = ctx->max_peers; if (!sme_IsFeatureSupportedByFW(DOT11AC)) { wiphy->bands[IEEE80211_BAND_2GHZ]->vht_cap.vht_supported = 0; wiphy->bands[IEEE80211_BAND_2GHZ]->vht_cap.cap = 0; diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 2a806fe8c5ac..480aafb07d5b 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -5398,7 +5398,7 @@ hdd_softap_get_sta_info(hdd_adapter_t *pAdapter, v_U8_t *pBuf, int buf_len) pBuf += len; buf_len -= len; - maxSta = pHddCtx->cfg_ini->maxNumberOfPeers; + maxSta = pHddCtx->max_peers; for (i = 0; i <= maxSta; i++) { diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 77c3338c9ab7..32d21d50ecd6 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -14630,6 +14630,12 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) goto err_config; } + if (0 == pHddCtx->cfg_ini->max_go_peers) + pHddCtx->cfg_ini->max_go_peers = pHddCtx->cfg_ini->max_sap_peers; + + pHddCtx->max_peers = MAX(pHddCtx->cfg_ini->max_sap_peers, + pHddCtx->cfg_ini->max_go_peers); + ((VosContextType*)pVosContext)->pHIFContext = hif_sc; /* store target type and target version info in hdd ctx */ @@ -14816,7 +14822,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) goto err_vosclose; } - wlan_hdd_update_wiphy(wiphy, pHddCtx->cfg_ini); + wlan_hdd_update_wiphy(wiphy, pHddCtx); if (sme_IsFeatureSupportedByFW(DOT11AC)) { hddLog(VOS_TRACE_LEVEL_INFO_HIGH, "%s: support 11ac", __func__); diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index aac66ec46068..4c1235f8dabc 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -592,6 +592,8 @@ typedef struct sAniSirLim /// Variable to keep track of number of currently associated STAs tANI_U16 gLimNumOfAniSTAs; // count of ANI peers tANI_U16 gLimAssocStaLimit; + uint16_t glim_assoc_sta_limit_ap; + uint16_t glim_assoc_sta_limit_go; // Heart-Beat interval value tANI_U32 gLimHeartBeatCount; diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h index a99db6140104..dbc5ab58d29f 100644 --- a/CORE/MAC/inc/wniCfgAp.h +++ b/CORE/MAC/inc/wniCfgAp.h @@ -343,7 +343,8 @@ #define WNI_CFG_VHT_ENABLE_TXBF_20MHZ 296 #define WNI_CFG_TDLS_WMM_MODE_ENABLED 297 #define WNI_CFG_TGT_GTX_USR_CFG 298 - +#define WNI_CFG_ASSOC_STA_LIMIT_GO 299 +#define WNI_CFG_ASSOC_STA_LIMIT_AP 300 /* * String parameter lengths */ @@ -2516,10 +2517,26 @@ #define WNI_CFG_TGT_GTX_USR_CFG_APMAX 32 #define WNI_CFG_TGT_GTX_USR_CFG_APDEF 32 -#define CFG_PARAM_MAX_NUM 299 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STAMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STAMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STADEF 10 + +#define WNI_CFG_ASSOC_STA_LIMIT_AP_APMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_APMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_APDEF 10 + +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STAMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STAMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STADEF 10 + +#define WNI_CFG_ASSOC_STA_LIMIT_GO_APMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_APMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_APDEF 10 + +#define CFG_PARAM_MAX_NUM 301 #define CFG_AP_IBUF_MAX_SIZE 246 #define CFG_AP_SBUF_MAX_SIZE 3233 -#define CFG_STA_IBUF_MAX_SIZE 242 +#define CFG_STA_IBUF_MAX_SIZE 244 #define CFG_STA_SBUF_MAX_SIZE 3199 #define CFG_SEM_MAX_NUM 19 diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h index cfeafbc91051..2ae9de219ba1 100644 --- a/CORE/MAC/inc/wniCfgSta.h +++ b/CORE/MAC/inc/wniCfgSta.h @@ -337,6 +337,8 @@ #define WNI_CFG_VHT_ENABLE_TXBF_20MHZ 296 #define WNI_CFG_TDLS_WMM_MODE_ENABLED 297 #define WNI_CFG_TGT_GTX_USR_CFG 298 +#define WNI_CFG_ASSOC_STA_LIMIT_GO 299 +#define WNI_CFG_ASSOC_STA_LIMIT_AP 300 /* * String parameter lengths @@ -1609,8 +1611,16 @@ #define WNI_CFG_TGT_GTX_USR_CFG_STAMAX 32 #define WNI_CFG_TGT_GTX_USR_CFG_STADEF 32 -#define CFG_PARAM_MAX_NUM 299 -#define CFG_STA_IBUF_MAX_SIZE 242 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STAMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STAMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_AP_STADEF 10 + +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STAMIN 1 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STAMAX 32 +#define WNI_CFG_ASSOC_STA_LIMIT_GO_STADEF 10 + +#define CFG_PARAM_MAX_NUM 301 +#define CFG_STA_IBUF_MAX_SIZE 244 #define CFG_STA_SBUF_MAX_SIZE 3199 #define CFG_SEM_MAX_NUM 19 diff --git a/CORE/MAC/src/cfg/cfgProcMsg.c b/CORE/MAC/src/cfg/cfgProcMsg.c index f81af89754ca..943ba48cab56 100644 --- a/CORE/MAC/src/cfg/cfgProcMsg.c +++ b/CORE/MAC/src/cfg/cfgProcMsg.c @@ -1905,7 +1905,21 @@ struct cgstatic cfg_static[CFG_PARAM_MAX_NUM] = { CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT, WNI_CFG_TGT_GTX_USR_CFG_STAMIN, WNI_CFG_TGT_GTX_USR_CFG_STAMAX, - WNI_CFG_TGT_GTX_USR_CFG_STADEF} + WNI_CFG_TGT_GTX_USR_CFG_STADEF}, + + {WNI_CFG_ASSOC_STA_LIMIT_AP, + CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT | + CFG_CTL_NTF_LIM, + WNI_CFG_ASSOC_STA_LIMIT_AP_STAMIN, + WNI_CFG_ASSOC_STA_LIMIT_AP_STAMAX, + WNI_CFG_ASSOC_STA_LIMIT_AP_STADEF}, + + {WNI_CFG_ASSOC_STA_LIMIT_GO, + CFG_CTL_VALID | CFG_CTL_RE | CFG_CTL_WE | CFG_CTL_INT | + CFG_CTL_NTF_LIM, + WNI_CFG_ASSOC_STA_LIMIT_GO_STAMIN, + WNI_CFG_ASSOC_STA_LIMIT_GO_STAMAX, + WNI_CFG_ASSOC_STA_LIMIT_GO_STADEF} }; struct cfgstatic_string cfg_static_string[CFG_MAX_STATIC_STRING] = { diff --git a/CORE/MAC/src/pe/lim/limAIDmgmt.c b/CORE/MAC/src/pe/lim/limAIDmgmt.c index d26a23b07dd0..3d3d7a3aad8f 100644 --- a/CORE/MAC/src/pe/lim/limAIDmgmt.c +++ b/CORE/MAC/src/pe/lim/limAIDmgmt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -134,10 +134,18 @@ tANI_U16 limAssignPeerIdx(tpAniSirGlobal pMac, tpPESession pSessionEntry) { tANI_U16 peerId; + uint8 max_peer = 0; + + if (pSessionEntry->pePersona == VOS_STA_SAP_MODE) + max_peer = pMac->lim.glim_assoc_sta_limit_ap; + + if (pSessionEntry->pePersona == VOS_P2P_GO_MODE) + max_peer = pMac->lim.glim_assoc_sta_limit_go; // make sure we haven't exceeded the configurable limit on associations // This count is global to ensure that it doesnt exceed the hardware limits. - if (peGetCurrentSTAsCount(pMac) >= pMac->lim.gLimAssocStaLimit) + if (peGetCurrentSTAsCount(pMac) >= pMac->lim.gLimAssocStaLimit || + pSessionEntry->gLimNumOfCurrentSTAs >= max_peer) { // too many associations already active return 0; diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c index 068620d8d6c0..4b41ef7f6d2e 100644 --- a/CORE/MAC/src/pe/lim/limApi.c +++ b/CORE/MAC/src/pe/lim/limApi.c @@ -305,6 +305,19 @@ static void __limInitAssocVars(tpAniSirGlobal pMac) } pMac->lim.gLimAssocStaLimit = val; pMac->lim.gLimIbssStaLimit = val; + if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT_AP, &val) != eSIR_SUCCESS) + limLog( pMac, LOGP, FL( "cfg get assoc sta of AP limit failed" )); + + pMac->lim.glim_assoc_sta_limit_ap = val; + + if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT_GO, &val) != eSIR_SUCCESS) + limLog( pMac, LOGP, FL( "cfg get assoc sta of GO limit failed" )); + + pMac->lim.glim_assoc_sta_limit_go = val; + + limLog(pMac, LOG1, FL("max_peer:%d ap_peer:%d go_peer:%d"), + pMac->lim.gLimAssocStaLimit, pMac->lim.glim_assoc_sta_limit_ap, + pMac->lim.glim_assoc_sta_limit_go); // Place holder for current authentication request // being handled pMac->lim.gpLimMlmAuthReq = NULL; diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c index cc24b8f76fae..c3934ef6bd0d 100644 --- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c +++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c @@ -253,6 +253,7 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U16 assocId = 0; bool assoc_req_copied = false; tDot11fIEVHTCaps *vht_caps; + uint8 max_peer = 0; limGetPhyMode(pMac, &phyMode, psessionEntry); @@ -847,10 +848,21 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, /// Extract pre-auth context for the STA, if any. pStaPreAuthContext = limSearchPreAuthList(pMac, pHdr->sa); + limLog(pMac, LOG1, FL( "max:%d ap:%d go:%d mode:%d"), + pMac->lim.gLimAssocStaLimit, pMac->lim.glim_assoc_sta_limit_ap, + pMac->lim.glim_assoc_sta_limit_go, psessionEntry->pePersona); + + if (psessionEntry->pePersona == VOS_STA_SAP_MODE) + max_peer = pMac->lim.glim_assoc_sta_limit_ap; + + if (psessionEntry->pePersona == VOS_P2P_GO_MODE) + max_peer = pMac->lim.glim_assoc_sta_limit_go; + if (pStaDs == NULL) { /// Requesting STA is not currently associated - if (peGetCurrentSTAsCount(pMac) == pMac->lim.gLimAssocStaLimit) + if ((peGetCurrentSTAsCount(pMac) == pMac->lim.gLimAssocStaLimit)|| + (psessionEntry->gLimNumOfCurrentSTAs == max_peer)) { /** * Maximum number of STAs that AP can handle reached. diff --git a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c index 37e45a8e3c72..ee433aedc5b5 100644 --- a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c +++ b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c @@ -552,6 +552,24 @@ limHandleCFGparamUpdate(tpAniSirGlobal pMac, tANI_U32 cfgId) pMac->lim.gLimAssocStaLimit = (tANI_U16)val1; break; + case WNI_CFG_ASSOC_STA_LIMIT_GO: + if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT_GO, &val1) + != eSIR_SUCCESS) { + limLog(pMac, LOGE, FL("Unable to get WNI_CFG_ASSOC_STA_LIMIT_GO")); + break; + } + pMac->lim.glim_assoc_sta_limit_go = (tANI_U16)val1; + break; + + case WNI_CFG_ASSOC_STA_LIMIT_AP: + if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT_AP, &val1) + != eSIR_SUCCESS) { + limLog(pMac, LOGE, FL("Unable to get WNI_CFG_ASSOC_STA_LIMIT_AP")); + break; + } + pMac->lim.glim_assoc_sta_limit_ap = (tANI_U16)val1; + break; + case WNI_CFG_DEL_ALL_RX_BA_SESSIONS_2_4_G_BTC: if (wlan_cfgGetInt (pMac, WNI_CFG_DEL_ALL_RX_BA_SESSIONS_2_4_G_BTC, &val1) != diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index b80c021b9499..dc96f4f4d7b6 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -496,7 +496,7 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize ) scn->enableuartprint = pHddCtx->cfg_ini->enablefwprint; scn->enablefwlog = pHddCtx->cfg_ini->enablefwlog; scn->enableFwSelfRecovery = pHddCtx->cfg_ini->enableFwSelfRecovery; - scn->max_no_of_peers = pHddCtx->cfg_ini->maxNumberOfPeers; + scn->max_no_of_peers = pHddCtx->max_peers; #ifdef WLAN_FEATURE_LPSS scn->enablelpasssupport = pHddCtx->cfg_ini->enablelpasssupport; #endif @@ -661,9 +661,9 @@ VOS_STATUS vos_open( v_CONTEXT_t *pVosContext, v_SIZE_t hddContextSize ) /* Number of peers limit differs in each chip version. If peer max * limit configured in ini exceeds more than supported, WMA adjusts * and keeps correct limit in macOpenParms.maxStation. So, make sure - * ini entry pHddCtx->cfg_ini->maxNumberOfPeers has adjusted value + * pHddCtx->max_peers has adjusted value */ - pHddCtx->cfg_ini->maxNumberOfPeers = macOpenParms.maxStation; + pHddCtx->max_peers = macOpenParms.maxStation; HTCHandle = vos_get_context(VOS_MODULE_ID_HTC, gpVosContext); if (!HTCHandle) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, -- cgit v1.2.3 From 5062dcd733b233fff066a2d187ef7ad668868395 Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Tue, 28 Jun 2016 15:33:27 +0530 Subject: qcacld-2.0: Fix static code analysis error Add NULL check for adf_ctx before using it in ol_tx_ll. Change-Id: Ice4c32caf65f5fc6fceaf3fbcf536baabd58f716 CRs-fixed: 1035125 --- CORE/CLD_TXRX/TXRX/ol_tx.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c index a2bd003e2502..dae35b756bbc 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx.c @@ -81,6 +81,12 @@ ol_tx_ll(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list) v_CONTEXT_t vos_ctx = vos_get_global_context(VOS_MODULE_ID_SYS, NULL); void *adf_ctx = vos_get_context(VOS_MODULE_ID_ADF, vos_ctx); + if (!adf_ctx) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: adf_ctx is NULL\n", __func__); + return msdu_list; + } + msdu_info.htt.info.l2_hdr_type = vdev->pdev->htt_pkt_type; msdu_info.htt.action.tx_comp_req = 0; /* -- cgit v1.2.3 From 93f365705adc801f5a00c791e1a9f5610c0f96b3 Mon Sep 17 00:00:00 2001 From: "Padma, Santhosh Kumar" Date: Fri, 24 Jun 2016 21:07:03 +0530 Subject: qcacld-2.0: Fix mgmtFrameSessionId in limSendP2PActionFrame Cleanup as part of limP2PActionCnf triggers only when mgmtFrameSessionId is not 0xff. If cleanup does not happen in error scenario, it can result in not clearing cfgState->buf which can lead to dropping of further action frames in __wlan_hdd_mgmt_tx. Fix this by filling mgmtFrameSessionId with proper session id. Change-Id: Icc0f5b576ff71776dc448a673b6e12defe0c514e CRs-Fixed: 1033836 --- CORE/MAC/src/pe/lim/limP2P.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CORE/MAC/src/pe/lim/limP2P.c b/CORE/MAC/src/pe/lim/limP2P.c index 266c1b218205..832d907ca940 100644 --- a/CORE/MAC/src/pe/lim/limP2P.c +++ b/CORE/MAC/src/pe/lim/limP2P.c @@ -768,6 +768,7 @@ void limSendP2PActionFrame(tpAniSirGlobal pMac, tpSirMsgQ pMsg) { limLog(pMac, LOGE, FL("Remain on channel is not running")); + pMac->lim.mgmtFrameSessionId = pMbMsg->sessionId; limP2PActionCnf(pMac, false); return; } @@ -805,6 +806,7 @@ void limSendP2PActionFrame(tpAniSirGlobal pMac, tpSirMsgQ pMsg) } if( !isSessionActive ) { + pMac->lim.mgmtFrameSessionId = pMbMsg->sessionId; limP2PActionCnf(pMac, false); return; } @@ -963,6 +965,7 @@ send_action_frame: { limLog(pMac, LOGE, FL("Failed to Send Action frame")); + pMac->lim.mgmtFrameSessionId = pMbMsg->sessionId; limP2PActionCnf(pMac, false); return; } @@ -1044,6 +1047,7 @@ send_frame1: if (!pMbMsg->noack) { + pMac->lim.mgmtFrameSessionId = pMbMsg->sessionId; limP2PActionCnf(pMac, (HAL_STATUS_SUCCESS(halstatus)) ? true : false); } -- cgit v1.2.3 From 67c9e5baf6f8483298d445e1805d1b2138aa0b98 Mon Sep 17 00:00:00 2001 From: Anjaneedevi Kapparapu Date: Wed, 29 Jun 2016 13:28:05 +0530 Subject: Release 4.0.11.110 Release 4.0.11.110 Change-Id: I4d2b7c578001ae10c05814dcbefbbea541ddf502 CRs-Fixed: 688141 --- CORE/MAC/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index a3ea6db5fbdd..7d05e8cc765b 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 11 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 109 +#define QWLAN_VERSION_BUILD 110 -#define QWLAN_VERSIONSTR "4.0.11.109" +#define QWLAN_VERSIONSTR "4.0.11.110" #define AR6320_REV1_VERSION 0x5000000 -- cgit v1.2.3 From 1c42aaf38fb09c92aff4bc94be64c7afb5f61cbb Mon Sep 17 00:00:00 2001 From: "Gupta, Kapil" Date: Thu, 30 Jun 2016 11:11:39 +0530 Subject: Revert "qcacld-2.0: WAR for dfs false detection" This reverts commit Ie963f80b3c3e5ea5e4dd0f46b3dbdbea9d6c7f49. Change are causing crash in ACS enabled scenario. Change-Id: Icbd195702dd70f5bbb97eefc2c3044d0e46a76e4 CRs-Fixed: 1035799 --- CORE/SERVICES/DFS/inc/dfs.h | 7 - CORE/SERVICES/DFS/src/dfs.c | 69 +-------- CORE/SERVICES/DFS/src/dfs_debug.c | 23 +-- CORE/SERVICES/DFS/src/dfs_init.c | 125 +--------------- CORE/SERVICES/DFS/src/dfs_process_radarevent.c | 199 +------------------------ CORE/VOSS/inc/vos_types.h | 6 - 6 files changed, 8 insertions(+), 421 deletions(-) diff --git a/CORE/SERVICES/DFS/inc/dfs.h b/CORE/SERVICES/DFS/inc/dfs.h index 52ae15f1dea4..632636296b08 100644 --- a/CORE/SERVICES/DFS/inc/dfs.h +++ b/CORE/SERVICES/DFS/inc/dfs.h @@ -89,7 +89,6 @@ #include "dfs_interface.h" #include "_ieee80211_common.h" #include "vos_api.h" -#include "sirDebug.h" #define ATH_SUPPORT_DFS 1 #define CHANNEL_TURBO 0x00010 @@ -129,7 +128,6 @@ //#define MAX_BIN5_DUR 131 /* 105 * 1.25*/ #define MAX_BIN5_DUR 145 /* use 145 for osprey */ //conversion is already done using dfs->dur_multiplier// #define MAX_BIN5_DUR_MICROSEC 105 -#define MAX_DFS_RADAR_TYPE 256 #define DFS_MARGIN_EQUAL(a, b, margin) ((DFS_DIFF(a,b)) <= margin) #define DFS_MAX_STAGGERED_BURSTS 3 @@ -267,7 +265,6 @@ struct dfs_pulseline { #define DFS_EVENT_HW_CHIRP 0x02 /* hardware chirp */ #define DFS_EVENT_SW_CHIRP 0x04 /* software chirp */ - /* * Use this only if the event has CHECKCHIRP set. */ @@ -301,7 +298,6 @@ struct dfs_event { #pragma pack(pop, dfs_event) #endif -#define DFS_FILTER_DEFAULT_PRI 1000000 #define DFS_AR_MAX_ACK_RADAR_DUR 511 #define DFS_AR_MAX_NUM_PEAKS 3 #define DFS_AR_ARQ_SIZE 2048 /* 8K AR events for buffer size */ @@ -573,13 +569,10 @@ struct ath_dfs { /* dfs_radarf - One filter for each radar pulse type */ struct dfs_filtertype *dfs_radarf[DFS_MAX_RADAR_TYPES]; - struct dfs_filtertype *dfs_dc_radarf[DFS_MAX_RADAR_TYPES]; struct dfs_info dfs_rinfo; /* State vars for radar processing */ struct dfs_bin5radars *dfs_b5radars;/* array of bin5 radar events */ int8_t **dfs_radartable; /* map of radar durs to filter types */ - /* map of dc radar durs to filter types */ - int8_t **dfs_dc_radartable; #ifndef ATH_DFS_RADAR_DETECTION_ONLY struct dfs_nolelem *dfs_nol; /* Non occupancy list for radar */ int dfs_nol_count; /* How many items? */ diff --git a/CORE/SERVICES/DFS/src/dfs.c b/CORE/SERVICES/DFS/src/dfs.c index 8677cc29ee21..04cafdd2cccc 100644 --- a/CORE/SERVICES/DFS/src/dfs.c +++ b/CORE/SERVICES/DFS/src/dfs.c @@ -344,7 +344,7 @@ dfs_attach(struct ieee80211com *ic) dfs->pulses->pl_lastelem = DFS_MAX_PULSE_BUFFER_MASK; - /* Allocate memory for radar filters */ + /* Allocate memory for radar filters */ for (n=0; ndfs_radarf[n] = (struct dfs_filtertype *)OS_MALLOC(NULL, sizeof(struct dfs_filtertype),GFP_ATOMIC); if (dfs->dfs_radarf[n] == NULL) { @@ -357,23 +357,7 @@ dfs_attach(struct ieee80211com *ic) goto bad1; } } - - /* Allocate memory for dc radar filters */ - for (n = 0; n < DFS_MAX_RADAR_TYPES; n++) { - dfs->dfs_dc_radarf[n] = - (struct dfs_filtertype *)OS_MALLOC(NULL, - sizeof(struct dfs_filtertype), GFP_ATOMIC); - if (!(dfs->dfs_dc_radarf[n])) { - DFS_PRINTK("%s: cannot allocate memory for dc radar filter types\n", - __func__); - goto bad1; - } - vos_mem_zero(dfs->dfs_dc_radarf[n], sizeof(struct dfs_filtertype)); - if (0 != dfs_alloc_mem_filter(dfs->dfs_radarf[n])) - goto bad4; - } - - /* Allocate memory for radar table */ + /* Allocate memory for radar table */ dfs->dfs_radartable = (int8_t **)OS_MALLOC(NULL, 256*sizeof(int8_t *), GFP_ATOMIC); if (dfs->dfs_radartable == NULL) { DFS_PRINTK("%s: cannot allocate memory for radar table\n", @@ -390,26 +374,6 @@ dfs_attach(struct ieee80211com *ic) } } - /* Allocate memory for dc radar table */ - dfs->dfs_dc_radartable = (int8_t **)OS_MALLOC(NULL, - MAX_DFS_RADAR_TYPE * sizeof(int8_t *), - GFP_ATOMIC); - if (!dfs->dfs_dc_radartable) { - DFS_PRINTK("%s: cannot allocate memory for radar table\n", - __func__); - goto bad2; - } - for (n = 0; n < MAX_DFS_RADAR_TYPE; n++) { - dfs->dfs_dc_radartable[n] = OS_MALLOC(NULL, - DFS_MAX_RADAR_OVERLAP * sizeof(int8_t), - GFP_ATOMIC); - if (!(dfs->dfs_dc_radartable[n])) { - DFS_PRINTK("%s: cannot allocate memory for dc radar table entry\n", - __func__); - goto bad3; - } - } - if (usenol == 0) DFS_PRINTK("%s: NOL disabled\n", __func__); else if (usenol == 2) @@ -447,19 +411,9 @@ dfs_attach(struct ieee80211com *ic) dfs->ath_dfs_nol_timeout = DFS_NOL_TIMEOUT_S; return 0; -bad3: - OS_FREE(dfs->dfs_dc_radartable); - dfs->dfs_dc_radartable = NULL; bad2: OS_FREE(dfs->dfs_radartable); dfs->dfs_radartable = NULL; -bad4: - for (n = 0; n < DFS_MAX_RADAR_TYPES; n++) { - if (!(dfs->dfs_dc_radarf[n])) { - OS_FREE(dfs->dfs_dc_radarf[n]); - dfs->dfs_dc_radarf[n] = NULL; - } - } bad1: for (n=0; ndfs_radarf[n] != NULL) { @@ -565,14 +519,6 @@ dfs_detach(struct ieee80211com *ic) dfs->dfs_radarf[n] = NULL; } } - for (n = 0; n < DFS_MAX_RADAR_TYPES; n++) { - if (!(dfs->dfs_dc_radarf[n])) { - dfs_free_filter(dfs->dfs_dc_radarf[n]); - OS_FREE(dfs->dfs_dc_radarf[n]); - dfs->dfs_dc_radarf[n] = NULL; - } - } - if (dfs->dfs_radartable != NULL) { @@ -589,17 +535,6 @@ dfs_detach(struct ieee80211com *ic) #endif } - if (!(dfs->dfs_dc_radartable)) { - for (n = 0; n < DFS_MAX_RADAR_TYPES; n++) { - if (!(dfs->dfs_dc_radartable[n])) { - OS_FREE(dfs->dfs_dc_radartable[n]); - dfs->dfs_dc_radartable[n] = NULL; - } - } - OS_FREE(dfs->dfs_dc_radartable); - dfs->dfs_dc_radartable = NULL; - } - if (dfs->dfs_b5radars != NULL) { OS_FREE(dfs->dfs_b5radars); dfs->dfs_b5radars=NULL; diff --git a/CORE/SERVICES/DFS/src/dfs_debug.c b/CORE/SERVICES/DFS/src/dfs_debug.c index efe88520852a..534d09d54add 100644 --- a/CORE/SERVICES/DFS/src/dfs_debug.c +++ b/CORE/SERVICES/DFS/src/dfs_debug.c @@ -109,8 +109,7 @@ dfs_print_filters(struct ath_dfs *dfs) ft = dfs->dfs_radarf[i]; if((ft->ft_numfilters > DFS_MAX_NUM_RADAR_FILTERS) || (!ft->ft_numfilters)) continue; - DFS_PRINTK("===========ft->ft_numfilters=%u===========\n", - ft->ft_numfilters); + DFS_PRINTK("===========ft->ft_numfilters=%u===========\n", ft->ft_numfilters); for (j=0; jft_numfilters; j++) { rf = ft->ft_filters[j]; DFS_PRINTK("filter[%d] filterID = %d rf_numpulses=%u; rf->rf_minpri=%u; rf->rf_maxpri=%u; rf->rf_threshold=%u; rf->rf_filterlen=%u; rf->rf_mindur=%u; rf->rf_maxdur=%u\n",j, rf->rf_pulseid, @@ -118,26 +117,6 @@ dfs_print_filters(struct ath_dfs *dfs) } } } - - for (i=0; i < DFS_MAX_RADAR_TYPES; i++) { - if (dfs->dfs_dc_radarf[i]) - continue; - - ft = dfs->dfs_dc_radarf[i]; - if ((ft->ft_numfilters > DFS_MAX_NUM_RADAR_FILTERS) || - (!ft->ft_numfilters)) - continue; - DFS_PRINTK("===========DC ft->ft_numfilters=%u===========\n", - ft->ft_numfilters); - for (j = 0; j < ft->ft_numfilters; j++) { - rf = ft->ft_filters[j]; - DFS_PRINTK("DC filter[%d] filterID = %d rf_numpulses=%u; rf->rf_minpri=%u; rf->rf_maxpri=%u; rf->rf_threshold=%u; rf->rf_filterlen=%u; rf->rf_mindur=%u; rf->rf_maxdur=%u\n", - j, rf->rf_pulseid, rf->rf_numpulses, rf->rf_minpri, - rf->rf_maxpri, rf->rf_threshold, rf->rf_filterlen, - rf->rf_mindur, rf->rf_maxdur); - } - } - } void dfs_print_activity(struct ath_dfs *dfs) diff --git a/CORE/SERVICES/DFS/src/dfs_init.c b/CORE/SERVICES/DFS/src/dfs_init.c index b85b5a8a29a4..afa03e94d800 100644 --- a/CORE/SERVICES/DFS/src/dfs_init.c +++ b/CORE/SERVICES/DFS/src/dfs_init.c @@ -115,22 +115,6 @@ void dfs_reset_alldelaylines(struct ath_dfs *dfs) } } } - for (i = 0; i < DFS_MAX_RADAR_TYPES; i++) { - if (dfs->dfs_dc_radarf[i] == NULL) - continue; - - ft = dfs->dfs_dc_radarf[i]; - for (j = 0; j < ft->ft_numfilters; j++) { - rf = ft->ft_filters[j]; - dl = &(rf->rf_dl); - if (dl == NULL) - continue; - - OS_MEMZERO(dl, sizeof(struct dfs_delayline)); - dl->dl_lastelem = (0xFFFFFFFF) & DFS_MAX_DL_MASK; - } - } - for (i = 0; i < dfs->dfs_rinfo.rn_numbin5radars; i++) { OS_MEMZERO(&(dfs->dfs_b5radars[i].br_elems[0]), sizeof(struct dfs_bin5elem)*DFS_MAX_B5_SIZE); dfs->dfs_b5radars[i].br_firstelem = 0; @@ -246,12 +230,6 @@ int dfs_init_radar_filters(struct ieee80211com *ic, for (i=0;idfs_radartable[n])[i] = -1; } - /* Clear dc filter type table */ - for (n = 0; n < 256; n++) { - for (i = 0;i < DFS_MAX_RADAR_OVERLAP; i++) - (dfs->dfs_dc_radartable[n])[i] = -1; - } - /* Now, initialize the radar filters */ for (p=0; pdfs_rinfo.rn_numradars; n++) { - if ((dfs_radars[p].rp_pulsedur == - dfs->dfs_dc_radarf[n]->ft_filterdur) && - (dfs_radars[p].rp_numpulses == - dfs->dfs_dc_radarf[n]->ft_numpulses) && - (dfs_radars[p].rp_mindur == dfs->dfs_dc_radarf[n]->ft_mindur) && - (dfs_radars[p].rp_maxdur == dfs->dfs_dc_radarf[n]->ft_maxdur)) { - - ft = dfs->dfs_dc_radarf[n]; - break; - } - } - if (ft == NULL) { - /* No filter of the appropriate dur was found */ - if ((dfs->dfs_rinfo.rn_numradars+1) > DFS_MAX_RADAR_TYPES) { - DFS_DPRINTK(dfs, ATH_DEBUG_DFS, "%s: Too many filter types", - __func__); - goto bad4; - } - ft = dfs->dfs_dc_radarf[dfs->dfs_rinfo.rn_numradars]; - ft->ft_numfilters = 0; - ft->ft_numpulses = dfs_radars[p].rp_numpulses; - ft->ft_patterntype = dfs_radars[p].rp_patterntype; - ft->ft_mindur = dfs_radars[p].rp_mindur; - ft->ft_maxdur = dfs_radars[p].rp_maxdur; - ft->ft_filterdur = dfs_radars[p].rp_pulsedur; - ft->ft_rssithresh = dfs_radars[p].rp_rssithresh; - ft->ft_rssimargin = dfs_radars[p].rp_rssimargin; - ft->ft_minpri = DFS_FILTER_DEFAULT_PRI; - - if (ft->ft_rssithresh < min_rssithresh) - min_rssithresh = ft->ft_rssithresh; - if (ft->ft_maxdur > max_pulsedur) - max_pulsedur = ft->ft_maxdur; - for (i = ft->ft_mindur; i <= ft->ft_maxdur; i++) { - u_int32_t stop = 0, tableindex = 0; - - while ((tableindex < DFS_MAX_RADAR_OVERLAP) && (!stop)) { - if ((dfs->dfs_dc_radartable[i])[tableindex] == -1) - stop = 1; - else - tableindex++; - } - if (stop) { - (dfs->dfs_dc_radartable[i])[tableindex] = - (int8_t) (dfs->dfs_rinfo.rn_numradars); - } else { - DFS_DPRINTK(dfs, ATH_DEBUG_DFS, - "%s: Too many overlapping dc radar filters", - __func__); - goto bad4; - } - } - dfs->dfs_rinfo.rn_numradars++; - } - rf = ft->ft_filters[ft->ft_numfilters++]; - dfs_reset_delayline(&rf->rf_dl); - numpulses = dfs_radars[p].rp_numpulses; - - rf->rf_numpulses = numpulses; - rf->rf_patterntype = dfs_radars[p].rp_patterntype; - rf->rf_pulseid = dfs_radars[p].rp_pulseid; - rf->rf_mindur = dfs_radars[p].rp_mindur; - rf->rf_maxdur = dfs_radars[p].rp_maxdur; - rf->rf_numpulses = dfs_radars[p].rp_numpulses; - rf->rf_ignore_pri_window = dfs_radars[p].rp_ignore_pri_window; - T = (100000000/dfs_radars[p].rp_max_pulsefreq) - - 100*(dfs_radars[p].rp_meanoffset); - rf->rf_minpri = - dfs_round((int32_t)T - (100*(dfs_radars[p].rp_pulsevar))); - Tmax = (100000000/dfs_radars[p].rp_pulsefreq) - - 100*(dfs_radars[p].rp_meanoffset); - rf->rf_maxpri = - dfs_round((int32_t)Tmax + (100*(dfs_radars[p].rp_pulsevar))); - - if(rf->rf_minpri < ft->ft_minpri) - ft->ft_minpri = rf->rf_minpri; - - rf->rf_fixed_pri_radar_pulse = - (dfs_radars[p].rp_max_pulsefreq == - dfs_radars[p].rp_pulsefreq) ? 1 : 0; - /* for pulseid 5, increase threshould by 1 */ - if (dfs_radars[p].rp_pulseid == 5) - rf->rf_threshold = dfs_radars[p].rp_threshold + 1; - else - rf->rf_threshold = dfs_radars[p].rp_threshold; - - rf->rf_filterlen = rf->rf_maxpri * rf->rf_numpulses; - - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]: minprf = %d maxprf = %d pulsevar = %d thresh=%d", - __func__, __LINE__, dfs_radars[p].rp_pulsefreq, - dfs_radars[p].rp_max_pulsefreq, dfs_radars[p].rp_pulsevar, - rf->rf_threshold); - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]:minpri = %d maxpri = %d filterlen = %d filterID = %d", - __func__, __LINE__, rf->rf_minpri, rf->rf_maxpri, - rf->rf_filterlen, rf->rf_pulseid); - - } #ifdef DFS_DEBUG - dfs_print_filters(dfs); + dfs_print_filters(ic); #endif dfs->dfs_rinfo.rn_numbin5radars = numb5radars; if (dfs->dfs_b5radars != NULL) diff --git a/CORE/SERVICES/DFS/src/dfs_process_radarevent.c b/CORE/SERVICES/DFS/src/dfs_process_radarevent.c index 45176f5706d0..156a229dd0cd 100644 --- a/CORE/SERVICES/DFS/src/dfs_process_radarevent.c +++ b/CORE/SERVICES/DFS/src/dfs_process_radarevent.c @@ -107,175 +107,6 @@ dfs_process_pulse_dur(struct ath_dfs *dfs, u_int8_t re_dur) return (u_int8_t)dfs_round((int32_t)((dfs->dur_multiplier)*re_dur)); } -/* - * dfs_process_dc_pulse: process dc pulses - * @dfs: pointer to dfs structure - * @event: dfs event - * @retval: current found status - * @this_ts: event's ts - * - * Return: None - */ -static void dfs_process_dc_pulse(struct ath_dfs *dfs, struct dfs_event *event, - int *retval, int this_ts) -{ - struct dfs_event re; - struct dfs_state *rs=NULL; - struct dfs_filtertype *ft; - struct dfs_filter *rf; - int found, p, empty; - int min_pri, miss_pulse_number = 0, deviation = 0; - u_int32_t tabledepth = 0; - u_int64_t deltaT; - int ext_chan_event_flag = 0; - int i; - - OS_MEMCPY(&re, event, sizeof(*event)); - if (re.re_chanindex < DFS_NUM_RADAR_STATES) - rs = &dfs->dfs_radar[re.re_chanindex]; - - while ((tabledepth < DFS_MAX_RADAR_OVERLAP) && - ((dfs->dfs_dc_radartable[re.re_dur])[tabledepth] != -1) && - (!*retval)) { - ft = dfs->dfs_dc_radarf[((dfs->dfs_dc_radartable - [re.re_dur])[tabledepth])]; - - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("** RD (%d): ts %x dur %u rssi %u"), - rs->rs_chan.ic_freq, - re.re_ts, re.re_dur, re.re_rssi); - - deltaT = this_ts - ft->ft_last_ts; - if (re.re_rssi < ft->ft_rssithresh && re.re_dur > 4) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("Rejecting on rssi rssi=%u thresh=%u depth=%d"), - re.re_rssi, ft->ft_rssithresh, - tabledepth); - tabledepth++; - dfs_reset_filter_delaylines(ft); - ATH_DFSQ_LOCK(dfs); - empty = STAILQ_EMPTY(&(dfs->dfs_radarq)); - ATH_DFSQ_UNLOCK(dfs); - continue; - } - if ((deltaT < ft->ft_minpri) && (deltaT !=0)) { - /* This check is for the whole filter type. Individual filters - * will check this again. This is first line of filtering. */ - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("Rejecting on pri pri=%lld minpri=%u depth=%d"), - (unsigned long long)deltaT, - ft->ft_minpri, tabledepth); - dfs_reset_filter_delaylines(ft); - tabledepth++; - continue; - } - for (p = 0, found = 0; (p < ft->ft_numfilters) && (!found); p++) { - rf = ft->ft_filters[p]; - if ((re.re_dur >= rf->rf_mindur) && - (re.re_dur <= rf->rf_maxdur)) { - deltaT = (this_ts < rf->rf_dl.dl_last_ts) ? - (int64_t) ((DFS_TSF_WRAP - rf->rf_dl.dl_last_ts) + - this_ts + 1) : - this_ts - rf->rf_dl.dl_last_ts; - - if ((deltaT < rf->rf_minpri) && (deltaT != 0)) { - /* Second line of PRI filtering. */ - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("filterID=%d :: Rejected and cleared individual filter min PRI deltaT=%lld rf->rf_minpri=%u"), - rf->rf_pulseid, - (unsigned long long)deltaT, rf->rf_minpri); - dfs_reset_delayline(&rf->rf_dl); - rf->rf_dl.dl_last_ts = this_ts; - continue; - } - - if (rf->rf_ignore_pri_window > 0) { - if (deltaT < rf->rf_minpri) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("filterID=%d :: Rejected and cleared on individual filter max PRI deltaT=%lld rf->rf_minpri=%u"), - rf->rf_pulseid, - (unsigned long long)deltaT, rf->rf_minpri); - dfs_reset_delayline(&rf->rf_dl); - rf->rf_dl.dl_last_ts = this_ts; - continue; - } - } else { - if (deltaT < rf->rf_minpri) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("filterID=%d :: Rejected and cleared on individual filter max PRI deltaT=%lld rf->rf_minpri=%u"), - rf->rf_pulseid, - (unsigned long long)deltaT, rf->rf_minpri); - dfs_reset_delayline(&rf->rf_dl); - rf->rf_dl.dl_last_ts = this_ts; - continue; - } - } - dfs_add_pulse(dfs, rf, &re, deltaT, this_ts); - - /* extra WAR */ - if ((dfs->dfsdomain == DFS_FCC_DOMAIN && - dfs->dfsdomain == DFS_MKK4_DOMAIN) && - ((rf->rf_pulseid != 31) && (rf->rf_pulseid != 32))) { - - min_pri = 0xffff; - for (i = 0; i < rf->rf_dl.dl_numelems; i++) { - if (rf->rf_dl.dl_elems[i].de_time < min_pri) - min_pri = rf->rf_dl.dl_elems[i].de_time; - } - - for (i=0; i < rf->rf_dl.dl_numelems; i++) { - miss_pulse_number = vos_round_div( - (rf->rf_dl.dl_elems[i].de_time), min_pri); - deviation = __adf_os_abs(min_pri * - miss_pulse_number - - rf->rf_dl.dl_elems[i].de_time); - if (deviation > miss_pulse_number*3) { - dfs_reset_delayline(&rf->rf_dl); - VOS_TRACE(VOS_MODULE_ID_SAP, - VOS_TRACE_LEVEL_INFO, - FL("filterID=%d :: cleared individual deleyline min_pri =%d miss_pulse_number =%d deviation =%d"), - rf->rf_pulseid, - min_pri, miss_pulse_number, deviation); - } - } - } - - /* If this is an extension channel event, - * flag it for false alarm reduction */ - if (re.re_chanindex == dfs->dfs_extchan_radindex) - ext_chan_event_flag = 1; - - if (rf->rf_patterntype == 2) - found = dfs_staggered_check(dfs, rf, (uint32_t)deltaT, - re.re_dur); - else - found = dfs_bin_check(dfs, rf, (uint32_t) deltaT, - re.re_dur, ext_chan_event_flag); - - if (dfs->dfs_debug_mask & ATH_DEBUG_DFS2) - dfs_print_delayline(dfs, &rf->rf_dl); - - rf->rf_dl.dl_last_ts = this_ts; - } else { - /* if we are rejecting this, clear the queue */ - dfs_reset_delayline(&rf->rf_dl); - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL("filterID= %d :: cleared individual deleyline"), - rf->rf_pulseid); - } - } - ft->ft_last_ts = this_ts; - *retval |= found; - if (found) { - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - FL(":## Radar Found minDur=%d, filterId=%d ##"), - ft->ft_mindur, - rf != NULL ? rf->rf_pulseid : -1); - } - tabledepth++; - } -} - /* * Process a radar event. * @@ -550,11 +381,9 @@ dfs_process_radarevent(struct ath_dfs *dfs, struct ieee80211_channel *chan) dfs->radar_log[i].dur = re.re_dur; dfs->dfs_event_log_count++; } - VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, - "%s[%d]:xxxxx ts =%u re.re_dur=%u re.re_rssi =%u diff =%u sidx = %u flags = %x pl->pl_lastelem.p_time=%llu xxxxx", - __func__, __LINE__, (u_int32_t)this_ts, - re.re_dur, re.re_rssi, diff_ts, re.sidx, re.re_flags, - (unsigned long long)pl->pl_elems[index].p_time); + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]:xxxxx ts =%u re.re_dur=%u re.re_rssi =%u diff =%u pl->pl_lastelem.p_time=%llu xxxxx",__func__,__LINE__,(u_int32_t)this_ts, re.re_dur, re.re_rssi, diff_ts, (unsigned long long)pl->pl_elems[index].p_time); + + /* If diff_ts is very small, we might be getting false pulse detects * due to heavy interference. We might be getting spectral splatter @@ -698,26 +527,7 @@ dfs_process_radarevent(struct ath_dfs *dfs, struct ieee80211_channel *chan) DFS_DPRINTK(dfs, ATH_DEBUG_DFS1," *** chan freq (%d): ts %llu dur %u rssi %u", rs->rs_chan.ic_freq, (unsigned long long)this_ts, re.re_dur, re.re_rssi); - - /* - * DC pulses processing will be done in this seperate block since some - * device may generate pulse which may cause false detection. - * This processing is similar kind as of normal pulse processing with - * some exception such as: - * 1. Clear the queue if pulse doesn't belong to it - * 2. Remove chan load optimization(can cause some valid pulses to drop) - * 3. Drop pulses on basis of mean deviation for some filters - */ - if (((re.sidx == 0) && DFS_EVENT_NOTCHIRP(&re)) && - ((dfs->dfsdomain == DFS_FCC_DOMAIN) || - (dfs->dfsdomain == DFS_MKK4_DOMAIN) || - (dfs->dfsdomain == DFS_ETSI_DOMAIN && re.re_dur < 18))) { - dfs_process_dc_pulse(dfs, &re, &retval, this_ts); - } - - /* Pulse not at DC position */ - else { - while ((tabledepth < DFS_MAX_RADAR_OVERLAP) && + while ((tabledepth < DFS_MAX_RADAR_OVERLAP) && ((dfs->dfs_radartable[re.re_dur])[tabledepth] != -1) && (!retval)) { ft = dfs->dfs_radarf[((dfs->dfs_radartable[re.re_dur])[tabledepth])]; @@ -821,7 +631,6 @@ VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO, "%s[%d]:filterID= %d :: Rejec rf != NULL ? rf->rf_pulseid : -1); } tabledepth++; - } } ATH_DFSQ_LOCK(dfs); empty = STAILQ_EMPTY(&(dfs->dfs_radarq)); diff --git a/CORE/VOSS/inc/vos_types.h b/CORE/VOSS/inc/vos_types.h index a9198201600a..960226fa75ce 100644 --- a/CORE/VOSS/inc/vos_types.h +++ b/CORE/VOSS/inc/vos_types.h @@ -58,12 +58,6 @@ // macro to return the floor of an integer division operation #define VOS_FLOOR_DIV( _a, _b ) ( ( (_a) - ( (_a) % (_b) ) ) / (_b) ) -static inline unsigned int vos_round_div(unsigned int dividend, - unsigned int divisor) -{ - return (dividend + (divisor / 2)) / divisor; -} - #define VOS_SWAP_U16(_x) \ ( ( ( (_x) << 8 ) & 0xFF00 ) | ( ( (_x) >> 8 ) & 0x00FF ) ) -- cgit v1.2.3 From 6be25ced23db164ce54deb8429c385a8c4157ed8 Mon Sep 17 00:00:00 2001 From: Arun Khandavalli Date: Tue, 28 Jun 2016 10:49:23 +0530 Subject: qcacld-2.0: Correctly handle the error conditions in the driver startup In the hdd_wlan_startup function correct the error conditions in case of any initialization failure, there is crash instance where in the nl socket is initialized but not released by the driver incase of vos_open failure. Release the nl socket during the load failure and also correct the other error conditions. Change-Id: I5eb63b42de0f2327b391427dd5b43235103ed06b CRs-Fixed: 1033220 --- CORE/HDD/src/wlan_hdd_main.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) mode change 100644 => 100755 CORE/HDD/src/wlan_hdd_main.c diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c old mode 100644 new mode 100755 index 32d21d50ecd6..53f5106dd59d --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -14777,7 +14777,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) if(!VOS_IS_STATUS_SUCCESS( status )) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: vos_watchdog_open failed",__func__); - goto err_wdclose; + goto err_nl_srv; } } @@ -15008,7 +15008,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) if ( VOS_STATUS_SUCCESS != wlan_hdd_ftm_open(pHddCtx) ) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: wlan_hdd_ftm_open Failed",__func__); - goto err_config; + goto err_nl_srv; } #if defined(QCA_WIFI_FTM) if (hdd_ftm_start(pHddCtx)) @@ -15231,7 +15231,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) if(btc_activate_service(pHddCtx) != 0) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: btc_activate_service failed",__func__); - goto err_nl_srv; + goto err_reg_netdev; } #ifdef FEATURE_OEM_DATA_SUPPORT @@ -15240,7 +15240,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) { hddLog(VOS_TRACE_LEVEL_FATAL, "%s: oem_activate_service failed", __func__); - goto err_nl_srv; + goto err_reg_netdev; } #endif @@ -15249,7 +15249,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) if(ptt_sock_activate_svc(pHddCtx) != 0) { hddLog(VOS_TRACE_LEVEL_FATAL,"%s: ptt_sock_activate_svc failed",__func__); - goto err_nl_srv; + goto err_reg_netdev; } #endif @@ -15261,7 +15261,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) { hddLog(VOS_TRACE_LEVEL_FATAL, "%s: cnss_diag_activate_service failed", __func__); - goto err_nl_srv; + goto err_close_cesium; } hdd_register_mcast_bcast_filter(pHddCtx); @@ -15285,7 +15285,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) if (ret < 0) { hddLog(VOS_TRACE_LEVEL_ERROR,"%s: register_netdevice_notifier failed", __func__); - goto err_nl_srv; + goto err_close_cesium; } reg_netdev_notifier_done = TRUE; #endif @@ -15391,7 +15391,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: Memory allocation for TxPowerLimit " "failed!", __func__); - goto err_nl_srv; + goto err_close_cesium; } hddtxlimit->txPower2g = pHddCtx->cfg_ini->TxPower2g; hddtxlimit->txPower5g = pHddCtx->cfg_ini->TxPower5g; @@ -15498,10 +15498,10 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) complete(&wlan_comp.wlan_start_comp); goto success; -err_nl_srv: - nl_srv_exit(); +err_close_cesium: hdd_close_cesium_nl_sock(); +err_reg_netdev: if (rtnl_lock_enable == TRUE) { rtnl_lock_enable = FALSE; rtnl_unlock(); @@ -15574,7 +15574,8 @@ err_free_ftm_open: if (VOS_FTM_MODE != hdd_get_conparam()) wlan_hdd_logging_sock_deactivate_svc(pHddCtx); - +err_nl_srv: + nl_srv_exit(); err_config: kfree(pHddCtx->cfg_ini); pHddCtx->cfg_ini= NULL; -- cgit v1.2.3 From f0dd9902ddb6a3b3e55efadcbd2658e643fe9b39 Mon Sep 17 00:00:00 2001 From: Anjaneedevi Kapparapu Date: Thu, 30 Jun 2016 14:41:39 +0530 Subject: Release 4.0.11.111 Release 4.0.11.111 Change-Id: I35e3b32b78d5682401521c9111d50ecac94b0e19 CRs-Fixed: 688141 --- CORE/MAC/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 7d05e8cc765b..60aa350d1459 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 11 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 110 +#define QWLAN_VERSION_BUILD 111 -#define QWLAN_VERSIONSTR "4.0.11.110" +#define QWLAN_VERSIONSTR "4.0.11.111" #define AR6320_REV1_VERSION 0x5000000 -- cgit v1.2.3