blob: 02fab02d1db53c0ca74753320dd0ae6a3e6f0334 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
2 * Copyright (c) 2012, Code Aurora Forum. 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
22/*===========================================================================
23
24 W L A N _ Q C T _ WDA . C
25
26 OVERVIEW:
27
28 This software unit holds the implementation of the WLAN Transport Layer.
29
30 The functions externalized by this module are to be called ONLY by other
31 WLAN modules that properly register with the Transport Layer initially.
32
33 DEPENDENCIES:
34
35 Are listed for each API below.
36
37
38 Copyright (c) 2010-2011 QUALCOMM Incorporated.
39 All Rights Reserved.
40 Qualcomm Confidential and Proprietary
41===========================================================================*/
42
43/*===========================================================================
44
45 EDIT HISTORY FOR FILE
46
47
48 This section contains comments describing changes made to the module.
49 Notice that changes are listed in reverse chronological order.
50
51
52 $Header$$DateTime$$Author$
53
54
55 when who what, where, why
56---------- --- -------------------------------------------------
5710/05/2011 haparna Adding support for Keep Alive Feature
582010-12-30 smiryala UMAC convergence changes
592010-08-19 adwivedi WLAN DAL AL(WDA) layer for Prima
60===========================================================================*/
61
62#if defined( FEATURE_WLAN_INTEGRATED_SOC )
63
64#include "vos_mq.h"
65#include "vos_api.h"
66#include "vos_packet.h"
67#include "vos_nvitem.h"
68#include "sirApi.h"
69#include "wlan_qct_pal_packet.h"
70#include "wlan_qct_wda.h"
71#include "wlan_qct_wda_msg.h"
72#include "wlan_qct_wdi_cfg.h"
73#include "wlan_qct_wdi.h"
74#include "wlan_qct_wdi_ds.h"
75#include "wlan_hal_cfg.h"
76/**********************/
77#include "wniApi.h"
78#include "cfgApi.h"
79#include "limApi.h"
80#include "wlan_qct_tl.h"
81#include "wlan_qct_tli_ba.h"
82#include "limUtils.h"
83#include "btcApi.h"
84#include "vos_sched.h"
85
86#ifdef ANI_MANF_DIAG
87#include "pttMsgApi.h"
88#include "wlan_qct_sys.h"
89#endif /* ANI_MANF_DIAG */
90
91/* Used MACRO's */
92/* Get WDA context from vOSS module */
93#define VOS_GET_WDA_CTXT(a) vos_get_context(VOS_MODULE_ID_WDA, a)
94#define VOS_GET_MAC_CTXT(a) vos_get_context(VOS_MODULE_ID_PE, a)
95#define OFFSET_OF(structType,fldName) (&((structType*)0)->fldName)
96#define WDA_BA_TX_FRM_THRESHOLD (5)
97
98#define CONVERT_WDI2SIR_STATUS(x) \
99 ((WDI_STATUS_SUCCESS != (x)) ? eSIR_FAILURE : eSIR_SUCCESS)
100
101#define IS_WDI_STATUS_FAILURE(status) \
102 ((WDI_STATUS_SUCCESS != (status)) && (WDI_STATUS_PENDING != (status)))
103
104#define CONVERT_WDI2VOS_STATUS(x) \
105 ((IS_WDI_STATUS_FAILURE(x)) ? VOS_STATUS_E_FAILURE : VOS_STATUS_SUCCESS)
106
107/* macro's for acessing TL API/data structures */
108
109#define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d)
110
111#define WDA_GET_BA_TXFLAG(a, b, c) \
112 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c)))
113
114#define WDA_SET_BA_TXFLAG(a, b, c) \
115 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) |= (1 << (c)))
116
117#define WDA_CLEAR_BA_TXFLAG(a, b, c) \
118 (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c))
119
120#define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \
121 WLANTL_BaSessionAdd(a, b, c, d, e, f, g)
122
123/* timer related Macros */
124#define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \
125 tx_timer_create(a, b, c, d, e, f, g)
126#define WDA_START_TIMER(a) tx_timer_activate(a)
127#define WDA_STOP_TIMER(a) tx_timer_deactivate(a)
128#define WDA_DESTROY_TIMER(a) tx_timer_delete(a)
129
130#define WDA_WDI_START_TIMEOUT 15000
131
132#define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \
133 ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD)
134
135#define WDA_BA_MAX_WINSIZE (64)
136
137#define WDA_INVALID_KEY_INDEX 0xFF
138
139#define WDA_NUM_PWR_SAVE_CFG 11
140
141#define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000
142
143
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700144#define WDA_MAX_RETRIES_TILL_RING_EMPTY 1000 /* MAX 10000 msec = 10 seconds wait */
Jeff Johnson295189b2012-06-20 16:38:30 -0700145
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700146#define WDA_WAIT_MSEC_TILL_RING_EMPTY 10 /* 10 msec wait per cycle */
Jeff Johnson295189b2012-06-20 16:38:30 -0700147/* extern declarations */
148extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
149
150/* forward declarations */
151void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
152 void *pBodyptr, tANI_U32 bodyVal) ;
153VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
154 WDI_StartReqParamsType *wdiStartParams ) ;
155
156VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ;
157VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams);
158
159extern v_BOOL_t sys_validateStaConfig( void *pImage, unsigned long cbFile,
160 void **ppStaConfig, v_SIZE_t *pcbStaConfig ) ;
161void processCfgDownloadReq(tpAniSirGlobal pMac, tANI_U16 length,
162 tANI_U32 *pConfig) ;
163void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
164 WDI_ConfigBSSReqInfoType *wdiBssParams, tAddBssParams *wdaBssParams) ;
165void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
166 WDI_ConfigStaReqInfoType *wdiStaParams, tAddStaParams *wdaStaParams) ;
167void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
168 void* pUserData ) ;
169static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) ;
170static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA);
171void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ;
172void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData);
173
174#ifdef WLAN_FEATURE_VOWIFI_11R
175VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams);
176#endif /* WLAN_FEATURE_VOWIFI_11R */
177
178
179void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ;
180void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ;
181VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA);
182
183#ifdef FEATURE_WLAN_SCAN_PNO
184static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams);
185static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams);
186static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams);
187#endif // FEATURE_WLAN_SCAN_PNO
188
189#ifdef WLAN_FEATURE_PACKET_FILTERING
190static VOS_STATUS WDA_Process8023MulticastListReq (
191 tWDA_CbContext *pWDA,
192 tSirRcvFltMcAddrList *pRcvFltMcAddrLis
193 );
194static VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (
195 tWDA_CbContext *pWDA,
196 tSirRcvPktFilterCfgType *pRcvPktFilterCfg
197 );
198static VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (
199 tWDA_CbContext *pWDA,
200 tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp
201 );
202static VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (
203 tWDA_CbContext *pWDA,
204 tSirRcvFltPktClearParam *pRcvFltPktClearParam
205 );
206#endif // WLAN_FEATURE_PACKET_FILTERING
207
208VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams);
209
210static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
211 tpTxControlParams pTxCtrlParam);
212
213VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
214 v_U8_t *pDefaultKeyId,
215 v_U8_t *pNumKeys,
216 WDI_KeysType *pWdiKeys );
217
218#ifdef WLAN_FEATURE_GTK_OFFLOAD
219static VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, tpSirGtkOffloadParams pGtkOffloadParams);
220static VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp);
221#endif // WLAN_FEATURE_GTK_OFFLOAD
222
223VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
224 tAniSetTmLevelReq *setTmLevelReq);
225/*
226 * FUNCTION: WDA_open
227 * Allocate the WDA context
228 */
229VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext,
230 tMacOpenParameters *pMacParams )
231{
232 tWDA_CbContext *wdaContext;
233 VOS_STATUS status;
234 WDI_DeviceCapabilityType wdiDevCapability = {0} ;
235
236 /* Allocate WDA context */
237 status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA,
238 (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ;
239 if(!VOS_IS_STATUS_SUCCESS(status))
240 {
241 return VOS_STATUS_E_NOMEM;
242 }
243
244 /*__asm int 3;*/
245 vos_mem_zero(wdaContext,sizeof(tWDA_CbContext));
246
247 /* Initialize data structures */
248 wdaContext->pVosContext = pVosContext;
249 wdaContext->wdaState = WDA_INIT_STATE;
250 wdaContext->uTxFlowMask = WDA_TXFLOWMASK;
251
252 /* Initialize WDA-WDI synchronization event */
253 status = vos_event_init(&wdaContext->wdaWdiEvent);
254 if(!VOS_IS_STATUS_SUCCESS(status))
255 {
256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
257 "WDI Sync Event init failed - status = %d\n", status);
258 status = VOS_STATUS_E_FAILURE;
259 }
260
261 /* Init Frame transfer event */
262 status = vos_event_init(&wdaContext->txFrameEvent);
263 if(!VOS_IS_STATUS_SUCCESS(status))
264 {
265 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
266 "VOS Mgmt Frame Event init failed - status = %d\n", status);
267 status = VOS_STATUS_E_FAILURE;
268 }
269
270 status = vos_event_init(&wdaContext->suspendDataTxEvent);
271 if(!VOS_IS_STATUS_SUCCESS(status))
272 {
273 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
274 "VOS suspend data tx Event init failed - status = %d\n", status);
275 status = VOS_STATUS_E_FAILURE;
276 }
277
278 status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack);
279 if(!VOS_IS_STATUS_SUCCESS(status))
280 {
281 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
282 "VOS wait On Wdi Ind Event init failed - status = %d\n", status);
283 status = VOS_STATUS_E_FAILURE;
284 }
285
286 vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR);
287
288 wdaContext->driverMode = pMacParams->driverType;
289 if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext,
290 &wdiDevCapability, pMacParams->driverType))
291 {
292 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
293 "WDI Init failed" );
294 status = VOS_STATUS_E_FAILURE;
295 }
296 else
297 {
298 pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ;
299 pMacParams->maxBssId = wdiDevCapability.ucMaxBSSSupported;
300 pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
301
302 /* update max STA in WDA used for BA */
303 wdaContext->wdaMaxSta = pMacParams->maxStation;
304 /* store the frameTransRequired flag in wdaContext, to send this to HAL
305 * in WDA_Start
306 */
307 wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
308 }
309
310 return status;
311}
312
313
314/*
315 * FUNCTION: WDA_preStart
316 * Trigger DAL-AL to start CFG download
317 */
318VOS_STATUS WDA_preStart(v_PVOID_t pVosContext)
319{
320 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
321 vos_msg_t wdaMsg = {0} ;
322
323 /*
324 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
325 */
326 wdaMsg.type = WNI_CFG_DNLD_REQ ;
327 wdaMsg.bodyptr = NULL;
328 wdaMsg.bodyval = 0;
329
330 /* post the message.. */
331 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
332 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
333 {
334 vosStatus = VOS_STATUS_E_BADMSG;
335 }
336
337 return( vosStatus );
338}
339
340/*
341 * FUNCTION: WDA_wdiStartCallback
342 * Once WDI_Start is finished, WDI start callback will be called by WDI
343 * to indicate completion of WDI_Start.
344 */
345void WDA_wdiStartCallback(WDI_StartRspParamsType *wdiRspParams,
346 void *pVosContext)
347{
348 tWDA_CbContext *wdaContext;
349 VOS_STATUS status;
350
351 if (NULL == pVosContext)
352 {
353 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
354 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
355 return;
356 }
357
358 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
359 if (NULL == wdaContext)
360 {
361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
362 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
363 return;
364 }
365
366 if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus)
367 {
368 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
369 "%s: WDI_Start() failure reported", __FUNCTION__ );
370 }
371 else
372 {
373 wdaContext->wdaState = WDA_START_STATE;
374 }
375
376 /* extract and save version information from the Start Response */
377 wdaContext->wcnssWlanCompiledVersion.major =
378 wdiRspParams->wlanCompiledVersion.major;
379 wdaContext->wcnssWlanCompiledVersion.minor =
380 wdiRspParams->wlanCompiledVersion.minor;
381 wdaContext->wcnssWlanCompiledVersion.version =
382 wdiRspParams->wlanCompiledVersion.version;
383 wdaContext->wcnssWlanCompiledVersion.revision =
384 wdiRspParams->wlanCompiledVersion.revision;
385 wdaContext->wcnssWlanReportedVersion.major =
386 wdiRspParams->wlanReportedVersion.major;
387 wdaContext->wcnssWlanReportedVersion.minor =
388 wdiRspParams->wlanReportedVersion.minor;
389 wdaContext->wcnssWlanReportedVersion.version =
390 wdiRspParams->wlanReportedVersion.version;
391 wdaContext->wcnssWlanReportedVersion.revision =
392 wdiRspParams->wlanReportedVersion.revision;
393 wpalMemoryCopy(wdaContext->wcnssSoftwareVersionString,
394 wdiRspParams->wcnssSoftwareVersion,
395 sizeof(wdaContext->wcnssSoftwareVersionString));
396 wpalMemoryCopy(wdaContext->wcnssHardwareVersionString,
397 wdiRspParams->wcnssHardwareVersion,
398 sizeof(wdaContext->wcnssHardwareVersionString));
399
400 /* Notify WDA_start that WDI_Start has completed */
401 status = vos_event_set(&wdaContext->wdaWdiEvent);
402 if (WDI_STATUS_SUCCESS != status)
403 {
404 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
405 "%s: Unable to unblock WDA_start", __FUNCTION__ );
406 }
407
408 return;
409}
410
411
412/*
413 * FUNCTION: WDA_start
414 * Prepare TLV configuration and call WDI_Start.
415 */
416
417VOS_STATUS WDA_start(v_PVOID_t pVosContext)
418{
419 tWDA_CbContext *wdaContext;
420 VOS_STATUS status;
421 WDI_Status wdiStatus;
422 WDI_StartReqParamsType wdiStartParam;
423
424 if (NULL == pVosContext)
425 {
426 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
427 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
428 return VOS_STATUS_E_FAILURE;
429 }
430
431 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
432 if (NULL == wdaContext)
433 {
434 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
435 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
436 return VOS_STATUS_E_FAILURE;
437 }
438
439 /* Non-FTM mode, WDA status for START must be INIT
440 * FTM mode, WDA Status for START can be INIT or STOP */
441 if ( (WDA_INIT_STATE != wdaContext->wdaState) &&
442 (WDA_STOP_STATE != wdaContext->wdaState) )
443 {
444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
445 "%s: Invoked from wrong state %d",
446 __FUNCTION__, wdaContext->wdaState );
447 return VOS_STATUS_E_FAILURE;
448 }
449
450 /* initialize the wdiStartParam. Note that we can create this on
451 the stack since we won't exit until WDI_Start() completes or
452 times out */
453 vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0);
454
455 wdiStartParam.wdiDriverType = wdaContext->driverMode;
456
457 /* prepare the config TLV for the WDI */
458 status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam);
459 if ( !VOS_IS_STATUS_SUCCESS(status) )
460 {
461 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
462 "%s: Unable to prepare Config TLV", __FUNCTION__ );
463 return VOS_STATUS_E_FAILURE;
464 }
465
466 /* note from here onwards if an error occurs we must
467 reclaim the config TLV buffer */
468
469 wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback;
470 wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext;
471 wdiStartParam.wdiReqStatusCB = NULL;
472
473 /* initialize the WDA-WDI synchronization event */
474 vos_event_reset(&wdaContext->wdaWdiEvent);
475
476 /* call WDI start */
477 wdiStatus = WDI_Start(&wdiStartParam,
478 (WDI_StartRspCb)WDA_wdiStartCallback,
479 (v_VOID_t *)pVosContext);
480 if ( IS_WDI_STATUS_FAILURE(wdiStatus) )
481 {
482 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
483 "%s: WDI Start failed", __FUNCTION__ );
484 vos_mem_free(wdiStartParam.pConfigBuffer);
485 return VOS_STATUS_E_FAILURE;
486 }
487
488 /* wait for WDI start to invoke our callback */
489 status = vos_wait_single_event( &wdaContext->wdaWdiEvent,
490 WDA_WDI_START_TIMEOUT );
491 if ( !VOS_IS_STATUS_SUCCESS(status) )
492 {
493 if ( VOS_STATUS_E_TIMEOUT == status )
494 {
495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
496 "%s: Timeout occurred during WDI_Start", __FUNCTION__ );
497 }
498 else
499 {
500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
501 "%s: Error %d while waiting for WDI_Start",
502 __FUNCTION__, status);
503 }
504 vos_mem_free(wdiStartParam.pConfigBuffer);
505 return VOS_STATUS_E_FAILURE;
506 }
507
508 /* WDI_Start() has completed so we can resume our work */
509
510 /* we no longer need the config TLV */
511 vos_mem_free(wdiStartParam.pConfigBuffer);
512
513 /* if we are not in the START state then WDI_Start() failed */
514 if (WDA_START_STATE != wdaContext->wdaState)
515 {
516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
517 "%s: WDI_Start() failure detected", __FUNCTION__ );
518 return VOS_STATUS_E_FAILURE;
519 }
520
521 /* FTM mode does not need to monitor BA activity */
522 if ( eDRIVER_TYPE_MFG != wdaContext->driverMode )
523 {
524 status = wdaCreateTimers(wdaContext) ;
525 }
526
527 return status;
528}
529
530
531/*
532 * FUNCTION: WDA_prepareConfigTLV
533 * Function to prepare CFG for DAL(WDA)
534 */
535VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
536 WDI_StartReqParamsType *wdiStartParams )
537{
538 /* get pMac to acess CFG data base */
539 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext);
540 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
541 tHalCfg *tlvStruct = NULL ;
542 tANI_U8 *tlvStructStart = NULL ;
543 tANI_U32 strLength = WNI_CFG_STA_ID_LEN;
544 v_PVOID_t *configParam;
545 tANI_U32 configParamSize;
546 tANI_U32 *configDataValue;
547 WDI_WlanVersionType wcnssCompiledApiVersion;
548
549 if ((NULL == pMac)||(NULL == wdaContext))
550 {
551 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
552 "%s: Invoked with invalid wdaContext or pMac", __FUNCTION__ );
553 VOS_ASSERT(0);
554 return VOS_STATUS_E_FAILURE;
555 }
556
557 configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) +
558 WNI_CFG_STA_ID_LEN +
559 WNI_CFG_EDCA_WME_ACBK_LEN +
560 WNI_CFG_EDCA_WME_ACBE_LEN +
561 WNI_CFG_EDCA_WME_ACVI_LEN +
562 WNI_CFG_EDCA_WME_ACVO_LEN +
563 + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32));
564
565 /* malloc memory for all configs in one shot */
566 configParam = vos_mem_malloc(configParamSize);
567
568 if(NULL == configParam )
569 {
570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
571 "%s:configParam is NULL", __FUNCTION__);
572 VOS_ASSERT(0) ;
573 return VOS_STATUS_E_NOMEM;
574 }
575 vos_mem_set(configParam, configParamSize, 0);
576
577 wdiStartParams->pConfigBuffer = configParam;
578
579 tlvStruct = (tHalCfg *)configParam;
580 tlvStructStart = (tANI_U8 *)configParam;
581
582 /* TODO: Remove Later */
583 /* QWLAN_HAL_CFG_STA_ID */
584 tlvStruct->type = QWLAN_HAL_CFG_STA_ID;
585 configDataValue = (tANI_U32*)((tANI_U8 *) tlvStruct + sizeof(tHalCfg));
586 if(wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, (tANI_U8*)configDataValue, &strLength) !=
587 eSIR_SUCCESS)
588 {
589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
590 "Failed to get value for WNI_CFG_STA_ID");
591 goto handle_failure;
592 }
593 tlvStruct->length = strLength ;
594 /* calculate the pad bytes to have the CFG in aligned format */
595 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
596 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
597
598 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
599 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ;
600
601 /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */
602 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
603 tlvStruct->length = sizeof(tANI_U32);
604 configDataValue = (tANI_U32 *)(tlvStruct + 1);
605 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_TX_ANTENNA, configDataValue )
606 != eSIR_SUCCESS)
607 {
608 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
609 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
610 goto handle_failure;
611 }
612
613 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
614 + sizeof(tHalCfg) + tlvStruct->length)) ;
615
616 /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */
617 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
618 tlvStruct->length = sizeof(tANI_U32);
619 configDataValue = (tANI_U32 *)(tlvStruct + 1);
620 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_RX_ANTENNA, configDataValue) !=
621 eSIR_SUCCESS)
622 {
623 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
624 "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA");
625 goto handle_failure;
626 }
627
628 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
629 + sizeof(tHalCfg) + tlvStruct->length)) ;
630
631 /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */
632 tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
633 tlvStruct->length = sizeof(tANI_U32);
634 configDataValue = (tANI_U32 *)(tlvStruct + 1);
635 if(wlan_cfgGetInt(pMac, WNI_CFG_LOW_GAIN_OVERRIDE, configDataValue )
636 != eSIR_SUCCESS)
637 {
638 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
639 "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE");
640 goto handle_failure;
641 }
642
643 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
644 + sizeof(tHalCfg) + tlvStruct->length)) ;
645
646 /* QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN */
647 tlvStruct->type = QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
648 tlvStruct->length = sizeof(tANI_U32);
649 configDataValue = (tANI_U32 *)(tlvStruct + 1);
650 if(wlan_cfgGetInt(pMac, WNI_CFG_POWER_STATE_PER_CHAIN,
651 configDataValue ) != eSIR_SUCCESS)
652 {
653 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
654 "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN");
655 goto handle_failure;
656 }
657
658 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
659 + sizeof(tHalCfg) + tlvStruct->length));
660
661 /* QWLAN_HAL_CFG_CAL_PERIOD */
662 tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD;
663 tlvStruct->length = sizeof(tANI_U32);
664 configDataValue = (tANI_U32 *)(tlvStruct + 1);
665 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_PERIOD, configDataValue )
666 != eSIR_SUCCESS)
667 {
668 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
669 "Failed to get value for WNI_CFG_CAL_PERIOD");
670 goto handle_failure;
671 }
672
673 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
674 + sizeof(tHalCfg) + tlvStruct->length));
675
676 /* QWLAN_HAL_CFG_CAL_CONTROL */
677 tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ;
678 tlvStruct->length = sizeof(tANI_U32);
679 configDataValue = (tANI_U32 *)(tlvStruct + 1);
680 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_CONTROL, configDataValue )
681 != eSIR_SUCCESS)
682 {
683 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
684 "Failed to get value for WNI_CFG_CAL_CONTROL");
685 goto handle_failure;
686 }
687
688 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
689 + sizeof(tHalCfg) + tlvStruct->length));
690
691 /* QWLAN_HAL_CFG_PROXIMITY */
692 tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ;
693 tlvStruct->length = sizeof(tANI_U32);
694 configDataValue = (tANI_U32 *)(tlvStruct + 1);
695 if(wlan_cfgGetInt(pMac, WNI_CFG_PROXIMITY, configDataValue )
696 != eSIR_SUCCESS)
697 {
698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
699 "Failed to get value for WNI_CFG_PROXIMITY");
700 goto handle_failure;
701 }
702
703 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
704 + sizeof(tHalCfg) + tlvStruct->length)) ;
705
706 /* QWLAN_HAL_CFG_NETWORK_DENSITY */
707 tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ;
708 tlvStruct->length = sizeof(tANI_U32);
709 configDataValue = (tANI_U32 *)(tlvStruct + 1);
710 if(wlan_cfgGetInt(pMac, WNI_CFG_NETWORK_DENSITY, configDataValue )
711 != eSIR_SUCCESS)
712 {
713 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
714 "Failed to get value for WNI_CFG_NETWORK_DENSITY");
715 goto handle_failure;
716 }
717
718 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
719 + sizeof(tHalCfg) + tlvStruct->length));
720
721 /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME */
722 tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ;
723 tlvStruct->length = sizeof(tANI_U32);
724 configDataValue = (tANI_U32 *)(tlvStruct + 1);
725 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MEDIUM_TIME, configDataValue ) !=
726 eSIR_SUCCESS)
727 {
728 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
729 "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME");
730 goto handle_failure;
731 }
732
733 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
734 + sizeof(tHalCfg) + tlvStruct->length));
735
736 /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU */
737 tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU ;
738 tlvStruct->length = sizeof(tANI_U32);
739 configDataValue = (tANI_U32 *)(tlvStruct + 1);
740 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MPDUS_IN_AMPDU,
741 configDataValue ) != eSIR_SUCCESS)
742 {
743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
744 "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU");
745 goto handle_failure;
746 }
747
748 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
749 + sizeof(tHalCfg) + tlvStruct->length)) ;
750
751 /* QWLAN_HAL_CFG_RTS_THRESHOLD */
752 tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD ;
753 tlvStruct->length = sizeof(tANI_U32);
754 configDataValue = (tANI_U32 *)(tlvStruct + 1);
755 if(wlan_cfgGetInt(pMac, WNI_CFG_RTS_THRESHOLD, configDataValue ) !=
756 eSIR_SUCCESS)
757 {
758 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
759 "Failed to get value for WNI_CFG_RTS_THRESHOLD");
760 goto handle_failure;
761 }
762
763 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
764 + sizeof(tHalCfg) + tlvStruct->length));
765
766 /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT */
767 tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT ;
768 tlvStruct->length = sizeof(tANI_U32);
769 configDataValue = (tANI_U32 *)(tlvStruct + 1);
770 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_RETRY_LIMIT, configDataValue ) !=
771 eSIR_SUCCESS)
772 {
773 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
774 "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT");
775 goto handle_failure;
776 }
777
778 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
779 + sizeof(tHalCfg) + tlvStruct->length)) ;
780
781 /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT */
782 tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT ;
783 tlvStruct->length = sizeof(tANI_U32);
784 configDataValue = (tANI_U32 *)(tlvStruct + 1);
785 if(wlan_cfgGetInt(pMac, WNI_CFG_LONG_RETRY_LIMIT, configDataValue ) !=
786 eSIR_SUCCESS)
787 {
788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
789 "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT");
790 goto handle_failure;
791 }
792
793 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
794 + sizeof(tHalCfg) + tlvStruct->length)) ;
795
796 /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD */
797 tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD ;
798 tlvStruct->length = sizeof(tANI_U32);
799 configDataValue = (tANI_U32 *)(tlvStruct + 1);
800 if(wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD,
801 configDataValue ) != eSIR_SUCCESS)
802 {
803 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
804 "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD");
805 goto handle_failure;
806 }
807
808 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
809 + sizeof(tHalCfg) + tlvStruct->length)) ;
810
811 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO */
812 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO ;
813 tlvStruct->length = sizeof(tANI_U32);
814 configDataValue = (tANI_U32 *)(tlvStruct + 1);
815 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ZERO,
816 configDataValue ) != eSIR_SUCCESS)
817 {
818 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
819 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO");
820 goto handle_failure;
821 }
822
823 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
824 + sizeof(tHalCfg) + tlvStruct->length));
825
826 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE */
827 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE ;
828 tlvStruct->length = sizeof(tANI_U32);
829 configDataValue = (tANI_U32 *)(tlvStruct + 1);
830 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ONE,
831 configDataValue ) != eSIR_SUCCESS)
832 {
833 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
834 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE");
835 goto handle_failure;
836 }
837
838 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
839 + sizeof(tHalCfg) + tlvStruct->length));
840
841 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO */
842 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO ;
843 tlvStruct->length = sizeof(tANI_U32);
844 configDataValue = (tANI_U32 *)(tlvStruct + 1);
845 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_TWO,
846 configDataValue ) != eSIR_SUCCESS)
847 {
848 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
849 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO");
850 goto handle_failure;
851 }
852
853 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
854 + sizeof(tHalCfg) + tlvStruct->length));
855
856 /* QWLAN_HAL_CFG_FIXED_RATE */
857 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE ;
858 tlvStruct->length = sizeof(tANI_U32);
859 configDataValue = (tANI_U32 *)(tlvStruct + 1);
860 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE, configDataValue)
861 != eSIR_SUCCESS)
862 {
863 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
864 "Failed to get value for WNI_CFG_FIXED_RATE");
865 goto handle_failure;
866 }
867
868 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
869 + sizeof(tHalCfg) + tlvStruct->length));
870
871 /* QWLAN_HAL_CFG_RETRYRATE_POLICY */
872 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_POLICY ;
873 tlvStruct->length = sizeof(tANI_U32);
874 configDataValue = (tANI_U32 *)(tlvStruct + 1);
875 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_POLICY, configDataValue )
876 != eSIR_SUCCESS)
877 {
878 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
879 "Failed to get value for WNI_CFG_RETRYRATE_POLICY");
880 goto handle_failure;
881 }
882
883 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
884 + sizeof(tHalCfg) + tlvStruct->length));
885
886 /* QWLAN_HAL_CFG_RETRYRATE_SECONDARY */
887 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_SECONDARY ;
888 tlvStruct->length = sizeof(tANI_U32);
889 configDataValue = (tANI_U32 *)(tlvStruct + 1);
890 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_SECONDARY,
891 configDataValue ) != eSIR_SUCCESS)
892 {
893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
894 "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY");
895 goto handle_failure;
896 }
897
898 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
899 + sizeof(tHalCfg) + tlvStruct->length)) ;
900
901 /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY */
902 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY ;
903 tlvStruct->length = sizeof(tANI_U32);
904 configDataValue = (tANI_U32 *)(tlvStruct + 1);
905 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_TERTIARY,
906 configDataValue ) != eSIR_SUCCESS)
907 {
908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
909 "Failed to get value for WNI_CFG_RETRYRATE_TERTIARY");
910 goto handle_failure;
911 }
912 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
913 + sizeof(tHalCfg) + tlvStruct->length)) ;
914
915 /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION */
916 tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION ;
917 tlvStruct->length = sizeof(tANI_U32);
918 configDataValue = (tANI_U32 *)(tlvStruct + 1);
919 if(wlan_cfgGetInt(pMac, WNI_CFG_FORCE_POLICY_PROTECTION,
920 configDataValue ) != eSIR_SUCCESS)
921 {
922 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
923 "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION");
924 goto handle_failure;
925 }
926
927 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
928 + sizeof(tHalCfg) + tlvStruct->length);
929
930 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ */
931 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ ;
932 tlvStruct->length = sizeof(tANI_U32);
933 configDataValue = (tANI_U32 *)(tlvStruct + 1);
934 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_24GHZ,
935 configDataValue ) != eSIR_SUCCESS)
936 {
937 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
938 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ");
939 goto handle_failure;
940 }
941
942 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
943 + sizeof(tHalCfg) + tlvStruct->length);
944
945 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ */
946 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ ;
947 tlvStruct->length = sizeof(tANI_U32);
948 configDataValue = (tANI_U32 *)(tlvStruct + 1);
949 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_5GHZ,
950 configDataValue ) != eSIR_SUCCESS)
951 {
952 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
953 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ");
954 goto handle_failure;
955 }
956
957 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
958 + sizeof(tHalCfg) + tlvStruct->length);
959
960#if 0 /*FIXME_PRIMA : Enable this after the RA is enabled in HAL*/
961 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ */
962 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ ;
963 tlvStruct->length = sizeof(tANI_U32);
964 configDataValue = (tANI_U32 *)(tlvStruct + 1);
965 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_24GHZ,
966 configDataValue ) != eSIR_SUCCESS)
967 {
968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
969 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ");
970 goto handle_failure;
971 }
972
973 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
974 + sizeof(tHalCfg) + tlvStruct->length);
975#endif
976 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ */
977 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ ;
978 tlvStruct->length = sizeof(tANI_U32);
979 configDataValue = (tANI_U32 *)(tlvStruct + 1);
980 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_5GHZ,
981 configDataValue ) != eSIR_SUCCESS)
982 {
983 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
984 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ");
985 goto handle_failure;
986 }
987
988 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
989 + sizeof(tHalCfg) + tlvStruct->length);
990
991 /* QWLAN_HAL_CFG_MAX_BA_SESSIONS */
992 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS ;
993 tlvStruct->length = sizeof(tANI_U32);
994 configDataValue = (tANI_U32 *)(tlvStruct + 1);
995 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_SESSIONS, configDataValue ) !=
996 eSIR_SUCCESS)
997 {
998 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
999 "Failed to get value for WNI_CFG_MAX_BA_SESSIONS");
1000 goto handle_failure;
1001 }
1002
1003 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1004 + sizeof(tHalCfg) + tlvStruct->length);
1005
1006 /* QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT */
1007 tlvStruct->type = QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT ;
1008 tlvStruct->length = sizeof(tANI_U32);
1009 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1010 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
1011 configDataValue ) != eSIR_SUCCESS)
1012 {
1013 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1014 "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
1015 goto handle_failure;
1016 }
1017
1018 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1019 + sizeof(tHalCfg) + tlvStruct->length);
1020
1021 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER */
1022 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER ;
1023 tlvStruct->length = sizeof(tANI_U32);
1024 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1025 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_BCN_FILTER,
1026 configDataValue ) != eSIR_SUCCESS)
1027 {
1028 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1029 "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER");
1030 goto handle_failure;
1031 }
1032
1033 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1034 + sizeof(tHalCfg) + tlvStruct->length);
1035
1036 /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR */
1037 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR ;
1038 tlvStruct->length = sizeof(tANI_U32);
1039 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1040 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
1041 configDataValue ) != eSIR_SUCCESS)
1042 {
1043 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1044 "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR");
1045 goto handle_failure;
1046 }
1047
1048 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1049 + sizeof(tHalCfg) + tlvStruct->length);
1050
1051 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
1052 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE ;
1053 tlvStruct->length = sizeof(tANI_U32);
1054 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1055 if(wlan_cfgGetInt(pMac, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE,
1056 configDataValue ) != eSIR_SUCCESS)
1057 {
1058 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1059 "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE");
1060 goto handle_failure;
1061 }
1062
1063 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1064 + sizeof(tHalCfg) + tlvStruct->length);
1065
1066 /* QWLAN_HAL_CFG_STATS_PERIOD */
1067 tlvStruct->type = QWLAN_HAL_CFG_STATS_PERIOD ;
1068 tlvStruct->length = sizeof(tANI_U32);
1069 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1070 if(wlan_cfgGetInt(pMac, WNI_CFG_STATS_PERIOD, configDataValue ) !=
1071 eSIR_SUCCESS)
1072 {
1073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1074 "Failed to get value for WNI_CFG_STATS_PERIOD");
1075 goto handle_failure;
1076 }
1077
1078 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1079 + sizeof(tHalCfg) + tlvStruct->length);
1080
1081 /* QWLAN_HAL_CFG_CFP_MAX_DURATION */
1082 tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION ;
1083 tlvStruct->length = sizeof(tANI_U32);
1084 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1085 if(wlan_cfgGetInt(pMac, WNI_CFG_CFP_MAX_DURATION, configDataValue ) !=
1086 eSIR_SUCCESS)
1087 {
1088 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1089 "Failed to get value for WNI_CFG_CFP_MAX_DURATION");
1090 goto handle_failure;
1091 }
1092
1093 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1094 + sizeof(tHalCfg) + tlvStruct->length) ;
1095
1096 /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */
1097 tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED ;
1098 tlvStruct->length = sizeof(tANI_U32);
1099 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1100 vos_mem_copy(configDataValue, &wdaContext->frameTransRequired,
1101 sizeof(tANI_U32));
1102
1103 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1104 + sizeof(tHalCfg) + tlvStruct->length) ;
1105
1106 /* QWLAN_HAL_CFG_DTIM_PERIOD */
1107 tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD ;
1108 tlvStruct->length = sizeof(tANI_U32);
1109 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1110 if(wlan_cfgGetInt(pMac, WNI_CFG_DTIM_PERIOD, configDataValue)
1111 != eSIR_SUCCESS)
1112 {
1113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1114 "Failed to get value for WNI_CFG_DTIM_PERIOD");
1115 goto handle_failure;
1116 }
1117
1118 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1119 + sizeof(tHalCfg) + tlvStruct->length) ;
1120
1121 /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */
1122 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK ;
1123 strLength = WNI_CFG_EDCA_WME_ACBK_LEN;
1124 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1125 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBK, (tANI_U8 *)configDataValue,
1126 &strLength) != eSIR_SUCCESS)
1127 {
1128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1129 "Failed to get value for WNI_CFG_EDCA_WME_ACBK");
1130 goto handle_failure;
1131 }
1132 tlvStruct->length = strLength;
1133 /* calculate the pad bytes to have the CFG in aligned format */
1134 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1135 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
1136
1137 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1138 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
1139
1140 /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */
1141 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE ;
1142 strLength = WNI_CFG_EDCA_WME_ACBE_LEN;
1143 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1144 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBE, (tANI_U8 *)configDataValue,
1145 &strLength) != eSIR_SUCCESS)
1146 {
1147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1148 "Failed to get value for WNI_CFG_EDCA_WME_ACBE");
1149 goto handle_failure;
1150 }
1151 tlvStruct->length = strLength;
1152 /* calculate the pad bytes to have the CFG in aligned format */
1153 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1154 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
1155
1156 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1157 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
1158
1159 /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */
1160 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO ;
1161 strLength = WNI_CFG_EDCA_WME_ACVI_LEN;
1162 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1163 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVO, (tANI_U8 *)configDataValue,
1164 &strLength) != eSIR_SUCCESS)
1165 {
1166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1167 "Failed to get value for WNI_CFG_EDCA_WME_ACVI");
1168 goto handle_failure;
1169 }
1170 tlvStruct->length = strLength;
1171 /* calculate the pad bytes to have the CFG in aligned format */
1172 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1173 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
1174
1175 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1176 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
1177
1178 /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */
1179 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI ;
1180 strLength = WNI_CFG_EDCA_WME_ACVO_LEN;
1181 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1182 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVI, (tANI_U8 *)configDataValue,
1183 &strLength) != eSIR_SUCCESS)
1184 {
1185 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1186 "Failed to get value for WNI_CFG_EDCA_WME_ACVO");
1187 goto handle_failure;
1188 }
1189 tlvStruct->length = strLength;
1190 /* calculate the pad bytes to have the CFG in aligned format */
1191 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1192 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
1193
1194 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1195 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
1196
1197 /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */
1198 tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH ;
1199 tlvStruct->length = sizeof(tANI_U32);
1200 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1201 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_THRESHOLD_HIGH, configDataValue)
1202 != eSIR_SUCCESS)
1203 {
1204 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1205 "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH");
1206 goto handle_failure;
1207 }
1208
1209 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1210 + sizeof(tHalCfg) + tlvStruct->length) ;
1211
1212 /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */
1213 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS ;
1214 tlvStruct->length = sizeof(tANI_U32);
1215 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1216 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_BUFFERS, configDataValue)
1217 != eSIR_SUCCESS)
1218 {
1219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1220 "Failed to get value for WNI_CFG_MAX_BA_BUFFERS");
1221 goto handle_failure;
1222 }
1223
1224 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1225 + sizeof(tHalCfg) + tlvStruct->length) ;
1226
1227 /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */
1228 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE ;
1229 tlvStruct->length = sizeof(tANI_U32);
1230 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1231 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_PS_POLL_VALUE, configDataValue)
1232 != eSIR_SUCCESS)
1233 {
1234 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1235 "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE");
1236 goto handle_failure;
1237 }
1238
1239 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1240 + sizeof(tHalCfg) + tlvStruct->length) ;
1241
1242 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */
1243 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI ;
1244 tlvStruct->length = sizeof(tANI_U32);
1245 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1246 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI, configDataValue)
1247 != eSIR_SUCCESS)
1248 {
1249 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1250 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI");
1251 goto handle_failure;
1252 }
1253 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1254 + sizeof(tHalCfg) + tlvStruct->length) ;
1255
1256 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */
1257 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS ;
1258 tlvStruct->length = sizeof(tANI_U32);
1259 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1260 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS, configDataValue)
1261 != eSIR_SUCCESS)
1262 {
1263 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1264 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS");
1265 goto handle_failure;
1266 }
1267 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1268 + sizeof(tHalCfg) + tlvStruct->length) ;
1269
1270 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */
1271 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI ;
1272 tlvStruct->length = sizeof(tANI_U32);
1273 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1274 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI, configDataValue)
1275 != eSIR_SUCCESS)
1276 {
1277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1278 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI");
1279 goto handle_failure;
1280 }
1281 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1282 + sizeof(tHalCfg) + tlvStruct->length) ;
1283
1284 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */
1285 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS ;
1286 tlvStruct->length = sizeof(tANI_U32);
1287 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1288 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS, configDataValue)
1289 != eSIR_SUCCESS)
1290 {
1291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1292 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS");
1293 goto handle_failure;
1294 }
1295 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1296 + sizeof(tHalCfg) + tlvStruct->length) ;
1297
1298 /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */
1299 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN ;
1300 tlvStruct->length = sizeof(tANI_U32);
1301 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1302 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, configDataValue)
1303 != eSIR_SUCCESS)
1304 {
1305 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1306 "Failed to get value for WNI_CFG_TELE_BCN_WAKEUP_EN");
1307 goto handle_failure;
1308 }
1309 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1310 + sizeof(tHalCfg) + tlvStruct->length) ;
1311
1312 /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */
1313 tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD ;
1314 tlvStruct->length = sizeof(tANI_U32);
1315 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1316 if(wlan_cfgGetInt(pMac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, configDataValue)
1317 != eSIR_SUCCESS)
1318 {
1319 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1320 "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
1321 goto handle_failure;
1322 }
1323
1324 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1325 + sizeof(tHalCfg) + tlvStruct->length) ;
1326
1327 /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/
1328 tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE ;
1329 tlvStruct->length = sizeof(tANI_U32);
1330 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1331 if(wlan_cfgGetInt(pMac, WNI_CFG_TX_PWR_CTRL_ENABLE, configDataValue)
1332 != eSIR_SUCCESS)
1333 {
1334 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1335 "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE");
1336 goto handle_failure;
1337 }
1338
1339 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1340 + sizeof(tHalCfg) + tlvStruct->length) ;
1341
1342 /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP */
1343 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP ;
1344 tlvStruct->length = sizeof(tANI_U32);
1345 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1346 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_CLOSE_LOOP, configDataValue)
1347 != eSIR_SUCCESS)
1348 {
1349 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1350 "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP");
1351 goto handle_failure;
1352 }
1353
1354 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1355 + sizeof(tHalCfg) + tlvStruct->length) ;
1356 /* QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT */
1357 tlvStruct->type = QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT ;
1358 tlvStruct->length = sizeof(tANI_U32);
1359 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1360 if(wlan_cfgGetInt(pMac, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT,
1361 configDataValue ) != eSIR_SUCCESS)
1362 {
1363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1364 "Failed to get value for WNI_CFG_AP_KEEP_ALIVE_TIMEOUT");
1365 goto handle_failure;
1366 }
1367
1368 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1369 + sizeof(tHalCfg) + tlvStruct->length) ;
1370 /* QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT */
1371 tlvStruct->type = QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT ;
1372 tlvStruct->length = sizeof(tANI_U32);
1373 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1374 if(wlan_cfgGetInt(pMac, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT,
1375 configDataValue ) != eSIR_SUCCESS)
1376 {
1377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1378 "Failed to get value for WNI_CFG_GO_KEEP_ALIVE_TIMEOUT");
1379 goto handle_failure;
1380 }
1381
1382 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1383 + sizeof(tHalCfg) + tlvStruct->length) ;
1384
1385 /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary,
1386 * but are from the WLAN_INI_FILE file. However, this is the only parameter download routine
1387 * into FW, so the parameters are added here.
1388 */
1389
1390 /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */
1391 tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE ;
1392 tlvStruct->length = sizeof(tANI_U32);
1393 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1394 *configDataValue = pMac->btc.btcConfig.btcExecutionMode;
1395 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1396 + sizeof(tHalCfg) + tlvStruct->length) ;
1397
1398 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */
1399 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK ;
1400 tlvStruct->length = sizeof(tANI_U32);
1401 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1402 *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp;
1403 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1404 + sizeof(tHalCfg) + tlvStruct->length) ;
1405
1406 /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */
1407 tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS ;
1408 tlvStruct->length = sizeof(tANI_U32);
1409 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1410 *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp;
1411 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1412 + sizeof(tHalCfg) + tlvStruct->length) ;
1413
1414 /* [COEX] QWLAN_HAL_CFG_WCNSS_API_VERSION */
1415 tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION ;
1416 tlvStruct->length = sizeof(tANI_U32);
1417 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1418 WDI_GetWcnssCompiledApiVersion(&wcnssCompiledApiVersion);
1419 *configDataValue = WLAN_HAL_CONSTRUCT_API_VERSION(wcnssCompiledApiVersion.major,
1420 wcnssCompiledApiVersion.minor,
1421 wcnssCompiledApiVersion.version,
1422 wcnssCompiledApiVersion.revision);
1423 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1424 + sizeof(tHalCfg) + tlvStruct->length) ;
1425
1426 wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
1427
1428#ifdef WLAN_DEBUG
1429 {
1430 int i;
1431
1432 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1433 "****** Dumping CFG TLV ***** ");
1434 for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8)
1435 {
1436 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1437 "%02x %02x %02x %02x %02x %02x %02x %02x",
1438 tlvStructStart[i],
1439 tlvStructStart[i+1],
1440 tlvStructStart[i+2],
1441 tlvStructStart[i+3],
1442 tlvStructStart[i+4],
1443 tlvStructStart[i+5],
1444 tlvStructStart[i+6],
1445 tlvStructStart[i+7]);
1446 }
1447 /* Dump the bytes in the last line*/
1448 for (; i < wdiStartParams->usConfigBufferLen; i++)
1449 {
1450 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1451 "%02x ",tlvStructStart[i]);
1452 }
1453 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1454 "**************************** ");
1455 }
1456#endif
1457
1458 return VOS_STATUS_SUCCESS ;
1459
1460handle_failure:
1461 vos_mem_free(configParam);
1462 return VOS_STATUS_E_FAILURE;
1463}
1464
1465/*
1466 * FUNCTION: WDA_wdiCompleteCB
1467 * call the voss call back function
1468 */
1469void WDA_stopCallback(WDI_Status status, v_PVOID_t *pVosContext)
1470{
1471 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
1472
1473 if (NULL == wdaContext)
1474 {
1475 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1476 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1477 return ;
1478 }
1479
1480 /* free the config structure */
1481 if(wdaContext->wdaWdiApiMsgParam != NULL)
1482 {
1483 vos_mem_free(wdaContext->wdaWdiApiMsgParam);
1484 wdaContext->wdaWdiApiMsgParam = NULL;
1485 }
1486
1487 if(WDI_STATUS_SUCCESS != status)
1488 {
1489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1490 "WDI stop callback returned failure" );
1491 VOS_ASSERT(0) ;
1492 }
1493 else
1494 {
1495 wdaContext->wdaState = WDA_STOP_STATE;
1496 }
1497
1498 /* Indicate VOSS about the start complete */
1499 vos_WDAComplete_cback(pVosContext);
1500
1501 return ;
1502}
1503
1504/*
1505 * FUNCTION: WDA_stop
1506 * call WDI_stop
1507 */
1508
1509VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
1510{
1511 WDI_Status wdiStatus;
1512 VOS_STATUS status = VOS_STATUS_SUCCESS;
1513 WDI_StopReqParamsType *wdiStopReq;
1514 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
1515
1516 if (NULL == pWDA)
1517 {
1518 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1519 "%s: Invoked with invalid pWDA", __FUNCTION__ );
1520 VOS_ASSERT(0);
1521 return VOS_STATUS_E_FAILURE;
1522 }
1523
1524 /* FTM mode stay START_STATE */
1525 if( (WDA_READY_STATE != pWDA->wdaState) &&
1526 (WDA_INIT_STATE != pWDA->wdaState) &&
1527 (WDA_START_STATE != pWDA->wdaState) )
1528 {
1529 VOS_ASSERT(0);
1530 }
1531
1532 wdiStopReq = (WDI_StopReqParamsType *)
1533 vos_mem_malloc(sizeof(WDI_StopReqParamsType));
1534 if(NULL == wdiStopReq)
1535 {
1536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1537 "%s: VOS MEM Alloc Failure", __FUNCTION__);
1538 VOS_ASSERT(0);
1539 return VOS_STATUS_E_NOMEM;
1540 }
1541
1542 wdiStopReq->wdiStopReason = reason;
1543 wdiStopReq->wdiReqStatusCB = NULL;
1544
1545 if(NULL != pWDA->wdaWdiApiMsgParam)
1546 {
1547 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1548 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
1549 VOS_ASSERT(0);
1550 vos_mem_free(wdiStopReq);
1551 return VOS_STATUS_E_FAILURE;
1552 }
1553
1554 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
1555 {
1556 wdaDestroyTimers(pWDA);
1557 }
1558 pWDA->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
1559
1560 /* call WDI stop */
1561 wdiStatus = WDI_Stop(wdiStopReq,
1562 (WDI_StopRspCb)WDA_stopCallback, pVosContext);
1563
1564 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
1565 {
1566 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1567 "error in WDA Stop" );
1568 vos_mem_free(pWDA->wdaWdiApiMsgParam);
1569 pWDA->wdaWdiApiMsgParam = NULL;
1570 status = VOS_STATUS_E_FAILURE;
1571 }
1572
1573 return status;
1574}
1575
1576/*
1577 * FUNCTION: WDA_close
1578 * call WDI_close and free the WDA context
1579 */
1580VOS_STATUS WDA_close(v_PVOID_t pVosContext)
1581{
1582 WDI_Status status = WDI_STATUS_SUCCESS;
1583 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
1584
1585 if (NULL == wdaContext)
1586 {
1587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1588 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1589 return VOS_STATUS_E_FAILURE;
1590 }
1591
1592 if((WDA_INIT_STATE != wdaContext->wdaState) &&
1593 (WDA_STOP_STATE != wdaContext->wdaState))
1594 {
1595 VOS_ASSERT(0);
1596 }
1597
1598 /*call WDI close*/
1599 status = WDI_Close();
1600 if ( status != WDI_STATUS_SUCCESS )
1601 {
1602 status = VOS_STATUS_E_FAILURE;
1603 }
1604
1605 wdaContext->wdaState = WDA_CLOSE_STATE;
1606
1607 /* Destroy the events */
1608 status = vos_event_destroy(&wdaContext->wdaWdiEvent);
1609 if(!VOS_IS_STATUS_SUCCESS(status))
1610 {
1611 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1612 "WDI Sync Event destroy failed - status = %d\n", status);
1613 status = VOS_STATUS_E_FAILURE;
1614 }
1615
1616 status = vos_event_destroy(&wdaContext->txFrameEvent);
1617 if(!VOS_IS_STATUS_SUCCESS(status))
1618 {
1619 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1620 "VOS Event destroy failed - status = %d\n", status);
1621 status = VOS_STATUS_E_FAILURE;
1622 }
1623 status = vos_event_destroy(&wdaContext->suspendDataTxEvent);
1624 if(!VOS_IS_STATUS_SUCCESS(status))
1625 {
1626 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1627 "VOS Event destroy failed - status = %d\n", status);
1628 status = VOS_STATUS_E_FAILURE;
1629 }
1630 status = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
1631 if(!VOS_IS_STATUS_SUCCESS(status))
1632 {
1633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1634 "VOS Event destroy failed - status = %d\n", status);
1635 status = VOS_STATUS_E_FAILURE;
1636 }
1637
1638 /* free WDA context */
1639 status = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
1640 if ( !VOS_IS_STATUS_SUCCESS(status) )
1641 {
1642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1643 "error in WDA close " );
1644 status = VOS_STATUS_E_FAILURE;
1645 }
1646 return status;
1647}
1648
1649/*
1650 * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
1651 * returns 1 if the compiled version is greater than or equal to the input version
1652 */
1653
1654uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1655{
1656 VOS_STATUS status = VOS_STATUS_SUCCESS;
1657 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1658 tSirVersionType compiledVersion;
1659
1660 status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
1661
1662 if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
1663 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
1664 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
1665 (compiledVersion.revision >= revision)))
1666 return 1;
1667 else
1668 return 0;
1669}
1670
1671/*
1672 * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
1673 * returns 1 if the compiled version is greater than or equal to the input version
1674 */
1675
1676uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1677{
1678 VOS_STATUS status = VOS_STATUS_SUCCESS;
1679 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1680 tSirVersionType reportedVersion;
1681
1682 status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
1683
1684 if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
1685 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
1686 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
1687 (reportedVersion.revision >= revision)))
1688 return 1;
1689 else
1690 return 0;
1691}
1692
1693/*
1694 * FUNCTION: WDA_GetWcnssWlanCompiledVersion
1695 * Returns the version of the WCNSS WLAN API with which the HOST
1696 * device driver was compiled
1697 */
1698VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx,
1699 tSirVersionType *pVersion)
1700{
1701 tWDA_CbContext *pWDA;
1702
1703 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1704 "%s: Entered", __FUNCTION__);
1705
1706 if ((NULL == pvosGCtx) || (NULL == pVersion))
1707 {
1708 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1709 "%s: Invoked with invalid parameter", __FUNCTION__);
1710 VOS_ASSERT(0);
1711 return VOS_STATUS_E_FAILURE;
1712 }
1713
1714 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1715 if (NULL == pWDA )
1716 {
1717 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1718 "%s: Invalid WDA context", __FUNCTION__);
1719 VOS_ASSERT(0);
1720 return VOS_STATUS_E_FAILURE;
1721 }
1722
1723 *pVersion = pWDA->wcnssWlanCompiledVersion;
1724 return VOS_STATUS_SUCCESS;
1725}
1726
1727/*
1728 * FUNCTION: WDA_GetWcnssWlanReportedVersion
1729 * Returns the version of the WCNSS WLAN API with which the WCNSS
1730 * device driver was compiled
1731 */
1732VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx,
1733 tSirVersionType *pVersion)
1734{
1735 tWDA_CbContext *pWDA;
1736
1737 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1738 "%s: Entered", __FUNCTION__);
1739
1740 if ((NULL == pvosGCtx) || (NULL == pVersion))
1741 {
1742 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1743 "%s: Invoked with invalid parameter", __FUNCTION__);
1744 VOS_ASSERT(0);
1745 return VOS_STATUS_E_FAILURE;
1746 }
1747
1748 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1749 if (NULL == pWDA )
1750 {
1751 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1752 "%s: Invalid WDA context", __FUNCTION__);
1753 VOS_ASSERT(0);
1754 return VOS_STATUS_E_FAILURE;
1755 }
1756
1757 *pVersion = pWDA->wcnssWlanReportedVersion;
1758 return VOS_STATUS_SUCCESS;
1759}
1760
1761/*
1762 * FUNCTION: WDA_GetWcnssSoftwareVersion
1763 * Returns the WCNSS Software version string
1764 */
1765VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
1766 tANI_U8 *pVersion,
1767 tANI_U32 versionBufferSize)
1768{
1769 tWDA_CbContext *pWDA;
1770
1771 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1772 "%s: Entered", __FUNCTION__);
1773
1774 if ((NULL == pvosGCtx) || (NULL == pVersion))
1775 {
1776 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1777 "%s: Invoked with invalid parameter", __FUNCTION__);
1778 VOS_ASSERT(0);
1779 return VOS_STATUS_E_FAILURE;
1780 }
1781
1782 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1783 if (NULL == pWDA )
1784 {
1785 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1786 "%s: Invalid WDA context", __FUNCTION__);
1787 VOS_ASSERT(0);
1788 return VOS_STATUS_E_FAILURE;
1789 }
1790
1791 wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
1792 return VOS_STATUS_SUCCESS;
1793}
1794
1795/*
1796 * FUNCTION: WDA_GetWcnssHardwareVersion
1797 * Returns the WCNSS Hardware version string
1798 */
1799VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx,
1800 tANI_U8 *pVersion,
1801 tANI_U32 versionBufferSize)
1802{
1803 tWDA_CbContext *pWDA;
1804
1805 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1806 "%s: Entered", __FUNCTION__);
1807
1808 if ((NULL == pvosGCtx) || (NULL == pVersion))
1809 {
1810 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1811 "%s: Invoked with invalid parameter", __FUNCTION__);
1812 VOS_ASSERT(0);
1813 return VOS_STATUS_E_FAILURE;
1814 }
1815
1816 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1817 if (NULL == pWDA )
1818 {
1819 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1820 "%s: Invalid WDA context", __FUNCTION__);
1821 VOS_ASSERT(0);
1822 return VOS_STATUS_E_FAILURE;
1823 }
1824
1825 wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
1826 return VOS_STATUS_SUCCESS;
1827}
1828
1829/*
1830 * FUNCTION: WDA_WniCfgDnld
1831 * Trigger CFG Download
1832 */
1833VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA)
1834{
1835 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
1836
1837 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
1838
1839 v_VOID_t *pFileImage = NULL;
1840 v_SIZE_t cbFileImageSize = 0;
1841
1842 v_VOID_t *pCfgBinary = NULL;
1843 v_SIZE_t cbCfgBinarySize = 0;
1844
1845 v_BOOL_t bStatus = VOS_FALSE;
1846
1847 if (NULL == pMac )
1848 {
1849 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1850 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
1851 VOS_ASSERT(0);
1852 return VOS_STATUS_E_FAILURE;
1853 }
1854
1855 /* get the number of bytes in the CFG Binary... */
1856 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL,
1857 &cbFileImageSize );
1858 if ( VOS_STATUS_E_NOMEM != vosStatus )
1859 {
1860 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1861 "Error obtaining binary size" );
1862 goto fail;
1863 }
1864
1865 // malloc a buffer to read in the Configuration binary file.
1866 pFileImage = vos_mem_malloc( cbFileImageSize );
1867
1868 if ( NULL == pFileImage )
1869 {
1870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1871 "Unable to allocate memory for the CFG binary [size= %d bytes]",
1872 cbFileImageSize );
1873
1874 vosStatus = VOS_STATUS_E_NOMEM;
1875 goto fail;
1876 }
1877
1878 /* Get the entire CFG file image... */
1879 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage,
1880 &cbFileImageSize );
1881 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1882 {
1883 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1884 "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]",
1885 cbFileImageSize );
1886 goto fail;
1887 }
1888
1889 /*
1890 * Validate the binary image. This function will return a pointer
1891 * and length where the CFG binary is located within the binary image file.
1892 */
1893 bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize,
1894 &pCfgBinary, &cbCfgBinarySize );
1895 if ( VOS_FALSE == bStatus )
1896 {
1897 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1898 "Error: Cannot find STA CFG in binary image file" );
1899 vosStatus = VOS_STATUS_E_FAILURE;
1900 goto fail;
1901 }
1902
1903 /*
1904 * TODO: call the config download function
1905 * for now calling the existing cfg download API
1906 */
1907 processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
1908
1909 if( pFileImage != NULL )
1910 {
1911 vos_mem_free( pFileImage );
1912 }
1913 return vosStatus;
1914
1915fail:
1916 if(pCfgBinary != NULL)
1917 vos_mem_free( pFileImage );
1918
1919 return vosStatus;
1920}
1921
1922/* -----------------------------------------------------------------
1923 * WDI interface
1924 * -----------------------------------------------------------------
1925 */
1926
1927/*
1928 * FUNCTION: WDA_suspendDataTxCallback
1929 * call back function called from TL after suspend Transmission
1930 */
1931VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx,
1932 v_U8_t* ucSTAId,
1933 VOS_STATUS vosStatus)
1934{
1935 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1936
1937 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1938 "%s: Entered " ,__FUNCTION__);
1939
1940 if (NULL == pWDA )
1941 {
1942 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1943 "%s: Invoked with invalid WDA context ", __FUNCTION__ );
1944 VOS_ASSERT(0);
1945 return VOS_STATUS_E_FAILURE;
1946 }
1947 if(VOS_IS_STATUS_SUCCESS(vosStatus))
1948 {
1949 pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS;
1950 }
1951 else
1952 {
1953 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1954 }
1955
1956 /* Trigger the event to bring the WDA TL suspend function to come
1957 * out of wait*/
1958 vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
1959 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1960 {
1961 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1962 "NEW VOS Event Set failed - status = %d \n", vosStatus);
1963 }
1964
1965 /* If TL suspended had timedout before this callback was called, resume back
1966 * TL.*/
1967 if (pWDA->txSuspendTimedOut)
1968 {
1969 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1970 "Late TLSuspendCallback, resuming TL back again\n");
1971 WDA_ResumeDataTx(pWDA);
1972 pWDA->txSuspendTimedOut = FALSE;
1973 }
1974
1975 return VOS_STATUS_SUCCESS;
1976}
1977
1978/*
1979 * FUNCTION: WDA_suspendDataTx
1980 * Update TL to suspend the data Transmission
1981 */
1982VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA)
1983{
1984 VOS_STATUS status = VOS_STATUS_E_FAILURE;
1985 tANI_U8 eventIdx = 0;
1986 tANI_U8 ucSTAId = 0;
1987
1988 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1989 "%s: Entered " ,__FUNCTION__);
1990
1991 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1992
1993 if (pWDA->txSuspendTimedOut)
1994 {
1995 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1996 "TL suspend timedout previously, CB not called yet\n");
1997 return status;
1998 }
1999
2000 /* Reset the event to be not signalled */
2001 status = vos_event_reset(&pWDA->suspendDataTxEvent);
2002 if(!VOS_IS_STATUS_SUCCESS(status))
2003 {
2004 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2005 "VOS Event reset failed - status = %d\n",status);
2006 return VOS_STATUS_E_FAILURE;
2007 }
2008
2009 /*Indicate TL to suspend transmission for all Sta Id */
2010 ucSTAId = WLAN_ALL_STA;
2011 status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
2012 WDA_SuspendDataTxCallback);
2013 if(status != VOS_STATUS_SUCCESS)
2014 {
2015 return status;
2016 }
2017
2018 /* Wait for the event to be set by the TL, to get the response of
2019 * suspending the TX queues, this event should be set by the Callback
2020 * function called by TL*/
2021 status = vos_wait_events(&pWDA->suspendDataTxEvent, 1,
2022 WDA_TL_SUSPEND_TIMEOUT, &eventIdx);
2023 if(!VOS_IS_STATUS_SUCCESS(status))
2024 {
2025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2026 "%s: Status %d when waiting for Suspend Data TX Event",
2027 __FUNCTION__, status);
2028 /* Set this flag to true when TL suspend times out, so that when TL
2029 * suspend eventually happens and calls the callback, TL can be resumed
2030 * right away by looking at this flag when true.*/
2031 pWDA->txSuspendTimedOut = TRUE;
2032 }
2033 else
2034 {
2035 pWDA->txSuspendTimedOut = FALSE;
2036 }
2037
2038 if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
2039 {
2040 status = VOS_STATUS_SUCCESS;
2041 }
2042
2043 return status;
2044}
2045
2046/*
2047 * FUNCTION: WDA_resumeDataTx
2048 * Update TL to resume the data Transmission
2049 */
2050VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA)
2051{
2052 VOS_STATUS status = VOS_STATUS_SUCCESS;
2053 tANI_U8 ucSTAId = 0;
2054
2055 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2056 "%s: Entered " ,__FUNCTION__);
2057 ucSTAId = WLAN_ALL_STA;
2058 status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
2059 return status;
2060}
2061
2062/*
2063 * FUNCTION: WDA_InitScanReqCallback
2064 * Trigger Init SCAN callback
2065 */
2066void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2067{
2068 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2069 tWDA_CbContext *pWDA;
2070 tInitScanParams *pWDA_ScanParam ;
2071 VOS_STATUS status;
2072
2073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2074 "<------ %s " ,__FUNCTION__);
2075 if(NULL == pWdaParams)
2076 {
2077 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2078 "%s: pWdaParams received NULL", __FUNCTION__);
2079 VOS_ASSERT(0) ;
2080 return ;
2081 }
2082 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2083 pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
2084
2085 if(NULL == pWDA_ScanParam)
2086 {
2087 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2088 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2089 VOS_ASSERT(0) ;
2090 return ;
2091 }
2092
2093 if(WDI_STATUS_SUCCESS != wdiStatus)
2094 {
2095 status = WDA_ResumeDataTx(pWDA) ;
2096
2097 if(VOS_STATUS_SUCCESS != status)
2098 {
2099 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2100 "%s error in Resume Tx ", __FUNCTION__ );
2101 }
2102 }
2103
2104 /* free WDI command buffer */
2105 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2106
2107 vos_mem_free(pWdaParams) ;
2108
2109
2110 /* assign status to scan params */
2111 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
2112
2113 /* send SCAN RSP message back to PE */
2114 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
2115
2116 return ;
2117}
2118
2119/*
2120 * FUNCTION: WDA_ProcessInitScanReq
2121 * Trigger Init SCAN in DAL
2122 */
2123VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA,
2124 tInitScanParams *initScanParams)
2125{
2126 WDI_Status status = WDI_STATUS_SUCCESS ;
2127 WDI_InitScanReqParamsType *wdiInitScanParam =
2128 (WDI_InitScanReqParamsType *)vos_mem_malloc(
2129 sizeof(WDI_InitScanReqParamsType)) ;
2130 tWDA_ReqParams *pWdaParams;
2131 tANI_U8 i = 0;
2132
2133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2134 "------> %s " ,__FUNCTION__);
2135
2136 if(NULL == wdiInitScanParam)
2137 {
2138 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2139 "%s:VOS MEM Alloc Failure", __FUNCTION__);
2140 VOS_ASSERT(0);
2141 return VOS_STATUS_E_NOMEM;
2142 }
2143
2144 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2145 if(NULL == pWdaParams)
2146 {
2147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2148 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2149 VOS_ASSERT(0);
2150 vos_mem_free(wdiInitScanParam);
2151 return VOS_STATUS_E_NOMEM;
2152 }
2153
2154 /* Copy init Scan params to WDI structure */
2155 wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ;
2156 vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid,
2157 sizeof(tSirMacAddr)) ;
2158 wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ;
2159 wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ;
2160 wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ;
2161#ifdef WLAN_FEATURE_P2P
2162 wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA;
2163 wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration;
2164#else
2165 wdiInitScanParam->wdiReqInfo.bUseNOA = 0;
2166 wdiInitScanParam->wdiReqInfo.scanDuration = 0;
2167#endif
2168 wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt =
2169 initScanParams->scanEntry.activeBSScnt ;
2170
2171 for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
2172 {
2173 wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2174 initScanParams->scanEntry.bssIdx[i] ;
2175 }
2176
2177 /* if Frame length, copy macMgmtHdr or WDI structure */
2178 if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength)
2179 {
2180 vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr,
2181 &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ;
2182 }
2183 wdiInitScanParam->wdiReqStatusCB = NULL ;
2184
2185
2186 /* Store Init Req pointer, as this will be used for response */
2187 pWdaParams->pWdaContext = pWDA;
2188 pWdaParams->wdaMsgParam = initScanParams;
2189 pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
2190
2191 /* first try to suspend TX */
2192 status = WDA_SuspendDataTx(pWDA) ;
2193
2194 if(WDI_STATUS_SUCCESS != status)
2195 {
2196 goto handleWdiFailure;
2197 }
2198
2199 /* call DAL API to pass init scan request to DAL */
2200 status = WDI_InitScanReq(wdiInitScanParam,
2201 WDA_InitScanReqCallback, pWdaParams) ;
2202
2203 if(IS_WDI_STATUS_FAILURE(status))
2204 {
2205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2206 "error in WDA Init Scan, Resume Tx " );
2207 status = WDA_ResumeDataTx(pWDA) ;
2208
2209 VOS_ASSERT(0) ;
2210
2211 goto handleWdiFailure;
2212 }
2213
2214 return CONVERT_WDI2VOS_STATUS(status) ;
2215
2216handleWdiFailure:
2217 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2218 "Failure in WDI Api, free all the memory " );
2219 /* free WDI command buffer */
2220 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2221 vos_mem_free(pWdaParams) ;
2222
2223 /* send Failure to PE */
2224 initScanParams->status = eSIR_FAILURE ;
2225 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
2226
2227 return CONVERT_WDI2VOS_STATUS(status) ;
2228}
2229
2230
2231/*
2232 * FUNCTION: WDA_StartScanReqCallback
2233 * send Start SCAN RSP back to PE
2234 */
2235void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp,
2236 void* pUserData)
2237{
2238 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2239 tWDA_CbContext *pWDA;
2240 tStartScanParams *pWDA_ScanParam;
2241 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2242 "<------ %s " ,__FUNCTION__);
2243
2244 if(NULL == pWdaParams)
2245 {
2246 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2247 "%s: pWdaParams received NULL", __FUNCTION__);
2248 VOS_ASSERT(0) ;
2249 return ;
2250 }
2251 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2252 pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
2253
2254 if(NULL == pWDA_ScanParam)
2255 {
2256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2257 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2258 VOS_ASSERT(0) ;
2259 return ;
2260 }
2261
2262 if(NULL == pWdaParams->wdaWdiApiMsgParam)
2263 {
2264 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2265 "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
2266 VOS_ASSERT(0) ;
2267 return ;
2268 }
2269
2270 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2271 vos_mem_free(pWdaParams) ;
2272
2273
2274 /* assign status to scan params */
2275 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
2276
2277 /* send SCAN RSP message back to PE */
2278 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
2279
2280 return ;
2281}
2282
2283
2284
2285/*
2286 * FUNCTION: WDA_ProcessStartScanReq
2287 * Trigger start SCAN in WDI
2288 */
2289VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA,
2290 tStartScanParams *startScanParams)
2291{
2292 WDI_Status status = WDI_STATUS_SUCCESS;
2293 WDI_StartScanReqParamsType *wdiStartScanParams =
2294 (WDI_StartScanReqParamsType *)vos_mem_malloc(
2295 sizeof(WDI_StartScanReqParamsType)) ;
2296 tWDA_ReqParams *pWdaParams;
2297
2298 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2299 "------> %s " ,__FUNCTION__);
2300
2301 if(NULL == wdiStartScanParams)
2302 {
2303 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2304 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2305 VOS_ASSERT(0);
2306 return VOS_STATUS_E_NOMEM;
2307 }
2308 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2309 if(NULL == pWdaParams)
2310 {
2311 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2312 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2313 VOS_ASSERT(0);
2314 vos_mem_free(wdiStartScanParams);
2315 return VOS_STATUS_E_NOMEM;
2316 }
2317
2318 /* Copy init Scan params to WDI structure */
2319 wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
2320 wdiStartScanParams->wdiReqStatusCB = NULL ;
2321
2322
2323 /* Store Init Req pointer, as this will be used for response */
2324 /* store Params pass it to WDI */
2325 pWdaParams->pWdaContext = pWDA;
2326 pWdaParams->wdaMsgParam = startScanParams;
2327 pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
2328
2329 /* call DAL API to pass init scan request to DAL */
2330 status = WDI_StartScanReq(wdiStartScanParams,
2331 WDA_StartScanReqCallback, pWdaParams) ;
2332
2333 /* failure returned by WDI API */
2334 if(IS_WDI_STATUS_FAILURE(status))
2335 {
2336 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2337 "Failure in Start Scan WDI API, free all the memory "
2338 "It should be due to previous abort scan." );
2339 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2340 vos_mem_free(pWdaParams) ;
2341 startScanParams->status = eSIR_FAILURE ;
2342 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
2343 }
2344
2345 return CONVERT_WDI2VOS_STATUS(status) ;
2346}
2347
2348/*
2349 * FUNCTION: WDA_EndScanReqCallback
2350 * END SCAN callback
2351 */
2352void WDA_EndScanReqCallback(WDI_Status status, void* pUserData)
2353{
2354 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2355 tWDA_CbContext *pWDA;
2356 tEndScanParams *endScanParam;
2357 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2358 "<------ %s " ,__FUNCTION__);
2359
2360 if(NULL == pWdaParams)
2361 {
2362 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2363 "%s: pWdaParams received NULL", __FUNCTION__);
2364 VOS_ASSERT(0) ;
2365 return ;
2366 }
2367 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2368 endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
2369
2370 if(NULL == endScanParam)
2371 {
2372 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2373 "%s: endScanParam received NULL", __FUNCTION__);
2374 VOS_ASSERT(0) ;
2375 return ;
2376 }
2377
2378 /* Free WDI command buffer */
2379 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2380 vos_mem_free(pWdaParams) ;
2381
2382 /* assign status to scan params */
2383 endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
2384
2385 /* send response back to PE */
2386 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
2387 return ;
2388}
2389
2390
2391/*
2392 * FUNCTION: WDA_ProcessEndScanReq
2393 * Trigger END SCAN in WDI
2394 */
2395VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA,
2396 tEndScanParams *endScanParams)
2397{
2398 WDI_Status status = WDI_STATUS_SUCCESS;
2399 WDI_EndScanReqParamsType *wdiEndScanParams =
2400 (WDI_EndScanReqParamsType *)vos_mem_malloc(
2401 sizeof(WDI_EndScanReqParamsType)) ;
2402 tWDA_ReqParams *pWdaParams ;
2403
2404 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2405 "------> %s " ,__FUNCTION__);
2406
2407 if(NULL == wdiEndScanParams)
2408 {
2409 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2410 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2411 VOS_ASSERT(0);
2412 return VOS_STATUS_E_NOMEM;
2413 }
2414 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2415 if(NULL == pWdaParams)
2416 {
2417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2418 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2419 VOS_ASSERT(0);
2420 vos_mem_free(wdiEndScanParams);
2421 return VOS_STATUS_E_NOMEM;
2422 }
2423
2424 /* Copy init Scan params to WDI structure */
2425 wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
2426 wdiEndScanParams->wdiReqStatusCB = NULL ;
2427
2428 /* Store Init Req pointer, as this will be used for response */
2429 /* store Params pass it to WDI */
2430 pWdaParams->pWdaContext = pWDA;
2431 pWdaParams->wdaMsgParam = endScanParams;
2432 pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
2433
2434 /* call DAL API to pass init scan request to DAL */
2435 status = WDI_EndScanReq(wdiEndScanParams,
2436 WDA_EndScanReqCallback, pWdaParams) ;
2437
2438 if(IS_WDI_STATUS_FAILURE(status))
2439 {
2440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2441 "Failure in End Scan WDI API, free all the memory "
2442 "It should be due to previous abort scan." );
2443 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2444 vos_mem_free(pWdaParams) ;
2445 endScanParams->status = eSIR_FAILURE ;
2446 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
2447 }
2448
2449 return CONVERT_WDI2VOS_STATUS(status) ;
2450}
2451
2452/*
2453 * FUNCTION: WDA_FinishScanReqCallback
2454 * Trigger Finish SCAN callback
2455 */
2456void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2457{
2458 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2459 tWDA_CbContext *pWDA;
2460 tFinishScanParams *finishScanParam;
2461 VOS_STATUS status;
2462
2463 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2464 "<------ %s " ,__FUNCTION__);
2465
2466 if(NULL == pWdaParams)
2467 {
2468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2469 "%s: pWdaParams received NULL", __FUNCTION__);
2470 VOS_ASSERT(0) ;
2471 return ;
2472 }
2473
2474 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2475 finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
2476
2477 if(NULL == finishScanParam)
2478 {
2479 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2480 "%s: finishScanParam is NULL", __FUNCTION__);
2481 VOS_ASSERT(0) ;
2482 return ;
2483 }
2484
2485 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2486 vos_mem_free(pWdaParams) ;
2487
2488 /*
2489 * Now Resume TX, if we reached here means, TX is already suspended, we
2490 * have to resume it unconditionaly
2491 */
2492 status = WDA_ResumeDataTx(pWDA) ;
2493
2494 if(VOS_STATUS_SUCCESS != status)
2495 {
2496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2497 "%s error in Resume Tx ", __FUNCTION__ );
2498 }
2499
2500 finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
2501
2502 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
2503 return ;
2504}
2505
2506/*
2507 * FUNCTION: WDA_ProcessFinshScanReq
2508 * Trigger Finish SCAN in WDI
2509 */
2510VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA,
2511 tFinishScanParams *finishScanParams)
2512{
2513 WDI_Status status = WDI_STATUS_SUCCESS;
2514 WDI_FinishScanReqParamsType *wdiFinishScanParams =
2515 (WDI_FinishScanReqParamsType *)vos_mem_malloc(
2516 sizeof(WDI_FinishScanReqParamsType)) ;
2517 tWDA_ReqParams *pWdaParams ;
2518 tANI_U8 i = 0;
2519 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2520 "------> %s " ,__FUNCTION__);
2521
2522 if(NULL == wdiFinishScanParams)
2523 {
2524 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2525 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2526 VOS_ASSERT(0);
2527 return VOS_STATUS_E_NOMEM;
2528 }
2529 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2530 if(NULL == pWdaParams)
2531 {
2532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2533 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2534 VOS_ASSERT(0);
2535 vos_mem_free(wdiFinishScanParams);
2536 return VOS_STATUS_E_NOMEM;
2537 }
2538
2539 /* Copy init Scan params to WDI structure */
2540 wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
2541 vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID,
2542 finishScanParams->bssid, sizeof(tSirMacAddr)) ;
2543
2544 wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
2545 wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
2546 wdiFinishScanParams->wdiReqInfo.ucFrameLength =
2547 finishScanParams->frameLength ;
2548 wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel =
2549 finishScanParams->currentOperChannel ;
2550 wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
2551 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt =
2552 finishScanParams->scanEntry.activeBSScnt ;
2553
2554 for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
2555 {
2556 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2557 finishScanParams->scanEntry.bssIdx[i] ;
2558 }
2559
2560
2561
2562 /* if Frame length, copy macMgmtHdr ro WDI structure */
2563 if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
2564 {
2565 vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr,
2566 &finishScanParams->macMgmtHdr,
2567 sizeof(WDI_MacMgmtHdr)) ;
2568 }
2569 wdiFinishScanParams->wdiReqStatusCB = NULL ;
2570
2571 /* Store Init Req pointer, as this will be used for response */
2572 /* store Params pass it to WDI */
2573 pWdaParams->pWdaContext = pWDA;
2574 pWdaParams->wdaMsgParam = finishScanParams;
2575 pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
2576
2577 /* call DAL API to pass init scan request to DAL */
2578 status = WDI_FinishScanReq(wdiFinishScanParams,
2579 WDA_FinishScanReqCallback, pWdaParams) ;
2580
2581
2582 /*
2583 * WDI API returns failure..
2584 */
2585 if(IS_WDI_STATUS_FAILURE( status))
2586 {
2587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2588 "Failure in Finish Scan WDI API, free all the memory " );
2589 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2590 vos_mem_free(pWdaParams) ;
2591
2592 finishScanParams->status = eSIR_FAILURE ;
2593 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
2594 }
2595
2596 return CONVERT_WDI2VOS_STATUS(status) ;
2597}
2598
2599/*---------------------------------------------------------------------
2600 * ASSOC API's
2601 *---------------------------------------------------------------------
2602 */
2603
2604/*
2605 * FUNCTION: WDA_JoinReqCallback
2606 * Trigger Init SCAN callback
2607 */
2608void WDA_JoinReqCallback(WDI_Status status, void* pUserData)
2609{
2610 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2611 tWDA_CbContext *pWDA;
2612 tSwitchChannelParams *joinReqParam;
2613
2614 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2615 "<------ %s " ,__FUNCTION__);
2616
2617 if(NULL == pWdaParams)
2618 {
2619 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2620 "%s: pWdaParams received NULL", __FUNCTION__);
2621 VOS_ASSERT(0) ;
2622 return ;
2623 }
2624 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2625 joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2626
2627 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2628 vos_mem_free(pWdaParams) ;
2629
2630 /* reset macBSSID */
2631 vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
2632
2633 /* reset macSTASelf */
2634 vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
2635
2636 joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
2637
2638 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
2639
2640 return ;
2641}
2642
2643/*
2644 * FUNCTION: WDA_ProcessJoinReq
2645 * Trigger Join REQ in WDI
2646 */
2647
2648VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA,
2649 tSwitchChannelParams* joinReqParam)
2650{
2651 WDI_Status status = WDI_STATUS_SUCCESS ;
2652
2653 WDI_JoinReqParamsType *wdiJoinReqParam =
2654 (WDI_JoinReqParamsType *)vos_mem_malloc(
2655 sizeof(WDI_JoinReqParamsType)) ;
2656 tWDA_ReqParams *pWdaParams ;
2657
2658 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2659 "------> %s " ,__FUNCTION__);
2660
2661 if(NULL == wdiJoinReqParam)
2662 {
2663 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2664 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2665 VOS_ASSERT(0);
2666 return VOS_STATUS_E_NOMEM;
2667 }
2668 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2669 if(NULL == pWdaParams)
2670 {
2671 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2672 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2673 VOS_ASSERT(0);
2674 vos_mem_free(wdiJoinReqParam);
2675 return VOS_STATUS_E_NOMEM;
2676 }
2677
2678 /* copy the BSSID for pWDA */
2679 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID,
2680 sizeof(tSirMacAddr)) ;
2681
2682 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf,
2683 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
2684
2685 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel =
2686 joinReqParam->channelNumber ;
2687#ifndef WLAN_FEATURE_VOWIFI
2688 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint =
2689 joinReqParam->localPowerConstraint ;
2690#endif
2691 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset =
2692 joinReqParam->secondaryChannelOffset ;
2693 wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
2694
2695 wdiJoinReqParam->wdiReqStatusCB = NULL ;
2696
2697 /* Store Init Req pointer, as this will be used for response */
2698 /* store Params pass it to WDI */
2699 pWdaParams->pWdaContext = pWDA;
2700 pWdaParams->wdaMsgParam = joinReqParam;
2701 pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
2702
2703 status = WDI_JoinReq(wdiJoinReqParam,
2704 (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
2705
2706 if(IS_WDI_STATUS_FAILURE(status))
2707 {
2708 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2709 "Failure in Join WDI API, free all the memory " );
2710 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2711 vos_mem_free(pWdaParams) ;
2712 joinReqParam->status = eSIR_FAILURE ;
2713 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2714 }
2715
2716 return CONVERT_WDI2VOS_STATUS(status) ;
2717}
2718
2719/*
2720 * FUNCTION: WDA_SwitchChannelReqCallback
2721 * send Switch channel RSP back to PE
2722 */
2723void WDA_SwitchChannelReqCallback(
2724 WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData)
2725{
2726 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
2727 tWDA_CbContext *pWDA;
2728 tSwitchChannelParams *pSwitchChanParams;
2729
2730 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2731 "<------ %s " ,__FUNCTION__);
2732 if(NULL == pWdaParams)
2733 {
2734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2735 "%s: pWdaParams received NULL", __FUNCTION__);
2736 VOS_ASSERT(0) ;
2737 return ;
2738 }
2739 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2740 pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2741
2742#ifdef WLAN_FEATURE_VOWIFI
2743 pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower;
2744#endif
2745
2746 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2747 vos_mem_free(pWdaParams) ;
2748
2749 pSwitchChanParams->status =
2750 CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
2751
2752 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
2753
2754 return ;
2755}
2756
2757/*
2758 * FUNCTION: WDA_ProcessChannelSwitchReq
2759 * Request to WDI to switch channel REQ params.
2760 */
2761VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA,
2762 tSwitchChannelParams *pSwitchChanParams)
2763{
2764 WDI_Status status = WDI_STATUS_SUCCESS ;
2765 WDI_SwitchChReqParamsType *wdiSwitchChanParam =
2766 (WDI_SwitchChReqParamsType *)vos_mem_malloc(
2767 sizeof(WDI_SwitchChReqParamsType)) ;
2768 tWDA_ReqParams *pWdaParams ;
2769
2770 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2771 "------> %s " ,__FUNCTION__);
2772
2773 if(NULL == wdiSwitchChanParam)
2774 {
2775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2776 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2777 VOS_ASSERT(0);
2778 return VOS_STATUS_E_NOMEM;
2779 }
2780 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2781 if(NULL == pWdaParams)
2782 {
2783 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2784 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2785 VOS_ASSERT(0);
2786 vos_mem_free(wdiSwitchChanParam);
2787 return VOS_STATUS_E_NOMEM;
2788 }
2789
2790 wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
2791#ifndef WLAN_FEATURE_VOWIFI
2792 wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint =
2793 pSwitchChanParams->localPowerConstraint;
2794#endif
2795 wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset =
2796 pSwitchChanParams->secondaryChannelOffset;
2797 wdiSwitchChanParam->wdiReqStatusCB = NULL ;
2798
2799 /* Store req pointer, as this will be used for response */
2800 /* store Params pass it to WDI */
2801 pWdaParams->pWdaContext = pWDA;
2802 pWdaParams->wdaMsgParam = pSwitchChanParams;
2803 pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
2804
2805#ifdef WLAN_FEATURE_VOWIFI
2806 wdiSwitchChanParam->wdiChInfo.cMaxTxPower
2807 = pSwitchChanParams->maxTxPower;
2808 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr,
2809 pSwitchChanParams ->selfStaMacAddr,
2810 sizeof(tSirMacAddr));
2811#endif
2812 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId,
2813 pSwitchChanParams->bssId,
2814 sizeof(tSirMacAddr));
2815
2816 status = WDI_SwitchChReq(wdiSwitchChanParam,
2817 (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
2818
2819 if(IS_WDI_STATUS_FAILURE(status))
2820 {
2821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2822 "Failure in process channel switch Req WDI API, free all the memory " );
2823 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2824 vos_mem_free(pWdaParams) ;
2825 pSwitchChanParams->status = eSIR_FAILURE ;
2826 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
2827 }
2828
2829 return CONVERT_WDI2VOS_STATUS(status) ;
2830}
2831
2832/*
2833 * FUNCTION: WDA_ConfigBssReqCallback
2834 * config BSS Req Callback, called by WDI
2835 */
2836void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp
2837 ,void* pUserData)
2838{
2839 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2840 tWDA_CbContext *pWDA;
2841 tAddBssParams *configBssReqParam;
2842 tAddStaParams *staConfigBssParam;
2843
2844 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2845 "<------ %s " ,__FUNCTION__);
2846 if(NULL == pWdaParams)
2847 {
2848 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2849 "%s: pWdaParams received NULL", __FUNCTION__);
2850 VOS_ASSERT(0) ;
2851 return ;
2852 }
2853 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2854 configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
2855 staConfigBssParam = &configBssReqParam->staContext ;
2856
2857 configBssReqParam->status =
2858 CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
2859
2860 if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
2861 {
2862 vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID,
2863 sizeof(tSirMacAddr));
2864
2865 configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2866 configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
2867 configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
2868
2869 if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA)
2870 {
2871 if(configBssReqParam->bssType == eSIR_IBSS_MODE)
2872 {
2873 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE;
2874 staConfigBssParam->staType = STA_ENTRY_BSSID;
2875 }
2876 else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) &&
2877 (staConfigBssParam->staType == STA_ENTRY_SELF))
2878 {
2879 /* This is the 1st add BSS Req for the BTAMP STA */
2880 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2881 staConfigBssParam->staType = STA_ENTRY_BSSID;
2882 }
2883 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2884 (staConfigBssParam->staType == STA_ENTRY_PEER))
2885 {
2886 /* This is the 2nd ADD BSS Request that is sent
2887 * on the BTAMP STA side. The Sta type is
2888 * set to STA_ENTRY_PEER here.*/
2889 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2890 }
2891 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2892 (staConfigBssParam->staType == STA_ENTRY_SELF))
2893 {
2894 /* statype is already set by PE.
2895 * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/
2896 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE;
2897 staConfigBssParam->staType = STA_ENTRY_BSSID;
2898 }
2899 else
2900 {
2901 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE;
2902 staConfigBssParam->staType = STA_ENTRY_PEER;
2903 }
2904 }
2905 else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP)
2906 {
2907 pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE;
2908 staConfigBssParam->staType = STA_ENTRY_SELF;
2909 }
2910 else
2911 {
2912 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2913 "Invalid operation mode specified");
2914 VOS_ASSERT(0);
2915 }
2916
2917 staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
2918
2919 staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2920
2921 staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
2922
2923 staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
2924
2925 vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
2926 sizeof(tSirMacAddr));
2927 staConfigBssParam->txChannelWidthSet =
2928 configBssReqParam->txChannelWidthSet;
2929
2930 if(staConfigBssParam->staType == STA_ENTRY_PEER &&
2931 staConfigBssParam->htCapable)
2932 {
2933 pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx =
2934 wdiConfigBssRsp->ucBSSIdx;
2935 pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex =
2936 WDA_VALID_STA_INDEX ;
2937 }
2938
2939 if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
2940 wdiConfigBssRsp->ucBSSIdx,
2941 wdiConfigBssRsp->ucSTAIdx))
2942 {
2943 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2944 "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
2945 VOS_ASSERT(0) ;
2946 }
2947
2948 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
2949 {
2950 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2951 "%s: add BSS into mempool fail", __FUNCTION__);
2952 VOS_ASSERT(0) ;
2953 }
2954
2955#ifdef WLAN_FEATURE_VOWIFI
2956 configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
2957#endif
2958 }
2959
2960 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2961 vos_mem_free(pWdaParams) ;
2962
2963 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
2964
2965 return ;
2966}
2967
2968/*
2969 * FUNCTION: WDA_UpdateEdcaParamsForAC
2970 * Update WDI EDCA params with PE edca params
2971 */
2972void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA,
2973 WDI_EdcaParamRecord *wdiEdcaParam,
2974 tSirMacEdcaParamRecord *macEdcaParam)
2975{
2976 wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn;
2977 wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm;
2978 wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci;
2979 wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min;
2980 wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
2981 wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
2982}
2983
2984/*
2985 * FUNCTION: WDA_ProcessConfigBssReq
2986 * Configure BSS before starting Assoc with AP
2987 */
2988VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA,
2989 tAddBssParams* configBssReqParam)
2990{
2991 WDI_Status status = WDI_STATUS_SUCCESS ;
2992
2993 WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
2994 (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
2995 sizeof(WDI_ConfigBSSReqParamsType)) ;
2996 tWDA_ReqParams *pWdaParams ;
2997
2998 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2999 "------> %s " ,__FUNCTION__);
3000
3001 if(NULL == wdiConfigBssReqParam)
3002 {
3003 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3004 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3005 VOS_ASSERT(0);
3006 return VOS_STATUS_E_NOMEM;
3007 }
3008 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3009 if(NULL == pWdaParams)
3010 {
3011 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3012 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3013 VOS_ASSERT(0);
3014 vos_mem_free(wdiConfigBssReqParam);
3015 return VOS_STATUS_E_NOMEM;
3016 }
3017
3018 vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
3019
3020 WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo,
3021 configBssReqParam) ;
3022
3023 /* Store Init Req pointer, as this will be used for response */
3024 /* store Params pass it to WDI */
3025 pWdaParams->pWdaContext = pWDA;
3026 pWdaParams->wdaMsgParam = configBssReqParam;
3027 pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
3028
3029 status = WDI_ConfigBSSReq(wdiConfigBssReqParam,
3030 (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
3031
3032 if(IS_WDI_STATUS_FAILURE(status))
3033 {
3034 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3035 "Failure in Config BSS WDI API, free all the memory " );
3036 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3037 vos_mem_free(pWdaParams) ;
3038
3039 configBssReqParam->status = eSIR_FAILURE ;
3040
3041 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
3042 }
3043
3044 return CONVERT_WDI2VOS_STATUS(status) ;
3045}
3046
3047#ifdef ENABLE_HAL_COMBINED_MESSAGES
3048/*
3049 * FUNCTION: WDA_PostAssocReqCallback
3050 * Post ASSOC req callback, send RSP back to PE
3051 */
3052void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp,
3053 void* pUserData)
3054{
3055 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
3056 tPostAssocParams *postAssocReqParam =
3057 (tPostAssocParams *)pWDA->wdaMsgParam ;
3058 /*STA context within the BSS Params*/
3059 tAddStaParams *staPostAssocParam =
3060 &postAssocReqParam->addBssParams.staContext ;
3061 /*STA Params for self STA*/
3062 tAddStaParams *selfStaPostAssocParam =
3063 &postAssocReqParam->addStaParams ;
3064
3065 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3066 "<------ %s " ,__FUNCTION__);
3067
3068 postAssocReqParam->status =
3069 CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
3070
3071 if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
3072 {
3073 staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
3074 vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA,
3075 sizeof(tSirMacAddr)) ;
3076 staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
3077 staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
3078 staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
3079
3080 selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
3081 }
3082 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
3083 pWDA->wdaWdiApiMsgParam = NULL;
3084 pWDA->wdaMsgParam = NULL;
3085
3086 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
3087
3088 return ;
3089}
3090
3091/*
3092 * FUNCTION: WDA_ProcessPostAssocReq
3093 * Trigger POST ASSOC processing in WDI
3094 */
3095VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA,
3096 tPostAssocParams *postAssocReqParam)
3097{
3098
3099 WDI_Status status = WDI_STATUS_SUCCESS ;
3100
3101 WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
3102 (WDI_PostAssocReqParamsType *)vos_mem_malloc(
3103 sizeof(WDI_PostAssocReqParamsType)) ;
3104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3105 "------> %s " ,__FUNCTION__);
3106
3107
3108 if(NULL == wdiPostAssocReqParam)
3109 {
3110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3111 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3112 VOS_ASSERT(0);
3113 return VOS_STATUS_E_NOMEM;
3114 }
3115
3116 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
3117 {
3118 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3119 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
3120 VOS_ASSERT(0);
3121 return VOS_STATUS_E_FAILURE;
3122 }
3123
3124
3125 /* update BSS params into WDI structure */
3126 WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams,
3127 &postAssocReqParam->addBssParams) ;
3128 /* update STA params into WDI structure */
3129 WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams,
3130 &postAssocReqParam->addStaParams) ;
3131
3132 wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid =
3133 postAssocReqParam->addBssParams.highPerformance;
3134 WDA_UpdateEdcaParamsForAC(pWDA,
3135 &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams,
3136 &postAssocReqParam->addBssParams.acbe);
3137 WDA_UpdateEdcaParamsForAC(pWDA,
3138 &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams,
3139 &postAssocReqParam->addBssParams.acbk);
3140 WDA_UpdateEdcaParamsForAC(pWDA,
3141 &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams,
3142 &postAssocReqParam->addBssParams.acvi);
3143 WDA_UpdateEdcaParamsForAC(pWDA,
3144 &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
3145 &postAssocReqParam->addBssParams.acvo);
3146
3147 /* Store Init Req pointer, as this will be used for response */
3148 pWDA->wdaMsgParam = (void *)postAssocReqParam ;
3149
3150 /* store Params pass it to WDI */
3151 pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
3152
3153 status = WDI_PostAssocReq(wdiPostAssocReqParam,
3154 (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
3155
3156 if(IS_WDI_STATUS_FAILURE(status))
3157 {
3158 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3159 "Failure in Post Assoc WDI API, free all the memory " );
3160 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
3161 pWDA->wdaWdiApiMsgParam = NULL;
3162 pWDA->wdaMsgParam = NULL;
3163
3164 postAssocReqParam->status = eSIR_FAILURE ;
3165
3166 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
3167 }
3168
3169 return CONVERT_WDI2VOS_STATUS(status) ;
3170}
3171#endif
3172
3173/*
3174 * FUNCTION: WDA_AddStaReqCallback
3175 * ADD STA req callback, send RSP back to PE
3176 */
3177void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp,
3178 void* pUserData)
3179{
3180 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3181 tWDA_CbContext *pWDA;
3182 tAddStaParams *addStaReqParam;
3183
3184 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3185 "<------ %s " ,__FUNCTION__);
3186
3187 if(NULL == pWdaParams)
3188 {
3189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
3190 VOS_ASSERT(0) ;
3191 return ;
3192 }
3193 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3194 addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
3195
3196 addStaReqParam->status =
3197 CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
3198
3199 if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
3200 {
3201 addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
3202 /*TODO: UMAC structure doesn't have these fields*/
3203 /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex;
3204 addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex;
3205 addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */
3206 addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig;
3207 addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig;
3208 /* update staIndex as valid index for BA if STA is HT capable*/
3209 if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable)
3210 {
3211 pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx =
3212 wdiConfigStaRsp->ucBssIdx;
3213 pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex =
3214 WDA_VALID_STA_INDEX ;
3215 }
3216 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx))
3217 {
3218 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3219 "%s: add STA into mempool fail", __FUNCTION__);
3220 VOS_ASSERT(0) ;
3221 return ;
3222 }
3223 }
3224
3225 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
3226 vos_mem_free(pWdaParams) ;
3227
3228 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3229
3230 return ;
3231}
3232
3233/*
3234 * FUNCTION: WDA_ConfigStaReq
3235 * Trigger Config STA processing in WDI
3236 */
3237VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA,
3238 tAddStaParams *addStaReqParam)
3239{
3240
3241 WDI_Status status = WDI_STATUS_SUCCESS ;
3242
3243 WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
3244 (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
3245 sizeof(WDI_ConfigSTAReqParamsType)) ;
3246 tWDA_ReqParams *pWdaParams ;
3247
3248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3249 "------> %s " ,__FUNCTION__);
3250
3251 if(NULL == wdiConfigStaReqParam)
3252 {
3253 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3254 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3255 VOS_ASSERT(0);
3256 return VOS_STATUS_E_NOMEM;
3257 }
3258 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3259 if(NULL == pWdaParams)
3260 {
3261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3262 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3263 VOS_ASSERT(0);
3264 vos_mem_free(wdiConfigStaReqParam);
3265 return VOS_STATUS_E_NOMEM;
3266 }
3267
3268 vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
3269
3270 /* update STA params into WDI structure */
3271 WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo,
3272 addStaReqParam) ;
3273
3274 /* Store Init Req pointer, as this will be used for response */
3275 /* store Params pass it to WDI */
3276 pWdaParams->pWdaContext = pWDA;
3277 pWdaParams->wdaMsgParam = addStaReqParam;
3278 pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
3279
3280 status = WDI_ConfigSTAReq(wdiConfigStaReqParam,
3281 (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
3282
3283 if(IS_WDI_STATUS_FAILURE(status))
3284 {
3285 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3286 "Failure in Config STA WDI API, free all the memory " );
3287 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3288 vos_mem_free(pWdaParams) ;
3289
3290 addStaReqParam->status = eSIR_FAILURE ;
3291
3292 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3293 }
3294
3295 return CONVERT_WDI2VOS_STATUS(status) ;
3296}
3297
3298/*
3299 * FUNCTION: WDA_DelBSSReqCallback
3300 * Dens DEL BSS RSP back to PE
3301 */
3302void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp,
3303 void* pUserData)
3304{
3305 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3306 tWDA_CbContext *pWDA;
3307 tDeleteBssParams *delBssReqParam;
3308 tANI_U8 staIdx,tid;
3309
3310 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3311 "<------ %s " ,__FUNCTION__);
3312
3313 if(NULL == pWdaParams)
3314 {
3315 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3316 "%s: pWdaParams received NULL", __FUNCTION__);
3317 VOS_ASSERT(0) ;
3318 return ;
3319 }
3320 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3321 delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
3322
3323 delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
3324
3325 if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
3326 {
3327 vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID,
3328 sizeof(tSirMacAddr)) ;
3329 }
3330
3331 if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
3332 {
3333 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3334 "%s: Get STA index from BSS index Fail", __FUNCTION__);
3335 VOS_ASSERT(0) ;
3336 }
3337
3338 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
3339 {
3340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3341 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3342 VOS_ASSERT(0) ;
3343 }
3344
3345 if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
3346 {
3347 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3348 "%s: Clear STA index form table Fail", __FUNCTION__);
3349 VOS_ASSERT(0) ;
3350 }
3351
3352 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3353 vos_mem_free(pWdaParams) ;
3354
3355 /* reset the the system role*/
3356 pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
3357
3358 /* Reset the BA related information */
3359 for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++)
3360 {
3361 if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx )
3362 {
3363 pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX;
3364 pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0;
3365 /* Reset framesTxed counters here */
3366 for(tid = 0; tid < STACFG_MAX_TC; tid++)
3367 {
3368 pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0;
3369 }
3370 }
3371 }
3372
3373 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
3374
3375 return ;
3376}
3377
3378
3379/*
3380 * FUNCTION: WDA_ProcessDelBssReq
3381 * Init DEL BSS req with WDI
3382 */
3383VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA,
3384 tDeleteBssParams *delBssParam)
3385{
3386 WDI_Status status = WDI_STATUS_SUCCESS ;
3387
3388 WDI_DelBSSReqParamsType *wdiDelBssReqParam =
3389 (WDI_DelBSSReqParamsType *)vos_mem_malloc(
3390 sizeof(WDI_DelBSSReqParamsType)) ;
3391 tWDA_ReqParams *pWdaParams ;
3392
3393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3394 "------> %s " ,__FUNCTION__);
3395
3396 if(NULL == wdiDelBssReqParam)
3397 {
3398 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3399 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3400 VOS_ASSERT(0);
3401 return VOS_STATUS_E_NOMEM;
3402 }
3403 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3404 if(NULL == pWdaParams)
3405 {
3406 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3407 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3408 VOS_ASSERT(0);
3409 vos_mem_free(wdiDelBssReqParam);
3410 return VOS_STATUS_E_NOMEM;
3411 }
3412
3413 wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
3414 wdiDelBssReqParam->wdiReqStatusCB = NULL ;
3415
3416 /* Store Init Req pointer, as this will be used for response */
3417 /* store Params pass it to WDI */
3418 pWdaParams->pWdaContext = pWDA;
3419 pWdaParams->wdaMsgParam = delBssParam;
3420 pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
3421
3422 status = WDI_DelBSSReq(wdiDelBssReqParam,
3423 (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
3424
3425 if(IS_WDI_STATUS_FAILURE(status))
3426 {
3427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3428 "Failure in Del BSS WDI API, free all the memory " );
3429 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3430 vos_mem_free(pWdaParams) ;
3431 delBssParam->status = eSIR_FAILURE ;
3432 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
3433 }
3434
3435 return CONVERT_WDI2VOS_STATUS(status) ;
3436}
3437
3438/*
3439 * FUNCTION: WDA_DelSTAReqCallback
3440 * Dens DEL STA RSP back to PE
3441 */
3442void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp,
3443 void* pUserData)
3444{
3445 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3446 tWDA_CbContext *pWDA;
3447 tDeleteStaParams *delStaReqParam;
3448
3449 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3450 "<------ %s " ,__FUNCTION__);
3451
3452 if(NULL == pWdaParams)
3453 {
3454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3455 "%s: pWdaParams received NULL", __FUNCTION__);
3456 VOS_ASSERT(0) ;
3457 return ;
3458 }
3459 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3460 delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
3461
3462 delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
3463
3464 if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
3465 {
3466 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
3467 {
3468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3469 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3470 VOS_ASSERT(0) ;
3471 }
3472 delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ;
3473 }
3474 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3475 vos_mem_free(pWdaParams) ;
3476
3477 /*Reset the BA information corresponding to this STAIdx */
3478 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex =
3479 WDA_INVALID_STA_INDEX;
3480 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
3481
3482 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
3483
3484 return ;
3485}
3486
3487/*
3488 * FUNCTION: WDA_ProcessDelStaReq
3489 * Init DEL STA req with WDI
3490 */
3491VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA,
3492 tDeleteStaParams *delStaParam)
3493{
3494 WDI_Status status = WDI_STATUS_SUCCESS ;
3495
3496 WDI_DelSTAReqParamsType *wdiDelStaReqParam =
3497 (WDI_DelSTAReqParamsType *)vos_mem_malloc(
3498 sizeof(WDI_DelSTAReqParamsType)) ;
3499 tWDA_ReqParams *pWdaParams ;
3500
3501 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3502 "------> %s " ,__FUNCTION__);
3503
3504 if(NULL == wdiDelStaReqParam)
3505 {
3506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3507 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3508 VOS_ASSERT(0);
3509 return VOS_STATUS_E_NOMEM;
3510 }
3511 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3512 if(NULL == pWdaParams)
3513 {
3514 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3515 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3516 VOS_ASSERT(0);
3517 vos_mem_free(wdiDelStaReqParam);
3518 return VOS_STATUS_E_NOMEM;
3519 }
3520
3521 wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
3522 wdiDelStaReqParam->wdiReqStatusCB = NULL ;
3523
3524 /* Store Init Req pointer, as this will be used for response */
3525 /* store Params pass it to WDI */
3526 pWdaParams->pWdaContext = pWDA;
3527 pWdaParams->wdaMsgParam = delStaParam;
3528 pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
3529
3530 status = WDI_DelSTAReq(wdiDelStaReqParam,
3531 (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
3532
3533 if(IS_WDI_STATUS_FAILURE(status))
3534 {
3535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3536 "Failure in Del STA WDI API, free all the memory status = %d",
3537 status );
3538 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3539 vos_mem_free(pWdaParams) ;
3540 delStaParam->status = eSIR_FAILURE ;
3541 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
3542 }
3543
3544 return CONVERT_WDI2VOS_STATUS(status) ;
3545}
3546
3547void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
3548{
3549 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3550 tWDA_CbContext *pWDA;
3551 tAddStaSelfParams *pAddStaSelfRsp = NULL;
3552 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3553 "<------ %s " ,__FUNCTION__);
3554 if(NULL == pWdaParams)
3555 {
3556 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3557 "%s: pWdaParams received NULL", __FUNCTION__);
3558 VOS_ASSERT(0) ;
3559 return ;
3560 }
3561 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3562 pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
3563
3564 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3565 vos_mem_free(pWdaParams);
3566
3567 pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
3568 vos_mem_copy(pAddStaSelfRsp->selfMacAddr,
3569 pwdiAddSTASelfRsp->macSelfSta,
3570 sizeof(pAddStaSelfRsp->selfMacAddr));
3571
3572 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
3573
3574 return ;
3575}
3576
3577/*
3578 * FUNCTION: WDA_ProcessAddStaSelfReq
3579 *
3580 */
3581VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq)
3582{
3583 VOS_STATUS status = VOS_STATUS_SUCCESS;
3584 WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq =
3585 (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
3586 sizeof(WDI_AddSTASelfReqParamsType)) ;
3587 tWDA_ReqParams *pWdaParams;
3588
3589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3590 "------> %s " ,__FUNCTION__);
3591 if( NULL == wdiAddStaSelfReq )
3592 {
3593 VOS_ASSERT( 0 );
3594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3595 "%s: Unable to allocate memory " ,__FUNCTION__);
3596 return( VOS_STATUS_E_NOMEM );
3597 }
3598
3599 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3600
3601 if( NULL == pWdaParams )
3602 {
3603 VOS_ASSERT( 0 );
3604 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3605 "%s: Unable to allocate memory " ,__FUNCTION__);
3606 vos_mem_free(wdiAddStaSelfReq) ;
3607 return( VOS_STATUS_E_NOMEM );
3608 }
3609
3610 wdiAddStaSelfReq->wdiReqStatusCB = NULL;
3611
3612 vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
3613 /* Store Init Req pointer, as this will be used for response */
3614 /* store Params pass it to WDI */
3615 pWdaParams->pWdaContext = pWDA;
3616 pWdaParams->wdaMsgParam = pAddStaSelfReq;
3617 pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq;
3618
3619 status = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
3620
3621 if(IS_WDI_STATUS_FAILURE(status))
3622 {
3623 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3624 "Failure in Add Self Sta Request API, free all the memory status = %d",
3625 status );
3626 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3627 vos_mem_free(pWdaParams) ;
3628 pAddStaSelfReq->status = eSIR_FAILURE ;
3629 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
3630 }
3631
3632 return CONVERT_WDI2VOS_STATUS(status) ;
3633}
3634
3635/*
3636 * FUNCTION: WDA_DelSTASelfRespCallback
3637 *
3638 */
3639void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType *
3640 wdiDelStaSelfRspParams , void* pUserData)
3641{
3642 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3643 tWDA_CbContext *pWDA;
3644 tDelStaSelfParams *delStaSelfParams;
3645
3646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3647 "<------ %s " ,__FUNCTION__);
3648
3649 if (NULL == pWdaParams)
3650 {
3651 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3652 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3653 VOS_ASSERT(0);
3654 return;
3655 }
3656
3657 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3658 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3659
3660 delStaSelfParams->status =
3661 CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
3662
3663 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3664 vos_mem_free(pWdaParams) ;
3665
3666 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3667
3668 return ;
3669}
3670
3671/*
3672 * FUNCTION: WDA_DelSTASelfReqCallback
3673 *
3674 */
3675void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus,
3676 void* pUserData)
3677{
3678 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3679 tWDA_CbContext *pWDA;
3680 tDelStaSelfParams *delStaSelfParams;
3681
3682 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3683 "<------ %s, wdiStatus: %d pWdaParams: 0x%x",
3684 __FUNCTION__, wdiStatus, pWdaParams);
3685
3686 if (NULL == pWdaParams)
3687 {
3688 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3689 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3690 VOS_ASSERT(0);
3691 return;
3692 }
3693
3694 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3695 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3696
3697 delStaSelfParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
3698
3699 if(IS_WDI_STATUS_FAILURE(wdiStatus))
3700 {
3701 VOS_ASSERT(0);
3702 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3703 vos_mem_free(pWdaParams) ;
3704 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3705 }
3706
3707 return ;
3708}
3709
3710/*
3711 * FUNCTION: WDA_DelSTASelfReq
3712 * Trigger Config STA processing in WDI
3713 */
3714VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA,
3715 tDelStaSelfParams* pDelStaSelfReqParam)
3716{
3717 VOS_STATUS status = VOS_STATUS_SUCCESS;
3718 tWDA_ReqParams *pWdaParams = NULL;
3719 WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq =
3720 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
3721 sizeof(WDI_DelSTASelfReqParamsType)) ;
3722
3723
3724 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3725 "------> %s " ,__FUNCTION__);
3726 if( NULL == wdiDelStaSelfReq )
3727 {
3728 VOS_ASSERT( 0 );
3729 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3730 "%s: Unable to allocate memory " ,__FUNCTION__);
3731 return( VOS_STATUS_E_NOMEM );
3732 }
3733
3734 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3735 if( NULL == pWdaParams )
3736 {
3737 VOS_ASSERT( 0 );
3738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3739 "%s: Unable to allocate memory " ,__FUNCTION__);
3740 vos_mem_free(wdiDelStaSelfReq) ;
3741 return( VOS_STATUS_E_NOMEM );
3742 }
3743
3744 pWdaParams->pWdaContext = pWDA;
3745 /* Store param pointer as passed in by caller */
3746 pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
3747 /* store Params pass it to WDI */
3748 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
3749
3750 vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr,
3751 pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
3752
3753 wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback;
3754 wdiDelStaSelfReq->pUserData = pWdaParams;
3755
3756 status = WDI_DelSTASelfReq(wdiDelStaSelfReq,
3757 (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams);
3758
3759 if(IS_WDI_STATUS_FAILURE(status))
3760 {
3761 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
3762 "Failure in Del Sta Self REQ WDI API, free all the memory " );
3763 VOS_ASSERT(0);
3764 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3765 vos_mem_free(pWdaParams) ;
3766 pDelStaSelfReqParam->status = eSIR_FAILURE ;
3767 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
3768 }
3769
3770 return CONVERT_WDI2VOS_STATUS(status) ;
3771}
3772
3773
3774
3775/*
3776 * FUNCTION: WDA_SendMsg
3777 * Send Message back to PE
3778 */
3779void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
3780 void *pBodyptr, tANI_U32 bodyVal)
3781{
3782 tSirMsgQ msg = {0} ;
3783 tANI_U32 status = VOS_STATUS_SUCCESS ;
3784 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
3785
3786 msg.type = msgType;
3787 msg.bodyval = bodyVal;
3788 msg.bodyptr = pBodyptr;
3789
3790 status = limPostMsgApi(pMac, &msg);
3791
3792 if (VOS_STATUS_SUCCESS != status)
3793 {
3794 if(NULL != pBodyptr)
3795 {
3796 vos_mem_free(pBodyptr);
3797 }
3798 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3799 "%s: limPostMsgApi is failed " ,__FUNCTION__);
3800 VOS_ASSERT(0) ;
3801 }
3802
3803 return ;
3804}
3805
3806/*
3807 * FUNCTION: WDA_UpdateBSSParams
3808 * Translated WDA/PE BSS info into WDI BSS info..
3809 */
3810void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
3811 WDI_ConfigBSSReqInfoType *wdiBssParams,
3812 tAddBssParams *wdaBssParams)
3813{
3814 v_U8_t keyIndex = 0;
3815
3816 /* copy bssReq Params to WDI structure */
3817 vos_mem_copy(wdiBssParams->macBSSID,
3818 wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
3819 vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr,
3820 sizeof(tSirMacAddr)) ;
3821 wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
3822 wdiBssParams->ucOperMode = wdaBssParams->operMode ;
3823 wdiBssParams->wdiNWType = wdaBssParams->nwType ;
3824
3825 wdiBssParams->ucShortSlotTimeSupported =
3826 wdaBssParams->shortSlotTimeSupported ;
3827
3828 wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ;
3829 wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ;
3830 wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ;
3831 wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ;
3832 wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ;
3833
3834 wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
3835 wdiBssParams->ucTXOPProtectionFullSupport =
3836 wdaBssParams->fLsigTXOPProtectionFullSupport ;
3837
3838 wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
3839 wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
3840
3841 wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
3842
3843 wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
3844 wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
3845 wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
3846 wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
3847
3848 /* copy SSID into WDI structure */
3849 wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
3850 vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
3851 wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
3852
3853 WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext,
3854 &wdaBssParams->staContext) ;
3855
3856 wdiBssParams->wdiAction = wdaBssParams->updateBss;
3857
3858#ifdef WLAN_FEATURE_VOWIFI
3859 wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
3860#endif
3861
3862 wdiBssParams->ucPersona = wdaBssParams->halPersona;
3863
3864 wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
3865
3866#ifdef WLAN_FEATURE_VOWIFI_11R
3867 wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
3868
3869 if(wdiBssParams->bExtSetStaKeyParamValid)
3870 {
3871 /* copy set STA key params to WDI structure */
3872 wdiBssParams->wdiExtSetKeyParam.ucSTAIdx =
3873 wdaBssParams->extSetStaKeyParam.staIdx;
3874 wdiBssParams->wdiExtSetKeyParam.wdiEncType =
3875 wdaBssParams->extSetStaKeyParam.encType;
3876 wdiBssParams->wdiExtSetKeyParam.wdiWEPType =
3877 wdaBssParams->extSetStaKeyParam.wepType;
3878 wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx =
3879 wdaBssParams->extSetStaKeyParam.defWEPIdx;
3880
3881 if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
3882 {
3883 if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == eSIR_WEP_STATIC) &&
3884 (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) &&
3885 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
3886 {
3887 WDA_GetWepKeysFromCfg( pWDA,
3888 &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx,
3889 &wdiBssParams->wdiExtSetKeyParam.ucNumKeys,
3890 wdiBssParams->wdiExtSetKeyParam.wdiKey );
3891 }
3892 else
3893 {
3894#ifdef WLAN_SOFTAP_FEATURE
3895 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3896 keyIndex++)
3897 {
3898 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId =
3899 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId;
3900 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast =
3901 wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
3902 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
3903 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
3904
3905 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
3906 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
3907 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
3908 wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole;
3909 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength =
3910 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength;
3911 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key,
3912 wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
3913 }
3914
3915 wdiBssParams->wdiExtSetKeyParam.ucNumKeys =
3916 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3917#else
3918 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyId =
3919 wdaBssParams->extSetStaKeyParam.key.keyId;
3920 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].unicast =
3921 wdaBssParams->extSetStaKeyParam.key.unicast;
3922 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyDirection =
3923 wdaBssParams->extSetStaKeyParam.key.keyDirection;
3924 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyRsc,
3925 wdaBssParams->extSetStaKeyParam.key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
3926 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].paeRole =
3927 wdaBssParams->extSetStaKeyParam.key.paeRole;
3928 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyLength =
3929 wdaBssParams->extSetStaKeyParam.key.keyLength;
3930 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].key,
3931 wdaBssParams->extSetStaKeyParam.key[keyIndex].key,
3932 SIR_MAC_MAX_KEY_LENGTH);
3933 wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 1;
3934#endif
3935 }
3936 }
3937 wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc;
3938 }
3939 else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */
3940 {
3941 vos_mem_zero( &wdaBssParams->extSetStaKeyParam,
3942 sizeof(wdaBssParams->extSetStaKeyParam) );
3943 }
3944#endif /*WLAN_FEATURE_VOWIFI_11R*/
3945
3946 return ;
3947}
3948
3949/*
3950 * FUNCTION: WDA_UpdateSTAParams
3951 * Translated WDA/PE BSS info into WDI BSS info..
3952 */
3953void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
3954 WDI_ConfigStaReqInfoType *wdiStaParams,
3955 tAddStaParams *wdaStaParams)
3956{
3957 tANI_U8 i = 0;
3958 /* Update STA params */
3959 vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId,
3960 sizeof(tSirMacAddr)) ;
3961 wdiStaParams->usAssocId = wdaStaParams->assocId;
3962 wdiStaParams->wdiSTAType = wdaStaParams->staType;
3963
3964 wdiStaParams->ucShortPreambleSupported =
3965 wdaStaParams->shortPreambleSupported;
3966 vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac,
3967 sizeof(tSirMacAddr)) ;
3968 wdiStaParams->usListenInterval = wdaStaParams->listenInterval;
3969
3970 wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled;
3971
3972 wdiStaParams->ucHTCapable = wdaStaParams->htCapable;
3973 wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet;
3974 wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode;
3975 wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection;
3976 wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize;
3977 wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity;
3978 wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize;
3979
3980 wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
3981 wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
3982
3983 wdiStaParams->wdiSupportedRates.opRateMode =
3984 wdaStaParams->supportedRates.opRateMode;
3985
3986 for(i = 0;i < WDI_NUM_11B_RATES;i++)
3987 {
3988 wdiStaParams->wdiSupportedRates.llbRates[i] =
3989 wdaStaParams->supportedRates.llbRates[i];
3990 }
3991 for(i = 0;i < WDI_NUM_11A_RATES;i++)
3992 {
3993 wdiStaParams->wdiSupportedRates.llaRates[i] =
3994 wdaStaParams->supportedRates.llaRates[i];
3995 }
3996 for(i = 0;i < SIR_NUM_POLARIS_RATES;i++)
3997 {
3998 wdiStaParams->wdiSupportedRates.aLegacyRates[i] =
3999 wdaStaParams->supportedRates.aniLegacyRates[i];
4000 }
4001 wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap =
4002 wdaStaParams->supportedRates.aniEnhancedRateBitmap;
4003 for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
4004 {
4005 wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] =
4006 wdaStaParams->supportedRates.supportedMCSSet[i];
4007 }
4008 wdiStaParams->wdiSupportedRates.aRxHighestDataRate =
4009 wdaStaParams->supportedRates.rxHighestDataRate;
4010
4011 wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled;
4012
4013 wdiStaParams->wdiAction = wdaStaParams->updateSta;
4014
4015 wdiStaParams->ucAPSD = wdaStaParams->uAPSD;
4016 wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen;
4017 wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable;
4018
4019 wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport;
4020 wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration;
4021 wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz;
4022 wdiStaParams->ucEncryptType = wdaStaParams->encryptType;
4023#ifdef WLAN_FEATURE_P2P
4024 wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
4025#endif
4026 return ;
4027}
4028
4029/*
4030 * -------------------------------------------------------------------------
4031 * CFG update to WDI
4032 * -------------------------------------------------------------------------
4033 */
4034
4035 /*
4036 * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
4037 * Convert the WNI CFG ID to HAL CFG ID
4038 */
4039static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U8_t wniCfgId)
4040{
4041 switch(wniCfgId)
4042 {
4043 case WNI_CFG_STA_ID:
4044 return QWLAN_HAL_CFG_STA_ID;
4045 case WNI_CFG_CURRENT_TX_ANTENNA:
4046 return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
4047 case WNI_CFG_CURRENT_RX_ANTENNA:
4048 return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
4049 case WNI_CFG_LOW_GAIN_OVERRIDE:
4050 return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
4051 case WNI_CFG_POWER_STATE_PER_CHAIN:
4052 return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
4053 case WNI_CFG_CAL_PERIOD:
4054 return QWLAN_HAL_CFG_CAL_PERIOD;
4055 case WNI_CFG_CAL_CONTROL:
4056 return QWLAN_HAL_CFG_CAL_CONTROL;
4057 case WNI_CFG_PROXIMITY:
4058 return QWLAN_HAL_CFG_PROXIMITY;
4059 case WNI_CFG_NETWORK_DENSITY:
4060 return QWLAN_HAL_CFG_NETWORK_DENSITY;
4061 case WNI_CFG_MAX_MEDIUM_TIME:
4062 return QWLAN_HAL_CFG_MAX_MEDIUM_TIME;
4063 case WNI_CFG_MAX_MPDUS_IN_AMPDU:
4064 return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU;
4065 case WNI_CFG_RTS_THRESHOLD:
4066 return QWLAN_HAL_CFG_RTS_THRESHOLD;
4067 case WNI_CFG_SHORT_RETRY_LIMIT:
4068 return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT;
4069 case WNI_CFG_LONG_RETRY_LIMIT:
4070 return QWLAN_HAL_CFG_LONG_RETRY_LIMIT;
4071 case WNI_CFG_FRAGMENTATION_THRESHOLD:
4072 return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD;
4073 case WNI_CFG_DYNAMIC_THRESHOLD_ZERO:
4074 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO;
4075 case WNI_CFG_DYNAMIC_THRESHOLD_ONE:
4076 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE;
4077 case WNI_CFG_DYNAMIC_THRESHOLD_TWO:
4078 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO;
4079 case WNI_CFG_FIXED_RATE:
4080 return QWLAN_HAL_CFG_FIXED_RATE;
4081 case WNI_CFG_RETRYRATE_POLICY:
4082 return QWLAN_HAL_CFG_RETRYRATE_POLICY;
4083 case WNI_CFG_RETRYRATE_SECONDARY:
4084 return QWLAN_HAL_CFG_RETRYRATE_SECONDARY;
4085 case WNI_CFG_RETRYRATE_TERTIARY:
4086 return QWLAN_HAL_CFG_RETRYRATE_TERTIARY;
4087 case WNI_CFG_FORCE_POLICY_PROTECTION:
4088 return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION;
4089 case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ:
4090 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ;
4091 case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ:
4092 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ;
4093 case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ:
4094 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ;
4095 case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ:
4096 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ;
4097 case WNI_CFG_MAX_BA_SESSIONS:
4098 return QWLAN_HAL_CFG_MAX_BA_SESSIONS;
4099 case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT:
4100 return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT;
4101 case WNI_CFG_PS_ENABLE_BCN_FILTER:
4102 return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER;
4103 case WNI_CFG_PS_ENABLE_RSSI_MONITOR:
4104 return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR;
4105 case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE:
4106 return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
4107 case WNI_CFG_STATS_PERIOD:
4108 return QWLAN_HAL_CFG_STATS_PERIOD;
4109 case WNI_CFG_CFP_MAX_DURATION:
4110 return QWLAN_HAL_CFG_CFP_MAX_DURATION;
4111#if 0 /*This is not part of CFG*/
4112 case WNI_CFG_FRAME_TRANS_ENABLED:
4113 return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED;
4114#endif
4115 case WNI_CFG_DTIM_PERIOD:
4116 return QWLAN_HAL_CFG_DTIM_PERIOD;
4117 case WNI_CFG_EDCA_WME_ACBK:
4118 return QWLAN_HAL_CFG_EDCA_WMM_ACBK;
4119 case WNI_CFG_EDCA_WME_ACBE:
4120 return QWLAN_HAL_CFG_EDCA_WMM_ACBE;
4121 case WNI_CFG_EDCA_WME_ACVI:
4122 return QWLAN_HAL_CFG_EDCA_WMM_ACVI;
4123 case WNI_CFG_EDCA_WME_ACVO:
4124 return QWLAN_HAL_CFG_EDCA_WMM_ACVO;
4125#if 0
4126 case WNI_CFG_TELE_BCN_WAKEUP_EN:
4127 return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN;
4128 case WNI_CFG_TELE_BCN_TRANS_LI:
4129 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI;
4130 case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS:
4131 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS;
4132 case WNI_CFG_TELE_BCN_MAX_LI:
4133 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI;
4134 case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS:
4135 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS;
4136#endif
4137 case WNI_CFG_ENABLE_CLOSE_LOOP:
4138 return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP;
4139 default:
4140 {
4141 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4142 "There is no HAL CFG Id corresponding to WNI CFG Id: %d\n",
4143 wniCfgId);
4144 return VOS_STATUS_E_INVAL;
4145 }
4146 }
4147}
4148
4149/*
4150 * FUNCTION: WDA_UpdateCfgCallback
4151 *
4152 */
4153void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData)
4154{
4155 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4156 WDI_UpdateCfgReqParamsType *wdiCfgParam =
4157 (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
4158
4159 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4160 "<------ %s " ,__FUNCTION__);
4161
4162 /*
4163 * currently there is no response message is expected between PE and
4164 * WDA, Failure return from WDI is a ASSERT condition
4165 */
4166 if(WDI_STATUS_SUCCESS != wdiStatus)
4167 {
4168 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4169 "%s: CFG (%d) config failure \n", __FUNCTION__,
4170 ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
4171 }
4172
4173 vos_mem_free(wdiCfgParam->pConfigBuffer) ;
4174 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
4175 pWDA->wdaWdiCfgApiMsgParam = NULL;
4176
4177 return ;
4178}
4179
4180/*
4181 * FUNCTION: WDA_UpdateCfg
4182 *
4183 */
4184VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam)
4185{
4186
4187 WDI_Status status = WDI_STATUS_SUCCESS ;
4188 tANI_U32 val =0;
4189 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
4190 tHalCfg *configData;
4191 WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
4192 tANI_U8 *configDataValue;
4193
4194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4195 "------> %s " ,__FUNCTION__);
4196
4197 if (NULL == pMac )
4198 {
4199 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4200 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
4201 return VOS_STATUS_E_FAILURE;
4202 }
4203
4204 if(WDA_START_STATE != pWDA->wdaState)
4205 {
4206 return VOS_STATUS_E_FAILURE;
4207 }
4208
4209 if(NULL != pWDA->wdaWdiCfgApiMsgParam)
4210 {
4211 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4212 "%s:wdaWdiCfgApiMsgParam is not NULL", __FUNCTION__);
4213 VOS_ASSERT(0);
4214 return VOS_STATUS_E_FAILURE;
4215 }
4216
4217 wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
4218 sizeof(WDI_UpdateCfgReqParamsType)) ;
4219
4220 if(NULL == wdiCfgReqParam)
4221 {
4222 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4223 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4224 VOS_ASSERT(0);
4225 return VOS_STATUS_E_NOMEM;
4226 }
4227
4228 wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) +
4229 sizeof(tANI_U32)) ;
4230
4231 if(NULL == wdiCfgReqParam->pConfigBuffer)
4232 {
4233 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4234 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
4235 vos_mem_free(wdiCfgReqParam);
4236 VOS_ASSERT(0);
4237 return VOS_STATUS_E_NOMEM;
4238 }
4239
4240 /*convert the WNI CFG Id to HAL CFG Id*/
4241 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
4242 WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
4243
4244 /*TODO: revisit this for handling string parameters */
4245 if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval,
4246 &val) != eSIR_SUCCESS)
4247 {
4248 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4249 "Failed to cfg get id %d\n", cfgParam->bodyval);
4250 vos_mem_free(wdiCfgReqParam->pConfigBuffer);
4251 vos_mem_free(wdiCfgReqParam);
4252 return eSIR_FAILURE;
4253 }
4254
4255 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
4256 configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
4257 configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
4258 vos_mem_copy( configDataValue, &val, sizeof(tANI_U32));
4259 wdiCfgReqParam->wdiReqStatusCB = NULL ;
4260
4261 /* store Params pass it to WDI */
4262 pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
4263
4264#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
4265 status = WDI_UpdateCfgReq(wdiCfgReqParam,
4266 (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
4267
4268 if(IS_WDI_STATUS_FAILURE(status))
4269 {
4270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4271 "Failure in Update CFG WDI API, free all the memory " );
4272 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
4273 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
4274 pWDA->wdaWdiCfgApiMsgParam = NULL;
4275 /* Failure is not expected */
4276 VOS_ASSERT(0) ;
4277 }
4278#else
4279 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
4280 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
4281 pWDA->wdaWdiCfgApiMsgParam = NULL;
4282#endif
4283 return CONVERT_WDI2VOS_STATUS(status) ;
4284}
4285
4286
4287VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
4288 v_U8_t *pDefaultKeyId,
4289 v_U8_t *pNumKeys,
4290 WDI_KeysType *pWdiKeys )
4291{
4292 v_U32_t i, j, defKeyId = 0;
4293 v_U32_t val = SIR_MAC_KEY_LENGTH;
4294 VOS_STATUS status = WDI_STATUS_SUCCESS;
4295 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
4296
4297 if (NULL == pMac )
4298 {
4299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4300 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
4301 return VOS_STATUS_E_FAILURE;
4302 }
4303
4304 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
4305 &defKeyId ))
4306 {
4307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4308 "Unable to retrieve defaultKeyId from CFG. Defaulting to 0...");
4309 }
4310
4311 *pDefaultKeyId = (v_U8_t)defKeyId;
4312
4313 /* Need to extract ALL of the configured WEP Keys */
4314 for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
4315 {
4316 val = SIR_MAC_KEY_LENGTH;
4317 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
4318 (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i),
4319 pWdiKeys[j].key,
4320 &val ))
4321 {
4322 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4323 "WEP Key index [%d] may not configured in CFG\n",i);
4324 }
4325 else
4326 {
4327 pWdiKeys[j].keyId = (tANI_U8) i;
4328 /*
4329 * Actually, a DC (Don't Care) because
4330 * this is determined (and set) by PE/MLME
4331 */
4332 pWdiKeys[j].unicast = 0;
4333 /*
4334 * Another DC (Don't Care)
4335 */
4336 pWdiKeys[j].keyDirection = eSIR_TX_RX;
4337 /* Another DC (Don't Care). Unused for WEP */
4338 pWdiKeys[j].paeRole = 0;
4339 /* Determined from wlan_cfgGetStr() above.*/
4340 pWdiKeys[j].keyLength = (tANI_U16) val;
4341
4342 j++;
4343 *pNumKeys = (tANI_U8) j;
4344 }
4345 }
4346
4347 return status;
4348}
4349
4350/*
4351 * FUNCTION: WDA_SetBssKeyReqCallback
4352 * send SET BSS key RSP back to PE
4353 */
4354void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData)
4355{
4356 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4357 tWDA_CbContext *pWDA;
4358 tSetBssKeyParams *setBssKeyParams;
4359
4360 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4361 "<------ %s " ,__FUNCTION__);
4362 if(NULL == pWdaParams)
4363 {
4364 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4365 "%s: pWdaParams received NULL", __FUNCTION__);
4366 VOS_ASSERT(0) ;
4367 return ;
4368 }
4369 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4370 setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
4371
4372 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4373 vos_mem_free(pWdaParams) ;
4374 setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
4375
4376 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
4377
4378 return ;
4379}
4380
4381/*
4382 * FUNCTION: WDA_ProcessSetBssKeyReq
4383 * Request to WDI for programming the BSS key( key for
4384 * broadcast/multicast frames Encryption)
4385 */
4386VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA,
4387 tSetBssKeyParams *setBssKeyParams )
4388{
4389 WDI_Status status = WDI_STATUS_SUCCESS ;
4390 WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam =
4391 (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
4392 sizeof(WDI_SetBSSKeyReqParamsType)) ;
4393 tWDA_ReqParams *pWdaParams ;
4394
4395 v_U8_t keyIndex;
4396
4397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4398 "------> %s " ,__FUNCTION__);
4399
4400 if(NULL == wdiSetBssKeyParam)
4401 {
4402 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4403 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4404 VOS_ASSERT(0);
4405 return VOS_STATUS_E_NOMEM;
4406 }
4407 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4408 if(NULL == pWdaParams)
4409 {
4410 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4411 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4412 VOS_ASSERT(0);
4413 vos_mem_free(wdiSetBssKeyParam);
4414 return VOS_STATUS_E_NOMEM;
4415 }
4416
4417 vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
4418
4419 /* copy set BSS params to WDI structure */
4420 wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
4421 wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
4422 wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
4423
4424 if(setBssKeyParams->encType != eSIR_ED_NONE)
4425 {
4426 if( setBssKeyParams->numKeys == 0 &&
4427 (( setBssKeyParams->encType == eSIR_ED_WEP40)||
4428 setBssKeyParams->encType == eSIR_ED_WEP104))
4429 {
4430 tANI_U8 defaultKeyId = 0;
4431
4432 WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId,
4433 &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
4434 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
4435 }
4436 else
4437 {
4438 for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++)
4439 {
4440 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId =
4441 setBssKeyParams->key[keyIndex].keyId;
4442 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast =
4443 setBssKeyParams->key[keyIndex].unicast;
4444 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection =
4445 setBssKeyParams->key[keyIndex].keyDirection;
4446 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
4447 setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4448 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole =
4449 setBssKeyParams->key[keyIndex].paeRole;
4450 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength =
4451 setBssKeyParams->key[keyIndex].keyLength;
4452 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key,
4453 setBssKeyParams->key[keyIndex].key,
4454 SIR_MAC_MAX_KEY_LENGTH);
4455 }
4456 }
4457 }
4458
4459 wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc =
4460 setBssKeyParams->singleTidRc;
4461 wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
4462
4463 /* Store set key pointer, as this will be used for response */
4464 /* store Params pass it to WDI */
4465 pWdaParams->pWdaContext = pWDA;
4466 pWdaParams->wdaMsgParam = setBssKeyParams;
4467 pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
4468
4469 status = WDI_SetBSSKeyReq(wdiSetBssKeyParam,
4470 (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
4471
4472 if(IS_WDI_STATUS_FAILURE(status))
4473 {
4474 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4475 "Failure in Set BSS Key Req WDI API, free all the memory " );
4476 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4477 vos_mem_free(pWdaParams) ;
4478 setBssKeyParams->status = eSIR_FAILURE ;
4479 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
4480 }
4481
4482 return CONVERT_WDI2VOS_STATUS(status) ;
4483}
4484
4485/*
4486 * FUNCTION: WDA_RemoveBssKeyReqCallback
4487 * send SET BSS key RSP back to PE
4488 */
4489void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData)
4490{
4491 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4492 tWDA_CbContext *pWDA;
4493 tRemoveBssKeyParams *removeBssKeyParams;
4494
4495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4496 "<------ %s " ,__FUNCTION__);
4497
4498 if(NULL == pWdaParams)
4499 {
4500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4501 "%s: pWdaParams received NULL", __FUNCTION__);
4502 VOS_ASSERT(0) ;
4503 return ;
4504 }
4505 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4506 removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
4507
4508 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4509 vos_mem_free(pWdaParams) ;
4510
4511 removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
4512
4513 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
4514
4515 return ;
4516}
4517
4518/*
4519 * FUNCTION: WDA_ProcessRemoveBssKeyReq
4520 * Request to WDI to remove the BSS key( key for broadcast/multicast
4521 * frames Encryption)
4522 */
4523VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA,
4524 tRemoveBssKeyParams *removeBssKeyParams )
4525{
4526 WDI_Status status = WDI_STATUS_SUCCESS ;
4527 WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam =
4528 (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
4529 sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
4530 tWDA_ReqParams *pWdaParams ;
4531
4532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4533 "------> %s " ,__FUNCTION__);
4534
4535 if(NULL == wdiRemoveBssKeyParam)
4536 {
4537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4538 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4539 VOS_ASSERT(0);
4540 return VOS_STATUS_E_NOMEM;
4541 }
4542 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4543 if(NULL == pWdaParams)
4544 {
4545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4546 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4547 VOS_ASSERT(0);
4548 vos_mem_free(wdiRemoveBssKeyParam);
4549 return VOS_STATUS_E_NOMEM;
4550 }
4551
4552 /* copy Remove BSS key params to WDI structure*/
4553 wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
4554 wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
4555 wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
4556 wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
4557 wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
4558
4559 /* Store remove key pointer, as this will be used for response */
4560 /* store Params pass it to WDI */
4561 pWdaParams->pWdaContext = pWDA;
4562 pWdaParams->wdaMsgParam = removeBssKeyParams;
4563 pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
4564
4565 status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam,
4566 (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
4567
4568 if(IS_WDI_STATUS_FAILURE(status))
4569 {
4570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4571 "Failure in Remove BSS Key Req WDI API, free all the memory " );
4572 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4573 vos_mem_free(pWdaParams) ;
4574 removeBssKeyParams->status = eSIR_FAILURE ;
4575 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
4576 }
4577
4578 return CONVERT_WDI2VOS_STATUS(status) ;
4579}
4580
4581/*
4582 * FUNCTION: WDA_SetBssKeyReqCallback
4583 * send SET BSS key RSP back to PE
4584 */
4585void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData)
4586{
4587 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4588 tWDA_CbContext *pWDA;
4589 tSetStaKeyParams *setStaKeyParams;
4590
4591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4592 "<------ %s " ,__FUNCTION__);
4593 if(NULL == pWdaParams)
4594 {
4595 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR
4596 ,"%s: pWdaParams received NULL", __FUNCTION__);
4597 VOS_ASSERT(0) ;
4598 return ;
4599 }
4600 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4601 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
4602
4603 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4604 vos_mem_free(pWdaParams) ;
4605
4606 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
4607
4608 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
4609
4610 return ;
4611}
4612
4613/*
4614 * FUNCTION: WDA_ProcessSetStaKeyReq
4615 * Request to WDI for programming the STA key( key for Unicast frames
4616 * Encryption)
4617 */
4618VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA,
4619 tSetStaKeyParams *setStaKeyParams )
4620{
4621 WDI_Status status = WDI_STATUS_SUCCESS ;
4622 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4623 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4624 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4625 tWDA_ReqParams *pWdaParams ;
4626
4627 v_U8_t keyIndex;
4628
4629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4630 "------> %s " ,__FUNCTION__);
4631
4632 if(NULL == wdiSetStaKeyParam)
4633 {
4634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4636 VOS_ASSERT(0);
4637 return VOS_STATUS_E_NOMEM;
4638 }
4639 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4640 if(NULL == pWdaParams)
4641 {
4642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4643 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4644 VOS_ASSERT(0);
4645 vos_mem_free(wdiSetStaKeyParam);
4646 return VOS_STATUS_E_NOMEM;
4647 }
4648
4649 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
4650
4651 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
4652
4653 /* copy set STA key params to WDI structure */
4654 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4655 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4656 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4657 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
4658
4659 if(setStaKeyParams->encType != eSIR_ED_NONE)
4660 {
4661 if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == eSIR_WEP_STATIC) &&
4662 (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) &&
4663 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
4664 {
4665 WDA_GetWepKeysFromCfg( pWDA,
4666 &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx,
4667 &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys,
4668 wdiSetStaKeyParam->wdiKeyInfo.wdiKey );
4669 }
4670 else
4671 {
4672#ifdef WLAN_SOFTAP_FEATURE
4673 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4674 keyIndex++)
4675 {
4676 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4677 setStaKeyParams->key[keyIndex].keyId;
4678 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4679 setStaKeyParams->key[keyIndex].unicast;
4680 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4681 setStaKeyParams->key[keyIndex].keyDirection;
4682
4683 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4684 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4685 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4686 setStaKeyParams->key[keyIndex].paeRole;
4687 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4688 setStaKeyParams->key[keyIndex].keyLength;
4689 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4690 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4691 /* set default index to index which have key direction as WDI_TX_DEFAULT */
4692 if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection)
4693 {
4694 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
4695 }
4696 }
4697
4698 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4699 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4700#else
4701 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4702 setStaKeyParams->key.keyId;
4703 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4704 setStaKeyParams->key.unicast;
4705 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4706 setStaKeyParams->key.keyDirection;
4707 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4708 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4709 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4710 setStaKeyParams->key.paeRole;
4711 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4712 setStaKeyParams->key.keyLength;
4713 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4714 setStaKeyParams->key[keyIndex].key,
4715 SIR_MAC_MAX_KEY_LENGTH);
4716 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4717#endif
4718 }
4719 }
4720 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4721 wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
4722
4723 /* Store set key pointer, as this will be used for response */
4724 /* store Params pass it to WDI */
4725 pWdaParams->pWdaContext = pWDA;
4726 pWdaParams->wdaMsgParam = setStaKeyParams;
4727 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
4728
4729 status = WDI_SetSTAKeyReq(wdiSetStaKeyParam,
4730 (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
4731
4732 if(IS_WDI_STATUS_FAILURE(status))
4733 {
4734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4735 "Failure in set STA Key Req WDI API, free all the memory " );
4736 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4737 vos_mem_free(pWdaParams) ;
4738 setStaKeyParams->status = eSIR_FAILURE ;
4739 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
4740 }
4741
4742 return CONVERT_WDI2VOS_STATUS(status) ;
4743}
4744
4745/*
4746 * FUNCTION: WDA_SetBcastStaKeyReqCallback
4747 * send SET Bcast STA key RSP back to PE
4748 */
4749void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData)
4750{
4751 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4752 tWDA_CbContext *pWDA;
4753 tSetStaKeyParams *setStaKeyParams;
4754
4755 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4756 "<------ %s " ,__FUNCTION__);
4757
4758 if(NULL == pWdaParams)
4759 {
4760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4761 "%s: pWdaParams received NULL", __FUNCTION__);
4762 VOS_ASSERT(0) ;
4763 return ;
4764 }
4765 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4766 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
4767
4768 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4769 vos_mem_free(pWdaParams) ;
4770
4771 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
4772
4773 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
4774
4775 return ;
4776}
4777
4778
4779/*
4780 * FUNCTION: WDA_ProcessSetBcastStaKeyReq
4781 * Request to WDI for programming the Bcast STA key( key for Broadcast frames
4782 * Encryption)
4783 */
4784VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA,
4785 tSetStaKeyParams *setStaKeyParams )
4786{
4787 WDI_Status status = WDI_STATUS_SUCCESS ;
4788 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4789 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4790 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4791 tWDA_ReqParams *pWdaParams ;
4792
4793 v_U8_t keyIndex;
4794
4795 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4796 "------> %s " ,__FUNCTION__);
4797
4798 if(NULL == wdiSetStaKeyParam)
4799 {
4800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4801 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4802 VOS_ASSERT(0);
4803 return VOS_STATUS_E_NOMEM;
4804 }
4805 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4806 if(NULL == pWdaParams)
4807 {
4808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4809 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4810 VOS_ASSERT(0);
4811 vos_mem_free(wdiSetStaKeyParam);
4812 return VOS_STATUS_E_NOMEM;
4813 }
4814
4815 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
4816
4817 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
4818
4819 /* copy set STA key params to WDI structure */
4820 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4821 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4822 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4823 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
4824
4825 if(setStaKeyParams->encType != eSIR_ED_NONE)
4826 {
4827#ifdef WLAN_SOFTAP_FEATURE
4828 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4829 keyIndex++)
4830 {
4831 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4832 setStaKeyParams->key[keyIndex].keyId;
4833 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4834 setStaKeyParams->key[keyIndex].unicast;
4835 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4836 setStaKeyParams->key[keyIndex].keyDirection;
4837
4838 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4839 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4840 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4841 setStaKeyParams->key[keyIndex].paeRole;
4842 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4843 setStaKeyParams->key[keyIndex].keyLength;
4844 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4845 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4846 }
4847
4848 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4849 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4850#else
4851 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4852 setStaKeyParams->key.keyId;
4853 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4854 setStaKeyParams->key.unicast;
4855 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4856 setStaKeyParams->key.keyDirection;
4857 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4858 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4859 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4860 setStaKeyParams->key.paeRole;
4861 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4862 setStaKeyParams->key.keyLength;
4863 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4864 setStaKeyParams->key[keyIndex].key,
4865 SIR_MAC_MAX_KEY_LENGTH);
4866 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4867#endif
4868 }
4869 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4870
4871 /* Store set key pointer, as this will be used for response */
4872 /* store Params pass it to WDI */
4873 pWdaParams->pWdaContext = pWDA;
4874 pWdaParams->wdaMsgParam = setStaKeyParams;
4875 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
4876
4877 status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam,
4878 (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
4879
4880 if(IS_WDI_STATUS_FAILURE(status))
4881 {
4882 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4883 "Failure in set BCAST STA Key Req WDI API, free all the memory " );
4884 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4885 vos_mem_free(pWdaParams) ;
4886 setStaKeyParams->status = eSIR_FAILURE ;
4887 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
4888 }
4889
4890 return CONVERT_WDI2VOS_STATUS(status) ;
4891}
4892
4893/*
4894 * FUNCTION: WDA_RemoveStaKeyReqCallback
4895 * send SET BSS key RSP back to PE
4896 */
4897void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData)
4898{
4899 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4900 tWDA_CbContext *pWDA;
4901 tRemoveStaKeyParams *removeStaKeyParams;
4902
4903 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4904 "<------ %s " ,__FUNCTION__);
4905
4906 if(NULL == pWdaParams)
4907 {
4908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4909 "%s: pWdaParams received NULL", __FUNCTION__);
4910 VOS_ASSERT(0) ;
4911 return ;
4912 }
4913 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4914 removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
4915
4916 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4917 vos_mem_free(pWdaParams) ;
4918
4919 removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
4920
4921 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
4922
4923 return ;
4924}
4925
4926
4927/*
4928 * FUNCTION: WDA_ProcessRemoveStaKeyReq
4929 * Request to WDI to remove the STA key( key for Unicast frames Encryption)
4930 */
4931VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA,
4932 tRemoveStaKeyParams *removeStaKeyParams )
4933{
4934 WDI_Status status = WDI_STATUS_SUCCESS ;
4935 WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam =
4936 (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
4937 sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
4938 tWDA_ReqParams *pWdaParams ;
4939
4940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4941 "------> %s " ,__FUNCTION__);
4942
4943 if(NULL == wdiRemoveStaKeyParam)
4944 {
4945 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4946 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4947 VOS_ASSERT(0);
4948 return VOS_STATUS_E_NOMEM;
4949 }
4950 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4951 if(NULL == pWdaParams)
4952 {
4953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4954 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4955 VOS_ASSERT(0);
4956 vos_mem_free(wdiRemoveStaKeyParam);
4957 return VOS_STATUS_E_NOMEM;
4958 }
4959
4960 /* copy remove STA key params to WDI structure*/
4961 wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
4962 wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
4963 wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
4964 wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
4965 wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
4966
4967 /* Store remove key pointer, as this will be used for response */
4968 /* store Params pass it to WDI */
4969 pWdaParams->pWdaContext = pWDA;
4970 pWdaParams->wdaMsgParam = removeStaKeyParams;
4971 pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
4972
4973 status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam,
4974 (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
4975
4976 if(IS_WDI_STATUS_FAILURE(status))
4977 {
4978 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4979 "Failure in remove STA Key Req WDI API, free all the memory " );
4980 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4981 vos_mem_free(pWdaParams) ;
4982 removeStaKeyParams->status = eSIR_FAILURE ;
4983 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
4984 }
4985
4986 return CONVERT_WDI2VOS_STATUS(status) ;
4987}
4988
4989/*
4990 * FUNCTION: WDA_IsHandleSetLinkStateReq
4991 * Update the WDA state and return the status to handle this message or not
4992 */
4993
4994WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
4995 tWDA_CbContext *pWDA,
4996 tLinkStateParams *linkStateParams)
4997{
4998 WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
4999
5000 switch(linkStateParams->state)
5001 {
5002 case eSIR_LINK_PREASSOC_STATE:
5003 case eSIR_LINK_BTAMP_PREASSOC_STATE:
5004 /*
5005 * set the WDA state to PRE ASSOC
5006 * copy the BSSID into pWDA to use it in join request and return,
5007 * No need to handle these messages.
5008 */
5009 vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid,
5010 sizeof(tSirMacAddr));
5011
5012 vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr,
5013 sizeof(tSirMacAddr));
5014 /* UMAC is issuing the setlink state with PREASSOC twice (before set
5015 *channel and after ) so reset the WDA state to ready when the second
5016 * time UMAC issue the link state with PREASSOC
5017 */
5018 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
5019 {
5020 /* RESET WDA state back to WDA_READY_STATE */
5021 pWDA->wdaState = WDA_READY_STATE;
5022 }
5023 else
5024 {
5025 pWDA->wdaState = WDA_PRE_ASSOC_STATE;
5026 }
5027 //populate linkState info in WDACbCtxt
5028 pWDA->linkState = linkStateParams->state;
5029 status = WDA_IGNORE_SET_LINK_STATE;
5030 break;
5031
5032 default:
5033 if(pWDA->wdaState != WDA_READY_STATE)
5034 {
5035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5036 "Set link state called when WDA is not in READY STATE " );
5037 status = WDA_IGNORE_SET_LINK_STATE;
5038 }
5039 break;
5040 }
5041
5042 return status;
5043}
5044
5045/*
5046 * FUNCTION: WDA_SetLinkStateCallback
5047 * call back function for set link state from WDI
5048 */
5049void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
5050{
5051 tWDA_CbContext *pWDA;
5052 tLinkStateParams *linkStateParams;
5053 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5054
5055 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5056 "<------ %s " ,__FUNCTION__);
5057 if(NULL == pWdaParams)
5058 {
5059 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5060 "%s: pWdaParams received NULL", __FUNCTION__);
5061 VOS_ASSERT(0) ;
5062 return ;
5063 }
5064
5065 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5066
5067 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
5068
5069 /*
5070 * In STA mode start the BA activity check timer after association
5071 * and in AP mode start BA activity check timer after BSS start */
5072 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
5073 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
5074 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
5075 {
5076 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
5077 }
5078
5079 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
5080
5081 /*
5082 * No respone required for WDA_SET_LINK_STATE so free the request
5083 * param here
5084 */
5085 if( pWdaParams != NULL )
5086 {
5087 if( pWdaParams->wdaWdiApiMsgParam != NULL )
5088 {
5089 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5090 }
5091 vos_mem_free(pWdaParams);
5092 }
5093 return ;
5094}
5095
5096/*
5097 * FUNCTION: WDA_ProcessSetLinkState
5098 * Request to WDI to set the link status.
5099 */
5100VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
5101 tLinkStateParams *linkStateParams)
5102{
5103 WDI_Status status = WDI_STATUS_SUCCESS ;
5104 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
5105 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
5106 sizeof(WDI_SetLinkReqParamsType)) ;
5107 tWDA_ReqParams *pWdaParams ;
5108 tpAniSirGlobal pMac;
5109 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
5110
5111 if(NULL == pMac)
5112 {
5113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5114 "%s:pMac is NULL", __FUNCTION__);
5115 VOS_ASSERT(0);
5116 return VOS_STATUS_E_FAILURE;
5117 }
5118
5119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5120 "------> %s " ,__FUNCTION__);
5121
5122 if(NULL == wdiSetLinkStateParam)
5123 {
5124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5125 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5126 VOS_ASSERT(0);
5127 return VOS_STATUS_E_NOMEM;
5128 }
5129 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5130 if(NULL == pWdaParams)
5131 {
5132 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5133 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5134 VOS_ASSERT(0);
5135 vos_mem_free(wdiSetLinkStateParam);
5136 return VOS_STATUS_E_NOMEM;
5137 }
5138
5139 if(WDA_IGNORE_SET_LINK_STATE ==
5140 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
5141 {
5142 status = WDI_STATUS_E_FAILURE;
5143 }
5144 else
5145 {
5146 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
5147 linkStateParams->bssid, sizeof(tSirMacAddr));
5148
5149 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
5150 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
5151
5152 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
5153 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
5154
5155 pWdaParams->pWdaContext = pWDA;
5156 /* Store remove key pointer, as this will be used for response */
5157 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
5158
5159 /* store Params pass it to WDI */
5160 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
5161 /* Stop Timer only other than GO role and concurrent session */
5162 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
5163 && !vos_concurrent_sessions_running() &&
5164 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
5165 {
5166 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
5167 }
5168
5169 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
5170 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
5171
5172 if(IS_WDI_STATUS_FAILURE(status))
5173 {
5174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5175 "Failure in set link state Req WDI API, free all the memory " );
5176 }
5177 }
5178
5179 if(IS_WDI_STATUS_FAILURE(status))
5180 {
5181 vos_mem_free(wdiSetLinkStateParam) ;
5182 vos_mem_free(linkStateParams);
5183 vos_mem_free(pWdaParams);
5184 }
5185
5186 return CONVERT_WDI2VOS_STATUS(status) ;
5187}
5188
5189/*
5190 * FUNCTION: WDA_GetStatsReqParamsCallback
5191 * send the response to PE with Stats received from WDI
5192 */
5193void WDA_GetStatsReqParamsCallback(
5194 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
5195 void* pUserData)
5196{
5197 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
5198 tAniGetPEStatsRsp *pGetPEStatsRspParams;
5199
5200 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5201 "<------ %s " ,__FUNCTION__);
5202
5203 pGetPEStatsRspParams =
5204 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
5205 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
5206
5207 if(NULL == pGetPEStatsRspParams)
5208 {
5209 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5210 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5211 VOS_ASSERT(0);
5212 return;
5213 }
5214
5215 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
5216 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
5217 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
5218 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
5219 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
5220
5221 //Fill the Session Id Properly in PE
5222 pGetPEStatsRspParams->sessionId = 0;
5223 pGetPEStatsRspParams->rc =
5224 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
5225 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
5226 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
5227
5228 vos_mem_copy( pGetPEStatsRspParams + 1,
5229 wdiGetStatsRsp + 1,
5230 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
5231
5232 /* send response to UMAC*/
5233 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
5234
5235 return;
5236}
5237
5238
5239/*
5240 * FUNCTION: WDA_ProcessGetStatsReq
5241 * Request to WDI to get the statistics
5242 */
5243VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
5244 tAniGetPEStatsReq *pGetStatsParams)
5245{
5246 WDI_Status status = WDI_STATUS_SUCCESS ;
5247 WDI_GetStatsReqParamsType wdiGetStatsParam;
5248 tAniGetPEStatsRsp *pGetPEStatsRspParams;
5249
5250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5251 "------> %s " ,__FUNCTION__);
5252
5253 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
5254 pGetStatsParams->staId;
5255 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
5256 pGetStatsParams->statsMask;
5257
5258 wdiGetStatsParam.wdiReqStatusCB = NULL ;
5259
5260 status = WDI_GetStatsReq(&wdiGetStatsParam,
5261 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
5262
5263 if(IS_WDI_STATUS_FAILURE(status))
5264 {
5265 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5266 "Failure in Get Stats Req WDI API, free all the memory " );
5267 pGetPEStatsRspParams =
5268 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
5269 if(NULL == pGetPEStatsRspParams)
5270 {
5271 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5272 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5273 VOS_ASSERT(0);
5274 return VOS_STATUS_E_NOMEM;
5275 }
5276
5277 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
5278 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
5279 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
5280 pGetPEStatsRspParams->rc = eSIR_FAILURE;
5281 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
5282 (void *)pGetPEStatsRspParams, 0) ;
5283 }
5284
5285 /* Free the request message */
5286 vos_mem_free(pGetStatsParams);
5287 return CONVERT_WDI2VOS_STATUS(status);
5288}
5289
5290/*
5291 * FUNCTION: WDA_UpdateEDCAParamCallback
5292 * call back function for Update EDCA params from WDI
5293 */
5294void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
5295{
5296 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5297 tEdcaParams *pEdcaParams;
5298
5299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5300 "<------ %s " ,__FUNCTION__);
5301
5302 if(NULL == pWdaParams)
5303 {
5304 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5305 "%s: pWdaParams received NULL", __FUNCTION__);
5306 VOS_ASSERT(0) ;
5307 return ;
5308 }
5309 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
5310
5311 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5312 vos_mem_free(pWdaParams);
5313 vos_mem_free(pEdcaParams);
5314
5315 return ;
5316}
5317
5318/*
5319 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
5320 * Request to WDI to Update the EDCA params.
5321 */
5322VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
5323 tEdcaParams *pEdcaParams)
5324{
5325 WDI_Status status = WDI_STATUS_SUCCESS ;
5326 WDI_UpdateEDCAParamsType *wdiEdcaParam =
5327 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
5328 sizeof(WDI_UpdateEDCAParamsType)) ;
5329 tWDA_ReqParams *pWdaParams ;
5330
5331 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5332 "------> %s " ,__FUNCTION__);
5333
5334 if(NULL == wdiEdcaParam)
5335 {
5336 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5337 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5338 VOS_ASSERT(0);
5339 return VOS_STATUS_E_NOMEM;
5340 }
5341 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5342 if(NULL == pWdaParams)
5343 {
5344 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5345 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5346 VOS_ASSERT(0);
5347 vos_mem_free(wdiEdcaParam);
5348 return VOS_STATUS_E_NOMEM;
5349 }
5350
5351 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
5352 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
5353 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
5354 &pEdcaParams->acbe);
5355 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
5356 &pEdcaParams->acbk);
5357 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
5358 &pEdcaParams->acvi);
5359 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
5360 &pEdcaParams->acvo);
5361 wdiEdcaParam->wdiReqStatusCB = NULL ;
5362
5363 pWdaParams->pWdaContext = pWDA;
5364 /* Store remove key pointer, as this will be used for response */
5365 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
5366
5367 /* store Params pass it to WDI */
5368 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
5369
5370 status = WDI_UpdateEDCAParams(wdiEdcaParam,
5371 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
5372
5373 if(IS_WDI_STATUS_FAILURE(status))
5374 {
5375 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5376 "Failure in Update EDCA Params WDI API, free all the memory " );
5377 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5378 vos_mem_free(pWdaParams);
5379 vos_mem_free(pEdcaParams);
5380 }
5381
5382 return CONVERT_WDI2VOS_STATUS(status) ;
5383}
5384
5385/*
5386 * FUNCTION: WDA_AddBAReqCallback
5387 * send ADD BA RSP back to PE
5388 */
5389void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
5390 void* pUserData)
5391{
5392 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5393 tWDA_CbContext *pWDA;
5394 tAddBAParams *pAddBAReqParams;
5395
5396 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5397 "<------ %s " ,__FUNCTION__);
5398
5399 if(NULL == pWdaParams)
5400 {
5401 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5402 "%s: pWdaParams received NULL", __FUNCTION__);
5403 VOS_ASSERT(0) ;
5404 return ;
5405 }
5406 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5407 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
5408
5409 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5410 vos_mem_free(pWdaParams);
5411
5412 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
5413
5414 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5415
5416 return ;
5417}
5418
5419
5420/*
5421 * FUNCTION: WDA_ProcessAddBAReq
5422 * Request to WDI to Update the ADDBA REQ params.
5423 */
5424VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
5425 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
5426{
5427 WDI_AddBAReqParamsType *wdiAddBAReqParam =
5428 (WDI_AddBAReqParamsType *)vos_mem_malloc(
5429 sizeof(WDI_AddBAReqParamsType)) ;
5430 tWDA_ReqParams *pWdaParams ;
5431
5432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5433 "------> %s " ,__FUNCTION__);
5434
5435 if(NULL == wdiAddBAReqParam)
5436 {
5437 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5438 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5439 VOS_ASSERT(0);
5440 return VOS_STATUS_E_NOMEM;
5441 }
5442 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5443 if(NULL == pWdaParams)
5444 {
5445 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5446 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5447 VOS_ASSERT(0);
5448 vos_mem_free(wdiAddBAReqParam);
5449 return VOS_STATUS_E_NOMEM;
5450 }
5451
5452 do
5453 {
5454 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
5455
5456 wdiAddBaInfo->ucSTAIdx = staIdx ;
5457 wdiAddBaInfo->ucBaSessionID = baSessionID ;
5458 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
5459
5460 } while(0) ;
5461 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
5462
5463 pWdaParams->pWdaContext = pWDA;
5464 /* store Params pass it to WDI */
5465 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
5466 pWdaParams->wdaMsgParam = pAddBAReqParams;
5467
5468 status = WDI_AddBAReq(wdiAddBAReqParam,
5469 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
5470
5471 if(IS_WDI_STATUS_FAILURE(status))
5472 {
5473 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5474 "Failure in ADD BA REQ Params WDI API, free all the memory " );
5475 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5476 vos_mem_free(pWdaParams);
5477 pAddBAReqParams->status = eSIR_FAILURE;
5478 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5479 }
5480
5481 return CONVERT_WDI2VOS_STATUS(status) ;
5482
5483}
5484
5485/*
5486 * FUNCTION: WDA_AddBASessionReqCallback
5487 * send ADD BA SESSION RSP back to PE/(or TL)
5488 */
5489void WDA_AddBASessionReqCallback(
5490 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
5491{
5492 VOS_STATUS status = VOS_STATUS_SUCCESS ;
5493 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5494 tWDA_CbContext *pWDA;
5495 tAddBAParams *pAddBAReqParams ;
5496
5497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5498 "<------ %s " ,__FUNCTION__);
5499 if(NULL == pWdaParams)
5500 {
5501 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5502 "%s: pWdaParams received NULL", __FUNCTION__);
5503 VOS_ASSERT(0) ;
5504 return ;
5505 }
5506 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5507 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
5508
5509 if( NULL == pAddBAReqParams )
5510 {
5511
5512 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5513 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
5514 VOS_ASSERT( 0 );
5515 return ;
5516 }
5517
5518 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5519 vos_mem_free(pWdaParams);
5520
5521 /*
5522 * if WDA in update TL state, update TL with BA session parama and send
5523 * another request to HAL(/WDI) (ADD_BA_REQ)
5524 */
5525
5526 if((VOS_STATUS_SUCCESS ==
5527 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
5528 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
5529 {
5530 /* Update TL with BA info received from HAL/WDI */
5531 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
5532 wdiAddBaSession->usBaSessionID,
5533 wdiAddBaSession->ucSTAIdx,
5534 wdiAddBaSession->ucBaTID,
5535 wdiAddBaSession->ucBaBufferSize,
5536 wdiAddBaSession->ucWinSize,
5537 wdiAddBaSession->usBaSSN );
5538
5539 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5540 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5541 }
5542 else
5543 {
5544 pAddBAReqParams->status =
5545 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5546
5547 /* Setting Flag to indicate that Set BA is success */
5548 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5549 {
5550 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5551 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5552 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5553 }
5554 pWDA->wdaMsgParam = NULL;
5555 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5556 }
5557
5558 /*Reset the WDA state to READY */
5559 pWDA->wdaState = WDA_READY_STATE;
5560
5561 return ;
5562}
5563
5564
5565/*
5566 * FUNCTION: WDA_ProcessAddBASessionReq
5567 * Request to WDI to Update the ADDBA REQ params.
5568 */
5569VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5570 tAddBAParams *pAddBAReqParams)
5571{
5572 WDI_Status status = WDI_STATUS_SUCCESS ;
5573 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5574 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5575 sizeof(WDI_AddBASessionReqParamsType)) ;
5576 tWDA_ReqParams *pWdaParams ;
5577
5578 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5579 "------> %s " ,__FUNCTION__);
5580
5581 if(NULL == wdiAddBASessionReqParam)
5582 {
5583 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5584 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5585 VOS_ASSERT(0);
5586 return VOS_STATUS_E_NOMEM;
5587 }
5588 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5589 if(NULL == pWdaParams)
5590 {
5591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5592 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5593 VOS_ASSERT(0);
5594 vos_mem_free(wdiAddBASessionReqParam);
5595 return VOS_STATUS_E_NOMEM;
5596 }
5597
5598 /*
5599 * Populate ADD BA parameters and pass these paarmeters to WDI.
5600 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5601 * the state to track if these is BA recipient case or BA initiator
5602 * case.
5603 */
5604 do
5605 {
5606 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5607 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5608 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5609 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5610 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5611 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5612 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
5613
5614 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
5615
5616 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5617 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5618 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5619 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5620 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
5621
5622 /* check the BA direction and update state accordingly */
5623 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5624 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5625 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5626
5627 }while(0) ;
5628 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
5629
5630 pWdaParams->pWdaContext = pWDA;
5631 /* Store ADD BA pointer, as this will be used for response */
5632 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5633 /* store Params pass it to WDI */
5634 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
5635
5636 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5637 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
5638
5639 if(IS_WDI_STATUS_FAILURE(status))
5640 {
5641 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5642 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5643 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5644 vos_mem_free(pWdaParams->wdaMsgParam);
5645 vos_mem_free(pWdaParams);
5646 }
5647
5648 return CONVERT_WDI2VOS_STATUS(status) ;
5649
5650}
5651
5652/*
5653 * FUNCTION: WDA_DelBANotifyTL
5654 * send DEL BA IND to TL
5655 */
5656void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5657 tDelBAParams *pDelBAReqParams)
5658{
5659 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5660 //tSirMsgQ msg;
5661 vos_msg_t vosMsg;
5662 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
5663
5664 if(NULL == pDelBAInd)
5665 {
5666 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5667 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5668 VOS_ASSERT(0) ;
5669 return;
5670 }
5671
5672 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5673 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5674 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5675 pDelBAInd->mesgLen = sizeof( tDelBAInd );
5676
5677
5678 vosMsg.type = WDA_DELETEBA_IND;
5679 vosMsg.bodyptr = pDelBAInd;
5680 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5681 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5682 {
5683 vosStatus = VOS_STATUS_E_BADMSG;
5684 }
5685}
5686
5687/*
5688 * FUNCTION: WDA_DelBAReqCallback
5689 * send DEL BA RSP back to PE
5690 */
5691void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5692{
5693 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5694 tWDA_CbContext *pWDA;
5695 tDelBAParams *pDelBAReqParams;
5696
5697 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5698 "<------ %s " ,__FUNCTION__);
5699
5700 if(NULL == pWdaParams)
5701 {
5702 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5703 "%s: pWdaParams received NULL", __FUNCTION__);
5704 VOS_ASSERT(0) ;
5705 return ;
5706 }
5707 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5708 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
5709
5710 /* Notify TL about DEL BA in case of recipinet */
5711 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5712 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5713 {
5714 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5715 }
5716
5717 /*
5718 * No respone required for WDA_DELBA_IND so just free the request
5719 * param here
5720 */
5721 vos_mem_free(pDelBAReqParams);
5722 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5723 vos_mem_free(pWdaParams);
5724 return ;
5725}
5726
5727
5728/*
5729 * FUNCTION: WDA_ProcessDelBAReq
5730 * Request to WDI to Update the DELBA REQ params.
5731 */
5732VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5733 tDelBAParams *pDelBAReqParams)
5734{
5735 WDI_Status status = WDI_STATUS_SUCCESS ;
5736 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5737 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5738 sizeof(WDI_DelBAReqParamsType)) ;
5739 tWDA_ReqParams *pWdaParams ;
5740 tANI_U16 staIdx = 0;
5741 tANI_U8 tid = 0;
5742
5743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5744 "------> %s " ,__FUNCTION__);
5745
5746 if(NULL == wdiDelBAReqParam)
5747 {
5748 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5749 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5750 VOS_ASSERT(0);
5751 return VOS_STATUS_E_NOMEM;
5752 }
5753 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5754 if(NULL == pWdaParams)
5755 {
5756 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5757 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5758 VOS_ASSERT(0);
5759 vos_mem_free(wdiDelBAReqParam);
5760 return VOS_STATUS_E_NOMEM;
5761 }
5762
5763 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5764 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5765 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5766 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
5767
5768 pWdaParams->pWdaContext = pWDA;
5769 /* Store DEL BA pointer, as this will be used for response */
5770 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
5771
5772 /* store Params pass it to WDI */
5773 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
5774
5775 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5776 * maintained in WDA, so that WDA can retry for another BA session
5777 */
5778 staIdx = pDelBAReqParams->staIdx;
5779 tid = pDelBAReqParams->baTID;
5780 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
5781
5782 status = WDI_DelBAReq(wdiDelBAReqParam,
5783 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
5784
5785 if(IS_WDI_STATUS_FAILURE(status))
5786 {
5787 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5788 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5789 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5790 vos_mem_free(pWdaParams->wdaMsgParam);
5791 vos_mem_free(pWdaParams);
5792 }
5793
5794 return CONVERT_WDI2VOS_STATUS(status) ;
5795
5796}
5797
5798/*
5799 * FUNCTION: WDA_AddTSReqCallback
5800 * send ADD TS RSP back to PE
5801 */
5802void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5803{
5804 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5805 tWDA_CbContext *pWDA;
5806 tAddTsParams *pAddTsReqParams;
5807
5808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5809 "<------ %s " ,__FUNCTION__);
5810
5811 if(NULL == pWdaParams)
5812 {
5813 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5814 "%s: pWdaParams received NULL", __FUNCTION__);
5815 VOS_ASSERT(0) ;
5816 return ;
5817 }
5818 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5819 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5820 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5821 vos_mem_free(pWdaParams);
5822
5823 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
5824
5825 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5826
5827 return ;
5828}
5829
5830
5831
5832/*
5833 * FUNCTION: WDA_ProcessAddTSReq
5834 * Request to WDI to Update the ADD TS REQ params.
5835 */
5836VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5837 tAddTsParams *pAddTsReqParams)
5838{
5839 WDI_Status status = WDI_STATUS_SUCCESS ;
5840 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5841 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5842 sizeof(WDI_AddTSReqParamsType)) ;
5843 tWDA_ReqParams *pWdaParams ;
5844
5845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5846 "------> %s " ,__FUNCTION__);
5847
5848 if(NULL == wdiAddTSReqParam)
5849 {
5850 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5851 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5852 VOS_ASSERT(0);
5853 return VOS_STATUS_E_NOMEM;
5854 }
5855 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5856 if(NULL == pWdaParams)
5857 {
5858 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5859 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5860 VOS_ASSERT(0);
5861 vos_mem_free(wdiAddTSReqParam);
5862 return VOS_STATUS_E_NOMEM;
5863 }
5864
5865 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5866 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
5867
5868 //TS IE
5869 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5870 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5871 pAddTsReqParams->tspec.length;
5872
5873 //TS IE : TS INFO : TRAFFIC
5874 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5875 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5876 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5877 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5878 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5879 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5880 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5881 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5882 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5883 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5884 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5885 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5886 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5887 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5888 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5889 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5890
5891 //TS IE : TS INFO : SCHEDULE
5892 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5893 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5894 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5895 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
5896
5897 //TS IE
5898 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5899 pAddTsReqParams->tspec.nomMsduSz;
5900 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5901 pAddTsReqParams->tspec.maxMsduSz;
5902 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5903 pAddTsReqParams->tspec.minSvcInterval;
5904 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5905 pAddTsReqParams->tspec.maxSvcInterval;
5906 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5907 pAddTsReqParams->tspec.inactInterval;
5908 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5909 pAddTsReqParams->tspec.suspendInterval;
5910 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5911 pAddTsReqParams->tspec.svcStartTime;
5912 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5913 pAddTsReqParams->tspec.minDataRate;
5914 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5915 pAddTsReqParams->tspec.meanDataRate;
5916 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5917 pAddTsReqParams->tspec.peakDataRate;
5918 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5919 pAddTsReqParams->tspec.maxBurstSz;
5920 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5921 pAddTsReqParams->tspec.delayBound;
5922 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5923 pAddTsReqParams->tspec.minPhyRate;
5924 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5925 pAddTsReqParams->tspec.surplusBw;
5926 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5927 pAddTsReqParams->tspec.mediumTime;
5928
5929 /* TODO: tAddTsParams doesn't have the following fields */
5930#if 0
5931 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5932 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5933 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5934 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5935#endif
5936 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5937
5938 pWdaParams->pWdaContext = pWDA;
5939 /* Store ADD TS pointer, as this will be used for response */
5940 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
5941
5942 /* store Params pass it to WDI */
5943 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
5944
5945 status = WDI_AddTSReq(wdiAddTSReqParam,
5946 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
5947
5948 if(IS_WDI_STATUS_FAILURE(status))
5949 {
5950 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5951 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5952 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5953 vos_mem_free(pWdaParams);
5954 pAddTsReqParams->status = eSIR_FAILURE ;
5955 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5956 }
5957
5958 return CONVERT_WDI2VOS_STATUS(status) ;
5959
5960}
5961
5962
5963/*
5964 * FUNCTION: WDA_DelTSReqCallback
5965 * send DEL TS RSP back to PE
5966 */
5967void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5968{
5969 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5970
5971 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5972 "<------ %s " ,__FUNCTION__);
5973
5974 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5975 vos_mem_free(pWdaParams->wdaMsgParam) ;
5976 vos_mem_free(pWdaParams);
5977
5978 /*
5979 * No respone required for WDA_DEL_TS_REQ so just free the request
5980 * param here
5981 */
5982
5983 return ;
5984}
5985
5986
5987/*
5988 * FUNCTION: WDA_ProcessDelTSReq
5989 * Request to WDI to Update the DELTS REQ params.
5990 */
5991VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5992 tDelTsParams *pDelTSReqParams)
5993{
5994 WDI_Status status = WDI_STATUS_SUCCESS ;
5995 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5996 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5997 sizeof(WDI_DelTSReqParamsType)) ;
5998 tWDA_ReqParams *pWdaParams ;
5999
6000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6001 "------> %s " ,__FUNCTION__);
6002
6003 if(NULL == wdiDelTSReqParam)
6004 {
6005 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6006 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6007 VOS_ASSERT(0);
6008 return VOS_STATUS_E_NOMEM;
6009 }
6010 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6011 if(NULL == pWdaParams)
6012 {
6013 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6014 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6015 VOS_ASSERT(0);
6016 vos_mem_free(wdiDelTSReqParam);
6017 return VOS_STATUS_E_NOMEM;
6018 }
6019
6020 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
6021 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
6022 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
6023 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
6024 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
6025
6026 pWdaParams->pWdaContext = pWDA;
6027 /* Store DEL TS pointer, as this will be used for response */
6028 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
6029
6030 /* store Params pass it to WDI */
6031 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
6032
6033 status = WDI_DelTSReq(wdiDelTSReqParam,
6034 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
6035
6036 if(IS_WDI_STATUS_FAILURE(status))
6037 {
6038 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6039 "Failure in DEL TS REQ Params WDI API, free all the memory " );
6040 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6041 vos_mem_free(pWdaParams->wdaMsgParam);
6042 vos_mem_free(pWdaParams);
6043 }
6044
6045 return CONVERT_WDI2VOS_STATUS(status) ;
6046
6047}
6048
6049/*
6050 * FUNCTION: WDA_UpdateBeaconParamsCallback
6051 * Free the memory. No need to send any response to PE in this case
6052 */
6053void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
6054{
6055 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6056
6057 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6058 "<------ %s " ,__FUNCTION__);
6059
6060 if(NULL == pWdaParams)
6061 {
6062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6063 "%s: pWdaParams received NULL", __FUNCTION__);
6064 VOS_ASSERT(0) ;
6065 return ;
6066 }
6067 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6068 vos_mem_free(pWdaParams->wdaMsgParam) ;
6069 vos_mem_free(pWdaParams);
6070 /*
6071 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
6072 * param here
6073 */
6074
6075 return ;
6076}
6077
6078/*
6079 * FUNCTION: WDA_ProcessUpdateBeaconParams
6080 * Request to WDI to send the beacon parameters to HAL to update the Hardware
6081 */
6082VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
6083 tUpdateBeaconParams *pUpdateBeaconParams)
6084{
6085 WDI_Status status = WDI_STATUS_SUCCESS ;
6086 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
6087 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
6088 sizeof(WDI_UpdateBeaconParamsType)) ;
6089 tWDA_ReqParams *pWdaParams ;
6090
6091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6092 "------> %s " ,__FUNCTION__);
6093
6094 if(NULL == wdiUpdateBeaconParams)
6095 {
6096 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6097 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6098 VOS_ASSERT(0);
6099 return VOS_STATUS_E_NOMEM;
6100 }
6101 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6102 if(NULL == pWdaParams)
6103 {
6104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6105 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6106 VOS_ASSERT(0);
6107 vos_mem_free(wdiUpdateBeaconParams);
6108 return VOS_STATUS_E_NOMEM;
6109 }
6110
6111 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
6112 pUpdateBeaconParams->bssIdx;
6113 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
6114 pUpdateBeaconParams->fShortPreamble;
6115 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
6116 pUpdateBeaconParams->fShortSlotTime;
6117 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
6118 pUpdateBeaconParams->beaconInterval;
6119 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
6120 pUpdateBeaconParams->llaCoexist;
6121 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
6122 pUpdateBeaconParams->llbCoexist;
6123 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
6124 pUpdateBeaconParams->llgCoexist;
6125 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
6126 pUpdateBeaconParams->ht20MhzCoexist;
6127 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
6128 pUpdateBeaconParams->llnNonGFCoexist;
6129 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
6130 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
6131 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
6132 pUpdateBeaconParams->fRIFSMode;
6133 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
6134 pUpdateBeaconParams->paramChangeBitmap;
6135 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
6136
6137 pWdaParams->pWdaContext = pWDA;
6138 /* Store UpdateBeacon Req pointer, as this will be used for response */
6139 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
6140
6141 /* store Params pass it to WDI */
6142 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
6143
6144 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
6145 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
6146 pWdaParams);
6147
6148 if(IS_WDI_STATUS_FAILURE(status))
6149 {
6150 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6151 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
6152 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6153 vos_mem_free(pWdaParams->wdaMsgParam);
6154 vos_mem_free(pWdaParams);
6155 }
6156
6157 return CONVERT_WDI2VOS_STATUS(status) ;
6158
6159}
6160
6161#ifdef FEATURE_WLAN_CCX
6162
6163/*
6164 * FUNCTION: WDA_TSMStatsReqCallback
6165 * send TSM Stats RSP back to PE
6166 */
6167void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
6168{
6169 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6170 tWDA_CbContext *pWDA = NULL;
6171 tTSMStats *pTsmRspParams = NULL;
6172
6173 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6174 "<------ Entering: %s " ,__FUNCTION__);
6175
6176 if(NULL == pWdaParams)
6177 {
6178 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6179 "%s: pWdaParams received NULL", __FUNCTION__);
6180 VOS_ASSERT(0) ;
6181 return ;
6182 }
6183 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
6184 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
6185
6186 if( NULL == pTsmRspParams )
6187 {
6188 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6189 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
6190 VOS_ASSERT( 0 );
6191 return ;
6192 }
6193
6194 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6195 vos_mem_free(pWdaParams);
6196
6197 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
6198 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
6199 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
6200 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
6201 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
6202 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
6203 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
6204 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
6205 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
6206 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
6207
6208 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
6209
6210 return ;
6211}
6212
6213
6214
6215
6216/*
6217 * FUNCTION: WDA_ProcessTsmStatsReq
6218 * Request to WDI to get the TSM Stats params.
6219 */
6220VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
6221 tTSMStats *pTsmStats)
6222{
6223 WDI_Status status = WDI_STATUS_SUCCESS ;
6224 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
6225 tWDA_ReqParams *pWdaParams = NULL;
6226
6227 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6228 "------> Entering: %s " ,__FUNCTION__);
6229
6230 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
6231 {
6232 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6233 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6234 VOS_ASSERT(0);
6235 return VOS_STATUS_E_FAILURE;
6236 }
6237
6238 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
6239 sizeof(WDI_TSMStatsReqParamsType));
6240 if(NULL == wdiTSMReqParam)
6241 {
6242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6243 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6244 VOS_ASSERT(0);
6245 return VOS_STATUS_E_NOMEM;
6246 }
6247
6248 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6249 if(NULL == pWdaParams)
6250 {
6251 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6252 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6253 VOS_ASSERT(0);
6254 vos_mem_free(wdiTSMReqParam);
6255 return VOS_STATUS_E_NOMEM;
6256 }
6257
6258 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
6259 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
6260 pTsmStats->bssId,
6261 sizeof(wpt_macAddr));
6262 wdiTSMReqParam->wdiReqStatusCB = NULL ;
6263
6264 pWdaParams->pWdaContext = pWDA;
6265 /* Store TSM Stats pointer, as this will be used for response */
6266 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
6267
6268 /* store Params pass it to WDI */
6269 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
6270
6271 status = WDI_TSMStatsReq(wdiTSMReqParam,
6272 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
6273
6274 if(IS_WDI_STATUS_FAILURE(status))
6275 {
6276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6277 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
6278 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6279 vos_mem_free(pWdaParams) ;
6280 }
6281
6282 return CONVERT_WDI2VOS_STATUS(status) ;
6283}
6284#endif
6285/*
6286 * FUNCTION: WDA_SendBeaconParamsCallback
6287 * No need to send any response to PE in this case
6288 */
6289void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
6290{
6291
6292
6293 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6294 "<------ %s " ,__FUNCTION__);
6295
6296 return ;
6297}
6298
6299/*
6300 * FUNCTION: WDA_ProcessSendBeacon
6301 * Request to WDI to send the beacon template to HAL to update the TPE memory and
6302 * start beacon trasmission
6303 */
6304VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
6305 tSendbeaconParams *pSendbeaconParams)
6306{
6307 WDI_Status status = WDI_STATUS_SUCCESS ;
6308 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
6309
6310 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6311 "------> %s " ,__FUNCTION__);
6312
6313 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
6314 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
6315 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
6316 pSendbeaconParams->beaconLength;
6317#ifdef WLAN_SOFTAP_FEATURE
6318 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
6319 pSendbeaconParams->timIeOffset;
6320#endif
6321#ifdef WLAN_FEATURE_P2P
6322 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
6323 pSendbeaconParams->p2pIeOffset;
6324#endif
6325
6326 /* Copy the beacon template to local buffer */
6327 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
6328 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
6329 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
6330
6331
6332 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
6333 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
6334
6335 if(IS_WDI_STATUS_FAILURE(status))
6336 {
6337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6338 "Failure in SEND BEACON REQ Params WDI API" );
6339 }
6340
6341 vos_mem_free(pSendbeaconParams);
6342 return CONVERT_WDI2VOS_STATUS(status);
6343
6344}
6345
6346/*
6347 * FUNCTION: WDA_UpdateProbeRspParamsCallback
6348 * No need to send any response to PE in this case
6349 */
6350void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
6351{
6352
6353 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6354 "<------ %s " ,__FUNCTION__);
6355
6356 return ;
6357}
6358
6359
6360/*
6361 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
6362 * Request to WDI to send the probe response template to HAL to update the TPE memory and
6363 * send probe response
6364 */
6365VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
6366 tSendProbeRespParams *pSendProbeRspParams)
6367{
6368 WDI_Status status = WDI_STATUS_SUCCESS ;
6369 WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam;
6370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6371 "------> %s " ,__FUNCTION__);
6372
6373 /*Copy update probe response parameters*/
6374 vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID,
6375 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
6376 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
6377 pSendProbeRspParams->probeRespTemplateLen;
6378
6379 /* Copy the Probe Response template to local buffer */
6380 vos_mem_copy(
6381 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
6382 pSendProbeRspParams->pProbeRespTemplate,
6383 pSendProbeRspParams->probeRespTemplateLen);
6384 vos_mem_copy(
6385 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
6386 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
6387 WDI_PROBE_REQ_BITMAP_IE_LEN);
6388
6389 wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
6390
6391
6392 status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam,
6393 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
6394
6395 if(IS_WDI_STATUS_FAILURE(status))
6396 {
6397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6398 "Failure in SEND Probe RSP Params WDI API" );
6399 }
6400
6401 vos_mem_free(pSendProbeRspParams);
6402 return CONVERT_WDI2VOS_STATUS(status);
6403
6404}
6405
6406#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
6407/*
6408 * FUNCTION: WDA_SetMaxTxPowerCallBack
6409 * send the response to PE with power value received from WDI
6410 */
6411void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
6412 void* pUserData)
6413{
6414 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6415 tWDA_CbContext *pWDA = NULL;
6416 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
6417
6418 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6419 "<------ %s " ,__FUNCTION__);
6420 if(NULL == pWdaParams)
6421 {
6422 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6423 "%s: pWdaParams received NULL", __FUNCTION__);
6424 VOS_ASSERT(0) ;
6425 return ;
6426 }
6427
6428 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
6429 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
6430
6431 if( NULL == pMaxTxPowerParams )
6432 {
6433 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6434 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
6435 VOS_ASSERT( 0 );
6436 return ;
6437 }
6438
6439
6440 /*need to free memory for the pointers used in the
6441 WDA Process.Set Max Tx Power Req function*/
6442
6443 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6444 vos_mem_free(pWdaParams);
6445
6446 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
6447
6448
6449 /* send response to UMAC*/
6450 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
6451
6452 return;
6453}
6454
6455/*
6456 * FUNCTION: WDA_SetMaxTxPowerCallBack
6457 * Request to WDI to send set Max Tx Power Request
6458 */
6459 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
6460 tMaxTxPowerParams *MaxTxPowerParams)
6461{
6462 WDI_Status status = WDI_STATUS_SUCCESS;
6463 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
6464 tWDA_ReqParams *pWdaParams = NULL;
6465
6466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6467 "------> %s " ,__FUNCTION__);
6468
6469 if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
6470 {
6471 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6472 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6473 VOS_ASSERT(0);
6474 return VOS_STATUS_E_FAILURE;
6475 }
6476
6477 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
6478 sizeof(WDI_SetMaxTxPowerParamsType));
6479 if(NULL == wdiSetMaxTxPowerParams)
6480 {
6481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6482 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6483 VOS_ASSERT(0);
6484 return VOS_STATUS_E_NOMEM;
6485 }
6486
6487 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6488 if(NULL == pWdaParams)
6489 {
6490 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6491 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6492 vos_mem_free(wdiSetMaxTxPowerParams);
6493 VOS_ASSERT(0);
6494 return VOS_STATUS_E_NOMEM;
6495 }
6496
6497 /* Copy.Max.Tx.Power Params to WDI structure */
6498 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
6499 MaxTxPowerParams->bssId,
6500 sizeof(tSirMacAddr));
6501
6502 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
6503 MaxTxPowerParams->selfStaMacAddr,
6504 sizeof(tSirMacAddr));
6505
6506 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
6507 MaxTxPowerParams->power;
6508
6509 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
6510
6511 pWdaParams->pWdaContext = pWDA;
6512 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
6513
6514 /* store Params pass it to WDI */
6515 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
6516
6517 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
6518 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
6519
6520 if(IS_WDI_STATUS_FAILURE(status))
6521 {
6522 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6523 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
6524 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6525 vos_mem_free(pWdaParams);
6526 }
6527 return CONVERT_WDI2VOS_STATUS(status);
6528
6529}
6530
6531#endif
6532
6533#ifdef WLAN_FEATURE_P2P
6534
6535/*
6536 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
6537 * Free the memory. No need to send any response to PE in this case
6538 */
6539void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
6540{
6541 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
6542
6543 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6544 "<------ %s " ,__FUNCTION__);
6545
6546 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6547 pWDA->wdaWdiApiMsgParam = NULL;
6548 vos_mem_free(pWDA->wdaMsgParam) ;
6549 pWDA->wdaMsgParam = NULL;
6550
6551 /*
6552 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
6553 * so just free the request param here
6554 */
6555
6556 return ;
6557}
6558
6559
6560/*
6561 * FUNCTION: WDA_ProcessSetP2PGONOAReq
6562 * Request to WDI to set the P2P Group Owner Notice of Absence Req
6563 */
6564VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
6565 tP2pPsParams *pP2pPsConfigParams)
6566{
6567 WDI_Status status = WDI_STATUS_SUCCESS ;
6568 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
6569 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
6570 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
6571
6572 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6573 "------> %s " ,__FUNCTION__);
6574
6575 if(NULL == wdiSetP2PGONOAReqParam)
6576 {
6577 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6578 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6579 VOS_ASSERT(0);
6580 return VOS_STATUS_E_NOMEM;
6581 }
6582
6583 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
6584 pP2pPsConfigParams->opp_ps;
6585 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
6586 pP2pPsConfigParams->ctWindow;
6587 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
6588 pP2pPsConfigParams->count;
6589 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
6590 pP2pPsConfigParams->duration;
6591 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
6592 pP2pPsConfigParams->interval;
6593 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
6594 pP2pPsConfigParams->single_noa_duration;
6595 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
6596 pP2pPsConfigParams->psSelection;
6597
6598 if((NULL != pWDA->wdaMsgParam) ||
6599 (NULL != pWDA->wdaWdiApiMsgParam))
6600 {
6601 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6602 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6603 VOS_ASSERT(0);
6604 vos_mem_free(wdiSetP2PGONOAReqParam);
6605 return VOS_STATUS_E_FAILURE;
6606 }
6607
6608 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
6609 /* Store msg pointer from PE, as this will be used for response */
6610 pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
6611
6612 /* store Params pass it to WDI */
6613 pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
6614
6615 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
6616 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
6617
6618 if(IS_WDI_STATUS_FAILURE(status))
6619 {
6620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6621 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
6622 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6623 vos_mem_free(pWDA->wdaMsgParam);
6624 pWDA->wdaWdiApiMsgParam = NULL;
6625 pWDA->wdaMsgParam = NULL;
6626 }
6627
6628 return CONVERT_WDI2VOS_STATUS(status);
6629
6630
6631}
6632#endif
6633
6634#ifdef WLAN_FEATURE_VOWIFI_11R
6635/*
6636 * FUNCTION: WDA_AggrAddTSReqCallback
6637 * send ADD AGGREGATED TS RSP back to PE
6638 */
6639void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
6640{
6641 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
6642 tAggrAddTsParams *pAggrAddTsReqParams =
6643 (tAggrAddTsParams *)pWDA->wdaMsgParam ;
6644 int i;
6645
6646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6647 "<------ %s " ,__FUNCTION__);
6648
6649 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6650 pWDA->wdaWdiApiMsgParam = NULL;
6651 pWDA->wdaMsgParam = NULL;
6652
6653 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
6654 {
6655 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
6656 }
6657
6658 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
6659
6660 return ;
6661}/* WLAN_FEATURE_VOWIFI_11R */
6662
6663/*
6664 * FUNCTION: WDA_ProcessAddTSReq
6665 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
6666 */
6667VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
6668 tAggrAddTsParams *pAggrAddTsReqParams)
6669{
6670 WDI_Status status = WDI_STATUS_SUCCESS ;
6671 int i;
6672 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
6673
6674 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6675 "------> %s " ,__FUNCTION__);
6676 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
6677 {
6678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6679 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6680 VOS_ASSERT(0);
6681 return VOS_STATUS_E_FAILURE;
6682 }
6683
6684 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
6685 sizeof(WDI_AggrAddTSReqParamsType)) ;
6686 if(NULL == wdiAggrAddTSReqParam)
6687 {
6688 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6689 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6690 VOS_ASSERT(0);
6691 return VOS_STATUS_E_NOMEM;
6692 }
6693
6694 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6695 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6696 pAggrAddTsReqParams->tspecIdx;
6697
6698 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6699 {
6700 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6701 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6702 pAggrAddTsReqParams->tspec[i].length;
6703
6704 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6705 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6706 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6707 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6708 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6709 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6710 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6711 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6712 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6713 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6714 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6715 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6716 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6717 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6718 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6719 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
6720
6721 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6722 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
6723
6724 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6725 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6726 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6727 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6728 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6729 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6730 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6731 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6732 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6733 pAggrAddTsReqParams->tspec[i].inactInterval;
6734 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6735 pAggrAddTsReqParams->tspec[i].suspendInterval;
6736 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6737 pAggrAddTsReqParams->tspec[i].svcStartTime;
6738 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6739 pAggrAddTsReqParams->tspec[i].minDataRate;
6740 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6741 pAggrAddTsReqParams->tspec[i].meanDataRate;
6742 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6743 pAggrAddTsReqParams->tspec[i].peakDataRate;
6744 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6745 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6746 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6747 pAggrAddTsReqParams->tspec[i].delayBound;
6748 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6749 pAggrAddTsReqParams->tspec[i].minPhyRate;
6750 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6751 pAggrAddTsReqParams->tspec[i].surplusBw;
6752 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6753 pAggrAddTsReqParams->tspec[i].mediumTime;
6754 }
6755
6756 /* TODO: tAggrAddTsParams doesn't have the following fields */
6757#if 0
6758 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6759 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6760 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6761 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6762#endif
6763 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6764
6765 /* Store ADD TS pointer, as this will be used for response */
6766 pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
6767
6768 /* store Params pass it to WDI */
6769 pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
6770
6771 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
6772 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
6773
6774 if(IS_WDI_STATUS_FAILURE(status))
6775 {
6776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6777 "Failure in ADD TS REQ Params WDI API, free all the memory " );
6778 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6779 vos_mem_free(pWDA->wdaMsgParam);
6780 pWDA->wdaWdiApiMsgParam = NULL;
6781 pWDA->wdaMsgParam = NULL;
6782 }
6783
6784 return CONVERT_WDI2VOS_STATUS(status) ;
6785}
6786#endif
6787
6788/*
6789 * FUNCTION: WDA_EnterImpsReqCallback
6790 * send Enter IMPS RSP back to PE
6791 */
6792void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6793{
6794 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
6795
6796 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6797 "<------ %s " ,__FUNCTION__);
6798
6799 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
6800
6801 return ;
6802}
6803
6804/*
6805 * FUNCTION: WDA_ProcessEnterImpsReq
6806 * Request to WDI to Enter IMPS power state.
6807 */
6808VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6809{
6810 WDI_Status status = WDI_STATUS_SUCCESS ;
6811
6812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6813 "------> %s " ,__FUNCTION__);
6814
6815 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
6816
6817 if(IS_WDI_STATUS_FAILURE(status))
6818 {
6819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6820 "Failure in Enter IMPS REQ WDI API, free all the memory " );
6821 pWDA->wdaWdiApiMsgParam = NULL;
6822 pWDA->wdaMsgParam = NULL;
6823 }
6824
6825 return CONVERT_WDI2VOS_STATUS(status) ;
6826}
6827
6828/*
6829 * FUNCTION: WDA_ExitImpsReqCallback
6830 * send Exit IMPS RSP back to PE
6831 */
6832void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6833{
6834 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
6835
6836 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6837 "<------ %s " ,__FUNCTION__);
6838
6839 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
6840
6841 return ;
6842}
6843
6844/*
6845 * FUNCTION: WDA_ProcessExitImpsReq
6846 * Request to WDI to Exit IMPS power state.
6847 */
6848VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6849{
6850 WDI_Status status = WDI_STATUS_SUCCESS ;
6851
6852 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6853 "------> %s " ,__FUNCTION__);
6854
6855 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
6856
6857 if(IS_WDI_STATUS_FAILURE(status))
6858 {
6859 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6860 "Failure in Exit IMPS REQ WDI API, free all the memory " );
6861 pWDA->wdaWdiApiMsgParam = NULL;
6862 pWDA->wdaMsgParam = NULL;
6863 }
6864
6865 return CONVERT_WDI2VOS_STATUS(status) ;
6866}
6867
6868/*
6869 * FUNCTION: WDA_EnterBmpsReqCallback
6870 * send Enter BMPS RSP back to PE
6871 */
6872void WDA_EnterBmpsReqCallback(WDI_Status status, void* pUserData)
6873{
6874 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6875 tWDA_CbContext *pWDA;
6876 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6877 "<------ %s " ,__FUNCTION__);
6878
6879 if(NULL == pWdaParams)
6880 {
6881 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6882 "%s: pWdaParams received NULL", __FUNCTION__);
6883 VOS_ASSERT(0) ;
6884 return ;
6885 }
6886
6887 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6888 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6889 vos_mem_free(pWdaParams) ;
6890
6891 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
6892
6893 return ;
6894}
6895
6896/*
6897 * FUNCTION: WDA_ProcessEnterBmpsReq
6898 * Request to WDI to Enter BMPS power state.
6899 */
6900VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6901 tEnterBmpsParams *pEnterBmpsReqParams)
6902{
6903 WDI_Status status = WDI_STATUS_SUCCESS;
6904 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6905 tWDA_ReqParams *pWdaParams;
6906
6907 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6908 "------> %s " ,__FUNCTION__);
6909
6910 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6911 {
6912 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6913 "%s: invalid param", __FUNCTION__);
6914 VOS_ASSERT(0);
6915 return VOS_STATUS_E_FAILURE;
6916 }
6917
6918 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6919 if (NULL == wdiEnterBmpsReqParams)
6920 {
6921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6922 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6923 VOS_ASSERT(0);
6924 return VOS_STATUS_E_NOMEM;
6925 }
6926
6927 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6928 if (NULL == pWdaParams)
6929 {
6930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6931 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6932 VOS_ASSERT(0);
6933 vos_mem_free(wdiEnterBmpsReqParams);
6934 return VOS_STATUS_E_NOMEM;
6935 }
6936
6937 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6938 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6939 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6940 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
6941
6942 // For CCX and 11R Roaming
6943 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6944 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6945 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6946 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
6947
6948 // we are done with the input
6949 vos_mem_free(pEnterBmpsReqParams);
6950
6951 /* Store param pointer as passed in by caller */
6952 /* store Params pass it to WDI */
6953 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
6954 pWdaParams->pWdaContext = pWDA;
6955 pWdaParams->wdaMsgParam = NULL;
6956
6957 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6958 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
6959
6960 if (IS_WDI_STATUS_FAILURE(status))
6961 {
6962 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6963 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6964 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6965 vos_mem_free(pWdaParams);
6966 }
6967
6968 return CONVERT_WDI2VOS_STATUS(status);
6969}
6970
6971/*
6972 * FUNCTION: WDA_ExitBmpsReqCallback
6973 * send Exit BMPS RSP back to PE
6974 */
6975void WDA_ExitBmpsReqCallback(WDI_Status status, void* pUserData)
6976{
6977 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6978 tWDA_CbContext *pWDA;
6979 tExitBmpsParams *pExitBmpsReqParams;
6980
6981 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6982 "<------ %s " ,__FUNCTION__);
6983
6984 if(NULL == pWdaParams)
6985 {
6986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6987 "%s: pWdaParams received NULL", __FUNCTION__);
6988 VOS_ASSERT(0) ;
6989 return ;
6990 }
6991
6992 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6993 pExitBmpsReqParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam ;
6994
6995
6996 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6997 vos_mem_free(pWdaParams) ;
6998
6999
7000 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
7001
7002 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
7003
7004 return ;
7005}
7006
7007/*
7008 * FUNCTION: WDA_ProcessExitBmpsReq
7009 * Request to WDI to Exit BMPS power state.
7010 */
7011VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
7012 tExitBmpsParams *pExitBmpsReqParams)
7013{
7014 WDI_Status status = WDI_STATUS_SUCCESS ;
7015 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
7016 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
7017 sizeof(WDI_ExitBmpsReqParamsType)) ;
7018 tWDA_ReqParams *pWdaParams ;
7019
7020 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7021 "------> %s " ,__FUNCTION__);
7022
7023 if(NULL == wdiExitBmpsReqParams)
7024 {
7025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7026 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7027 VOS_ASSERT(0);
7028 return VOS_STATUS_E_NOMEM;
7029 }
7030 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7031 if(NULL == pWdaParams)
7032 {
7033 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7034 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7035 VOS_ASSERT(0);
7036 vos_mem_free(wdiExitBmpsReqParams);
7037 return VOS_STATUS_E_NOMEM;
7038 }
7039
7040 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
7041
7042 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
7043
7044 /* Store param pointer as passed in by caller */
7045 /* store Params pass it to WDI */
7046 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
7047 pWdaParams->pWdaContext = pWDA;
7048 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
7049
7050 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
7051 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
7052
7053 if(IS_WDI_STATUS_FAILURE(status))
7054 {
7055 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7056 "Failure in Exit BMPS REQ WDI API, free all the memory " );
7057 vos_mem_free(pWdaParams->wdaMsgParam) ;
7058 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7059 vos_mem_free(pWdaParams) ;
7060 }
7061
7062 return CONVERT_WDI2VOS_STATUS(status) ;
7063}
7064
7065/*
7066 * FUNCTION: WDA_EnterUapsdReqCallback
7067 * send Enter UAPSD RSP back to PE
7068 */
7069void WDA_EnterUapsdReqCallback(WDI_Status status, void* pUserData)
7070{
7071 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7072 tWDA_CbContext *pWDA;
7073 tUapsdParams *pEnterUapsdReqParams;
7074
7075 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7076 "<------ %s " ,__FUNCTION__);
7077
7078 if(NULL == pWdaParams)
7079 {
7080 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7081 "%s: pWdaParams received NULL", __FUNCTION__);
7082 VOS_ASSERT(0) ;
7083 return ;
7084 }
7085
7086 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7087
7088 pEnterUapsdReqParams = (tUapsdParams *)pWdaParams->wdaMsgParam ;
7089
7090 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7091 vos_mem_free(pWdaParams) ;
7092
7093 pEnterUapsdReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
7094
7095 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdReqParams , 0) ;
7096
7097 return ;
7098}
7099
7100/*
7101 * FUNCTION: WDA_ProcessEnterUapsdReq
7102 * Request to WDI to Enter UAPSD power state.
7103 */
7104VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
7105 tUapsdParams *pEnterUapsdReqParams)
7106{
7107 WDI_Status status = WDI_STATUS_SUCCESS ;
7108 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
7109 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
7110 sizeof(WDI_EnterUapsdReqParamsType)) ;
7111 tWDA_ReqParams *pWdaParams ;
7112
7113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7114 "------> %s " ,__FUNCTION__);
7115
7116 if(NULL == wdiEnterUapsdReqParams)
7117 {
7118 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7119 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7120 VOS_ASSERT(0);
7121 return VOS_STATUS_E_NOMEM;
7122 }
7123 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7124 if(NULL == pWdaParams)
7125 {
7126 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7127 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7128 VOS_ASSERT(0);
7129 vos_mem_free(wdiEnterUapsdReqParams);
7130 return VOS_STATUS_E_NOMEM;
7131 }
7132
7133 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
7134 pEnterUapsdReqParams->beDeliveryEnabled;
7135 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
7136 pEnterUapsdReqParams->beTriggerEnabled;
7137 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
7138 pEnterUapsdReqParams->bkDeliveryEnabled;
7139 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
7140 pEnterUapsdReqParams->bkTriggerEnabled;
7141 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
7142 pEnterUapsdReqParams->viDeliveryEnabled;
7143 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
7144 pEnterUapsdReqParams->viTriggerEnabled;
7145 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
7146 pEnterUapsdReqParams->voDeliveryEnabled;
7147 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
7148 pEnterUapsdReqParams->voTriggerEnabled;
7149
7150 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
7151
7152
7153 /* Store param pointer as passed in by caller */
7154 /* store Params pass it to WDI */
7155 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
7156 pWdaParams->pWdaContext = pWDA;
7157 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
7158
7159 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
7160 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
7161
7162 if(IS_WDI_STATUS_FAILURE(status))
7163 {
7164 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7165 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
7166 vos_mem_free(pWdaParams->wdaMsgParam) ;
7167 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7168 vos_mem_free(pWdaParams) ;
7169 }
7170
7171 return CONVERT_WDI2VOS_STATUS(status) ;
7172}
7173
7174/*
7175 * FUNCTION: WDA_ExitUapsdReqCallback
7176 * send Exit UAPSD RSP back to PE
7177 */
7178void WDA_ExitUapsdReqCallback(WDI_Status status, void* pUserData)
7179{
7180 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
7181
7182 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7183 "<------ %s " ,__FUNCTION__);
7184
7185 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
7186
7187 return ;
7188}
7189
7190/*
7191 * FUNCTION: WDA_ProcessExitUapsdReq
7192 * Request to WDI to Exit UAPSD power state.
7193 */
7194VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA)
7195{
7196 WDI_Status status = WDI_STATUS_SUCCESS ;
7197
7198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7199 "------> %s " ,__FUNCTION__);
7200
7201 status = WDI_ExitUapsdReq((WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWDA);
7202
7203 if(IS_WDI_STATUS_FAILURE(status))
7204 {
7205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7206 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
7207 pWDA->wdaWdiApiMsgParam = NULL;
7208 pWDA->wdaMsgParam = NULL;
7209 }
7210
7211 return CONVERT_WDI2VOS_STATUS(status) ;
7212}
7213
7214
7215/*
7216 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
7217 *
7218 */
7219void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
7220{
7221 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7222
7223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7224 "<------ %s " ,__FUNCTION__);
7225
7226 if(NULL == pWdaParams)
7227 {
7228 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7229 "%s: pWdaParams received NULL", __FUNCTION__);
7230 VOS_ASSERT(0) ;
7231 return ;
7232 }
7233
7234 if( pWdaParams != NULL )
7235 {
7236 if( pWdaParams->wdaWdiApiMsgParam != NULL )
7237 {
7238 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7239 }
7240 if( pWdaParams->wdaMsgParam != NULL )
7241 {
7242 vos_mem_free(pWdaParams->wdaMsgParam) ;
7243 }
7244 vos_mem_free(pWdaParams) ;
7245 }
7246
7247 return ;
7248}
7249
7250/*
7251 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
7252 * Request to WDI to set the power save params at start.
7253 */
7254VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
7255 tSirPowerSaveCfg *pPowerSaveCfg)
7256{
7257 WDI_Status status = WDI_STATUS_SUCCESS ;
7258 tHalCfg *tlvStruct = NULL ;
7259 tANI_U8 *tlvStructStart = NULL ;
7260 v_PVOID_t *configParam;
7261 tANI_U32 configParamSize;
7262 tANI_U32 *configDataValue;
7263 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
7264 tWDA_ReqParams *pWdaParams;
7265
7266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7267 "------> %s " ,__FUNCTION__);
7268
7269 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
7270 {
7271 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7272 "%s: invalid param", __FUNCTION__);
7273 VOS_ASSERT(0);
7274 return VOS_STATUS_E_FAILURE;
7275 }
7276
7277 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
7278 if (NULL == wdiPowerSaveCfg)
7279 {
7280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7281 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7282 VOS_ASSERT(0);
7283 return VOS_STATUS_E_NOMEM;
7284 }
7285 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7286 if(NULL == pWdaParams)
7287 {
7288 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7289 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7290 VOS_ASSERT(0);
7291 vos_mem_free(wdiPowerSaveCfg);
7292 return VOS_STATUS_E_NOMEM;
7293 }
7294
7295 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
7296 configParam = vos_mem_malloc(configParamSize);
7297
7298 if(NULL == configParam)
7299 {
7300 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7301 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
7302 vos_mem_free(pWdaParams);
7303 vos_mem_free(wdiPowerSaveCfg);
7304 VOS_ASSERT(0);
7305 return VOS_STATUS_E_NOMEM;
7306 }
7307
7308 vos_mem_set(configParam, configParamSize, 0);
7309 wdiPowerSaveCfg->pConfigBuffer = configParam;
7310 tlvStruct = (tHalCfg *)configParam;
7311 tlvStructStart = (tANI_U8 *)configParam;
7312
7313 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
7314 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
7315 tlvStruct->length = sizeof(tANI_U32);
7316 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7317 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
7318
7319 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7320 + sizeof(tHalCfg) + tlvStruct->length)) ;
7321
7322 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
7323 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
7324 tlvStruct->length = sizeof(tANI_U32);
7325 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7326 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
7327
7328 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7329 + sizeof(tHalCfg) + tlvStruct->length)) ;
7330
7331 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
7332 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
7333 tlvStruct->length = sizeof(tANI_U32);
7334 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7335 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
7336
7337 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7338 + sizeof(tHalCfg) + tlvStruct->length)) ;
7339
7340 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
7341 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
7342 tlvStruct->length = sizeof(tANI_U32);
7343 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7344 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
7345
7346 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7347 + sizeof(tHalCfg) + tlvStruct->length)) ;
7348
7349 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
7350 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
7351 tlvStruct->length = sizeof(tANI_U32);
7352 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7353 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
7354
7355 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7356 + sizeof(tHalCfg) + tlvStruct->length)) ;
7357
7358 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
7359 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
7360 tlvStruct->length = sizeof(tANI_U32);
7361 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7362 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
7363
7364 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7365 + sizeof(tHalCfg) + tlvStruct->length)) ;
7366
7367 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
7368 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
7369 tlvStruct->length = sizeof(tANI_U32);
7370 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7371 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
7372
7373 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7374 + sizeof(tHalCfg) + tlvStruct->length)) ;
7375
7376 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
7377 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
7378 tlvStruct->length = sizeof(tANI_U32);
7379 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7380 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
7381 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7382 + sizeof(tHalCfg) + tlvStruct->length)) ;
7383
7384 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
7385 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
7386 tlvStruct->length = sizeof(tANI_U32);
7387 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7388 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
7389 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7390 + sizeof(tHalCfg) + tlvStruct->length)) ;
7391
7392 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
7393 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
7394 tlvStruct->length = sizeof(tANI_U32);
7395 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7396 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
7397
7398 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7399 + sizeof(tHalCfg) + tlvStruct->length)) ;
7400
7401 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
7402 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
7403 tlvStruct->length = sizeof(tANI_U32);
7404 configDataValue = (tANI_U32 *)(tlvStruct + 1);
7405 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
7406
7407 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
7408 + sizeof(tHalCfg) + tlvStruct->length)) ;
7409
7410 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
7411
7412 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
7413
7414 /* store Params pass it to WDI */
7415 pWdaParams->wdaMsgParam = configParam;
7416 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
7417 pWdaParams->pWdaContext = pWDA;
7418
7419 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
7420 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
7421
7422 if(IS_WDI_STATUS_FAILURE(status))
7423 {
7424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7425 "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " );
7426 vos_mem_free(pWdaParams->wdaMsgParam);
7427 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7428 vos_mem_free(pWdaParams);
7429 }
7430
7431 vos_mem_free(pPowerSaveCfg);
7432
7433 return CONVERT_WDI2VOS_STATUS(status);
7434}
7435
7436/*
7437 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
7438 *
7439 */
7440void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
7441{
7442 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7443
7444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7445 "<------ %s " ,__FUNCTION__);
7446
7447 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7448 vos_mem_free(pWdaParams);
7449
7450
7451 return ;
7452}
7453
7454/*
7455 * FUNCTION: WDA_SetUapsdAcParamsReq
7456 * Request to WDI to set the UAPSD params for an ac (sta mode).
7457 */
7458VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
7459 tUapsdInfo *pUapsdInfo)
7460{
7461 WDI_Status status = WDI_STATUS_SUCCESS;
7462 tWDA_CbContext *pWDA = NULL ;
7463 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
7464 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
7465 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
7466 tWDA_ReqParams *pWdaParams ;
7467
7468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7469 "------> %s " ,__FUNCTION__);
7470
7471 if(NULL == wdiUapsdParams)
7472 {
7473 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7474 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7475 VOS_ASSERT(0);
7476 return VOS_STATUS_E_NOMEM;
7477 }
7478 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7479 if(NULL == pWdaParams)
7480 {
7481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7482 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7483 VOS_ASSERT(0);
7484 vos_mem_free(wdiUapsdParams);
7485 return VOS_STATUS_E_NOMEM;
7486 }
7487
7488 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
7489 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
7490 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
7491 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
7492 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
7493 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
7494
7495 wdiUapsdParams->wdiReqStatusCB = NULL;
7496
7497 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7498
7499 pWdaParams->pWdaContext = pWDA;
7500 /* Store param pointer as passed in by caller */
7501 pWdaParams->wdaMsgParam = pUapsdInfo;
7502 /* store Params pass it to WDI */
7503 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
7504
7505 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
7506 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
7507 pWdaParams);
7508
7509 if(IS_WDI_STATUS_FAILURE(status))
7510 {
7511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7512 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
7513 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7514 vos_mem_free(pWdaParams);
7515 }
7516
7517 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
7518 return VOS_STATUS_SUCCESS;
7519 else
7520 return VOS_STATUS_E_FAILURE;
7521
7522
7523
7524}
7525/*
7526 * FUNCTION: WDA_ClearUapsdAcParamsReq
7527 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
7528 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
7529 * and again enter the UPASD with the modified params. Hence the disable
7530 * function was kept empty.
7531 *
7532 */
7533VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
7534{
7535 /* do nothing */
7536 return VOS_STATUS_SUCCESS;
7537}
7538
7539/*
7540 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
7541 *
7542 */
7543void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
7544{
7545 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
7546
7547 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7548 "<------ %s " ,__FUNCTION__);
7549
7550 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7551 pWDA->wdaWdiApiMsgParam = NULL;
7552 pWDA->wdaMsgParam = NULL;
7553
7554
7555 //print a msg, nothing else to do
7556 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7557 "WDA_UpdateUapsdParamsReqCallback invoked " );
7558
7559 return ;
7560}
7561
7562/*
7563 * FUNCTION: WDA_UpdateUapsdParamsReq
7564 * Request to WDI to update UAPSD params (in softAP mode) for a station.
7565 */
7566VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
7567 tUpdateUapsdParams* pUpdateUapsdInfo)
7568{
7569 VOS_STATUS status = VOS_STATUS_SUCCESS;
7570 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
7571 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
7572 sizeof(WDI_UpdateUapsdReqParamsType)) ;
7573
7574 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7575 "------> %s " ,__FUNCTION__);
7576
7577 if(NULL == wdiUpdateUapsdParams)
7578 {
7579 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7580 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7581 VOS_ASSERT(0);
7582 return VOS_STATUS_E_NOMEM;
7583 }
7584
7585 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
7586 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
7587 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
7588
7589 if((NULL != pWDA->wdaMsgParam) ||
7590 (NULL != pWDA->wdaWdiApiMsgParam))
7591 {
7592 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7593 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7594 vos_mem_free(wdiUpdateUapsdParams);
7595 VOS_ASSERT(0);
7596 return VOS_STATUS_E_FAILURE;
7597 }
7598
7599 /* Store param pointer as passed in by caller */
7600 pWDA->wdaMsgParam = pUpdateUapsdInfo;
7601 /* store Params pass it to WDI */
7602 pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
7603
7604 status = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
7605 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
7606
7607 if(IS_WDI_STATUS_FAILURE(status))
7608 {
7609 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7610 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
7611 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7612 vos_mem_free(pWDA->wdaMsgParam);
7613 pWDA->wdaWdiApiMsgParam = NULL;
7614 pWDA->wdaMsgParam = NULL;
7615 }
7616
7617 return CONVERT_WDI2VOS_STATUS(status) ;
7618}
7619
7620/*
7621 * FUNCTION: WDA_ConfigureRxpFilterCallback
7622 *
7623 */
7624void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
7625{
7626 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7627
7628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7629 "<------ %s " ,__FUNCTION__);
7630
7631 if(WDI_STATUS_SUCCESS != wdiStatus)
7632 {
7633 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7634 "%s: RXP config filter failure \n", __FUNCTION__ );
7635 }
7636
7637 if(NULL == pWdaParams)
7638 {
7639 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7640 "%s: pWdaParams received NULL", __FUNCTION__);
7641 VOS_ASSERT(0) ;
7642 return ;
7643 }
7644
7645 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7646 vos_mem_free(pWdaParams->wdaMsgParam);
7647 vos_mem_free(pWdaParams);
7648 return ;
7649}
7650
7651/*
7652 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
7653 *
7654 */
7655VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
7656 tSirWlanSetRxpFilters *pWlanSuspendParam)
7657{
7658
7659 VOS_STATUS status = VOS_STATUS_SUCCESS;
7660 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
7661 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
7662 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
7663 tWDA_ReqParams *pWdaParams ;
7664
7665 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7666 "------> %s " ,__FUNCTION__);
7667
7668 if(NULL == wdiRxpFilterParams)
7669 {
7670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7671 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7672 VOS_ASSERT(0);
7673 vos_mem_free(pWlanSuspendParam);
7674 return VOS_STATUS_E_NOMEM;
7675 }
7676 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7677 if(NULL == pWdaParams)
7678 {
7679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7680 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7681 VOS_ASSERT(0);
7682 vos_mem_free(wdiRxpFilterParams);
7683 vos_mem_free(pWlanSuspendParam);
7684 return VOS_STATUS_E_NOMEM;
7685 }
7686
7687 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
7688 pWlanSuspendParam->setMcstBcstFilter;
7689 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
7690 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7691
7692 wdiRxpFilterParams->wdiReqStatusCB = NULL;
7693
7694 pWdaParams->pWdaContext = pWDA;
7695 pWdaParams->wdaMsgParam = pWlanSuspendParam;
7696 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
7697
7698 status = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
7699 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
7700 pWdaParams);
7701
7702 if(IS_WDI_STATUS_FAILURE(status))
7703 {
7704 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7705 "Failure in configure RXP filter REQ WDI API, free all the memory " );
7706 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7707 vos_mem_free(pWdaParams->wdaMsgParam);
7708 vos_mem_free(pWdaParams);
7709 }
7710
7711 return CONVERT_WDI2VOS_STATUS(status) ;
7712}
7713
7714/*
7715 * FUNCTION: WDA_WdiIndicationCallback
7716 *
7717 */
7718void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
7719 void* pUserData)
7720{
7721 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7722 "<------ %s " ,__FUNCTION__);
7723
7724}
7725
7726/*
7727 * FUNCTION: WDA_ProcessWlanSuspendInd
7728 *
7729 */
7730VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
7731 tSirWlanSuspendParam *pWlanSuspendParam)
7732{
7733 WDI_Status wdiStatus;
7734 WDI_SuspendParamsType wdiSuspendParams;
7735
7736 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7737 "------> %s " ,__FUNCTION__);
7738
7739 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
7740 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7741 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
7742 wdiSuspendParams.pUserData = pWDA;
7743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
7744
7745 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
7746
7747 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
7748 if(WDI_STATUS_PENDING == wdiStatus)
7749 {
7750 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7751 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
7752
7753 }
7754 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
7755 {
7756 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7757 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
7758 }
7759
7760 vos_mem_free(pWlanSuspendParam);
7761 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7762}
7763
7764
7765
7766/*
7767 * FUNCTION: WDA_ProcessWlanResumeCallback
7768 *
7769 */
7770void WDA_ProcessWlanResumeCallback(
7771 WDI_SuspendResumeRspParamsType *resumeRspParams,
7772 void* pUserData)
7773{
7774 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7775
7776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7777 "<------ %s " ,__FUNCTION__);
7778 if(NULL == pWdaParams)
7779 {
7780 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7781 "%s: pWdaParams received NULL", __FUNCTION__);
7782 VOS_ASSERT(0) ;
7783 return ;
7784 }
7785
7786 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
7787 {
7788 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7789 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
7790 }
7791
7792 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7793 vos_mem_free(pWdaParams->wdaMsgParam);
7794 vos_mem_free(pWdaParams);
7795
7796 return ;
7797}
7798
7799/*
7800 * FUNCTION: WDA_ProcessWlanResumeReq
7801 *
7802 */
7803VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
7804 tSirWlanResumeParam *pWlanResumeParam)
7805{
7806 WDI_Status wdiStatus;
7807 WDI_ResumeParamsType *wdiResumeParams =
7808 (WDI_ResumeParamsType *)vos_mem_malloc(
7809 sizeof(WDI_ResumeParamsType) ) ;
7810 tWDA_ReqParams *pWdaParams ;
7811
7812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7813 "------> %s " ,__FUNCTION__);
7814
7815 if(NULL == wdiResumeParams)
7816 {
7817 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7818 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7819 VOS_ASSERT(0);
7820 return VOS_STATUS_E_NOMEM;
7821 }
7822 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7823 if(NULL == pWdaParams)
7824 {
7825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7826 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7827 VOS_ASSERT(0);
7828 vos_mem_free(wdiResumeParams);
7829 return VOS_STATUS_E_NOMEM;
7830 }
7831
7832 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
7833 pWlanResumeParam->configuredMcstBcstFilterSetting;
7834
7835 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
7836 wdiResumeParams->wdiReqStatusCB = NULL;
7837 pWdaParams->wdaMsgParam = pWlanResumeParam;
7838 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
7839 pWdaParams->pWdaContext = pWDA;
7840
7841 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr) ;
7842
7843 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
7844 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
7845 pWdaParams);
7846
7847 if(IS_WDI_STATUS_FAILURE(wdiStatus))
7848 {
7849 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7850 "Failure in Host Resume REQ WDI API, free all the memory " );
7851 VOS_ASSERT(0);
7852 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7853 vos_mem_free(pWdaParams->wdaMsgParam);
7854 vos_mem_free(pWdaParams);
7855 }
7856
7857 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7858}
7859
7860
7861
7862/*
7863 * FUNCTION: WDA_SetBeaconFilterReqCallback
7864 *
7865 */
7866void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7867{
7868 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7869
7870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7871 "<------ %s " ,__FUNCTION__);
7872
7873 if(NULL == pWdaParams)
7874 {
7875 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7876 "%s: pWdaParams received NULL", __FUNCTION__);
7877 VOS_ASSERT(0) ;
7878 return ;
7879 }
7880
7881 vos_mem_free(pWdaParams->wdaMsgParam) ;
7882 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7883 vos_mem_free(pWdaParams) ;
7884 /*
7885 * No respone required for SetBeaconFilter req so just free the request
7886 * param here
7887 */
7888
7889
7890 return ;
7891}
7892
7893/*
7894 * FUNCTION: WDA_SetBeaconFilterReq
7895 * Request to WDI to send the beacon filtering related information.
7896 */
7897VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7898 tBeaconFilterMsg* pBeaconFilterInfo)
7899{
7900 WDI_Status status = WDI_STATUS_SUCCESS;
7901 tANI_U8 *dstPtr, *srcPtr;
7902 tANI_U8 filterLength;
7903 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7904 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7905 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7906 tWDA_ReqParams *pWdaParams ;
7907
7908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7909 "------> %s " ,__FUNCTION__);
7910
7911 if(NULL == wdiBeaconFilterInfo)
7912 {
7913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7914 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7915 VOS_ASSERT(0);
7916 return VOS_STATUS_E_NOMEM;
7917 }
7918 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7919 if(NULL == pWdaParams)
7920 {
7921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7922 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7923 VOS_ASSERT(0);
7924 vos_mem_free(wdiBeaconFilterInfo);
7925 return VOS_STATUS_E_NOMEM;
7926 }
7927
7928 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7929 pBeaconFilterInfo->beaconInterval;
7930 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7931 pBeaconFilterInfo->capabilityInfo;
7932 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7933 pBeaconFilterInfo->capabilityMask;
7934 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
7935
7936 //Fill structure with info contained in the beaconFilterTable
7937 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7938 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7939 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7940 if(WDI_BEACON_FILTER_LEN < filterLength)
7941 {
7942 filterLength = WDI_BEACON_FILTER_LEN;
7943 }
7944 vos_mem_copy(dstPtr, srcPtr, filterLength);
7945
7946 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7947 /* Store param pointer as passed in by caller */
7948 /* store Params pass it to WDI */
7949 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7950 pWdaParams->pWdaContext = pWDA;
7951 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7952
7953
7954 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7955 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
7956
7957 if(IS_WDI_STATUS_FAILURE(status))
7958 {
7959 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7960 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7961 vos_mem_free(pWdaParams->wdaMsgParam) ;
7962 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7963 vos_mem_free(pWdaParams) ;
7964 }
7965
7966 return CONVERT_WDI2VOS_STATUS(status) ;
7967}
7968
7969/*
7970 * FUNCTION: WDA_RemBeaconFilterReqCallback
7971 *
7972 */
7973void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7974{
7975 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
7976
7977 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7978 "<------ %s " ,__FUNCTION__);
7979
7980 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7981 pWDA->wdaWdiApiMsgParam = NULL;
7982 pWDA->wdaMsgParam = NULL;
7983
7984
7985 //print a msg, nothing else to do
7986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7987 "WDA_RemBeaconFilterReqCallback invoked " );
7988
7989 return ;
7990}
7991
7992 // TODO: PE does not have this feature for now implemented,
7993 // but the support for removing beacon filter exists between
7994 // HAL and FW. This function can be called whenever PE defines
7995 // a new message for beacon filter removal
7996
7997/*
7998 * FUNCTION: WDA_RemBeaconFilterReq
7999 * Request to WDI to send the removal of beacon filtering related information.
8000 */
8001VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
8002 tRemBeaconFilterMsg* pBeaconFilterInfo)
8003{
8004 VOS_STATUS status = VOS_STATUS_SUCCESS;
8005 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
8006 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
8007 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
8008
8009 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8010 "------> %s " ,__FUNCTION__);
8011
8012 if(NULL == wdiBeaconFilterInfo)
8013 {
8014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8015 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8016 VOS_ASSERT(0);
8017 return VOS_STATUS_E_NOMEM;
8018 }
8019
8020 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
8021 pBeaconFilterInfo->ucIeCount;
8022
8023 //Fill structure with info contained in the ucRemIeId
8024 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
8025 pBeaconFilterInfo->ucRemIeId,
8026 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
8027 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
8028
8029 if((NULL != pWDA->wdaMsgParam) ||
8030 (NULL != pWDA->wdaWdiApiMsgParam))
8031 {
8032 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8033 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8034 vos_mem_free(wdiBeaconFilterInfo);
8035 VOS_ASSERT(0);
8036 return VOS_STATUS_E_FAILURE;
8037 }
8038
8039 /* Store param pointer as passed in by caller */
8040 pWDA->wdaMsgParam = pBeaconFilterInfo;
8041 /* store Params pass it to WDI */
8042 pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
8043
8044 status = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
8045 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
8046
8047 if(IS_WDI_STATUS_FAILURE(status))
8048 {
8049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8050 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
8051 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8052 vos_mem_free(pWDA->wdaMsgParam);
8053 pWDA->wdaWdiApiMsgParam = NULL;
8054 pWDA->wdaMsgParam = NULL;
8055 }
8056
8057 return CONVERT_WDI2VOS_STATUS(status) ;
8058}
8059
8060/*
8061 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
8062 *
8063 */
8064void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
8065{
8066 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8067
8068 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8069 "<------ %s " ,__FUNCTION__);
8070
8071 if(NULL == pWdaParams)
8072 {
8073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8074 "%s: pWdaParams received NULL", __FUNCTION__);
8075 VOS_ASSERT(0) ;
8076 return ;
8077 }
8078
8079 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8080 vos_mem_free(pWdaParams) ;
8081
8082
8083 return ;
8084}
8085
8086/*
8087 * FUNCTION: WDA_SetRSSIThresholdsReq
8088 * Request to WDI to set the RSSI thresholds (sta mode).
8089 */
8090VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
8091{
8092 VOS_STATUS status = VOS_STATUS_SUCCESS;
8093 tWDA_CbContext *pWDA = NULL ;
8094 v_PVOID_t pVosContext = NULL;
8095 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
8096 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
8097 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
8098 tWDA_ReqParams *pWdaParams ;
8099
8100 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8101 "------> %s " ,__FUNCTION__);
8102
8103 if(NULL == wdiRSSIThresholdsInfo)
8104 {
8105 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8106 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8107 VOS_ASSERT(0);
8108 return VOS_STATUS_E_NOMEM;
8109 }
8110 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8111 if(NULL == pWdaParams)
8112 {
8113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8114 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8115 VOS_ASSERT(0);
8116 vos_mem_free(wdiRSSIThresholdsInfo);
8117 return VOS_STATUS_E_NOMEM;
8118 }
8119
8120 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
8121
8122 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
8123 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
8124 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
8125
8126 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
8127 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
8128 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
8129
8130 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
8131 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
8132 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
8133
8134 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
8135
8136 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
8137 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
8138
8139
8140 /* Store param pointer as passed in by caller */
8141 /* store Params pass it to WDI */
8142 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
8143 pWdaParams->pWdaContext = pWDA;
8144 pWdaParams->wdaMsgParam = pBmpsThresholds;
8145
8146 status = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
8147 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
8148
8149 if(IS_WDI_STATUS_FAILURE(status))
8150 {
8151 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8152 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
8153 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8154 vos_mem_free(pWdaParams) ;
8155 }
8156
8157 return CONVERT_WDI2VOS_STATUS(status) ;
8158
8159}/*WDA_SetRSSIThresholdsReq*/
8160
8161/*
8162 * FUNCTION: WDA_HostOffloadReqCallback
8163 *
8164 */
8165void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
8166{
8167 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
8168
8169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8170 "<------ %s " ,__FUNCTION__);
8171
8172 if(NULL == pWdaParams)
8173 {
8174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8175 "%s: pWdaParams received NULL", __FUNCTION__);
8176 VOS_ASSERT(0) ;
8177 return ;
8178 }
8179
8180 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8181 vos_mem_free(pWdaParams->wdaMsgParam);
8182 vos_mem_free(pWdaParams) ;
8183
8184 //print a msg, nothing else to do
8185 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8186 "WDA_HostOffloadReqCallback invoked " );
8187
8188 return ;
8189}
8190
8191/*
8192 * FUNCTION: WDA_ProcessHostOffloadReq
8193 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8194 * to broadcast traffic (sta mode).
8195 */
8196VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
8197 tSirHostOffloadReq *pHostOffloadParams)
8198{
8199 VOS_STATUS status = VOS_STATUS_SUCCESS;
8200 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
8201 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
8202 sizeof(WDI_HostOffloadReqParamsType)) ;
8203 tWDA_ReqParams *pWdaParams ;
8204
8205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8206 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
8207
8208 if(NULL == wdiHostOffloadInfo)
8209 {
8210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8211 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8212 VOS_ASSERT(0);
8213 return VOS_STATUS_E_NOMEM;
8214 }
8215
8216 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8217 if(NULL == pWdaParams)
8218 {
8219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8220 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8221 VOS_ASSERT(0);
8222 vos_mem_free(wdiHostOffloadInfo);
8223 return VOS_STATUS_E_NOMEM;
8224 }
8225
8226 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
8227 pHostOffloadParams->offloadType;
8228 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
8229 pHostOffloadParams->enableOrDisable;
8230
8231 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
8232 {
8233 case SIR_IPV4_ARP_REPLY_OFFLOAD:
8234 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
8235 pHostOffloadParams->params.hostIpv4Addr,
8236 4);
8237 break;
8238 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
8239 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
8240 pHostOffloadParams->params.hostIpv6Addr,
8241 16);
8242 break;
8243 case SIR_IPV6_NS_OFFLOAD:
8244 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
8245 pHostOffloadParams->params.hostIpv6Addr,
8246 16);
8247
8248#ifdef WLAN_NS_OFFLOAD
8249 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
8250 {
8251 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
8252 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
8253 16);
8254 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
8255 }
8256 else
8257 {
8258 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
8259 }
8260
8261 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
8262 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
8263 16);
8264 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
8265 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
8266 6);
8267
8268 //Only two are supported so let's go through them without a loop
8269 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
8270 {
8271 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
8272 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
8273 16);
8274 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
8275 }
8276 else
8277 {
8278 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
8279 }
8280
8281 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
8282 {
8283 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
8284 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
8285 16);
8286 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
8287 }
8288 else
8289 {
8290 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
8291 }
8292 break;
8293#endif //WLAN_NS_OFFLOAD
8294 default:
8295 {
8296 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8297 "No Handling for Offload Type %x in WDA "
8298 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
8299 //WDA_VOS_ASSERT(0) ;
8300 }
8301 }
8302
8303 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
8304
8305 if((NULL != pWDA->wdaMsgParam) ||
8306 (NULL != pWDA->wdaWdiApiMsgParam))
8307 {
8308 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8309 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8310 VOS_ASSERT(0);
8311 vos_mem_free(wdiHostOffloadInfo);
8312 return VOS_STATUS_E_FAILURE;
8313 }
8314
8315 /* Store param pointer as passed in by caller */
8316 /* store Params pass it to WDI */
8317 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
8318 pWdaParams->pWdaContext = pWDA;
8319 pWdaParams->wdaMsgParam = pHostOffloadParams;
8320
8321 status = WDI_HostOffloadReq(wdiHostOffloadInfo,
8322 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
8323
8324 if(IS_WDI_STATUS_FAILURE(status))
8325 {
8326 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8327 "Failure in host offload REQ WDI API, free all the memory " );
8328 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8329 vos_mem_free(pWdaParams->wdaMsgParam);
8330 vos_mem_free(pWdaParams) ;
8331 }
8332
8333 return CONVERT_WDI2VOS_STATUS(status) ;
8334
8335}/*WDA_HostOffloadReq*/
8336
8337/*
8338 * FUNCTION: WDA_KeepAliveReqCallback
8339 *
8340 */
8341void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
8342{
8343 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8344
8345 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8346 "<------ %s " ,__FUNCTION__);
8347
8348 vos_mem_free(pWDA->wdaWdiApiMsgParam);
8349 vos_mem_free(pWDA->wdaMsgParam);
8350 pWDA->wdaWdiApiMsgParam = NULL;
8351 pWDA->wdaMsgParam = NULL;
8352
8353
8354 //print a msg, nothing else to do
8355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8356 "WDA_KeepAliveReqCallback invoked " );
8357
8358 return ;
8359}
8360
8361/*
8362 * FUNCTION: WDA_ProcessKeepAliveReq
8363 * Request to WDI to send Keep Alive packets to minimize unnecessary host
8364 * wakeup due to broadcast traffic (sta mode).
8365 */
8366VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
8367 tSirKeepAliveReq *pKeepAliveParams)
8368{
8369 VOS_STATUS status = VOS_STATUS_SUCCESS;
8370 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
8371 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
8372 sizeof(WDI_KeepAliveReqParamsType)) ;
8373
8374 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8375 "------> %s " ,__FUNCTION__);
8376
8377 if(NULL == wdiKeepAliveInfo)
8378 {
8379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8380 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8381 VOS_ASSERT(0);
8382 return VOS_STATUS_E_NOMEM;
8383 }
8384
8385 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
8386 pKeepAliveParams->packetType;
8387 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
8388 pKeepAliveParams->timePeriod;
8389
8390 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
8391 {
8392 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
8393 pKeepAliveParams->hostIpv4Addr,
8394 SIR_IPV4_ADDR_LEN);
8395 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
8396 pKeepAliveParams->destIpv4Addr,
8397 SIR_IPV4_ADDR_LEN);
8398 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
8399 pKeepAliveParams->destMacAddr,
8400 SIR_MAC_ADDR_LEN);
8401 }
8402 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
8403 {
8404 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
8405 SIR_IPV4_ADDR_LEN,
8406 0);
8407 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
8408 SIR_IPV4_ADDR_LEN,
8409 0);
8410 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
8411 SIR_MAC_ADDR_LEN,
8412 0);
8413 }
8414
8415 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
8416
8417 if((NULL != pWDA->wdaMsgParam) ||
8418 (NULL != pWDA->wdaWdiApiMsgParam))
8419 {
8420 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8421 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8422 VOS_ASSERT(0);
8423 vos_mem_free(wdiKeepAliveInfo);
8424 return VOS_STATUS_E_FAILURE;
8425 }
8426
8427 /* Store param pointer as passed in by caller */
8428 pWDA->wdaMsgParam = pKeepAliveParams;
8429 /* store Params pass it to WDI */
8430 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
8431
8432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
8433 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
8434 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
8435 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
8436 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
8437 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
8438 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
8439 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
8440 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
8441 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
8442 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8443 "WDA DMAC : %d:%d:%d:%d:%d:%d",
8444 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
8445 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
8446 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
8447 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
8448 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
8449 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
8450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8451 "TimePeriod %d PacketType %d",
8452 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
8453 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
8454
8455 status = WDI_KeepAliveReq(wdiKeepAliveInfo,
8456 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
8457
8458 if(IS_WDI_STATUS_FAILURE(status))
8459 {
8460 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8461 "Failure in Keep Alive REQ WDI API, free all the memory " );
8462 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8463 vos_mem_free(pWDA->wdaMsgParam);
8464 pWDA->wdaWdiApiMsgParam = NULL;
8465 pWDA->wdaMsgParam = NULL;
8466 }
8467
8468 return CONVERT_WDI2VOS_STATUS(status) ;
8469
8470}/*WDA_KeepAliveReq*/
8471
8472/*
8473 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
8474 *
8475 */
8476void WDA_WowlAddBcPtrnReqCallback(WDI_Status status, void* pUserData)
8477{
8478 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8479
8480 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8481 "<------ %s " ,__FUNCTION__);
8482
8483 if(NULL == pWdaParams)
8484 {
8485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8486 "%s: pWdaParams received NULL", __FUNCTION__);
8487 VOS_ASSERT(0) ;
8488 return ;
8489 }
8490
8491 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8492 vos_mem_free(pWdaParams->wdaMsgParam);
8493 vos_mem_free(pWdaParams) ;
8494
8495 return ;
8496}
8497
8498/*
8499 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
8500 * Request to WDI to add WOWL Bcast pattern
8501 */
8502VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
8503 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
8504{
8505 VOS_STATUS status = VOS_STATUS_SUCCESS;
8506 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
8507 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
8508 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
8509 tWDA_ReqParams *pWdaParams ;
8510
8511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8512 "------> %s " ,__FUNCTION__);
8513
8514 if(NULL == wdiWowlAddBcPtrnInfo)
8515 {
8516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8517 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8518 VOS_ASSERT(0);
8519 return VOS_STATUS_E_NOMEM;
8520 }
8521 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8522 if(NULL == pWdaParams)
8523 {
8524 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8525 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8526 VOS_ASSERT(0);
8527 vos_mem_free(wdiWowlAddBcPtrnInfo);
8528 return VOS_STATUS_E_NOMEM;
8529 }
8530
8531 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
8532 pWowlAddBcPtrnParams->ucPatternId;
8533 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
8534 pWowlAddBcPtrnParams->ucPatternByteOffset;
8535 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
8536 pWowlAddBcPtrnParams->ucPatternMaskSize;
8537 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
8538 pWowlAddBcPtrnParams->ucPatternSize;
8539
8540 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
8541 {
8542 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
8543 pWowlAddBcPtrnParams->ucPattern,
8544 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
8545 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
8546 pWowlAddBcPtrnParams->ucPatternMask,
8547 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
8548 }
8549 else
8550 {
8551 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
8552 pWowlAddBcPtrnParams->ucPattern,
8553 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
8554 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
8555 pWowlAddBcPtrnParams->ucPatternMask,
8556 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
8557
8558 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
8559 pWowlAddBcPtrnParams->ucPatternExt,
8560 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
8561 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
8562 pWowlAddBcPtrnParams->ucPatternMaskExt,
8563 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
8564 }
8565
8566 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
8567
8568 /* Store param pointer as passed in by caller */
8569 /* store Params pass it to WDI */
8570 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
8571 pWdaParams->pWdaContext = pWDA;
8572 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
8573
8574 status = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
8575 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
8576
8577 if(IS_WDI_STATUS_FAILURE(status))
8578 {
8579 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8580 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
8581 vos_mem_free(pWdaParams->wdaMsgParam) ;
8582 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8583 vos_mem_free(pWdaParams) ;
8584 }
8585
8586 return CONVERT_WDI2VOS_STATUS(status) ;
8587
8588}/*WDA_ProcessWowlAddBcPtrnReq*/
8589
8590/*
8591 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
8592 *
8593 */
8594void WDA_WowlDelBcPtrnReqCallback(WDI_Status status, void* pUserData)
8595{
8596 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8597
8598 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8599 "<------ %s " ,__FUNCTION__);
8600
8601 if(NULL == pWdaParams)
8602 {
8603 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8604 "%s: pWdaParams received NULL", __FUNCTION__);
8605 VOS_ASSERT(0) ;
8606 return ;
8607 }
8608
8609 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8610 vos_mem_free(pWdaParams->wdaMsgParam);
8611 vos_mem_free(pWdaParams) ;
8612
8613 return ;
8614}
8615
8616/*
8617 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
8618 * Request to WDI to delete WOWL Bcast pattern
8619 */
8620VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
8621 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
8622{
8623 VOS_STATUS status = VOS_STATUS_SUCCESS;
8624 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
8625 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
8626 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
8627 tWDA_ReqParams *pWdaParams ;
8628
8629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8630 "------> %s " ,__FUNCTION__);
8631
8632 if(NULL == wdiWowlDelBcPtrnInfo)
8633 {
8634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8636 VOS_ASSERT(0);
8637 return VOS_STATUS_E_NOMEM;
8638 }
8639 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8640 if(NULL == pWdaParams)
8641 {
8642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8643 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8644 VOS_ASSERT(0);
8645 vos_mem_free(wdiWowlDelBcPtrnInfo);
8646 return VOS_STATUS_E_NOMEM;
8647 }
8648
8649 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
8650 pWowlDelBcPtrnParams->ucPatternId;
8651
8652 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
8653
8654 /* Store param pointer as passed in by caller */
8655 /* store Params pass it to WDI */
8656 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
8657 pWdaParams->pWdaContext = pWDA;
8658 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
8659
8660 status = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
8661 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
8662
8663 if(IS_WDI_STATUS_FAILURE(status))
8664 {
8665 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8666 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
8667 vos_mem_free(pWdaParams->wdaMsgParam) ;
8668 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8669 vos_mem_free(pWdaParams) ;
8670 }
8671
8672 return CONVERT_WDI2VOS_STATUS(status) ;
8673
8674}/*WDA_ProcessWowlDelBcPtrnReq*/
8675
8676/*
8677 * FUNCTION: WDA_WowlEnterReqCallback
8678 *
8679 */
8680void WDA_WowlEnterReqCallback(WDI_Status status, void* pUserData)
8681{
8682 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8683 tWDA_CbContext *pWDA;
8684 tSirHalWowlEnterParams *pWowlEnterParams;
8685
8686 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8687 "<------ %s " ,__FUNCTION__);
8688
8689 if(NULL == pWdaParams)
8690 {
8691 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8692 "%s: pWdaParams received NULL", __FUNCTION__);
8693 VOS_ASSERT(0) ;
8694 return ;
8695 }
8696
8697 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8698 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
8699
8700
8701 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8702 vos_mem_free(pWdaParams) ;
8703
8704
8705 pWowlEnterParams->status = CONVERT_WDI2SIR_STATUS(status) ;
8706
8707 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
8708
8709 return ;
8710}
8711
8712/*
8713 * FUNCTION: WDA_ProcessWowlEnterReq
8714 * Request to WDI to enter WOWL
8715 */
8716VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
8717 tSirHalWowlEnterParams *pWowlEnterParams)
8718{
8719 VOS_STATUS status = VOS_STATUS_SUCCESS;
8720 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
8721 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
8722 sizeof(WDI_WowlEnterReqParamsType)) ;
8723 tWDA_ReqParams *pWdaParams ;
8724
8725 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8726 "------> %s " ,__FUNCTION__);
8727
8728 if(NULL == wdiWowlEnterInfo)
8729 {
8730 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8731 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8732 VOS_ASSERT(0);
8733 return VOS_STATUS_E_NOMEM;
8734 }
8735 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8736 if(NULL == pWdaParams)
8737 {
8738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8739 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8740 VOS_ASSERT(0);
8741 vos_mem_free(wdiWowlEnterInfo);
8742 return VOS_STATUS_E_NOMEM;
8743 }
8744
8745 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
8746 pWowlEnterParams->magicPtrn,
8747 sizeof(tSirMacAddr));
8748
8749 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
8750 pWowlEnterParams->ucMagicPktEnable;
8751
8752 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
8753 pWowlEnterParams->ucPatternFilteringEnable;
8754
8755 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
8756 pWowlEnterParams->ucUcastPatternFilteringEnable;
8757
8758 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
8759 pWowlEnterParams->ucWowChnlSwitchRcv;
8760
8761 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
8762 pWowlEnterParams->ucWowDeauthRcv;
8763
8764 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
8765 pWowlEnterParams->ucWowDisassocRcv;
8766
8767 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
8768 pWowlEnterParams->ucWowMaxMissedBeacons;
8769
8770 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
8771 pWowlEnterParams->ucWowMaxSleepUsec;
8772
8773#ifdef WLAN_WAKEUP_EVENTS
8774 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
8775 pWowlEnterParams->ucWoWEAPIDRequestEnable;
8776
8777 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
8778 pWowlEnterParams->ucWoWEAPOL4WayEnable;
8779
8780 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
8781 pWowlEnterParams->ucWowNetScanOffloadMatch;
8782
8783 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
8784 pWowlEnterParams->ucWowGTKRekeyError;
8785
8786 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
8787 pWowlEnterParams->ucWoWBSSConnLoss;
8788#endif // WLAN_WAKEUP_EVENTS
8789
8790 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
8791
8792 /* Store param pointer as passed in by caller */
8793 /* store Params pass it to WDI */
8794 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
8795 pWdaParams->pWdaContext = pWDA;
8796 pWdaParams->wdaMsgParam = pWowlEnterParams;
8797
8798 status = WDI_WowlEnterReq(wdiWowlEnterInfo,
8799 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
8800
8801 if(IS_WDI_STATUS_FAILURE(status))
8802 {
8803 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8804 "Failure in Wowl enter REQ WDI API, free all the memory " );
8805 vos_mem_free(pWdaParams->wdaMsgParam) ;
8806 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8807 vos_mem_free(pWdaParams) ;
8808 }
8809
8810 return CONVERT_WDI2VOS_STATUS(status) ;
8811
8812}/*WDA_ProcessWowlEnterReq*/
8813
8814/*
8815 * FUNCTION: WDA_WowlExitReqCallback
8816 *
8817 */
8818void WDA_WowlExitReqCallback(WDI_Status status, void* pUserData)
8819{
8820 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8821
8822 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8823 "<------ %s " ,__FUNCTION__);
8824
8825 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
8826
8827 return ;
8828}
8829
8830/*
8831 * FUNCTION: WDA_ProcessWowlExitReq
8832 * Request to WDI to add WOWL Bcast pattern
8833 */
8834VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA)
8835{
8836 VOS_STATUS status = VOS_STATUS_SUCCESS;
8837
8838 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8839 "------> %s " ,__FUNCTION__);
8840
8841 status = WDI_WowlExitReq((WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWDA);
8842
8843 if(IS_WDI_STATUS_FAILURE(status))
8844 {
8845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8846 "Failure in Wowl exit REQ WDI API, free all the memory " );
8847 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8848 vos_mem_free(pWDA->wdaMsgParam);
8849 pWDA->wdaWdiApiMsgParam = NULL;
8850 pWDA->wdaMsgParam = NULL;
8851 }
8852
8853 return CONVERT_WDI2VOS_STATUS(status) ;
8854
8855}/*WDA_ProcessWowlExitReq*/
8856
8857/*
8858 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
8859 * Request to WDI to determine whether a given station is capable of
8860 * using HW-based frame translation
8861 */
8862v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
8863 tANI_U8 staIdx)
8864{
8865 return WDI_IsHwFrameTxTranslationCapable(staIdx);
8866}
8867
8868/*
8869 * FUNCTION: WDA_NvDownloadReqCallback
8870 * send NV Download RSP back to PE
8871 */
8872void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
8873 void* pUserData)
8874{
8875
8876 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
8877
8878 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8879 "<------ %s " ,__FUNCTION__);
8880
8881 /*Cleaning */
8882 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8883 pWDA->wdaWdiApiMsgParam = NULL;
8884 pWDA->wdaMsgParam = NULL;
8885
8886 vos_WDAComplete_cback(pWDA->pVosContext);
8887
8888 return ;
8889}
8890
8891/*
8892 * FUNCTION: WDA_ProcessNvDownloadReq
8893 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
8894 */
8895VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
8896{
8897 /* Initialize the local Variables*/
8898 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8899 v_VOID_t *pNvBuffer=NULL;
8900 v_SIZE_t bufferSize = 0;
8901 WDI_Status status = WDI_STATUS_E_FAILURE;
8902 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
8903
8904 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8905 "------> %s " ,__FUNCTION__);
8906
8907 if(NULL == pWDA)
8908 {
8909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8910 "%s:pWDA is NULL", __FUNCTION__);
8911 return VOS_STATUS_E_FAILURE;
8912 }
8913 if(NULL != pWDA->wdaWdiApiMsgParam)
8914 {
8915 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8916 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8917 return VOS_STATUS_E_FAILURE;
8918 }
8919
8920 /* Get the NV structure base address and size from VOS */
8921 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
8922
8923 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
8924 sizeof(WDI_NvDownloadReqParamsType)) ;
8925
8926 if(NULL == wdiNvDownloadReqParam)
8927 {
8928 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8929 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8930 VOS_ASSERT(0);
8931 return VOS_STATUS_E_NOMEM;
8932 }
8933
8934 /* Copy Params to wdiNvDownloadReqParam*/
8935 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
8936 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
8937
8938 /* store Params pass it to WDI */
8939 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
8940
8941 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
8942
8943 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
8944 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
8945
8946 if(IS_WDI_STATUS_FAILURE(status))
8947 {
8948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8949 "Failure in NV Download REQ Params WDI API, free all the memory " );
8950 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8951 pWDA->wdaWdiApiMsgParam = NULL;
8952 }
8953
8954 return CONVERT_WDI2VOS_STATUS(status) ;
8955
8956}
8957/*
8958 * FUNCTION: WDA_FlushAcReqCallback
8959 * send Flush AC RSP back to TL
8960 */
8961void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
8962{
8963 vos_msg_t wdaMsg = {0} ;
8964 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8965 tFlushACReq *pFlushACReqParams;
8966 tFlushACRsp *pFlushACRspParams;
8967
8968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8969 "<------ %s " ,__FUNCTION__);
8970 if(NULL == pWdaParams)
8971 {
8972 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8973 "%s: pWdaParams received NULL", __FUNCTION__);
8974 VOS_ASSERT(0) ;
8975 return ;
8976 }
8977
8978 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
8979 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
8980 if(NULL == pFlushACRspParams)
8981 {
8982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8983 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8984 VOS_ASSERT(0);
8985 return ;
8986 }
8987 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
8988 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
8989 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
8990 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
8991 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
8992 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
8993
8994 vos_mem_free(pWdaParams->wdaMsgParam) ;
8995 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8996 vos_mem_free(pWdaParams);
8997
8998 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8999 wdaMsg.bodyptr = (void *)pFlushACRspParams;
9000 // POST message to TL
9001 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
9002
9003
9004 return ;
9005}
9006
9007/*
9008 * FUNCTION: WDA_ProcessFlushAcReq
9009 * Request to WDI to Update the DELBA REQ params.
9010 */
9011VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
9012 tFlushACReq *pFlushAcReqParams)
9013{
9014 WDI_Status status = WDI_STATUS_SUCCESS ;
9015 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
9016 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
9017 sizeof(WDI_FlushAcReqParamsType)) ;
9018 tWDA_ReqParams *pWdaParams ;
9019
9020 if(NULL == wdiFlushAcReqParam)
9021 {
9022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9023 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9024 VOS_ASSERT(0);
9025 return VOS_STATUS_E_NOMEM;
9026 }
9027 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9028 if(NULL == pWdaParams)
9029 {
9030 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9031 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9032 VOS_ASSERT(0);
9033 vos_mem_free(wdiFlushAcReqParam);
9034 return VOS_STATUS_E_NOMEM;
9035 }
9036
9037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9038 "------> %s " ,__FUNCTION__);
9039
9040 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
9041 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
9042 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
9043 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
9044
9045 /* Store Flush AC pointer, as this will be used for response */
9046 /* store Params pass it to WDI */
9047 pWdaParams->pWdaContext = pWDA;
9048 pWdaParams->wdaMsgParam = pFlushAcReqParams;
9049 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
9050
9051 status = WDI_FlushAcReq(wdiFlushAcReqParam,
9052 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
9053
9054 if(IS_WDI_STATUS_FAILURE(status))
9055 {
9056 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9057 "Failure in Flush AC REQ Params WDI API, free all the memory " );
9058 vos_mem_free(pWdaParams->wdaMsgParam) ;
9059 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9060 vos_mem_free(pWdaParams) ;
9061 //TODO: respond to TL with failure
9062 }
9063
9064 return CONVERT_WDI2VOS_STATUS(status) ;
9065
9066}
9067
9068/*
9069 * FUNCTION: WDA_BtAmpEventReqCallback
9070 *
9071 */
9072void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
9073{
9074 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9075 tWDA_CbContext *pWDA;
9076 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
9077
9078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9079 "<------ %s " ,__FUNCTION__);
9080
9081 if(NULL == pWdaParams)
9082 {
9083 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9084 "%s: pWdaParams received NULL", __FUNCTION__);
9085 VOS_ASSERT(0) ;
9086 return ;
9087 }
9088 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
9089 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
9090 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
9091 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
9092 {
9093 pWDA->wdaAmpSessionOn = VOS_FALSE;
9094 }
9095
9096 vos_mem_free(pWdaParams->wdaMsgParam) ;
9097 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9098 vos_mem_free(pWdaParams) ;
9099 /*
9100 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
9101 * param here
9102 */
9103
9104 return ;
9105}
9106
9107
9108/*
9109 * FUNCTION: WDA_ProcessBtAmpEventReq
9110 * Request to WDI to Update with BT AMP events.
9111 */
9112VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
9113 tSmeBtAmpEvent *pBtAmpEventParams)
9114{
9115 WDI_Status status = WDI_STATUS_SUCCESS ;
9116 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
9117 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
9118 sizeof(WDI_BtAmpEventParamsType)) ;
9119 tWDA_ReqParams *pWdaParams ;
9120
9121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9122 "------> %s " ,__FUNCTION__);
9123
9124 if(NULL == wdiBtAmpEventParam)
9125 {
9126 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9127 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9128 VOS_ASSERT(0);
9129 return VOS_STATUS_E_NOMEM;
9130 }
9131 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9132 if(NULL == pWdaParams)
9133 {
9134 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9135 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9136 VOS_ASSERT(0);
9137 vos_mem_free(wdiBtAmpEventParam);
9138 return VOS_STATUS_E_NOMEM;
9139 }
9140
9141 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
9142 pBtAmpEventParams->btAmpEventType;
9143
9144 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
9145
9146 /* Store BT AMP event pointer, as this will be used for response */
9147 /* store Params pass it to WDI */
9148 pWdaParams->pWdaContext = pWDA;
9149 pWdaParams->wdaMsgParam = pBtAmpEventParams;
9150 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
9151
9152 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
9153 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
9154
9155 if(IS_WDI_STATUS_FAILURE(status))
9156 {
9157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9158 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
9159 vos_mem_free(pWdaParams->wdaMsgParam) ;
9160 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9161 vos_mem_free(pWdaParams) ;
9162 }
9163
9164 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
9165 {
9166 pWDA->wdaAmpSessionOn = VOS_TRUE;
9167 }
9168 return CONVERT_WDI2VOS_STATUS(status) ;
9169
9170}
9171
9172
9173#ifdef ANI_MANF_DIAG
9174/*
9175 * FUNCTION: WDA_FTMCommandReqCallback
9176 * Handle FTM CMD response came from HAL
9177 * Route responce to HDD FTM
9178 */
9179void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
9180 void *usrData)
9181{
9182 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
9183
9184 if((NULL == pWDA) || (NULL == ftmCmdRspData))
9185 {
9186 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9187 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
9188 return;
9189 }
9190
9191 /* Release Current FTM Command Request */
9192 vos_mem_free(pWDA->wdaFTMCmdReq);
9193 pWDA->wdaFTMCmdReq = NULL;
9194
9195#ifndef WLAN_FTM_STUB
9196 /* Post FTM Responce to HDD FTM */
9197 wlan_sys_ftm(ftmCmdRspData);
9198#endif /* WLAN_FTM_STUB */
9199
9200 return;
9201}
9202
9203/*
9204 * FUNCTION: WDA_ProcessFTMCommand
9205 * Send FTM command to WDI
9206 */
9207VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
9208 tPttMsgbuffer *pPTTFtmCmd)
9209{
9210 WDI_Status status = WDI_STATUS_SUCCESS;
9211 WDI_FTMCommandReqType *ftmCMDReq = NULL;
9212
9213 ftmCMDReq = (WDI_FTMCommandReqType *)
9214 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
9215 if(NULL == ftmCMDReq)
9216 {
9217 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9218 "WDA FTM Command buffer alloc fail");
9219 return VOS_STATUS_E_NOMEM;
9220 }
9221
9222 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
9223 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
9224
9225 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
9226
9227 /* Send command to WDI */
9228 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
9229
9230 return status;
9231}
9232#endif /* ANI_MANF_DIAG */
9233
9234/*
9235 * FUNCTION: WDA_SetTxPerTrackingReqCallback
9236 *
9237 */
9238void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
9239{
9240 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9241
9242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9243 "<------ %s " ,__FUNCTION__);
9244
9245 if(NULL == pWdaParams)
9246 {
9247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9248 "%s: pWdaParams received NULL", __FUNCTION__);
9249 VOS_ASSERT(0) ;
9250 return ;
9251 }
9252
9253 if(NULL != pWdaParams->wdaMsgParam)
9254 {
9255 vos_mem_free(pWdaParams->wdaMsgParam);
9256 }
9257
9258 if(NULL != pWdaParams->wdaWdiApiMsgParam)
9259 {
9260 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9261 }
9262
9263 vos_mem_free(pWdaParams);
9264
9265 return ;
9266}
9267
9268#ifdef WLAN_FEATURE_GTK_OFFLOAD
9269/*
9270 * FUNCTION: WDA_HostOffloadReqCallback
9271 *
9272 */
9273void WDA_GTKOffloadReqCallback(WDI_Status status, void* pUserData)
9274{
9275 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9276
9277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9278 "<------ %s " ,__FUNCTION__);
9279
9280 VOS_ASSERT(NULL != pWdaParams);
9281
9282 vos_mem_free(pWdaParams->wdaMsgParam) ;
9283 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9284 vos_mem_free(pWdaParams) ;
9285
9286 //print a msg, nothing else to do
9287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9288 "WDA_GTKOffloadReqCallback invoked " );
9289
9290 return ;
9291}
9292
9293/*
9294 * FUNCTION: WDA_ProcessGTKOffloadReq
9295 * Request to WDI to set the filter to minimize unnecessary host wakeup due
9296 * to broadcast traffic (sta mode).
9297 */
9298VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
9299 tpSirGtkOffloadParams pGtkOffloadParams)
9300{
9301 VOS_STATUS status = VOS_STATUS_SUCCESS;
9302 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
9303 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
9304 sizeof(WDI_GtkOffloadReqMsg)) ;
9305 tWDA_ReqParams *pWdaParams ;
9306
9307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9308 "------> %s " ,__FUNCTION__);
9309
9310 if(NULL == wdiGtkOffloadReqMsg)
9311 {
9312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9313 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9314 VOS_ASSERT(0);
9315 return VOS_STATUS_E_NOMEM;
9316 }
9317
9318 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9319 if(NULL == pWdaParams)
9320 {
9321 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9322 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9323 VOS_ASSERT(0);
9324 vos_mem_free(wdiGtkOffloadReqMsg);
9325 return VOS_STATUS_E_NOMEM;
9326 }
9327
9328 //
9329 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
9330 //
9331 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
9332 // Copy KCK
9333 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
9334 // Copy KEK
9335 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
9336 // Copy KeyReplayCounter
9337 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
9338 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
9339
9340 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
9341
9342 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
9343 (NULL == pWDA->wdaWdiApiMsgParam));
9344
9345 /* Store Params pass it to WDI */
9346 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
9347 pWdaParams->pWdaContext = pWDA;
9348 /* Store param pointer as passed in by caller */
9349 pWdaParams->wdaMsgParam = pGtkOffloadParams;
9350
9351 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
9352
9353 if(IS_WDI_STATUS_FAILURE(status))
9354 {
9355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9356 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
9357 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
9358 vos_mem_free(pWdaParams->wdaMsgParam);
9359 vos_mem_free(pWdaParams);
9360 }
9361
9362 return CONVERT_WDI2VOS_STATUS(status) ;
9363}
9364
9365/*
9366 * FUNCTION: WDA_GtkOffloadGetInfoCallback
9367 *
9368 */
9369void WDA_GtkOffloadGetInfoCallback(WDI_Status status, void * pUserData)
9370{
9371 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9372 tWDA_CbContext *pWDA;
9373 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
9374 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
9375 tANI_U8 i;
9376 vos_msg_t vosMsg;
9377
9378 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9379 "<------ %s " ,__FUNCTION__);
9380
9381 VOS_ASSERT(NULL != pWdaParams);
9382
9383 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
9384 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
9385
9386 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
9387 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
9388
9389 /* Message Header */
9390 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
9391 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
9392
9393 pGtkOffloadGetInfoRsp->ulStatus = pGtkOffloadGetInfoReq->ulStatus;
9394 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pGtkOffloadGetInfoReq->ullKeyReplayCounter;
9395 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pGtkOffloadGetInfoReq->ulTotalRekeyCount;
9396 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pGtkOffloadGetInfoReq->ulGTKRekeyCount;
9397 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pGtkOffloadGetInfoReq->ulIGTKRekeyCount;
9398
9399 /* VOS message wrapper */
9400 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
9401 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
9402 vosMsg.bodyval = 0;
9403
9404 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9405 {
9406 /* free the mem and return */
9407 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
9408 }
9409
9410 vos_mem_free(pWdaParams->wdaMsgParam) ;
9411 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9412 vos_mem_free(pWdaParams) ;
9413}
9414#endif
9415
9416/*
9417 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
9418 * Request to WDI to set Tx Per Tracking configurations
9419 */
9420VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
9421{
9422 VOS_STATUS status = VOS_STATUS_SUCCESS;
9423 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
9424 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
9425 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
9426 tWDA_ReqParams *pWdaParams ;
9427
9428 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9429 "------> %s " ,__FUNCTION__);
9430
9431 if(NULL == pwdiSetTxPerTrackingReqParams)
9432 {
9433 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9434 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9435 vos_mem_free(pTxPerTrackingParams);
9436 VOS_ASSERT(0);
9437 return VOS_STATUS_E_NOMEM;
9438 }
9439 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9440 if(NULL == pWdaParams)
9441 {
9442 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9443 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9444 vos_mem_free(pwdiSetTxPerTrackingReqParams);
9445 vos_mem_free(pTxPerTrackingParams);
9446 VOS_ASSERT(0);
9447 return VOS_STATUS_E_NOMEM;
9448 }
9449
9450 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
9451 pTxPerTrackingParams->ucTxPerTrackingEnable;
9452 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
9453 pTxPerTrackingParams->ucTxPerTrackingPeriod;
9454 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
9455 pTxPerTrackingParams->ucTxPerTrackingRatio;
9456 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
9457 pTxPerTrackingParams->uTxPerTrackingWatermark;
9458
9459 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
9460
9461 /* Store param pointer as passed in by caller */
9462 /* store Params pass it to WDI
9463 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
9464 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
9465 pWdaParams->pWdaContext = pWDA;
9466 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
9467
9468 status = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
9469 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
9470
9471 if(IS_WDI_STATUS_FAILURE(status))
9472 {
9473 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9474 "Failure in Set Tx PER REQ WDI API, free all the memory " );
9475 vos_mem_free(pWdaParams->wdaMsgParam) ;
9476 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9477 vos_mem_free(pWdaParams) ;
9478 }
9479
9480 return CONVERT_WDI2VOS_STATUS(status) ;
9481
9482}/*WDA_ProcessSetTxPerTrackingReq*/
9483
9484/*
9485 * FUNCTION: WDA_HALDumpCmdCallback
9486 * Send the VOS complete .
9487 */
9488void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
9489 void* pUserData)
9490{
9491 tANI_U8 *buffer = NULL;
9492 tWDA_CbContext *pWDA = NULL;
9493 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9494
9495 if(NULL == pWdaParams)
9496 {
9497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9498 "%s: pWdaParams received NULL", __FUNCTION__);
9499 VOS_ASSERT(0) ;
9500 return ;
9501 }
9502
9503 pWDA = pWdaParams->pWdaContext;
9504 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
9505
9506 if(wdiRspParams->usBufferLen > 0)
9507 {
9508 /*Copy the Resp data to UMAC supplied buffer*/
9509 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
9510 }
9511
9512 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9513 vos_mem_free(pWdaParams);
9514
9515 /* Indicate VOSS about the start complete */
9516 vos_WDAComplete_cback(pWDA->pVosContext);
9517
9518 return ;
9519}
9520
9521
9522/*
9523 * FUNCTION: WDA_ProcessHALDumpCmdReq
9524 * Send Dump command to WDI
9525 */
9526VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
9527 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
9528 tANI_U32 arg4, tANI_U8 *pBuffer)
9529{
9530 WDI_Status status = WDI_STATUS_SUCCESS;
9531 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
9532 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
9533 tWDA_ReqParams *pWdaParams ;
9534 pVosContextType pVosContext = NULL;
9535 VOS_STATUS vStatus;
9536
9537 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
9538 (void *)pMac);
9539
9540 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9541 if(NULL == pWdaParams)
9542 {
9543 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9544 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9545 return VOS_STATUS_E_NOMEM;
9546 }
9547
9548 /* Allocate memory WDI request structure*/
9549 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
9550 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
9551 if(NULL == wdiHALDumpCmdReqParam)
9552 {
9553 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9554 "WDA HAL DUMP Command buffer alloc fail");
9555 vos_mem_free(pWdaParams);
9556 return WDI_STATUS_E_FAILURE;
9557 }
9558
9559 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
9560
9561 /* Extract the arguments */
9562 wdiHalDumpCmdInfo->command = cmd;
9563 wdiHalDumpCmdInfo->argument1 = arg1;
9564 wdiHalDumpCmdInfo->argument2 = arg2;
9565 wdiHalDumpCmdInfo->argument3 = arg3;
9566 wdiHalDumpCmdInfo->argument4 = arg4;
9567
9568 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
9569
9570 pWdaParams->pWdaContext = pVosContext->pWDAContext;
9571
9572 /* Response message will be passed through the buffer */
9573 pWdaParams->wdaMsgParam = (void *)pBuffer;
9574
9575 /* store Params pass it to WDI */
9576 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
9577
9578 /* Send command to WDI */
9579 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
9580
9581 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
9582
9583 if ( vStatus != VOS_STATUS_SUCCESS )
9584 {
9585 if ( vStatus == VOS_STATUS_E_TIMEOUT )
9586 {
9587 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
9588 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
9589 }
9590 else
9591 {
9592 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
9593 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
9594 }
9595 VOS_ASSERT(0);
9596 }
9597 return status;
9598}
9599
9600#ifdef WLAN_FEATURE_GTK_OFFLOAD
9601/*
9602 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
9603 * Request to WDI to get GTK Offload Information
9604 */
9605VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
9606 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
9607{
9608 VOS_STATUS status = VOS_STATUS_SUCCESS;
9609 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
9610 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
9611 tWDA_ReqParams *pWdaParams ;
9612
9613 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
9614 {
9615 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9616 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9617 VOS_ASSERT(0);
9618 return VOS_STATUS_E_NOMEM;
9619 }
9620
9621 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9622 if(NULL == pWdaParams)
9623 {
9624 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9625 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9626 VOS_ASSERT(0);
9627 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
9628 return VOS_STATUS_E_NOMEM;
9629 }
9630
9631 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
9632
9633 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
9634 (NULL == pWDA->wdaWdiApiMsgParam));
9635
9636 /* Store Params pass it to WDI */
9637 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
9638 pWdaParams->pWdaContext = pWDA;
9639 /* Store param pointer as passed in by caller */
9640 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
9641
9642 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
9643
9644 if(IS_WDI_STATUS_FAILURE(status))
9645 {
9646 /* failure returned by WDI API */
9647 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9648 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
9649 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9650 vos_mem_free(pWdaParams) ;
9651 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
9652 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
9653 }
9654
9655 return CONVERT_WDI2VOS_STATUS(status) ;
9656}
9657#endif // WLAN_FEATURE_GTK_OFFLOAD
9658
9659/*
9660 * -------------------------------------------------------------------------
9661 * DATA interface with WDI for Mgmt Frames
9662 * -------------------------------------------------------------------------
9663 */
9664
9665/*
9666 * FUNCTION: WDA_TxComplete
9667 * Callback function for the WDA_TxPacket
9668 */
9669VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
9670 VOS_STATUS status )
9671{
9672
9673 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
9674 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
9675
9676 if(NULL == wdaContext)
9677 {
9678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9679 "%s:pWDA is NULL",
9680 __FUNCTION__);
9681 VOS_ASSERT(0);
9682 return VOS_STATUS_E_FAILURE;
9683 }
9684
9685 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
9686 if( NULL!=wdaContext->pTxCbFunc)
9687 {
9688 /*check if packet is freed already*/
9689 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
9690 {
9691 wdaContext->pTxCbFunc(pMac, pData);
9692 }
9693 else
9694 {
9695 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
9696 "%s:packet (0x%X) is already freed",
9697 __FUNCTION__, pData);
9698 //Return from here since we reaching here because the packet already timeout
9699 return status;
9700 }
9701
9702 }
9703
9704 /*
9705 * Trigger the event to bring the HAL TL Tx complete function to come
9706 * out of wait
9707 * Let the coe above to complete the packet first. When this event is set,
9708 * the thread waiting for the event may run and set Vospacket_freed causing the original
9709 * packet not being freed.
9710 */
9711 status = vos_event_set(&wdaContext->txFrameEvent);
9712 if(!VOS_IS_STATUS_SUCCESS(status))
9713 {
9714 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9715 "NEW VOS Event Set failed - status = %d \n", status);
9716 }
9717
9718 return status;
9719}
9720
9721/*
9722 * FUNCTION: WDA_TxPacket
9723 * Forward TX management frame to WDI
9724 */
9725VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
9726 void *pFrmBuf,
9727 tANI_U16 frmLen,
9728 eFrameType frmType,
9729 eFrameTxDir txDir,
9730 tANI_U8 tid,
9731 pWDATxRxCompFunc pCompFunc,
9732 void *pData,
9733 pWDAAckFnTxComp pAckTxComp,
9734 tANI_U8 txFlag)
9735{
9736 VOS_STATUS status = VOS_STATUS_SUCCESS ;
9737 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
9738 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
9739 tANI_U8 eventIdx = 0;
9740 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
9741 tpAniSirGlobal pMac;
9742
9743 if((NULL == pWDA)||(NULL == pFrmBuf))
9744 {
9745 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9746 "%s:pWDA %x or pFrmBuf %x is NULL",
9747 __FUNCTION__,pWDA,pFrmBuf);
9748 VOS_ASSERT(0);
9749 return VOS_STATUS_E_FAILURE;
9750 }
9751
9752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9753 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
9754
9755 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
9756 if(NULL == pMac)
9757 {
9758 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9759 "%s:pMac is NULL", __FUNCTION__);
9760 VOS_ASSERT(0);
9761 return VOS_STATUS_E_FAILURE;
9762 }
9763
9764
9765
9766 /* store the call back function in WDA context */
9767 pWDA->pTxCbFunc = pCompFunc;
9768 /* store the call back for the function of ackTxComplete */
9769 if( pAckTxComp )
9770 {
9771 if( NULL == pWDA->pAckTxCbFunc )
9772 {
9773 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
9774 pWDA->pAckTxCbFunc = pAckTxComp;
9775 if( VOS_STATUS_SUCCESS !=
9776 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
9777 {
9778 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9779 "Tx Complete Timer Start Failed ");
9780 pWDA->pAckTxCbFunc = NULL;
9781 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9782 return VOS_STATUS_E_FAILURE;
9783 }
9784 }
9785 else
9786 {
9787 /* Already TxComp is active no need to active again */
9788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9789 "There is already one request pending for tx complete\n");
9790 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9791 return VOS_STATUS_E_FAILURE;
9792 }
9793 }
9794
9795 /* Reset the event to be not signalled */
9796 status = vos_event_reset(&pWDA->txFrameEvent);
9797 if(!VOS_IS_STATUS_SUCCESS(status))
9798 {
9799 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9800 "VOS Event reset failed - status = %d\n",status);
9801 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9802 if( pAckTxComp )
9803 {
9804 pWDA->pAckTxCbFunc = NULL;
9805 if( VOS_STATUS_SUCCESS !=
9806 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9807 {
9808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9809 "Tx Complete timeout Timer Stop Failed ");
9810 }
9811 }
9812 return VOS_STATUS_E_FAILURE;
9813 }
9814
9815 /* Get system role, use the self station if in unknown role or STA role */
9816 systemRole = wdaGetGlobalSystemRole(pMac);
9817
9818 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
9819 (( eSYSTEM_STA_ROLE == systemRole )
9820#ifdef FEATURE_WLAN_CCX
9821 && frmType == HAL_TXRX_FRM_802_11_MGMT
9822#endif
9823 ))
9824 {
9825 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9826 }
9827
9828 /* Do not divert Disassoc/Deauth frames through self station because a delay of
9829 * 300ms is added beofre trigerring DEL STA so let deuath gets delivered at TIM */
9830 if ((pFc->type == SIR_MAC_MGMT_FRAME))
9831 {
9832 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
9833 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9834 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
9835 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
9836 {
9837 if( (systemRole == eSYSTEM_AP_ROLE) && ( (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9838 (pFc->subType == SIR_MAC_MGMT_DISASSOC) ) )
9839 {
9840 /*Do not request self STA for deauth/disassoc let it go through peer STA and
9841 *broadcast STA and get delivered at TIM for power save stations*/
9842 }
9843 else
9844 {
9845 /*Send Probe request frames on self sta idx*/
9846 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9847 }
9848 }
9849 /* Since we donot want probe responses to be retried, send probe responses
9850 through the NO_ACK queues */
9851 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
9852 {
9853 //probe response is sent out using self station and no retries options.
9854 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
9855 }
9856 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
9857 {
9858 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
9859 }
9860 }
9861
9862 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
9863
9864 /*Set frame tag to 0
9865 We will use the WDA user data in order to tag a frame as expired*/
9866 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9867 (v_PVOID_t)0);
9868
9869
9870 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
9871 frmLen, ucTypeSubType, tid,
9872 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
9873 {
9874 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9875 "Sending Mgmt Frame failed - status = %d\n", status);
9876 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9877 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
9878 if( pAckTxComp )
9879 {
9880 pWDA->pAckTxCbFunc = NULL;
9881 if( VOS_STATUS_SUCCESS !=
9882 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9883 {
9884 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9885 "Tx Complete timeout Timer Stop Failed ");
9886 }
9887 }
9888 return VOS_STATUS_E_FAILURE;
9889 }
9890
9891 /*
9892 * Wait for the event to be set by the TL, to get the response of TX
9893 * complete, this event should be set by the Callback function called by TL
9894 */
9895 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
9896 &eventIdx);
9897 if(!VOS_IS_STATUS_SUCCESS(status))
9898 {
9899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9900 "%s: Status %d when waiting for TX Frame Event",
9901 __FUNCTION__, status);
9902
9903 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
9904 after the packet gets completed(packet freed once)*/
9905
9906 /* check whether the packet was freed already,so need not free again when
9907 * TL calls the WDA_Txcomplete routine
9908 */
9909 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
9910 {
9911 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9912 }
9913 if( pAckTxComp )
9914 {
9915 pWDA->pAckTxCbFunc = NULL;
9916 if( VOS_STATUS_SUCCESS !=
9917 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9918 {
9919 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9920 "Tx Complete timeout Timer Stop Failed ");
9921 }
9922 }
9923 status = VOS_STATUS_E_FAILURE;
9924 }
9925
9926 return status;
9927}
9928
9929
9930/*
9931 * FUNCTION: WDA_McProcessMsg
9932 * Trigger DAL-AL to start CFG download
9933 */
9934VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
9935{
9936 VOS_STATUS status = VOS_STATUS_SUCCESS;
9937 tWDA_CbContext *pWDA = NULL ;
9938
9939 if(NULL == pMsg)
9940 {
9941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9942 "%s:pMsg is NULL", __FUNCTION__);
9943 VOS_ASSERT(0);
9944 return VOS_STATUS_E_FAILURE;
9945 }
9946
9947 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
9948 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
9949
9950 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
9951 if(NULL == pWDA )
9952 {
9953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9954 "%s:pWDA is NULL", __FUNCTION__);
9955 VOS_ASSERT(0);
9956 return VOS_STATUS_E_FAILURE;
9957 }
9958
9959 /* Process all the WDA messages.. */
9960 switch( pMsg->type )
9961 {
9962 case WNI_CFG_DNLD_REQ:
9963 {
9964 status = WDA_WniCfgDnld(pWDA);
9965
9966 /* call WDA complete event if config download success */
9967 if( VOS_IS_STATUS_SUCCESS(status) )
9968 {
9969 vos_WDAComplete_cback(pVosContext);
9970 }
9971 else
9972 {
9973 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9974 "WDA Config Download failure" );
9975 }
9976 break ;
9977 }
9978
9979 /*
9980 * Init SCAN request from PE, convert it into DAL format
9981 * and send it to DAL
9982 */
9983 case WDA_INIT_SCAN_REQ:
9984 {
9985 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9986 break ;
9987 }
9988 /* start SCAN request from PE */
9989 case WDA_START_SCAN_REQ:
9990 {
9991 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9992 break ;
9993 }
9994 /* end SCAN request from PE */
9995 case WDA_END_SCAN_REQ:
9996 {
9997 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9998 break ;
9999 }
10000 /* end SCAN request from PE */
10001 case WDA_FINISH_SCAN_REQ:
10002 {
10003 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
10004 break ;
10005 }
10006 /* join request from PE */
10007 case WDA_CHNL_SWITCH_REQ:
10008 {
10009 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
10010 {
10011 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
10012 }
10013 else
10014 {
10015 WDA_ProcessChannelSwitchReq(pWDA,
10016 (tSwitchChannelParams*)pMsg->bodyptr) ;
10017 }
10018 break ;
10019 }
10020 /* ADD BSS request from PE */
10021 case WDA_ADD_BSS_REQ:
10022 {
10023 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
10024 break ;
10025 }
10026 case WDA_ADD_STA_REQ:
10027 {
10028 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
10029 break ;
10030 }
10031 case WDA_DELETE_BSS_REQ:
10032 {
10033 wpt_uint8 staIdx;
10034 wpt_uint8 bssIdx = ((tDeleteBssParams *)pMsg->bodyptr)->bssIdx;
10035 wpt_uint8 reservedResourceBySta;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070010036 wpt_uint16 waitLoop = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010037
10038 if (WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, bssIdx, &staIdx))
10039 {
10040 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10041 "%s: Get STA index from BSS index Fail", __FUNCTION__);
10042 VOS_ASSERT(0) ;
10043 }
10044 while (1)
10045 {
10046 reservedResourceBySta = WDI_DS_GetReservedResCountPerSTA(pWDA->pWdiContext, WDI_DATA_POOL_ID, staIdx);
10047 /* Wait till reserved resource by STA must be none */
10048 if (reservedResourceBySta == 0)
10049 {
10050 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10051 "STA %d BSS %d TX RING empty %d", staIdx, bssIdx );
10052 break;
10053
10054 }
10055 else
10056 {
10057 if(waitLoop > WDA_MAX_RETRIES_TILL_RING_EMPTY)
10058 {
10059 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
10060 "TX Ring could not empty, not normal" );
10061 VOS_ASSERT(0);
10062 break;
10063 }
10064 vos_sleep(WDA_WAIT_MSEC_TILL_RING_EMPTY);
10065 waitLoop++;
10066 }
10067 }
10068 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
10069 break ;
10070 }
10071 case WDA_DELETE_STA_REQ:
10072 {
10073 tDeleteStaParams *delSta = (tDeleteStaParams *)pMsg->bodyptr;
10074 wpt_uint8 reservedResourceBySta;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070010075 wpt_uint16 waitLoop = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010076
10077 while (1)
10078 {
10079 reservedResourceBySta = WDI_DS_GetReservedResCountPerSTA(pWDA->pWdiContext, WDI_DATA_POOL_ID, delSta->staIdx);
10080 /* Wait till reserved resource by STA must be none */
10081 if (reservedResourceBySta == 0)
10082 {
10083 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10084 "STA %d TX RING empty %d", delSta->staIdx );
10085 break;
10086 }
10087 else
10088 {
10089 if(waitLoop > WDA_MAX_RETRIES_TILL_RING_EMPTY)
10090 {
10091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
10092 "TX Ring could not empty, not normal" );
10093 VOS_ASSERT(0);
10094 break;
10095 }
10096 vos_sleep(WDA_WAIT_MSEC_TILL_RING_EMPTY);
10097 waitLoop++;
10098 }
10099 }
10100 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
10101 break ;
10102 }
10103 case WDA_CONFIG_PARAM_UPDATE_REQ:
10104 {
10105 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
10106 break ;
10107 }
10108 case WDA_SET_BSSKEY_REQ:
10109 {
10110 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
10111 break ;
10112 }
10113 case WDA_SET_STAKEY_REQ:
10114 {
10115 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
10116 break ;
10117 }
10118 case WDA_SET_STA_BCASTKEY_REQ:
10119 {
10120 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
10121 break ;
10122 }
10123 case WDA_REMOVE_BSSKEY_REQ:
10124 {
10125 WDA_ProcessRemoveBssKeyReq(pWDA,
10126 (tRemoveBssKeyParams *)pMsg->bodyptr);
10127 break ;
10128 }
10129 case WDA_REMOVE_STAKEY_REQ:
10130 {
10131 WDA_ProcessRemoveStaKeyReq(pWDA,
10132 (tRemoveStaKeyParams *)pMsg->bodyptr);
10133 break ;
10134 }
10135 case WDA_REMOVE_STA_BCASTKEY_REQ:
10136 {
10137 /* TODO: currently UMAC is not sending this request, Add the code for
10138 handling this request when UMAC supports */
10139 break;
10140 }
10141#ifdef FEATURE_WLAN_CCX
10142 case WDA_TSM_STATS_REQ:
10143 {
10144 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
10145 break;
10146 }
10147#endif
10148 case WDA_UPDATE_EDCA_PROFILE_IND:
10149 {
10150 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
10151 break;
10152 }
10153 case WDA_ADD_TS_REQ:
10154 {
10155 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
10156 break;
10157 }
10158 case WDA_DEL_TS_REQ:
10159 {
10160 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
10161 break;
10162 }
10163 case WDA_ADDBA_REQ:
10164 {
10165 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
10166 break;
10167 }
10168 case WDA_DELBA_IND:
10169 {
10170 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
10171 break;
10172 }
10173 case WDA_SET_LINK_STATE:
10174 {
10175 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
10176 break;
10177 }
10178 case WDA_GET_STATISTICS_REQ:
10179 {
10180 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
10181 break;
10182 }
10183 case WDA_PWR_SAVE_CFG:
10184 {
10185 if(pWDA->wdaState == WDA_READY_STATE)
10186 {
10187 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
10188 }
10189 else
10190 {
10191 if(NULL != pMsg->bodyptr)
10192 {
10193 vos_mem_free(pMsg->bodyptr);
10194 }
10195 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10196 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
10197 }
10198 break;
10199 }
10200 case WDA_ENTER_IMPS_REQ:
10201 {
10202 if(pWDA->wdaState == WDA_READY_STATE)
10203 {
10204 WDA_ProcessEnterImpsReq(pWDA);
10205 }
10206 else
10207 {
10208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10209 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
10210 }
10211 break;
10212 }
10213 case WDA_EXIT_IMPS_REQ:
10214 {
10215 if(pWDA->wdaState == WDA_READY_STATE)
10216 {
10217 WDA_ProcessExitImpsReq(pWDA);
10218 }
10219 else
10220 {
10221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10222 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
10223 }
10224 break;
10225 }
10226 case WDA_ENTER_BMPS_REQ:
10227 {
10228 if(pWDA->wdaState == WDA_READY_STATE)
10229 {
10230 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
10231 }
10232 else
10233 {
10234 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10235 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
10236 }
10237 break;
10238 }
10239 case WDA_EXIT_BMPS_REQ:
10240 {
10241 if(pWDA->wdaState == WDA_READY_STATE)
10242 {
10243 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
10244 }
10245 else
10246 {
10247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10248 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
10249 }
10250 break;
10251 }
10252 case WDA_ENTER_UAPSD_REQ:
10253 {
10254 if(pWDA->wdaState == WDA_READY_STATE)
10255 {
10256 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
10257 }
10258 else
10259 {
10260 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10261 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
10262 }
10263 break;
10264 }
10265 case WDA_EXIT_UAPSD_REQ:
10266 {
10267 if(pWDA->wdaState == WDA_READY_STATE)
10268 {
10269 WDA_ProcessExitUapsdReq(pWDA);
10270 }
10271 else
10272 {
10273 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10274 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
10275 }
10276 break;
10277 }
10278 case WDA_UPDATE_UAPSD_IND:
10279 {
10280 if(pWDA->wdaState == WDA_READY_STATE)
10281 {
10282 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
10283 }
10284 else
10285 {
10286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10287 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
10288 }
10289 break;
10290 }
10291
10292 case WDA_REGISTER_PE_CALLBACK :
10293 {
10294 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
10295 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
10296 /*TODO: store the PE callback */
10297 /* Do Nothing? MSG Body should be freed at here */
10298 if(NULL != pMsg->bodyptr)
10299 {
10300 vos_mem_free(pMsg->bodyptr);
10301 }
10302 break;
10303 }
10304 case WDA_SYS_READY_IND :
10305 {
10306 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
10307 "Handling msg type WDA_SYS_READY_IND " );
10308 pWDA->wdaState = WDA_READY_STATE;
10309 if(NULL != pMsg->bodyptr)
10310 {
10311 vos_mem_free(pMsg->bodyptr);
10312 }
10313 break;
10314 }
10315 case WDA_BEACON_FILTER_IND :
10316 {
10317 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
10318 break;
10319 }
10320 case WDA_BTC_SET_CFG:
10321 {
10322 /*TODO: handle this while dealing with BTC */
10323 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
10324 "Handling msg type WDA_BTC_SET_CFG " );
10325 /* Do Nothing? MSG Body should be freed at here */
10326 if(NULL != pMsg->bodyptr)
10327 {
10328 vos_mem_free(pMsg->bodyptr);
10329 }
10330 break;
10331 }
10332 case WDA_SIGNAL_BT_EVENT:
10333 {
10334 /*TODO: handle this while dealing with BTC */
10335 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
10336 "Handling msg type WDA_SIGNAL_BT_EVENT " );
10337 /* Do Nothing? MSG Body should be freed at here */
10338 if(NULL != pMsg->bodyptr)
10339 {
10340 vos_mem_free(pMsg->bodyptr);
10341 }
10342 break;
10343 }
10344 case WDA_CFG_RXP_FILTER_REQ:
10345 {
10346 WDA_ProcessConfigureRxpFilterReq(pWDA,
10347 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
10348 break;
10349 }
10350 case WDA_SET_HOST_OFFLOAD:
10351 {
10352 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
10353 break;
10354 }
10355 case WDA_SET_KEEP_ALIVE:
10356 {
10357 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
10358 break;
10359 }
10360#ifdef WLAN_NS_OFFLOAD
10361 case WDA_SET_NS_OFFLOAD:
10362 {
10363 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
10364 break;
10365 }
10366#endif //WLAN_NS_OFFLOAD
10367 case WDA_ADD_STA_SELF_REQ:
10368 {
10369 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
10370 break;
10371 }
10372
10373 case WDA_DEL_STA_SELF_REQ:
10374 {
10375 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
10376 break;
10377 }
10378 case WDA_WOWL_ADD_BCAST_PTRN:
10379 {
10380 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
10381 break;
10382 }
10383 case WDA_WOWL_DEL_BCAST_PTRN:
10384 {
10385 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
10386 break;
10387 }
10388 case WDA_WOWL_ENTER_REQ:
10389 {
10390 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
10391 break;
10392 }
10393 case WDA_WOWL_EXIT_REQ:
10394 {
10395 WDA_ProcessWowlExitReq(pWDA);
10396 break;
10397 }
10398 case WDA_TL_FLUSH_AC_REQ:
10399 {
10400 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
10401 break;
10402 }
10403 case WDA_SIGNAL_BTAMP_EVENT:
10404 {
10405 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
10406 break;
10407 }
10408#ifdef WDA_UT
10409 case WDA_WDI_EVENT_MSG:
10410 {
10411 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
10412 break ;
10413 }
10414#endif
10415 case WDA_UPDATE_BEACON_IND:
10416 {
10417 WDA_ProcessUpdateBeaconParams(pWDA,
10418 (tUpdateBeaconParams *)pMsg->bodyptr);
10419 break;
10420 }
10421 case WDA_SEND_BEACON_REQ:
10422 {
10423 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
10424 break;
10425 }
10426 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
10427 {
10428 WDA_ProcessUpdateProbeRspTemplate(pWDA,
10429 (tSendProbeRespParams *)pMsg->bodyptr);
10430 break;
10431 }
10432#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
10433 case WDA_SET_MAX_TX_POWER_REQ:
10434 {
10435 WDA_ProcessSetMaxTxPowerReq(pWDA,
10436 (tMaxTxPowerParams *)pMsg->bodyptr);
10437 break;
10438 }
10439#endif
10440#ifdef WLAN_FEATURE_P2P
10441 case WDA_SET_P2P_GO_NOA_REQ:
10442 {
10443 WDA_ProcessSetP2PGONOAReq(pWDA,
10444 (tP2pPsParams *)pMsg->bodyptr);
10445 break;
10446 }
10447#endif
10448 /* timer related messages */
10449 case WDA_TIMER_BA_ACTIVITY_REQ:
10450 {
10451 WDA_BaCheckActivity(pWDA) ;
10452 break ;
10453 }
10454#ifdef WLAN_FEATURE_VOWIFI_11R
10455 case WDA_AGGR_QOS_REQ:
10456 {
10457 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
10458 break;
10459 }
10460#endif /* WLAN_FEATURE_VOWIFI_11R */
10461
10462#ifdef ANI_MANF_DIAG
10463 case WDA_FTM_CMD_REQ:
10464 {
10465 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
10466 break ;
10467 }
10468#endif /* ANI_MANF_DIAG */
10469
10470
10471 /* Tx Complete Time out Indication */
10472 case WDA_TX_COMPLETE_TIMEOUT_IND:
10473 {
10474 WDA_ProcessTxCompleteTimeOutInd(pWDA);
10475 break;
10476 }
10477 case WDA_WLAN_SUSPEND_IND:
10478 {
10479 WDA_ProcessWlanSuspendInd(pWDA,
10480 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
10481 break;
10482 }
10483
10484 case WDA_WLAN_RESUME_REQ:
10485 {
10486 WDA_ProcessWlanResumeReq(pWDA,
10487 (tSirWlanResumeParam *)pMsg->bodyptr) ;
10488 break;
10489 }
10490
10491 case WDA_UPDATE_CF_IND:
10492 {
10493 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
10494 pMsg->bodyptr = NULL;
10495 break;
10496 }
10497#ifdef FEATURE_WLAN_SCAN_PNO
10498 case WDA_SET_PNO_REQ:
10499 {
10500 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
10501 break;
10502 }
10503 case WDA_UPDATE_SCAN_PARAMS_REQ:
10504 {
10505 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
10506 break;
10507 }
10508 case WDA_SET_RSSI_FILTER_REQ:
10509 {
10510 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
10511 break;
10512 }
10513#endif // FEATURE_WLAN_SCAN_PNO
10514
10515 case WDA_SET_TX_PER_TRACKING_REQ:
10516 {
10517 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
10518 break;
10519 }
10520
10521#ifdef WLAN_FEATURE_PACKET_FILTERING
10522 case WDA_8023_MULTICAST_LIST_REQ:
10523 {
10524 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
10525 break;
10526 }
10527
10528 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
10529 {
10530 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
10531 break;
10532 }
10533
10534 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
10535 {
10536 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
10537 break;
10538 }
10539
10540 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
10541 {
10542 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
10543 break;
10544 }
10545#endif // WLAN_FEATURE_PACKET_FILTERING
10546
10547
10548 case WDA_TRANSMISSION_CONTROL_IND:
10549 {
10550 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
10551 break;
10552 }
10553
10554 case WDA_SET_POWER_PARAMS_REQ:
10555 {
10556 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
10557 break;
10558 }
10559
10560#ifdef WLAN_FEATURE_GTK_OFFLOAD
10561 case WDA_GTK_OFFLOAD_REQ:
10562 {
10563 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
10564 break;
10565 }
10566
10567 case WDA_GTK_OFFLOAD_GETINFO_REQ:
10568 {
10569 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
10570 break;
10571 }
10572#endif //WLAN_FEATURE_GTK_OFFLOAD
10573
10574 case WDA_SET_TM_LEVEL_REQ:
10575 {
10576 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
10577 break;
10578 }
10579
10580 default:
10581 {
10582 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10583 "No Handling for msg type %x in WDA "
10584 ,pMsg->type);
10585 /* Do Nothing? MSG Body should be freed at here */
10586 if(NULL != pMsg->bodyptr)
10587 {
10588 vos_mem_free(pMsg->bodyptr);
10589 }
10590 //WDA_VOS_ASSERT(0) ;
10591 }
10592 }
10593
10594 return status ;
10595}
10596
10597
10598/*
10599 * FUNCTION: WDA_LowLevelIndCallback
10600 * IND API callback from WDI, send Ind to PE
10601 */
10602void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
10603 void* pUserData )
10604{
10605 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
10606#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
10607 tSirRSSINotification rssiNotification;
10608#endif
10609
10610 if(NULL == pWDA)
10611 {
10612 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10613 "%s:pWDA is NULL", __FUNCTION__);
10614 VOS_ASSERT(0);
10615 return ;
10616 }
10617
10618 switch(wdiLowLevelInd->wdiIndicationType)
10619 {
10620 case WDI_RSSI_NOTIFICATION_IND:
10621 {
10622 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10623 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
10624
10625#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
10626 rssiNotification.bReserved =
10627 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
10628 rssiNotification.bRssiThres1NegCross =
10629 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
10630 rssiNotification.bRssiThres1PosCross =
10631 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
10632 rssiNotification.bRssiThres2NegCross =
10633 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
10634 rssiNotification.bRssiThres2PosCross =
10635 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
10636 rssiNotification.bRssiThres3NegCross =
10637 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
10638 rssiNotification.bRssiThres3PosCross =
10639 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
10640
10641 WLANTL_BMPSRSSIRegionChangedNotification(
10642 pWDA->pVosContext,
10643 &rssiNotification);
10644#endif
10645 break ;
10646 }
10647 case WDI_MISSED_BEACON_IND:
10648 {
10649 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10650 "Received WDI_MISSED_BEACON_IND from WDI ");
10651
10652 /* send IND to PE */
10653 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
10654 break ;
10655 }
10656 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
10657 {
10658 /* TODO: Decode Ind and send Ind to PE */
10659 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10660 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
10661 break ;
10662 }
10663
10664 case WDI_MIC_FAILURE_IND:
10665 {
10666 tpSirSmeMicFailureInd pMicInd =
10667 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
10668
10669 if(NULL == pMicInd)
10670 {
10671 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10672 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10673 break;
10674 }
10675 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10676 "Received WDI_MIC_FAILURE_IND from WDI ");
10677
10678 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
10679 pMicInd->length = sizeof(tSirSmeMicFailureInd);
10680 vos_mem_copy(pMicInd->bssId,
10681 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
10682 sizeof(tSirMacAddr));
10683 vos_mem_copy(pMicInd->info.srcMacAddr,
10684 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
10685 sizeof(tSirMacAddr));
10686 vos_mem_copy(pMicInd->info.taMacAddr,
10687 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
10688 sizeof(tSirMacAddr));
10689 vos_mem_copy(pMicInd->info.dstMacAddr,
10690 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
10691 sizeof(tSirMacAddr));
10692 vos_mem_copy(pMicInd->info.rxMacAddr,
10693 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
10694 sizeof(tSirMacAddr));
10695 pMicInd->info.multicast =
10696 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
10697 pMicInd->info.keyId=
10698 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
10699 pMicInd->info.IV1=
10700 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
10701 vos_mem_copy(pMicInd->info.TSC,
10702 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
10703
10704 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
10705 (void *)pMicInd , 0) ;
10706 break ;
10707 }
10708 case WDI_FATAL_ERROR_IND:
10709 {
10710 /* TODO: Decode Ind and send Ind to PE */
10711 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10712 "Received WDI_FATAL_ERROR_IND from WDI ");
10713 break ;
10714 }
10715 case WDA_BEACON_PRE_IND:
10716 {
10717 tBeaconGenParams *pBeaconGenParams =
10718 (tBeaconGenParams *)vos_mem_malloc(
10719 sizeof(tBeaconGenParams)) ;
10720 if(NULL == pBeaconGenParams)
10721 {
10722 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10723 "%s: VOS MEM Alloc Failure - pBeaconGenParams", __FUNCTION__);
10724 break;
10725 }
10726 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10727 "Received WDA_BEACON_PRE_IND from WDI ");
10728
10729 /* TODO: fill the pBeaconGenParams strucutre */
10730 WDA_SendMsg(pWDA, SIR_LIM_BEACON_GEN_IND,
10731 (void *)pBeaconGenParams , 0) ;
10732 break;
10733 }
10734 case WDI_DEL_STA_IND:
10735 {
10736
10737 tpDeleteStaContext pDelSTACtx =
10738 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
10739
10740 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10741 "Received WDI_DEL_STA_IND from WDI ");
10742 if(NULL == pDelSTACtx)
10743 {
10744 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10745 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10746 break;
10747 }
10748 vos_mem_copy(pDelSTACtx->addr2,
10749 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
10750 sizeof(tSirMacAddr));
10751
10752 vos_mem_copy(pDelSTACtx->bssId,
10753 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
10754 sizeof(tSirMacAddr));
10755
10756 pDelSTACtx->assocId =
10757 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
10758 pDelSTACtx->reasonCode =
10759 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
10760 pDelSTACtx->staId =
10761 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
10762
10763 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
10764 (void *)pDelSTACtx , 0) ;
10765
10766 break ;
10767 }
10768 case WDI_COEX_IND:
10769 {
10770 tANI_U32 index;
10771 vos_msg_t vosMsg;
10772 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
10773 if(NULL == pSmeCoexInd)
10774 {
10775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10776 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
10777 break;
10778 }
10779 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10780 "Received WDI_COEX_IND from WDI ");
10781
10782 /* Message Header */
10783 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
10784 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
10785
10786 /* Info from WDI Indication */
10787 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
10788 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
10789 {
10790 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
10791 }
10792
10793 /* VOS message wrapper */
10794 vosMsg.type = eWNI_SME_COEX_IND;
10795 vosMsg.bodyptr = (void *)pSmeCoexInd;
10796 vosMsg.bodyval = 0;
10797
10798 /* Send message to SME */
10799 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10800 {
10801 /* free the mem and return */
10802 vos_mem_free((v_VOID_t *)pSmeCoexInd);
10803 }
10804 else
10805 {
10806 /* DEBUG */
10807 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10808 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
10809 pSmeCoexInd->coexIndType,
10810 pSmeCoexInd->coexIndData[0],
10811 pSmeCoexInd->coexIndData[1],
10812 pSmeCoexInd->coexIndData[2],
10813 pSmeCoexInd->coexIndData[3]);
10814 }
10815 break;
10816 }
10817 case WDI_TX_COMPLETE_IND:
10818 {
10819 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
10820 /* Calling TxCompleteAck Indication from wda context*/
10821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10822 "Complete Indication received from HAL");
10823 if( pWDA->pAckTxCbFunc )
10824 {
10825 if( VOS_STATUS_SUCCESS !=
10826 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
10827 {
10828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10829 "Tx Complete timeout Timer Stop Failed ");
10830 }
10831 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
10832 pWDA->pAckTxCbFunc = NULL;
10833 }
10834 else
10835 {
10836 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10837 "Tx Complete Indication is received after timeout ");
10838 }
10839 break;
10840 }
10841#ifdef WLAN_FEATURE_P2P
10842 case WDI_P2P_NOA_ATTR_IND :
10843 {
10844 tSirP2PNoaAttr *pP2pNoaAttr =
10845 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
10846
10847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10848 "Received WDI_P2P_NOA_ATTR_IND from WDI");
10849
10850 if (NULL == pP2pNoaAttr)
10851 {
10852 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10853 "Memory allocation failure, "
10854 "WDI_P2P_NOA_ATTR_IND not forwarded");
10855 break;
10856 }
10857
10858 pP2pNoaAttr->index =
10859 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
10860 pP2pNoaAttr->oppPsFlag =
10861 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
10862 pP2pNoaAttr->ctWin =
10863 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
10864
10865 pP2pNoaAttr->uNoa1IntervalCnt =
10866 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
10867 pP2pNoaAttr->uNoa1Duration =
10868 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
10869 pP2pNoaAttr->uNoa1Interval =
10870 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
10871 pP2pNoaAttr->uNoa1StartTime =
10872 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
10873
10874 pP2pNoaAttr->uNoa2IntervalCnt =
10875 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
10876 pP2pNoaAttr->uNoa2Duration =
10877 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
10878 pP2pNoaAttr->uNoa2Interval =
10879 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
10880 pP2pNoaAttr->uNoa2StartTime =
10881 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
10882
10883 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
10884 (void *)pP2pNoaAttr , 0) ;
10885 break;
10886 }
10887#endif
10888
10889#ifdef FEATURE_WLAN_SCAN_PNO
10890 case WDI_PREF_NETWORK_FOUND_IND:
10891 {
10892 vos_msg_t vosMsg;
10893 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
10894
10895 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10896 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
10897
10898 if (NULL == pPrefNetworkFoundInd)
10899 {
10900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10901 "Memory allocation failure, "
10902 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
10903 break;
10904 }
10905
10906 /* Message Header */
10907 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
10908 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
10909
10910 /* Info from WDI Indication */
10911 pPrefNetworkFoundInd->ssId.length =
10912 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
10913
10914 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
10915
10916 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
10917 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
10918 pPrefNetworkFoundInd->ssId.length);
10919
10920 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
10921
10922 /* VOS message wrapper */
10923 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
10924 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
10925 vosMsg.bodyval = 0;
10926
10927 /* Send message to SME */
10928 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10929 {
10930 /* free the mem and return */
10931 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
10932 }
10933
10934 break;
10935 }
10936#endif // FEATURE_WLAN_SCAN_PNO
10937
10938#ifdef WLAN_WAKEUP_EVENTS
10939 case WDI_WAKE_REASON_IND:
10940 {
10941 vos_msg_t vosMsg;
10942 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
10943 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
10944 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
10945
10946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10947 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
10948 wdiLowLevelInd->wdiIndicationType,
10949 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
10950 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
10951 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10952
10953 if (NULL == pWakeReasonInd)
10954 {
10955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10956 "Memory allocation failure, "
10957 "WDI_WAKE_REASON_IND not forwarded");
10958 break;
10959 }
10960
10961 vos_mem_zero(pWakeReasonInd, allocSize);
10962
10963 /* Message Header */
10964 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
10965 pWakeReasonInd->mesgLen = allocSize;
10966
10967 /* Info from WDI Indication */
10968 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
10969 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
10970 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
10971 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
10972 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
10973 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
10974 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
10975 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10976
10977 /* VOS message wrapper */
10978 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
10979 vosMsg.bodyptr = (void *) pWakeReasonInd;
10980 vosMsg.bodyval = 0;
10981
10982 /* Send message to SME */
10983 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10984 {
10985 /* free the mem and return */
10986 vos_mem_free((v_VOID_t *) pWakeReasonInd);
10987 }
10988
10989 break;
10990 }
10991#endif // WLAN_WAKEUP_EVENTS
10992
10993 case WDI_TX_PER_HIT_IND:
10994 {
10995 vos_msg_t vosMsg;
10996 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
10997 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
10998 /* VOS message wrapper */
10999 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
11000 vosMsg.bodyptr = NULL;
11001 vosMsg.bodyval = 0;
11002
11003 /* Send message to SME */
11004 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
11005 {
11006 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
11007 }
11008 break;
11009 }
11010
11011 default:
11012 {
11013 /* TODO error */
11014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11015 "Received UNKNOWN Indication from WDI ");
11016 }
11017 }
11018 return ;
11019}
11020
11021
11022/*
11023 * BA related processing in WDA.
11024 */
11025
11026void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
11027 void* pUserData)
11028{
11029 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11030 tWDA_CbContext *pWDA;
11031
11032 if(NULL == pWdaParams)
11033 {
11034 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11035 "%s: pWdaParams received NULL", __FUNCTION__);
11036 VOS_ASSERT(0) ;
11037 return ;
11038 }
11039
11040 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
11041
11042 vos_mem_free(pWdaParams->wdaMsgParam) ;
11043 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11044 vos_mem_free(pWdaParams) ;
11045
11046 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11047 "<------ %s " ,__FUNCTION__);
11048
11049 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
11050 {
11051 tANI_U8 i = 0 ;
11052 tBaActivityInd *baActivityInd = NULL ;
11053 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
11054 tANI_U8 allocSize = sizeof(tBaActivityInd)
11055 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
11056 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
11057 tAddBaCandidate *baCandidate = NULL ;
11058
11059 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
11060
11061 if(NULL == baActivityInd)
11062 {
11063 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11064 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11065 VOS_ASSERT(0) ;
11066 return;
11067 }
11068
11069 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
11070 sizeof(tSirMacAddr)) ;
11071 baActivityInd->baCandidateCnt = baCandidateCount ;
11072
11073 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
11074 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
11075
11076 for(i = 0 ; i < baCandidateCount ; i++)
11077 {
11078 tANI_U8 tid = 0 ;
11079 wdiBaCandidate = (wdiBaCandidate + i) ;
11080 baCandidate = (baCandidate + i) ;
11081 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
11082 sizeof(tSirMacAddr)) ;
11083
11084 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
11085 {
11086 baCandidate->baInfo[tid].fBaEnable =
11087 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
11088 baCandidate->baInfo[tid].startingSeqNum =
11089 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
11090 }
11091 }
11092
11093 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
11094 }
11095 else
11096 {
11097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11098 "BA Trigger RSP with Failure received ");
11099 }
11100
11101 return ;
11102
11103}
11104
11105/*
11106 * BA Activity check timer handler
11107 */
11108void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
11109{
11110 tANI_U8 curSta = 0 ;
11111 tANI_U8 tid = 0 ;
11112 tANI_U8 size = 0 ;
11113 tANI_U8 baCandidateCount = 0 ;
11114 tANI_U8 newBaCandidate = 0 ;
11115 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
11116
11117 if(NULL == pWDA)
11118 {
11119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11120 "%s:pWDA is NULL", __FUNCTION__);
11121 VOS_ASSERT(0);
11122 return ;
11123 }
11124 if(WDA_MAX_STA < pWDA->wdaMaxSta)
11125 {
11126 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11127 "Inconsistent STA entries in WDA");
11128 VOS_ASSERT(0) ;
11129 }
11130 /* walk through all STA entries and find out TX packet count */
11131 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
11132 {
11133 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
11134 {
11135 tANI_U32 txPktCount = 0 ;
11136 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
11137
11138 if((WDA_VALID_STA_INDEX == validStaIndex) &&
11139 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
11140 curSta, tid, &txPktCount)))
11141 {
11142#if 0
11143 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
11144 "************* %d:%d, %d ",curSta, txPktCount,
11145 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
11146#endif
11147 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
11148 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
11149 curSta, tid)))
11150 {
11151 /* get prepare for sending message to HAL */
11152 //baCandidate[baCandidateCount].staIdx = curSta ;
11153 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
11154 newBaCandidate = WDA_ENABLE_BA ;
11155 }
11156 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
11157 }
11158 }
11159
11160 /* fill the entry for all the sta with given TID's */
11161 if(WDA_ENABLE_BA == newBaCandidate)
11162 {
11163 /* move to next BA candidate */
11164 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
11165 size += sizeof(WDI_TriggerBAReqCandidateType) ;
11166 baCandidateCount++ ;
11167 newBaCandidate = WDA_DISABLE_BA ;
11168 }
11169 }
11170
11171 /* prepare and send message to hal */
11172 if( 0 < baCandidateCount)
11173 {
11174 WDI_Status status = WDI_STATUS_SUCCESS ;
11175 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
11176 tWDA_ReqParams *pWdaParams =
11177 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11178
11179 if(NULL == pWdaParams)
11180 {
11181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11183 VOS_ASSERT(0) ;
11184 return;
11185 }
11186 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
11187 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
11188 if(NULL == wdiTriggerBaReq)
11189 {
11190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11191 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11192 VOS_ASSERT(0) ;
11193 vos_mem_free(pWdaParams);
11194 return;
11195 }
11196
11197 do
11198 {
11199 WDI_TriggerBAReqinfoType *triggerBaInfo =
11200 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
11201 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
11202 /* TEMP_FIX: Need to see if WDI need check for assoc session for
11203 * for each request */
11204 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
11205 triggerBaInfo->ucBASessionID = 0;
11206 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
11207 } while(0) ;
11208 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
11209 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11210 "------> %s " ,__FUNCTION__);
11211
11212 pWdaParams->pWdaContext = pWDA;
11213 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
11214 pWdaParams->wdaMsgParam = NULL;
11215 status = WDI_TriggerBAReq(wdiTriggerBaReq,
11216 WDA_TriggerBaReqCallback, pWdaParams) ;
11217 if(IS_WDI_STATUS_FAILURE(status))
11218 {
11219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11220 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
11221 vos_mem_free(pWdaParams->wdaMsgParam) ;
11222 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11223 vos_mem_free(pWdaParams) ;
11224 }
11225 }
11226 else
11227 {
11228 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
11229 "There is no TID for initiating BA");
11230 }
11231
11232 if( VOS_STATUS_SUCCESS !=
11233 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
11234 {
11235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11236 "BA Activity Timer Stop Failed ");
11237 return ;
11238 }
11239 if( VOS_STATUS_SUCCESS !=
11240 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
11241 {
11242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11243 "BA Activity Timer Start Failed ");
11244 return;
11245 }
11246 return ;
11247}
11248
11249/*
11250 * WDA common routine to create timer used by WDA.
11251 */
11252static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
11253{
11254
11255 VOS_STATUS status = VOS_STATUS_SUCCESS ;
11256 tANI_U32 val = 0 ;
11257 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
11258
11259 if(NULL == pMac)
11260 {
11261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11262 "%s:MAC context is NULL", __FUNCTION__);
11263 VOS_ASSERT(0);
11264 return VOS_STATUS_E_FAILURE;
11265 }
11266 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
11267 != eSIR_SUCCESS)
11268 {
11269 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11270 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
11271 return VOS_STATUS_E_FAILURE;
11272 }
11273 val = SYS_MS_TO_TICKS(val) ;
11274
11275 /* BA activity check timer */
11276 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
11277 "BA Activity Check timer", WDA_TimerHandler,
11278 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
11279 if(status != TX_SUCCESS)
11280 {
11281 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11282 "Unable to create BA activity timer");
11283 return eSIR_FAILURE ;
11284 }
11285
11286 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
11287
11288 /* Tx Complete Timeout timer */
11289 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
11290 "Tx Complete Check timer", WDA_TimerHandler,
11291 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
11292
11293 if(status != TX_SUCCESS)
11294 {
11295 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11296 "Unable to create Tx Complete Timeout timer");
11297 /* Destroy timer of BA activity check timer */
11298 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
11299 if(status != TX_SUCCESS)
11300 {
11301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11302 "Unable to Destroy BA activity timer");
11303 return eSIR_FAILURE ;
11304 }
11305 return eSIR_FAILURE ;
11306 }
11307
11308 return eSIR_SUCCESS ;
11309}
11310
11311/*
11312 * WDA common routine to destroy timer used by WDA.
11313 */
11314static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
11315{
11316 VOS_STATUS status = VOS_STATUS_SUCCESS ;
11317
11318 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
11319 if(status != TX_SUCCESS)
11320 {
11321 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11322 "Unable to Destroy Tx Complete Timeout timer");
11323 return eSIR_FAILURE ;
11324 }
11325
11326 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
11327 if(status != TX_SUCCESS)
11328 {
11329 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11330 "Unable to Destroy BA activity timer");
11331 return eSIR_FAILURE ;
11332 }
11333
11334 return eSIR_SUCCESS ;
11335}
11336
11337/*
11338 * WDA timer handler.
11339 */
11340void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
11341{
11342 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
11343 vos_msg_t wdaMsg = {0} ;
11344
11345 /*
11346 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
11347 */
11348 wdaMsg.type = timerInfo ;
11349 wdaMsg.bodyptr = NULL;
11350 wdaMsg.bodyval = 0;
11351
11352 /* post the message.. */
11353 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
11354 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
11355 {
11356 vosStatus = VOS_STATUS_E_BADMSG;
11357 }
11358
11359}
11360
11361/*
11362 * WDA Tx Complete timeout Indication.
11363 */
11364void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
11365{
11366 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
11367
11368 if( pWDA->pAckTxCbFunc )
11369 {
11370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11371 "TxComplete timer expired\n");
11372 pWDA->pAckTxCbFunc( pMac, 0);
11373 pWDA->pAckTxCbFunc = NULL;
11374 }
11375 else
11376 {
11377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11378 "There is no request pending for TxComplete and wait timer expired\n");
11379 }
11380
11381}
11382
11383/*
11384 * WDA Set REG Domain to VOS NV
11385 */
11386eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
11387{
11388 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
11389 {
11390 return eHAL_STATUS_INVALID_PARAMETER;
11391 }
11392 return eHAL_STATUS_SUCCESS;
11393}
11394#endif /* FEATURE_WLAN_INTEGRATED_SOC */
11395
11396
11397#ifdef FEATURE_WLAN_SCAN_PNO
11398/*
11399 * FUNCTION: WDA_PNOScanReqCallback
11400 *
11401 */
11402void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
11403{
11404 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11405
11406 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11407 "<------ %s " ,__FUNCTION__);
11408
11409 if(NULL == pWdaParams)
11410 {
11411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11412 "%s: pWdaParams received NULL", __FUNCTION__);
11413 VOS_ASSERT(0) ;
11414 return ;
11415 }
11416
11417 if( pWdaParams != NULL )
11418 {
11419 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11420 {
11421 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11422 }
11423
11424 if( pWdaParams->wdaMsgParam != NULL)
11425 {
11426 vos_mem_free(pWdaParams->wdaMsgParam);
11427 }
11428
11429 vos_mem_free(pWdaParams) ;
11430 }
11431
11432 return ;
11433}
11434
11435/*
11436 * FUNCTION: WDA_UpdateScanParamsCallback
11437 *
11438 */
11439void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
11440{
11441 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11442
11443 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11444 "<------ %s " ,__FUNCTION__);
11445
11446 if(NULL == pWdaParams)
11447 {
11448 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11449 "%s: pWdaParams received NULL", __FUNCTION__);
11450 VOS_ASSERT(0) ;
11451 return ;
11452 }
11453
11454 if( pWdaParams != NULL )
11455 {
11456 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11457 {
11458 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11459 }
11460
11461 if( pWdaParams->wdaMsgParam != NULL)
11462 {
11463 vos_mem_free(pWdaParams->wdaMsgParam);
11464 }
11465 vos_mem_free(pWdaParams) ;
11466 }
11467
11468 return ;
11469}
11470
11471/*
11472 * FUNCTION: WDA_SetPowerParamsCallback
11473 *
11474 */
11475void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
11476{
11477 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11478
11479 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11480 "<------ %s " ,__FUNCTION__);
11481
11482 if(NULL == pWdaParams)
11483 {
11484 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11485 "%s: pWdaParams received NULL", __FUNCTION__);
11486 VOS_ASSERT(0) ;
11487 return ;
11488 }
11489
11490 if( pWdaParams != NULL )
11491 {
11492 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11493 {
11494 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11495 }
11496
11497 if( pWdaParams->wdaMsgParam != NULL)
11498 {
11499 vos_mem_free(pWdaParams->wdaMsgParam);
11500 }
11501 vos_mem_free(pWdaParams) ;
11502 }
11503
11504 return ;
11505}
11506
11507/*
11508 * FUNCTION: WDA_ProcessSetPreferredNetworkList
11509 * Request to WDI to set Preferred Network List.Offload
11510 */
11511VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
11512 tSirPNOScanReq *pPNOScanReqParams)
11513{
11514 VOS_STATUS status = VOS_STATUS_SUCCESS;
11515 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
11516 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
11517 tWDA_ReqParams *pWdaParams ;
11518 v_U8_t i;
11519
11520 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11521 "------> %s " ,__FUNCTION__);
11522
11523 if(NULL == pwdiPNOScanReqInfo)
11524 {
11525 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11526 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11527 VOS_ASSERT(0);
11528 return VOS_STATUS_E_NOMEM;
11529 }
11530
11531 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11532 if(NULL == pWdaParams)
11533 {
11534 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11535 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11536 VOS_ASSERT(0);
11537 vos_mem_free(pwdiPNOScanReqInfo);
11538 return VOS_STATUS_E_NOMEM;
11539 }
11540
11541 //
11542 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
11543 //
11544 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
11545 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
11546
11547 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
11548 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
11549 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
11550
11551 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
11552 {
11553 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
11554 &pPNOScanReqParams->aNetworks[i],
11555 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
11556 }
11557
11558 /*Scan timer intervals*/
11559 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
11560 &pPNOScanReqParams->scanTimers,
11561 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
11562
11563 /*Probe template for 2.4GHz band*/
11564 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
11565 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
11566 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
11567
11568 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
11569 pPNOScanReqParams->p24GProbeTemplate,
11570 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
11571
11572 /*Probe template for 5GHz band*/
11573 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
11574 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
11575 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
11576
11577 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
11578 pPNOScanReqParams->p5GProbeTemplate,
11579 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
11580
11581 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
11582
11583 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11584 {
11585 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11586 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11587 VOS_ASSERT(0);
11588 vos_mem_free(pwdiPNOScanReqInfo) ;
11589 vos_mem_free(pWdaParams);
11590 return VOS_STATUS_E_FAILURE;
11591 }
11592
11593 /* Store Params pass it to WDI */
11594 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
11595 pWdaParams->pWdaContext = pWDA;
11596 /* Store param pointer as passed in by caller */
11597 pWdaParams->wdaMsgParam = pPNOScanReqParams;
11598
11599 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
11600 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
11601
11602 if(IS_WDI_STATUS_FAILURE(status))
11603 {
11604 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11605 "Failure in Set PNO REQ WDI API, free all the memory " );
11606 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11607 vos_mem_free(pWdaParams->wdaMsgParam);
11608 pWdaParams->wdaWdiApiMsgParam = NULL;
11609 pWdaParams->wdaMsgParam = NULL;
11610 }
11611
11612 return CONVERT_WDI2VOS_STATUS(status) ;
11613}
11614
11615/*
11616 * FUNCTION: WDA_RssiFilterCallback
11617 *
11618 */
11619void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
11620{
11621 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11622
11623 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11624 "<------ %s " ,__FUNCTION__);
11625
11626 VOS_ASSERT(NULL != pWdaParams);
11627
11628 vos_mem_free(pWdaParams->wdaMsgParam) ;
11629 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11630 vos_mem_free(pWdaParams) ;
11631
11632 return ;
11633}
11634/*
11635 * FUNCTION: WDA_ProcessSetPreferredNetworkList
11636 * Request to WDI to set Preferred Network List.Offload
11637 */
11638VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
11639 tSirSetRSSIFilterReq* pRssiFilterParams)
11640{
11641 VOS_STATUS status = VOS_STATUS_SUCCESS;
11642 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
11643 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
11644 tWDA_ReqParams *pWdaParams ;
11645
11646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11647 "------> %s " ,__FUNCTION__);
11648
11649 if(NULL == pwdiSetRssiFilterReqInfo)
11650 {
11651 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11652 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11653 VOS_ASSERT(0);
11654 return VOS_STATUS_E_NOMEM;
11655 }
11656
11657 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11658 if(NULL == pWdaParams)
11659 {
11660 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11661 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11662 VOS_ASSERT(0);
11663 vos_mem_free(pwdiSetRssiFilterReqInfo);
11664 return VOS_STATUS_E_NOMEM;
11665 }
11666
11667 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
11668 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
11669
11670 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11671 {
11672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11673 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11674 VOS_ASSERT(0);
11675 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
11676 vos_mem_free(pWdaParams);
11677 return VOS_STATUS_E_FAILURE;
11678 }
11679
11680 /* Store Params pass it to WDI */
11681 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
11682 pWdaParams->pWdaContext = pWDA;
11683 /* Store param pointer as passed in by caller */
11684 pWdaParams->wdaMsgParam = pRssiFilterParams;
11685
11686 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
11687 (WDI_PNOScanCb)WDA_RssiFilterCallback,
11688 pWdaParams);
11689
11690 if(IS_WDI_STATUS_FAILURE(status))
11691 {
11692 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11693 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
11694 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11695 vos_mem_free(pWdaParams->wdaMsgParam);
11696 pWdaParams->wdaWdiApiMsgParam = NULL;
11697 pWdaParams->wdaMsgParam = NULL;
11698 }
11699
11700 return CONVERT_WDI2VOS_STATUS(status) ;
11701}
11702
11703
11704/*
11705 * FUNCTION: WDA_ProcessUpdateScanParams
11706 * Request to WDI to update Scan Parameters
11707 */
11708VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
11709 tSirUpdateScanParams *pUpdateScanParams)
11710{
11711 VOS_STATUS status = VOS_STATUS_SUCCESS;
11712 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
11713 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
11714 sizeof(WDI_UpdateScanParamsInfoType)) ;
11715 tWDA_ReqParams *pWdaParams ;
11716 v_U8_t i;
11717
11718 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11719 "------> %s " ,__FUNCTION__);
11720
11721 if(NULL == wdiUpdateScanParamsInfoType)
11722 {
11723 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11724 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11725 VOS_ASSERT(0);
11726 return VOS_STATUS_E_NOMEM;
11727 }
11728
11729 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11730 if ( NULL == pWdaParams )
11731 {
11732 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11733 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11734 VOS_ASSERT(0);
11735 vos_mem_free(wdiUpdateScanParamsInfoType);
11736 return VOS_STATUS_E_NOMEM;
11737 }
11738
11739 //
11740 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
11741 //
11742
11743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11744 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
11745 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
11746 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
11747 "sir struct %d wdi struct %d",
11748 pUpdateScanParams->b11dEnabled,
11749 pUpdateScanParams->b11dResolved,
11750 pUpdateScanParams->ucChannelCount,
11751 pUpdateScanParams->usPassiveMinChTime,
11752 pUpdateScanParams->usPassiveMaxChTime,
11753 pUpdateScanParams->usActiveMinChTime,
11754 pUpdateScanParams->usActiveMaxChTime,
11755 sizeof(tSirUpdateScanParams),
11756 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
11757
11758
11759 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
11760 pUpdateScanParams->b11dEnabled;
11761
11762 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
11763 pUpdateScanParams->b11dResolved;
11764
11765 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
11766 pUpdateScanParams->ucCBState;
11767
11768 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
11769 pUpdateScanParams->usActiveMaxChTime;
11770 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
11771 pUpdateScanParams->usActiveMinChTime;
11772 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
11773 pUpdateScanParams->usPassiveMaxChTime;
11774 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
11775 pUpdateScanParams->usPassiveMinChTime;
11776
11777
11778 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
11779 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
11780 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
11781
11782
11783 for ( i = 0; i <
11784 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
11785 i++)
11786 {
11787 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11788 "Update Scan Parameters channel: %d",
11789 pUpdateScanParams->aChannels[i]);
11790
11791 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
11792 pUpdateScanParams->aChannels[i];
11793 }
11794
11795
11796 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
11797
11798 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11799 {
11800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11801 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11802 VOS_ASSERT(0);
11803 vos_mem_free(pWdaParams);
11804 vos_mem_free(wdiUpdateScanParamsInfoType);
11805 return VOS_STATUS_E_FAILURE;
11806 }
11807
11808 /* Store Params pass it to WDI */
11809 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
11810 pWdaParams->pWdaContext = pWDA;
11811 /* Store param pointer as passed in by caller */
11812 pWdaParams->wdaMsgParam = pUpdateScanParams;
11813
11814
11815
11816 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
11817 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
11818 pWdaParams);
11819
11820 if(IS_WDI_STATUS_FAILURE(status))
11821 {
11822 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11823 "Failure in Update Scan Params EQ WDI API, free all the memory " );
11824 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11825 vos_mem_free(pWdaParams->wdaMsgParam);
11826 vos_mem_free(pWdaParams);
11827 }
11828
11829 return CONVERT_WDI2VOS_STATUS(status) ;
11830}
11831#endif // FEATURE_WLAN_SCAN_PNO
11832
11833#ifdef WLAN_FEATURE_PACKET_FILTERING
11834/*
11835 * FUNCTION: WDA_8023MulticastListReqCallback
11836 *
11837 */
11838void WDA_8023MulticastListReqCallback(WDI_Status status, void * pUserData)
11839{
11840 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11841
11842 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11843 "<------ %s " ,__FUNCTION__);
11844
11845 if(NULL == pWdaParams)
11846 {
11847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11848 "%s: pWdaParams received NULL", __FUNCTION__);
11849 VOS_ASSERT(0) ;
11850 return ;
11851 }
11852
11853 vos_mem_free(pWdaParams->wdaMsgParam) ;
11854 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11855 vos_mem_free(pWdaParams) ;
11856
11857 //print a msg, nothing else to do
11858 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11859 "WDA_8023MulticastListReqCallback invoked " );
11860
11861 return ;
11862}
11863
11864/*
11865 * FUNCTION: WDA_Process8023MulticastListReq
11866 * Request to WDI to add 8023 Multicast List
11867 */
11868VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
11869 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
11870{
11871 VOS_STATUS status = VOS_STATUS_SUCCESS;
11872 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
11873 tWDA_ReqParams *pWdaParams ;
11874 tANI_U8 i;
11875
11876 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11877 "------> %s " ,__FUNCTION__);
11878
11879 pwdiFltPktSetMcListReqParamsType =
11880 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
11881 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
11882 ) ;
11883 if(NULL == pwdiFltPktSetMcListReqParamsType)
11884 {
11885 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11886 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11887 return VOS_STATUS_E_NOMEM;
11888 }
11889
11890 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11891 if(NULL == pWdaParams)
11892 {
11893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11894 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11895 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
11896 return VOS_STATUS_E_NOMEM;
11897 }
11898
11899 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11900 {
11901 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11902 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
11903 __FUNCTION__);
11904 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
11905 vos_mem_free(pWdaParams);
11906 return VOS_STATUS_E_FAILURE;
11907 }
11908
11909 //
11910 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
11911 //
11912 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
11913 pRcvFltMcAddrList->ulMulticastAddrCnt;
11914 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
11915 {
11916 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
11917 &(pRcvFltMcAddrList->multicastAddr[i]),
11918 sizeof(tSirMacAddr));
11919 }
11920
11921 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
11922
11923 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
11924 (NULL == pWDA->wdaWdiApiMsgParam)); */
11925
11926 /* Store Params pass it to WDI */
11927 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
11928 pWdaParams->pWdaContext = pWDA;
11929 /* Store param pointer as passed in by caller */
11930 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
11931
11932 status = WDI_8023MulticastListReq(
11933 pwdiFltPktSetMcListReqParamsType,
11934 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
11935 pWdaParams);
11936
11937 if(IS_WDI_STATUS_FAILURE(status))
11938 {
11939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11940 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
11941 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11942 vos_mem_free(pWdaParams->wdaMsgParam);
11943 vos_mem_free(pWdaParams);
11944 }
11945
11946 return CONVERT_WDI2VOS_STATUS(status) ;
11947}
11948
11949/*
11950 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11951 *
11952 */
11953void WDA_ReceiveFilterSetFilterReqCallback(WDI_Status status, void * pUserData)
11954{
11955 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11956
11957 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11958 "<------ %s " ,__FUNCTION__);
11959
11960 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
11961
11962 if(NULL == pWdaParams)
11963 {
11964 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11965 "%s: pWdaParams received NULL", __FUNCTION__);
11966 VOS_ASSERT(0) ;
11967 return ;
11968 }
11969
11970 vos_mem_free(pWdaParams->wdaMsgParam) ;
11971 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11972 vos_mem_free(pWdaParams) ;
11973
11974 //print a msg, nothing else to do
11975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11976 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
11977
11978 return ;
11979}
11980
11981/*
11982 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
11983 * Request to WDI to set Receive Filters
11984 */
11985VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
11986 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
11987{
11988 VOS_STATUS status = VOS_STATUS_SUCCESS;
11989 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
11990 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
11991 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
11992 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
11993 tWDA_ReqParams *pWdaParams ;
11994 tANI_U8 i;
11995
11996 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11997 "------> %s " ,__FUNCTION__);
11998
11999 if(NULL == pwdiSetRcvPktFilterReqParamsType)
12000 {
12001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12002 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12003 VOS_ASSERT(0);
12004 return VOS_STATUS_E_NOMEM;
12005 }
12006
12007 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
12008 if(NULL == pWdaParams)
12009 {
12010 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12011 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12012 VOS_ASSERT(0);
12013 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
12014 return VOS_STATUS_E_NOMEM;
12015 }
12016
12017 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
12018 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
12019 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
12020 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
12021
12022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12023 "FID %d FT %d NParams %d CT %d",
12024 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
12025 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
12026 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
12027 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
12028
12029 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
12030 {
12031 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
12032 &pRcvPktFilterCfg->paramsData[i],
12033 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
12034
12035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12036 "Proto %d Comp Flag %d \n",
12037 pwdiSetRcvPktFilterReqParamsType->
12038 wdiPktFilterCfg.paramsData[i].protocolLayer,
12039 pwdiSetRcvPktFilterReqParamsType->
12040 wdiPktFilterCfg.paramsData[i].cmpFlag);
12041
12042 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12043 "Data Offset %d Data Len %d\n",
12044 pwdiSetRcvPktFilterReqParamsType->
12045 wdiPktFilterCfg.paramsData[i].dataOffset,
12046 pwdiSetRcvPktFilterReqParamsType->
12047 wdiPktFilterCfg.paramsData[i].dataLength);
12048
12049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12050 "CData: %d:%d:%d:%d:%d:%d\n",
12051 pwdiSetRcvPktFilterReqParamsType->
12052 wdiPktFilterCfg.paramsData[i].compareData[0],
12053 pwdiSetRcvPktFilterReqParamsType->
12054 wdiPktFilterCfg.paramsData[i].compareData[1],
12055 pwdiSetRcvPktFilterReqParamsType->
12056 wdiPktFilterCfg.paramsData[i].compareData[2],
12057 pwdiSetRcvPktFilterReqParamsType->
12058 wdiPktFilterCfg.paramsData[i].compareData[3],
12059 pwdiSetRcvPktFilterReqParamsType->
12060 wdiPktFilterCfg.paramsData[i].compareData[4],
12061 pwdiSetRcvPktFilterReqParamsType->
12062 wdiPktFilterCfg.paramsData[i].compareData[5]);
12063
12064 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12065 "MData: %d:%d:%d:%d:%d:%d\n",
12066 pwdiSetRcvPktFilterReqParamsType->
12067 wdiPktFilterCfg.paramsData[i].dataMask[0],
12068 pwdiSetRcvPktFilterReqParamsType->
12069 wdiPktFilterCfg.paramsData[i].dataMask[1],
12070 pwdiSetRcvPktFilterReqParamsType->
12071 wdiPktFilterCfg.paramsData[i].dataMask[2],
12072 pwdiSetRcvPktFilterReqParamsType->
12073 wdiPktFilterCfg.paramsData[i].dataMask[3],
12074 pwdiSetRcvPktFilterReqParamsType->
12075 wdiPktFilterCfg.paramsData[i].dataMask[4],
12076 pwdiSetRcvPktFilterReqParamsType->
12077 wdiPktFilterCfg.paramsData[i].dataMask[5]);
12078
12079 }
12080
12081 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
12082
12083 /* Store Params pass it to WDI */
12084 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
12085 pWdaParams->pWdaContext = pWDA;
12086 /* Store param pointer as passed in by caller */
12087 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
12088
12089 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
12090 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
12091 pWdaParams);
12092
12093 if(IS_WDI_STATUS_FAILURE(status))
12094 {
12095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12096 "Failure in SetFilter(),free all the memory,status %d ",status);
12097 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
12098 vos_mem_free(pWdaParams->wdaMsgParam);
12099 vos_mem_free(pWdaParams);
12100 }
12101
12102 return CONVERT_WDI2VOS_STATUS(status) ;
12103}
12104
12105/*
12106 * FUNCTION: WDA_FilterMatchCountReqCallback
12107 *
12108 */
12109void WDA_FilterMatchCountReqCallback(WDI_Status status, void * pUserData)
12110{
12111 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
12112 tWDA_CbContext *pWDA;
12113 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
12114 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
12115 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
12116 tANI_U8 i;
12117 vos_msg_t vosMsg;
12118
12119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12120 "<------ %s " ,__FUNCTION__);
12121
12122 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
12123
12124 if(NULL == pWdaParams)
12125 {
12126 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12127 "%s: pWdaParams received NULL", __FUNCTION__);
12128 VOS_ASSERT(0) ;
12129 return ;
12130 }
12131
12132 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
12133 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
12134
12135 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
12136 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
12137
12138 /* Message Header */
12139 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
12140 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
12141
12142 pRcvFltPktMatchCntRsp->status = pRcvFltPktMatchCntReq->status;
12143
12144 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
12145 {
12146 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
12147 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
12148 }
12149
12150 /* VOS message wrapper */
12151 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
12152 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
12153 vosMsg.bodyval = 0;
12154 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
12155 {
12156 /* free the mem and return */
12157 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
12158 }
12159
12160 vos_mem_free(pWdaParams->wdaMsgParam) ;
12161 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
12162 vos_mem_free(pWdaParams) ;
12163}
12164
12165/*
12166 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
12167 * Request to WDI to get PC Filter Match Count
12168 */
12169VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
12170{
12171 VOS_STATUS status = VOS_STATUS_SUCCESS;
12172 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
12173 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
12174 tWDA_ReqParams *pWdaParams ;
12175
12176 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12177 "------> %s " ,__FUNCTION__);
12178
12179 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
12180 {
12181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12183 VOS_ASSERT(0);
12184 return VOS_STATUS_E_NOMEM;
12185 }
12186
12187 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
12188 if(NULL == pWdaParams)
12189 {
12190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12191 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12192 VOS_ASSERT(0);
12193 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
12194 return VOS_STATUS_E_NOMEM;
12195 }
12196
12197 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
12198 {
12199 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12200 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
12201 VOS_ASSERT(0);
12202 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
12203 vos_mem_free(pWdaParams);
12204 return VOS_STATUS_E_FAILURE;
12205 }
12206
12207 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
12208
12209
12210 /* Store Params pass it to WDI */
12211 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
12212 pWdaParams->pWdaContext = pWDA;
12213 /* Store param pointer as passed in by caller */
12214 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
12215
12216 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
12217 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
12218 pWdaParams);
12219
12220 if(IS_WDI_STATUS_FAILURE(status))
12221 {
12222 /* failure returned by WDI API */
12223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12224 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
12225 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
12226 vos_mem_free(pWdaParams) ;
12227 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
12228 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
12229 }
12230
12231 return CONVERT_WDI2VOS_STATUS(status) ;
12232}
12233
12234/*
12235 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
12236 *
12237 */
12238void WDA_ReceiveFilterClearFilterReqCallback(WDI_Status status, void * pUserData)
12239{
12240 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
12241
12242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12243 "<------ %s " ,__FUNCTION__);
12244
12245/* WDA_VOS_ASSERT(NULL != pWdaParams); */
12246 if(NULL == pWdaParams)
12247 {
12248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12249 "%s: pWdaParams received NULL", __FUNCTION__);
12250 VOS_ASSERT(0) ;
12251 return ;
12252 }
12253
12254 vos_mem_free(pWdaParams->wdaMsgParam) ;
12255 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
12256 vos_mem_free(pWdaParams) ;
12257
12258 //print a msg, nothing else to do
12259 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12260 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
12261
12262 return ;
12263}
12264
12265/*
12266 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
12267 * Request to WDI to clear Receive Filters
12268 */
12269VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
12270 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
12271{
12272 VOS_STATUS status = VOS_STATUS_SUCCESS;
12273 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
12274 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
12275 tWDA_ReqParams *pWdaParams ;
12276
12277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12278 "------> %s " ,__FUNCTION__);
12279
12280 if(NULL == pwdiRcvFltPktClearReqParamsType)
12281 {
12282 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12283 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12284 VOS_ASSERT(0);
12285 return VOS_STATUS_E_NOMEM;
12286 }
12287
12288 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
12289 if(NULL == pWdaParams)
12290 {
12291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12292 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12293 VOS_ASSERT(0);
12294 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
12295 return VOS_STATUS_E_NOMEM;
12296 }
12297
12298 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
12299 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
12300
12301 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
12302
12303 /* Store Params pass it to WDI */
12304 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
12305 pWdaParams->pWdaContext = pWDA;
12306 /* Store param pointer as passed in by caller */
12307 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
12308
12309 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
12310 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
12311 pWdaParams);
12312
12313 if(IS_WDI_STATUS_FAILURE(status))
12314 {
12315 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12316 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
12317 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
12318 }
12319
12320 return CONVERT_WDI2VOS_STATUS(status) ;
12321}
12322#endif // WLAN_FEATURE_PACKET_FILTERING
12323
12324
12325/*
12326 * FUNCTION: WDA_ProcessSetPowerParamsReq
12327 * Request to WDI to set power params
12328 */
12329VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
12330 tSirSetPowerParamsReq *pPowerParams)
12331{
12332 VOS_STATUS status = VOS_STATUS_SUCCESS;
12333 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
12334 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
12335
12336 tWDA_ReqParams *pWdaParams ;
12337
12338 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12339 "------> %s " ,__FUNCTION__);
12340
12341 if(NULL == pwdiSetPowerParamsReqInfo)
12342 {
12343 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12344 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12345 VOS_ASSERT(0);
12346 return VOS_STATUS_E_NOMEM;
12347 }
12348
12349 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
12350 if(NULL == pWdaParams)
12351 {
12352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12353 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12354 VOS_ASSERT(0);
12355 vos_mem_free(pwdiSetPowerParamsReqInfo);
12356 return VOS_STATUS_E_NOMEM;
12357 }
12358
12359
12360 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
12361 pPowerParams->uIgnoreDTIM;
12362
12363 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
12364 pPowerParams->uDTIMPeriod;
12365
12366 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
12367 pPowerParams->uListenInterval;
12368 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
12369 pPowerParams->uBcastMcastFilter;
12370 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
12371 pPowerParams->uEnableBET;
12372 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
12373 pPowerParams->uBETInterval;
12374
12375 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
12376
12377 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
12378 {
12379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12380 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
12381 VOS_ASSERT(0);
12382 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
12383 vos_mem_free(pWdaParams);
12384 return VOS_STATUS_E_FAILURE;
12385 }
12386
12387 /* Store Params pass it to WDI */
12388 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
12389 pWdaParams->pWdaContext = pWDA;
12390 /* Store param pointer as passed in by caller */
12391 pWdaParams->wdaMsgParam = pPowerParams;
12392
12393 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
12394 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
12395 pWdaParams);
12396
12397 if(IS_WDI_STATUS_FAILURE(status))
12398 {
12399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12400 "Failure in Set power params REQ WDI API, free all the memory " );
12401 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
12402 vos_mem_free(pWdaParams->wdaMsgParam);
12403 pWdaParams->wdaWdiApiMsgParam = NULL;
12404 pWdaParams->wdaMsgParam = NULL;
12405 }
12406
12407 return CONVERT_WDI2VOS_STATUS(status) ;
12408}
12409
12410/*
12411 * FUNCTION: WDA_SetTmLevelRspCallback
12412 * Set TM Level response
12413 */
12414void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
12415{
12416 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
12417
12418 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12419 "<------ %s " ,__FUNCTION__);
12420
12421 if(NULL == pWdaParams)
12422 {
12423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12424 "%s: pWdaParams received NULL", __FUNCTION__);
12425 VOS_ASSERT(0) ;
12426 return ;
12427 }
12428
12429 /* Dose not need to send notification to upper layer
12430 * Just free allocated resources */
12431 if( pWdaParams != NULL )
12432 {
12433 if( pWdaParams->wdaWdiApiMsgParam != NULL )
12434 {
12435 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
12436 }
12437 vos_mem_free(pWdaParams->wdaMsgParam) ;
12438 vos_mem_free(pWdaParams) ;
12439 }
12440}
12441
12442/*
12443 * FUNCTION: WDA_ProcessSetTmLevelReq
12444 * Set TM Level request
12445 */
12446VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
12447 tAniSetTmLevelReq *setTmLevelReq)
12448{
12449 WDI_Status status = WDI_STATUS_SUCCESS ;
12450 tWDA_ReqParams *pWdaParams ;
12451 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
12452 (WDI_SetTmLevelReqType *)vos_mem_malloc(
12453 sizeof(WDI_SetTmLevelReqType)) ;
12454 if(NULL == wdiSetTmLevelReq)
12455 {
12456 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12457 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12458 VOS_ASSERT(0);
12459 return VOS_STATUS_E_NOMEM;
12460 }
12461
12462 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
12463 if(NULL == pWdaParams)
12464 {
12465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12466 "%s: VOS MEM Alloc Failure", __FUNCTION__);
12467 VOS_ASSERT(0);
12468 vos_mem_free(wdiSetTmLevelReq);
12469 return VOS_STATUS_E_NOMEM;
12470 }
12471
12472 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12473 "------> %s " ,__FUNCTION__);
12474
12475 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
12476 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
12477
12478 pWdaParams->pWdaContext = pWDA;
12479 pWdaParams->wdaMsgParam = setTmLevelReq;
12480 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
12481
12482 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
12483 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
12484
12485 if(IS_WDI_STATUS_FAILURE(status))
12486 {
12487 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12488 "Failure set thernal mitigation level free all the memory " );
12489 vos_mem_free(pWdaParams->wdaMsgParam) ;
12490 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
12491 vos_mem_free(pWdaParams) ;
12492 }
12493
12494 return CONVERT_WDI2VOS_STATUS(status) ;
12495}
12496
12497VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
12498 tpTxControlParams pTxCtrlParam)
12499{
12500 VOS_STATUS wdaStatus;
12501
12502 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12503 "------> %s " ,__FUNCTION__);
12504
12505 if( pTxCtrlParam == NULL )
12506 {
12507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12508 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
12509 return VOS_STATUS_E_FAILURE;
12510 }
12511
12512 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
12513 {
12514 wdaStatus = WDA_SuspendDataTx(pWDA);
12515 }
12516 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
12517 {
12518 wdaStatus = WDA_ResumeDataTx(pWDA);
12519 }
12520
12521 return wdaStatus;
12522}
12523
12524 /* FUNCTION WDA_featureCapsExchange
12525 * WDA API to invoke capability exchange between host and FW.
12526 */
12527void WDA_featureCapsExchange(v_PVOID_t pVosContext)
12528{
12529 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
12530 "%s:enter", __FUNCTION__ );
12531 WDI_featureCapsExchangeReq( NULL, pVosContext);
12532}
12533
12534 /* FUNCTION WDA_getHostWlanFeatCaps
12535 * Wrapper for WDI API, that will return if the feature (enum value).passed
12536 * to this API is supported or not in Host
12537 * return value
12538 * 0 - implies feature is NOT Supported
12539 * any non zero value - implies feature is SUPPORTED
12540 */
12541tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
12542{
12543 return WDI_getHostWlanFeatCaps(featEnumValue);
12544}
12545
12546 /* FUNCTION WDA_getFwWlanFeatCaps
12547 * Wrapper for WDI API, that will return if the feature (enum value).passed
12548 * to this API is supported or not in FW
12549 * return value
12550 * 0 - implies feature is NOT Supported
12551 * any non zero value - implies feature is SUPPORTED
12552 */
12553tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
12554{
12555 return WDI_getFwWlanFeatCaps(featEnumValue);
12556}
12557
12558/*
12559 * FUNCTION: WDA_shutdown
12560 * Shutdown WDA/WDI without handshaking with Riva.
12561 * Synchronous function.
12562 */
12563VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
12564{
12565 WDI_Status wdiStatus;
12566 //tANI_U8 eventIdx = 0;
12567 VOS_STATUS status = VOS_STATUS_SUCCESS;
12568 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
12569
12570 if (NULL == pWDA)
12571 {
12572 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12573 "%s: Invoked with invalid pWDA", __FUNCTION__ );
12574 VOS_ASSERT(0);
12575 return VOS_STATUS_E_FAILURE;
12576 }
12577
12578 /* FTM mode stay START_STATE */
12579 if( (WDA_READY_STATE != pWDA->wdaState) &&
12580 (WDA_INIT_STATE != pWDA->wdaState) &&
12581 (WDA_START_STATE != pWDA->wdaState) )
12582 {
12583 VOS_ASSERT(0);
12584 }
12585
12586 if(NULL != pWDA->wdaWdiApiMsgParam)
12587 {
12588 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12589 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
12590 VOS_ASSERT(0);
12591 /* the last request was not freed, probably a SSR
12592 * initiated by WLAN driver (WDI timeout) */
12593 vos_mem_free(pWDA->wdaWdiApiMsgParam);
12594 }
12595
12596 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
12597 {
12598 wdaDestroyTimers(pWDA);
12599 }
12600 pWDA->wdaWdiApiMsgParam = NULL;
12601
12602 /* call WDI shutdown */
12603 wdiStatus = WDI_Shutdown(closeTransport);
12604
12605 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
12606 {
12607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12608 "error in WDA Stop" );
12609 status = VOS_STATUS_E_FAILURE;
12610 }
12611 /* WDI stop is synchrnous, shutdown is complete when it returns */
12612 pWDA->wdaState = WDA_STOP_STATE;
12613
12614
12615 /* shutdown should perform the stop & close actions. */
12616 /* Destroy the event */
12617 status = vos_event_destroy(&pWDA->txFrameEvent);
12618 if(!VOS_IS_STATUS_SUCCESS(status))
12619 {
12620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12621 "VOS Event destroy failed - status = %d\n", status);
12622 status = VOS_STATUS_E_FAILURE;
12623 }
12624 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
12625 if(!VOS_IS_STATUS_SUCCESS(status))
12626 {
12627 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12628 "VOS Event destroy failed - status = %d\n", status);
12629 status = VOS_STATUS_E_FAILURE;
12630 }
12631 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
12632 if(!VOS_IS_STATUS_SUCCESS(status))
12633 {
12634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12635 "VOS Event destroy failed - status = %d\n", status);
12636 status = VOS_STATUS_E_FAILURE;
12637 }
12638
12639 /* free WDA context */
12640 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
12641 if ( !VOS_IS_STATUS_SUCCESS(status) )
12642 {
12643 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
12644 "error in WDA close " );
12645 status = VOS_STATUS_E_FAILURE;
12646 }
12647
12648 return status;
12649}