blob: c5e32d7447d8fafe5435d489cf0bb8f4f4e9607f [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Sandeep Puligilla60342762014-01-30 21:05:37 +05302 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
Kiran Kumar Lokere6e455332013-06-21 19:31:12 -07003 *
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*/
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080021/*
Sandeep Puligilla60342762014-01-30 21:05:37 +053022 * Copyright (c) 2011-2014 Qualcomm Atheros, Inc.
Kiran Kumar Lokere6e455332013-06-21 19:31:12 -070023 * All Rights Reserved.
24 * Qualcomm Atheros Confidential and Proprietary.
Jeff Johnson295189b2012-06-20 16:38:30 -070025 *
26 * Airgo Networks, Inc proprietary. All rights reserved.
27 * limSendMessages.c: Provides functions to send messages or Indications to HAL.
28 * Author: Sunit Bhatia
29 * Date: 09/21/2006
30 * History:-
31 * Date Modified by Modification Information
32 *
33 * --------------------------------------------------------------------------
34 *
35 */
Jeff Johnson295189b2012-06-20 16:38:30 -070036#include "limSendMessages.h"
37#include "cfgApi.h"
38#include "limTrace.h"
39#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
40#include "vos_diag_core_log.h"
41#endif //FEATURE_WLAN_DIAG_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -070042/* When beacon filtering is enabled, firmware will
43 * analyze the selected beacons received during BMPS,
44 * and monitor any changes in the IEs as listed below.
45 * The format of the table is:
46 * - EID
47 * - Check for IE presence
48 * - Byte offset
49 * - Byte value
50 * - Bit Mask
51 * - Byte refrence
52 */
53static tBeaconFilterIe beaconFilterTable[] = {
54 {SIR_MAC_DS_PARAM_SET_EID, 0, {0, 0, DS_PARAM_CHANNEL_MASK, 0}},
55 {SIR_MAC_ERP_INFO_EID, 0, {0, 0, ERP_FILTER_MASK, 0}},
56 {SIR_MAC_EDCA_PARAM_SET_EID, 0, {0, 0, EDCA_FILTER_MASK, 0}},
57 {SIR_MAC_QOS_CAPABILITY_EID, 0, {0, 0, QOS_FILTER_MASK, 0}},
58 {SIR_MAC_CHNL_SWITCH_ANN_EID, 1, {0, 0, 0, 0}},
Sandeep Puligilla60342762014-01-30 21:05:37 +053059 {SIR_MAC_HT_INFO_EID, 0, {0, 0, HT_BYTE0_FILTER_MASK, 0}}, //primary channel
60 {SIR_MAC_HT_INFO_EID, 0, {1, 0, HT_BYTE1_FILTER_MASK, 0}}, //Secondary Channel
61 {SIR_MAC_HT_INFO_EID, 0, {2, 0, HT_BYTE2_FILTER_MASK, 0}}, //HT protection
Jeff Johnson295189b2012-06-20 16:38:30 -070062 {SIR_MAC_HT_INFO_EID, 0, {5, 0, HT_BYTE5_FILTER_MASK, 0}}
63#if defined WLAN_FEATURE_VOWIFI
64 ,{SIR_MAC_PWR_CONSTRAINT_EID, 0, {0, 0, 0, 0}}
65#endif
Mohit Khanna4a70d262012-09-11 16:30:12 -070066#ifdef WLAN_FEATURE_11AC
67 ,{SIR_MAC_VHT_OPMODE_EID, 0, {0, 0, 0, 0}}
Kiran Kumar Lokere6e455332013-06-21 19:31:12 -070068 ,{SIR_MAC_VHT_OPERATION_EID, 0, {0, 0, VHTOP_CHWIDTH_MASK, 0}}
Mohit Khanna4a70d262012-09-11 16:30:12 -070069#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070070};
71
Jeff Johnson295189b2012-06-20 16:38:30 -070072/**
73 * limSendCFParams()
74 *
75 *FUNCTION:
76 * This function is called to send CFP Parameters to WDA, when they are changed.
77 *
78 *LOGIC:
79 *
80 *ASSUMPTIONS:
81 * NA
82 *
83 *NOTE:
84 * NA
85 *
86 * @param pMac pointer to Global Mac structure.
87 * @param bssIdx Bss Index of the BSS to which STA is associated.
88 * @param cfpCount CFP Count, if that is changed.
89 * @param cfpPeriod CFP Period if that is changed.
90 *
91 * @return success if message send is ok, else false.
92 */
Jeff Johnson295189b2012-06-20 16:38:30 -070093tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod)
94{
95 tpUpdateCFParams pCFParams = NULL;
96 tSirRetStatus retCode = eSIR_SUCCESS;
97 tSirMsgQ msgQ;
98
Bansidhar Gopalachari12731232013-07-11 10:56:36 +053099 pCFParams = vos_mem_malloc(sizeof( tUpdateCFParams ));
100 if ( NULL == pCFParams )
Jeff Johnson295189b2012-06-20 16:38:30 -0700101 {
102 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530103 FL( "Unable to allocate memory during Update CF Params" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700104 retCode = eSIR_MEM_ALLOC_FAILED;
105 goto returnFailure;
106 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530107 vos_mem_set( (tANI_U8 *) pCFParams, sizeof(tUpdateCFParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700108 pCFParams->cfpCount = cfpCount;
109 pCFParams->cfpPeriod = cfpPeriod;
110 pCFParams->bssIdx = bssIdx;
111
Jeff Johnson295189b2012-06-20 16:38:30 -0700112 msgQ.type = WDA_UPDATE_CF_IND;
113 msgQ.reserved = 0;
114 msgQ.bodyptr = pCFParams;
115 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700116 limLog( pMac, LOG3,
117 FL( "Sending WDA_UPDATE_CF_IND..." ));
Jeff Johnsone7245742012-09-05 17:12:55 -0700118 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700119 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
120 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530121 vos_mem_free(pCFParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700122 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700123 FL("Posting WDA_UPDATE_CF_IND to WDA failed, reason=%X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700124 retCode );
125 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700126returnFailure:
127 return retCode;
128}
129
Jeff Johnson295189b2012-06-20 16:38:30 -0700130/**
131 * limSendBeaconParams()
132 *
133 *FUNCTION:
134 * This function is called to send beacnon interval, short preamble or other
135 * parameters to WDA, which are changed and indication is received in beacon.
136 *
137 *LOGIC:
138 *
139 *ASSUMPTIONS:
140 * NA
141 *
142 *NOTE:
143 * NA
144 *
145 * @param pMac pointer to Global Mac structure.
146 * @param tpUpdateBeaconParams pointer to the structure,
147 which contains the beacon parameters which are changed.
148 *
149 * @return success if message send is ok, else false.
150 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700151tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac,
152 tpUpdateBeaconParams pUpdatedBcnParams,
153 tpPESession psessionEntry )
154{
155 tpUpdateBeaconParams pBcnParams = NULL;
156 tSirRetStatus retCode = eSIR_SUCCESS;
157 tSirMsgQ msgQ;
158
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530159 pBcnParams = vos_mem_malloc(sizeof(*pBcnParams));
160 if ( NULL == pBcnParams )
Jeff Johnson295189b2012-06-20 16:38:30 -0700161 {
162 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530163 FL( "Unable to allocate memory during Update Beacon Params" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700164 return eSIR_MEM_ALLOC_FAILED;
165 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530166 vos_mem_copy((tANI_U8 *) pBcnParams, pUpdatedBcnParams, sizeof(*pBcnParams));
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 msgQ.type = WDA_UPDATE_BEACON_IND;
168 msgQ.reserved = 0;
169 msgQ.bodyptr = pBcnParams;
170 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 PELOG3(limLog( pMac, LOG3,
172 FL( "Sending WDA_UPDATE_BEACON_IND, paramChangeBitmap in hex = %x" ),
173 pUpdatedBcnParams->paramChangeBitmap);)
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800174 if(NULL == psessionEntry)
175 {
176 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
177 }
178 else
179 {
180 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
181 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700182 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
183 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530184 vos_mem_free(pBcnParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700185 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700186 FL("Posting WDA_UPDATE_BEACON_IND to WDA failed, reason=%X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700187 retCode );
188 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700189 limSendBeaconInd(pMac, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700190 return retCode;
191}
192
Jeff Johnson295189b2012-06-20 16:38:30 -0700193/**
194 * limSendSwitchChnlParams()
195 *
196 *FUNCTION:
197 * This function is called to send Channel Switch Indication to WDA
198 *
199 *LOGIC:
200 *
201 *ASSUMPTIONS:
202 * NA
203 *
204 *NOTE:
205 * NA
206 *
207 * @param pMac pointer to Global Mac structure.
208 * @param chnlNumber New Channel Number to be switched to.
209 * @param secondaryChnlOffset an enum for secondary channel offset.
210 * @param localPowerConstraint 11h local power constraint value
211 *
212 * @return success if message send is ok, else false.
213 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700214#if !defined WLAN_FEATURE_VOWIFI
215tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac,
216 tANI_U8 chnlNumber,
Jeff Johnsone7245742012-09-05 17:12:55 -0700217 ePhyChanBondState secondaryChnlOffset,
Jeff Johnson295189b2012-06-20 16:38:30 -0700218 tANI_U8 localPwrConstraint, tANI_U8 peSessionId)
219#else
220tSirRetStatus limSendSwitchChnlParams(tpAniSirGlobal pMac,
221 tANI_U8 chnlNumber,
Jeff Johnsone7245742012-09-05 17:12:55 -0700222 ePhyChanBondState secondaryChnlOffset,
Jeff Johnson295189b2012-06-20 16:38:30 -0700223 tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -0700224#endif
225{
226 tpSwitchChannelParams pChnlParams = NULL;
227 tSirRetStatus retCode = eSIR_SUCCESS;
228 tSirMsgQ msgQ;
229 tpPESession pSessionEntry;
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530230 if((pSessionEntry = peFindSessionBySessionId(pMac, peSessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 {
232 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700233 FL( "Unable to get Session for session Id %d" ), peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700234 return eSIR_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700235 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530236 pChnlParams = vos_mem_malloc(sizeof( tSwitchChannelParams ));
237 if ( NULL == pChnlParams )
238 {
239 limLog( pMac, LOGP,
240 FL( "Unable to allocate memory during Switch Channel Params" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700241 retCode = eSIR_MEM_ALLOC_FAILED;
242 goto returnFailure;
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530243 }
244 vos_mem_set((tANI_U8 *) pChnlParams, sizeof(tSwitchChannelParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700245 pChnlParams->secondaryChannelOffset = secondaryChnlOffset;
246 pChnlParams->channelNumber= chnlNumber;
247#if defined WLAN_FEATURE_VOWIFI
248 pChnlParams->maxTxPower = maxTxPower;
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530249 vos_mem_copy( pChnlParams->selfStaMacAddr, pSessionEntry->selfMacAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -0700250#else
251 pChnlParams->localPowerConstraint = localPwrConstraint;
252#endif
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530253 vos_mem_copy( pChnlParams->bssId, pSessionEntry->bssId, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -0700254 pChnlParams->peSessionId = peSessionId;
255
256 //we need to defer the message until we get the response back from WDA.
257 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnson295189b2012-06-20 16:38:30 -0700258 msgQ.type = WDA_CHNL_SWITCH_REQ;
259 msgQ.reserved = 0;
260 msgQ.bodyptr = pChnlParams;
261 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -0700262#if defined WLAN_FEATURE_VOWIFI
Jeff Johnson295189b2012-06-20 16:38:30 -0700263 PELOG3(limLog( pMac, LOG3,
264 FL( "Sending WDA_CHNL_SWITCH_REQ with SecondaryChnOffset - %d, ChannelNumber - %d, maxTxPower - %d"),
265 pChnlParams->secondaryChannelOffset, pChnlParams->channelNumber, pChnlParams->maxTxPower);)
266#else
267 PELOG3(limLog( pMac, LOG3,
268 FL( "Sending WDA_CHNL_SWITCH_REQ with SecondaryChnOffset - %d, ChannelNumber - %d, LocalPowerConstraint - %d"),
269 pChnlParams->secondaryChannelOffset, pChnlParams->channelNumber, pChnlParams->localPowerConstraint);)
270#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700271 MTRACE(macTraceMsgTx(pMac, peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700272 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
273 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530274 vos_mem_free(pChnlParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700275 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700276 FL("Posting WDA_CHNL_SWITCH_REQ to WDA failed, reason=%X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700277 retCode );
278 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700279returnFailure:
280 return retCode;
281}
282
Jeff Johnson295189b2012-06-20 16:38:30 -0700283/**
284 * limSendEdcaParams()
285 *
286 *FUNCTION:
287 * This function is called to send dynamically changing EDCA Parameters to WDA.
288 *
289 *LOGIC:
290 *
291 *ASSUMPTIONS:
292 * NA
293 *
294 *NOTE:
295 * NA
296 *
297 * @param pMac pointer to Global Mac structure.
298 * @param tpUpdatedEdcaParams pointer to the structure which contains
299 * dynamically changing EDCA parameters.
300 * @param highPerformance If the peer is Airgo (taurus) then switch to highPerformance is true.
301 *
302 * @return success if message send is ok, else false.
303 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700304tSirRetStatus limSendEdcaParams(tpAniSirGlobal pMac, tSirMacEdcaParamRecord *pUpdatedEdcaParams, tANI_U16 bssIdx, tANI_BOOLEAN highPerformance)
305{
306 tEdcaParams *pEdcaParams = NULL;
307 tSirRetStatus retCode = eSIR_SUCCESS;
308 tSirMsgQ msgQ;
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530309
310 pEdcaParams = vos_mem_malloc(sizeof(tEdcaParams));
311 if ( NULL == pEdcaParams )
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 {
313 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530314 FL( "Unable to allocate memory during Update EDCA Params" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700315 retCode = eSIR_MEM_ALLOC_FAILED;
316 return retCode;
317 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700318 pEdcaParams->bssIdx = bssIdx;
319 pEdcaParams->acbe = pUpdatedEdcaParams[EDCA_AC_BE];
320 pEdcaParams->acbk = pUpdatedEdcaParams[EDCA_AC_BK];
321 pEdcaParams->acvi = pUpdatedEdcaParams[EDCA_AC_VI];
322 pEdcaParams->acvo = pUpdatedEdcaParams[EDCA_AC_VO];
323 pEdcaParams->highPerformance = highPerformance;
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 msgQ.type = WDA_UPDATE_EDCA_PROFILE_IND;
325 msgQ.reserved = 0;
326 msgQ.bodyptr = pEdcaParams;
327 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700328 {
329 tANI_U8 i;
330 PELOG1(limLog( pMac, LOG1,FL("Sending WDA_UPDATE_EDCA_PROFILE_IND with EDCA Parameters:" ));)
331 for(i=0; i<MAX_NUM_AC; i++)
332 {
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700333 PELOG1(limLog(pMac, LOG1, FL("AC[%d]: AIFSN %d, ACM %d, CWmin %d, CWmax %d, TxOp %d "),
Jeff Johnson295189b2012-06-20 16:38:30 -0700334 i, pUpdatedEdcaParams[i].aci.aifsn, pUpdatedEdcaParams[i].aci.acm,
335 pUpdatedEdcaParams[i].cw.min, pUpdatedEdcaParams[i].cw.max, pUpdatedEdcaParams[i].txoplimit);)
336 }
337 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700338 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700339 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
340 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530341 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700342 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700343 FL("Posting WDA_UPDATE_EDCA_PROFILE_IND to WDA failed, reason=%X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700344 retCode );
345 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700346 return retCode;
347}
348
Jeff Johnson295189b2012-06-20 16:38:30 -0700349/**
350 * limSetActiveEdcaParams()
351 *
352 * FUNCTION:
353 * This function is called to set the most up-to-date EDCA parameters
354 * given the default local EDCA parameters. The rules are as following:
355 * - If ACM bit is set for all ACs, then downgrade everything to Best Effort.
356 * - If ACM is not set for any AC, then PE will use the default EDCA
357 * parameters as advertised by AP.
358 * - If ACM is set in any of the ACs, PE will use the EDCA parameters
359 * from the next best AC for which ACM is not enabled.
360 *
361 * @param pMac pointer to Global Mac structure.
362 * @param plocalEdcaParams pointer to the local EDCA parameters
363 * @ param psessionEntry point to the session entry
364 * @return none
365 */
366 void limSetActiveEdcaParams(tpAniSirGlobal pMac, tSirMacEdcaParamRecord *plocalEdcaParams, tpPESession psessionEntry)
367{
368 tANI_U8 ac, newAc, i;
369 tANI_U8 acAdmitted;
370#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
371 vos_log_qos_edca_pkt_type *log_ptr = NULL;
372#endif //FEATURE_WLAN_DIAG_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -0700373 // Initialize gLimEdcaParamsActive[] to be same as localEdcaParams
374 psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE] = plocalEdcaParams[EDCA_AC_BE];
375 psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK] = plocalEdcaParams[EDCA_AC_BK];
376 psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI] = plocalEdcaParams[EDCA_AC_VI];
377 psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO] = plocalEdcaParams[EDCA_AC_VO];
Jeff Johnson295189b2012-06-20 16:38:30 -0700378 /* An AC requires downgrade if the ACM bit is set, and the AC has not
379 * yet been admitted in uplink or bi-directions.
380 * If an AC requires downgrade, it will downgrade to the next beset AC
381 * for which ACM is not enabled.
382 *
383 * - There's no need to downgrade AC_BE since it IS the lowest AC. Hence
384 * start the for loop with AC_BK.
385 * - If ACM bit is set for an AC, initially downgrade it to AC_BE. Then
386 * traverse thru the AC list. If we do find the next best AC which is
387 * better than AC_BE, then use that one. For example, if ACM bits are set
388 * such that: BE_ACM=1, BK_ACM=1, VI_ACM=1, VO_ACM=0
389 * then all AC will be downgraded to AC_BE.
390 */
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700391 limLog(pMac, LOG1, FL("adAdmitMask[UPLINK] = 0x%x "), pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] );
392 limLog(pMac, LOG1, FL("adAdmitMask[DOWNLINK] = 0x%x "), pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] );
Jeff Johnson295189b2012-06-20 16:38:30 -0700393 for (ac = EDCA_AC_BK; ac <= EDCA_AC_VO; ac++)
394 {
395 acAdmitted = ( (pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] & (1 << ac)) >> ac );
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700396 limLog(pMac, LOG1, FL("For AC[%d]: acm=%d, acAdmit=%d "), ac, plocalEdcaParams[ac].aci.acm, acAdmitted);
Jeff Johnson295189b2012-06-20 16:38:30 -0700397 if ( (plocalEdcaParams[ac].aci.acm == 1) && (acAdmitted == 0) )
398 {
399 limLog(pMac, LOG1, FL("We need to downgrade AC %d!! "), ac);
400 newAc = EDCA_AC_BE;
401 for (i=ac-1; i>0; i--)
402 {
403 if (plocalEdcaParams[i].aci.acm == 0)
404 {
405 newAc = i;
406 break;
407 }
408 }
409 limLog(pMac, LOGW, FL("Downgrading AC %d ---> AC %d "), ac, newAc);
410 psessionEntry->gLimEdcaParamsActive[ac] = plocalEdcaParams[newAc];
411 }
412 }
413//log: LOG_WLAN_QOS_EDCA_C
414#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
415 WLAN_VOS_DIAG_LOG_ALLOC(log_ptr, vos_log_qos_edca_pkt_type, LOG_WLAN_QOS_EDCA_C);
416 if(log_ptr)
417 {
418 log_ptr->aci_be = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE].aci.aci;
419 log_ptr->cw_be = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE].cw.max << 4 |
420 psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE].cw.min;
421 log_ptr->txoplimit_be = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BE].txoplimit;
422 log_ptr->aci_bk = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK].aci.aci;
423 log_ptr->cw_bk = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK].cw.max << 4 |
424 psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK].cw.min;
425 log_ptr->txoplimit_bk = psessionEntry->gLimEdcaParamsActive[EDCA_AC_BK].txoplimit;
426 log_ptr->aci_vi = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI].aci.aci;
427 log_ptr->cw_vi = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI].cw.max << 4 |
428 psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI].cw.min;
429 log_ptr->txoplimit_vi = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VI].txoplimit;
430 log_ptr->aci_vo = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO].aci.aci;
431 log_ptr->cw_vo = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO].cw.max << 4 |
432 psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO].cw.min;
433 log_ptr->txoplimit_vo = psessionEntry->gLimEdcaParamsActive[EDCA_AC_VO].txoplimit;
434 }
435 WLAN_VOS_DIAG_LOG_REPORT(log_ptr);
436#endif //FEATURE_WLAN_DIAG_SUPPORT
437
438 return;
439 }
440
Jeff Johnson295189b2012-06-20 16:38:30 -0700441/** ---------------------------------------------------------
442\fn limSetLinkState
443\brief LIM sends a message to WDA to set the link state
444\param tpAniSirGlobal pMac
445\param tSirLinkState state
446\return None
447 -----------------------------------------------------------*/
448 //Original code with out anu's change
449#if 0
450tSirRetStatus limSetLinkState(tpAniSirGlobal pMac, tSirLinkState state,tSirMacAddr bssId)
451{
452 tSirMsgQ msg;
453 tSirRetStatus retCode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700454 msg.type = WDA_SET_LINK_STATE;
455 msg.bodyval = (tANI_U32) state;
456 msg.bodyptr = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700457 MTRACE(macTraceMsgTx(pMac, 0, msg.type));
458 retCode = wdaPostCtrlMsg(pMac, &msg);
459 if (retCode != eSIR_SUCCESS)
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700460 limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x "), retCode);
Jeff Johnson295189b2012-06-20 16:38:30 -0700461 return retCode;
462}
463#endif //0
Jeff Johnson295189b2012-06-20 16:38:30 -0700464tSirRetStatus limSetLinkState(tpAniSirGlobal pMac, tSirLinkState state,tSirMacAddr bssId,
465 tSirMacAddr selfMacAddr, tpSetLinkStateCallback callback,
466 void *callbackArg)
467{
468 tSirMsgQ msgQ;
469 tSirRetStatus retCode;
470 tpLinkStateParams pLinkStateParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 // Allocate memory.
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530472 pLinkStateParams = vos_mem_malloc(sizeof(tLinkStateParams));
473 if ( NULL == pLinkStateParams )
Jeff Johnson295189b2012-06-20 16:38:30 -0700474 {
475 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530476 FL( "Unable to allocate memory while sending Set Link State" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700477 retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
478 return retCode;
479 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530480 vos_mem_set((tANI_U8 *) pLinkStateParams, sizeof(tLinkStateParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700481 pLinkStateParams->state = state;
482 pLinkStateParams->callback = callback;
483 pLinkStateParams->callbackArg = callbackArg;
484
Jeff Johnson295189b2012-06-20 16:38:30 -0700485 /* Copy Mac address */
486 sirCopyMacAddr(pLinkStateParams->bssid,bssId);
487 sirCopyMacAddr(pLinkStateParams->selfMacAddr, selfMacAddr);
488
Jeff Johnson295189b2012-06-20 16:38:30 -0700489 msgQ.type = WDA_SET_LINK_STATE;
490 msgQ.reserved = 0;
491 msgQ.bodyptr = pLinkStateParams;
492 msgQ.bodyval = 0;
493
Jeff Johnsone7245742012-09-05 17:12:55 -0700494 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700495
496 retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
497 if (retCode != eSIR_SUCCESS)
498 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530499 vos_mem_free(pLinkStateParams);
Jeff Johnson0f4d0bc2013-11-03 17:48:50 -0800500 limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x "),
501 state, retCode);
Jeff Johnson295189b2012-06-20 16:38:30 -0700502 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700503 return retCode;
504}
Jeff Johnson295189b2012-06-20 16:38:30 -0700505#ifdef WLAN_FEATURE_VOWIFI_11R
506extern tSirRetStatus limSetLinkStateFT(tpAniSirGlobal pMac, tSirLinkState
507state,tSirMacAddr bssId, tSirMacAddr selfMacAddr, int ft, tpPESession psessionEntry)
508{
509 tSirMsgQ msgQ;
510 tSirRetStatus retCode;
511 tpLinkStateParams pLinkStateParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700512 // Allocate memory.
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530513 pLinkStateParams = vos_mem_malloc(sizeof(tLinkStateParams));
514 if ( NULL == pLinkStateParams )
Jeff Johnson295189b2012-06-20 16:38:30 -0700515 {
516 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530517 FL( "Unable to allocate memory while sending Set Link State" ));
Jeff Johnson295189b2012-06-20 16:38:30 -0700518 retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
519 return retCode;
520 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530521 vos_mem_set((tANI_U8 *) pLinkStateParams, sizeof(tLinkStateParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700522 pLinkStateParams->state = state;
Jeff Johnson295189b2012-06-20 16:38:30 -0700523 /* Copy Mac address */
524 sirCopyMacAddr(pLinkStateParams->bssid,bssId);
525 sirCopyMacAddr(pLinkStateParams->selfMacAddr, selfMacAddr);
526 pLinkStateParams->ft = 1;
527 pLinkStateParams->session = psessionEntry;
528
Jeff Johnson295189b2012-06-20 16:38:30 -0700529 msgQ.type = WDA_SET_LINK_STATE;
530 msgQ.reserved = 0;
531 msgQ.bodyptr = pLinkStateParams;
532 msgQ.bodyval = 0;
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800533 if(NULL == psessionEntry)
534 {
535 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
536 }
537 else
538 {
539 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
540 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700541
542 retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
543 if (retCode != eSIR_SUCCESS)
544 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530545 vos_mem_free(pLinkStateParams);
Jeff Johnson0f4d0bc2013-11-03 17:48:50 -0800546 limLog(pMac, LOGP, FL("Posting link state %d failed, reason = %x "),
547 state, retCode);
Jeff Johnson295189b2012-06-20 16:38:30 -0700548 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700549 return retCode;
550}
551#endif
552
Jeff Johnson295189b2012-06-20 16:38:30 -0700553/** ---------------------------------------------------------
554\fn limSendSetTxPowerReq
555\brief LIM sends a WDA_SET_TX_POWER_REQ message to WDA
556\param tpAniSirGlobal pMac
557\param tpSirSetTxPowerReq request message
558\return None
559 -----------------------------------------------------------*/
schang86c22c42013-03-13 18:41:24 -0700560tSirRetStatus limSendSetTxPowerReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -0700561{
schang86c22c42013-03-13 18:41:24 -0700562 tSirSetTxPowerReq *txPowerReq;
563 tSirRetStatus retCode = eSIR_SUCCESS;
564 tSirMsgQ msgQ;
565 tpPESession psessionEntry;
566 tANI_U8 sessionId = 0;
567
568 if (NULL == pMsgBuf)
569 return eSIR_FAILURE;
570
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530571 txPowerReq = vos_mem_malloc(sizeof(tSirSetTxPowerReq));
572 if ( NULL == txPowerReq )
schang86c22c42013-03-13 18:41:24 -0700573 {
574 return eSIR_FAILURE;
575 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530576 vos_mem_copy(txPowerReq, (tSirSetTxPowerReq *)pMsgBuf, sizeof(tSirSetTxPowerReq));
schang86c22c42013-03-13 18:41:24 -0700577
578 /* Found corresponding seesion to find BSS IDX */
579 psessionEntry = peFindSessionByBssid(pMac, txPowerReq->bssId, &sessionId);
580 if (NULL == psessionEntry)
581 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530582 vos_mem_free(txPowerReq);
schang86c22c42013-03-13 18:41:24 -0700583 limLog(pMac, LOGE, FL("Session does not exist for given BSSID"));
584 return eSIR_FAILURE;
585 }
586
587 /* FW API requests BSS IDX */
588 txPowerReq->bssIdx = psessionEntry->bssIdx;
589
Jeff Johnson295189b2012-06-20 16:38:30 -0700590 msgQ.type = WDA_SET_TX_POWER_REQ;
591 msgQ.reserved = 0;
schang86c22c42013-03-13 18:41:24 -0700592 msgQ.bodyptr = txPowerReq;
Jeff Johnson295189b2012-06-20 16:38:30 -0700593 msgQ.bodyval = 0;
schang86c22c42013-03-13 18:41:24 -0700594 PELOGW(limLog(pMac, LOGW, FL("Sending WDA_SET_TX_POWER_REQ to WDA"));)
Jeff Johnsone7245742012-09-05 17:12:55 -0700595 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
schang86c22c42013-03-13 18:41:24 -0700596 retCode = wdaPostCtrlMsg(pMac, &msgQ);
597 if (eSIR_SUCCESS != retCode)
Jeff Johnson295189b2012-06-20 16:38:30 -0700598 {
schang86c22c42013-03-13 18:41:24 -0700599 limLog(pMac, LOGP, FL("Posting WDA_SET_TX_POWER_REQ to WDA failed, reason=%X"), retCode);
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530600 vos_mem_free(txPowerReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700601 return retCode;
602 }
Sandeep Puligilla11d49a62014-01-30 12:05:16 +0530603 return retCode;
604}
605
606/** ---------------------------------------------------------
607\fn limSendHT40OBSSScanInd
608\brief LIM sends a WDA_HT40_OBSS_SCAN_IND message to WDA
609\param tpAniSirGlobal pMac
610\param psessionEntry session Entry
611\return None
612 -----------------------------------------------------------*/
613tSirRetStatus limSendHT40OBSSScanInd(tpAniSirGlobal pMac,
614 tpPESession psessionEntry)
615{
616 tSirRetStatus retCode = eSIR_SUCCESS;
617 tSirHT40OBSSScanInd *ht40OBSSScanInd;
618 tANI_U32 validChannelNum;
619 tSirMsgQ msgQ;
620 tANI_U8 validChanList[SIR_ROAM_MAX_CHANNELS];
621 tANI_U8 channel24GNum, count;
622
623 ht40OBSSScanInd = vos_mem_malloc(sizeof(tSirHT40OBSSScanInd));
624 if ( NULL == ht40OBSSScanInd)
625 {
626 return eSIR_FAILURE;
627 }
628
629 VOS_TRACE(VOS_MODULE_ID_PE,VOS_TRACE_LEVEL_INFO,
630 "OBSS Scan Indication bssIdx- %d staId %d",
631 psessionEntry->bssIdx, psessionEntry->staId);
632
633 ht40OBSSScanInd->cmdType = HT40_OBSS_SCAN_PARAM_START;
634 ht40OBSSScanInd->scanType = eSIR_ACTIVE_SCAN;
635 ht40OBSSScanInd->OBSSScanPassiveDwellTime =
636 psessionEntry->obssHT40ScanParam.OBSSScanPassiveDwellTime;
637 ht40OBSSScanInd->OBSSScanActiveDwellTime =
638 psessionEntry->obssHT40ScanParam.OBSSScanActiveDwellTime;
639 ht40OBSSScanInd->BSSChannelWidthTriggerScanInterval =
640 psessionEntry->obssHT40ScanParam.BSSChannelWidthTriggerScanInterval;
641 ht40OBSSScanInd->OBSSScanPassiveTotalPerChannel =
642 psessionEntry->obssHT40ScanParam.OBSSScanPassiveTotalPerChannel;
643 ht40OBSSScanInd->OBSSScanActiveTotalPerChannel =
644 psessionEntry->obssHT40ScanParam.OBSSScanActiveTotalPerChannel;
645 ht40OBSSScanInd->BSSWidthChannelTransitionDelayFactor =
646 psessionEntry->obssHT40ScanParam.BSSWidthChannelTransitionDelayFactor;
647 ht40OBSSScanInd->OBSSScanActivityThreshold =
648 psessionEntry->obssHT40ScanParam.OBSSScanActivityThreshold;
649 /* TODO update it from the associated BSS*/
650 ht40OBSSScanInd->currentOperatingClass = 1;
651
652 validChannelNum = WNI_CFG_VALID_CHANNEL_LIST_LEN;
653 if (wlan_cfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
654 validChanList,
655 &validChannelNum) != eSIR_SUCCESS)
656 {
657 limLog(pMac, LOGE,
658 FL("could not retrieve Valid channel list"));
659 }
660 /* Extract 24G channel list */
661 channel24GNum = 0;
662 for( count =0 ;count < validChannelNum ;count++)
663 {
664 if ((validChanList[count]> RF_CHAN_1) &&
665 (validChanList[count] < RF_CHAN_14))
666 {
667 ht40OBSSScanInd->channels[channel24GNum] = validChanList[count];
668 channel24GNum++;
669 }
670 }
671 ht40OBSSScanInd->channelCount = channel24GNum;
672 /* FW API requests BSS IDX */
673 ht40OBSSScanInd->selfStaIdx = psessionEntry->staId;
674 ht40OBSSScanInd->bssIdx = psessionEntry->bssIdx;
675 ht40OBSSScanInd->fortyMHZIntolerent = 0;
676 ht40OBSSScanInd->ieFieldLen = 0;
677
678 msgQ.type = WDA_HT40_OBSS_SCAN_IND;
679 msgQ.reserved = 0;
680 msgQ.bodyptr = (void *)ht40OBSSScanInd;
681 msgQ.bodyval = 0;
682 PELOGW(limLog(pMac, LOGW, FL("Sending WDA_HT40_OBSS_SCAN_IND to WDA"));)
683 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
684 retCode = wdaPostCtrlMsg(pMac, &msgQ);
685 if (eSIR_SUCCESS != retCode)
686 {
687 limLog(pMac, LOGP, FL("Posting WDA_HT40_OBSS_SCAN_IND "
688 "to WDA failed, reason=%X"), retCode);
689 vos_mem_free(ht40OBSSScanInd);
690 return retCode;
691 }
692 return retCode;
693}
694/** ---------------------------------------------------------
695\fn limSendHT40OBSSScanInd
696\brief LIM sends a WDA_HT40_OBSS_SCAN_IND message to WDA
697\ Stop command support is only for debugging
698\ As per 802.11 spec OBSS scan is mandatory while
699\ operating in HT40 on 2.4GHz band
700\param tpAniSirGlobal pMac
701\param psessionEntry Session entry
702\return None
703 -----------------------------------------------------------*/
704tSirRetStatus limSendHT40OBSSStopScanInd(tpAniSirGlobal pMac,
705 tpPESession psessionEntry)
706{
707 tSirRetStatus retCode = eSIR_SUCCESS;
708 tSirMsgQ msgQ;
709 tANI_U8 bssIdx;
710
711 bssIdx = psessionEntry->bssIdx;
712
713 VOS_TRACE (VOS_MODULE_ID_PE,VOS_TRACE_LEVEL_INFO,
714 " Sending STOP OBSS cmd, bssid %d staid %d \n",
715 psessionEntry->bssIdx, psessionEntry->staId);
716
717 msgQ.type = WDA_HT40_OBSS_STOP_SCAN_IND;
718 msgQ.reserved = 0;
719 msgQ.bodyptr = (void *)&bssIdx;
720 msgQ.bodyval = 0;
721 PELOGW(limLog(pMac, LOGW,
722 FL("Sending WDA_HT40_OBSS_STOP_SCAN_IND to WDA"));)
723 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
724 retCode = wdaPostCtrlMsg(pMac, &msgQ);
725 if (eSIR_SUCCESS != retCode)
726 {
727 limLog(pMac, LOGE, FL("Posting WDA_HT40_OBSS_SCAN_IND "
728 "to WDA failed, reason=%X"), retCode);
729 return retCode;
730 }
schang86c22c42013-03-13 18:41:24 -0700731
Jeff Johnson295189b2012-06-20 16:38:30 -0700732 return retCode;
733}
Jeff Johnson295189b2012-06-20 16:38:30 -0700734/** ---------------------------------------------------------
735\fn limSendGetTxPowerReq
736\brief LIM sends a WDA_GET_TX_POWER_REQ message to WDA
737\param tpAniSirGlobal pMac
738\param tpSirGetTxPowerReq request message
739\return None
740 -----------------------------------------------------------*/
741tSirRetStatus limSendGetTxPowerReq(tpAniSirGlobal pMac, tpSirGetTxPowerReq pTxPowerReq)
742{
743 tSirRetStatus retCode = eSIR_SUCCESS;
744 tSirMsgQ msgQ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700745 if (NULL == pTxPowerReq)
746 return retCode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700747 msgQ.type = WDA_GET_TX_POWER_REQ;
748 msgQ.reserved = 0;
749 msgQ.bodyptr = pTxPowerReq;
750 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700751 PELOGW(limLog(pMac, LOGW, FL( "Sending WDA_GET_TX_POWER_REQ to WDA"));)
Jeff Johnsone7245742012-09-05 17:12:55 -0700752 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700753 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
754 {
755 limLog( pMac, LOGP, FL("Posting WDA_GET_TX_POWER_REQ to WDA failed, reason=%X"), retCode );
756 if (NULL != pTxPowerReq)
757 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530758 vos_mem_free(pTxPowerReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700759 }
760 return retCode;
761 }
762 return retCode;
763}
Jeff Johnson295189b2012-06-20 16:38:30 -0700764/** ---------------------------------------------------------
765\fn limSendBeaconFilterInfo
766\brief LIM sends beacon filtering info to WDA
767\param tpAniSirGlobal pMac
768\return None
769 -----------------------------------------------------------*/
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -0700770tSirRetStatus limSendBeaconFilterInfo(tpAniSirGlobal pMac,tpPESession psessionEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -0700771{
772 tpBeaconFilterMsg pBeaconFilterMsg = NULL;
773 tSirRetStatus retCode = eSIR_SUCCESS;
774 tSirMsgQ msgQ;
775 tANI_U8 *ptr;
776 tANI_U32 i;
777 tANI_U32 msgSize;
778 tpBeaconFilterIe pIe;
Jeff Johnson295189b2012-06-20 16:38:30 -0700779
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -0700780 if( psessionEntry == NULL )
781 {
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700782 limLog( pMac, LOGE, FL("Fail to find the right session "));
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -0700783 retCode = eSIR_FAILURE;
784 return retCode;
785 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700786 msgSize = sizeof(tBeaconFilterMsg) + sizeof(beaconFilterTable);
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530787 pBeaconFilterMsg = vos_mem_malloc(msgSize);
788 if ( NULL == pBeaconFilterMsg )
Jeff Johnson295189b2012-06-20 16:38:30 -0700789 {
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700790 limLog( pMac, LOGP, FL("Fail to allocate memory for beaconFiilterMsg "));
Jeff Johnson295189b2012-06-20 16:38:30 -0700791 retCode = eSIR_MEM_ALLOC_FAILED;
792 return retCode;
793 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530794 vos_mem_set((tANI_U8 *) pBeaconFilterMsg, msgSize, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700795 // Fill in capability Info and mask
796 //TBD-RAJESH get the BSS capability from session.
797 //Don't send this message if no active Infra session is found.
798 pBeaconFilterMsg->capabilityInfo = psessionEntry->limCurrentBssCaps;
799 pBeaconFilterMsg->capabilityMask = CAPABILITY_FILTER_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -0700800 pBeaconFilterMsg->beaconInterval = (tANI_U16) psessionEntry->beaconParams.beaconInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -0700801 // Fill in number of IEs in beaconFilterTable
802 pBeaconFilterMsg->ieNum = (tANI_U16) (sizeof(beaconFilterTable) / sizeof(tBeaconFilterIe));
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -0700803 //Fill the BSSIDX
804 pBeaconFilterMsg->bssIdx = psessionEntry->bssIdx;
805
Jeff Johnson295189b2012-06-20 16:38:30 -0700806 //Fill message with info contained in the beaconFilterTable
807 ptr = (tANI_U8 *)pBeaconFilterMsg + sizeof(tBeaconFilterMsg);
808 for(i=0; i < (pBeaconFilterMsg->ieNum); i++)
809 {
810 pIe = (tpBeaconFilterIe) ptr;
811 pIe->elementId = beaconFilterTable[i].elementId;
812 pIe->checkIePresence = beaconFilterTable[i].checkIePresence;
813 pIe->byte.offset = beaconFilterTable[i].byte.offset;
814 pIe->byte.value = beaconFilterTable[i].byte.value;
815 pIe->byte.bitMask = beaconFilterTable[i].byte.bitMask;
816 pIe->byte.ref = beaconFilterTable[i].byte.ref;
817 ptr += sizeof(tBeaconFilterIe);
818 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700819 msgQ.type = WDA_BEACON_FILTER_IND;
820 msgQ.reserved = 0;
821 msgQ.bodyptr = pBeaconFilterMsg;
822 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700823 limLog( pMac, LOG3, FL( "Sending WDA_BEACON_FILTER_IND..." ));
Jeff Johnsone7245742012-09-05 17:12:55 -0700824 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
826 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530827 vos_mem_free(pBeaconFilterMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700829 FL("Posting WDA_BEACON_FILTER_IND to WDA failed, reason=%X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700830 retCode );
831 return retCode;
832 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700833 return retCode;
834}
Mohit Khanna4a70d262012-09-11 16:30:12 -0700835
Sandeep Puligilla60342762014-01-30 21:05:37 +0530836/**
837 * \brief Send CB mode update to WDA
838 *
839 * \param pMac Pointer to the global MAC structure
840 *
841 * \param psessionEntry session entry
842 * pTempParam CB mode
843 * \return eSIR_SUCCESS on success, eSIR_FAILURE else
844 */
Mohit Khanna4a70d262012-09-11 16:30:12 -0700845tSirRetStatus limSendModeUpdate(tpAniSirGlobal pMac,
846 tUpdateVHTOpMode *pTempParam,
847 tpPESession psessionEntry )
848{
849 tUpdateVHTOpMode *pVhtOpMode = NULL;
850 tSirRetStatus retCode = eSIR_SUCCESS;
851 tSirMsgQ msgQ;
852
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530853 pVhtOpMode = vos_mem_malloc(sizeof(tUpdateVHTOpMode));
854 if ( NULL == pVhtOpMode )
Mohit Khanna4a70d262012-09-11 16:30:12 -0700855 {
856 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530857 FL( "Unable to allocate memory during Update Op Mode" ));
Mohit Khanna4a70d262012-09-11 16:30:12 -0700858 return eSIR_MEM_ALLOC_FAILED;
859 }
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530860 vos_mem_copy((tANI_U8 *)pVhtOpMode, pTempParam, sizeof(tUpdateVHTOpMode));
Mohit Khanna4a70d262012-09-11 16:30:12 -0700861 msgQ.type = WDA_UPDATE_OP_MODE;
862 msgQ.reserved = 0;
863 msgQ.bodyptr = pVhtOpMode;
864 msgQ.bodyval = 0;
865 PELOG3(limLog( pMac, LOG3,
866 FL( "Sending WDA_UPDATE_OP_MODE" ));)
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800867 if(NULL == psessionEntry)
868 {
869 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
870 }
871 else
872 {
873 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
874 }
Mohit Khanna4a70d262012-09-11 16:30:12 -0700875 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
876 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530877 vos_mem_free(pVhtOpMode);
Mohit Khanna4a70d262012-09-11 16:30:12 -0700878 limLog( pMac, LOGP,
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700879 FL("Posting WDA_UPDATE_OP_MODE to WDA failed, reason=%X"),
Mohit Khanna4a70d262012-09-11 16:30:12 -0700880 retCode );
881 }
882
883 return retCode;
884}
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800885
886#ifdef FEATURE_WLAN_TDLS_INTERNAL
887/** ---------------------------------------------------------
888\fn limSendTdlsLinkEstablish
889\brief LIM sends a message to HAL to set tdls direct link
890\param tpAniSirGlobal pMac
891\param
892\return None
893 -----------------------------------------------------------*/
894tSirRetStatus limSendTdlsLinkEstablish(tpAniSirGlobal pMac, tANI_U8 bIsPeerResponder, tANI_U8 linkIdenOffset,
895 tANI_U8 ptiBufStatusOffset, tANI_U8 ptiFrameLen, tANI_U8 *ptiFrame, tANI_U8 *extCapability)
896{
897 tSirMsgQ msgQ;
898 tSirRetStatus retCode;
899 tpSirTdlsLinkEstablishInd pTdlsLinkEstablish = NULL;
900
901 // Allocate memory.
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530902 pTdlsLinkEstablish = vos_mem_malloc(sizeof(tSirTdlsLinkEstablishInd));
903 if ( NULL == pTdlsLinkEstablish )
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800904 {
905 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530906 FL( "Unable to allocate memory while sending Tdls Link Establish " ));
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800907
908 retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
909 return retCode;
910 }
911
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530912 vos_mem_set((tANI_U8 *) pTdlsLinkEstablish, sizeof(tSirTdlsLinkEstablishInd), 0);
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800913
914 pTdlsLinkEstablish->bIsResponder = !!bIsPeerResponder;
915 pTdlsLinkEstablish->linkIdenOffset = linkIdenOffset;
916 pTdlsLinkEstablish->ptiBufStatusOffset = ptiBufStatusOffset;
917 pTdlsLinkEstablish->ptiTemplateLen = ptiFrameLen;
918 /* Copy ptiFrame template */
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530919 vos_mem_copy(pTdlsLinkEstablish->ptiTemplateBuf, ptiFrame, ptiFrameLen);
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800920 /* Copy extended capabilities */
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530921 vos_mem_copy((tANI_U8 *) pTdlsLinkEstablish->extCapability, extCapability, sizeof(pTdlsLinkEstablish->extCapability));
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800922
923 msgQ.type = SIR_HAL_TDLS_LINK_ESTABLISH;
924 msgQ.reserved = 0;
925 msgQ.bodyptr = pTdlsLinkEstablish;
926 msgQ.bodyval = 0;
927
928 MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
929
930 retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
931 if (retCode != eSIR_SUCCESS)
932 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530933 vos_mem_free(pTdlsLinkEstablish);
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700934 limLog(pMac, LOGP, FL("Posting tdls link establish %d failed, reason = %x "), retCode);
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800935 }
936
937 return retCode;
938}
939
940/** ---------------------------------------------------------
941\fn limSendTdlsLinkTeardown
942\brief LIM sends a message to HAL to indicate tdls direct link is teardowned
943\param tpAniSirGlobal pMac
944\param
945\return None
946 -----------------------------------------------------------*/
947tSirRetStatus limSendTdlsLinkTeardown(tpAniSirGlobal pMac, tANI_U16 staId)
948{
949 tSirMsgQ msgQ;
950 tSirRetStatus retCode;
951 tpSirTdlsLinkTeardownInd pTdlsLinkTeardown = NULL;
952
953 // Allocate memory.
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530954 pTdlsLinkTeardown = vos_mem_malloc(sizeof(tSirTdlsLinkTeardownInd));
955 if ( NULL == pTdlsLinkTeardown )
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800956 {
957 limLog( pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530958 FL( "Unable to allocate memory while sending Tdls Link Teardown " ));
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800959
960 retCode = eSIR_SME_RESOURCES_UNAVAILABLE;
961 return retCode;
962 }
963
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530964 vos_mem_set((tANI_U8 *) pTdlsLinkTeardown, sizeof(tSirTdlsLinkTeardownInd), 0);
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800965
966 pTdlsLinkTeardown->staId = staId;
967
968 msgQ.type = SIR_HAL_TDLS_LINK_TEARDOWN;
969 msgQ.reserved = 0;
970 msgQ.bodyptr = pTdlsLinkTeardown;
971 msgQ.bodyval = 0;
972
973 MTRACE(macTraceMsgTx(pMac, 0, msgQ.type));
974
975 retCode = (tANI_U32)wdaPostCtrlMsg(pMac, &msgQ);
976 if (retCode != eSIR_SUCCESS)
977 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +0530978 vos_mem_free(pTdlsLinkTeardown);
Kiran Kumar Lokere5be73a62013-04-01 18:40:00 -0700979 limLog(pMac, LOGP, FL("Posting tdls link teardown %d failed, reason = %x "), retCode);
Mohit Khanna698ba2a2012-12-04 15:08:18 -0800980 }
981
982 return retCode;
983}
984
985#endif
986
Chet Lanctot186b5732013-03-18 10:26:30 -0700987#ifdef WLAN_FEATURE_11W
988/** ---------------------------------------------------------
989\fn limSendExcludeUnencryptInd
990\brief LIM sends a message to HAL to indicate whether to
991 ignore or indicate the unprotected packet error
992\param tpAniSirGlobal pMac
993\param tANI_BOOLEAN excludeUnenc - true: ignore, false:
994 indicate
995\param tpPESession psessionEntry - session context
996\return status
997 -----------------------------------------------------------*/
998tSirRetStatus limSendExcludeUnencryptInd(tpAniSirGlobal pMac,
999 tANI_BOOLEAN excludeUnenc,
1000 tpPESession psessionEntry)
1001{
1002 tSirRetStatus retCode = eSIR_SUCCESS;
1003 tSirMsgQ msgQ;
1004 tSirWlanExcludeUnencryptParam * pExcludeUnencryptParam;
1005
Bansidhar Gopalachari12731232013-07-11 10:56:36 +05301006 pExcludeUnencryptParam = vos_mem_malloc(sizeof(tSirWlanExcludeUnencryptParam));
1007 if ( NULL == pExcludeUnencryptParam )
Chet Lanctot186b5732013-03-18 10:26:30 -07001008 {
1009 limLog(pMac, LOGP,
Bansidhar Gopalachari12731232013-07-11 10:56:36 +05301010 FL( "Unable to allocate memory during limSendExcludeUnencryptInd"));
Chet Lanctot186b5732013-03-18 10:26:30 -07001011 return eSIR_MEM_ALLOC_FAILED;
1012 }
1013
1014 pExcludeUnencryptParam->excludeUnencrypt = excludeUnenc;
1015 sirCopyMacAddr(pExcludeUnencryptParam->bssId, psessionEntry->bssId);
1016
1017 msgQ.type = WDA_EXCLUDE_UNENCRYPTED_IND;
1018 msgQ.reserved = 0;
1019 msgQ.bodyptr = pExcludeUnencryptParam;
1020 msgQ.bodyval = 0;
1021 PELOG3(limLog(pMac, LOG3,
1022 FL("Sending WDA_EXCLUDE_UNENCRYPTED_IND"));)
1023 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Chet Lanctotb2b0d552013-03-22 16:58:44 -07001024 retCode = wdaPostCtrlMsg(pMac, &msgQ);
1025 if (eSIR_SUCCESS != retCode)
Chet Lanctot186b5732013-03-18 10:26:30 -07001026 {
Bansidhar Gopalachari12731232013-07-11 10:56:36 +05301027 vos_mem_free(pExcludeUnencryptParam);
Chet Lanctot186b5732013-03-18 10:26:30 -07001028 limLog(pMac, LOGP,
1029 FL("Posting WDA_EXCLUDE_UNENCRYPTED_IND to WDA failed, reason=%X"),
1030 retCode);
1031 }
1032
1033 return retCode;
1034}
1035#endif
1036