blob: 778c9f7f5be37543472d59d575f8c82ef0b32dc6 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/*
43 * Airgo Networks, Inc proprietary. All rights reserved.
44 * This file limApi.cc contains the functions that are
45 * exported by LIM to other modules.
46 *
47 * Author: Chandra Modumudi
48 * Date: 02/11/02
49 * History:-
50 * Date Modified by Modification Information
51 * --------------------------------------------------------------------
52 *
53 */
54#include "palTypes.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "wniCfgSta.h"
56#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070057#include "sirCommon.h"
58#include "sirDebug.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070059#include "cfgApi.h"
60
61#include "schApi.h"
62#include "utilsApi.h"
63#include "limApi.h"
64#include "limGlobal.h"
65#include "limTypes.h"
66#include "limUtils.h"
67#include "limAssocUtils.h"
68#include "limPropExtsUtils.h"
69#include "limSerDesUtils.h"
70#include "limIbssPeerMgmt.h"
71#include "limAdmitControl.h"
72#include "pmmApi.h"
73#include "logDump.h"
74#include "limSendSmeRspMessages.h"
75#include "wmmApsd.h"
76#include "limTrace.h"
77#include "limSession.h"
78#include "wlan_qct_wda.h"
79
80#if defined WLAN_FEATURE_VOWIFI
81#include "rrmApi.h"
82#endif
83
84#include <limFT.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070085#include "vos_types.h"
86#include "vos_packet.h"
87#include "wlan_qct_tl.h"
88#include "sysStartup.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070089
90
91static void __limInitScanVars(tpAniSirGlobal pMac)
92{
93 pMac->lim.gLimUseScanModeForLearnMode = 1;
94
95 pMac->lim.gLimSystemInScanLearnMode = 0;
96
97 // Scan related globals on STA
98 pMac->lim.gLimReturnAfterFirstMatch = 0;
99 pMac->lim.gLim24Band11dScanDone = 0;
100 pMac->lim.gLim50Band11dScanDone = 0;
101 pMac->lim.gLimReturnUniqueResults = 0;
102
103 // Background Scan related globals on STA
104 pMac->lim.gLimNumOfBackgroundScanSuccess = 0;
105 pMac->lim.gLimNumOfConsecutiveBkgndScanFailure = 0;
106 pMac->lim.gLimNumOfForcedBkgndScan = 0;
107 pMac->lim.gLimBackgroundScanDisable = false; //based on BG timer
108 pMac->lim.gLimForceBackgroundScanDisable = false; //debug control flag
109 pMac->lim.gLimBackgroundScanTerminate = TRUE; //controlled by SME
Jeff Johnson92751692013-03-06 16:00:33 -0800110 pMac->lim.gLimReportBackgroundScanResults = FALSE; //controlled by SME
Jeff Johnson295189b2012-06-20 16:38:30 -0700111
112 pMac->lim.gLimCurrentScanChannelId = 0;
113 pMac->lim.gpLimMlmScanReq = NULL;
Viral Modid440e682013-03-06 02:25:31 -0800114 pMac->lim.gDeferMsgTypeForNOA = 0;
115 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700116 pMac->lim.gLimMlmScanResultLength = 0;
117 pMac->lim.gLimSmeScanResultLength = 0;
118
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530119 vos_mem_set(pMac->lim.gLimCachedScanHashTable,
120 sizeof(pMac->lim.gLimCachedScanHashTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700121
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700122#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
123
124 pMac->lim.gLimMlmLfrScanResultLength = 0;
125 pMac->lim.gLimSmeLfrScanResultLength = 0;
126
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530127 vos_mem_set(pMac->lim.gLimCachedLfrScanHashTable,
128 sizeof(pMac->lim.gLimCachedLfrScanHashTable), 0);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700129#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700130 pMac->lim.gLimBackgroundScanChannelId = 0;
131 pMac->lim.gLimBackgroundScanStarted = 0;
132 pMac->lim.gLimRestoreCBNumScanInterval = LIM_RESTORE_CB_NUM_SCAN_INTERVAL_DEFAULT;
133 pMac->lim.gLimRestoreCBCount = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530134 vos_mem_set(pMac->lim.gLimLegacyBssidList,
135 sizeof(pMac->lim.gLimLegacyBssidList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700136
137 /* Fill in default values */
138 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss = 0;
139
Jeff Johnson295189b2012-06-20 16:38:30 -0700140
141 // abort scan is used to abort an on-going scan
142 pMac->lim.abortScan = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530143 vos_mem_set(&pMac->lim.scanChnInfo, sizeof(tLimScanChnInfo), 0);
144 vos_mem_set(&pMac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700145
146//WLAN_SUSPEND_LINK Related
147 pMac->lim.gpLimSuspendCallback = NULL;
148 pMac->lim.gpLimResumeCallback = NULL;
149//end WLAN_SUSPEND_LINK Related
150}
151
152
153static void __limInitBssVars(tpAniSirGlobal pMac)
154{
155
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530156 vos_mem_set((void*)pMac->lim.gpSession,
157 sizeof(*pMac->lim.gpSession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700158
159
160 //pMac->lim.gpLimStartBssReq = NULL;
161
Jeff Johnson295189b2012-06-20 16:38:30 -0700162
163
164
165/* These global variables are moved to session table and intialization is done during session creation Oct 9th Review */
166#if 0
167
168 // Place holder for BSS description that we're
169 // currently joined with
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530170 vos_mem_set(&pMac->lim.gLimCurrentBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 pMac->lim.gLimCurrentChannelId = HAL_INVALID_CHANNEL_ID;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530172 vos_mem_set(&pMac->lim.gLimCurrentSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 pMac->lim.gLimCurrentBssCaps = 0;
174 QosCaps is a bit map of various qos capabilities - see defn above
175 pMac->lim.gLimCurrentBssQosCaps = 0;
176 pMac->lim.gLimCurrentBssPropCap = 0;
177 pMac->lim.gLimSentCapsChangeNtf = 0;
178
179 // Place holder for BSS description that
180 // we're currently Reassociating
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530181 vos_mem_set(&pMac->lim.gLimReassocBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700182 pMac->lim.gLimReassocChannelId = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530183 vos_mem_set(&pMac->lim.gLimReassocSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700184 pMac->lim.gLimReassocBssCaps = 0;
185 pMac->lim.gLimReassocBssQosCaps = 0;
186 pMac->lim.gLimReassocBssPropCap = 0;
187 #endif
188
189 /* This is for testing purposes only, be default should always be off */
190 pMac->lim.gLimForceNoPropIE = 0;
191
192 // pMac->lim.gLimBssIdx = 0;
193
194 pMac->lim.gpLimMlmSetKeysReq = NULL;
195 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
196 // pMac->lim.gLimStaid = 0; //TO SUPPORT BT-AMP
197
198}
199
200
201static void __limInitStatsVars(tpAniSirGlobal pMac)
202{
203 pMac->lim.gLimNumBeaconsRcvd = 0;
204 pMac->lim.gLimNumBeaconsIgnored = 0;
205
206 pMac->lim.gLimNumDeferredMsgs = 0;
207
208 /// Variable to keep track of number of currently associated STAs
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800209 //pMac->lim.gLimNumOfCurrentSTAs = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700210 pMac->lim.gLimNumOfAniSTAs = 0; // count of ANI peers
211
212 /// This indicates number of RXed Beacons during HB period
213 //pMac->lim.gLimRxedBeaconCntDuringHB = 0;
214
215 // Heart-Beat interval value
216 pMac->lim.gLimHeartBeatCount = 0;
217
218 // Statistics to keep track of no. beacons rcvd in heart beat interval
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530219 vos_mem_set(pMac->lim.gLimHeartBeatBeaconStats,
220 sizeof(pMac->lim.gLimHeartBeatBeaconStats), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700221
222#ifdef WLAN_DEBUG
223 // Debug counters
224 pMac->lim.numTot = 0;
225 pMac->lim.numBbt = 0;
226 pMac->lim.numProtErr = 0;
227 pMac->lim.numLearn = 0;
228 pMac->lim.numLearnIgnore = 0;
229 pMac->lim.numSme = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530230 vos_mem_set(pMac->lim.numMAC, sizeof(pMac->lim.numMAC), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 pMac->lim.gLimNumAssocReqDropInvldState = 0;
232 pMac->lim.gLimNumAssocReqDropACRejectTS = 0;
233 pMac->lim.gLimNumAssocReqDropACRejectSta = 0;
234 pMac->lim.gLimNumReassocReqDropInvldState = 0;
235 pMac->lim.gLimNumHashMissIgnored = 0;
236 pMac->lim.gLimUnexpBcnCnt = 0;
237 pMac->lim.gLimBcnSSIDMismatchCnt = 0;
238 pMac->lim.gLimNumLinkEsts = 0;
239 pMac->lim.gLimNumRxCleanup = 0;
240 pMac->lim.gLim11bStaAssocRejectCount = 0;
241#endif
242}
243
244
245
246static void __limInitStates(tpAniSirGlobal pMac)
247{
248 // Counts Heartbeat failures
249 pMac->lim.gLimHBfailureCntInLinkEstState = 0;
250 pMac->lim.gLimProbeFailureAfterHBfailedCnt = 0;
251 pMac->lim.gLimHBfailureCntInOtherStates = 0;
252 pMac->lim.gLimRspReqd = 0;
253 pMac->lim.gLimPrevSmeState = eLIM_SME_OFFLINE_STATE;
254
255 /// MLM State visible across all Sirius modules
Jeff Johnsone7245742012-09-05 17:12:55 -0700256 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, eLIM_MLM_IDLE_STATE));
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
258
259 /// Previous MLM State
260 pMac->lim.gLimPrevMlmState = eLIM_MLM_OFFLINE_STATE;
261
262#ifdef GEN4_SCAN
263 // LIM to HAL SCAN Management Message Interface states
264 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
265#endif // GEN4_SCAN
266
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 /**
Jeff Johnsone7245742012-09-05 17:12:55 -0700268 * Initialize state to eLIM_SME_OFFLINE_STATE
Jeff Johnson295189b2012-06-20 16:38:30 -0700269 */
Jeff Johnsone7245742012-09-05 17:12:55 -0700270 pMac->lim.gLimSmeState = eLIM_SME_OFFLINE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700271
272 /**
273 * By default assume 'unknown' role. This will be updated
274 * when SME_START_BSS_REQ is received.
275 */
276
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530277 vos_mem_set(&pMac->lim.gLimOverlap11gParams, sizeof(tLimProtStaParams), 0);
278 vos_mem_set(&pMac->lim.gLimOverlap11aParams, sizeof(tLimProtStaParams), 0);
279 vos_mem_set(&pMac->lim.gLimOverlapHt20Params, sizeof(tLimProtStaParams), 0);
280 vos_mem_set(&pMac->lim.gLimOverlapNonGfParams, sizeof(tLimProtStaParams), 0);
281 vos_mem_set(&pMac->lim.gLimNoShortParams, sizeof(tLimNoShortParams), 0);
282 vos_mem_set(&pMac->lim.gLimNoShortSlotParams, sizeof(tLimNoShortSlotParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700283
284 pMac->lim.gLimPhyMode = 0;
285 pMac->lim.scanStartTime = 0; // used to measure scan time
286
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530287 vos_mem_set(pMac->lim.gLimMyMacAddr, sizeof(pMac->lim.gLimMyMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 pMac->lim.ackPolicy = 0;
289
290#if 0 /* Moving all these to session specific elements */
291 pMac->lim.gLimQosEnabled = 0; //11E
292 pMac->lim.gLimWmeEnabled = 0; //WME
293 pMac->lim.gLimWsmEnabled = 0; //WSM
294 pMac->lim.gLimHcfEnabled = 0;
295 pMac->lim.gLim11dEnabled = 0;
296#endif
297
298 pMac->lim.gLimProbeRespDisableFlag = 0; // control over probe response
299}
300
301static void __limInitVars(tpAniSirGlobal pMac)
302{
303
Jeff Johnson295189b2012-06-20 16:38:30 -0700304
305 // Place holder for Measurement Req/Rsp/Ind related info
Jeff Johnson295189b2012-06-20 16:38:30 -0700306
307 // WDS info
308 pMac->lim.gLimNumWdsInfoInd = 0;
309 pMac->lim.gLimNumWdsInfoSet = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530310 vos_mem_set(&pMac->lim.gLimWdsInfo, sizeof(tSirWdsInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700311 /* initialize some parameters */
312 limInitWdsInfoParams(pMac);
313
314 // Deferred Queue Paramters
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530315 vos_mem_set(&pMac->lim.gLimDeferredMsgQ, sizeof(tSirAddtsReq), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700316
317 // addts request if any - only one can be outstanding at any time
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530318 vos_mem_set(&pMac->lim.gLimAddtsReq, sizeof(tSirAddtsReq) , 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700319 pMac->lim.gLimAddtsSent = 0;
320 pMac->lim.gLimAddtsRspTimerCount = 0;
321
322 //protection related config cache
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530323 vos_mem_set(&pMac->lim.cfgProtection, sizeof(tCfgProtection), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 pMac->lim.gLimProtectionControl = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530325 vos_mem_set(&pMac->lim.gLimAlternateRadio, sizeof(tSirAlternateRadioInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
327
Jeff Johnsone7245742012-09-05 17:12:55 -0700328#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700329 // 11h Spectrum Management Related Flag
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
331 pMac->sys.gSysEnableLearnMode = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700332#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700333 // WMM Related Flag
334 pMac->lim.gUapsdEnable = 0;
335 pMac->lim.gUapsdPerAcBitmask = 0;
336 pMac->lim.gUapsdPerAcTriggerEnableMask = 0;
337 pMac->lim.gUapsdPerAcDeliveryEnableMask = 0;
338
339 // QoS-AC Downgrade: Initially, no AC is admitted
340 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] = 0;
341 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] = 0;
342
343 //dialogue token List head/tail for Action frames request sent.
344 pMac->lim.pDialogueTokenHead = NULL;
345 pMac->lim.pDialogueTokenTail = NULL;
346
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530347 vos_mem_set(&pMac->lim.tspecInfo,
348 sizeof(tLimTspecInfo) * LIM_NUM_TSPEC_MAX, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700349
350 // admission control policy information
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530351 vos_mem_set(&pMac->lim.admitPolicyInfo, sizeof(tLimAdmitPolicyInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700352
353 pMac->lim.gLastBeaconDtimCount = 0;
354 pMac->lim.gLastBeaconDtimPeriod = 0;
355
356 //Scan in Power Save Flag
357 pMac->lim.gScanInPowersave = 0;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800358 pMac->lim.probeCounter = 0;
359 pMac->lim.maxProbe = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700360}
361
362static void __limInitAssocVars(tpAniSirGlobal pMac)
363{
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800364 tANI_U32 val;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800365#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530366 vos_mem_set(pMac->lim.gpLimAIDpool,
367 sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 pMac->lim.freeAidHead = 0;
369 pMac->lim.freeAidTail = 0;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800370#endif
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800371 if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT, &val) != eSIR_SUCCESS)
372 {
373 limLog( pMac, LOGP, FL( "cfg get assoc sta limit failed" ));
374 }
375 pMac->lim.gLimAssocStaLimit = val;
Ravi Joshi0fc681b2013-09-11 16:46:07 -0700376 pMac->lim.gLimIbssStaLimit = val;
Jeff Johnson295189b2012-06-20 16:38:30 -0700377
378 // Place holder for current authentication request
379 // being handled
380 pMac->lim.gpLimMlmAuthReq = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -0700381 //pMac->lim.gpLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700382
383 /// MAC level Pre-authentication related globals
384 pMac->lim.gLimPreAuthChannelNumber = 0;
385 pMac->lim.gLimPreAuthType = eSIR_OPEN_SYSTEM;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530386 vos_mem_set(&pMac->lim.gLimPreAuthPeerAddr, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700387 pMac->lim.gLimNumPreAuthContexts = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530388 vos_mem_set(&pMac->lim.gLimPreAuthTimerTable, sizeof(tLimPreAuthTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700389
390 // Placed holder to deauth reason
391 pMac->lim.gLimDeauthReasonCode = 0;
392
393 // Place holder for Pre-authentication node list
394 pMac->lim.pLimPreAuthList = NULL;
395
396 // Send Disassociate frame threshold parameters
397 pMac->lim.gLimDisassocFrameThreshold = LIM_SEND_DISASSOC_FRAME_THRESHOLD;
398 pMac->lim.gLimDisassocFrameCredit = 0;
399
400 //One cache for each overlap and associated case.
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530401 vos_mem_set(pMac->lim.protStaOverlapCache,
402 sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE, 0);
403 vos_mem_set(pMac->lim.protStaCache,
404 sizeof(tCacheParams) * LIM_PROT_STA_CACHE_SIZE, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700405
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -0700406#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
407 pMac->lim.pSessionEntry = NULL;
408 pMac->lim.reAssocRetryAttempt = 0;
409#endif
410
Jeff Johnson295189b2012-06-20 16:38:30 -0700411}
412
413
414static void __limInitTitanVars(tpAniSirGlobal pMac)
415{
Jeff Johnsone7245742012-09-05 17:12:55 -0700416#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530417 vos_mem_set(&pMac->lim.gLimChannelSwitch, sizeof(tLimChannelSwitchInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700418 pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700419 pMac->lim.gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
420#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700421 // Debug workaround for BEACON's
422 // State change triggered by "dump 222"
423 pMac->lim.gLimScanOverride = 1;
424 pMac->lim.gLimScanOverrideSaved = eSIR_ACTIVE_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700425 pMac->lim.gLimTitanStaCount = 0;
426 pMac->lim.gLimBlockNonTitanSta = 0;
427}
428
429static void __limInitHTVars(tpAniSirGlobal pMac)
430{
431 pMac->lim.htCapabilityPresentInBeacon = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700432 pMac->lim.gHTGreenfield = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700433 pMac->lim.gHTShortGI40Mhz = 0;
434 pMac->lim.gHTShortGI20Mhz = 0;
435 pMac->lim.gHTMaxAmsduLength = 0;
436 pMac->lim.gHTDsssCckRate40MHzSupport = 0;
437 pMac->lim.gHTPSMPSupport = 0;
438 pMac->lim.gHTLsigTXOPProtection = 0;
439 pMac->lim.gHTMIMOPSState = eSIR_HT_MIMO_PS_STATIC;
440 pMac->lim.gHTAMpduDensity = 0;
441
442 pMac->lim.gMaxAmsduSizeEnabled = false;
443 pMac->lim.gHTMaxRxAMpduFactor = 0;
444 pMac->lim.gHTServiceIntervalGranularity = 0;
445 pMac->lim.gHTControlledAccessOnly = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700446 pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
447 pMac->lim.gHTPCOActive = 0;
448
449 pMac->lim.gHTPCOPhase = 0;
450 pMac->lim.gHTSecondaryBeacon = 0;
451 pMac->lim.gHTDualCTSProtection = 0;
452 pMac->lim.gHTSTBCBasicMCS = 0;
453 pMac->lim.gAddBA_Declined = 0; // Flag to Decline the BAR if the particular bit (0-7) is being set
454}
455
Jeff Johnson295189b2012-06-20 16:38:30 -0700456static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
457{
Jeff Johnsone7245742012-09-05 17:12:55 -0700458 tANI_U32 val1, val2, val3;
Jeff Johnson295189b2012-06-20 16:38:30 -0700459 tANI_U16 val16;
460 tANI_U8 val8;
461 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
462 tSirMacHTInfoField1 *pHTInfoField1;
463 tpSirPowerSaveCfg pPowerSaveConfig;
464 tSirMacHTParametersInfo *pAmpduParamInfo;
465
466 /* Read all the CFGs here that were updated before peStart is called */
Jeff Johnsone7245742012-09-05 17:12:55 -0700467 /* All these CFG READS/WRITES are only allowed in init, at start when there is no session
468 * and they will be used throughout when there is no session
469 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700470
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
472 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700473 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700474 return eSIR_FAILURE;
475 }
476
477 if(wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS)
478 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700479 PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700480 return eSIR_FAILURE;
481 }
482 val16 = ( tANI_U16 ) val1;
483 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
484
485 //channel bonding mode could be set to anything from 0 to 4(Titan had these
486 // modes But for Taurus we have only two modes: enable(>0) or disable(=0)
487 pHTCapabilityInfo->supportedChannelWidthSet = val2 ?
488 WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
489 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo)
490 != eSIR_SUCCESS)
491 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700492 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 return eSIR_FAILURE;
494 }
495
496 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS)
497 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700498 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700499 return eSIR_FAILURE;
500 }
501
502 val8 = ( tANI_U8 ) val1;
503 pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
504 pHTInfoField1->recommendedTxWidthSet =
505 (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -0700506 if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1)
507 != eSIR_SUCCESS)
508 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700509 PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 return eSIR_FAILURE;
511 }
512
513 /* WNI_CFG_HEART_BEAT_THRESHOLD */
514
515 if( wlan_cfgGetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, &val1) !=
516 eSIR_SUCCESS )
517 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700518 PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 return eSIR_FAILURE;
520 }
521 if(!val1)
522 {
523 limDeactivateAndChangeTimer(pMac, eLIM_HEART_BEAT_TIMER);
524 pMac->sys.gSysEnableLinkMonitorMode = 0;
525 }
526 else
527 {
528 //No need to activate the timer during init time.
529 pMac->sys.gSysEnableLinkMonitorMode = 1;
530 }
531
532 /* WNI_CFG_SHORT_GI_20MHZ */
533
534 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
535 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700536 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 return eSIR_FAILURE;
538 }
539 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_20MHZ, &val2) != eSIR_SUCCESS)
540 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700541 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700542 return eSIR_FAILURE;
543 }
544 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_40MHZ, &val3) != eSIR_SUCCESS)
545 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700546 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 return eSIR_FAILURE;
548 }
549
550 val16 = ( tANI_U16 ) val1;
551 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
552 pHTCapabilityInfo->shortGI20MHz = (tANI_U16)val2;
553 pHTCapabilityInfo->shortGI40MHz = (tANI_U16)val3;
554
555 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) !=
556 eSIR_SUCCESS)
557 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700558 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 return eSIR_FAILURE;
560 }
561
562 /* WNI_CFG_MAX_RX_AMPDU_FACTOR */
563
564 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &val1) != eSIR_SUCCESS)
565 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700566 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 return eSIR_FAILURE;
568 }
569 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_RX_AMPDU_FACTOR, &val2) != eSIR_SUCCESS)
570 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700571 PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 return eSIR_FAILURE;
573 }
574 val16 = ( tANI_U16 ) val1;
575 pAmpduParamInfo = ( tSirMacHTParametersInfo* ) &val16;
576 pAmpduParamInfo->maxRxAMPDUFactor = (tANI_U8)val2;
577 if(cfgSetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, *(tANI_U8*)pAmpduParamInfo) !=
578 eSIR_SUCCESS)
579 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700580 PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 return eSIR_FAILURE;
582 }
583
584 /* WNI_CFG_SHORT_PREAMBLE - this one is not updated in
585 limHandleCFGparamUpdate do we want to update this? */
586 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val1) != eSIR_SUCCESS)
587 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700588 limLog(pMac, LOGP, FL("cfg get short preamble failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 return eSIR_FAILURE;
590 }
591
Jeff Johnson295189b2012-06-20 16:38:30 -0700592 /* WNI_CFG_MAX_PS_POLL */
593
594 /* Allocate and fill in power save configuration. */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530595 pPowerSaveConfig = vos_mem_malloc(sizeof(tSirPowerSaveCfg));
596 if (NULL == pPowerSaveConfig)
Jeff Johnson295189b2012-06-20 16:38:30 -0700597 {
598 PELOGE(limLog(pMac, LOGE, FL("LIM: Cannot allocate memory for power save "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700599 "configuration"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700600 return eSIR_FAILURE;
601 }
602
603 /* This context should be valid if power-save configuration message has been
604 * already dispatched during initialization process. Re-using the present
605 * configuration mask
606 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530607 vos_mem_copy(pPowerSaveConfig, (tANI_U8 *)&pMac->pmm.gPmmCfg, sizeof(tSirPowerSaveCfg));
Jeff Johnson295189b2012-06-20 16:38:30 -0700608
609 /* Note: it is okay to do this since DAL/HAL is alrady started */
610 if ( (pmmSendPowerSaveCfg(pMac, pPowerSaveConfig)) != eSIR_SUCCESS)
611 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700612 PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed "));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 return eSIR_FAILURE;
614 }
615
616 /* WNI_CFG_BG_SCAN_CHANNEL_LIST_CHANNEL_LIST */
617
Jeff Johnson295189b2012-06-20 16:38:30 -0700618 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700619 FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700620 pMac->lim.gLimBackgroundScanChannelId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700621
622 /* WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA - not needed */
623
624 /* This was initially done after resume notification from HAL. Now, DAL is
625 started before PE so this can be done here */
Jeff Johnsone7245742012-09-05 17:12:55 -0700626 handleHTCapabilityandHTInfo(pMac, NULL);
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800627 if(wlan_cfgGetInt(pMac, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,(tANI_U32 *) &pMac->lim.disableLDPCWithTxbfAP) != eSIR_SUCCESS)
628 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700629 limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800630 return eSIR_FAILURE;
631 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530632#ifdef FEATURE_WLAN_TDLS
633 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
634 {
635 limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
636 return eSIR_FAILURE;
637 }
638 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
639 {
640 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
641 return eSIR_FAILURE;
642 }
643#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700644 return eSIR_SUCCESS;
645}
Jeff Johnson295189b2012-06-20 16:38:30 -0700646
647/*
648 limStart
649 This function is to replace the __limProcessSmeStartReq since there is no
650 eWNI_SME_START_REQ post to PE.
651*/
652tSirRetStatus limStart(tpAniSirGlobal pMac)
653{
654 tSirResultCodes retCode = eSIR_SUCCESS;
655
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700656 PELOG1(limLog(pMac, LOG1, FL(" enter"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700657
658 if (pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
659 {
660 pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
661
Jeff Johnsone7245742012-09-05 17:12:55 -0700662 MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
Jeff Johnson295189b2012-06-20 16:38:30 -0700663
664 // By default do not return after first scan match
665 pMac->lim.gLimReturnAfterFirstMatch = 0;
666
667 // Initialize MLM state machine
668 limInitMlm(pMac);
669
670 // By default return unique scan results
671 pMac->lim.gLimReturnUniqueResults = true;
672 pMac->lim.gLimSmeScanResultLength = 0;
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700673#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
674 pMac->lim.gLimSmeLfrScanResultLength = 0;
675#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 }
677 else
678 {
679 /**
680 * Should not have received eWNI_SME_START_REQ in states
681 * other than OFFLINE. Return response to host and
682 * log error
683 */
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700684 limLog(pMac, LOGE, FL("Invalid SME state %X"),pMac->lim.gLimSmeState );
Jeff Johnson295189b2012-06-20 16:38:30 -0700685 retCode = eSIR_FAILURE;
686 }
687
688 return retCode;
689}
690
691/**
692 * limInitialize()
693 *
694 *FUNCTION:
695 * This function is called from LIM thread entry function.
696 * LIM related global data structures are initialized in this function.
697 *
698 *LOGIC:
699 * NA
700 *
701 *ASSUMPTIONS:
702 * NA
703 *
704 *NOTE:
705 * NA
706 *
707 * @param pMac - Pointer to global MAC structure
708 * @return None
709 */
710
711tSirRetStatus
712limInitialize(tpAniSirGlobal pMac)
713{
714 tSirRetStatus status = eSIR_SUCCESS;
715
716 __limInitAssocVars(pMac);
717 __limInitVars(pMac);
718 __limInitStates(pMac);
719 __limInitStatsVars(pMac);
720 __limInitBssVars(pMac);
721 __limInitScanVars(pMac);
722 __limInitHTVars(pMac);
723 __limInitTitanVars(pMac);
724
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 status = limStart(pMac);
726 if(eSIR_SUCCESS != status)
727 {
728 return status;
729 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700730
731 /*
732 * MLM will be intitalized when 'START' request comes from SME.
733 * limInitMlm calls limCreateTimers, which actually relies on
734 * CFG to be downloaded. So it should not be called as part of
735 * peStart, as CFG download is happening after peStart.
736 */
737 //limInitMlm(pMac);
738 // Initializations for maintaining peers in IBSS
739 limIbssInit(pMac);
740
741 pmmInitialize(pMac);
742
743
744#if defined WLAN_FEATURE_VOWIFI
745 rrmInitialize(pMac);
746#endif
747#if defined WLAN_FEATURE_VOWIFI_11R
748 limFTOpen(pMac);
749#endif
750
Jeff Johnson295189b2012-06-20 16:38:30 -0700751 vos_list_init(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700752
753#if 0
754
755 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR);
756 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_WARN);
757 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL);
758
759 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_WARN);
760 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_ERROR);
761
762 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_WARN);
763 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR);
764 vos_trace_setLevel(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR);
765
766 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
767
768 vos_trace_setLevel(VOS_MODULE_ID_SSC, VOS_TRACE_LEVEL_ERROR);
769
770 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
771 vos_trace_setLevel(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR);
772
773 vos_trace_setLevel(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR);
774
775
776 vos_trace_setLevel(VOS_MODULE_ID_BAL, VOS_TRACE_LEVEL_ERROR);
777
778 vos_trace_setLevel(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR);
779#endif
780 MTRACE(limTraceInit(pMac));
781
Jeff Johnson295189b2012-06-20 16:38:30 -0700782 //Initialize the configurations needed by PE
783 if( eSIR_FAILURE == __limInitConfig(pMac))
784 {
785 //We need to undo everything in limStart
786 limCleanupMlm(pMac);
787 return eSIR_FAILURE;
788 }
789
790 //initialize the TSPEC admission control table.
791 //Note that this was initially done after resume notification from HAL.
792 //Now, DAL is started before PE so this can be done here
793 limAdmitControlInit(pMac);
794 limRegisterHalIndCallBack(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700795
796 return status;
797
798} /*** end limInitialize() ***/
799
800
801
802/**
803 * limCleanup()
804 *
805 *FUNCTION:
806 * This function is called upon reset or persona change
807 * to cleanup LIM state
808 *
809 *LOGIC:
810 * NA
811 *
812 *ASSUMPTIONS:
813 * NA
814 *
815 *NOTE:
816 * NA
817 *
818 * @param pMac - Pointer to Global MAC structure
819 * @return None
820 */
821
822void
823limCleanup(tpAniSirGlobal pMac)
824{
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 v_PVOID_t pvosGCTx;
826 VOS_STATUS retStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -0700827
Jeff Johnson295189b2012-06-20 16:38:30 -0700828//Before destroying the list making sure all the nodes have been deleted.
829//Which should be the normal case, but a memory leak has been reported.
830
831 tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL;
832
833 while(vos_list_remove_front(&pMac->lim.gLimMgmtFrameRegistratinQueue,
834 (vos_list_node_t**)&pLimMgmtRegistration) == VOS_STATUS_SUCCESS)
835 {
836 VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
837 FL("Fixing leak! Deallocating pLimMgmtRegistration node"));
838
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530839 vos_mem_free(pLimMgmtRegistration);
Jeff Johnson295189b2012-06-20 16:38:30 -0700840 }
841
842 vos_list_destroy(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700843
844 limCleanupMlm(pMac);
845 limCleanupLmm(pMac);
846
847 // free up preAuth table
848 if (pMac->lim.gLimPreAuthTimerTable.pTable != NULL)
849 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530850 vos_mem_free(pMac->lim.gLimPreAuthTimerTable.pTable);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 pMac->lim.gLimPreAuthTimerTable.pTable = NULL;
852 pMac->lim.gLimPreAuthTimerTable.numEntry = 0;
853 }
854
855 if(NULL != pMac->lim.pDialogueTokenHead)
856 {
857 limDeleteDialogueTokenList(pMac);
858 }
859
860 if(NULL != pMac->lim.pDialogueTokenTail)
861 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530862 vos_mem_free(pMac->lim.pDialogueTokenTail);
Jeff Johnson295189b2012-06-20 16:38:30 -0700863 pMac->lim.pDialogueTokenTail = NULL;
864 }
865
866 # if 0
867 if (pMac->lim.gpLimStartBssReq != NULL)
868 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530869 vos_mem_free(pMac->lim.gpLimStartBssReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 pMac->lim.gpLimStartBssReq = NULL;
871 }
872 #endif
873
874 if (pMac->lim.gpLimMlmSetKeysReq != NULL)
875 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530876 vos_mem_free(pMac->lim.gpLimMlmSetKeysReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700877 pMac->lim.gpLimMlmSetKeysReq = NULL;
878 }
879
880 #if 0
881 if (pMac->lim.gpLimJoinReq != NULL)
882 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530883 vos_mem_free(pMac->lim.gpLimJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700884 pMac->lim.gpLimJoinReq = NULL;
885 }
886 #endif
887
888 if (pMac->lim.gpLimMlmAuthReq != NULL)
889 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530890 vos_mem_free(pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700891 pMac->lim.gpLimMlmAuthReq = NULL;
892 }
893
Jeff Johnsone7245742012-09-05 17:12:55 -0700894#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700895 if (pMac->lim.gpLimMlmJoinReq != NULL)
896 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530897 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700898 pMac->lim.gpLimMlmJoinReq = NULL;
899 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700900#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700901
902 #if 0
903 if (pMac->lim.gpLimReassocReq != NULL)
904 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530905 vos_mem_free(pMac->lim.gpLimReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700906 pMac->lim.gpLimReassocReq = NULL;
907 }
908 #endif
909
910 if (pMac->lim.gpLimMlmRemoveKeyReq != NULL)
911 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530912 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700913 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
914 }
915
Viral Modid440e682013-03-06 02:25:31 -0800916 if (pMac->lim.gpDefdSmeMsgForNOA != NULL)
Viral Modid86bde22012-12-10 13:09:21 -0800917 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530918 vos_mem_free(pMac->lim.gpDefdSmeMsgForNOA);
Viral Modid440e682013-03-06 02:25:31 -0800919 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Viral Modid86bde22012-12-10 13:09:21 -0800920 }
Viral Modid86bde22012-12-10 13:09:21 -0800921
Jeff Johnson295189b2012-06-20 16:38:30 -0700922 if (pMac->lim.gpLimMlmScanReq != NULL)
923 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530924 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700925 pMac->lim.gpLimMlmScanReq = NULL;
926 }
927
928#if 0
929 if(NULL != pMac->lim.beacon)
930 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530931 vos_mem_free((void*) pMac->lim.beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700932 pMac->lim.beacon = NULL;
933 }
934#endif
935 #if 0
936 if(NULL != pMac->lim.assocReq)
937 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530938 vos_mem_free((void*) pMac->lim.assocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700939 pMac->lim.assocReq= NULL;
940 }
941 #endif
942
943#if 0
944 if(NULL != pMac->lim.assocRsp)
945 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530946 vos_mem_free((void*) pMac->lim.assocRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700947 pMac->lim.assocRsp= NULL;
948 }
949#endif
950 // Now, finally reset the deferred message queue pointers
951 limResetDeferredMsgQ(pMac);
952
Jeff Johnson295189b2012-06-20 16:38:30 -0700953
954 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
955 retStatus = WLANTL_DeRegisterMgmtFrmClient(pvosGCTx);
956
957 if ( retStatus != VOS_STATUS_SUCCESS )
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700958 PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out..."));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700959
960#if defined WLAN_FEATURE_VOWIFI
961 rrmCleanup(pMac);
962#endif
963#if defined WLAN_FEATURE_VOWIFI_11R
964 limFTCleanup(pMac);
965#endif
966
967} /*** end limCleanup() ***/
968
969
970/** -------------------------------------------------------------
971\fn peOpen
972\brief will be called in Open sequence from macOpen
973\param tpAniSirGlobal pMac
974\param tHalOpenParameters *pHalOpenParam
975\return tSirRetStatus
976 -------------------------------------------------------------*/
977
978tSirRetStatus peOpen(tpAniSirGlobal pMac, tMacOpenParameters *pMacOpenParam)
979{
980 pMac->lim.maxBssId = pMacOpenParam->maxBssId;
981 pMac->lim.maxStation = pMacOpenParam->maxStation;
982
983 if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
984 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700985 PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700986 return eSIR_FAILURE;
987 }
988
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530989 pMac->lim.limTimers.gpLimCnfWaitTimer = vos_mem_malloc(sizeof(TX_TIMER) * pMac->lim.maxStation);
990 if (NULL == pMac->lim.limTimers.gpLimCnfWaitTimer)
Jeff Johnson295189b2012-06-20 16:38:30 -0700991 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700992 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700993 return eSIR_FAILURE;
994 }
995
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800996#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530997 pMac->lim.gpLimAIDpool = vos_mem_malloc(sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1));
998 if (NULL == pMac->lim.gpLimAIDpool)
Jeff Johnson295189b2012-06-20 16:38:30 -0700999 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001000 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001001 return eSIR_FAILURE;
1002 }
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001003#endif
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301004 pMac->lim.gpSession = vos_mem_malloc(sizeof(tPESession)* pMac->lim.maxBssId);
1005 if (NULL == pMac->lim.gpSession)
Jeff Johnson295189b2012-06-20 16:38:30 -07001006 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001007 limLog(pMac, LOGE, FL("memory allocate failed!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001008 return eSIR_FAILURE;
1009 }
1010
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301011 vos_mem_set(pMac->lim.gpSession, sizeof(tPESession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001012
1013
1014 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301015 pMac->dph.dphHashTable.pHashTable = vos_mem_malloc(sizeof(tpDphHashNode)*pMac->lim.maxStation);
1016 if (NULL == pMac->dph.dphHashTable.pHashTable)
Jeff Johnson295189b2012-06-20 16:38:30 -07001017 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001018 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001019 return eSIR_FAILURE;
1020 }
1021
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301022 pMac->dph.dphHashTable.pDphNodeArray = vos_mem_malloc(sizeof(tDphHashNode)*pMac->lim.maxStation);
1023 if (NULL == pMac->dph.dphHashTable.pDphNodeArray)
Jeff Johnson295189b2012-06-20 16:38:30 -07001024 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001025 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001026 return eSIR_FAILURE;
1027 }
1028 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301029 pMac->pmm.gPmmTim.pTim = vos_mem_malloc(sizeof(tANI_U8)*pMac->lim.maxStation);
1030 if (NULL == pMac->pmm.gPmmTim.pTim)
Jeff Johnson295189b2012-06-20 16:38:30 -07001031 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001032 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001033 return eSIR_FAILURE;
1034 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301035 vos_mem_set(pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001036
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001037 pMac->lim.mgmtFrameSessionId = 0xff;
Leela Venkata Kiran Kumar Reddy Chirala2247e962013-03-22 19:21:10 -07001038 pMac->lim.deferredMsgCnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001039
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001040 if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pMac->lim.lkPeGlobalLock ) ) )
1041 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001042 PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!"));)
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001043 return eSIR_FAILURE;
1044 }
Venkata Prathyusha Kuntupalli22ba5982013-04-24 13:09:20 -07001045 pMac->lim.deauthMsgCnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001046 return eSIR_SUCCESS;
1047}
1048
1049/** -------------------------------------------------------------
1050\fn peClose
1051\brief will be called in close sequence from macClose
1052\param tpAniSirGlobal pMac
1053\return tSirRetStatus
1054 -------------------------------------------------------------*/
1055
1056tSirRetStatus peClose(tpAniSirGlobal pMac)
1057{
1058 tANI_U8 i;
1059
1060 if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
1061 return eSIR_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07001062
Jeff Johnson295189b2012-06-20 16:38:30 -07001063 for(i =0; i < pMac->lim.maxBssId; i++)
1064 {
1065 if(pMac->lim.gpSession[i].valid == TRUE)
1066 {
1067 peDeleteSession(pMac,&pMac->lim.gpSession[i]);
1068 }
1069 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301070 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
Jeff Johnsone7245742012-09-05 17:12:55 -07001071 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001072#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301073 vos_mem_free(pMac->lim.gpLimAIDpool);
Jeff Johnsone7245742012-09-05 17:12:55 -07001074 pMac->lim.gpLimAIDpool = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001075#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001076
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301077 vos_mem_free(pMac->lim.gpSession);
Jeff Johnson295189b2012-06-20 16:38:30 -07001078 pMac->lim.gpSession = NULL;
1079 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301080 vos_mem_free(pMac->dph.dphHashTable.pHashTable);
Jeff Johnson295189b2012-06-20 16:38:30 -07001081 pMac->dph.dphHashTable.pHashTable = NULL;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301082 vos_mem_free(pMac->dph.dphHashTable.pDphNodeArray);
Jeff Johnson295189b2012-06-20 16:38:30 -07001083 pMac->dph.dphHashTable.pDphNodeArray = NULL;
1084 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301085 vos_mem_free(pMac->pmm.gPmmTim.pTim);
Jeff Johnson295189b2012-06-20 16:38:30 -07001086 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001087 if( !VOS_IS_STATUS_SUCCESS( vos_lock_destroy( &pMac->lim.lkPeGlobalLock ) ) )
1088 {
1089 return eSIR_FAILURE;
1090 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001091 return eSIR_SUCCESS;
1092}
1093
1094/** -------------------------------------------------------------
1095\fn peStart
1096\brief will be called in start sequence from macStart
1097\param tpAniSirGlobal pMac
1098\return none
1099 -------------------------------------------------------------*/
1100
1101tSirRetStatus peStart(tpAniSirGlobal pMac)
1102{
1103 tSirRetStatus status = eSIR_SUCCESS;
1104
1105 status = limInitialize(pMac);
1106#if defined(ANI_LOGDUMP)
1107 limDumpInit(pMac);
1108#endif //#if defined(ANI_LOGDUMP)
1109
1110 return status;
1111}
1112
1113/** -------------------------------------------------------------
1114\fn peStop
1115\brief will be called in stop sequence from macStop
1116\param tpAniSirGlobal pMac
1117\return none
1118 -------------------------------------------------------------*/
1119
1120void peStop(tpAniSirGlobal pMac)
1121{
1122 limCleanup(pMac);
1123 SET_LIM_MLM_STATE(pMac, eLIM_MLM_OFFLINE_STATE);
1124 return;
1125}
1126
1127/** -------------------------------------------------------------
1128\fn peFreeMsg
1129\brief Called by VOS scheduler (function vos_sched_flush_mc_mqs)
1130\ to free a given PE message on the TX and MC thread.
1131\ This happens when there are messages pending in the PE
1132\ queue when system is being stopped and reset.
1133\param tpAniSirGlobal pMac
1134\param tSirMsgQ pMsg
1135\return none
1136-----------------------------------------------------------------*/
1137v_VOID_t peFreeMsg( tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1138{
1139 if (pMsg != NULL)
1140 {
1141 if (NULL != pMsg->bodyptr)
1142 {
1143 if (SIR_BB_XPORT_MGMT_MSG == pMsg->type)
1144 {
1145 vos_pkt_return_packet((vos_pkt_t *)pMsg->bodyptr);
1146 }
1147 else
1148 {
1149 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
1150 }
1151 }
1152 pMsg->bodyptr = 0;
1153 pMsg->bodyval = 0;
1154 pMsg->type = 0;
1155 }
1156 return;
1157}
1158
1159
1160/**
1161 * The function checks if a particular timer should be allowed
1162 * into LIM while device is sleeping
1163 */
1164tANI_U8 limIsTimerAllowedInPowerSaveState(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1165{
1166 tANI_U8 retStatus = TRUE;
1167
1168 if(!limIsSystemInActiveState(pMac))
1169 {
1170 switch(pMsg->type)
1171 {
1172 /* Don't allow following timer messages if in sleep */
1173 case SIR_LIM_MIN_CHANNEL_TIMEOUT:
1174 case SIR_LIM_MAX_CHANNEL_TIMEOUT:
1175 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
1176 retStatus = FALSE;
1177 break;
1178 /* May allow following timer messages in sleep mode */
1179 case SIR_LIM_HASH_MISS_THRES_TIMEOUT:
1180
1181 /* Safe to allow as of today, this triggers background scan
1182 * which will not be started if the device is in power-save mode
1183 * might need to block in the future if we decide to implement
1184 * spectrum management
1185 */
1186 case SIR_LIM_QUIET_TIMEOUT:
1187
1188 /* Safe to allow as of today, this triggers background scan
1189 * which will not be started if the device is in power-save mode
1190 * might need to block in the future if we decide to implement
1191 * spectrum management
1192 */
1193 case SIR_LIM_QUIET_BSS_TIMEOUT:
1194
1195 /* Safe to allow this timermessage, triggers background scan
1196 * which is blocked in sleep mode
1197 */
1198 case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
1199
1200 /* Safe to allow this timer, since, while in IMPS this timer will not
1201 * be started. In case of BMPS sleep, SoftMAC handles the heart-beat
1202 * when heart-beat control is handled back to PE, device would have
1203 * already woken-up due to EXIT_BMPS_IND mesage from SoftMAC
1204 */
1205 case SIR_LIM_HEART_BEAT_TIMEOUT:
1206 case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
1207
1208 /* Safe to allow, PE is not handling this message as of now. May need
1209 * to block it, basically, free the buffer and restart the timer
1210 */
1211 case SIR_LIM_REASSOC_FAIL_TIMEOUT:
1212 case SIR_LIM_JOIN_FAIL_TIMEOUT:
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08001213 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
Jeff Johnson295189b2012-06-20 16:38:30 -07001214 case SIR_LIM_ASSOC_FAIL_TIMEOUT:
1215 case SIR_LIM_AUTH_FAIL_TIMEOUT:
1216 case SIR_LIM_ADDTS_RSP_TIMEOUT:
1217 retStatus = TRUE;
1218 break;
1219
1220 /* by default allow rest of messages */
1221 default:
1222 retStatus = TRUE;
1223 break;
1224
1225
1226 }
1227 }
1228
1229 return retStatus;
1230
1231}
1232
1233
1234
1235/**
1236 * limPostMsgApi()
1237 *
1238 *FUNCTION:
1239 * This function is called from other thread while posting a
1240 * message to LIM message Queue gSirLimMsgQ.
1241 *
1242 *LOGIC:
1243 * NA
1244 *
1245 *ASSUMPTIONS:
1246 * NA
1247 *
1248 *NOTE:
1249 * NA
1250 *
1251 * @param pMac - Pointer to Global MAC structure
1252 * @param pMsg - Pointer to the message structure
1253 * @return None
1254 */
1255
1256tANI_U32
1257limPostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1258{
Jeff Johnson295189b2012-06-20 16:38:30 -07001259 return vos_mq_post_message(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
1260
1261
Jeff Johnson295189b2012-06-20 16:38:30 -07001262} /*** end limPostMsgApi() ***/
1263
1264
1265/*--------------------------------------------------------------------------
1266
1267 \brief pePostMsgApi() - A wrapper function to post message to Voss msg queues
1268
1269 This function can be called by legacy code to post message to voss queues OR
1270 legacy code may keep on invoking 'limPostMsgApi' to post the message to voss queue
1271 for dispatching it later.
1272
1273 \param pMac - Pointer to Global MAC structure
1274 \param pMsg - Pointer to the message structure
1275
1276 \return tANI_U32 - TX_SUCCESS for success.
1277
1278 --------------------------------------------------------------------------*/
1279
1280tSirRetStatus pePostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1281{
1282 return (tSirRetStatus)limPostMsgApi(pMac, pMsg);
1283}
1284
1285/*--------------------------------------------------------------------------
1286
1287 \brief peProcessMessages() - Message Processor for PE
1288
1289 Voss calls this function to dispatch the message to PE
1290
1291 \param pMac - Pointer to Global MAC structure
1292 \param pMsg - Pointer to the message structure
1293
1294 \return tANI_U32 - TX_SUCCESS for success.
1295
1296 --------------------------------------------------------------------------*/
1297
1298tSirRetStatus peProcessMessages(tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1299{
1300 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
1301 {
1302 return eSIR_SUCCESS;
1303 }
1304 /**
1305 * If the Message to be handled is for CFG Module call the CFG Msg Handler and
1306 * for all the other cases post it to LIM
1307 */
1308 if ( SIR_CFG_PARAM_UPDATE_IND != pMsg->type && IS_CFG_MSG(pMsg->type))
1309 cfgProcessMbMsg(pMac, (tSirMbMsg*)pMsg->bodyptr);
1310 else
1311 limMessageProcessor(pMac, pMsg);
1312 return eSIR_SUCCESS;
1313}
1314
1315
Jeff Johnson295189b2012-06-20 16:38:30 -07001316
1317// ---------------------------------------------------------------------------
1318/**
1319 * peHandleMgmtFrame
1320 *
1321 * FUNCTION:
1322 * Process the Management frames from TL
1323 *
1324 * LOGIC:
1325 *
1326 * ASSUMPTIONS: TL sends the packet along with the VOS GlobalContext
1327 *
1328 * NOTE:
1329 *
1330 * @param pvosGCtx Global Vos Context
1331 * @param vossBuff Packet
1332 * @return None
1333 */
1334
1335VOS_STATUS peHandleMgmtFrame( v_PVOID_t pvosGCtx, v_PVOID_t vosBuff)
1336{
1337 tpAniSirGlobal pMac;
1338 tpSirMacMgmtHdr mHdr;
1339 tSirMsgQ msg;
1340 vos_pkt_t *pVosPkt;
1341 VOS_STATUS vosStatus;
1342 v_U8_t *pRxPacketInfo;
1343
1344 pVosPkt = (vos_pkt_t *)vosBuff;
1345 if (NULL == pVosPkt)
1346 {
1347 return VOS_STATUS_E_FAILURE;
1348 }
1349
1350 pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, pvosGCtx);
1351 if (NULL == pMac)
1352 {
1353 // cannot log a failure without a valid pMac
1354 vos_pkt_return_packet(pVosPkt);
1355 return VOS_STATUS_E_FAILURE;
1356 }
1357
1358 vosStatus = WDA_DS_PeekRxPacketInfo( pVosPkt, (void *)&pRxPacketInfo, VOS_FALSE );
1359
1360 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1361 {
1362 vos_pkt_return_packet(pVosPkt);
1363 return VOS_STATUS_E_FAILURE;
1364 }
1365
1366
1367 //
1368 // The MPDU header is now present at a certain "offset" in
1369 // the BD and is specified in the BD itself
1370 //
1371 mHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
1372 if(mHdr->fc.type == SIR_MAC_MGMT_FRAME)
1373 {
1374 PELOG1(limLog( pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001375 FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d Sizes:FC%d Mgmt%d"),
Jeff Johnsone7245742012-09-05 17:12:55 -07001376 pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
Jeff Johnson295189b2012-06-20 16:38:30 -07001377
Jeff Johnsone7245742012-09-05 17:12:55 -07001378 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION,
Jeff Johnson295189b2012-06-20 16:38:30 -07001379 LIM_TRACE_MAKE_RXMGMT(mHdr->fc.subType,
1380 (tANI_U16) (((tANI_U16) (mHdr->seqControl.seqNumHi << 4)) | mHdr->seqControl.seqNumLo)));)
1381 }
1382
1383
1384 // Forward to MAC via mesg = SIR_BB_XPORT_MGMT_MSG
1385 msg.type = SIR_BB_XPORT_MGMT_MSG;
1386 msg.bodyptr = vosBuff;
1387 msg.bodyval = 0;
1388
1389 if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
1390 &msg,
1391 mHdr->fc.type,
1392 mHdr->fc.subType ))
1393 {
1394 vos_pkt_return_packet(pVosPkt);
1395 limLog( pMac, LOGW,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001396 FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001397 return VOS_STATUS_E_FAILURE;
1398 }
1399
1400 return VOS_STATUS_SUCCESS;
1401}
1402
1403// ---------------------------------------------------------------------------
1404/**
1405 * peRegisterTLHandle
1406 *
1407 * FUNCTION:
1408 * Registers the Handler which, process the Management frames from TL
1409 *
1410 * LOGIC:
1411 *
1412 * ASSUMPTIONS:
1413 *
1414 * NOTE:
1415 *
1416 * @return None
1417 */
1418
1419void peRegisterTLHandle(tpAniSirGlobal pMac)
1420{
1421 v_PVOID_t pvosGCTx;
1422 VOS_STATUS retStatus;
1423
1424 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
1425
1426 retStatus = WLANTL_RegisterMgmtFrmClient(pvosGCTx, peHandleMgmtFrame);
1427
1428 if (retStatus != VOS_STATUS_SUCCESS)
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001429 limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07001430
1431}
Jeff Johnson295189b2012-06-20 16:38:30 -07001432
1433
1434/**
Jeff Johnson295189b2012-06-20 16:38:30 -07001435 * limIsSystemInScanState()
1436 *
1437 *FUNCTION:
1438 * This function is called by various MAC software modules to
1439 * determine if System is in Scan/Learn state
1440 *
1441 *LOGIC:
1442 * NA
1443 *
1444 *ASSUMPTIONS:
1445 * NA
1446 *
1447 *NOTE:
1448 *
1449 * @param pMac - Pointer to Global MAC structure
1450 * @return true - System is in Scan/Learn state
1451 * false - System is NOT in Scan/Learn state
1452 */
1453
1454tANI_U8
1455limIsSystemInScanState(tpAniSirGlobal pMac)
1456{
1457 switch (pMac->lim.gLimSmeState)
1458 {
1459 case eLIM_SME_CHANNEL_SCAN_STATE:
1460 case eLIM_SME_NORMAL_CHANNEL_SCAN_STATE:
1461 case eLIM_SME_LINK_EST_WT_SCAN_STATE:
1462 case eLIM_SME_WT_SCAN_STATE:
1463 // System is in Learn mode
1464 return true;
1465
1466 default:
1467 // System is NOT in Learn mode
1468 return false;
1469 }
1470} /*** end limIsSystemInScanState() ***/
1471
1472
1473
1474/**
1475 * limIsSystemInActiveState()
1476 *
1477 *FUNCTION:
1478 * This function is called by various MAC software modules to
1479 * determine if System is in Active/Wakeup state
1480 *
1481 *LOGIC:
1482 * NA
1483 *
1484 *ASSUMPTIONS:
1485 * NA
1486 *
1487 *NOTE:
1488 *
1489 * @param pMac - Pointer to Global MAC structure
1490 * @return true - System is in Active state
1491 * false - System is not in Active state
1492 */
1493
1494tANI_U8 limIsSystemInActiveState(tpAniSirGlobal pMac)
1495{
1496 switch (pMac->pmm.gPmmState)
1497 {
1498 case ePMM_STATE_BMPS_WAKEUP:
1499 case ePMM_STATE_IMPS_WAKEUP:
1500 case ePMM_STATE_READY:
1501 // System is in Active mode
1502 return true;
1503 default:
1504 return false;
1505 // System is NOT in Active mode
1506 }
1507}
1508
1509
Jeff Johnson295189b2012-06-20 16:38:30 -07001510
Jeff Johnson295189b2012-06-20 16:38:30 -07001511
1512
1513/**
1514*\brief limReceivedHBHandler()
1515*
1516* This function is called by schBeaconProcess() upon
1517* receiving a Beacon on STA. This also gets called upon
1518* receiving Probe Response after heat beat failure is
1519* detected.
1520*
1521* param pMac - global mac structure
1522* param channel - channel number indicated in Beacon, Probe Response
1523* return - none
1524*/
1525
1526
1527void
1528limReceivedHBHandler(tpAniSirGlobal pMac, tANI_U8 channelId, tpPESession psessionEntry)
1529{
1530 if((channelId == 0 ) || (channelId == psessionEntry->currentOperChannel) )
1531 psessionEntry->LimRxedBeaconCntDuringHB++;
1532
1533 pMac->pmm.inMissedBeaconScenario = FALSE;
1534} /*** end limReceivedHBHandler() ***/
1535
1536
1537
1538#if 0
1539void limResetHBPktCount(tpPESession psessionEntry)
1540{
1541 psessionEntry->LimRxedBeaconCntDuringHB = 0;
1542}
1543#endif
1544
1545
1546/*
1547 * limProcessWdsInfo()
1548 *
1549 *FUNCTION:
1550 * This function is called from schBeaconProcess in BP
1551 *
1552 *PARAMS:
1553 * @param pMac - Pointer to Global MAC structure
1554 * @param propIEInfo - proprietary IE info
1555 *
1556 *LOGIC:
1557 *
1558 *ASSUMPTIONS:
1559 * NA
1560 *
1561 *NOTE:
1562 *
1563 *
1564 *RETURNS:
1565 *
1566 */
1567
1568void limProcessWdsInfo(tpAniSirGlobal pMac,
1569 tSirPropIEStruct propIEInfo)
1570{
Jeff Johnson295189b2012-06-20 16:38:30 -07001571}
1572
1573
1574
1575/**
1576 * limInitWdsInfoParams()
1577 *
1578 *FUNCTION:
1579 * This function is called while processing
1580 * START_BSS/JOIN/REASSOC_REQ to initialize WDS info
1581 * ind/set related parameters.
1582 *
1583 *LOGIC:
1584 *
1585 *ASSUMPTIONS:
1586 *
1587 *NOTE:
1588 *
1589 * @param pMac Pointer to Global MAC structure
1590 * @return None
1591 */
1592
1593void
1594limInitWdsInfoParams(tpAniSirGlobal pMac)
1595{
1596 pMac->lim.gLimWdsInfo.wdsLength = 0;
1597 pMac->lim.gLimNumWdsInfoInd = 0;
1598 pMac->lim.gLimNumWdsInfoSet = 0;
1599} /*** limInitWdsInfoParams() ***/
1600
1601
1602/** -------------------------------------------------------------
1603\fn limUpdateOverlapStaParam
1604\brief Updates overlap cache and param data structure
1605\param tpAniSirGlobal pMac
1606\param tSirMacAddr bssId
1607\param tpLimProtStaParams pStaParams
1608\return None
1609 -------------------------------------------------------------*/
1610void
1611limUpdateOverlapStaParam(tpAniSirGlobal pMac, tSirMacAddr bssId, tpLimProtStaParams pStaParams)
1612{
1613 int i;
1614 if (!pStaParams->numSta)
1615 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301616 vos_mem_copy(pMac->lim.protStaOverlapCache[0].addr,
1617 bssId,
1618 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001619 pMac->lim.protStaOverlapCache[0].active = true;
1620
1621 pStaParams->numSta = 1;
1622
1623 return;
1624 }
1625
1626 for (i=0; i<LIM_PROT_STA_OVERLAP_CACHE_SIZE; i++)
1627 {
1628 if (pMac->lim.protStaOverlapCache[i].active)
1629 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301630 if (vos_mem_compare( pMac->lim.protStaOverlapCache[i].addr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001631 bssId,
1632 sizeof(tSirMacAddr))) {
1633 return; }
1634 }
1635 else
1636 break;
1637 }
1638
1639 if (i == LIM_PROT_STA_OVERLAP_CACHE_SIZE)
1640 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001641 PELOG1(limLog(pMac, LOG1, FL("Overlap cache is full"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 }
1643 else
1644 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301645 vos_mem_copy(pMac->lim.protStaOverlapCache[i].addr,
1646 bssId,
1647 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001648 pMac->lim.protStaOverlapCache[i].active = true;
1649
1650 pStaParams->numSta++;
1651 }
1652}
1653
1654
1655/**
1656 * limHandleIBSScoalescing()
1657 *
1658 *FUNCTION:
1659 * This function is called upon receiving Beacon/Probe Response
1660 * while operating in IBSS mode.
1661 *
1662 *LOGIC:
1663 *
1664 *ASSUMPTIONS:
1665 *
1666 *NOTE:
1667 *
1668 * @param pMac - Pointer to Global MAC structure
1669 * @param pBeacon - Parsed Beacon Frame structure
1670 * @param pRxPacketInfo - Pointer to RX packet info structure
1671 *
1672 * @return Status whether to process or ignore received Beacon Frame
1673 */
1674
1675tSirRetStatus
1676limHandleIBSScoalescing(
1677 tpAniSirGlobal pMac,
1678 tpSchBeaconStruct pBeacon,
1679 tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
1680{
1681 tpSirMacMgmtHdr pHdr;
1682 tSirRetStatus retCode;
1683
1684 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001685 if ( (!pBeacon->capabilityInfo.ibss) ||
1686 (limCmpSSid(pMac, &pBeacon->ssId,psessionEntry) != true) ||
1687 (psessionEntry->currentOperChannel != pBeacon->channelNumber) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001688 /* Received SSID does not match => Ignore received Beacon frame. */
1689 retCode = eSIR_LIM_IGNORE_BEACON;
1690 else
1691 {
1692 tANI_U32 ieLen;
1693 tANI_U16 tsfLater;
1694 tANI_U8 *pIEs;
1695 ieLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
1696 tsfLater = WDA_GET_RX_TSF_LATER(pRxPacketInfo);
1697 pIEs = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
1698 PELOG3(limLog(pMac, LOG3, FL("BEFORE Coalescing tsfLater val :%d"), tsfLater);)
1699 retCode = limIbssCoalesce(pMac, pHdr, pBeacon, pIEs, ieLen, tsfLater,psessionEntry);
1700 }
1701 return retCode;
1702} /*** end limHandleIBSScoalescing() ***/
1703
1704
1705
1706/**
1707 * limDetectChangeInApCapabilities()
1708 *
1709 *FUNCTION:
1710 * This function is called while SCH is processing
1711 * received Beacon from AP on STA to detect any
1712 * change in AP's capabilities. If there any change
1713 * is detected, Roaming is informed of such change
1714 * so that it can trigger reassociation.
1715 *
1716 *LOGIC:
1717 *
1718 *ASSUMPTIONS:
1719 *
1720 *NOTE:
1721 * Notification is enabled for STA product only since
1722 * it is not a requirement on BP side.
1723 *
1724 * @param pMac Pointer to Global MAC structure
1725 * @param pBeacon Pointer to parsed Beacon structure
1726 * @return None
1727 */
1728
1729void
1730limDetectChangeInApCapabilities(tpAniSirGlobal pMac,
1731 tpSirProbeRespBeacon pBeacon,
1732 tpPESession psessionEntry)
1733{
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 tANI_U8 len;
1735 tSirSmeApNewCaps apNewCaps;
1736 tANI_U8 newChannel;
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301737 tSirRetStatus status = eSIR_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001738 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
1739 newChannel = (tANI_U8) pBeacon->channelNumber;
1740
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301741 if ( ( false == psessionEntry->limSentCapsChangeNtf ) &&
1742 ( ( ( limIsNullSsid(&pBeacon->ssId) ) ||
1743 ( ( !limIsNullSsid(&pBeacon->ssId) ) &&
1744 ( false == limCmpSSid(pMac, &pBeacon->ssId, psessionEntry) ) ) ) ||
1745 ( (SIR_MAC_GET_ESS(apNewCaps.capabilityInfo) !=
1746 SIR_MAC_GET_ESS(psessionEntry->limCurrentBssCaps) ) ||
1747 ( SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) !=
1748 SIR_MAC_GET_PRIVACY(psessionEntry->limCurrentBssCaps) ) ||
1749 ( SIR_MAC_GET_SHORT_PREAMBLE(apNewCaps.capabilityInfo) !=
1750 SIR_MAC_GET_SHORT_PREAMBLE(psessionEntry->limCurrentBssCaps) ) ||
1751 ( SIR_MAC_GET_QOS(apNewCaps.capabilityInfo) !=
1752 SIR_MAC_GET_QOS(psessionEntry->limCurrentBssCaps) ) ||
1753 ( newChannel != psessionEntry->currentOperChannel )
1754 ) ) )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301755 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301756 if( false == psessionEntry->fWaitForProbeRsp )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301757 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301758 /* If Beacon capabilities is not matching with the current capability,
1759 * then send unicast probe request to AP and take decision after
1760 * receiving probe response */
1761 if ( true == psessionEntry->fIgnoreCapsChange )
1762 {
1763 limLog(pMac, LOGW, FL("Ignoring the Capability change as it is false alarm"));
1764 return;
1765 }
1766 psessionEntry->fWaitForProbeRsp = true;
1767 limLog(pMac, LOGW, FL("AP capabilities are not matching,"
1768 "sending directed probe request.. "));
1769 status = limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
1770 psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
1771 psessionEntry->dot11mode, 0, NULL);
1772
1773 if ( eSIR_SUCCESS != status )
1774 {
1775 limLog(pMac, LOGE, FL("send ProbeReq failed"));
1776 psessionEntry->fWaitForProbeRsp = false;
1777 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301778 return;
1779 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001780 /**
1781 * BSS capabilities have changed.
1782 * Inform Roaming.
1783 */
1784 len = sizeof(tSirMacCapabilityInfo) +
1785 sizeof(tSirMacAddr) + sizeof(tANI_U8) +
1786 3 * sizeof(tANI_U8) + // reserved fields
1787 pBeacon->ssId.length + 1;
1788
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301789 vos_mem_copy(apNewCaps.bssId,
1790 psessionEntry->bssId,
1791 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001792 if (newChannel != psessionEntry->currentOperChannel)
1793 {
1794 PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d - "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001795 "Ignoring beacon!"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 psessionEntry->currentOperChannel, newChannel);)
1797 return;
1798 }
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301799
1800 /**
1801 * When Cisco 1262 Enterprise APs are configured with WPA2-PSK with
1802 * AES+TKIP Pairwise ciphers and WEP-40 Group cipher, they do not set
1803 * the privacy bit in Beacons (wpa/rsnie is still present in beacons),
1804 * the privacy bit is set in Probe and association responses.
1805 * Due to this anomaly, we detect a change in
1806 * AP capabilities when we receive a beacon after association and
1807 * disconnect from the AP. The following check makes sure that we can
1808 * connect to such APs
1809 */
1810 else if ((SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) == 0) &&
1811 (pBeacon->rsnPresent || pBeacon->wpaPresent))
1812 {
1813 PELOGE(limLog(pMac, LOGE, FL("BSS Caps (Privacy) bit 0 in beacon,"
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001814 " but WPA or RSN IE present, Ignore Beacon!"));)
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301815 return;
1816 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001817 else
1818 apNewCaps.channelId = psessionEntry->currentOperChannel;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301819 vos_mem_copy((tANI_U8 *) &apNewCaps.ssId,
1820 (tANI_U8 *) &pBeacon->ssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001821 pBeacon->ssId.length + 1);
1822
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301823 psessionEntry->fIgnoreCapsChange = false;
1824 psessionEntry->fWaitForProbeRsp = false;
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 psessionEntry->limSentCapsChangeNtf = true;
1826 limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_AP_CAPS_CHANGED,
1827 (tANI_U32 *) &apNewCaps,
1828 len, psessionEntry->smeSessionId);
1829 }
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301830 else if ( true == psessionEntry->fWaitForProbeRsp )
1831 {
1832 /* Only for probe response frames and matching capabilities the control
1833 * will come here. If beacon is with broadcast ssid then fWaitForProbeRsp
1834 * will be false, the control will not come here*/
1835
1836 limLog(pMac, LOG1, FL("capabilities in probe response are"
1837 "matching with the current setting,"
1838 "Ignoring subsequent capability"
1839 "mismatch"));
1840 psessionEntry->fIgnoreCapsChange = true;
1841 psessionEntry->fWaitForProbeRsp = false;
1842 }
1843
Jeff Johnson295189b2012-06-20 16:38:30 -07001844} /*** limDetectChangeInApCapabilities() ***/
1845
1846
1847
1848
1849// ---------------------------------------------------------------------
1850/**
1851 * limUpdateShortSlot
1852 *
1853 * FUNCTION:
1854 * Enable/Disable short slot
1855 *
1856 * LOGIC:
1857 *
1858 * ASSUMPTIONS:
1859 *
1860 * NOTE:
1861 *
1862 * @param enable Flag to enable/disable short slot
1863 * @return None
1864 */
1865
1866tSirRetStatus limUpdateShortSlot(tpAniSirGlobal pMac, tpSirProbeRespBeacon pBeacon, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
1867{
1868
1869 tSirSmeApNewCaps apNewCaps;
Jeff Johnsone7245742012-09-05 17:12:55 -07001870 tANI_U32 nShortSlot;
1871 tANI_U32 val = 0;
1872 tANI_U32 phyMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001873
Jeff Johnsone7245742012-09-05 17:12:55 -07001874 // Check Admin mode first. If it is disabled just return
1875 if (wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val)
1876 != eSIR_SUCCESS)
1877 {
1878 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001879 FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001880 return eSIR_FAILURE;
1881 }
1882 if (val == false)
1883 return eSIR_SUCCESS;
1884
1885 // Check for 11a mode or 11b mode. In both cases return since slot time is constant and cannot/should not change in beacon
1886 limGetPhyMode(pMac, &phyMode, psessionEntry);
1887 if ((phyMode == WNI_CFG_PHY_MODE_11A) || (phyMode == WNI_CFG_PHY_MODE_11B))
1888 return eSIR_SUCCESS;
1889
1890 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07001891
1892 // Earlier implementation: determine the appropriate short slot mode based on AP advertised modes
1893 // when erp is present, apply short slot always unless, prot=on && shortSlot=off
1894 // if no erp present, use short slot based on current ap caps
1895
1896 // Issue with earlier implementation : Cisco 1231 BG has shortSlot = 0, erpIEPresent and useProtection = 0 (Case4);
1897
1898 //Resolution : always use the shortSlot setting the capability info to decide slot time.
1899 // The difference between the earlier implementation and the new one is only Case4.
1900 /*
1901 ERP IE Present | useProtection | shortSlot = QC STA Short Slot
1902 Case1 1 1 1 1 //AP should not advertise this combination.
1903 Case2 1 1 0 0
1904 Case3 1 0 1 1
1905 Case4 1 0 0 0
1906 Case5 0 1 1 1
1907 Case6 0 1 0 0
1908 Case7 0 0 1 1
1909 Case8 0 0 0 0
1910 */
1911 nShortSlot = SIR_MAC_GET_SHORT_SLOT_TIME(apNewCaps.capabilityInfo);
1912
Jeff Johnsone7245742012-09-05 17:12:55 -07001913 if (nShortSlot != psessionEntry->shortSlotTimeSupported)
Jeff Johnson295189b2012-06-20 16:38:30 -07001914 {
1915 // Short slot time capability of AP has changed. Adopt to it.
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001916 PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d"), nShortSlot);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001917 ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
Jeff Johnsone7245742012-09-05 17:12:55 -07001918 psessionEntry->shortSlotTimeSupported = nShortSlot;
Jeff Johnson295189b2012-06-20 16:38:30 -07001919 pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
1920 pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001921 }
1922 return eSIR_SUCCESS;
1923}
1924
1925
Jeff Johnson295189b2012-06-20 16:38:30 -07001926
1927
Jeff Johnson295189b2012-06-20 16:38:30 -07001928
Jeff Johnson295189b2012-06-20 16:38:30 -07001929
1930
1931/** -----------------------------------------------------------------
1932 \brief limHandleLowRssiInd() - handles low rssi indication
1933
1934 This function process the SIR_HAL_LOW_RSSI_IND message from
1935 HAL, and sends a eWNI_SME_LOW_RSSI_IND to CSR.
1936
1937 \param pMac - global mac structure
1938
1939 \return
1940
1941 \sa
1942 ----------------------------------------------------------------- */
1943void limHandleLowRssiInd(tpAniSirGlobal pMac)
1944{
1945#if 0 //RSSI related indications will now go to TL and not PE
1946 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
1947 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
1948 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
1949 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001950 PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001951 limSendSmeRsp(pMac, eWNI_SME_LOW_RSSI_IND, eSIR_SME_SUCCESS, 0, 0);
1952 }
1953 else
1954 {
1955 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001956 FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001957 pMac->pmm.gPmmState);
1958 }
1959 return;
1960#endif
1961}
1962
1963
1964/** -----------------------------------------------------------------
1965 \brief limHandleBmpsStatusInd() - handles BMPS status indication
1966
1967 This function process the SIR_HAL_BMPS_STATUS_IND message from HAL,
1968 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
1969 to SME with reason code 'eSME_EXIT_BMPS_IND_RCVD'.
1970
1971 HAL sends this message when Firmware fails to enter BMPS mode 'AFTER'
1972 HAL had already send PE a SIR_HAL_ENTER_BMPS_RSP with status
1973 code "success". Hence, HAL needs to notify PE to get out of BMPS mode.
1974 This message can also come from FW anytime after we have entered BMPS.
1975 This means we should handle it in WoWL and UAPSD states as well
1976
1977 \param pMac - global mac structure
1978 \return - none
1979 \sa
1980 ----------------------------------------------------------------- */
1981void limHandleBmpsStatusInd(tpAniSirGlobal pMac)
1982{
1983 switch(pMac->pmm.gPmmState)
1984 {
1985 case ePMM_STATE_BMPS_SLEEP:
1986 case ePMM_STATE_UAPSD_WT_SLEEP_RSP:
1987 case ePMM_STATE_UAPSD_SLEEP:
1988 case ePMM_STATE_UAPSD_WT_WAKEUP_RSP:
1989 case ePMM_STATE_WOWLAN:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001990 PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001991 limSendExitBmpsInd(pMac, eSME_BMPS_STATUS_IND_RCVD);
1992 break;
1993
1994 default:
1995 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001996 FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001997 pMac->pmm.gPmmState);
1998 break;
1999 }
2000 return;
2001}
2002
2003
2004/** -----------------------------------------------------------------
2005 \brief limHandleMissedBeaconInd() - handles missed beacon indication
2006
2007 This function process the SIR_HAL_MISSED_BEACON_IND message from HAL,
2008 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
2009 to SME with reason code 'eSME_MISSED_BEACON_IND_RCVD'.
2010
2011 \param pMac - global mac structure
2012 \return - none
2013 \sa
2014 ----------------------------------------------------------------- */
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002015void limHandleMissedBeaconInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
Jeff Johnson295189b2012-06-20 16:38:30 -07002016{
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002017#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2018 tpSirSmeMissedBeaconInd pSirMissedBeaconInd =
2019 (tpSirSmeMissedBeaconInd)pMsg->bodyptr;
2020 tpPESession psessionEntry = peFindSessionByBssIdx(pMac,pSirMissedBeaconInd->bssIdx);
2021 if (psessionEntry == NULL)
2022 {
2023 limLog(pMac, LOGE,
2024 FL("session does not exist for given BSSIdx:%d"),
2025 pSirMissedBeaconInd->bssIdx);
2026 return;
2027 }
2028#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002029 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
2030 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
2031 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
2032 {
2033 pMac->pmm.inMissedBeaconScenario = TRUE;
Madan Mohan Koyyalamudi1a30a552013-09-17 21:20:07 +05302034 PELOGE(limLog(pMac, LOGE,
2035 FL("Sending EXIT_BMPS_IND to SME due to Missed beacon from FW"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002036 limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
2037 }
Yathish9f22e662012-12-10 14:21:35 -08002038/* ACTIVE_MODE_HB_OFFLOAD */
2039#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2040 else if(((pMac->pmm.gPmmState == ePMM_STATE_READY) ||
2041 (pMac->pmm.gPmmState == ePMM_STATE_BMPS_WAKEUP)) &&
2042 (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
2043 {
2044 pMac->pmm.inMissedBeaconScenario = TRUE;
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002045 PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure"));)
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002046 limMissedBeaconInActiveMode(pMac, psessionEntry);
Yathish9f22e662012-12-10 14:21:35 -08002047 }
2048#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002049 else
2050 {
2051 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002052 FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002053 pMac->pmm.gPmmState);
2054 }
2055 return;
2056}
2057
2058/** -----------------------------------------------------------------
2059 \brief limMicFailureInd() - handles mic failure indication
2060
2061 This function process the SIR_HAL_MIC_FAILURE_IND message from HAL,
2062
2063 \param pMac - global mac structure
2064 \return - none
2065 \sa
2066 ----------------------------------------------------------------- */
2067void limMicFailureInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
2068{
2069 tpSirSmeMicFailureInd pSirSmeMicFailureInd;
2070 tpSirSmeMicFailureInd pSirMicFailureInd = (tpSirSmeMicFailureInd)pMsg->bodyptr;
2071 tSirMsgQ mmhMsg;
2072 tpPESession psessionEntry ;
2073 tANI_U8 sessionId;
2074
2075 if((psessionEntry = peFindSessionByBssid(pMac,pSirMicFailureInd->bssId,&sessionId))== NULL)
2076 {
2077 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002078 FL("session does not exist for given BSSId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002079 return;
2080 }
2081
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302082 pSirSmeMicFailureInd = vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
2083 if (NULL == pSirSmeMicFailureInd)
Jeff Johnson295189b2012-06-20 16:38:30 -07002084 {
2085 // Log error
2086 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002087 FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 return;
2089 }
2090
2091 pSirSmeMicFailureInd->messageType = eWNI_SME_MIC_FAILURE_IND;
2092 pSirSmeMicFailureInd->length = sizeof(pSirSmeMicFailureInd);
2093 pSirSmeMicFailureInd->sessionId = psessionEntry->smeSessionId;
2094
2095 vos_mem_copy(pSirSmeMicFailureInd->bssId,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302096 pSirMicFailureInd->bssId,
2097 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002098
2099 vos_mem_copy(pSirSmeMicFailureInd->info.srcMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302100 pSirMicFailureInd->info.srcMacAddr,
2101 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002102
2103 vos_mem_copy(pSirSmeMicFailureInd->info.taMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302104 pSirMicFailureInd->info.taMacAddr,
2105 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002106
2107 vos_mem_copy(pSirSmeMicFailureInd->info.dstMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302108 pSirMicFailureInd->info.dstMacAddr,
2109 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002110
2111 vos_mem_copy(pSirSmeMicFailureInd->info.rxMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302112 pSirMicFailureInd->info.rxMacAddr,
2113 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002114
2115 pSirSmeMicFailureInd->info.multicast =
2116 pSirMicFailureInd->info.multicast;
2117
2118 pSirSmeMicFailureInd->info.keyId=
2119 pSirMicFailureInd->info.keyId;
2120
2121 pSirSmeMicFailureInd->info.IV1=
2122 pSirMicFailureInd->info.IV1;
2123
2124 vos_mem_copy(pSirSmeMicFailureInd->info.TSC,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302125 pSirMicFailureInd->info.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002126
2127 mmhMsg.type = eWNI_SME_MIC_FAILURE_IND;
2128 mmhMsg.bodyptr = pSirSmeMicFailureInd;
2129 mmhMsg.bodyval = 0;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002130 MTRACE(macTraceMsgTx(pMac, sessionId, mmhMsg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07002131 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
2132 return;
2133}
2134
2135
2136/** -----------------------------------------------------------------
2137 \brief limIsPktCandidateForDrop() - decides whether to drop the frame or not
2138
2139 This function is called before enqueuing the frame to PE queue for further processing.
2140 This prevents unnecessary frames getting into PE Queue and drops them right away.
2141 Frames will be droped in the following scenarios:
2142
2143 - In Scan State, drop the frames which are not marked as scan frames
2144 - In non-Scan state, drop the frames which are marked as scan frames.
2145 - Drop INFRA Beacons and Probe Responses in IBSS Mode
2146 - Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2147
2148 \param pMac - global mac structure
2149 \return - none
2150 \sa
2151 ----------------------------------------------------------------- */
2152
2153tMgmtFrmDropReason limIsPktCandidateForDrop(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U32 subType)
2154{
2155 tANI_U32 framelen;
2156 tANI_U8 *pBody;
2157 tSirMacCapabilityInfo capabilityInfo;
2158
2159 /*
2160 *
2161 * In scan mode, drop only Beacon/Probe Response which are NOT marked as scan-frames.
2162 * In non-scan mode, drop only Beacon/Probe Response which are marked as scan frames.
2163 * Allow other mgmt frames, they must be from our own AP, as we don't allow
2164 * other than beacons or probe responses in scan state.
2165 */
2166 if( (subType == SIR_MAC_MGMT_BEACON) ||
2167 (subType == SIR_MAC_MGMT_PROBE_RSP))
2168 {
2169 if(pMac->pmm.inMissedBeaconScenario)
2170 {
Leela Venkata Kiran Kumar Reddy Chiralaf3fe6302013-03-18 12:32:14 -07002171 MTRACE(macTrace(pMac, TRACE_CODE_INFO_LOG, 0, eLOG_NODROP_MISSED_BEACON_SCENARIO));
2172 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002173 }
2174 if (limIsSystemInScanState(pMac))
2175 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07002176 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002177 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -07002178#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
2179 else if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) || WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo))
2180 {
2181 return eMGMT_DROP_NO_DROP;
2182 }
2183#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 else if (WDA_IS_RX_IN_SCAN(pRxPacketInfo))
2185 {
2186 return eMGMT_DROP_SCAN_MODE_FRAME;
2187 }
2188 }
2189
2190 framelen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
2191 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
2192
2193 /* Note sure if this is sufficient, basically this condition allows all probe responses and
2194 * beacons from an infrastructure network
2195 */
2196 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2197 if(!capabilityInfo.ibss)
2198 return eMGMT_DROP_NO_DROP;
2199#if 0
2200 //Allow the mgmt frames to be queued if STA not in IBSS mode.
2201 if (pMac->lim.gLimSystemRole != eLIM_STA_IN_IBSS_ROLE)
2202 return eMGMT_DROP_NO_DROP;
2203#endif
2204
2205 //Drop INFRA Beacons and Probe Responses in IBSS Mode
2206 if( (subType == SIR_MAC_MGMT_BEACON) ||
2207 (subType == SIR_MAC_MGMT_PROBE_RSP))
2208 {
2209 //drop the frame if length is less than 12
2210 if(framelen < LIM_MIN_BCN_PR_LENGTH)
2211 return eMGMT_DROP_INVALID_SIZE;
2212
2213 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2214
2215 //This can be enhanced to even check the SSID before deciding to enque the frame.
2216 if(capabilityInfo.ess)
2217 return eMGMT_DROP_INFRA_BCN_IN_IBSS;
2218 }
2219 else if( (subType == SIR_MAC_MGMT_PROBE_REQ) &&
2220 (!WDA_GET_RX_BEACON_SENT(pRxPacketInfo)))
2221 {
2222 //Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2223 //In IBSS, the node which sends out the beacon, is supposed to respond to ProbeReq
2224 return eMGMT_DROP_NOT_LAST_IBSS_BCN;
2225 }
2226
2227 return eMGMT_DROP_NO_DROP;
2228}
2229
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002230eHalStatus pe_AcquireGlobalLock( tAniSirLim *psPe)
2231{
2232 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07002233
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002234 if(psPe)
2235 {
2236 if( VOS_IS_STATUS_SUCCESS( vos_lock_acquire( &psPe->lkPeGlobalLock) ) )
2237 {
2238 status = eHAL_STATUS_SUCCESS;
2239 }
2240 }
2241 return (status);
2242}
2243eHalStatus pe_ReleaseGlobalLock( tAniSirLim *psPe)
2244{
2245 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
2246 if(psPe)
2247 {
2248 if( VOS_IS_STATUS_SUCCESS( vos_lock_release( &psPe->lkPeGlobalLock) ) )
2249 {
2250 status = eHAL_STATUS_SUCCESS;
2251 }
2252 }
2253 return (status);
2254}