blob: e8b5abb92f6c06017a577f1a720dc40bd2abe663 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070023 W L A N _ Q C T _ WDA . C
Jeff Johnson295189b2012-06-20 16:38:30 -070024 OVERVIEW:
Jeff Johnson295189b2012-06-20 16:38:30 -070025 This software unit holds the implementation of the WLAN Transport Layer.
Jeff Johnson295189b2012-06-20 16:38:30 -070026 The functions externalized by this module are to be called ONLY by other
27 WLAN modules that properly register with the Transport Layer initially.
Jeff Johnson295189b2012-06-20 16:38:30 -070028 DEPENDENCIES:
Jeff Johnson295189b2012-06-20 16:38:30 -070029 Are listed for each API below.
30
Jeff Johnson295189b2012-06-20 16:38:30 -070031 Copyright (c) 2010-2011 QUALCOMM Incorporated.
32 All Rights Reserved.
33 Qualcomm Confidential and Proprietary
34===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070035/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070036 EDIT HISTORY FOR FILE
37
Jeff Johnson295189b2012-06-20 16:38:30 -070038 This section contains comments describing changes made to the module.
39 Notice that changes are listed in reverse chronological order.
40
Jeff Johnson295189b2012-06-20 16:38:30 -070041 $Header$$DateTime$$Author$
42
Jeff Johnson295189b2012-06-20 16:38:30 -070043 when who what, where, why
44---------- --- -------------------------------------------------
4510/05/2011 haparna Adding support for Keep Alive Feature
462010-12-30 smiryala UMAC convergence changes
472010-08-19 adwivedi WLAN DAL AL(WDA) layer for Prima
48===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070049#if defined( FEATURE_WLAN_INTEGRATED_SOC )
Jeff Johnson295189b2012-06-20 16:38:30 -070050#include "vos_mq.h"
51#include "vos_api.h"
52#include "vos_packet.h"
53#include "vos_nvitem.h"
54#include "sirApi.h"
55#include "wlan_qct_pal_packet.h"
56#include "wlan_qct_wda.h"
57#include "wlan_qct_wda_msg.h"
58#include "wlan_qct_wdi_cfg.h"
59#include "wlan_qct_wdi.h"
60#include "wlan_qct_wdi_ds.h"
61#include "wlan_hal_cfg.h"
62/**********************/
63#include "wniApi.h"
64#include "cfgApi.h"
65#include "limApi.h"
66#include "wlan_qct_tl.h"
67#include "wlan_qct_tli_ba.h"
68#include "limUtils.h"
69#include "btcApi.h"
70#include "vos_sched.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070071#ifdef ANI_MANF_DIAG
72#include "pttMsgApi.h"
73#include "wlan_qct_sys.h"
74#endif /* ANI_MANF_DIAG */
Jeff Johnson295189b2012-06-20 16:38:30 -070075/* Used MACRO's */
76/* Get WDA context from vOSS module */
77#define VOS_GET_WDA_CTXT(a) vos_get_context(VOS_MODULE_ID_WDA, a)
78#define VOS_GET_MAC_CTXT(a) vos_get_context(VOS_MODULE_ID_PE, a)
79#define OFFSET_OF(structType,fldName) (&((structType*)0)->fldName)
80#define WDA_BA_TX_FRM_THRESHOLD (5)
Jeff Johnson295189b2012-06-20 16:38:30 -070081#define CONVERT_WDI2SIR_STATUS(x) \
82 ((WDI_STATUS_SUCCESS != (x)) ? eSIR_FAILURE : eSIR_SUCCESS)
83
84#define IS_WDI_STATUS_FAILURE(status) \
85 ((WDI_STATUS_SUCCESS != (status)) && (WDI_STATUS_PENDING != (status)))
Jeff Johnson295189b2012-06-20 16:38:30 -070086#define CONVERT_WDI2VOS_STATUS(x) \
87 ((IS_WDI_STATUS_FAILURE(x)) ? VOS_STATUS_E_FAILURE : VOS_STATUS_SUCCESS)
88
89/* macro's for acessing TL API/data structures */
Jeff Johnson295189b2012-06-20 16:38:30 -070090#define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d)
Jeff Johnson295189b2012-06-20 16:38:30 -070091#define WDA_GET_BA_TXFLAG(a, b, c) \
92 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c)))
93
94#define WDA_SET_BA_TXFLAG(a, b, c) \
95 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) |= (1 << (c)))
96
97#define WDA_CLEAR_BA_TXFLAG(a, b, c) \
98 (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c))
Jeff Johnson295189b2012-06-20 16:38:30 -070099#define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \
100 WLANTL_BaSessionAdd(a, b, c, d, e, f, g)
Jeff Johnson295189b2012-06-20 16:38:30 -0700101/* timer related Macros */
102#define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \
103 tx_timer_create(a, b, c, d, e, f, g)
104#define WDA_START_TIMER(a) tx_timer_activate(a)
105#define WDA_STOP_TIMER(a) tx_timer_deactivate(a)
106#define WDA_DESTROY_TIMER(a) tx_timer_delete(a)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700107#define WDA_WDI_START_TIMEOUT (WDI_RESPONSE_TIMEOUT + 5000)
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
109#define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \
110 ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define WDA_BA_MAX_WINSIZE (64)
Jeff Johnson295189b2012-06-20 16:38:30 -0700112#define WDA_INVALID_KEY_INDEX 0xFF
Jeff Johnson295189b2012-06-20 16:38:30 -0700113#define WDA_NUM_PWR_SAVE_CFG 11
Jeff Johnson295189b2012-06-20 16:38:30 -0700114#define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000
115
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700116#define WDA_MAX_RETRIES_TILL_RING_EMPTY 1000 /* MAX 10000 msec = 10 seconds wait */
Jeff Johnson295189b2012-06-20 16:38:30 -0700117
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700118#define WDA_WAIT_MSEC_TILL_RING_EMPTY 10 /* 10 msec wait per cycle */
Jeff Johnson295189b2012-06-20 16:38:30 -0700119/* extern declarations */
120extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -0700121/* forward declarations */
122void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
123 void *pBodyptr, tANI_U32 bodyVal) ;
124VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
125 WDI_StartReqParamsType *wdiStartParams ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700126VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ;
127VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams);
128
129extern v_BOOL_t sys_validateStaConfig( void *pImage, unsigned long cbFile,
130 void **ppStaConfig, v_SIZE_t *pcbStaConfig ) ;
131void processCfgDownloadReq(tpAniSirGlobal pMac, tANI_U16 length,
132 tANI_U32 *pConfig) ;
133void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
134 WDI_ConfigBSSReqInfoType *wdiBssParams, tAddBssParams *wdaBssParams) ;
135void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
136 WDI_ConfigStaReqInfoType *wdiStaParams, tAddStaParams *wdaStaParams) ;
137void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
138 void* pUserData ) ;
139static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) ;
140static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA);
141void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ;
142void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData);
Jeff Johnson295189b2012-06-20 16:38:30 -0700143#ifdef WLAN_FEATURE_VOWIFI_11R
144VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams);
145#endif /* WLAN_FEATURE_VOWIFI_11R */
146
Jeff Johnson295189b2012-06-20 16:38:30 -0700147void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ;
148void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ;
149VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -0700150#ifdef FEATURE_WLAN_SCAN_PNO
151static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams);
152static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams);
153static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams);
154#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -0700155#ifdef WLAN_FEATURE_PACKET_FILTERING
156static VOS_STATUS WDA_Process8023MulticastListReq (
157 tWDA_CbContext *pWDA,
158 tSirRcvFltMcAddrList *pRcvFltMcAddrLis
159 );
160static VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (
161 tWDA_CbContext *pWDA,
162 tSirRcvPktFilterCfgType *pRcvPktFilterCfg
163 );
164static VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (
165 tWDA_CbContext *pWDA,
166 tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp
167 );
168static VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (
169 tWDA_CbContext *pWDA,
170 tSirRcvFltPktClearParam *pRcvFltPktClearParam
171 );
172#endif // WLAN_FEATURE_PACKET_FILTERING
Jeff Johnson295189b2012-06-20 16:38:30 -0700173VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700174static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
175 tpTxControlParams pTxCtrlParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700176VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
177 v_U8_t *pDefaultKeyId,
178 v_U8_t *pNumKeys,
179 WDI_KeysType *pWdiKeys );
180
181#ifdef WLAN_FEATURE_GTK_OFFLOAD
182static VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, tpSirGtkOffloadParams pGtkOffloadParams);
183static VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp);
184#endif // WLAN_FEATURE_GTK_OFFLOAD
185
186VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
187 tAniSetTmLevelReq *setTmLevelReq);
Mohit Khanna4a70d262012-09-11 16:30:12 -0700188#ifdef WLAN_FEATURE_11AC
189VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
190 tUpdateVHTOpMode *pData);
191#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700192/*
193 * FUNCTION: WDA_open
194 * Allocate the WDA context
195 */
196VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext,
197 tMacOpenParameters *pMacParams )
198{
199 tWDA_CbContext *wdaContext;
200 VOS_STATUS status;
201 WDI_DeviceCapabilityType wdiDevCapability = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700202 /* Allocate WDA context */
203 status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA,
204 (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ;
205 if(!VOS_IS_STATUS_SUCCESS(status))
206 {
207 return VOS_STATUS_E_NOMEM;
208 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700209 /*__asm int 3;*/
210 vos_mem_zero(wdaContext,sizeof(tWDA_CbContext));
211
212 /* Initialize data structures */
213 wdaContext->pVosContext = pVosContext;
214 wdaContext->wdaState = WDA_INIT_STATE;
215 wdaContext->uTxFlowMask = WDA_TXFLOWMASK;
216
217 /* Initialize WDA-WDI synchronization event */
218 status = vos_event_init(&wdaContext->wdaWdiEvent);
219 if(!VOS_IS_STATUS_SUCCESS(status))
220 {
221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
222 "WDI Sync Event init failed - status = %d\n", status);
223 status = VOS_STATUS_E_FAILURE;
224 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700225 /* Init Frame transfer event */
226 status = vos_event_init(&wdaContext->txFrameEvent);
227 if(!VOS_IS_STATUS_SUCCESS(status))
228 {
229 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
230 "VOS Mgmt Frame Event init failed - status = %d\n", status);
231 status = VOS_STATUS_E_FAILURE;
232 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700233 status = vos_event_init(&wdaContext->suspendDataTxEvent);
234 if(!VOS_IS_STATUS_SUCCESS(status))
235 {
236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
237 "VOS suspend data tx Event init failed - status = %d\n", status);
238 status = VOS_STATUS_E_FAILURE;
239 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700240 status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack);
241 if(!VOS_IS_STATUS_SUCCESS(status))
242 {
243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
244 "VOS wait On Wdi Ind Event init failed - status = %d\n", status);
245 status = VOS_STATUS_E_FAILURE;
246 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700247 vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR);
Jeff Johnson295189b2012-06-20 16:38:30 -0700248 wdaContext->driverMode = pMacParams->driverType;
249 if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext,
250 &wdiDevCapability, pMacParams->driverType))
251 {
252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
253 "WDI Init failed" );
254 status = VOS_STATUS_E_FAILURE;
255 }
256 else
257 {
258 pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ;
259 pMacParams->maxBssId = wdiDevCapability.ucMaxBSSSupported;
260 pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -0700261 /* update max STA in WDA used for BA */
262 wdaContext->wdaMaxSta = pMacParams->maxStation;
263 /* store the frameTransRequired flag in wdaContext, to send this to HAL
264 * in WDA_Start
265 */
266 wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
267 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700268 return status;
269}
270
Jeff Johnson295189b2012-06-20 16:38:30 -0700271/*
272 * FUNCTION: WDA_preStart
273 * Trigger DAL-AL to start CFG download
274 */
275VOS_STATUS WDA_preStart(v_PVOID_t pVosContext)
276{
277 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
278 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700279 /*
280 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
281 */
282 wdaMsg.type = WNI_CFG_DNLD_REQ ;
283 wdaMsg.bodyptr = NULL;
284 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 /* post the message.. */
286 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
287 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
288 {
289 vosStatus = VOS_STATUS_E_BADMSG;
290 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700291 return( vosStatus );
292}
Jeff Johnson295189b2012-06-20 16:38:30 -0700293/*
294 * FUNCTION: WDA_wdiStartCallback
295 * Once WDI_Start is finished, WDI start callback will be called by WDI
296 * to indicate completion of WDI_Start.
297 */
298void WDA_wdiStartCallback(WDI_StartRspParamsType *wdiRspParams,
299 void *pVosContext)
300{
301 tWDA_CbContext *wdaContext;
302 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700303 if (NULL == pVosContext)
304 {
305 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
306 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
307 return;
308 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700309 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
310 if (NULL == wdaContext)
311 {
312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
313 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
314 return;
315 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700316 if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus)
317 {
318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
319 "%s: WDI_Start() failure reported", __FUNCTION__ );
320 }
321 else
322 {
323 wdaContext->wdaState = WDA_START_STATE;
324 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700325 /* extract and save version information from the Start Response */
326 wdaContext->wcnssWlanCompiledVersion.major =
327 wdiRspParams->wlanCompiledVersion.major;
328 wdaContext->wcnssWlanCompiledVersion.minor =
329 wdiRspParams->wlanCompiledVersion.minor;
330 wdaContext->wcnssWlanCompiledVersion.version =
331 wdiRspParams->wlanCompiledVersion.version;
332 wdaContext->wcnssWlanCompiledVersion.revision =
333 wdiRspParams->wlanCompiledVersion.revision;
334 wdaContext->wcnssWlanReportedVersion.major =
335 wdiRspParams->wlanReportedVersion.major;
336 wdaContext->wcnssWlanReportedVersion.minor =
337 wdiRspParams->wlanReportedVersion.minor;
338 wdaContext->wcnssWlanReportedVersion.version =
339 wdiRspParams->wlanReportedVersion.version;
340 wdaContext->wcnssWlanReportedVersion.revision =
341 wdiRspParams->wlanReportedVersion.revision;
342 wpalMemoryCopy(wdaContext->wcnssSoftwareVersionString,
343 wdiRspParams->wcnssSoftwareVersion,
344 sizeof(wdaContext->wcnssSoftwareVersionString));
345 wpalMemoryCopy(wdaContext->wcnssHardwareVersionString,
346 wdiRspParams->wcnssHardwareVersion,
347 sizeof(wdaContext->wcnssHardwareVersionString));
Jeff Johnson295189b2012-06-20 16:38:30 -0700348 /* Notify WDA_start that WDI_Start has completed */
349 status = vos_event_set(&wdaContext->wdaWdiEvent);
Jeff Johnson43971f52012-07-17 12:26:56 -0700350 if (VOS_STATUS_SUCCESS != status)
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 {
352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
353 "%s: Unable to unblock WDA_start", __FUNCTION__ );
354 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700355 return;
356}
357
Jeff Johnson295189b2012-06-20 16:38:30 -0700358/*
359 * FUNCTION: WDA_start
360 * Prepare TLV configuration and call WDI_Start.
361 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700362VOS_STATUS WDA_start(v_PVOID_t pVosContext)
363{
364 tWDA_CbContext *wdaContext;
365 VOS_STATUS status;
366 WDI_Status wdiStatus;
367 WDI_StartReqParamsType wdiStartParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 if (NULL == pVosContext)
369 {
370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
371 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
372 return VOS_STATUS_E_FAILURE;
373 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700374 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
375 if (NULL == wdaContext)
376 {
377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
378 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
379 return VOS_STATUS_E_FAILURE;
380 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700381 /* Non-FTM mode, WDA status for START must be INIT
382 * FTM mode, WDA Status for START can be INIT or STOP */
383 if ( (WDA_INIT_STATE != wdaContext->wdaState) &&
384 (WDA_STOP_STATE != wdaContext->wdaState) )
385 {
386 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
387 "%s: Invoked from wrong state %d",
388 __FUNCTION__, wdaContext->wdaState );
389 return VOS_STATUS_E_FAILURE;
390 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700391 /* initialize the wdiStartParam. Note that we can create this on
392 the stack since we won't exit until WDI_Start() completes or
393 times out */
394 vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700395 wdiStartParam.wdiDriverType = wdaContext->driverMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700396 /* prepare the config TLV for the WDI */
397 status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam);
398 if ( !VOS_IS_STATUS_SUCCESS(status) )
399 {
400 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
401 "%s: Unable to prepare Config TLV", __FUNCTION__ );
402 return VOS_STATUS_E_FAILURE;
403 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700404 /* note from here onwards if an error occurs we must
405 reclaim the config TLV buffer */
Jeff Johnson295189b2012-06-20 16:38:30 -0700406 wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback;
407 wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext;
408 wdiStartParam.wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700409 /* initialize the WDA-WDI synchronization event */
410 vos_event_reset(&wdaContext->wdaWdiEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700411 /* call WDI start */
412 wdiStatus = WDI_Start(&wdiStartParam,
413 (WDI_StartRspCb)WDA_wdiStartCallback,
414 (v_VOID_t *)pVosContext);
415 if ( IS_WDI_STATUS_FAILURE(wdiStatus) )
416 {
417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
418 "%s: WDI Start failed", __FUNCTION__ );
419 vos_mem_free(wdiStartParam.pConfigBuffer);
420 return VOS_STATUS_E_FAILURE;
421 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 /* wait for WDI start to invoke our callback */
423 status = vos_wait_single_event( &wdaContext->wdaWdiEvent,
424 WDA_WDI_START_TIMEOUT );
425 if ( !VOS_IS_STATUS_SUCCESS(status) )
426 {
427 if ( VOS_STATUS_E_TIMEOUT == status )
428 {
429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
430 "%s: Timeout occurred during WDI_Start", __FUNCTION__ );
431 }
432 else
433 {
434 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
435 "%s: Error %d while waiting for WDI_Start",
436 __FUNCTION__, status);
437 }
438 vos_mem_free(wdiStartParam.pConfigBuffer);
439 return VOS_STATUS_E_FAILURE;
440 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700441 /* WDI_Start() has completed so we can resume our work */
Jeff Johnson295189b2012-06-20 16:38:30 -0700442 /* we no longer need the config TLV */
443 vos_mem_free(wdiStartParam.pConfigBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700444 /* if we are not in the START state then WDI_Start() failed */
445 if (WDA_START_STATE != wdaContext->wdaState)
446 {
447 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
448 "%s: WDI_Start() failure detected", __FUNCTION__ );
449 return VOS_STATUS_E_FAILURE;
450 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700451 /* FTM mode does not need to monitor BA activity */
452 if ( eDRIVER_TYPE_MFG != wdaContext->driverMode )
453 {
454 status = wdaCreateTimers(wdaContext) ;
455 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700456 return status;
457}
458
Jeff Johnson295189b2012-06-20 16:38:30 -0700459/*
460 * FUNCTION: WDA_prepareConfigTLV
461 * Function to prepare CFG for DAL(WDA)
462 */
463VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
464 WDI_StartReqParamsType *wdiStartParams )
465{
466 /* get pMac to acess CFG data base */
467 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext);
468 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
469 tHalCfg *tlvStruct = NULL ;
470 tANI_U8 *tlvStructStart = NULL ;
471 tANI_U32 strLength = WNI_CFG_STA_ID_LEN;
472 v_PVOID_t *configParam;
473 tANI_U32 configParamSize;
474 tANI_U32 *configDataValue;
475 WDI_WlanVersionType wcnssCompiledApiVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -0700476 if ((NULL == pMac)||(NULL == wdaContext))
477 {
478 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
479 "%s: Invoked with invalid wdaContext or pMac", __FUNCTION__ );
480 VOS_ASSERT(0);
481 return VOS_STATUS_E_FAILURE;
482 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700483 configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) +
484 WNI_CFG_STA_ID_LEN +
485 WNI_CFG_EDCA_WME_ACBK_LEN +
486 WNI_CFG_EDCA_WME_ACBE_LEN +
487 WNI_CFG_EDCA_WME_ACVI_LEN +
488 WNI_CFG_EDCA_WME_ACVO_LEN +
489 + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 /* malloc memory for all configs in one shot */
491 configParam = vos_mem_malloc(configParamSize);
492
493 if(NULL == configParam )
494 {
495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
496 "%s:configParam is NULL", __FUNCTION__);
497 VOS_ASSERT(0) ;
498 return VOS_STATUS_E_NOMEM;
499 }
500 vos_mem_set(configParam, configParamSize, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700501 wdiStartParams->pConfigBuffer = configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700502 tlvStruct = (tHalCfg *)configParam;
503 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700504 /* TODO: Remove Later */
505 /* QWLAN_HAL_CFG_STA_ID */
506 tlvStruct->type = QWLAN_HAL_CFG_STA_ID;
507 configDataValue = (tANI_U32*)((tANI_U8 *) tlvStruct + sizeof(tHalCfg));
508 if(wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, (tANI_U8*)configDataValue, &strLength) !=
509 eSIR_SUCCESS)
510 {
511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
512 "Failed to get value for WNI_CFG_STA_ID");
513 goto handle_failure;
514 }
515 tlvStruct->length = strLength ;
516 /* calculate the pad bytes to have the CFG in aligned format */
517 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
518 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
520 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */
522 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
523 tlvStruct->length = sizeof(tANI_U32);
524 configDataValue = (tANI_U32 *)(tlvStruct + 1);
525 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_TX_ANTENNA, configDataValue )
526 != eSIR_SUCCESS)
527 {
528 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
529 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
530 goto handle_failure;
531 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700532 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
533 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700534 /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */
535 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
536 tlvStruct->length = sizeof(tANI_U32);
537 configDataValue = (tANI_U32 *)(tlvStruct + 1);
538 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_RX_ANTENNA, configDataValue) !=
539 eSIR_SUCCESS)
540 {
541 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
542 "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA");
543 goto handle_failure;
544 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
546 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */
548 tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
549 tlvStruct->length = sizeof(tANI_U32);
550 configDataValue = (tANI_U32 *)(tlvStruct + 1);
551 if(wlan_cfgGetInt(pMac, WNI_CFG_LOW_GAIN_OVERRIDE, configDataValue )
552 != eSIR_SUCCESS)
553 {
554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
555 "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE");
556 goto handle_failure;
557 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
559 + sizeof(tHalCfg) + tlvStruct->length)) ;
560
561 /* QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN */
562 tlvStruct->type = QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
563 tlvStruct->length = sizeof(tANI_U32);
564 configDataValue = (tANI_U32 *)(tlvStruct + 1);
565 if(wlan_cfgGetInt(pMac, WNI_CFG_POWER_STATE_PER_CHAIN,
566 configDataValue ) != eSIR_SUCCESS)
567 {
568 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
569 "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN");
570 goto handle_failure;
571 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
573 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700574 /* QWLAN_HAL_CFG_CAL_PERIOD */
575 tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD;
576 tlvStruct->length = sizeof(tANI_U32);
577 configDataValue = (tANI_U32 *)(tlvStruct + 1);
578 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_PERIOD, configDataValue )
579 != eSIR_SUCCESS)
580 {
581 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
582 "Failed to get value for WNI_CFG_CAL_PERIOD");
583 goto handle_failure;
584 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700585 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
586 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 /* QWLAN_HAL_CFG_CAL_CONTROL */
588 tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ;
589 tlvStruct->length = sizeof(tANI_U32);
590 configDataValue = (tANI_U32 *)(tlvStruct + 1);
591 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_CONTROL, configDataValue )
592 != eSIR_SUCCESS)
593 {
594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
595 "Failed to get value for WNI_CFG_CAL_CONTROL");
596 goto handle_failure;
597 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700598 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
599 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700600 /* QWLAN_HAL_CFG_PROXIMITY */
601 tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ;
602 tlvStruct->length = sizeof(tANI_U32);
603 configDataValue = (tANI_U32 *)(tlvStruct + 1);
604 if(wlan_cfgGetInt(pMac, WNI_CFG_PROXIMITY, configDataValue )
605 != eSIR_SUCCESS)
606 {
607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
608 "Failed to get value for WNI_CFG_PROXIMITY");
609 goto handle_failure;
610 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700611 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
612 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 /* QWLAN_HAL_CFG_NETWORK_DENSITY */
614 tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ;
615 tlvStruct->length = sizeof(tANI_U32);
616 configDataValue = (tANI_U32 *)(tlvStruct + 1);
617 if(wlan_cfgGetInt(pMac, WNI_CFG_NETWORK_DENSITY, configDataValue )
618 != eSIR_SUCCESS)
619 {
620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
621 "Failed to get value for WNI_CFG_NETWORK_DENSITY");
622 goto handle_failure;
623 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700624 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
625 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700626 /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME */
627 tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ;
628 tlvStruct->length = sizeof(tANI_U32);
629 configDataValue = (tANI_U32 *)(tlvStruct + 1);
630 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MEDIUM_TIME, configDataValue ) !=
631 eSIR_SUCCESS)
632 {
633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
634 "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME");
635 goto handle_failure;
636 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700637 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
638 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700639 /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU */
640 tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU ;
641 tlvStruct->length = sizeof(tANI_U32);
642 configDataValue = (tANI_U32 *)(tlvStruct + 1);
643 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MPDUS_IN_AMPDU,
644 configDataValue ) != eSIR_SUCCESS)
645 {
646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
647 "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU");
648 goto handle_failure;
649 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700650 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
651 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700652 /* QWLAN_HAL_CFG_RTS_THRESHOLD */
653 tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD ;
654 tlvStruct->length = sizeof(tANI_U32);
655 configDataValue = (tANI_U32 *)(tlvStruct + 1);
656 if(wlan_cfgGetInt(pMac, WNI_CFG_RTS_THRESHOLD, configDataValue ) !=
657 eSIR_SUCCESS)
658 {
659 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
660 "Failed to get value for WNI_CFG_RTS_THRESHOLD");
661 goto handle_failure;
662 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700663 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
664 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700665 /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT */
666 tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT ;
667 tlvStruct->length = sizeof(tANI_U32);
668 configDataValue = (tANI_U32 *)(tlvStruct + 1);
669 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_RETRY_LIMIT, configDataValue ) !=
670 eSIR_SUCCESS)
671 {
672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
673 "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT");
674 goto handle_failure;
675 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
677 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT */
679 tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT ;
680 tlvStruct->length = sizeof(tANI_U32);
681 configDataValue = (tANI_U32 *)(tlvStruct + 1);
682 if(wlan_cfgGetInt(pMac, WNI_CFG_LONG_RETRY_LIMIT, configDataValue ) !=
683 eSIR_SUCCESS)
684 {
685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
686 "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT");
687 goto handle_failure;
688 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700689 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
690 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700691 /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD */
692 tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD ;
693 tlvStruct->length = sizeof(tANI_U32);
694 configDataValue = (tANI_U32 *)(tlvStruct + 1);
695 if(wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD,
696 configDataValue ) != eSIR_SUCCESS)
697 {
698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
699 "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD");
700 goto handle_failure;
701 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700702 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
703 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700704 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO */
705 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO ;
706 tlvStruct->length = sizeof(tANI_U32);
707 configDataValue = (tANI_U32 *)(tlvStruct + 1);
708 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ZERO,
709 configDataValue ) != eSIR_SUCCESS)
710 {
711 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
712 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO");
713 goto handle_failure;
714 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
716 + sizeof(tHalCfg) + tlvStruct->length));
717
718 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE */
719 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE ;
720 tlvStruct->length = sizeof(tANI_U32);
721 configDataValue = (tANI_U32 *)(tlvStruct + 1);
722 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ONE,
723 configDataValue ) != eSIR_SUCCESS)
724 {
725 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
726 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE");
727 goto handle_failure;
728 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700729 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
730 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700731 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO */
732 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO ;
733 tlvStruct->length = sizeof(tANI_U32);
734 configDataValue = (tANI_U32 *)(tlvStruct + 1);
735 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_TWO,
736 configDataValue ) != eSIR_SUCCESS)
737 {
738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
739 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO");
740 goto handle_failure;
741 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700742 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
743 + sizeof(tHalCfg) + tlvStruct->length));
744
745 /* QWLAN_HAL_CFG_FIXED_RATE */
746 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE ;
747 tlvStruct->length = sizeof(tANI_U32);
748 configDataValue = (tANI_U32 *)(tlvStruct + 1);
749 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE, configDataValue)
750 != eSIR_SUCCESS)
751 {
752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
753 "Failed to get value for WNI_CFG_FIXED_RATE");
754 goto handle_failure;
755 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700756 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
757 + sizeof(tHalCfg) + tlvStruct->length));
758
759 /* QWLAN_HAL_CFG_RETRYRATE_POLICY */
760 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_POLICY ;
761 tlvStruct->length = sizeof(tANI_U32);
762 configDataValue = (tANI_U32 *)(tlvStruct + 1);
763 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_POLICY, configDataValue )
764 != eSIR_SUCCESS)
765 {
766 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
767 "Failed to get value for WNI_CFG_RETRYRATE_POLICY");
768 goto handle_failure;
769 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700770 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
771 + sizeof(tHalCfg) + tlvStruct->length));
772
773 /* QWLAN_HAL_CFG_RETRYRATE_SECONDARY */
774 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_SECONDARY ;
775 tlvStruct->length = sizeof(tANI_U32);
776 configDataValue = (tANI_U32 *)(tlvStruct + 1);
777 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_SECONDARY,
778 configDataValue ) != eSIR_SUCCESS)
779 {
780 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
781 "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY");
782 goto handle_failure;
783 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700784 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
785 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700786 /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY */
787 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY ;
788 tlvStruct->length = sizeof(tANI_U32);
789 configDataValue = (tANI_U32 *)(tlvStruct + 1);
790 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_TERTIARY,
791 configDataValue ) != eSIR_SUCCESS)
792 {
793 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
794 "Failed to get value for WNI_CFG_RETRYRATE_TERTIARY");
795 goto handle_failure;
796 }
797 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
798 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700799 /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION */
800 tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION ;
801 tlvStruct->length = sizeof(tANI_U32);
802 configDataValue = (tANI_U32 *)(tlvStruct + 1);
803 if(wlan_cfgGetInt(pMac, WNI_CFG_FORCE_POLICY_PROTECTION,
804 configDataValue ) != eSIR_SUCCESS)
805 {
806 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
807 "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION");
808 goto handle_failure;
809 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700810 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
811 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700812 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ */
813 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ ;
814 tlvStruct->length = sizeof(tANI_U32);
815 configDataValue = (tANI_U32 *)(tlvStruct + 1);
816 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_24GHZ,
817 configDataValue ) != eSIR_SUCCESS)
818 {
819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
820 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ");
821 goto handle_failure;
822 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700823 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
824 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ */
826 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ ;
827 tlvStruct->length = sizeof(tANI_U32);
828 configDataValue = (tANI_U32 *)(tlvStruct + 1);
829 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_5GHZ,
830 configDataValue ) != eSIR_SUCCESS)
831 {
832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
833 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ");
834 goto handle_failure;
835 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700836 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
837 + sizeof(tHalCfg) + tlvStruct->length);
838
839#if 0 /*FIXME_PRIMA : Enable this after the RA is enabled in HAL*/
840 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ */
841 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ ;
842 tlvStruct->length = sizeof(tANI_U32);
843 configDataValue = (tANI_U32 *)(tlvStruct + 1);
844 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_24GHZ,
845 configDataValue ) != eSIR_SUCCESS)
846 {
847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
848 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ");
849 goto handle_failure;
850 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
852 + sizeof(tHalCfg) + tlvStruct->length);
853#endif
854 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ */
855 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ ;
856 tlvStruct->length = sizeof(tANI_U32);
857 configDataValue = (tANI_U32 *)(tlvStruct + 1);
858 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_5GHZ,
859 configDataValue ) != eSIR_SUCCESS)
860 {
861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
862 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ");
863 goto handle_failure;
864 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700865 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
866 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700867 /* QWLAN_HAL_CFG_MAX_BA_SESSIONS */
868 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS ;
869 tlvStruct->length = sizeof(tANI_U32);
870 configDataValue = (tANI_U32 *)(tlvStruct + 1);
871 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_SESSIONS, configDataValue ) !=
872 eSIR_SUCCESS)
873 {
874 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
875 "Failed to get value for WNI_CFG_MAX_BA_SESSIONS");
876 goto handle_failure;
877 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700878 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
879 + sizeof(tHalCfg) + tlvStruct->length);
880
881 /* QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT */
882 tlvStruct->type = QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT ;
883 tlvStruct->length = sizeof(tANI_U32);
884 configDataValue = (tANI_U32 *)(tlvStruct + 1);
885 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
886 configDataValue ) != eSIR_SUCCESS)
887 {
888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
889 "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
890 goto handle_failure;
891 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700892 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
893 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700894 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER */
895 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER ;
896 tlvStruct->length = sizeof(tANI_U32);
897 configDataValue = (tANI_U32 *)(tlvStruct + 1);
898 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_BCN_FILTER,
899 configDataValue ) != eSIR_SUCCESS)
900 {
901 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
902 "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER");
903 goto handle_failure;
904 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700905 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
906 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700907 /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR */
908 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR ;
909 tlvStruct->length = sizeof(tANI_U32);
910 configDataValue = (tANI_U32 *)(tlvStruct + 1);
911 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
912 configDataValue ) != eSIR_SUCCESS)
913 {
914 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
915 "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR");
916 goto handle_failure;
917 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700918 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
919 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700920 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
921 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE ;
922 tlvStruct->length = sizeof(tANI_U32);
923 configDataValue = (tANI_U32 *)(tlvStruct + 1);
924 if(wlan_cfgGetInt(pMac, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE,
925 configDataValue ) != eSIR_SUCCESS)
926 {
927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
928 "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE");
929 goto handle_failure;
930 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700931 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
932 + sizeof(tHalCfg) + tlvStruct->length);
933
934 /* QWLAN_HAL_CFG_STATS_PERIOD */
935 tlvStruct->type = QWLAN_HAL_CFG_STATS_PERIOD ;
936 tlvStruct->length = sizeof(tANI_U32);
937 configDataValue = (tANI_U32 *)(tlvStruct + 1);
938 if(wlan_cfgGetInt(pMac, WNI_CFG_STATS_PERIOD, configDataValue ) !=
939 eSIR_SUCCESS)
940 {
941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
942 "Failed to get value for WNI_CFG_STATS_PERIOD");
943 goto handle_failure;
944 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700945 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
946 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700947 /* QWLAN_HAL_CFG_CFP_MAX_DURATION */
948 tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION ;
949 tlvStruct->length = sizeof(tANI_U32);
950 configDataValue = (tANI_U32 *)(tlvStruct + 1);
951 if(wlan_cfgGetInt(pMac, WNI_CFG_CFP_MAX_DURATION, configDataValue ) !=
952 eSIR_SUCCESS)
953 {
954 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
955 "Failed to get value for WNI_CFG_CFP_MAX_DURATION");
956 goto handle_failure;
957 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700958 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
959 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700960 /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */
961 tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED ;
962 tlvStruct->length = sizeof(tANI_U32);
963 configDataValue = (tANI_U32 *)(tlvStruct + 1);
964 vos_mem_copy(configDataValue, &wdaContext->frameTransRequired,
965 sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700966 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
967 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700968 /* QWLAN_HAL_CFG_DTIM_PERIOD */
969 tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD ;
970 tlvStruct->length = sizeof(tANI_U32);
971 configDataValue = (tANI_U32 *)(tlvStruct + 1);
972 if(wlan_cfgGetInt(pMac, WNI_CFG_DTIM_PERIOD, configDataValue)
973 != eSIR_SUCCESS)
974 {
975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
976 "Failed to get value for WNI_CFG_DTIM_PERIOD");
977 goto handle_failure;
978 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
980 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700981 /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */
982 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK ;
983 strLength = WNI_CFG_EDCA_WME_ACBK_LEN;
984 configDataValue = (tANI_U32 *)(tlvStruct + 1);
985 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBK, (tANI_U8 *)configDataValue,
986 &strLength) != eSIR_SUCCESS)
987 {
988 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
989 "Failed to get value for WNI_CFG_EDCA_WME_ACBK");
990 goto handle_failure;
991 }
992 tlvStruct->length = strLength;
993 /* calculate the pad bytes to have the CFG in aligned format */
994 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
995 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -0700996 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
997 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700998 /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */
999 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE ;
1000 strLength = WNI_CFG_EDCA_WME_ACBE_LEN;
1001 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1002 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBE, (tANI_U8 *)configDataValue,
1003 &strLength) != eSIR_SUCCESS)
1004 {
1005 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1006 "Failed to get value for WNI_CFG_EDCA_WME_ACBE");
1007 goto handle_failure;
1008 }
1009 tlvStruct->length = strLength;
1010 /* calculate the pad bytes to have the CFG in aligned format */
1011 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1012 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001013 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1014 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001015 /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */
1016 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO ;
1017 strLength = WNI_CFG_EDCA_WME_ACVI_LEN;
1018 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1019 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVO, (tANI_U8 *)configDataValue,
1020 &strLength) != eSIR_SUCCESS)
1021 {
1022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1023 "Failed to get value for WNI_CFG_EDCA_WME_ACVI");
1024 goto handle_failure;
1025 }
1026 tlvStruct->length = strLength;
1027 /* calculate the pad bytes to have the CFG in aligned format */
1028 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1029 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001030 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1031 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001032 /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */
1033 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI ;
1034 strLength = WNI_CFG_EDCA_WME_ACVO_LEN;
1035 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1036 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVI, (tANI_U8 *)configDataValue,
1037 &strLength) != eSIR_SUCCESS)
1038 {
1039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1040 "Failed to get value for WNI_CFG_EDCA_WME_ACVO");
1041 goto handle_failure;
1042 }
1043 tlvStruct->length = strLength;
1044 /* calculate the pad bytes to have the CFG in aligned format */
1045 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1046 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001047 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1048 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001049 /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */
1050 tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH ;
1051 tlvStruct->length = sizeof(tANI_U32);
1052 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1053 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_THRESHOLD_HIGH, configDataValue)
1054 != eSIR_SUCCESS)
1055 {
1056 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1057 "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH");
1058 goto handle_failure;
1059 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001060 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1061 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001062 /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */
1063 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS ;
1064 tlvStruct->length = sizeof(tANI_U32);
1065 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1066 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_BUFFERS, configDataValue)
1067 != eSIR_SUCCESS)
1068 {
1069 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1070 "Failed to get value for WNI_CFG_MAX_BA_BUFFERS");
1071 goto handle_failure;
1072 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001073 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1074 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001075 /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */
1076 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE ;
1077 tlvStruct->length = sizeof(tANI_U32);
1078 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1079 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_PS_POLL_VALUE, configDataValue)
1080 != eSIR_SUCCESS)
1081 {
1082 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1083 "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE");
1084 goto handle_failure;
1085 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001086 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1087 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001088 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */
1089 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI ;
1090 tlvStruct->length = sizeof(tANI_U32);
1091 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1092 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI, configDataValue)
1093 != eSIR_SUCCESS)
1094 {
1095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1096 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI");
1097 goto handle_failure;
1098 }
1099 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1100 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001101 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */
1102 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS ;
1103 tlvStruct->length = sizeof(tANI_U32);
1104 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1105 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS, configDataValue)
1106 != eSIR_SUCCESS)
1107 {
1108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1109 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS");
1110 goto handle_failure;
1111 }
1112 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1113 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001114 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */
1115 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI ;
1116 tlvStruct->length = sizeof(tANI_U32);
1117 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1118 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI, configDataValue)
1119 != eSIR_SUCCESS)
1120 {
1121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1122 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI");
1123 goto handle_failure;
1124 }
1125 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1126 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001127 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */
1128 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS ;
1129 tlvStruct->length = sizeof(tANI_U32);
1130 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1131 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS, configDataValue)
1132 != eSIR_SUCCESS)
1133 {
1134 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1135 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS");
1136 goto handle_failure;
1137 }
1138 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1139 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001140 /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */
1141 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN ;
1142 tlvStruct->length = sizeof(tANI_U32);
1143 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1144 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, configDataValue)
1145 != eSIR_SUCCESS)
1146 {
1147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1148 "Failed to get value for WNI_CFG_TELE_BCN_WAKEUP_EN");
1149 goto handle_failure;
1150 }
1151 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1152 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001153 /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */
1154 tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD ;
1155 tlvStruct->length = sizeof(tANI_U32);
1156 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1157 if(wlan_cfgGetInt(pMac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, configDataValue)
1158 != eSIR_SUCCESS)
1159 {
1160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1161 "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
1162 goto handle_failure;
1163 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001164 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1165 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001166 /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/
1167 tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE ;
1168 tlvStruct->length = sizeof(tANI_U32);
1169 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1170 if(wlan_cfgGetInt(pMac, WNI_CFG_TX_PWR_CTRL_ENABLE, configDataValue)
1171 != eSIR_SUCCESS)
1172 {
1173 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1174 "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE");
1175 goto handle_failure;
1176 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001177 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1178 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP */
1180 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP ;
1181 tlvStruct->length = sizeof(tANI_U32);
1182 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1183 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_CLOSE_LOOP, configDataValue)
1184 != eSIR_SUCCESS)
1185 {
1186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1187 "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP");
1188 goto handle_failure;
1189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001190 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1191 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001192 /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary,
1193 * but are from the WLAN_INI_FILE file. However, this is the only parameter download routine
1194 * into FW, so the parameters are added here.
1195 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001196 /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */
1197 tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE ;
1198 tlvStruct->length = sizeof(tANI_U32);
1199 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1200 *configDataValue = pMac->btc.btcConfig.btcExecutionMode;
1201 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1202 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */
1204 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK ;
1205 tlvStruct->length = sizeof(tANI_U32);
1206 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1207 *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp;
1208 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1209 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001210 /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */
1211 tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS ;
1212 tlvStruct->length = sizeof(tANI_U32);
1213 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1214 *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp;
1215 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1216 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson32d95a32012-09-10 13:15:23 -07001217 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT */
1218 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT ;
1219 tlvStruct->length = sizeof(tANI_U32);
1220 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1221 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqBt;
1222 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1223 + sizeof(tHalCfg) + tlvStruct->length) ;
1224
1225 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT */
1226 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT ;
1227 tlvStruct->length = sizeof(tANI_U32);
1228 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1229 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageBt;
1230 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1231 + sizeof(tHalCfg) + tlvStruct->length) ;
1232
1233 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT */
1234 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT ;
1235 tlvStruct->length = sizeof(tANI_U32);
1236 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1237 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnBt;
1238 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1239 + sizeof(tHalCfg) + tlvStruct->length) ;
1240
1241 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT */
1242 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT ;
1243 tlvStruct->length = sizeof(tANI_U32);
1244 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1245 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeBt;
1246 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1247 + sizeof(tHalCfg) + tlvStruct->length) ;
1248
1249 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN */
1250 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN ;
1251 tlvStruct->length = sizeof(tANI_U32);
1252 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1253 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqWlan;
1254 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1255 + sizeof(tHalCfg) + tlvStruct->length) ;
1256
1257 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN */
1258 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN ;
1259 tlvStruct->length = sizeof(tANI_U32);
1260 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1261 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageWlan;
1262 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1263 + sizeof(tHalCfg) + tlvStruct->length) ;
1264
1265 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN */
1266 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN ;
1267 tlvStruct->length = sizeof(tANI_U32);
1268 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1269 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnWlan;
1270 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1271 + sizeof(tHalCfg) + tlvStruct->length) ;
1272
1273 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN */
1274 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN ;
1275 tlvStruct->length = sizeof(tANI_U32);
1276 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1277 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeWlan;
1278 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1279 + sizeof(tHalCfg) + tlvStruct->length) ;
1280
1281 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT */
1282 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT ;
1283 tlvStruct->length = sizeof(tANI_U32);
1284 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1285 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenBt;
1286 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1287 + sizeof(tHalCfg) + tlvStruct->length) ;
1288
1289 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN */
1290 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN ;
1291 tlvStruct->length = sizeof(tANI_U32);
1292 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1293 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenWlan;
1294 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1295 + sizeof(tHalCfg) + tlvStruct->length) ;
1296
1297 /* [COEX] QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC */
1298 tlvStruct->type = QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC ;
1299 tlvStruct->length = sizeof(tANI_U32);
1300 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1301 *configDataValue = pMac->btc.btcConfig.btcMaxScoBlockPerc;
1302 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1303 + sizeof(tHalCfg) + tlvStruct->length) ;
1304
1305 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP */
1306 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP ;
1307 tlvStruct->length = sizeof(tANI_U32);
1308 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1309 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnA2dp;
1310 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1311 + sizeof(tHalCfg) + tlvStruct->length) ;
1312
1313 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO */
1314 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO ;
1315 tlvStruct->length = sizeof(tANI_U32);
1316 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1317 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnSco;
1318 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1319 + sizeof(tHalCfg) + tlvStruct->length) ;
1320
1321 /* QWLAN_HAL_CFG_WCNSS_API_VERSION */
Jeff Johnson295189b2012-06-20 16:38:30 -07001322 tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION ;
1323 tlvStruct->length = sizeof(tANI_U32);
1324 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1325 WDI_GetWcnssCompiledApiVersion(&wcnssCompiledApiVersion);
1326 *configDataValue = WLAN_HAL_CONSTRUCT_API_VERSION(wcnssCompiledApiVersion.major,
1327 wcnssCompiledApiVersion.minor,
1328 wcnssCompiledApiVersion.version,
1329 wcnssCompiledApiVersion.revision);
1330 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1331 + sizeof(tHalCfg) + tlvStruct->length) ;
1332
Jeff Johnsond13512a2012-07-17 11:42:19 -07001333 /* QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT */
1334 tlvStruct->type = QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT ;
1335 tlvStruct->length = sizeof(tANI_U32);
1336 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1337 if(wlan_cfgGetInt(pMac, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT,
1338 configDataValue ) != eSIR_SUCCESS)
1339 {
1340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1341 "Failed to get value for WNI_CFG_AP_KEEP_ALIVE_TIMEOUT");
1342 goto handle_failure;
1343 }
1344
1345 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1346 + sizeof(tHalCfg) + tlvStruct->length) ;
1347 /* QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT */
1348 tlvStruct->type = QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT ;
1349 tlvStruct->length = sizeof(tANI_U32);
1350 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1351 if(wlan_cfgGetInt(pMac, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT,
1352 configDataValue ) != eSIR_SUCCESS)
1353 {
1354 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1355 "Failed to get value for WNI_CFG_GO_KEEP_ALIVE_TIMEOUT");
1356 goto handle_failure;
1357 }
1358
1359 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1360 + sizeof(tHalCfg) + tlvStruct->length) ;
1361
1362 /* QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST */
1363 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST;
1364 tlvStruct->length = sizeof(tANI_U32);
1365 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1366 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MC_ADDR_LIST, configDataValue)
1367 != eSIR_SUCCESS)
1368 {
1369 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1370 "Failed to get value for WNI_CFG_ENABLE_MC_ADDR_LIST");
1371 goto handle_failure;
1372 }
1373
1374 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1375 + sizeof(tHalCfg) + tlvStruct->length) ;
1376
Jeff Johnson295189b2012-06-20 16:38:30 -07001377 wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001378#ifdef WLAN_DEBUG
1379 {
1380 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07001381 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1382 "****** Dumping CFG TLV ***** ");
1383 for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8)
1384 {
1385 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1386 "%02x %02x %02x %02x %02x %02x %02x %02x",
1387 tlvStructStart[i],
1388 tlvStructStart[i+1],
1389 tlvStructStart[i+2],
1390 tlvStructStart[i+3],
1391 tlvStructStart[i+4],
1392 tlvStructStart[i+5],
1393 tlvStructStart[i+6],
1394 tlvStructStart[i+7]);
1395 }
1396 /* Dump the bytes in the last line*/
1397 for (; i < wdiStartParams->usConfigBufferLen; i++)
1398 {
1399 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1400 "%02x ",tlvStructStart[i]);
1401 }
1402 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1403 "**************************** ");
1404 }
1405#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001406 return VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001407handle_failure:
1408 vos_mem_free(configParam);
1409 return VOS_STATUS_E_FAILURE;
1410}
Jeff Johnson295189b2012-06-20 16:38:30 -07001411/*
1412 * FUNCTION: WDA_wdiCompleteCB
1413 * call the voss call back function
1414 */
1415void WDA_stopCallback(WDI_Status status, v_PVOID_t *pVosContext)
1416{
1417 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001418 if (NULL == wdaContext)
1419 {
1420 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1421 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1422 return ;
1423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001424 /* free the config structure */
1425 if(wdaContext->wdaWdiApiMsgParam != NULL)
1426 {
1427 vos_mem_free(wdaContext->wdaWdiApiMsgParam);
1428 wdaContext->wdaWdiApiMsgParam = NULL;
1429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001430 if(WDI_STATUS_SUCCESS != status)
1431 {
1432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1433 "WDI stop callback returned failure" );
1434 VOS_ASSERT(0) ;
1435 }
1436 else
1437 {
1438 wdaContext->wdaState = WDA_STOP_STATE;
1439 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001440 /* Indicate VOSS about the start complete */
1441 vos_WDAComplete_cback(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001442 return ;
1443}
Jeff Johnson295189b2012-06-20 16:38:30 -07001444/*
1445 * FUNCTION: WDA_stop
1446 * call WDI_stop
1447 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001448VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
1449{
1450 WDI_Status wdiStatus;
1451 VOS_STATUS status = VOS_STATUS_SUCCESS;
1452 WDI_StopReqParamsType *wdiStopReq;
1453 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001454 if (NULL == pWDA)
1455 {
1456 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1457 "%s: Invoked with invalid pWDA", __FUNCTION__ );
1458 VOS_ASSERT(0);
1459 return VOS_STATUS_E_FAILURE;
1460 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001461 /* FTM mode stay START_STATE */
1462 if( (WDA_READY_STATE != pWDA->wdaState) &&
1463 (WDA_INIT_STATE != pWDA->wdaState) &&
1464 (WDA_START_STATE != pWDA->wdaState) )
1465 {
1466 VOS_ASSERT(0);
1467 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001468 wdiStopReq = (WDI_StopReqParamsType *)
1469 vos_mem_malloc(sizeof(WDI_StopReqParamsType));
1470 if(NULL == wdiStopReq)
1471 {
1472 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1473 "%s: VOS MEM Alloc Failure", __FUNCTION__);
1474 VOS_ASSERT(0);
1475 return VOS_STATUS_E_NOMEM;
1476 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001477 wdiStopReq->wdiStopReason = reason;
1478 wdiStopReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001479 if(NULL != pWDA->wdaWdiApiMsgParam)
1480 {
1481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1482 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
1483 VOS_ASSERT(0);
1484 vos_mem_free(wdiStopReq);
1485 return VOS_STATUS_E_FAILURE;
1486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001487 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
1488 {
1489 wdaDestroyTimers(pWDA);
1490 }
1491 pWDA->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 /* call WDI stop */
1493 wdiStatus = WDI_Stop(wdiStopReq,
1494 (WDI_StopRspCb)WDA_stopCallback, pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001495 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
1496 {
1497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1498 "error in WDA Stop" );
1499 vos_mem_free(pWDA->wdaWdiApiMsgParam);
1500 pWDA->wdaWdiApiMsgParam = NULL;
1501 status = VOS_STATUS_E_FAILURE;
1502 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001503 return status;
1504}
Jeff Johnson295189b2012-06-20 16:38:30 -07001505/*
1506 * FUNCTION: WDA_close
1507 * call WDI_close and free the WDA context
1508 */
1509VOS_STATUS WDA_close(v_PVOID_t pVosContext)
1510{
Jeff Johnson43971f52012-07-17 12:26:56 -07001511 VOS_STATUS status = VOS_STATUS_SUCCESS;
1512 WDI_Status wstatus;
1513 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07001514 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001515 if (NULL == wdaContext)
1516 {
1517 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1518 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1519 return VOS_STATUS_E_FAILURE;
1520 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001521 if((WDA_INIT_STATE != wdaContext->wdaState) &&
1522 (WDA_STOP_STATE != wdaContext->wdaState))
1523 {
1524 VOS_ASSERT(0);
1525 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001526 /*call WDI close*/
Jeff Johnson43971f52012-07-17 12:26:56 -07001527 wstatus = WDI_Close();
1528 if ( wstatus != WDI_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 {
1530 status = VOS_STATUS_E_FAILURE;
1531 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001532 wdaContext->wdaState = WDA_CLOSE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001533 /* Destroy the events */
Jeff Johnson43971f52012-07-17 12:26:56 -07001534 vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent);
1535 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001536 {
1537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1538 "WDI Sync Event destroy failed - status = %d\n", status);
1539 status = VOS_STATUS_E_FAILURE;
1540 }
1541
Jeff Johnson43971f52012-07-17 12:26:56 -07001542 vstatus = vos_event_destroy(&wdaContext->txFrameEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001543 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 {
1545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1546 "VOS Event destroy failed - status = %d\n", status);
1547 status = VOS_STATUS_E_FAILURE;
1548 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001549 vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001550 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001551 {
1552 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1553 "VOS Event destroy failed - status = %d\n", status);
1554 status = VOS_STATUS_E_FAILURE;
1555 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001556 vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
Jeff Johnsone7245742012-09-05 17:12:55 -07001557 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001558 {
1559 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1560 "VOS Event destroy failed - status = %d\n", status);
1561 status = VOS_STATUS_E_FAILURE;
1562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001563 /* free WDA context */
Jeff Johnson43971f52012-07-17 12:26:56 -07001564 vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07001565 if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001566 {
1567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1568 "error in WDA close " );
1569 status = VOS_STATUS_E_FAILURE;
1570 }
1571 return status;
1572}
Jeff Johnson295189b2012-06-20 16:38:30 -07001573/*
1574 * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
1575 * returns 1 if the compiled version is greater than or equal to the input version
1576 */
1577
1578uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1579{
1580 VOS_STATUS status = VOS_STATUS_SUCCESS;
1581 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1582 tSirVersionType compiledVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001583 status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001584 if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
1585 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
1586 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
1587 (compiledVersion.revision >= revision)))
1588 return 1;
1589 else
1590 return 0;
1591}
Jeff Johnson295189b2012-06-20 16:38:30 -07001592/*
1593 * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
1594 * returns 1 if the compiled version is greater than or equal to the input version
1595 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001596uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1597{
1598 VOS_STATUS status = VOS_STATUS_SUCCESS;
1599 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1600 tSirVersionType reportedVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001601 status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001602 if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
1603 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
1604 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
1605 (reportedVersion.revision >= revision)))
1606 return 1;
1607 else
1608 return 0;
1609}
Jeff Johnson295189b2012-06-20 16:38:30 -07001610/*
1611 * FUNCTION: WDA_GetWcnssWlanCompiledVersion
1612 * Returns the version of the WCNSS WLAN API with which the HOST
1613 * device driver was compiled
1614 */
1615VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx,
1616 tSirVersionType *pVersion)
1617{
1618 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001619 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1620 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001621 if ((NULL == pvosGCtx) || (NULL == pVersion))
1622 {
1623 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1624 "%s: Invoked with invalid parameter", __FUNCTION__);
1625 VOS_ASSERT(0);
1626 return VOS_STATUS_E_FAILURE;
1627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001628 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1629 if (NULL == pWDA )
1630 {
1631 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1632 "%s: Invalid WDA context", __FUNCTION__);
1633 VOS_ASSERT(0);
1634 return VOS_STATUS_E_FAILURE;
1635 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001636 *pVersion = pWDA->wcnssWlanCompiledVersion;
1637 return VOS_STATUS_SUCCESS;
1638}
Jeff Johnson295189b2012-06-20 16:38:30 -07001639/*
1640 * FUNCTION: WDA_GetWcnssWlanReportedVersion
1641 * Returns the version of the WCNSS WLAN API with which the WCNSS
1642 * device driver was compiled
1643 */
1644VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx,
1645 tSirVersionType *pVersion)
1646{
1647 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001648 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1649 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001650 if ((NULL == pvosGCtx) || (NULL == pVersion))
1651 {
1652 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1653 "%s: Invoked with invalid parameter", __FUNCTION__);
1654 VOS_ASSERT(0);
1655 return VOS_STATUS_E_FAILURE;
1656 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001657 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1658 if (NULL == pWDA )
1659 {
1660 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1661 "%s: Invalid WDA context", __FUNCTION__);
1662 VOS_ASSERT(0);
1663 return VOS_STATUS_E_FAILURE;
1664 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001665 *pVersion = pWDA->wcnssWlanReportedVersion;
1666 return VOS_STATUS_SUCCESS;
1667}
Jeff Johnson295189b2012-06-20 16:38:30 -07001668/*
1669 * FUNCTION: WDA_GetWcnssSoftwareVersion
1670 * Returns the WCNSS Software version string
1671 */
1672VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
1673 tANI_U8 *pVersion,
1674 tANI_U32 versionBufferSize)
1675{
1676 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001677 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1678 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 if ((NULL == pvosGCtx) || (NULL == pVersion))
1680 {
1681 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1682 "%s: Invoked with invalid parameter", __FUNCTION__);
1683 VOS_ASSERT(0);
1684 return VOS_STATUS_E_FAILURE;
1685 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1687 if (NULL == pWDA )
1688 {
1689 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1690 "%s: Invalid WDA context", __FUNCTION__);
1691 VOS_ASSERT(0);
1692 return VOS_STATUS_E_FAILURE;
1693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001694 wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
1695 return VOS_STATUS_SUCCESS;
1696}
Jeff Johnson295189b2012-06-20 16:38:30 -07001697/*
1698 * FUNCTION: WDA_GetWcnssHardwareVersion
1699 * Returns the WCNSS Hardware version string
1700 */
1701VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx,
1702 tANI_U8 *pVersion,
1703 tANI_U32 versionBufferSize)
1704{
1705 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1707 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001708 if ((NULL == pvosGCtx) || (NULL == pVersion))
1709 {
1710 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1711 "%s: Invoked with invalid parameter", __FUNCTION__);
1712 VOS_ASSERT(0);
1713 return VOS_STATUS_E_FAILURE;
1714 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001715 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1716 if (NULL == pWDA )
1717 {
1718 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1719 "%s: Invalid WDA context", __FUNCTION__);
1720 VOS_ASSERT(0);
1721 return VOS_STATUS_E_FAILURE;
1722 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001723 wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
1724 return VOS_STATUS_SUCCESS;
1725}
Jeff Johnson295189b2012-06-20 16:38:30 -07001726/*
1727 * FUNCTION: WDA_WniCfgDnld
1728 * Trigger CFG Download
1729 */
1730VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA)
1731{
1732 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001733 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 v_VOID_t *pFileImage = NULL;
1735 v_SIZE_t cbFileImageSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001736 v_VOID_t *pCfgBinary = NULL;
1737 v_SIZE_t cbCfgBinarySize = 0;
1738
1739 v_BOOL_t bStatus = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 if (NULL == pMac )
1741 {
1742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1743 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
1744 VOS_ASSERT(0);
1745 return VOS_STATUS_E_FAILURE;
1746 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 /* get the number of bytes in the CFG Binary... */
1748 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL,
1749 &cbFileImageSize );
1750 if ( VOS_STATUS_E_NOMEM != vosStatus )
1751 {
1752 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1753 "Error obtaining binary size" );
1754 goto fail;
1755 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001756 // malloc a buffer to read in the Configuration binary file.
1757 pFileImage = vos_mem_malloc( cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001758 if ( NULL == pFileImage )
1759 {
1760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1761 "Unable to allocate memory for the CFG binary [size= %d bytes]",
1762 cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001763 vosStatus = VOS_STATUS_E_NOMEM;
1764 goto fail;
1765 }
1766
1767 /* Get the entire CFG file image... */
1768 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage,
1769 &cbFileImageSize );
1770 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1771 {
1772 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1773 "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]",
1774 cbFileImageSize );
1775 goto fail;
1776 }
1777
1778 /*
1779 * Validate the binary image. This function will return a pointer
1780 * and length where the CFG binary is located within the binary image file.
1781 */
1782 bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize,
1783 &pCfgBinary, &cbCfgBinarySize );
1784 if ( VOS_FALSE == bStatus )
1785 {
1786 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1787 "Error: Cannot find STA CFG in binary image file" );
1788 vosStatus = VOS_STATUS_E_FAILURE;
1789 goto fail;
1790 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001791 /*
1792 * TODO: call the config download function
1793 * for now calling the existing cfg download API
1794 */
1795 processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 if( pFileImage != NULL )
1797 {
1798 vos_mem_free( pFileImage );
1799 }
1800 return vosStatus;
1801
1802fail:
1803 if(pCfgBinary != NULL)
1804 vos_mem_free( pFileImage );
1805
1806 return vosStatus;
1807}
Jeff Johnson295189b2012-06-20 16:38:30 -07001808/* -----------------------------------------------------------------
1809 * WDI interface
1810 * -----------------------------------------------------------------
1811 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001812/*
1813 * FUNCTION: WDA_suspendDataTxCallback
1814 * call back function called from TL after suspend Transmission
1815 */
1816VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx,
1817 v_U8_t* ucSTAId,
1818 VOS_STATUS vosStatus)
1819{
1820 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1822 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 if (NULL == pWDA )
1824 {
1825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1826 "%s: Invoked with invalid WDA context ", __FUNCTION__ );
1827 VOS_ASSERT(0);
1828 return VOS_STATUS_E_FAILURE;
1829 }
1830 if(VOS_IS_STATUS_SUCCESS(vosStatus))
1831 {
1832 pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS;
1833 }
1834 else
1835 {
1836 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1837 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001838 /* Trigger the event to bring the WDA TL suspend function to come
1839 * out of wait*/
1840 vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
1841 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1842 {
1843 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1844 "NEW VOS Event Set failed - status = %d \n", vosStatus);
1845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001846 /* If TL suspended had timedout before this callback was called, resume back
1847 * TL.*/
1848 if (pWDA->txSuspendTimedOut)
1849 {
1850 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1851 "Late TLSuspendCallback, resuming TL back again\n");
1852 WDA_ResumeDataTx(pWDA);
1853 pWDA->txSuspendTimedOut = FALSE;
1854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001855 return VOS_STATUS_SUCCESS;
1856}
Jeff Johnson295189b2012-06-20 16:38:30 -07001857/*
1858 * FUNCTION: WDA_suspendDataTx
1859 * Update TL to suspend the data Transmission
1860 */
1861VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA)
1862{
1863 VOS_STATUS status = VOS_STATUS_E_FAILURE;
1864 tANI_U8 eventIdx = 0;
1865 tANI_U8 ucSTAId = 0;
1866
1867 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1868 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001869 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001870 if (pWDA->txSuspendTimedOut)
1871 {
1872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1873 "TL suspend timedout previously, CB not called yet\n");
1874 return status;
1875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001876 /* Reset the event to be not signalled */
1877 status = vos_event_reset(&pWDA->suspendDataTxEvent);
1878 if(!VOS_IS_STATUS_SUCCESS(status))
1879 {
1880 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1881 "VOS Event reset failed - status = %d\n",status);
1882 return VOS_STATUS_E_FAILURE;
1883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001884 /*Indicate TL to suspend transmission for all Sta Id */
1885 ucSTAId = WLAN_ALL_STA;
1886 status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
1887 WDA_SuspendDataTxCallback);
1888 if(status != VOS_STATUS_SUCCESS)
1889 {
1890 return status;
1891 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001892 /* Wait for the event to be set by the TL, to get the response of
1893 * suspending the TX queues, this event should be set by the Callback
1894 * function called by TL*/
1895 status = vos_wait_events(&pWDA->suspendDataTxEvent, 1,
1896 WDA_TL_SUSPEND_TIMEOUT, &eventIdx);
1897 if(!VOS_IS_STATUS_SUCCESS(status))
1898 {
1899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1900 "%s: Status %d when waiting for Suspend Data TX Event",
1901 __FUNCTION__, status);
1902 /* Set this flag to true when TL suspend times out, so that when TL
1903 * suspend eventually happens and calls the callback, TL can be resumed
1904 * right away by looking at this flag when true.*/
1905 pWDA->txSuspendTimedOut = TRUE;
1906 }
1907 else
1908 {
1909 pWDA->txSuspendTimedOut = FALSE;
1910 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001911 if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
1912 {
1913 status = VOS_STATUS_SUCCESS;
1914 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001915 return status;
1916}
Jeff Johnson295189b2012-06-20 16:38:30 -07001917/*
1918 * FUNCTION: WDA_resumeDataTx
1919 * Update TL to resume the data Transmission
1920 */
1921VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA)
1922{
1923 VOS_STATUS status = VOS_STATUS_SUCCESS;
1924 tANI_U8 ucSTAId = 0;
1925
1926 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1927 "%s: Entered " ,__FUNCTION__);
1928 ucSTAId = WLAN_ALL_STA;
1929 status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
1930 return status;
1931}
Jeff Johnson295189b2012-06-20 16:38:30 -07001932/*
1933 * FUNCTION: WDA_InitScanReqCallback
1934 * Trigger Init SCAN callback
1935 */
1936void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData)
1937{
1938 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
1939 tWDA_CbContext *pWDA;
1940 tInitScanParams *pWDA_ScanParam ;
1941 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001942 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1943 "<------ %s " ,__FUNCTION__);
1944 if(NULL == pWdaParams)
1945 {
1946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1947 "%s: pWdaParams received NULL", __FUNCTION__);
1948 VOS_ASSERT(0) ;
1949 return ;
1950 }
1951 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
1952 pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07001953 if(NULL == pWDA_ScanParam)
1954 {
1955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1956 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07001957 VOS_ASSERT(0);
1958 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
1959 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001960 return ;
1961 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001962 if(WDI_STATUS_SUCCESS != wdiStatus)
1963 {
1964 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 if(VOS_STATUS_SUCCESS != status)
1966 {
1967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1968 "%s error in Resume Tx ", __FUNCTION__ );
1969 }
1970 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001971 /* free WDI command buffer */
1972 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07001974
Jeff Johnson295189b2012-06-20 16:38:30 -07001975
1976 /* assign status to scan params */
1977 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001978 /* send SCAN RSP message back to PE */
1979 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001980 return ;
1981}
1982
1983/*
1984 * FUNCTION: WDA_ProcessInitScanReq
1985 * Trigger Init SCAN in DAL
1986 */
1987VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA,
1988 tInitScanParams *initScanParams)
1989{
1990 WDI_Status status = WDI_STATUS_SUCCESS ;
1991 WDI_InitScanReqParamsType *wdiInitScanParam =
1992 (WDI_InitScanReqParamsType *)vos_mem_malloc(
1993 sizeof(WDI_InitScanReqParamsType)) ;
1994 tWDA_ReqParams *pWdaParams;
1995 tANI_U8 i = 0;
1996
1997 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1998 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001999 if(NULL == wdiInitScanParam)
2000 {
2001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2002 "%s:VOS MEM Alloc Failure", __FUNCTION__);
2003 VOS_ASSERT(0);
2004 return VOS_STATUS_E_NOMEM;
2005 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002006 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2007 if(NULL == pWdaParams)
2008 {
2009 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2010 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2011 VOS_ASSERT(0);
2012 vos_mem_free(wdiInitScanParam);
2013 return VOS_STATUS_E_NOMEM;
2014 }
2015
2016 /* Copy init Scan params to WDI structure */
2017 wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ;
2018 vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid,
2019 sizeof(tSirMacAddr)) ;
2020 wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ;
2021 wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ;
2022 wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ;
2023#ifdef WLAN_FEATURE_P2P
2024 wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA;
2025 wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration;
2026#else
2027 wdiInitScanParam->wdiReqInfo.bUseNOA = 0;
2028 wdiInitScanParam->wdiReqInfo.scanDuration = 0;
2029#endif
2030 wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt =
2031 initScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002032 for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
2033 {
2034 wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2035 initScanParams->scanEntry.bssIdx[i] ;
2036 }
2037
2038 /* if Frame length, copy macMgmtHdr or WDI structure */
2039 if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength)
2040 {
2041 vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr,
2042 &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ;
2043 }
2044 wdiInitScanParam->wdiReqStatusCB = NULL ;
2045
Jeff Johnson295189b2012-06-20 16:38:30 -07002046 /* Store Init Req pointer, as this will be used for response */
2047 pWdaParams->pWdaContext = pWDA;
2048 pWdaParams->wdaMsgParam = initScanParams;
2049 pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 /* first try to suspend TX */
2051 status = WDA_SuspendDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002052 if(WDI_STATUS_SUCCESS != status)
2053 {
2054 goto handleWdiFailure;
2055 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002056 /* call DAL API to pass init scan request to DAL */
2057 status = WDI_InitScanReq(wdiInitScanParam,
2058 WDA_InitScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002059 if(IS_WDI_STATUS_FAILURE(status))
2060 {
2061 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2062 "error in WDA Init Scan, Resume Tx " );
2063 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002064 VOS_ASSERT(0) ;
2065
2066 goto handleWdiFailure;
2067 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002068 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002069handleWdiFailure:
2070 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2071 "Failure in WDI Api, free all the memory " );
2072 /* free WDI command buffer */
2073 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2074 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002075 /* send Failure to PE */
2076 initScanParams->status = eSIR_FAILURE ;
2077 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 return CONVERT_WDI2VOS_STATUS(status) ;
2079}
2080
Jeff Johnson295189b2012-06-20 16:38:30 -07002081/*
2082 * FUNCTION: WDA_StartScanReqCallback
2083 * send Start SCAN RSP back to PE
2084 */
2085void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp,
2086 void* pUserData)
2087{
2088 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2089 tWDA_CbContext *pWDA;
2090 tStartScanParams *pWDA_ScanParam;
2091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2092 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 if(NULL == pWdaParams)
2094 {
2095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2096 "%s: pWdaParams received NULL", __FUNCTION__);
2097 VOS_ASSERT(0) ;
2098 return ;
2099 }
2100 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2101 pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 if(NULL == pWDA_ScanParam)
2103 {
2104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2105 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2106 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002107 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 return ;
2109 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002110 if(NULL == pWdaParams->wdaWdiApiMsgParam)
2111 {
2112 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2113 "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
2114 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002115 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002116 return ;
2117 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2119 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002120
Jeff Johnson295189b2012-06-20 16:38:30 -07002121
2122 /* assign status to scan params */
2123 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002124 /* send SCAN RSP message back to PE */
2125 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002126 return ;
2127}
2128
Jeff Johnson295189b2012-06-20 16:38:30 -07002129/*
2130 * FUNCTION: WDA_ProcessStartScanReq
2131 * Trigger start SCAN in WDI
2132 */
2133VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA,
2134 tStartScanParams *startScanParams)
2135{
2136 WDI_Status status = WDI_STATUS_SUCCESS;
2137 WDI_StartScanReqParamsType *wdiStartScanParams =
2138 (WDI_StartScanReqParamsType *)vos_mem_malloc(
2139 sizeof(WDI_StartScanReqParamsType)) ;
2140 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2142 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002143 if(NULL == wdiStartScanParams)
2144 {
2145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2146 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2147 VOS_ASSERT(0);
2148 return VOS_STATUS_E_NOMEM;
2149 }
2150 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2151 if(NULL == pWdaParams)
2152 {
2153 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2154 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2155 VOS_ASSERT(0);
2156 vos_mem_free(wdiStartScanParams);
2157 return VOS_STATUS_E_NOMEM;
2158 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002159 /* Copy init Scan params to WDI structure */
2160 wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
2161 wdiStartScanParams->wdiReqStatusCB = NULL ;
2162
Jeff Johnson295189b2012-06-20 16:38:30 -07002163 /* Store Init Req pointer, as this will be used for response */
2164 /* store Params pass it to WDI */
2165 pWdaParams->pWdaContext = pWDA;
2166 pWdaParams->wdaMsgParam = startScanParams;
2167 pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002168 /* call DAL API to pass init scan request to DAL */
2169 status = WDI_StartScanReq(wdiStartScanParams,
2170 WDA_StartScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002171 /* failure returned by WDI API */
2172 if(IS_WDI_STATUS_FAILURE(status))
2173 {
2174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2175 "Failure in Start Scan WDI API, free all the memory "
2176 "It should be due to previous abort scan." );
2177 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2178 vos_mem_free(pWdaParams) ;
2179 startScanParams->status = eSIR_FAILURE ;
2180 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
2181 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002182 return CONVERT_WDI2VOS_STATUS(status) ;
2183}
Jeff Johnson295189b2012-06-20 16:38:30 -07002184/*
2185 * FUNCTION: WDA_EndScanReqCallback
2186 * END SCAN callback
2187 */
2188void WDA_EndScanReqCallback(WDI_Status status, void* pUserData)
2189{
2190 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2191 tWDA_CbContext *pWDA;
2192 tEndScanParams *endScanParam;
2193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2194 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002195 if(NULL == pWdaParams)
2196 {
2197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2198 "%s: pWdaParams received NULL", __FUNCTION__);
2199 VOS_ASSERT(0) ;
2200 return ;
2201 }
2202 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2203 endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002204 if(NULL == endScanParam)
2205 {
2206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2207 "%s: endScanParam received NULL", __FUNCTION__);
2208 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002209 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2210 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 return ;
2212 }
2213
2214 /* Free WDI command buffer */
2215 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2216 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002217 /* assign status to scan params */
2218 endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002219 /* send response back to PE */
2220 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
2221 return ;
2222}
2223
Jeff Johnson295189b2012-06-20 16:38:30 -07002224/*
2225 * FUNCTION: WDA_ProcessEndScanReq
2226 * Trigger END SCAN in WDI
2227 */
2228VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA,
2229 tEndScanParams *endScanParams)
2230{
2231 WDI_Status status = WDI_STATUS_SUCCESS;
2232 WDI_EndScanReqParamsType *wdiEndScanParams =
2233 (WDI_EndScanReqParamsType *)vos_mem_malloc(
2234 sizeof(WDI_EndScanReqParamsType)) ;
2235 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2237 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002238 if(NULL == wdiEndScanParams)
2239 {
2240 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2241 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2242 VOS_ASSERT(0);
2243 return VOS_STATUS_E_NOMEM;
2244 }
2245 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2246 if(NULL == pWdaParams)
2247 {
2248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2249 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2250 VOS_ASSERT(0);
2251 vos_mem_free(wdiEndScanParams);
2252 return VOS_STATUS_E_NOMEM;
2253 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002254 /* Copy init Scan params to WDI structure */
2255 wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
2256 wdiEndScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002257 /* Store Init Req pointer, as this will be used for response */
2258 /* store Params pass it to WDI */
2259 pWdaParams->pWdaContext = pWDA;
2260 pWdaParams->wdaMsgParam = endScanParams;
2261 pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002262 /* call DAL API to pass init scan request to DAL */
2263 status = WDI_EndScanReq(wdiEndScanParams,
2264 WDA_EndScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002265 if(IS_WDI_STATUS_FAILURE(status))
2266 {
2267 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2268 "Failure in End Scan WDI API, free all the memory "
2269 "It should be due to previous abort scan." );
2270 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2271 vos_mem_free(pWdaParams) ;
2272 endScanParams->status = eSIR_FAILURE ;
2273 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
2274 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002275 return CONVERT_WDI2VOS_STATUS(status) ;
2276}
Jeff Johnson295189b2012-06-20 16:38:30 -07002277/*
2278 * FUNCTION: WDA_FinishScanReqCallback
2279 * Trigger Finish SCAN callback
2280 */
2281void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2282{
2283 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2284 tWDA_CbContext *pWDA;
2285 tFinishScanParams *finishScanParam;
2286 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07002287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2288 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 if(NULL == pWdaParams)
2290 {
2291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2292 "%s: pWdaParams received NULL", __FUNCTION__);
2293 VOS_ASSERT(0) ;
2294 return ;
2295 }
2296
2297 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2298 finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 if(NULL == finishScanParam)
2300 {
2301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2302 "%s: finishScanParam is NULL", __FUNCTION__);
2303 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002304 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2305 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002306 return ;
2307 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002308 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2309 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002310 /*
2311 * Now Resume TX, if we reached here means, TX is already suspended, we
2312 * have to resume it unconditionaly
2313 */
2314 status = WDA_ResumeDataTx(pWDA) ;
2315
2316 if(VOS_STATUS_SUCCESS != status)
2317 {
2318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2319 "%s error in Resume Tx ", __FUNCTION__ );
2320 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002322 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
2323 return ;
2324}
Jeff Johnson295189b2012-06-20 16:38:30 -07002325/*
2326 * FUNCTION: WDA_ProcessFinshScanReq
2327 * Trigger Finish SCAN in WDI
2328 */
2329VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA,
2330 tFinishScanParams *finishScanParams)
2331{
2332 WDI_Status status = WDI_STATUS_SUCCESS;
2333 WDI_FinishScanReqParamsType *wdiFinishScanParams =
2334 (WDI_FinishScanReqParamsType *)vos_mem_malloc(
2335 sizeof(WDI_FinishScanReqParamsType)) ;
2336 tWDA_ReqParams *pWdaParams ;
2337 tANI_U8 i = 0;
2338 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2339 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002340 if(NULL == wdiFinishScanParams)
2341 {
2342 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2343 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2344 VOS_ASSERT(0);
2345 return VOS_STATUS_E_NOMEM;
2346 }
2347 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2348 if(NULL == pWdaParams)
2349 {
2350 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2351 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2352 VOS_ASSERT(0);
2353 vos_mem_free(wdiFinishScanParams);
2354 return VOS_STATUS_E_NOMEM;
2355 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 /* Copy init Scan params to WDI structure */
2357 wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
2358 vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID,
2359 finishScanParams->bssid, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002360 wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
2361 wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
2362 wdiFinishScanParams->wdiReqInfo.ucFrameLength =
2363 finishScanParams->frameLength ;
2364 wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel =
2365 finishScanParams->currentOperChannel ;
2366 wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
2367 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt =
2368 finishScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002369 for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
2370 {
2371 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2372 finishScanParams->scanEntry.bssIdx[i] ;
2373 }
2374
2375
Jeff Johnson295189b2012-06-20 16:38:30 -07002376 /* if Frame length, copy macMgmtHdr ro WDI structure */
2377 if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
2378 {
2379 vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr,
2380 &finishScanParams->macMgmtHdr,
2381 sizeof(WDI_MacMgmtHdr)) ;
2382 }
2383 wdiFinishScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002384 /* Store Init Req pointer, as this will be used for response */
2385 /* store Params pass it to WDI */
2386 pWdaParams->pWdaContext = pWDA;
2387 pWdaParams->wdaMsgParam = finishScanParams;
2388 pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002389 /* call DAL API to pass init scan request to DAL */
2390 status = WDI_FinishScanReq(wdiFinishScanParams,
2391 WDA_FinishScanReqCallback, pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002392
Jeff Johnson295189b2012-06-20 16:38:30 -07002393
2394 /*
2395 * WDI API returns failure..
2396 */
2397 if(IS_WDI_STATUS_FAILURE( status))
2398 {
2399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2400 "Failure in Finish Scan WDI API, free all the memory " );
2401 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2402 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002403 finishScanParams->status = eSIR_FAILURE ;
2404 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
2405 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002406 return CONVERT_WDI2VOS_STATUS(status) ;
2407}
Jeff Johnson295189b2012-06-20 16:38:30 -07002408/*---------------------------------------------------------------------
2409 * ASSOC API's
2410 *---------------------------------------------------------------------
2411 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002412/*
2413 * FUNCTION: WDA_JoinReqCallback
2414 * Trigger Init SCAN callback
2415 */
2416void WDA_JoinReqCallback(WDI_Status status, void* pUserData)
2417{
2418 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2419 tWDA_CbContext *pWDA;
2420 tSwitchChannelParams *joinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002421 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2422 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002423 if(NULL == pWdaParams)
2424 {
2425 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2426 "%s: pWdaParams received NULL", __FUNCTION__);
2427 VOS_ASSERT(0) ;
2428 return ;
2429 }
2430 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2431 joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002432 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2433 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 /* reset macBSSID */
2435 vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002436 /* reset macSTASelf */
2437 vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002438 joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002439 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002440 return ;
2441}
Jeff Johnson295189b2012-06-20 16:38:30 -07002442/*
2443 * FUNCTION: WDA_ProcessJoinReq
2444 * Trigger Join REQ in WDI
2445 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002446VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA,
2447 tSwitchChannelParams* joinReqParam)
2448{
2449 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002450 WDI_JoinReqParamsType *wdiJoinReqParam =
2451 (WDI_JoinReqParamsType *)vos_mem_malloc(
2452 sizeof(WDI_JoinReqParamsType)) ;
2453 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2455 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002456 if(NULL == wdiJoinReqParam)
2457 {
2458 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2459 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2460 VOS_ASSERT(0);
2461 return VOS_STATUS_E_NOMEM;
2462 }
2463 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2464 if(NULL == pWdaParams)
2465 {
2466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2467 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2468 VOS_ASSERT(0);
2469 vos_mem_free(wdiJoinReqParam);
2470 return VOS_STATUS_E_NOMEM;
2471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002472 /* copy the BSSID for pWDA */
2473 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID,
2474 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf,
2476 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002477 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel =
2478 joinReqParam->channelNumber ;
2479#ifndef WLAN_FEATURE_VOWIFI
2480 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint =
2481 joinReqParam->localPowerConstraint ;
2482#endif
2483 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset =
2484 joinReqParam->secondaryChannelOffset ;
2485 wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
2486
2487 wdiJoinReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002488 /* Store Init Req pointer, as this will be used for response */
2489 /* store Params pass it to WDI */
2490 pWdaParams->pWdaContext = pWDA;
2491 pWdaParams->wdaMsgParam = joinReqParam;
2492 pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002493 status = WDI_JoinReq(wdiJoinReqParam,
2494 (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002495 if(IS_WDI_STATUS_FAILURE(status))
2496 {
2497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2498 "Failure in Join WDI API, free all the memory " );
2499 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2500 vos_mem_free(pWdaParams) ;
2501 joinReqParam->status = eSIR_FAILURE ;
2502 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2503 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002504 return CONVERT_WDI2VOS_STATUS(status) ;
2505}
Jeff Johnson295189b2012-06-20 16:38:30 -07002506/*
2507 * FUNCTION: WDA_SwitchChannelReqCallback
2508 * send Switch channel RSP back to PE
2509 */
2510void WDA_SwitchChannelReqCallback(
2511 WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData)
2512{
2513 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
2514 tWDA_CbContext *pWDA;
2515 tSwitchChannelParams *pSwitchChanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2517 "<------ %s " ,__FUNCTION__);
2518 if(NULL == pWdaParams)
2519 {
2520 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2521 "%s: pWdaParams received NULL", __FUNCTION__);
2522 VOS_ASSERT(0) ;
2523 return ;
2524 }
2525 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2526 pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2527
2528#ifdef WLAN_FEATURE_VOWIFI
2529 pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower;
2530#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002531 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2532 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002533 pSwitchChanParams->status =
2534 CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002535 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 return ;
2537}
Jeff Johnson295189b2012-06-20 16:38:30 -07002538/*
2539 * FUNCTION: WDA_ProcessChannelSwitchReq
2540 * Request to WDI to switch channel REQ params.
2541 */
2542VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA,
2543 tSwitchChannelParams *pSwitchChanParams)
2544{
2545 WDI_Status status = WDI_STATUS_SUCCESS ;
2546 WDI_SwitchChReqParamsType *wdiSwitchChanParam =
2547 (WDI_SwitchChReqParamsType *)vos_mem_malloc(
2548 sizeof(WDI_SwitchChReqParamsType)) ;
2549 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2551 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002552 if(NULL == wdiSwitchChanParam)
2553 {
2554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2555 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2556 VOS_ASSERT(0);
2557 return VOS_STATUS_E_NOMEM;
2558 }
2559 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2560 if(NULL == pWdaParams)
2561 {
2562 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2563 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2564 VOS_ASSERT(0);
2565 vos_mem_free(wdiSwitchChanParam);
2566 return VOS_STATUS_E_NOMEM;
2567 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002568 wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
2569#ifndef WLAN_FEATURE_VOWIFI
2570 wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint =
2571 pSwitchChanParams->localPowerConstraint;
2572#endif
2573 wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset =
2574 pSwitchChanParams->secondaryChannelOffset;
2575 wdiSwitchChanParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002576 /* Store req pointer, as this will be used for response */
2577 /* store Params pass it to WDI */
2578 pWdaParams->pWdaContext = pWDA;
2579 pWdaParams->wdaMsgParam = pSwitchChanParams;
2580 pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002581#ifdef WLAN_FEATURE_VOWIFI
2582 wdiSwitchChanParam->wdiChInfo.cMaxTxPower
2583 = pSwitchChanParams->maxTxPower;
2584 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr,
2585 pSwitchChanParams ->selfStaMacAddr,
2586 sizeof(tSirMacAddr));
2587#endif
2588 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId,
2589 pSwitchChanParams->bssId,
2590 sizeof(tSirMacAddr));
2591
2592 status = WDI_SwitchChReq(wdiSwitchChanParam,
2593 (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002594 if(IS_WDI_STATUS_FAILURE(status))
2595 {
2596 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2597 "Failure in process channel switch Req WDI API, free all the memory " );
2598 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2599 vos_mem_free(pWdaParams) ;
2600 pSwitchChanParams->status = eSIR_FAILURE ;
2601 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
2602 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002603 return CONVERT_WDI2VOS_STATUS(status) ;
2604}
Jeff Johnson295189b2012-06-20 16:38:30 -07002605/*
2606 * FUNCTION: WDA_ConfigBssReqCallback
2607 * config BSS Req Callback, called by WDI
2608 */
2609void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp
2610 ,void* pUserData)
2611{
2612 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2613 tWDA_CbContext *pWDA;
2614 tAddBssParams *configBssReqParam;
2615 tAddStaParams *staConfigBssParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2617 "<------ %s " ,__FUNCTION__);
2618 if(NULL == pWdaParams)
2619 {
2620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2621 "%s: pWdaParams received NULL", __FUNCTION__);
2622 VOS_ASSERT(0) ;
2623 return ;
2624 }
2625 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2626 configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
2627 staConfigBssParam = &configBssReqParam->staContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002628 configBssReqParam->status =
2629 CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07002630 if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
2631 {
2632 vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID,
2633 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002634 configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2635 configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
2636 configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
2637
2638 if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA)
2639 {
2640 if(configBssReqParam->bssType == eSIR_IBSS_MODE)
2641 {
2642 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE;
2643 staConfigBssParam->staType = STA_ENTRY_BSSID;
2644 }
2645 else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) &&
2646 (staConfigBssParam->staType == STA_ENTRY_SELF))
2647 {
2648 /* This is the 1st add BSS Req for the BTAMP STA */
2649 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2650 staConfigBssParam->staType = STA_ENTRY_BSSID;
2651 }
2652 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2653 (staConfigBssParam->staType == STA_ENTRY_PEER))
2654 {
2655 /* This is the 2nd ADD BSS Request that is sent
2656 * on the BTAMP STA side. The Sta type is
2657 * set to STA_ENTRY_PEER here.*/
2658 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2659 }
2660 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2661 (staConfigBssParam->staType == STA_ENTRY_SELF))
2662 {
2663 /* statype is already set by PE.
2664 * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/
2665 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE;
2666 staConfigBssParam->staType = STA_ENTRY_BSSID;
2667 }
2668 else
2669 {
2670 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE;
2671 staConfigBssParam->staType = STA_ENTRY_PEER;
2672 }
2673 }
2674 else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP)
2675 {
2676 pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE;
2677 staConfigBssParam->staType = STA_ENTRY_SELF;
2678 }
2679 else
2680 {
2681 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2682 "Invalid operation mode specified");
2683 VOS_ASSERT(0);
2684 }
2685
2686 staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002687 staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002688 staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002689 staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002690 vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
2691 sizeof(tSirMacAddr));
2692 staConfigBssParam->txChannelWidthSet =
2693 configBssReqParam->txChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 if(staConfigBssParam->staType == STA_ENTRY_PEER &&
2695 staConfigBssParam->htCapable)
2696 {
2697 pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx =
2698 wdiConfigBssRsp->ucBSSIdx;
2699 pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex =
2700 WDA_VALID_STA_INDEX ;
2701 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002702 if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
2703 wdiConfigBssRsp->ucBSSIdx,
2704 wdiConfigBssRsp->ucSTAIdx))
2705 {
2706 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2707 "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
2708 VOS_ASSERT(0) ;
2709 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
2711 {
2712 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2713 "%s: add BSS into mempool fail", __FUNCTION__);
2714 VOS_ASSERT(0) ;
2715 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002716#ifdef WLAN_FEATURE_VOWIFI
2717 configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
2718#endif
2719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002720 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2721 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002722 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002723 return ;
2724}
Jeff Johnson295189b2012-06-20 16:38:30 -07002725/*
2726 * FUNCTION: WDA_UpdateEdcaParamsForAC
2727 * Update WDI EDCA params with PE edca params
2728 */
2729void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA,
2730 WDI_EdcaParamRecord *wdiEdcaParam,
2731 tSirMacEdcaParamRecord *macEdcaParam)
2732{
2733 wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn;
2734 wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm;
2735 wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci;
2736 wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min;
2737 wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
2738 wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
2739}
Jeff Johnson295189b2012-06-20 16:38:30 -07002740/*
2741 * FUNCTION: WDA_ProcessConfigBssReq
2742 * Configure BSS before starting Assoc with AP
2743 */
2744VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA,
2745 tAddBssParams* configBssReqParam)
2746{
2747 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002748 WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
2749 (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
2750 sizeof(WDI_ConfigBSSReqParamsType)) ;
2751 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2753 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002754 if(NULL == wdiConfigBssReqParam)
2755 {
2756 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2757 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2758 VOS_ASSERT(0);
2759 return VOS_STATUS_E_NOMEM;
2760 }
2761 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2762 if(NULL == pWdaParams)
2763 {
2764 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2765 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2766 VOS_ASSERT(0);
2767 vos_mem_free(wdiConfigBssReqParam);
2768 return VOS_STATUS_E_NOMEM;
2769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002771 WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo,
2772 configBssReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002773 /* Store Init Req pointer, as this will be used for response */
2774 /* store Params pass it to WDI */
2775 pWdaParams->pWdaContext = pWDA;
2776 pWdaParams->wdaMsgParam = configBssReqParam;
2777 pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 status = WDI_ConfigBSSReq(wdiConfigBssReqParam,
2779 (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 if(IS_WDI_STATUS_FAILURE(status))
2781 {
2782 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2783 "Failure in Config BSS WDI API, free all the memory " );
2784 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2785 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 configBssReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002787 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
2788 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002789 return CONVERT_WDI2VOS_STATUS(status) ;
2790}
Jeff Johnson295189b2012-06-20 16:38:30 -07002791#ifdef ENABLE_HAL_COMBINED_MESSAGES
2792/*
2793 * FUNCTION: WDA_PostAssocReqCallback
2794 * Post ASSOC req callback, send RSP back to PE
2795 */
2796void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp,
2797 void* pUserData)
2798{
2799 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
2800 tPostAssocParams *postAssocReqParam =
2801 (tPostAssocParams *)pWDA->wdaMsgParam ;
2802 /*STA context within the BSS Params*/
2803 tAddStaParams *staPostAssocParam =
2804 &postAssocReqParam->addBssParams.staContext ;
2805 /*STA Params for self STA*/
2806 tAddStaParams *selfStaPostAssocParam =
2807 &postAssocReqParam->addStaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2809 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002810 postAssocReqParam->status =
2811 CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002812 if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
2813 {
2814 staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
2815 vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA,
2816 sizeof(tSirMacAddr)) ;
2817 staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
2818 staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
2819 staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
2821 }
2822 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2823 pWDA->wdaWdiApiMsgParam = NULL;
2824 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002825 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002826 return ;
2827}
Jeff Johnson295189b2012-06-20 16:38:30 -07002828/*
2829 * FUNCTION: WDA_ProcessPostAssocReq
2830 * Trigger POST ASSOC processing in WDI
2831 */
2832VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA,
2833 tPostAssocParams *postAssocReqParam)
2834{
Jeff Johnson295189b2012-06-20 16:38:30 -07002835 WDI_Status status = WDI_STATUS_SUCCESS ;
2836
2837 WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
2838 (WDI_PostAssocReqParamsType *)vos_mem_malloc(
2839 sizeof(WDI_PostAssocReqParamsType)) ;
2840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2841 "------> %s " ,__FUNCTION__);
2842
Jeff Johnson295189b2012-06-20 16:38:30 -07002843 if(NULL == wdiPostAssocReqParam)
2844 {
2845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2846 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2847 VOS_ASSERT(0);
2848 return VOS_STATUS_E_NOMEM;
2849 }
2850
2851 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
2852 {
2853 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2854 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
2855 VOS_ASSERT(0);
2856 return VOS_STATUS_E_FAILURE;
2857 }
2858
Jeff Johnson295189b2012-06-20 16:38:30 -07002859 /* update BSS params into WDI structure */
2860 WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams,
2861 &postAssocReqParam->addBssParams) ;
2862 /* update STA params into WDI structure */
2863 WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams,
2864 &postAssocReqParam->addStaParams) ;
2865
2866 wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid =
2867 postAssocReqParam->addBssParams.highPerformance;
2868 WDA_UpdateEdcaParamsForAC(pWDA,
2869 &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams,
2870 &postAssocReqParam->addBssParams.acbe);
2871 WDA_UpdateEdcaParamsForAC(pWDA,
2872 &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams,
2873 &postAssocReqParam->addBssParams.acbk);
2874 WDA_UpdateEdcaParamsForAC(pWDA,
2875 &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams,
2876 &postAssocReqParam->addBssParams.acvi);
2877 WDA_UpdateEdcaParamsForAC(pWDA,
2878 &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
2879 &postAssocReqParam->addBssParams.acvo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002880 /* Store Init Req pointer, as this will be used for response */
2881 pWDA->wdaMsgParam = (void *)postAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002882 /* store Params pass it to WDI */
2883 pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002884 status = WDI_PostAssocReq(wdiPostAssocReqParam,
2885 (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002886 if(IS_WDI_STATUS_FAILURE(status))
2887 {
2888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2889 "Failure in Post Assoc WDI API, free all the memory " );
2890 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2891 pWDA->wdaWdiApiMsgParam = NULL;
2892 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002893 postAssocReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002894 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
2895 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002896 return CONVERT_WDI2VOS_STATUS(status) ;
2897}
2898#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002899/*
2900 * FUNCTION: WDA_AddStaReqCallback
2901 * ADD STA req callback, send RSP back to PE
2902 */
2903void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp,
2904 void* pUserData)
2905{
2906 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2907 tWDA_CbContext *pWDA;
2908 tAddStaParams *addStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2910 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002911 if(NULL == pWdaParams)
2912 {
2913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
2914 VOS_ASSERT(0) ;
2915 return ;
2916 }
2917 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2918 addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002919 addStaReqParam->status =
2920 CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002921 if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
2922 {
2923 addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
2924 /*TODO: UMAC structure doesn't have these fields*/
2925 /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex;
2926 addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex;
2927 addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */
2928 addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig;
2929 addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig;
2930 /* update staIndex as valid index for BA if STA is HT capable*/
2931 if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable)
2932 {
2933 pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx =
2934 wdiConfigStaRsp->ucBssIdx;
2935 pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex =
2936 WDA_VALID_STA_INDEX ;
2937 }
2938 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx))
2939 {
2940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2941 "%s: add STA into mempool fail", __FUNCTION__);
2942 VOS_ASSERT(0) ;
2943 return ;
2944 }
2945 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002946 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2947 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002948 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002949 return ;
2950}
Jeff Johnson295189b2012-06-20 16:38:30 -07002951/*
2952 * FUNCTION: WDA_ConfigStaReq
2953 * Trigger Config STA processing in WDI
2954 */
2955VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA,
2956 tAddStaParams *addStaReqParam)
2957{
Jeff Johnson295189b2012-06-20 16:38:30 -07002958 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002959 WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
2960 (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
2961 sizeof(WDI_ConfigSTAReqParamsType)) ;
2962 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002963 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2964 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002965 if(NULL == wdiConfigStaReqParam)
2966 {
2967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2968 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2969 VOS_ASSERT(0);
2970 return VOS_STATUS_E_NOMEM;
2971 }
2972 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2973 if(NULL == pWdaParams)
2974 {
2975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2976 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2977 VOS_ASSERT(0);
2978 vos_mem_free(wdiConfigStaReqParam);
2979 return VOS_STATUS_E_NOMEM;
2980 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002981 vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002982 /* update STA params into WDI structure */
2983 WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo,
2984 addStaReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002985 /* Store Init Req pointer, as this will be used for response */
2986 /* store Params pass it to WDI */
2987 pWdaParams->pWdaContext = pWDA;
2988 pWdaParams->wdaMsgParam = addStaReqParam;
2989 pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002990 status = WDI_ConfigSTAReq(wdiConfigStaReqParam,
2991 (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002992 if(IS_WDI_STATUS_FAILURE(status))
2993 {
2994 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2995 "Failure in Config STA WDI API, free all the memory " );
2996 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2997 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002998 addStaReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002999 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3000 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003001 return CONVERT_WDI2VOS_STATUS(status) ;
3002}
Jeff Johnson295189b2012-06-20 16:38:30 -07003003/*
3004 * FUNCTION: WDA_DelBSSReqCallback
3005 * Dens DEL BSS RSP back to PE
3006 */
3007void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp,
3008 void* pUserData)
3009{
3010 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3011 tWDA_CbContext *pWDA;
3012 tDeleteBssParams *delBssReqParam;
3013 tANI_U8 staIdx,tid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3015 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003016 if(NULL == pWdaParams)
3017 {
3018 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3019 "%s: pWdaParams received NULL", __FUNCTION__);
3020 VOS_ASSERT(0) ;
3021 return ;
3022 }
3023 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3024 delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003025 delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003026 if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
3027 {
3028 vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID,
3029 sizeof(tSirMacAddr)) ;
3030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003031 if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
3032 {
3033 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3034 "%s: Get STA index from BSS index Fail", __FUNCTION__);
3035 VOS_ASSERT(0) ;
3036 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003037 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
3038 {
3039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3040 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3041 VOS_ASSERT(0) ;
3042 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003043 if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
3044 {
3045 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3046 "%s: Clear STA index form table Fail", __FUNCTION__);
3047 VOS_ASSERT(0) ;
3048 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003049 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3050 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003051 /* reset the the system role*/
3052 pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
3053
3054 /* Reset the BA related information */
3055 for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++)
3056 {
3057 if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx )
3058 {
3059 pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX;
3060 pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0;
3061 /* Reset framesTxed counters here */
3062 for(tid = 0; tid < STACFG_MAX_TC; tid++)
3063 {
3064 pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0;
3065 }
3066 }
3067 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003068 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003069 return ;
3070}
3071
Jeff Johnson295189b2012-06-20 16:38:30 -07003072/*
3073 * FUNCTION: WDA_ProcessDelBssReq
3074 * Init DEL BSS req with WDI
3075 */
3076VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA,
3077 tDeleteBssParams *delBssParam)
3078{
3079 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003080 WDI_DelBSSReqParamsType *wdiDelBssReqParam =
3081 (WDI_DelBSSReqParamsType *)vos_mem_malloc(
3082 sizeof(WDI_DelBSSReqParamsType)) ;
3083 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003084 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3085 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003086 if(NULL == wdiDelBssReqParam)
3087 {
3088 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3089 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3090 VOS_ASSERT(0);
3091 return VOS_STATUS_E_NOMEM;
3092 }
3093 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3094 if(NULL == pWdaParams)
3095 {
3096 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3097 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3098 VOS_ASSERT(0);
3099 vos_mem_free(wdiDelBssReqParam);
3100 return VOS_STATUS_E_NOMEM;
3101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
3103 wdiDelBssReqParam->wdiReqStatusCB = NULL ;
3104
3105 /* Store Init Req pointer, as this will be used for response */
3106 /* store Params pass it to WDI */
3107 pWdaParams->pWdaContext = pWDA;
3108 pWdaParams->wdaMsgParam = delBssParam;
3109 pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003110 status = WDI_DelBSSReq(wdiDelBssReqParam,
3111 (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003112 if(IS_WDI_STATUS_FAILURE(status))
3113 {
3114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3115 "Failure in Del BSS WDI API, free all the memory " );
3116 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3117 vos_mem_free(pWdaParams) ;
3118 delBssParam->status = eSIR_FAILURE ;
3119 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
3120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003121 return CONVERT_WDI2VOS_STATUS(status) ;
3122}
Jeff Johnson295189b2012-06-20 16:38:30 -07003123/*
3124 * FUNCTION: WDA_DelSTAReqCallback
3125 * Dens DEL STA RSP back to PE
3126 */
3127void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp,
3128 void* pUserData)
3129{
3130 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3131 tWDA_CbContext *pWDA;
3132 tDeleteStaParams *delStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3134 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003135 if(NULL == pWdaParams)
3136 {
3137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3138 "%s: pWdaParams received NULL", __FUNCTION__);
3139 VOS_ASSERT(0) ;
3140 return ;
3141 }
3142 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3143 delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003144 delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003145 if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
3146 {
3147 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
3148 {
3149 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3150 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3151 VOS_ASSERT(0) ;
3152 }
3153 delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ;
3154 }
3155 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3156 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003157 /*Reset the BA information corresponding to this STAIdx */
3158 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex =
3159 WDA_INVALID_STA_INDEX;
3160 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
3161
3162 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003163 return ;
3164}
Jeff Johnson295189b2012-06-20 16:38:30 -07003165/*
3166 * FUNCTION: WDA_ProcessDelStaReq
3167 * Init DEL STA req with WDI
3168 */
3169VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA,
3170 tDeleteStaParams *delStaParam)
3171{
3172 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003173 WDI_DelSTAReqParamsType *wdiDelStaReqParam =
3174 (WDI_DelSTAReqParamsType *)vos_mem_malloc(
3175 sizeof(WDI_DelSTAReqParamsType)) ;
3176 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003177 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3178 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003179 if(NULL == wdiDelStaReqParam)
3180 {
3181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3183 VOS_ASSERT(0);
3184 return VOS_STATUS_E_NOMEM;
3185 }
3186 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3187 if(NULL == pWdaParams)
3188 {
3189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3190 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3191 VOS_ASSERT(0);
3192 vos_mem_free(wdiDelStaReqParam);
3193 return VOS_STATUS_E_NOMEM;
3194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003195 wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
3196 wdiDelStaReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003197 /* Store Init Req pointer, as this will be used for response */
3198 /* store Params pass it to WDI */
3199 pWdaParams->pWdaContext = pWDA;
3200 pWdaParams->wdaMsgParam = delStaParam;
3201 pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003202 status = WDI_DelSTAReq(wdiDelStaReqParam,
3203 (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 if(IS_WDI_STATUS_FAILURE(status))
3205 {
3206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3207 "Failure in Del STA WDI API, free all the memory status = %d",
3208 status );
3209 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3210 vos_mem_free(pWdaParams) ;
3211 delStaParam->status = eSIR_FAILURE ;
3212 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
3213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003214 return CONVERT_WDI2VOS_STATUS(status) ;
3215}
Jeff Johnson295189b2012-06-20 16:38:30 -07003216void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
3217{
3218 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3219 tWDA_CbContext *pWDA;
3220 tAddStaSelfParams *pAddStaSelfRsp = NULL;
3221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3222 "<------ %s " ,__FUNCTION__);
3223 if(NULL == pWdaParams)
3224 {
3225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3226 "%s: pWdaParams received NULL", __FUNCTION__);
3227 VOS_ASSERT(0) ;
3228 return ;
3229 }
3230 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3231 pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3233 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003234 pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
3235 vos_mem_copy(pAddStaSelfRsp->selfMacAddr,
3236 pwdiAddSTASelfRsp->macSelfSta,
3237 sizeof(pAddStaSelfRsp->selfMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003238 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 return ;
3240}
Jeff Johnson295189b2012-06-20 16:38:30 -07003241/*
3242 * FUNCTION: WDA_ProcessAddStaSelfReq
3243 *
3244 */
3245VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq)
3246{
3247 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003248 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq =
3250 (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
3251 sizeof(WDI_AddSTASelfReqParamsType)) ;
3252 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003253 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3254 "------> %s " ,__FUNCTION__);
3255 if( NULL == wdiAddStaSelfReq )
3256 {
3257 VOS_ASSERT( 0 );
3258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3259 "%s: Unable to allocate memory " ,__FUNCTION__);
3260 return( VOS_STATUS_E_NOMEM );
3261 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003263 if( NULL == pWdaParams )
3264 {
3265 VOS_ASSERT( 0 );
3266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3267 "%s: Unable to allocate memory " ,__FUNCTION__);
3268 vos_mem_free(wdiAddStaSelfReq) ;
3269 return( VOS_STATUS_E_NOMEM );
3270 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003271 wdiAddStaSelfReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
3273 /* Store Init Req pointer, as this will be used for response */
3274 /* store Params pass it to WDI */
3275 pWdaParams->pWdaContext = pWDA;
3276 pWdaParams->wdaMsgParam = pAddStaSelfReq;
3277 pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq;
Jeff Johnson43971f52012-07-17 12:26:56 -07003278 wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003279
Jeff Johnson43971f52012-07-17 12:26:56 -07003280 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003281 {
3282 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3283 "Failure in Add Self Sta Request API, free all the memory status = %d",
Jeff Johnson43971f52012-07-17 12:26:56 -07003284 wstatus );
3285 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003286 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3287 vos_mem_free(pWdaParams) ;
3288 pAddStaSelfReq->status = eSIR_FAILURE ;
3289 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
3290 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003291 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003292}
Jeff Johnson295189b2012-06-20 16:38:30 -07003293/*
3294 * FUNCTION: WDA_DelSTASelfRespCallback
3295 *
3296 */
3297void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType *
3298 wdiDelStaSelfRspParams , void* pUserData)
3299{
3300 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3301 tWDA_CbContext *pWDA;
3302 tDelStaSelfParams *delStaSelfParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003303 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3304 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003305 if (NULL == pWdaParams)
3306 {
3307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3308 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3309 VOS_ASSERT(0);
3310 return;
3311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003312 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3313 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003314 delStaSelfParams->status =
3315 CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
3316
3317 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3318 vos_mem_free(pWdaParams) ;
3319
3320 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003321 return ;
3322}
Jeff Johnson295189b2012-06-20 16:38:30 -07003323/*
3324 * FUNCTION: WDA_DelSTASelfReqCallback
3325 *
3326 */
3327void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus,
3328 void* pUserData)
3329{
3330 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3331 tWDA_CbContext *pWDA;
3332 tDelStaSelfParams *delStaSelfParams;
3333
3334 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3335 "<------ %s, wdiStatus: %d pWdaParams: 0x%x",
3336 __FUNCTION__, wdiStatus, pWdaParams);
3337
3338 if (NULL == pWdaParams)
3339 {
3340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3341 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3342 VOS_ASSERT(0);
3343 return;
3344 }
3345
3346 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3347 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3348
3349 delStaSelfParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
3350
3351 if(IS_WDI_STATUS_FAILURE(wdiStatus))
3352 {
3353 VOS_ASSERT(0);
3354 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3355 vos_mem_free(pWdaParams) ;
3356 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3357 }
3358
3359 return ;
3360}
3361
3362/*
3363 * FUNCTION: WDA_DelSTASelfReq
3364 * Trigger Config STA processing in WDI
3365 */
3366VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA,
3367 tDelStaSelfParams* pDelStaSelfReqParam)
3368{
3369 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003370 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 tWDA_ReqParams *pWdaParams = NULL;
3372 WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq =
3373 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
3374 sizeof(WDI_DelSTASelfReqParamsType)) ;
3375
Jeff Johnson295189b2012-06-20 16:38:30 -07003376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3377 "------> %s " ,__FUNCTION__);
3378 if( NULL == wdiDelStaSelfReq )
3379 {
3380 VOS_ASSERT( 0 );
3381 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3382 "%s: Unable to allocate memory " ,__FUNCTION__);
3383 return( VOS_STATUS_E_NOMEM );
3384 }
3385
3386 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3387 if( NULL == pWdaParams )
3388 {
3389 VOS_ASSERT( 0 );
3390 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3391 "%s: Unable to allocate memory " ,__FUNCTION__);
3392 vos_mem_free(wdiDelStaSelfReq) ;
3393 return( VOS_STATUS_E_NOMEM );
3394 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003395 pWdaParams->pWdaContext = pWDA;
3396 /* Store param pointer as passed in by caller */
3397 pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
3398 /* store Params pass it to WDI */
3399 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003400 vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr,
3401 pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
3402
3403 wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback;
3404 wdiDelStaSelfReq->pUserData = pWdaParams;
3405
Jeff Johnson43971f52012-07-17 12:26:56 -07003406 wstatus = WDI_DelSTASelfReq(wdiDelStaSelfReq,
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams);
3408
Jeff Johnson43971f52012-07-17 12:26:56 -07003409 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 {
3411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
3412 "Failure in Del Sta Self REQ WDI API, free all the memory " );
3413 VOS_ASSERT(0);
Jeff Johnson43971f52012-07-17 12:26:56 -07003414 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3416 vos_mem_free(pWdaParams) ;
3417 pDelStaSelfReqParam->status = eSIR_FAILURE ;
3418 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
3419 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003420 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003421}
3422
Jeff Johnson295189b2012-06-20 16:38:30 -07003423/*
3424 * FUNCTION: WDA_SendMsg
3425 * Send Message back to PE
3426 */
3427void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
3428 void *pBodyptr, tANI_U32 bodyVal)
3429{
3430 tSirMsgQ msg = {0} ;
3431 tANI_U32 status = VOS_STATUS_SUCCESS ;
3432 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 msg.type = msgType;
3434 msg.bodyval = bodyVal;
3435 msg.bodyptr = pBodyptr;
Jeff Johnson295189b2012-06-20 16:38:30 -07003436 status = limPostMsgApi(pMac, &msg);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 if (VOS_STATUS_SUCCESS != status)
3438 {
3439 if(NULL != pBodyptr)
3440 {
3441 vos_mem_free(pBodyptr);
3442 }
3443 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3444 "%s: limPostMsgApi is failed " ,__FUNCTION__);
3445 VOS_ASSERT(0) ;
3446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003447 return ;
3448}
Jeff Johnson295189b2012-06-20 16:38:30 -07003449/*
3450 * FUNCTION: WDA_UpdateBSSParams
3451 * Translated WDA/PE BSS info into WDI BSS info..
3452 */
3453void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
3454 WDI_ConfigBSSReqInfoType *wdiBssParams,
3455 tAddBssParams *wdaBssParams)
3456{
3457 v_U8_t keyIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003458 /* copy bssReq Params to WDI structure */
3459 vos_mem_copy(wdiBssParams->macBSSID,
3460 wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
3461 vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr,
3462 sizeof(tSirMacAddr)) ;
3463 wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
3464 wdiBssParams->ucOperMode = wdaBssParams->operMode ;
3465 wdiBssParams->wdiNWType = wdaBssParams->nwType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003466 wdiBssParams->ucShortSlotTimeSupported =
3467 wdaBssParams->shortSlotTimeSupported ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003468 wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ;
3469 wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ;
3470 wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ;
3471 wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ;
3472 wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ;
3473
3474 wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
3475 wdiBssParams->ucTXOPProtectionFullSupport =
3476 wdaBssParams->fLsigTXOPProtectionFullSupport ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003477 wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
3478 wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003479 wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
3481 wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
3482 wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
3483 wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
3484
3485 /* copy SSID into WDI structure */
3486 wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
3487 vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
3488 wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003489 WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext,
3490 &wdaBssParams->staContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003491 wdiBssParams->wdiAction = wdaBssParams->updateBss;
Jeff Johnson295189b2012-06-20 16:38:30 -07003492#ifdef WLAN_FEATURE_VOWIFI
3493 wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
3494#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003495 wdiBssParams->ucPersona = wdaBssParams->halPersona;
Jeff Johnson295189b2012-06-20 16:38:30 -07003496 wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07003497#ifdef WLAN_FEATURE_VOWIFI_11R
3498 wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003499 if(wdiBssParams->bExtSetStaKeyParamValid)
3500 {
3501 /* copy set STA key params to WDI structure */
3502 wdiBssParams->wdiExtSetKeyParam.ucSTAIdx =
3503 wdaBssParams->extSetStaKeyParam.staIdx;
3504 wdiBssParams->wdiExtSetKeyParam.wdiEncType =
3505 wdaBssParams->extSetStaKeyParam.encType;
3506 wdiBssParams->wdiExtSetKeyParam.wdiWEPType =
3507 wdaBssParams->extSetStaKeyParam.wepType;
3508 wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx =
3509 wdaBssParams->extSetStaKeyParam.defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
3511 {
Jeff Johnson43971f52012-07-17 12:26:56 -07003512 if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07003513 (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) &&
3514 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
3515 {
3516 WDA_GetWepKeysFromCfg( pWDA,
3517 &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx,
3518 &wdiBssParams->wdiExtSetKeyParam.ucNumKeys,
3519 wdiBssParams->wdiExtSetKeyParam.wdiKey );
3520 }
3521 else
3522 {
3523#ifdef WLAN_SOFTAP_FEATURE
3524 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3525 keyIndex++)
3526 {
3527 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId =
3528 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId;
3529 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast =
3530 wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
3531 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
3532 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07003533 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
3534 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
3535 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
3536 wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole;
3537 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength =
3538 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength;
3539 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key,
3540 wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
3541 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003542 wdiBssParams->wdiExtSetKeyParam.ucNumKeys =
3543 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3544#else
3545 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyId =
3546 wdaBssParams->extSetStaKeyParam.key.keyId;
3547 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].unicast =
3548 wdaBssParams->extSetStaKeyParam.key.unicast;
3549 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyDirection =
3550 wdaBssParams->extSetStaKeyParam.key.keyDirection;
3551 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyRsc,
3552 wdaBssParams->extSetStaKeyParam.key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
3553 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].paeRole =
3554 wdaBssParams->extSetStaKeyParam.key.paeRole;
3555 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyLength =
3556 wdaBssParams->extSetStaKeyParam.key.keyLength;
3557 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].key,
3558 wdaBssParams->extSetStaKeyParam.key[keyIndex].key,
3559 SIR_MAC_MAX_KEY_LENGTH);
3560 wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 1;
3561#endif
3562 }
3563 }
3564 wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc;
3565 }
3566 else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */
3567 {
3568 vos_mem_zero( &wdaBssParams->extSetStaKeyParam,
3569 sizeof(wdaBssParams->extSetStaKeyParam) );
3570 }
3571#endif /*WLAN_FEATURE_VOWIFI_11R*/
Jeff Johnsone7245742012-09-05 17:12:55 -07003572#ifdef WLAN_FEATURE_11AC
3573 wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable;
3574 wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet;
3575#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003576
3577 return ;
3578}
Jeff Johnson295189b2012-06-20 16:38:30 -07003579/*
3580 * FUNCTION: WDA_UpdateSTAParams
3581 * Translated WDA/PE BSS info into WDI BSS info..
3582 */
3583void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
3584 WDI_ConfigStaReqInfoType *wdiStaParams,
3585 tAddStaParams *wdaStaParams)
3586{
3587 tANI_U8 i = 0;
3588 /* Update STA params */
3589 vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId,
3590 sizeof(tSirMacAddr)) ;
3591 wdiStaParams->usAssocId = wdaStaParams->assocId;
3592 wdiStaParams->wdiSTAType = wdaStaParams->staType;
3593
3594 wdiStaParams->ucShortPreambleSupported =
3595 wdaStaParams->shortPreambleSupported;
3596 vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac,
3597 sizeof(tSirMacAddr)) ;
3598 wdiStaParams->usListenInterval = wdaStaParams->listenInterval;
3599
3600 wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled;
3601
3602 wdiStaParams->ucHTCapable = wdaStaParams->htCapable;
3603 wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet;
3604 wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode;
3605 wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection;
3606 wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize;
3607 wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity;
3608 wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize;
3609
3610 wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
3611 wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
Jeff Johnson295189b2012-06-20 16:38:30 -07003612 wdiStaParams->wdiSupportedRates.opRateMode =
3613 wdaStaParams->supportedRates.opRateMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 for(i = 0;i < WDI_NUM_11B_RATES;i++)
3615 {
3616 wdiStaParams->wdiSupportedRates.llbRates[i] =
3617 wdaStaParams->supportedRates.llbRates[i];
3618 }
3619 for(i = 0;i < WDI_NUM_11A_RATES;i++)
3620 {
3621 wdiStaParams->wdiSupportedRates.llaRates[i] =
3622 wdaStaParams->supportedRates.llaRates[i];
3623 }
3624 for(i = 0;i < SIR_NUM_POLARIS_RATES;i++)
3625 {
3626 wdiStaParams->wdiSupportedRates.aLegacyRates[i] =
3627 wdaStaParams->supportedRates.aniLegacyRates[i];
3628 }
3629 wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap =
3630 wdaStaParams->supportedRates.aniEnhancedRateBitmap;
Jeff Johnsone7245742012-09-05 17:12:55 -07003631#ifdef WLAN_FEATURE_11AC
3632 wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap;
3633 wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate;
3634 wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap;
3635 wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate;
3636#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003637 for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
3638 {
3639 wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] =
3640 wdaStaParams->supportedRates.supportedMCSSet[i];
3641 }
3642 wdiStaParams->wdiSupportedRates.aRxHighestDataRate =
3643 wdaStaParams->supportedRates.rxHighestDataRate;
3644
3645 wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled;
3646
3647 wdiStaParams->wdiAction = wdaStaParams->updateSta;
3648
3649 wdiStaParams->ucAPSD = wdaStaParams->uAPSD;
3650 wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen;
3651 wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable;
3652
3653 wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport;
3654 wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration;
3655 wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz;
3656 wdiStaParams->ucEncryptType = wdaStaParams->encryptType;
3657#ifdef WLAN_FEATURE_P2P
3658 wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
3659#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07003660#ifdef WLAN_FEATURE_11AC
3661 wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable;
3662 wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet;
3663#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003664 return ;
3665}
Jeff Johnson295189b2012-06-20 16:38:30 -07003666/*
3667 * -------------------------------------------------------------------------
3668 * CFG update to WDI
3669 * -------------------------------------------------------------------------
3670 */
3671
3672 /*
3673 * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
3674 * Convert the WNI CFG ID to HAL CFG ID
3675 */
Jeff Johnsone7245742012-09-05 17:12:55 -07003676static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
Jeff Johnson295189b2012-06-20 16:38:30 -07003677{
3678 switch(wniCfgId)
3679 {
3680 case WNI_CFG_STA_ID:
3681 return QWLAN_HAL_CFG_STA_ID;
3682 case WNI_CFG_CURRENT_TX_ANTENNA:
3683 return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
3684 case WNI_CFG_CURRENT_RX_ANTENNA:
3685 return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
3686 case WNI_CFG_LOW_GAIN_OVERRIDE:
3687 return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
3688 case WNI_CFG_POWER_STATE_PER_CHAIN:
3689 return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
3690 case WNI_CFG_CAL_PERIOD:
3691 return QWLAN_HAL_CFG_CAL_PERIOD;
3692 case WNI_CFG_CAL_CONTROL:
3693 return QWLAN_HAL_CFG_CAL_CONTROL;
3694 case WNI_CFG_PROXIMITY:
3695 return QWLAN_HAL_CFG_PROXIMITY;
3696 case WNI_CFG_NETWORK_DENSITY:
3697 return QWLAN_HAL_CFG_NETWORK_DENSITY;
3698 case WNI_CFG_MAX_MEDIUM_TIME:
3699 return QWLAN_HAL_CFG_MAX_MEDIUM_TIME;
3700 case WNI_CFG_MAX_MPDUS_IN_AMPDU:
3701 return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU;
3702 case WNI_CFG_RTS_THRESHOLD:
3703 return QWLAN_HAL_CFG_RTS_THRESHOLD;
3704 case WNI_CFG_SHORT_RETRY_LIMIT:
3705 return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT;
3706 case WNI_CFG_LONG_RETRY_LIMIT:
3707 return QWLAN_HAL_CFG_LONG_RETRY_LIMIT;
3708 case WNI_CFG_FRAGMENTATION_THRESHOLD:
3709 return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD;
3710 case WNI_CFG_DYNAMIC_THRESHOLD_ZERO:
3711 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO;
3712 case WNI_CFG_DYNAMIC_THRESHOLD_ONE:
3713 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE;
3714 case WNI_CFG_DYNAMIC_THRESHOLD_TWO:
3715 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO;
3716 case WNI_CFG_FIXED_RATE:
3717 return QWLAN_HAL_CFG_FIXED_RATE;
3718 case WNI_CFG_RETRYRATE_POLICY:
3719 return QWLAN_HAL_CFG_RETRYRATE_POLICY;
3720 case WNI_CFG_RETRYRATE_SECONDARY:
3721 return QWLAN_HAL_CFG_RETRYRATE_SECONDARY;
3722 case WNI_CFG_RETRYRATE_TERTIARY:
3723 return QWLAN_HAL_CFG_RETRYRATE_TERTIARY;
3724 case WNI_CFG_FORCE_POLICY_PROTECTION:
3725 return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION;
3726 case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ:
3727 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ;
3728 case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ:
3729 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ;
3730 case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ:
3731 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ;
3732 case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ:
3733 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ;
3734 case WNI_CFG_MAX_BA_SESSIONS:
3735 return QWLAN_HAL_CFG_MAX_BA_SESSIONS;
3736 case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT:
3737 return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT;
3738 case WNI_CFG_PS_ENABLE_BCN_FILTER:
3739 return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER;
3740 case WNI_CFG_PS_ENABLE_RSSI_MONITOR:
3741 return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR;
3742 case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE:
3743 return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
3744 case WNI_CFG_STATS_PERIOD:
3745 return QWLAN_HAL_CFG_STATS_PERIOD;
3746 case WNI_CFG_CFP_MAX_DURATION:
3747 return QWLAN_HAL_CFG_CFP_MAX_DURATION;
3748#if 0 /*This is not part of CFG*/
3749 case WNI_CFG_FRAME_TRANS_ENABLED:
3750 return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED;
3751#endif
3752 case WNI_CFG_DTIM_PERIOD:
3753 return QWLAN_HAL_CFG_DTIM_PERIOD;
3754 case WNI_CFG_EDCA_WME_ACBK:
3755 return QWLAN_HAL_CFG_EDCA_WMM_ACBK;
3756 case WNI_CFG_EDCA_WME_ACBE:
3757 return QWLAN_HAL_CFG_EDCA_WMM_ACBE;
3758 case WNI_CFG_EDCA_WME_ACVI:
3759 return QWLAN_HAL_CFG_EDCA_WMM_ACVI;
3760 case WNI_CFG_EDCA_WME_ACVO:
3761 return QWLAN_HAL_CFG_EDCA_WMM_ACVO;
3762#if 0
3763 case WNI_CFG_TELE_BCN_WAKEUP_EN:
3764 return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN;
3765 case WNI_CFG_TELE_BCN_TRANS_LI:
3766 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI;
3767 case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS:
3768 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS;
3769 case WNI_CFG_TELE_BCN_MAX_LI:
3770 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI;
3771 case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS:
3772 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS;
3773#endif
3774 case WNI_CFG_ENABLE_CLOSE_LOOP:
3775 return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP;
3776 default:
3777 {
3778 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3779 "There is no HAL CFG Id corresponding to WNI CFG Id: %d\n",
3780 wniCfgId);
3781 return VOS_STATUS_E_INVAL;
3782 }
3783 }
3784}
Jeff Johnson295189b2012-06-20 16:38:30 -07003785/*
3786 * FUNCTION: WDA_UpdateCfgCallback
3787 *
3788 */
3789void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData)
3790{
3791 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
3792 WDI_UpdateCfgReqParamsType *wdiCfgParam =
3793 (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003794 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3795 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 /*
3797 * currently there is no response message is expected between PE and
3798 * WDA, Failure return from WDI is a ASSERT condition
3799 */
3800 if(WDI_STATUS_SUCCESS != wdiStatus)
3801 {
3802 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3803 "%s: CFG (%d) config failure \n", __FUNCTION__,
3804 ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
3805 }
3806
3807 vos_mem_free(wdiCfgParam->pConfigBuffer) ;
3808 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3809 pWDA->wdaWdiCfgApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 return ;
3811}
Jeff Johnson295189b2012-06-20 16:38:30 -07003812/*
3813 * FUNCTION: WDA_UpdateCfg
3814 *
3815 */
3816VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam)
3817{
3818
3819 WDI_Status status = WDI_STATUS_SUCCESS ;
3820 tANI_U32 val =0;
3821 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
3822 tHalCfg *configData;
3823 WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
3824 tANI_U8 *configDataValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3826 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 if (NULL == pMac )
3828 {
3829 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3830 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3831 return VOS_STATUS_E_FAILURE;
3832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 if(WDA_START_STATE != pWDA->wdaState)
3834 {
3835 return VOS_STATUS_E_FAILURE;
3836 }
3837
3838 if(NULL != pWDA->wdaWdiCfgApiMsgParam)
3839 {
3840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3841 "%s:wdaWdiCfgApiMsgParam is not NULL", __FUNCTION__);
3842 VOS_ASSERT(0);
3843 return VOS_STATUS_E_FAILURE;
3844 }
3845
3846 wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
3847 sizeof(WDI_UpdateCfgReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003848 if(NULL == wdiCfgReqParam)
3849 {
3850 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3851 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3852 VOS_ASSERT(0);
3853 return VOS_STATUS_E_NOMEM;
3854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003855 wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) +
3856 sizeof(tANI_U32)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003857 if(NULL == wdiCfgReqParam->pConfigBuffer)
3858 {
3859 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3860 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
3861 vos_mem_free(wdiCfgReqParam);
3862 VOS_ASSERT(0);
3863 return VOS_STATUS_E_NOMEM;
3864 }
3865
3866 /*convert the WNI CFG Id to HAL CFG Id*/
3867 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
3868 WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
3869
3870 /*TODO: revisit this for handling string parameters */
3871 if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval,
3872 &val) != eSIR_SUCCESS)
3873 {
3874 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3875 "Failed to cfg get id %d\n", cfgParam->bodyval);
3876 vos_mem_free(wdiCfgReqParam->pConfigBuffer);
3877 vos_mem_free(wdiCfgReqParam);
3878 return eSIR_FAILURE;
3879 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
3881 configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
3882 configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
3883 vos_mem_copy( configDataValue, &val, sizeof(tANI_U32));
3884 wdiCfgReqParam->wdiReqStatusCB = NULL ;
3885
3886 /* store Params pass it to WDI */
3887 pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003888#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
3889 status = WDI_UpdateCfgReq(wdiCfgReqParam,
3890 (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003891 if(IS_WDI_STATUS_FAILURE(status))
3892 {
3893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3894 "Failure in Update CFG WDI API, free all the memory " );
3895 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3896 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3897 pWDA->wdaWdiCfgApiMsgParam = NULL;
3898 /* Failure is not expected */
3899 VOS_ASSERT(0) ;
3900 }
3901#else
3902 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3903 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3904 pWDA->wdaWdiCfgApiMsgParam = NULL;
3905#endif
3906 return CONVERT_WDI2VOS_STATUS(status) ;
3907}
3908
Jeff Johnson295189b2012-06-20 16:38:30 -07003909VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
3910 v_U8_t *pDefaultKeyId,
3911 v_U8_t *pNumKeys,
3912 WDI_KeysType *pWdiKeys )
3913{
3914 v_U32_t i, j, defKeyId = 0;
3915 v_U32_t val = SIR_MAC_KEY_LENGTH;
3916 VOS_STATUS status = WDI_STATUS_SUCCESS;
3917 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003918 if (NULL == pMac )
3919 {
3920 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3921 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3922 return VOS_STATUS_E_FAILURE;
3923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
3925 &defKeyId ))
3926 {
3927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3928 "Unable to retrieve defaultKeyId from CFG. Defaulting to 0...");
3929 }
3930
3931 *pDefaultKeyId = (v_U8_t)defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07003932 /* Need to extract ALL of the configured WEP Keys */
3933 for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
3934 {
3935 val = SIR_MAC_KEY_LENGTH;
3936 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3937 (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i),
3938 pWdiKeys[j].key,
3939 &val ))
3940 {
3941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3942 "WEP Key index [%d] may not configured in CFG\n",i);
3943 }
3944 else
3945 {
3946 pWdiKeys[j].keyId = (tANI_U8) i;
3947 /*
3948 * Actually, a DC (Don't Care) because
3949 * this is determined (and set) by PE/MLME
3950 */
3951 pWdiKeys[j].unicast = 0;
3952 /*
3953 * Another DC (Don't Care)
3954 */
3955 pWdiKeys[j].keyDirection = eSIR_TX_RX;
3956 /* Another DC (Don't Care). Unused for WEP */
3957 pWdiKeys[j].paeRole = 0;
3958 /* Determined from wlan_cfgGetStr() above.*/
3959 pWdiKeys[j].keyLength = (tANI_U16) val;
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 j++;
3961 *pNumKeys = (tANI_U8) j;
3962 }
3963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003964 return status;
3965}
Jeff Johnson295189b2012-06-20 16:38:30 -07003966/*
3967 * FUNCTION: WDA_SetBssKeyReqCallback
3968 * send SET BSS key RSP back to PE
3969 */
3970void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData)
3971{
3972 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3973 tWDA_CbContext *pWDA;
3974 tSetBssKeyParams *setBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3976 "<------ %s " ,__FUNCTION__);
3977 if(NULL == pWdaParams)
3978 {
3979 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3980 "%s: pWdaParams received NULL", __FUNCTION__);
3981 VOS_ASSERT(0) ;
3982 return ;
3983 }
3984 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3985 setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3987 vos_mem_free(pWdaParams) ;
3988 setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003989 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 return ;
3991}
Jeff Johnson295189b2012-06-20 16:38:30 -07003992/*
3993 * FUNCTION: WDA_ProcessSetBssKeyReq
3994 * Request to WDI for programming the BSS key( key for
3995 * broadcast/multicast frames Encryption)
3996 */
3997VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA,
3998 tSetBssKeyParams *setBssKeyParams )
3999{
4000 WDI_Status status = WDI_STATUS_SUCCESS ;
4001 WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam =
4002 (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
4003 sizeof(WDI_SetBSSKeyReqParamsType)) ;
4004 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004005 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4007 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 if(NULL == wdiSetBssKeyParam)
4009 {
4010 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4011 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4012 VOS_ASSERT(0);
4013 return VOS_STATUS_E_NOMEM;
4014 }
4015 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4016 if(NULL == pWdaParams)
4017 {
4018 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4019 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4020 VOS_ASSERT(0);
4021 vos_mem_free(wdiSetBssKeyParam);
4022 return VOS_STATUS_E_NOMEM;
4023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004025 /* copy set BSS params to WDI structure */
4026 wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
4027 wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
4028 wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 if(setBssKeyParams->encType != eSIR_ED_NONE)
4030 {
4031 if( setBssKeyParams->numKeys == 0 &&
4032 (( setBssKeyParams->encType == eSIR_ED_WEP40)||
4033 setBssKeyParams->encType == eSIR_ED_WEP104))
4034 {
4035 tANI_U8 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004036 WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId,
4037 &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
4038 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
4039 }
4040 else
4041 {
4042 for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++)
4043 {
4044 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId =
4045 setBssKeyParams->key[keyIndex].keyId;
4046 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast =
4047 setBssKeyParams->key[keyIndex].unicast;
4048 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection =
4049 setBssKeyParams->key[keyIndex].keyDirection;
4050 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
4051 setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4052 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole =
4053 setBssKeyParams->key[keyIndex].paeRole;
4054 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength =
4055 setBssKeyParams->key[keyIndex].keyLength;
4056 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key,
4057 setBssKeyParams->key[keyIndex].key,
4058 SIR_MAC_MAX_KEY_LENGTH);
4059 }
4060 }
4061 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc =
4063 setBssKeyParams->singleTidRc;
4064 wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 /* Store set key pointer, as this will be used for response */
4066 /* store Params pass it to WDI */
4067 pWdaParams->pWdaContext = pWDA;
4068 pWdaParams->wdaMsgParam = setBssKeyParams;
4069 pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004070 status = WDI_SetBSSKeyReq(wdiSetBssKeyParam,
4071 (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
4072
4073 if(IS_WDI_STATUS_FAILURE(status))
4074 {
4075 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4076 "Failure in Set BSS Key Req WDI API, free all the memory " );
4077 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4078 vos_mem_free(pWdaParams) ;
4079 setBssKeyParams->status = eSIR_FAILURE ;
4080 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
4081 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004082 return CONVERT_WDI2VOS_STATUS(status) ;
4083}
Jeff Johnson295189b2012-06-20 16:38:30 -07004084/*
4085 * FUNCTION: WDA_RemoveBssKeyReqCallback
4086 * send SET BSS key RSP back to PE
4087 */
4088void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData)
4089{
4090 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4091 tWDA_CbContext *pWDA;
4092 tRemoveBssKeyParams *removeBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4094 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 if(NULL == pWdaParams)
4096 {
4097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4098 "%s: pWdaParams received NULL", __FUNCTION__);
4099 VOS_ASSERT(0) ;
4100 return ;
4101 }
4102 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4103 removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004104 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4105 vos_mem_free(pWdaParams) ;
4106
4107 removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004109 return ;
4110}
Jeff Johnson295189b2012-06-20 16:38:30 -07004111/*
4112 * FUNCTION: WDA_ProcessRemoveBssKeyReq
4113 * Request to WDI to remove the BSS key( key for broadcast/multicast
4114 * frames Encryption)
4115 */
4116VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA,
4117 tRemoveBssKeyParams *removeBssKeyParams )
4118{
4119 WDI_Status status = WDI_STATUS_SUCCESS ;
4120 WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam =
4121 (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
4122 sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
4123 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4125 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004126 if(NULL == wdiRemoveBssKeyParam)
4127 {
4128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4129 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4130 VOS_ASSERT(0);
4131 return VOS_STATUS_E_NOMEM;
4132 }
4133 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4134 if(NULL == pWdaParams)
4135 {
4136 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4137 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4138 VOS_ASSERT(0);
4139 vos_mem_free(wdiRemoveBssKeyParam);
4140 return VOS_STATUS_E_NOMEM;
4141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 /* copy Remove BSS key params to WDI structure*/
4143 wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
4144 wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
4145 wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
4146 wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
4147 wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 /* Store remove key pointer, as this will be used for response */
4149 /* store Params pass it to WDI */
4150 pWdaParams->pWdaContext = pWDA;
4151 pWdaParams->wdaMsgParam = removeBssKeyParams;
4152 pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004153 status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam,
4154 (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004155 if(IS_WDI_STATUS_FAILURE(status))
4156 {
4157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4158 "Failure in Remove BSS Key Req WDI API, free all the memory " );
4159 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4160 vos_mem_free(pWdaParams) ;
4161 removeBssKeyParams->status = eSIR_FAILURE ;
4162 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
4163 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004164 return CONVERT_WDI2VOS_STATUS(status) ;
4165}
Jeff Johnson295189b2012-06-20 16:38:30 -07004166/*
4167 * FUNCTION: WDA_SetBssKeyReqCallback
4168 * send SET BSS key RSP back to PE
4169 */
4170void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData)
4171{
4172 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4173 tWDA_CbContext *pWDA;
4174 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004175 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4176 "<------ %s " ,__FUNCTION__);
4177 if(NULL == pWdaParams)
4178 {
4179 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR
4180 ,"%s: pWdaParams received NULL", __FUNCTION__);
4181 VOS_ASSERT(0) ;
4182 return ;
4183 }
4184 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4185 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004186 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4187 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004188 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004189 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004190 return ;
4191}
Jeff Johnson295189b2012-06-20 16:38:30 -07004192/*
4193 * FUNCTION: WDA_ProcessSetStaKeyReq
4194 * Request to WDI for programming the STA key( key for Unicast frames
4195 * Encryption)
4196 */
4197VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA,
4198 tSetStaKeyParams *setStaKeyParams )
4199{
4200 WDI_Status status = WDI_STATUS_SUCCESS ;
4201 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4202 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4203 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4204 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004205 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4207 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 if(NULL == wdiSetStaKeyParam)
4209 {
4210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4211 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4212 VOS_ASSERT(0);
4213 return VOS_STATUS_E_NOMEM;
4214 }
4215 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4216 if(NULL == pWdaParams)
4217 {
4218 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4219 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4220 VOS_ASSERT(0);
4221 vos_mem_free(wdiSetStaKeyParam);
4222 return VOS_STATUS_E_NOMEM;
4223 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004225 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 /* copy set STA key params to WDI structure */
4227 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4228 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4229 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4230 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004231 if(setStaKeyParams->encType != eSIR_ED_NONE)
4232 {
Jeff Johnson43971f52012-07-17 12:26:56 -07004233 if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004234 (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) &&
4235 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
4236 {
4237 WDA_GetWepKeysFromCfg( pWDA,
4238 &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx,
4239 &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys,
4240 wdiSetStaKeyParam->wdiKeyInfo.wdiKey );
4241 }
4242 else
4243 {
4244#ifdef WLAN_SOFTAP_FEATURE
4245 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4246 keyIndex++)
4247 {
4248 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4249 setStaKeyParams->key[keyIndex].keyId;
4250 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4251 setStaKeyParams->key[keyIndex].unicast;
4252 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4253 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004254 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4255 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4256 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4257 setStaKeyParams->key[keyIndex].paeRole;
4258 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4259 setStaKeyParams->key[keyIndex].keyLength;
4260 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4261 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4262 /* set default index to index which have key direction as WDI_TX_DEFAULT */
4263 if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection)
4264 {
4265 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
4266 }
4267 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4269 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4270#else
4271 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4272 setStaKeyParams->key.keyId;
4273 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4274 setStaKeyParams->key.unicast;
4275 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4276 setStaKeyParams->key.keyDirection;
4277 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4278 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4279 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4280 setStaKeyParams->key.paeRole;
4281 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4282 setStaKeyParams->key.keyLength;
4283 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4284 setStaKeyParams->key[keyIndex].key,
4285 SIR_MAC_MAX_KEY_LENGTH);
4286 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4287#endif
4288 }
4289 }
4290 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4291 wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 /* Store set key pointer, as this will be used for response */
4293 /* store Params pass it to WDI */
4294 pWdaParams->pWdaContext = pWDA;
4295 pWdaParams->wdaMsgParam = setStaKeyParams;
4296 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004297 status = WDI_SetSTAKeyReq(wdiSetStaKeyParam,
4298 (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 if(IS_WDI_STATUS_FAILURE(status))
4300 {
4301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4302 "Failure in set STA Key Req WDI API, free all the memory " );
4303 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4304 vos_mem_free(pWdaParams) ;
4305 setStaKeyParams->status = eSIR_FAILURE ;
4306 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
4307 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004308 return CONVERT_WDI2VOS_STATUS(status) ;
4309}
Jeff Johnson295189b2012-06-20 16:38:30 -07004310/*
4311 * FUNCTION: WDA_SetBcastStaKeyReqCallback
4312 * send SET Bcast STA key RSP back to PE
4313 */
4314void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData)
4315{
4316 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4317 tWDA_CbContext *pWDA;
4318 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004319 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4320 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004321 if(NULL == pWdaParams)
4322 {
4323 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4324 "%s: pWdaParams received NULL", __FUNCTION__);
4325 VOS_ASSERT(0) ;
4326 return ;
4327 }
4328 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4329 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4331 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004332 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 return ;
4335}
4336
Jeff Johnson295189b2012-06-20 16:38:30 -07004337/*
4338 * FUNCTION: WDA_ProcessSetBcastStaKeyReq
4339 * Request to WDI for programming the Bcast STA key( key for Broadcast frames
4340 * Encryption)
4341 */
4342VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA,
4343 tSetStaKeyParams *setStaKeyParams )
4344{
4345 WDI_Status status = WDI_STATUS_SUCCESS ;
4346 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4347 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4348 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4349 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004351 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4352 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 if(NULL == wdiSetStaKeyParam)
4354 {
4355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4356 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4357 VOS_ASSERT(0);
4358 return VOS_STATUS_E_NOMEM;
4359 }
4360 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4361 if(NULL == pWdaParams)
4362 {
4363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4364 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4365 VOS_ASSERT(0);
4366 vos_mem_free(wdiSetStaKeyParam);
4367 return VOS_STATUS_E_NOMEM;
4368 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004369 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004370 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004371 /* copy set STA key params to WDI structure */
4372 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4373 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4374 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4375 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004376 if(setStaKeyParams->encType != eSIR_ED_NONE)
4377 {
4378#ifdef WLAN_SOFTAP_FEATURE
4379 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4380 keyIndex++)
4381 {
4382 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4383 setStaKeyParams->key[keyIndex].keyId;
4384 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4385 setStaKeyParams->key[keyIndex].unicast;
4386 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4387 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4389 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4390 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4391 setStaKeyParams->key[keyIndex].paeRole;
4392 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4393 setStaKeyParams->key[keyIndex].keyLength;
4394 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4395 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4396 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4398 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4399#else
4400 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4401 setStaKeyParams->key.keyId;
4402 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4403 setStaKeyParams->key.unicast;
4404 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4405 setStaKeyParams->key.keyDirection;
4406 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4407 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4408 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4409 setStaKeyParams->key.paeRole;
4410 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4411 setStaKeyParams->key.keyLength;
4412 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4413 setStaKeyParams->key[keyIndex].key,
4414 SIR_MAC_MAX_KEY_LENGTH);
4415 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4416#endif
4417 }
4418 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 /* Store set key pointer, as this will be used for response */
4420 /* store Params pass it to WDI */
4421 pWdaParams->pWdaContext = pWDA;
4422 pWdaParams->wdaMsgParam = setStaKeyParams;
4423 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004424 status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam,
4425 (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 if(IS_WDI_STATUS_FAILURE(status))
4427 {
4428 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4429 "Failure in set BCAST STA Key Req WDI API, free all the memory " );
4430 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4431 vos_mem_free(pWdaParams) ;
4432 setStaKeyParams->status = eSIR_FAILURE ;
4433 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
4434 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004435 return CONVERT_WDI2VOS_STATUS(status) ;
4436}
Jeff Johnson295189b2012-06-20 16:38:30 -07004437/*
4438 * FUNCTION: WDA_RemoveStaKeyReqCallback
4439 * send SET BSS key RSP back to PE
4440 */
4441void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData)
4442{
4443 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4444 tWDA_CbContext *pWDA;
4445 tRemoveStaKeyParams *removeStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4447 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004448 if(NULL == pWdaParams)
4449 {
4450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4451 "%s: pWdaParams received NULL", __FUNCTION__);
4452 VOS_ASSERT(0) ;
4453 return ;
4454 }
4455 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4456 removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4458 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004459 removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 return ;
4462}
4463
Jeff Johnson295189b2012-06-20 16:38:30 -07004464/*
4465 * FUNCTION: WDA_ProcessRemoveStaKeyReq
4466 * Request to WDI to remove the STA key( key for Unicast frames Encryption)
4467 */
4468VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA,
4469 tRemoveStaKeyParams *removeStaKeyParams )
4470{
4471 WDI_Status status = WDI_STATUS_SUCCESS ;
4472 WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam =
4473 (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
4474 sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
4475 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4477 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004478 if(NULL == wdiRemoveStaKeyParam)
4479 {
4480 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4481 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4482 VOS_ASSERT(0);
4483 return VOS_STATUS_E_NOMEM;
4484 }
4485 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4486 if(NULL == pWdaParams)
4487 {
4488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4489 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4490 VOS_ASSERT(0);
4491 vos_mem_free(wdiRemoveStaKeyParam);
4492 return VOS_STATUS_E_NOMEM;
4493 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004494 /* copy remove STA key params to WDI structure*/
4495 wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
4496 wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
4497 wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
4498 wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
4499 wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004500 /* Store remove key pointer, as this will be used for response */
4501 /* store Params pass it to WDI */
4502 pWdaParams->pWdaContext = pWDA;
4503 pWdaParams->wdaMsgParam = removeStaKeyParams;
4504 pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam,
4506 (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004507 if(IS_WDI_STATUS_FAILURE(status))
4508 {
4509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4510 "Failure in remove STA Key Req WDI API, free all the memory " );
4511 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4512 vos_mem_free(pWdaParams) ;
4513 removeStaKeyParams->status = eSIR_FAILURE ;
4514 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
4515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004516 return CONVERT_WDI2VOS_STATUS(status) ;
4517}
Jeff Johnson295189b2012-06-20 16:38:30 -07004518/*
4519 * FUNCTION: WDA_IsHandleSetLinkStateReq
4520 * Update the WDA state and return the status to handle this message or not
4521 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004522WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
4523 tWDA_CbContext *pWDA,
4524 tLinkStateParams *linkStateParams)
4525{
4526 WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 switch(linkStateParams->state)
4528 {
4529 case eSIR_LINK_PREASSOC_STATE:
4530 case eSIR_LINK_BTAMP_PREASSOC_STATE:
4531 /*
4532 * set the WDA state to PRE ASSOC
4533 * copy the BSSID into pWDA to use it in join request and return,
4534 * No need to handle these messages.
4535 */
4536 vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid,
4537 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004538 vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr,
4539 sizeof(tSirMacAddr));
4540 /* UMAC is issuing the setlink state with PREASSOC twice (before set
4541 *channel and after ) so reset the WDA state to ready when the second
4542 * time UMAC issue the link state with PREASSOC
4543 */
4544 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
4545 {
4546 /* RESET WDA state back to WDA_READY_STATE */
4547 pWDA->wdaState = WDA_READY_STATE;
4548 }
4549 else
4550 {
4551 pWDA->wdaState = WDA_PRE_ASSOC_STATE;
4552 }
4553 //populate linkState info in WDACbCtxt
4554 pWDA->linkState = linkStateParams->state;
4555 status = WDA_IGNORE_SET_LINK_STATE;
4556 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004557 default:
4558 if(pWDA->wdaState != WDA_READY_STATE)
4559 {
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004560 /*If WDA_SET_LINK_STATE is recieved with any other link state apart
4561 *from eSIR_LINK_PREASSOC_STATE and eSIR_LINK_BTAMP_PREASSOC_STATE when
4562 *pWDA->wdaState is in WDA_PRE_ASSOC_STATE(This can happen only in
4563 *error cases) so reset the WDA state to WDA_READY_STATE to avoid
4564 *the ASSERT in WDA_Stop during module unload.*/
4565 if (pWDA->wdaState == WDA_PRE_ASSOC_STATE)
4566 {
4567 pWDA->wdaState = WDA_READY_STATE;
4568 }
4569 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4570 "Set link state called when WDA is not in READY STATE " );
4571 status = WDA_IGNORE_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 }
4573 break;
4574 }
4575
4576 return status;
4577}
Jeff Johnson295189b2012-06-20 16:38:30 -07004578/*
4579 * FUNCTION: WDA_SetLinkStateCallback
4580 * call back function for set link state from WDI
4581 */
4582void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
4583{
4584 tWDA_CbContext *pWDA;
4585 tLinkStateParams *linkStateParams;
4586 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4588 "<------ %s " ,__FUNCTION__);
4589 if(NULL == pWdaParams)
4590 {
4591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4592 "%s: pWdaParams received NULL", __FUNCTION__);
4593 VOS_ASSERT(0) ;
4594 return ;
4595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004598 /*
4599 * In STA mode start the BA activity check timer after association
4600 * and in AP mode start BA activity check timer after BSS start */
4601 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
4602 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
4603 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
4604 {
4605 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4606 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004607 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004608 /*
4609 * No respone required for WDA_SET_LINK_STATE so free the request
4610 * param here
4611 */
4612 if( pWdaParams != NULL )
4613 {
4614 if( pWdaParams->wdaWdiApiMsgParam != NULL )
4615 {
4616 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4617 }
4618 vos_mem_free(pWdaParams);
4619 }
4620 return ;
4621}
Jeff Johnson295189b2012-06-20 16:38:30 -07004622/*
4623 * FUNCTION: WDA_ProcessSetLinkState
4624 * Request to WDI to set the link status.
4625 */
4626VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
4627 tLinkStateParams *linkStateParams)
4628{
4629 WDI_Status status = WDI_STATUS_SUCCESS ;
4630 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
4631 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
4632 sizeof(WDI_SetLinkReqParamsType)) ;
4633 tWDA_ReqParams *pWdaParams ;
4634 tpAniSirGlobal pMac;
4635 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
4636
4637 if(NULL == pMac)
4638 {
4639 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4640 "%s:pMac is NULL", __FUNCTION__);
4641 VOS_ASSERT(0);
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004642 vos_mem_free(wdiSetLinkStateParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004643 return VOS_STATUS_E_FAILURE;
4644 }
4645
4646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4647 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004648 if(NULL == wdiSetLinkStateParam)
4649 {
4650 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4651 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4652 VOS_ASSERT(0);
4653 return VOS_STATUS_E_NOMEM;
4654 }
4655 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4656 if(NULL == pWdaParams)
4657 {
4658 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4659 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4660 VOS_ASSERT(0);
4661 vos_mem_free(wdiSetLinkStateParam);
4662 return VOS_STATUS_E_NOMEM;
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 if(WDA_IGNORE_SET_LINK_STATE ==
4665 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
4666 {
4667 status = WDI_STATUS_E_FAILURE;
4668 }
4669 else
4670 {
4671 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
4672 linkStateParams->bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004673 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
4674 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
4676 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004677 pWdaParams->pWdaContext = pWDA;
4678 /* Store remove key pointer, as this will be used for response */
4679 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004680 /* store Params pass it to WDI */
4681 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
4682 /* Stop Timer only other than GO role and concurrent session */
4683 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
4684 && !vos_concurrent_sessions_running() &&
4685 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
4686 {
4687 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4688 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
4690 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004691 if(IS_WDI_STATUS_FAILURE(status))
4692 {
4693 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4694 "Failure in set link state Req WDI API, free all the memory " );
4695 }
4696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004697 if(IS_WDI_STATUS_FAILURE(status))
4698 {
4699 vos_mem_free(wdiSetLinkStateParam) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07004700 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004701 vos_mem_free(pWdaParams);
4702 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004703 return CONVERT_WDI2VOS_STATUS(status) ;
4704}
Jeff Johnson295189b2012-06-20 16:38:30 -07004705/*
4706 * FUNCTION: WDA_GetStatsReqParamsCallback
4707 * send the response to PE with Stats received from WDI
4708 */
4709void WDA_GetStatsReqParamsCallback(
4710 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
4711 void* pUserData)
4712{
4713 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4714 tAniGetPEStatsRsp *pGetPEStatsRspParams;
4715
4716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4717 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004718 pGetPEStatsRspParams =
4719 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
4720 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
4721
4722 if(NULL == pGetPEStatsRspParams)
4723 {
4724 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4725 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4726 VOS_ASSERT(0);
4727 return;
4728 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
4730 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
4731 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
4732 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
4733 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
4734
4735 //Fill the Session Id Properly in PE
4736 pGetPEStatsRspParams->sessionId = 0;
4737 pGetPEStatsRspParams->rc =
4738 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
4739 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
4740 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 vos_mem_copy( pGetPEStatsRspParams + 1,
4742 wdiGetStatsRsp + 1,
4743 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 /* send response to UMAC*/
4745 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
4746
4747 return;
4748}
4749
Jeff Johnson295189b2012-06-20 16:38:30 -07004750/*
4751 * FUNCTION: WDA_ProcessGetStatsReq
4752 * Request to WDI to get the statistics
4753 */
4754VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
4755 tAniGetPEStatsReq *pGetStatsParams)
4756{
4757 WDI_Status status = WDI_STATUS_SUCCESS ;
4758 WDI_GetStatsReqParamsType wdiGetStatsParam;
4759 tAniGetPEStatsRsp *pGetPEStatsRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4761 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004762 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
4763 pGetStatsParams->staId;
4764 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
4765 pGetStatsParams->statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004766 wdiGetStatsParam.wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004767 status = WDI_GetStatsReq(&wdiGetStatsParam,
4768 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07004769 if(IS_WDI_STATUS_FAILURE(status))
4770 {
4771 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4772 "Failure in Get Stats Req WDI API, free all the memory " );
4773 pGetPEStatsRspParams =
4774 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
4775 if(NULL == pGetPEStatsRspParams)
4776 {
4777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4778 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4779 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004780 vos_mem_free(pGetStatsParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 return VOS_STATUS_E_NOMEM;
4782 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004783 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
4784 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
4785 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
4786 pGetPEStatsRspParams->rc = eSIR_FAILURE;
4787 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
4788 (void *)pGetPEStatsRspParams, 0) ;
4789 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004790 /* Free the request message */
4791 vos_mem_free(pGetStatsParams);
4792 return CONVERT_WDI2VOS_STATUS(status);
4793}
Jeff Johnson295189b2012-06-20 16:38:30 -07004794/*
4795 * FUNCTION: WDA_UpdateEDCAParamCallback
4796 * call back function for Update EDCA params from WDI
4797 */
4798void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
4799{
4800 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4801 tEdcaParams *pEdcaParams;
4802
4803 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4804 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004805 if(NULL == pWdaParams)
4806 {
4807 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4808 "%s: pWdaParams received NULL", __FUNCTION__);
4809 VOS_ASSERT(0) ;
4810 return ;
4811 }
4812 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004813 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4814 vos_mem_free(pWdaParams);
4815 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 return ;
4817}
Jeff Johnson295189b2012-06-20 16:38:30 -07004818/*
4819 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
4820 * Request to WDI to Update the EDCA params.
4821 */
4822VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
4823 tEdcaParams *pEdcaParams)
4824{
4825 WDI_Status status = WDI_STATUS_SUCCESS ;
4826 WDI_UpdateEDCAParamsType *wdiEdcaParam =
4827 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
4828 sizeof(WDI_UpdateEDCAParamsType)) ;
4829 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004830 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4831 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004832 if(NULL == wdiEdcaParam)
4833 {
4834 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4835 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4836 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004837 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 return VOS_STATUS_E_NOMEM;
4839 }
4840 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4841 if(NULL == pWdaParams)
4842 {
4843 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4844 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4845 VOS_ASSERT(0);
4846 vos_mem_free(wdiEdcaParam);
Jeff Johnsone7245742012-09-05 17:12:55 -07004847 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004848 return VOS_STATUS_E_NOMEM;
4849 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004850 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
4851 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
4852 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
4853 &pEdcaParams->acbe);
4854 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
4855 &pEdcaParams->acbk);
4856 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
4857 &pEdcaParams->acvi);
4858 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
4859 &pEdcaParams->acvo);
4860 wdiEdcaParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004861 pWdaParams->pWdaContext = pWDA;
4862 /* Store remove key pointer, as this will be used for response */
4863 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 /* store Params pass it to WDI */
4865 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004866 status = WDI_UpdateEDCAParams(wdiEdcaParam,
4867 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004868 if(IS_WDI_STATUS_FAILURE(status))
4869 {
4870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4871 "Failure in Update EDCA Params WDI API, free all the memory " );
4872 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4873 vos_mem_free(pWdaParams);
4874 vos_mem_free(pEdcaParams);
4875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004876 return CONVERT_WDI2VOS_STATUS(status) ;
4877}
Jeff Johnson295189b2012-06-20 16:38:30 -07004878/*
4879 * FUNCTION: WDA_AddBAReqCallback
4880 * send ADD BA RSP back to PE
4881 */
4882void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
4883 void* pUserData)
4884{
4885 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4886 tWDA_CbContext *pWDA;
4887 tAddBAParams *pAddBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4889 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004890 if(NULL == pWdaParams)
4891 {
4892 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4893 "%s: pWdaParams received NULL", __FUNCTION__);
4894 VOS_ASSERT(0) ;
4895 return ;
4896 }
4897 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4898 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004899 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4900 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004901 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004903 return ;
4904}
4905
Jeff Johnson295189b2012-06-20 16:38:30 -07004906/*
4907 * FUNCTION: WDA_ProcessAddBAReq
4908 * Request to WDI to Update the ADDBA REQ params.
4909 */
4910VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
4911 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
4912{
Jeff Johnson43971f52012-07-17 12:26:56 -07004913 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 WDI_AddBAReqParamsType *wdiAddBAReqParam =
4915 (WDI_AddBAReqParamsType *)vos_mem_malloc(
4916 sizeof(WDI_AddBAReqParamsType)) ;
4917 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4919 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004920 if(NULL == wdiAddBAReqParam)
4921 {
4922 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4923 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4924 VOS_ASSERT(0);
4925 return VOS_STATUS_E_NOMEM;
4926 }
4927 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4928 if(NULL == pWdaParams)
4929 {
4930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4931 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4932 VOS_ASSERT(0);
4933 vos_mem_free(wdiAddBAReqParam);
4934 return VOS_STATUS_E_NOMEM;
4935 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004936 do
4937 {
4938 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004939 wdiAddBaInfo->ucSTAIdx = staIdx ;
4940 wdiAddBaInfo->ucBaSessionID = baSessionID ;
4941 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 } while(0) ;
4943 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004944 pWdaParams->pWdaContext = pWDA;
4945 /* store Params pass it to WDI */
4946 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
4947 pWdaParams->wdaMsgParam = pAddBAReqParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07004948 wstatus = WDI_AddBAReq(wdiAddBAReqParam,
4949 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004950
Jeff Johnson43971f52012-07-17 12:26:56 -07004951 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 {
4953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07004954 "Failure in ADD BA REQ Params WDI API, free all the memory" );
4955 status = CONVERT_WDI2VOS_STATUS(wstatus);
4956 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004957 vos_mem_free(pWdaParams);
4958 pAddBAReqParams->status = eSIR_FAILURE;
4959 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
4960 }
Jeff Johnson43971f52012-07-17 12:26:56 -07004961 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07004962}
Jeff Johnson295189b2012-06-20 16:38:30 -07004963/*
4964 * FUNCTION: WDA_AddBASessionReqCallback
4965 * send ADD BA SESSION RSP back to PE/(or TL)
4966 */
4967void WDA_AddBASessionReqCallback(
4968 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
4969{
4970 VOS_STATUS status = VOS_STATUS_SUCCESS ;
4971 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4972 tWDA_CbContext *pWDA;
4973 tAddBAParams *pAddBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004974 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4975 "<------ %s " ,__FUNCTION__);
4976 if(NULL == pWdaParams)
4977 {
4978 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4979 "%s: pWdaParams received NULL", __FUNCTION__);
4980 VOS_ASSERT(0) ;
4981 return ;
4982 }
4983 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4984 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 if( NULL == pAddBAReqParams )
4986 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4988 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
4989 VOS_ASSERT( 0 );
Jeff Johnsone7245742012-09-05 17:12:55 -07004990 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4991 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004992 return ;
4993 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004994 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4995 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004996 /*
4997 * if WDA in update TL state, update TL with BA session parama and send
4998 * another request to HAL(/WDI) (ADD_BA_REQ)
4999 */
5000
5001 if((VOS_STATUS_SUCCESS ==
5002 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
5003 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
5004 {
5005 /* Update TL with BA info received from HAL/WDI */
5006 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
5007 wdiAddBaSession->usBaSessionID,
5008 wdiAddBaSession->ucSTAIdx,
5009 wdiAddBaSession->ucBaTID,
5010 wdiAddBaSession->ucBaBufferSize,
5011 wdiAddBaSession->ucWinSize,
5012 wdiAddBaSession->usBaSSN );
Jeff Johnson295189b2012-06-20 16:38:30 -07005013 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5014 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5015 }
5016 else
5017 {
5018 pAddBAReqParams->status =
5019 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5020
5021 /* Setting Flag to indicate that Set BA is success */
5022 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5023 {
5024 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5025 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5026 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5027 }
5028 pWDA->wdaMsgParam = NULL;
5029 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005031 /*Reset the WDA state to READY */
5032 pWDA->wdaState = WDA_READY_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 return ;
5034}
5035
Jeff Johnson295189b2012-06-20 16:38:30 -07005036/*
5037 * FUNCTION: WDA_ProcessAddBASessionReq
5038 * Request to WDI to Update the ADDBA REQ params.
5039 */
5040VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5041 tAddBAParams *pAddBAReqParams)
5042{
5043 WDI_Status status = WDI_STATUS_SUCCESS ;
5044 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5045 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5046 sizeof(WDI_AddBASessionReqParamsType)) ;
5047 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5049 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005050 if(NULL == wdiAddBASessionReqParam)
5051 {
5052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5053 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5054 VOS_ASSERT(0);
5055 return VOS_STATUS_E_NOMEM;
5056 }
5057 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5058 if(NULL == pWdaParams)
5059 {
5060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5061 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5062 VOS_ASSERT(0);
5063 vos_mem_free(wdiAddBASessionReqParam);
5064 return VOS_STATUS_E_NOMEM;
5065 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005066 /*
5067 * Populate ADD BA parameters and pass these paarmeters to WDI.
5068 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5069 * the state to track if these is BA recipient case or BA initiator
5070 * case.
5071 */
5072 do
5073 {
5074 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5075 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5076 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5077 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5078 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5079 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5080 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005081 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
Jeff Johnson295189b2012-06-20 16:38:30 -07005082 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5083 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5084 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5085 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5086 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 /* check the BA direction and update state accordingly */
5088 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5089 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5090 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5091
5092 }while(0) ;
5093 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005094 pWdaParams->pWdaContext = pWDA;
5095 /* Store ADD BA pointer, as this will be used for response */
5096 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5097 /* store Params pass it to WDI */
5098 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005099 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5100 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005101 if(IS_WDI_STATUS_FAILURE(status))
5102 {
5103 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5104 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5105 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5106 vos_mem_free(pWdaParams->wdaMsgParam);
5107 vos_mem_free(pWdaParams);
5108 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005109 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005110}
Jeff Johnson295189b2012-06-20 16:38:30 -07005111/*
5112 * FUNCTION: WDA_DelBANotifyTL
5113 * send DEL BA IND to TL
5114 */
5115void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5116 tDelBAParams *pDelBAReqParams)
5117{
5118 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5119 //tSirMsgQ msg;
5120 vos_msg_t vosMsg;
5121 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005122 if(NULL == pDelBAInd)
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;
5128 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005129 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5130 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5131 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5132 pDelBAInd->mesgLen = sizeof( tDelBAInd );
Jeff Johnsone7245742012-09-05 17:12:55 -07005133
Jeff Johnson295189b2012-06-20 16:38:30 -07005134
5135 vosMsg.type = WDA_DELETEBA_IND;
5136 vosMsg.bodyptr = pDelBAInd;
5137 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5138 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5139 {
5140 vosStatus = VOS_STATUS_E_BADMSG;
5141 }
5142}
Jeff Johnson295189b2012-06-20 16:38:30 -07005143/*
5144 * FUNCTION: WDA_DelBAReqCallback
5145 * send DEL BA RSP back to PE
5146 */
5147void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5148{
5149 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5150 tWDA_CbContext *pWDA;
5151 tDelBAParams *pDelBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07005152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5153 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005154 if(NULL == pWdaParams)
5155 {
5156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5157 "%s: pWdaParams received NULL", __FUNCTION__);
5158 VOS_ASSERT(0) ;
5159 return ;
5160 }
5161 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5162 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005163 /* Notify TL about DEL BA in case of recipinet */
5164 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5165 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5166 {
5167 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5168 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005169 /*
5170 * No respone required for WDA_DELBA_IND so just free the request
5171 * param here
5172 */
5173 vos_mem_free(pDelBAReqParams);
5174 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5175 vos_mem_free(pWdaParams);
5176 return ;
5177}
5178
Jeff Johnson295189b2012-06-20 16:38:30 -07005179/*
5180 * FUNCTION: WDA_ProcessDelBAReq
5181 * Request to WDI to Update the DELBA REQ params.
5182 */
5183VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5184 tDelBAParams *pDelBAReqParams)
5185{
5186 WDI_Status status = WDI_STATUS_SUCCESS ;
5187 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5188 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5189 sizeof(WDI_DelBAReqParamsType)) ;
5190 tWDA_ReqParams *pWdaParams ;
5191 tANI_U16 staIdx = 0;
5192 tANI_U8 tid = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5194 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005195 if(NULL == wdiDelBAReqParam)
5196 {
5197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5198 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5199 VOS_ASSERT(0);
5200 return VOS_STATUS_E_NOMEM;
5201 }
5202 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5203 if(NULL == pWdaParams)
5204 {
5205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5206 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5207 VOS_ASSERT(0);
5208 vos_mem_free(wdiDelBAReqParam);
5209 return VOS_STATUS_E_NOMEM;
5210 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005211 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5212 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5213 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5214 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005215 pWdaParams->pWdaContext = pWDA;
5216 /* Store DEL BA pointer, as this will be used for response */
5217 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005218 /* store Params pass it to WDI */
5219 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5221 * maintained in WDA, so that WDA can retry for another BA session
5222 */
5223 staIdx = pDelBAReqParams->staIdx;
5224 tid = pDelBAReqParams->baTID;
5225 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
Jeff Johnson295189b2012-06-20 16:38:30 -07005226 status = WDI_DelBAReq(wdiDelBAReqParam,
5227 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005228 if(IS_WDI_STATUS_FAILURE(status))
5229 {
5230 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5231 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5232 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5233 vos_mem_free(pWdaParams->wdaMsgParam);
5234 vos_mem_free(pWdaParams);
5235 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005236 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005237}
Jeff Johnson295189b2012-06-20 16:38:30 -07005238/*
5239 * FUNCTION: WDA_AddTSReqCallback
5240 * send ADD TS RSP back to PE
5241 */
5242void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5243{
5244 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5245 tWDA_CbContext *pWDA;
5246 tAddTsParams *pAddTsReqParams;
5247
5248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5249 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005250 if(NULL == pWdaParams)
5251 {
5252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5253 "%s: pWdaParams received NULL", __FUNCTION__);
5254 VOS_ASSERT(0) ;
5255 return ;
5256 }
5257 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5258 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5259 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5260 vos_mem_free(pWdaParams);
5261
5262 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005263 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005264 return ;
5265}
5266
Jeff Johnson295189b2012-06-20 16:38:30 -07005267/*
5268 * FUNCTION: WDA_ProcessAddTSReq
5269 * Request to WDI to Update the ADD TS REQ params.
5270 */
5271VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5272 tAddTsParams *pAddTsReqParams)
5273{
5274 WDI_Status status = WDI_STATUS_SUCCESS ;
5275 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5276 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5277 sizeof(WDI_AddTSReqParamsType)) ;
5278 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005279 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5280 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 if(NULL == wdiAddTSReqParam)
5282 {
5283 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5284 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5285 VOS_ASSERT(0);
5286 return VOS_STATUS_E_NOMEM;
5287 }
5288 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5289 if(NULL == pWdaParams)
5290 {
5291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5292 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5293 VOS_ASSERT(0);
5294 vos_mem_free(wdiAddTSReqParam);
5295 return VOS_STATUS_E_NOMEM;
5296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005297 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5298 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005299 //TS IE
5300 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5301 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5302 pAddTsReqParams->tspec.length;
5303
5304 //TS IE : TS INFO : TRAFFIC
5305 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5306 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5307 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5308 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5309 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5310 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5311 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5312 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5313 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5314 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5315 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5316 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5317 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5318 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5319 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5320 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5321
5322 //TS IE : TS INFO : SCHEDULE
5323 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5324 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5325 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5326 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
Jeff Johnson295189b2012-06-20 16:38:30 -07005327 //TS IE
5328 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5329 pAddTsReqParams->tspec.nomMsduSz;
5330 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5331 pAddTsReqParams->tspec.maxMsduSz;
5332 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5333 pAddTsReqParams->tspec.minSvcInterval;
5334 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5335 pAddTsReqParams->tspec.maxSvcInterval;
5336 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5337 pAddTsReqParams->tspec.inactInterval;
5338 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5339 pAddTsReqParams->tspec.suspendInterval;
5340 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5341 pAddTsReqParams->tspec.svcStartTime;
5342 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5343 pAddTsReqParams->tspec.minDataRate;
5344 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5345 pAddTsReqParams->tspec.meanDataRate;
5346 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5347 pAddTsReqParams->tspec.peakDataRate;
5348 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5349 pAddTsReqParams->tspec.maxBurstSz;
5350 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5351 pAddTsReqParams->tspec.delayBound;
5352 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5353 pAddTsReqParams->tspec.minPhyRate;
5354 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5355 pAddTsReqParams->tspec.surplusBw;
5356 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5357 pAddTsReqParams->tspec.mediumTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07005358 /* TODO: tAddTsParams doesn't have the following fields */
5359#if 0
5360 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5361 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5362 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5363 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5364#endif
5365 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5366
5367 pWdaParams->pWdaContext = pWDA;
5368 /* Store ADD TS pointer, as this will be used for response */
5369 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005370 /* store Params pass it to WDI */
5371 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005372 status = WDI_AddTSReq(wdiAddTSReqParam,
5373 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005374 if(IS_WDI_STATUS_FAILURE(status))
5375 {
5376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5377 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5378 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5379 vos_mem_free(pWdaParams);
5380 pAddTsReqParams->status = eSIR_FAILURE ;
5381 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5382 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005383 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005384}
5385
Jeff Johnson295189b2012-06-20 16:38:30 -07005386/*
5387 * FUNCTION: WDA_DelTSReqCallback
5388 * send DEL TS RSP back to PE
5389 */
5390void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5391{
5392 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5394 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005395 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5396 vos_mem_free(pWdaParams->wdaMsgParam) ;
5397 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005398 /*
5399 * No respone required for WDA_DEL_TS_REQ so just free the request
5400 * param here
5401 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return ;
5403}
5404
Jeff Johnson295189b2012-06-20 16:38:30 -07005405/*
5406 * FUNCTION: WDA_ProcessDelTSReq
5407 * Request to WDI to Update the DELTS REQ params.
5408 */
5409VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5410 tDelTsParams *pDelTSReqParams)
5411{
5412 WDI_Status status = WDI_STATUS_SUCCESS ;
5413 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5414 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5415 sizeof(WDI_DelTSReqParamsType)) ;
5416 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5418 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005419 if(NULL == wdiDelTSReqParam)
5420 {
5421 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5422 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5423 VOS_ASSERT(0);
5424 return VOS_STATUS_E_NOMEM;
5425 }
5426 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5427 if(NULL == pWdaParams)
5428 {
5429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5430 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5431 VOS_ASSERT(0);
5432 vos_mem_free(wdiDelTSReqParam);
5433 return VOS_STATUS_E_NOMEM;
5434 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005435 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
5436 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
5437 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
5438 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
5439 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005440 pWdaParams->pWdaContext = pWDA;
5441 /* Store DEL TS pointer, as this will be used for response */
5442 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005443 /* store Params pass it to WDI */
5444 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005445 status = WDI_DelTSReq(wdiDelTSReqParam,
5446 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005447 if(IS_WDI_STATUS_FAILURE(status))
5448 {
5449 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5450 "Failure in DEL TS REQ Params WDI API, free all the memory " );
5451 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5452 vos_mem_free(pWdaParams->wdaMsgParam);
5453 vos_mem_free(pWdaParams);
5454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005455 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005456}
Jeff Johnson295189b2012-06-20 16:38:30 -07005457/*
5458 * FUNCTION: WDA_UpdateBeaconParamsCallback
5459 * Free the memory. No need to send any response to PE in this case
5460 */
5461void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
5462{
5463 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005464 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5465 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 if(NULL == pWdaParams)
5467 {
5468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5469 "%s: pWdaParams received NULL", __FUNCTION__);
5470 VOS_ASSERT(0) ;
5471 return ;
5472 }
5473 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5474 vos_mem_free(pWdaParams->wdaMsgParam) ;
5475 vos_mem_free(pWdaParams);
5476 /*
5477 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
5478 * param here
5479 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005480 return ;
5481}
Jeff Johnson295189b2012-06-20 16:38:30 -07005482/*
5483 * FUNCTION: WDA_ProcessUpdateBeaconParams
5484 * Request to WDI to send the beacon parameters to HAL to update the Hardware
5485 */
5486VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
5487 tUpdateBeaconParams *pUpdateBeaconParams)
5488{
5489 WDI_Status status = WDI_STATUS_SUCCESS ;
5490 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
5491 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
5492 sizeof(WDI_UpdateBeaconParamsType)) ;
5493 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5495 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005496 if(NULL == wdiUpdateBeaconParams)
5497 {
5498 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5499 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5500 VOS_ASSERT(0);
5501 return VOS_STATUS_E_NOMEM;
5502 }
5503 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5504 if(NULL == pWdaParams)
5505 {
5506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5507 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5508 VOS_ASSERT(0);
5509 vos_mem_free(wdiUpdateBeaconParams);
5510 return VOS_STATUS_E_NOMEM;
5511 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005512 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
5513 pUpdateBeaconParams->bssIdx;
5514 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
5515 pUpdateBeaconParams->fShortPreamble;
5516 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
5517 pUpdateBeaconParams->fShortSlotTime;
5518 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
5519 pUpdateBeaconParams->beaconInterval;
5520 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
5521 pUpdateBeaconParams->llaCoexist;
5522 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
5523 pUpdateBeaconParams->llbCoexist;
5524 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
5525 pUpdateBeaconParams->llgCoexist;
5526 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
5527 pUpdateBeaconParams->ht20MhzCoexist;
5528 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
5529 pUpdateBeaconParams->llnNonGFCoexist;
5530 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
5531 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
5532 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
5533 pUpdateBeaconParams->fRIFSMode;
5534 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
5535 pUpdateBeaconParams->paramChangeBitmap;
5536 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
5537
5538 pWdaParams->pWdaContext = pWDA;
5539 /* Store UpdateBeacon Req pointer, as this will be used for response */
5540 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005541 /* store Params pass it to WDI */
5542 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005543 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
5544 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
5545 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005546 if(IS_WDI_STATUS_FAILURE(status))
5547 {
5548 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5549 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
5550 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5551 vos_mem_free(pWdaParams->wdaMsgParam);
5552 vos_mem_free(pWdaParams);
5553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005554 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005555}
Jeff Johnson295189b2012-06-20 16:38:30 -07005556#ifdef FEATURE_WLAN_CCX
Jeff Johnson295189b2012-06-20 16:38:30 -07005557/*
5558 * FUNCTION: WDA_TSMStatsReqCallback
5559 * send TSM Stats RSP back to PE
5560 */
5561void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
5562{
5563 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5564 tWDA_CbContext *pWDA = NULL;
5565 tTSMStats *pTsmRspParams = NULL;
5566
5567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5568 "<------ Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005569 if(NULL == pWdaParams)
5570 {
5571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5572 "%s: pWdaParams received NULL", __FUNCTION__);
5573 VOS_ASSERT(0) ;
5574 return ;
5575 }
5576 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5577 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005578 if( NULL == pTsmRspParams )
5579 {
5580 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5581 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
5582 VOS_ASSERT( 0 );
5583 return ;
5584 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005585 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5586 vos_mem_free(pWdaParams);
5587
5588 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
5589 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
5590 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
5591 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
5592 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
5593 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
5594 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
5595 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
5596 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
5597 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
Jeff Johnson295189b2012-06-20 16:38:30 -07005598 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005599 return ;
5600}
5601
5602
Jeff Johnson295189b2012-06-20 16:38:30 -07005603/*
5604 * FUNCTION: WDA_ProcessTsmStatsReq
5605 * Request to WDI to get the TSM Stats params.
5606 */
5607VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
5608 tTSMStats *pTsmStats)
5609{
5610 WDI_Status status = WDI_STATUS_SUCCESS ;
5611 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
5612 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005613 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5614 "------> Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005615 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5616 {
5617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5618 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5619 VOS_ASSERT(0);
5620 return VOS_STATUS_E_FAILURE;
5621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005622 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
5623 sizeof(WDI_TSMStatsReqParamsType));
5624 if(NULL == wdiTSMReqParam)
5625 {
5626 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5627 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5628 VOS_ASSERT(0);
5629 return VOS_STATUS_E_NOMEM;
5630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005631 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5632 if(NULL == pWdaParams)
5633 {
5634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5636 VOS_ASSERT(0);
5637 vos_mem_free(wdiTSMReqParam);
5638 return VOS_STATUS_E_NOMEM;
5639 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005640 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
5641 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
5642 pTsmStats->bssId,
5643 sizeof(wpt_macAddr));
5644 wdiTSMReqParam->wdiReqStatusCB = NULL ;
5645
5646 pWdaParams->pWdaContext = pWDA;
5647 /* Store TSM Stats pointer, as this will be used for response */
5648 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005649 /* store Params pass it to WDI */
5650 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005651 status = WDI_TSMStatsReq(wdiTSMReqParam,
5652 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005653 if(IS_WDI_STATUS_FAILURE(status))
5654 {
5655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5656 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
5657 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5658 vos_mem_free(pWdaParams) ;
5659 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005660 return CONVERT_WDI2VOS_STATUS(status) ;
5661}
5662#endif
5663/*
5664 * FUNCTION: WDA_SendBeaconParamsCallback
5665 * No need to send any response to PE in this case
5666 */
5667void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
5668{
5669
Jeff Johnson295189b2012-06-20 16:38:30 -07005670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5671 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005672 return ;
5673}
Jeff Johnson295189b2012-06-20 16:38:30 -07005674/*
5675 * FUNCTION: WDA_ProcessSendBeacon
5676 * Request to WDI to send the beacon template to HAL to update the TPE memory and
5677 * start beacon trasmission
5678 */
5679VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
5680 tSendbeaconParams *pSendbeaconParams)
5681{
5682 WDI_Status status = WDI_STATUS_SUCCESS ;
5683 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005684 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5685 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005686 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
5687 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
5688 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
5689 pSendbeaconParams->beaconLength;
5690#ifdef WLAN_SOFTAP_FEATURE
5691 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
5692 pSendbeaconParams->timIeOffset;
5693#endif
5694#ifdef WLAN_FEATURE_P2P
5695 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
5696 pSendbeaconParams->p2pIeOffset;
5697#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005698 /* Copy the beacon template to local buffer */
5699 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
5700 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
5701 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
5702
Jeff Johnson295189b2012-06-20 16:38:30 -07005703 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
5704 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005705 if(IS_WDI_STATUS_FAILURE(status))
5706 {
5707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5708 "Failure in SEND BEACON REQ Params WDI API" );
5709 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005710 vos_mem_free(pSendbeaconParams);
5711 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005712}
Jeff Johnson295189b2012-06-20 16:38:30 -07005713/*
5714 * FUNCTION: WDA_UpdateProbeRspParamsCallback
5715 * No need to send any response to PE in this case
5716 */
5717void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
5718{
Jeff Johnson295189b2012-06-20 16:38:30 -07005719 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5720 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005721 return ;
5722}
5723
Jeff Johnson295189b2012-06-20 16:38:30 -07005724/*
5725 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
5726 * Request to WDI to send the probe response template to HAL to update the TPE memory and
5727 * send probe response
5728 */
5729VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
5730 tSendProbeRespParams *pSendProbeRspParams)
5731{
5732 WDI_Status status = WDI_STATUS_SUCCESS ;
5733 WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam;
5734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5735 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005736 /*Copy update probe response parameters*/
5737 vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID,
5738 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
5739 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
5740 pSendProbeRspParams->probeRespTemplateLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07005741 /* Copy the Probe Response template to local buffer */
5742 vos_mem_copy(
5743 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
5744 pSendProbeRspParams->pProbeRespTemplate,
5745 pSendProbeRspParams->probeRespTemplateLen);
5746 vos_mem_copy(
5747 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
5748 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
5749 WDI_PROBE_REQ_BITMAP_IE_LEN);
5750
5751 wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
5752
Jeff Johnson295189b2012-06-20 16:38:30 -07005753 status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam,
5754 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005755 if(IS_WDI_STATUS_FAILURE(status))
5756 {
5757 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5758 "Failure in SEND Probe RSP Params WDI API" );
5759 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005760 vos_mem_free(pSendProbeRspParams);
5761 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005762}
Jeff Johnson295189b2012-06-20 16:38:30 -07005763#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
5764/*
5765 * FUNCTION: WDA_SetMaxTxPowerCallBack
5766 * send the response to PE with power value received from WDI
5767 */
5768void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
5769 void* pUserData)
5770{
5771 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5772 tWDA_CbContext *pWDA = NULL;
5773 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
5774
5775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5776 "<------ %s " ,__FUNCTION__);
5777 if(NULL == pWdaParams)
5778 {
5779 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5780 "%s: pWdaParams received NULL", __FUNCTION__);
5781 VOS_ASSERT(0) ;
5782 return ;
5783 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005784 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5785 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005786 if( NULL == pMaxTxPowerParams )
5787 {
5788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5789 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07005790 VOS_ASSERT(0);
5791 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5792 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005793 return ;
5794 }
Jeff Johnsone7245742012-09-05 17:12:55 -07005795
Jeff Johnson295189b2012-06-20 16:38:30 -07005796
5797 /*need to free memory for the pointers used in the
5798 WDA Process.Set Max Tx Power Req function*/
Jeff Johnson295189b2012-06-20 16:38:30 -07005799 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5800 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005801 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
Jeff Johnsone7245742012-09-05 17:12:55 -07005802
Jeff Johnson295189b2012-06-20 16:38:30 -07005803
5804 /* send response to UMAC*/
5805 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
5806
5807 return;
5808}
Jeff Johnson295189b2012-06-20 16:38:30 -07005809/*
5810 * FUNCTION: WDA_SetMaxTxPowerCallBack
5811 * Request to WDI to send set Max Tx Power Request
5812 */
5813 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
5814 tMaxTxPowerParams *MaxTxPowerParams)
5815{
5816 WDI_Status status = WDI_STATUS_SUCCESS;
5817 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
5818 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5820 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005821 if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
5822 {
5823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5824 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5825 VOS_ASSERT(0);
5826 return VOS_STATUS_E_FAILURE;
5827 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005828 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
5829 sizeof(WDI_SetMaxTxPowerParamsType));
5830 if(NULL == wdiSetMaxTxPowerParams)
5831 {
5832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5833 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5834 VOS_ASSERT(0);
5835 return VOS_STATUS_E_NOMEM;
5836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5838 if(NULL == pWdaParams)
5839 {
5840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5841 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5842 vos_mem_free(wdiSetMaxTxPowerParams);
5843 VOS_ASSERT(0);
5844 return VOS_STATUS_E_NOMEM;
5845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005846 /* Copy.Max.Tx.Power Params to WDI structure */
5847 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
5848 MaxTxPowerParams->bssId,
5849 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
5851 MaxTxPowerParams->selfStaMacAddr,
5852 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005853 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
5854 MaxTxPowerParams->power;
Jeff Johnson295189b2012-06-20 16:38:30 -07005855 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005856 pWdaParams->pWdaContext = pWDA;
5857 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005858 /* store Params pass it to WDI */
5859 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005860 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
5861 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005862 if(IS_WDI_STATUS_FAILURE(status))
5863 {
5864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5865 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
5866 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5867 vos_mem_free(pWdaParams);
5868 }
5869 return CONVERT_WDI2VOS_STATUS(status);
5870
5871}
Jeff Johnson295189b2012-06-20 16:38:30 -07005872#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005873#ifdef WLAN_FEATURE_P2P
Jeff Johnson295189b2012-06-20 16:38:30 -07005874/*
5875 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
5876 * Free the memory. No need to send any response to PE in this case
5877 */
5878void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
5879{
5880 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005881 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5882 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005883 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5884 pWDA->wdaWdiApiMsgParam = NULL;
5885 vos_mem_free(pWDA->wdaMsgParam) ;
5886 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005887 /*
5888 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
5889 * so just free the request param here
5890 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005891 return ;
5892}
5893
Jeff Johnson295189b2012-06-20 16:38:30 -07005894/*
5895 * FUNCTION: WDA_ProcessSetP2PGONOAReq
5896 * Request to WDI to set the P2P Group Owner Notice of Absence Req
5897 */
5898VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
5899 tP2pPsParams *pP2pPsConfigParams)
5900{
5901 WDI_Status status = WDI_STATUS_SUCCESS ;
5902 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
5903 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
5904 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005905 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5906 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005907 if(NULL == wdiSetP2PGONOAReqParam)
5908 {
5909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5910 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5911 VOS_ASSERT(0);
5912 return VOS_STATUS_E_NOMEM;
5913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005914 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
5915 pP2pPsConfigParams->opp_ps;
5916 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
5917 pP2pPsConfigParams->ctWindow;
5918 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
5919 pP2pPsConfigParams->count;
5920 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
5921 pP2pPsConfigParams->duration;
5922 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
5923 pP2pPsConfigParams->interval;
5924 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
5925 pP2pPsConfigParams->single_noa_duration;
5926 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
5927 pP2pPsConfigParams->psSelection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005928 if((NULL != pWDA->wdaMsgParam) ||
5929 (NULL != pWDA->wdaWdiApiMsgParam))
5930 {
5931 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5932 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5933 VOS_ASSERT(0);
5934 vos_mem_free(wdiSetP2PGONOAReqParam);
5935 return VOS_STATUS_E_FAILURE;
5936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005937 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
5938 /* Store msg pointer from PE, as this will be used for response */
5939 pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005940 /* store Params pass it to WDI */
5941 pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005942 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
5943 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005944 if(IS_WDI_STATUS_FAILURE(status))
5945 {
5946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5947 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
5948 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5949 vos_mem_free(pWDA->wdaMsgParam);
5950 pWDA->wdaWdiApiMsgParam = NULL;
5951 pWDA->wdaMsgParam = NULL;
5952 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005953 return CONVERT_WDI2VOS_STATUS(status);
5954
Jeff Johnson295189b2012-06-20 16:38:30 -07005955}
5956#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005957#ifdef WLAN_FEATURE_VOWIFI_11R
5958/*
5959 * FUNCTION: WDA_AggrAddTSReqCallback
5960 * send ADD AGGREGATED TS RSP back to PE
5961 */
5962void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
5963{
5964 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
5965 tAggrAddTsParams *pAggrAddTsReqParams =
5966 (tAggrAddTsParams *)pWDA->wdaMsgParam ;
5967 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07005968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5969 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005970 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5971 pWDA->wdaWdiApiMsgParam = NULL;
5972 pWDA->wdaMsgParam = NULL;
5973
5974 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
5975 {
5976 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
5977 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005978 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 return ;
5980}/* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07005981/*
5982 * FUNCTION: WDA_ProcessAddTSReq
5983 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
5984 */
5985VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
5986 tAggrAddTsParams *pAggrAddTsReqParams)
5987{
5988 WDI_Status status = WDI_STATUS_SUCCESS ;
5989 int i;
5990 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005991 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5992 "------> %s " ,__FUNCTION__);
5993 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5994 {
5995 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5996 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5997 VOS_ASSERT(0);
5998 return VOS_STATUS_E_FAILURE;
5999 }
6000
6001 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
6002 sizeof(WDI_AggrAddTSReqParamsType)) ;
6003 if(NULL == wdiAggrAddTSReqParam)
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 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006010 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6011 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6012 pAggrAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006013 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6014 {
6015 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6016 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6017 pAggrAddTsReqParams->tspec[i].length;
Jeff Johnson295189b2012-06-20 16:38:30 -07006018 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6019 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6020 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6021 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6022 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6023 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6024 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6025 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6026 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6027 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6028 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6029 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6030 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6031 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6032 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6033 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
Jeff Johnson295189b2012-06-20 16:38:30 -07006034 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6035 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
Jeff Johnson295189b2012-06-20 16:38:30 -07006036 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6037 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6038 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6039 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6040 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6041 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6042 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6043 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6044 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6045 pAggrAddTsReqParams->tspec[i].inactInterval;
6046 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6047 pAggrAddTsReqParams->tspec[i].suspendInterval;
6048 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6049 pAggrAddTsReqParams->tspec[i].svcStartTime;
6050 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6051 pAggrAddTsReqParams->tspec[i].minDataRate;
6052 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6053 pAggrAddTsReqParams->tspec[i].meanDataRate;
6054 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6055 pAggrAddTsReqParams->tspec[i].peakDataRate;
6056 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6057 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6058 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6059 pAggrAddTsReqParams->tspec[i].delayBound;
6060 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6061 pAggrAddTsReqParams->tspec[i].minPhyRate;
6062 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6063 pAggrAddTsReqParams->tspec[i].surplusBw;
6064 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6065 pAggrAddTsReqParams->tspec[i].mediumTime;
6066 }
6067
6068 /* TODO: tAggrAddTsParams doesn't have the following fields */
6069#if 0
6070 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6071 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6072 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6073 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6074#endif
6075 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6076
6077 /* Store ADD TS pointer, as this will be used for response */
6078 pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006079 /* store Params pass it to WDI */
6080 pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006081 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
6082 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006083 if(IS_WDI_STATUS_FAILURE(status))
6084 {
6085 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6086 "Failure in ADD TS REQ Params WDI API, free all the memory " );
6087 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6088 vos_mem_free(pWDA->wdaMsgParam);
6089 pWDA->wdaWdiApiMsgParam = NULL;
6090 pWDA->wdaMsgParam = NULL;
6091 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006092 return CONVERT_WDI2VOS_STATUS(status) ;
6093}
6094#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006095/*
6096 * FUNCTION: WDA_EnterImpsReqCallback
6097 * send Enter IMPS RSP back to PE
6098 */
6099void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6100{
6101 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006102 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6103 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006104 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006105 return ;
6106}
Jeff Johnson295189b2012-06-20 16:38:30 -07006107/*
6108 * FUNCTION: WDA_ProcessEnterImpsReq
6109 * Request to WDI to Enter IMPS power state.
6110 */
6111VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6112{
6113 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6115 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006116 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006117 if(IS_WDI_STATUS_FAILURE(status))
6118 {
6119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6120 "Failure in Enter IMPS REQ WDI API, free all the memory " );
6121 pWDA->wdaWdiApiMsgParam = NULL;
6122 pWDA->wdaMsgParam = NULL;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006123 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006125 return CONVERT_WDI2VOS_STATUS(status) ;
6126}
Jeff Johnson295189b2012-06-20 16:38:30 -07006127/*
6128 * FUNCTION: WDA_ExitImpsReqCallback
6129 * send Exit IMPS RSP back to PE
6130 */
6131void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6132{
6133 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006134 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6135 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006136 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006137 return ;
6138}
Jeff Johnson295189b2012-06-20 16:38:30 -07006139/*
6140 * FUNCTION: WDA_ProcessExitImpsReq
6141 * Request to WDI to Exit IMPS power state.
6142 */
6143VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6144{
6145 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006146 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6147 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006148 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006149 if(IS_WDI_STATUS_FAILURE(status))
6150 {
6151 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6152 "Failure in Exit IMPS REQ WDI API, free all the memory " );
6153 pWDA->wdaWdiApiMsgParam = NULL;
6154 pWDA->wdaMsgParam = NULL;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006155 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006156 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006157 return CONVERT_WDI2VOS_STATUS(status) ;
6158}
Jeff Johnson295189b2012-06-20 16:38:30 -07006159/*
6160 * FUNCTION: WDA_EnterBmpsReqCallback
6161 * send Enter BMPS RSP back to PE
6162 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006163void WDA_EnterBmpsReqCallback(WDI_EnterBmpsRspParamsType *pwdiEnterBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006164{
6165 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6166 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006167 tEnterBmpsParams *pEnterBmpsRspParams;
6168
Jeff Johnson295189b2012-06-20 16:38:30 -07006169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6170 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006171 if(NULL == pWdaParams)
6172 {
6173 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6174 "%s: pWdaParams received NULL", __FUNCTION__);
6175 VOS_ASSERT(0) ;
6176 return ;
6177 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006178
6179 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6180 pEnterBmpsRspParams = (tEnterBmpsParams *)pWdaParams->wdaMsgParam;
6181
6182 pEnterBmpsRspParams->bssIdx = pwdiEnterBmpsRsp->bssIdx;
6183 pEnterBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterBmpsRsp->wdiStatus);
6184
6185 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006186 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006187 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, (void *)pEnterBmpsRspParams , 0);
6188
Jeff Johnson295189b2012-06-20 16:38:30 -07006189 return ;
6190}
Jeff Johnson295189b2012-06-20 16:38:30 -07006191/*
6192 * FUNCTION: WDA_ProcessEnterBmpsReq
6193 * Request to WDI to Enter BMPS power state.
6194 */
6195VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6196 tEnterBmpsParams *pEnterBmpsReqParams)
6197{
6198 WDI_Status status = WDI_STATUS_SUCCESS;
6199 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6200 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006201 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6202 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006203 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6204 {
6205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6206 "%s: invalid param", __FUNCTION__);
6207 VOS_ASSERT(0);
6208 return VOS_STATUS_E_FAILURE;
6209 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006210 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6211 if (NULL == wdiEnterBmpsReqParams)
6212 {
6213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6214 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6215 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006216 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6217 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006218 return VOS_STATUS_E_NOMEM;
6219 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006220 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6221 if (NULL == pWdaParams)
6222 {
6223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6224 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6225 VOS_ASSERT(0);
6226 vos_mem_free(wdiEnterBmpsReqParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006227 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6228 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006229 return VOS_STATUS_E_NOMEM;
6230 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006231 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6232 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6233 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6234 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
Jeff Johnson295189b2012-06-20 16:38:30 -07006235 // For CCX and 11R Roaming
6236 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6237 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6238 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6239 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006240
Jeff Johnson295189b2012-06-20 16:38:30 -07006241 /* Store param pointer as passed in by caller */
6242 /* store Params pass it to WDI */
6243 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006244 pWdaParams->wdaMsgParam = pEnterBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006245 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006246 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6247 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006248 if (IS_WDI_STATUS_FAILURE(status))
6249 {
6250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6251 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6252 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6253 vos_mem_free(pWdaParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006254 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006255 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006256 return CONVERT_WDI2VOS_STATUS(status);
6257}
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006258
6259
6260static void WDA_SendExitBmpsRsp(tWDA_CbContext *pWDA,
6261 WDI_Status wdiStatus,
6262 tExitBmpsParams *pExitBmpsReqParams)
6263{
6264 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
6265
6266 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
6267}
6268
6269
Jeff Johnson295189b2012-06-20 16:38:30 -07006270/*
6271 * FUNCTION: WDA_ExitBmpsReqCallback
6272 * send Exit BMPS RSP back to PE
6273 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006274void WDA_ExitBmpsReqCallback(WDI_ExitBmpsRspParamsType *pwdiExitBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006275{
6276 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6277 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006278 tExitBmpsParams *pExitBmpsRspParams;
6279
Jeff Johnson295189b2012-06-20 16:38:30 -07006280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6281 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006282 if(NULL == pWdaParams)
6283 {
6284 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6285 "%s: pWdaParams received NULL", __FUNCTION__);
6286 VOS_ASSERT(0) ;
6287 return ;
6288 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006289
6290 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6291 pExitBmpsRspParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam;
6292
6293 pExitBmpsRspParams->bssIdx = pwdiExitBmpsRsp->bssIdx;
6294 pExitBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitBmpsRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006295
Jeff Johnson295189b2012-06-20 16:38:30 -07006296 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6297 vos_mem_free(pWdaParams) ;
6298
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006299 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006300 return ;
6301}
Jeff Johnson295189b2012-06-20 16:38:30 -07006302/*
6303 * FUNCTION: WDA_ProcessExitBmpsReq
6304 * Request to WDI to Exit BMPS power state.
6305 */
6306VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
6307 tExitBmpsParams *pExitBmpsReqParams)
6308{
6309 WDI_Status status = WDI_STATUS_SUCCESS ;
6310 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
6311 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
6312 sizeof(WDI_ExitBmpsReqParamsType)) ;
6313 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006314 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6315 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006316 if(NULL == wdiExitBmpsReqParams)
6317 {
6318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6319 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6320 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006321 WDA_SendExitBmpsRsp(pWDA, WDI_STATUS_MEM_FAILURE, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006322 return VOS_STATUS_E_NOMEM;
6323 }
6324 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6325 if(NULL == pWdaParams)
6326 {
6327 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6328 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6329 VOS_ASSERT(0);
6330 vos_mem_free(wdiExitBmpsReqParams);
6331 return VOS_STATUS_E_NOMEM;
6332 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006333 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
Jeff Johnsone7245742012-09-05 17:12:55 -07006334
6335 wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
6336
Jeff Johnson295189b2012-06-20 16:38:30 -07006337 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
6338
6339 /* Store param pointer as passed in by caller */
6340 /* store Params pass it to WDI */
6341 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
6342 pWdaParams->pWdaContext = pWDA;
6343 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006344 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
6345 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006346 if(IS_WDI_STATUS_FAILURE(status))
6347 {
6348 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6349 "Failure in Exit BMPS REQ WDI API, free all the memory " );
6350 vos_mem_free(pWdaParams->wdaMsgParam) ;
6351 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6352 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006353 WDA_SendExitBmpsRsp(pWDA, status, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006354 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006355 return CONVERT_WDI2VOS_STATUS(status) ;
6356}
Jeff Johnson295189b2012-06-20 16:38:30 -07006357/*
6358 * FUNCTION: WDA_EnterUapsdReqCallback
6359 * send Enter UAPSD RSP back to PE
6360 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006361void WDA_EnterUapsdReqCallback( WDI_EnterUapsdRspParamsType *pwdiEnterUapsdRspParams, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006362{
6363 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6364 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006365 tUapsdParams *pEnterUapsdRsqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006366 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6367 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006368 if(NULL == pWdaParams)
6369 {
6370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6371 "%s: pWdaParams received NULL", __FUNCTION__);
6372 VOS_ASSERT(0) ;
6373 return ;
6374 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006375
6376 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6377 pEnterUapsdRsqParams = (tUapsdParams *)pWdaParams->wdaMsgParam;
6378
6379 pEnterUapsdRsqParams->bssIdx = pwdiEnterUapsdRspParams->bssIdx;
6380 pEnterUapsdRsqParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterUapsdRspParams->wdiStatus);
6381
Jeff Johnson295189b2012-06-20 16:38:30 -07006382 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6383 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006384 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdRsqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006385 return ;
6386}
Jeff Johnson295189b2012-06-20 16:38:30 -07006387/*
6388 * FUNCTION: WDA_ProcessEnterUapsdReq
6389 * Request to WDI to Enter UAPSD power state.
6390 */
6391VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
6392 tUapsdParams *pEnterUapsdReqParams)
6393{
6394 WDI_Status status = WDI_STATUS_SUCCESS ;
6395 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
6396 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
6397 sizeof(WDI_EnterUapsdReqParamsType)) ;
6398 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6400 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006401 if(NULL == wdiEnterUapsdReqParams)
6402 {
6403 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6404 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6405 VOS_ASSERT(0);
6406 return VOS_STATUS_E_NOMEM;
6407 }
6408 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6409 if(NULL == pWdaParams)
6410 {
6411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6412 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6413 VOS_ASSERT(0);
6414 vos_mem_free(wdiEnterUapsdReqParams);
6415 return VOS_STATUS_E_NOMEM;
6416 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006417 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
6418 pEnterUapsdReqParams->beDeliveryEnabled;
6419 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
6420 pEnterUapsdReqParams->beTriggerEnabled;
6421 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
6422 pEnterUapsdReqParams->bkDeliveryEnabled;
6423 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
6424 pEnterUapsdReqParams->bkTriggerEnabled;
6425 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
6426 pEnterUapsdReqParams->viDeliveryEnabled;
6427 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
6428 pEnterUapsdReqParams->viTriggerEnabled;
6429 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
6430 pEnterUapsdReqParams->voDeliveryEnabled;
6431 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
6432 pEnterUapsdReqParams->voTriggerEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07006433 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006434
6435 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
6436
Jeff Johnson295189b2012-06-20 16:38:30 -07006437 /* Store param pointer as passed in by caller */
6438 /* store Params pass it to WDI */
6439 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
6440 pWdaParams->pWdaContext = pWDA;
6441 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006442 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
6443 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006444 if(IS_WDI_STATUS_FAILURE(status))
6445 {
6446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6447 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
6448 vos_mem_free(pWdaParams->wdaMsgParam) ;
6449 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6450 vos_mem_free(pWdaParams) ;
6451 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006452 return CONVERT_WDI2VOS_STATUS(status) ;
6453}
Jeff Johnson295189b2012-06-20 16:38:30 -07006454/*
6455 * FUNCTION: WDA_ExitUapsdReqCallback
6456 * send Exit UAPSD RSP back to PE
6457 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006458void WDA_ExitUapsdReqCallback(WDI_ExitUapsdRspParamsType *pwdiExitRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006459{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006460
6461 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6462 tWDA_CbContext *pWDA;
6463 tExitUapsdParams *pExitUapsdRspParams;
6464
Jeff Johnson295189b2012-06-20 16:38:30 -07006465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6466 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006467 if(NULL == pWdaParams)
6468 {
6469 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6470 "%s: pWdaParams received NULL", __FUNCTION__);
6471 VOS_ASSERT(0);
6472 return;
6473 }
6474
6475 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6476 pExitUapsdRspParams = (tExitUapsdParams *)pWdaParams->wdaMsgParam;
6477
6478 pExitUapsdRspParams->bssIdx = pwdiExitRspParam->bssIdx;
6479 pExitUapsdRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitRspParam->wdiStatus);
6480
6481 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6482 vos_mem_free(pWdaParams) ;
6483
6484 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, (void *)pExitUapsdRspParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006485 return ;
6486}
Jeff Johnson295189b2012-06-20 16:38:30 -07006487/*
6488 * FUNCTION: WDA_ProcessExitUapsdReq
6489 * Request to WDI to Exit UAPSD power state.
6490 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006491VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA,
6492 tExitUapsdParams *pExitUapsdParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07006493{
6494 WDI_Status status = WDI_STATUS_SUCCESS ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006495 tWDA_ReqParams *pWdaParams ;
6496 WDI_ExitUapsdReqParamsType *wdiExitUapsdReqParams =
6497 (WDI_ExitUapsdReqParamsType *)vos_mem_malloc(
6498 sizeof(WDI_ExitUapsdReqParamsType)) ;
6499
Jeff Johnson295189b2012-06-20 16:38:30 -07006500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6501 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006502
6503 if(NULL == wdiExitUapsdReqParams)
6504 {
6505 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6506 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6507 VOS_ASSERT(0);
6508 return VOS_STATUS_E_NOMEM;
6509 }
6510 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6511 if(NULL == pWdaParams)
6512 {
6513 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6514 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6515 VOS_ASSERT(0);
6516 vos_mem_free(wdiExitUapsdReqParams);
6517 return VOS_STATUS_E_NOMEM;
6518 }
6519
6520 wdiExitUapsdReqParams->wdiExitUapsdInfo.bssIdx = pExitUapsdParams->bssIdx;
6521 wdiExitUapsdReqParams->wdiReqStatusCB = NULL;
6522
6523 /* Store param pointer as passed in by caller */
6524 /* store Params pass it to WDI */
6525 pWdaParams->wdaWdiApiMsgParam = wdiExitUapsdReqParams;
6526 pWdaParams->pWdaContext = pWDA;
6527 pWdaParams->wdaMsgParam = pExitUapsdParams;
6528
6529 status = WDI_ExitUapsdReq(wdiExitUapsdReqParams, (WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006530 if(IS_WDI_STATUS_FAILURE(status))
6531 {
6532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6533 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006534 vos_mem_free(pWdaParams->wdaMsgParam) ;
6535 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6536 vos_mem_free(pWdaParams) ;
6537
Jeff Johnson295189b2012-06-20 16:38:30 -07006538 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006539 return CONVERT_WDI2VOS_STATUS(status) ;
6540}
6541
Jeff Johnson295189b2012-06-20 16:38:30 -07006542/*
6543 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
6544 *
6545 */
6546void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
6547{
6548 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6550 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006551 if(NULL == pWdaParams)
6552 {
6553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6554 "%s: pWdaParams received NULL", __FUNCTION__);
6555 VOS_ASSERT(0) ;
6556 return ;
6557 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006558 if( pWdaParams != NULL )
6559 {
6560 if( pWdaParams->wdaWdiApiMsgParam != NULL )
6561 {
6562 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6563 }
6564 if( pWdaParams->wdaMsgParam != NULL )
6565 {
6566 vos_mem_free(pWdaParams->wdaMsgParam) ;
6567 }
6568 vos_mem_free(pWdaParams) ;
6569 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006570 return ;
6571}
Jeff Johnson295189b2012-06-20 16:38:30 -07006572/*
6573 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
6574 * Request to WDI to set the power save params at start.
6575 */
6576VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
6577 tSirPowerSaveCfg *pPowerSaveCfg)
6578{
6579 WDI_Status status = WDI_STATUS_SUCCESS ;
6580 tHalCfg *tlvStruct = NULL ;
6581 tANI_U8 *tlvStructStart = NULL ;
6582 v_PVOID_t *configParam;
6583 tANI_U32 configParamSize;
6584 tANI_U32 *configDataValue;
6585 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
6586 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6588 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006589 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
6590 {
6591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6592 "%s: invalid param", __FUNCTION__);
6593 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07006594 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006595 return VOS_STATUS_E_FAILURE;
6596 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006597 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
6598 if (NULL == wdiPowerSaveCfg)
6599 {
6600 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6601 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6602 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07006603 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006604 return VOS_STATUS_E_NOMEM;
6605 }
6606 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6607 if(NULL == pWdaParams)
6608 {
6609 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6610 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6611 VOS_ASSERT(0);
6612 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006613 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006614 return VOS_STATUS_E_NOMEM;
6615 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006616 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
6617 configParam = vos_mem_malloc(configParamSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07006618 if(NULL == configParam)
6619 {
6620 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6621 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07006622 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006623 vos_mem_free(pWdaParams);
6624 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006625 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006626 return VOS_STATUS_E_NOMEM;
6627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006628 vos_mem_set(configParam, configParamSize, 0);
6629 wdiPowerSaveCfg->pConfigBuffer = configParam;
6630 tlvStruct = (tHalCfg *)configParam;
6631 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006632 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
6633 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
6634 tlvStruct->length = sizeof(tANI_U32);
6635 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6636 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006637 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6638 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006639 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
6640 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
6641 tlvStruct->length = sizeof(tANI_U32);
6642 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6643 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07006644 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6645 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006646 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
6647 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
6648 tlvStruct->length = sizeof(tANI_U32);
6649 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6650 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
Jeff Johnson295189b2012-06-20 16:38:30 -07006651 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6652 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006653 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
6654 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
6655 tlvStruct->length = sizeof(tANI_U32);
6656 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6657 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07006658 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6659 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006660 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
6661 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
6662 tlvStruct->length = sizeof(tANI_U32);
6663 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6664 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
Jeff Johnson295189b2012-06-20 16:38:30 -07006665 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6666 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006667 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
6668 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
6669 tlvStruct->length = sizeof(tANI_U32);
6670 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6671 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07006672 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6673 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006674 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
6675 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
6676 tlvStruct->length = sizeof(tANI_U32);
6677 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6678 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006679 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6680 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006681 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
6682 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
6683 tlvStruct->length = sizeof(tANI_U32);
6684 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6685 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
6686 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6687 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006688 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
6689 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
6690 tlvStruct->length = sizeof(tANI_U32);
6691 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6692 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
6693 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6694 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006695 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
6696 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
6697 tlvStruct->length = sizeof(tANI_U32);
6698 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6699 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
Jeff Johnson295189b2012-06-20 16:38:30 -07006700 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6701 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006702 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
6703 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
6704 tlvStruct->length = sizeof(tANI_U32);
6705 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6706 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -07006707 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6708 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006709 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006710 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006711 /* store Params pass it to WDI */
6712 pWdaParams->wdaMsgParam = configParam;
6713 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
6714 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006715 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
6716 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006717 if(IS_WDI_STATUS_FAILURE(status))
6718 {
6719 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6720 "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " );
6721 vos_mem_free(pWdaParams->wdaMsgParam);
6722 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6723 vos_mem_free(pWdaParams);
6724 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006725 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006726 return CONVERT_WDI2VOS_STATUS(status);
6727}
Jeff Johnson295189b2012-06-20 16:38:30 -07006728/*
6729 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
6730 *
6731 */
6732void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
6733{
6734 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006735 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6736 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006737 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6738 vos_mem_free(pWdaParams);
6739
Jeff Johnson295189b2012-06-20 16:38:30 -07006740 return ;
6741}
Jeff Johnson295189b2012-06-20 16:38:30 -07006742/*
6743 * FUNCTION: WDA_SetUapsdAcParamsReq
6744 * Request to WDI to set the UAPSD params for an ac (sta mode).
6745 */
6746VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
6747 tUapsdInfo *pUapsdInfo)
6748{
6749 WDI_Status status = WDI_STATUS_SUCCESS;
6750 tWDA_CbContext *pWDA = NULL ;
6751 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
6752 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
6753 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
6754 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006755 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6756 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006757 if(NULL == wdiUapsdParams)
6758 {
6759 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6760 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6761 VOS_ASSERT(0);
6762 return VOS_STATUS_E_NOMEM;
6763 }
6764 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6765 if(NULL == pWdaParams)
6766 {
6767 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6768 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6769 VOS_ASSERT(0);
6770 vos_mem_free(wdiUapsdParams);
6771 return VOS_STATUS_E_NOMEM;
6772 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006773 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
6774 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
6775 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
6776 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
6777 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
6778 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
Jeff Johnson295189b2012-06-20 16:38:30 -07006779 wdiUapsdParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006780 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07006781 pWdaParams->pWdaContext = pWDA;
6782 /* Store param pointer as passed in by caller */
6783 pWdaParams->wdaMsgParam = pUapsdInfo;
6784 /* store Params pass it to WDI */
6785 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006786 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
6787 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
6788 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006789 if(IS_WDI_STATUS_FAILURE(status))
6790 {
6791 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6792 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
6793 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6794 vos_mem_free(pWdaParams);
6795 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006796 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
6797 return VOS_STATUS_SUCCESS;
6798 else
6799 return VOS_STATUS_E_FAILURE;
6800
Jeff Johnson295189b2012-06-20 16:38:30 -07006801}
6802/*
6803 * FUNCTION: WDA_ClearUapsdAcParamsReq
6804 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
6805 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
6806 * and again enter the UPASD with the modified params. Hence the disable
6807 * function was kept empty.
6808 *
6809 */
6810VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
6811{
6812 /* do nothing */
6813 return VOS_STATUS_SUCCESS;
6814}
Jeff Johnson295189b2012-06-20 16:38:30 -07006815/*
6816 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
6817 *
6818 */
6819void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
6820{
6821 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006822 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6823 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006824 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6825 pWDA->wdaWdiApiMsgParam = NULL;
6826 pWDA->wdaMsgParam = NULL;
6827
Jeff Johnson295189b2012-06-20 16:38:30 -07006828 //print a msg, nothing else to do
6829 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6830 "WDA_UpdateUapsdParamsReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006831 return ;
6832}
Jeff Johnson295189b2012-06-20 16:38:30 -07006833/*
6834 * FUNCTION: WDA_UpdateUapsdParamsReq
6835 * Request to WDI to update UAPSD params (in softAP mode) for a station.
6836 */
6837VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
6838 tUpdateUapsdParams* pUpdateUapsdInfo)
6839{
6840 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006841 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006842 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
6843 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
6844 sizeof(WDI_UpdateUapsdReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6846 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006847 if(NULL == wdiUpdateUapsdParams)
6848 {
6849 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6850 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6851 VOS_ASSERT(0);
6852 return VOS_STATUS_E_NOMEM;
6853 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006854 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
6855 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
6856 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07006857 if((NULL != pWDA->wdaMsgParam) ||
6858 (NULL != pWDA->wdaWdiApiMsgParam))
6859 {
6860 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6861 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6862 vos_mem_free(wdiUpdateUapsdParams);
6863 VOS_ASSERT(0);
6864 return VOS_STATUS_E_FAILURE;
6865 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006866 /* Store param pointer as passed in by caller */
6867 pWDA->wdaMsgParam = pUpdateUapsdInfo;
6868 /* store Params pass it to WDI */
6869 pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006870 wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
6871 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006872
Jeff Johnson43971f52012-07-17 12:26:56 -07006873 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006874 {
6875 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6876 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006877 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006878 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6879 vos_mem_free(pWDA->wdaMsgParam);
6880 pWDA->wdaWdiApiMsgParam = NULL;
6881 pWDA->wdaMsgParam = NULL;
6882 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006883 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006884}
Jeff Johnson295189b2012-06-20 16:38:30 -07006885/*
6886 * FUNCTION: WDA_ConfigureRxpFilterCallback
6887 *
6888 */
6889void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
6890{
6891 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006892 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6893 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006894 if(WDI_STATUS_SUCCESS != wdiStatus)
6895 {
6896 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6897 "%s: RXP config filter failure \n", __FUNCTION__ );
6898 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006899 if(NULL == pWdaParams)
6900 {
6901 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6902 "%s: pWdaParams received NULL", __FUNCTION__);
6903 VOS_ASSERT(0) ;
6904 return ;
6905 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006906 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6907 vos_mem_free(pWdaParams->wdaMsgParam);
6908 vos_mem_free(pWdaParams);
6909 return ;
6910}
Jeff Johnson295189b2012-06-20 16:38:30 -07006911/*
6912 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
6913 *
6914 */
6915VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
6916 tSirWlanSetRxpFilters *pWlanSuspendParam)
6917{
Jeff Johnson295189b2012-06-20 16:38:30 -07006918 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006919 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006920 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
6921 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
6922 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
6923 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006924 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6925 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006926 if(NULL == wdiRxpFilterParams)
6927 {
6928 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6929 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6930 VOS_ASSERT(0);
6931 vos_mem_free(pWlanSuspendParam);
6932 return VOS_STATUS_E_NOMEM;
6933 }
6934 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6935 if(NULL == pWdaParams)
6936 {
6937 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6938 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6939 VOS_ASSERT(0);
6940 vos_mem_free(wdiRxpFilterParams);
6941 vos_mem_free(pWlanSuspendParam);
6942 return VOS_STATUS_E_NOMEM;
6943 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006944 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
6945 pWlanSuspendParam->setMcstBcstFilter;
6946 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
6947 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6948
6949 wdiRxpFilterParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006950 pWdaParams->pWdaContext = pWDA;
6951 pWdaParams->wdaMsgParam = pWlanSuspendParam;
6952 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006953 wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07006954 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
6955 pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07006956 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006957 {
6958 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6959 "Failure in configure RXP filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006960 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006961 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6962 vos_mem_free(pWdaParams->wdaMsgParam);
6963 vos_mem_free(pWdaParams);
6964 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006965 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006966}
Jeff Johnson295189b2012-06-20 16:38:30 -07006967/*
6968 * FUNCTION: WDA_WdiIndicationCallback
6969 *
6970 */
6971void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
6972 void* pUserData)
6973{
6974 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6975 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006976}
Jeff Johnson295189b2012-06-20 16:38:30 -07006977/*
6978 * FUNCTION: WDA_ProcessWlanSuspendInd
6979 *
6980 */
6981VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
6982 tSirWlanSuspendParam *pWlanSuspendParam)
6983{
6984 WDI_Status wdiStatus;
6985 WDI_SuspendParamsType wdiSuspendParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6987 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006988 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
6989 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6990 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
6991 wdiSuspendParams.pUserData = pWDA;
6992 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
Jeff Johnson295189b2012-06-20 16:38:30 -07006993 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
6994 if(WDI_STATUS_PENDING == wdiStatus)
6995 {
6996 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6997 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006998 }
6999 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
7000 {
7001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7002 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
7003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007004 vos_mem_free(pWlanSuspendParam);
7005 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7006}
7007
Jeff Johnson295189b2012-06-20 16:38:30 -07007008/*
7009 * FUNCTION: WDA_ProcessWlanResumeCallback
7010 *
7011 */
7012void WDA_ProcessWlanResumeCallback(
7013 WDI_SuspendResumeRspParamsType *resumeRspParams,
7014 void* pUserData)
7015{
7016 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007017 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7018 "<------ %s " ,__FUNCTION__);
7019 if(NULL == pWdaParams)
7020 {
7021 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7022 "%s: pWdaParams received NULL", __FUNCTION__);
7023 VOS_ASSERT(0) ;
7024 return ;
7025 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007026 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
7027 {
7028 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7029 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
7030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007031 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7032 vos_mem_free(pWdaParams->wdaMsgParam);
7033 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007034 return ;
7035}
Jeff Johnson295189b2012-06-20 16:38:30 -07007036/*
7037 * FUNCTION: WDA_ProcessWlanResumeReq
7038 *
7039 */
7040VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
7041 tSirWlanResumeParam *pWlanResumeParam)
7042{
7043 WDI_Status wdiStatus;
7044 WDI_ResumeParamsType *wdiResumeParams =
7045 (WDI_ResumeParamsType *)vos_mem_malloc(
7046 sizeof(WDI_ResumeParamsType) ) ;
7047 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7049 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007050 if(NULL == wdiResumeParams)
7051 {
7052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7053 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7054 VOS_ASSERT(0);
7055 return VOS_STATUS_E_NOMEM;
7056 }
7057 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7058 if(NULL == pWdaParams)
7059 {
7060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7061 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7062 VOS_ASSERT(0);
7063 vos_mem_free(wdiResumeParams);
7064 return VOS_STATUS_E_NOMEM;
7065 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007066 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
7067 pWlanResumeParam->configuredMcstBcstFilterSetting;
Jeff Johnson295189b2012-06-20 16:38:30 -07007068 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
7069 wdiResumeParams->wdiReqStatusCB = NULL;
7070 pWdaParams->wdaMsgParam = pWlanResumeParam;
7071 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
7072 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07007073 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
7074 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
7075 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007076 if(IS_WDI_STATUS_FAILURE(wdiStatus))
7077 {
7078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7079 "Failure in Host Resume REQ WDI API, free all the memory " );
7080 VOS_ASSERT(0);
7081 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7082 vos_mem_free(pWdaParams->wdaMsgParam);
7083 vos_mem_free(pWdaParams);
7084 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007085 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7086}
7087
Jeff Johnson295189b2012-06-20 16:38:30 -07007088/*
7089 * FUNCTION: WDA_SetBeaconFilterReqCallback
7090 *
7091 */
7092void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7093{
7094 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7096 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007097 if(NULL == pWdaParams)
7098 {
7099 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7100 "%s: pWdaParams received NULL", __FUNCTION__);
7101 VOS_ASSERT(0) ;
7102 return ;
7103 }
7104
7105 vos_mem_free(pWdaParams->wdaMsgParam) ;
7106 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7107 vos_mem_free(pWdaParams) ;
7108 /*
7109 * No respone required for SetBeaconFilter req so just free the request
7110 * param here
7111 */
7112
Jeff Johnson295189b2012-06-20 16:38:30 -07007113 return ;
7114}
Jeff Johnson295189b2012-06-20 16:38:30 -07007115/*
7116 * FUNCTION: WDA_SetBeaconFilterReq
7117 * Request to WDI to send the beacon filtering related information.
7118 */
7119VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7120 tBeaconFilterMsg* pBeaconFilterInfo)
7121{
7122 WDI_Status status = WDI_STATUS_SUCCESS;
7123 tANI_U8 *dstPtr, *srcPtr;
7124 tANI_U8 filterLength;
7125 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7126 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7127 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7128 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007129 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7130 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007131 if(NULL == wdiBeaconFilterInfo)
7132 {
7133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7134 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7135 VOS_ASSERT(0);
7136 return VOS_STATUS_E_NOMEM;
7137 }
7138 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7139 if(NULL == pWdaParams)
7140 {
7141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7142 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7143 VOS_ASSERT(0);
7144 vos_mem_free(wdiBeaconFilterInfo);
7145 return VOS_STATUS_E_NOMEM;
7146 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007147 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7148 pBeaconFilterInfo->beaconInterval;
7149 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7150 pBeaconFilterInfo->capabilityInfo;
7151 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7152 pBeaconFilterInfo->capabilityMask;
7153 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -07007154
7155 //Fill the BssIdx
7156 wdiBeaconFilterInfo->wdiBeaconFilterInfo.bssIdx = pBeaconFilterInfo->bssIdx;
7157
Jeff Johnson295189b2012-06-20 16:38:30 -07007158 //Fill structure with info contained in the beaconFilterTable
7159 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7160 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7161 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7162 if(WDI_BEACON_FILTER_LEN < filterLength)
7163 {
7164 filterLength = WDI_BEACON_FILTER_LEN;
7165 }
7166 vos_mem_copy(dstPtr, srcPtr, filterLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07007167 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7168 /* Store param pointer as passed in by caller */
7169 /* store Params pass it to WDI */
7170 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7171 pWdaParams->pWdaContext = pWDA;
7172 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7173
Jeff Johnson295189b2012-06-20 16:38:30 -07007174 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7175 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007176 if(IS_WDI_STATUS_FAILURE(status))
7177 {
7178 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7179 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7180 vos_mem_free(pWdaParams->wdaMsgParam) ;
7181 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7182 vos_mem_free(pWdaParams) ;
7183 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007184 return CONVERT_WDI2VOS_STATUS(status) ;
7185}
Jeff Johnson295189b2012-06-20 16:38:30 -07007186/*
7187 * FUNCTION: WDA_RemBeaconFilterReqCallback
7188 *
7189 */
7190void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7191{
7192 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7194 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007195 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7196 pWDA->wdaWdiApiMsgParam = NULL;
7197 pWDA->wdaMsgParam = NULL;
7198
Jeff Johnson295189b2012-06-20 16:38:30 -07007199 //print a msg, nothing else to do
7200 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7201 "WDA_RemBeaconFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007202 return ;
7203}
Jeff Johnson295189b2012-06-20 16:38:30 -07007204 // TODO: PE does not have this feature for now implemented,
7205 // but the support for removing beacon filter exists between
7206 // HAL and FW. This function can be called whenever PE defines
7207 // a new message for beacon filter removal
Jeff Johnson295189b2012-06-20 16:38:30 -07007208/*
7209 * FUNCTION: WDA_RemBeaconFilterReq
7210 * Request to WDI to send the removal of beacon filtering related information.
7211 */
7212VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
7213 tRemBeaconFilterMsg* pBeaconFilterInfo)
7214{
7215 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007216 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007217 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
7218 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
7219 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007220 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7221 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007222 if(NULL == wdiBeaconFilterInfo)
7223 {
7224 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7225 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7226 VOS_ASSERT(0);
7227 return VOS_STATUS_E_NOMEM;
7228 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007229 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
7230 pBeaconFilterInfo->ucIeCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07007231 //Fill structure with info contained in the ucRemIeId
7232 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
7233 pBeaconFilterInfo->ucRemIeId,
7234 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
7235 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007236 if((NULL != pWDA->wdaMsgParam) ||
7237 (NULL != pWDA->wdaWdiApiMsgParam))
7238 {
7239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7240 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7241 vos_mem_free(wdiBeaconFilterInfo);
7242 VOS_ASSERT(0);
7243 return VOS_STATUS_E_FAILURE;
7244 }
7245
7246 /* Store param pointer as passed in by caller */
7247 pWDA->wdaMsgParam = pBeaconFilterInfo;
7248 /* store Params pass it to WDI */
7249 pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
Jeff Johnson43971f52012-07-17 12:26:56 -07007250 wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007251 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007252 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007253 {
7254 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7255 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007256 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007257 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7258 vos_mem_free(pWDA->wdaMsgParam);
7259 pWDA->wdaWdiApiMsgParam = NULL;
7260 pWDA->wdaMsgParam = NULL;
7261 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007262 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007263}
Jeff Johnson295189b2012-06-20 16:38:30 -07007264/*
7265 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
7266 *
7267 */
7268void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
7269{
7270 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007271 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7272 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007273 if(NULL == pWdaParams)
7274 {
7275 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7276 "%s: pWdaParams received NULL", __FUNCTION__);
7277 VOS_ASSERT(0) ;
7278 return ;
7279 }
7280
7281 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7282 vos_mem_free(pWdaParams) ;
7283
Jeff Johnson295189b2012-06-20 16:38:30 -07007284 return ;
7285}
Jeff Johnson295189b2012-06-20 16:38:30 -07007286/*
7287 * FUNCTION: WDA_SetRSSIThresholdsReq
7288 * Request to WDI to set the RSSI thresholds (sta mode).
7289 */
7290VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
7291{
7292 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007293 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007294 tWDA_CbContext *pWDA = NULL ;
7295 v_PVOID_t pVosContext = NULL;
7296 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
7297 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
7298 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
7299 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007300 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7301 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007302 if(NULL == wdiRSSIThresholdsInfo)
7303 {
7304 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7305 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7306 VOS_ASSERT(0);
7307 return VOS_STATUS_E_NOMEM;
7308 }
7309 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7310 if(NULL == pWdaParams)
7311 {
7312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7313 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7314 VOS_ASSERT(0);
7315 vos_mem_free(wdiRSSIThresholdsInfo);
7316 return VOS_STATUS_E_NOMEM;
7317 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007318 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
Jeff Johnson295189b2012-06-20 16:38:30 -07007319 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
7320 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
7321 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
Jeff Johnson295189b2012-06-20 16:38:30 -07007322 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
7323 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
7324 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007325 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
7326 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
7327 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007328 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007329 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
7330 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7331
Jeff Johnson295189b2012-06-20 16:38:30 -07007332 /* Store param pointer as passed in by caller */
7333 /* store Params pass it to WDI */
7334 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
7335 pWdaParams->pWdaContext = pWDA;
7336 pWdaParams->wdaMsgParam = pBmpsThresholds;
Jeff Johnson43971f52012-07-17 12:26:56 -07007337 wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007338 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007339 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007340 {
7341 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7342 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007343 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007344 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7345 vos_mem_free(pWdaParams) ;
7346 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007347 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007348
7349}/*WDA_SetRSSIThresholdsReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007350/*
7351 * FUNCTION: WDA_HostOffloadReqCallback
7352 *
7353 */
7354void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
7355{
7356 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7357
7358 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7359 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007360 if(NULL == pWdaParams)
7361 {
7362 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7363 "%s: pWdaParams received NULL", __FUNCTION__);
7364 VOS_ASSERT(0) ;
7365 return ;
7366 }
7367
7368 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7369 vos_mem_free(pWdaParams->wdaMsgParam);
7370 vos_mem_free(pWdaParams) ;
7371
7372 //print a msg, nothing else to do
7373 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7374 "WDA_HostOffloadReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007375 return ;
7376}
Jeff Johnson295189b2012-06-20 16:38:30 -07007377/*
7378 * FUNCTION: WDA_ProcessHostOffloadReq
7379 * Request to WDI to set the filter to minimize unnecessary host wakeup due
7380 * to broadcast traffic (sta mode).
7381 */
7382VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
7383 tSirHostOffloadReq *pHostOffloadParams)
7384{
7385 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007386 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007387 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
7388 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
7389 sizeof(WDI_HostOffloadReqParamsType)) ;
7390 tWDA_ReqParams *pWdaParams ;
7391
7392 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7393 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
7394
7395 if(NULL == wdiHostOffloadInfo)
7396 {
7397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7398 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7399 VOS_ASSERT(0);
7400 return VOS_STATUS_E_NOMEM;
7401 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007402 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7403 if(NULL == pWdaParams)
7404 {
7405 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7406 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7407 VOS_ASSERT(0);
7408 vos_mem_free(wdiHostOffloadInfo);
7409 return VOS_STATUS_E_NOMEM;
7410 }
7411
7412 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
7413 pHostOffloadParams->offloadType;
7414 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
7415 pHostOffloadParams->enableOrDisable;
7416
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007417 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.bssId,
7418 pHostOffloadParams->bssId, sizeof(wpt_macAddr));
7419
Jeff Johnson295189b2012-06-20 16:38:30 -07007420 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
7421 {
7422 case SIR_IPV4_ARP_REPLY_OFFLOAD:
7423 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
7424 pHostOffloadParams->params.hostIpv4Addr,
7425 4);
7426 break;
7427 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7428 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7429 pHostOffloadParams->params.hostIpv6Addr,
7430 16);
7431 break;
7432 case SIR_IPV6_NS_OFFLOAD:
7433 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7434 pHostOffloadParams->params.hostIpv6Addr,
7435 16);
7436
7437#ifdef WLAN_NS_OFFLOAD
7438 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
7439 {
7440 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
7441 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
7442 16);
7443 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
7444 }
7445 else
7446 {
7447 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
7448 }
7449
7450 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
7451 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
7452 16);
7453 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
7454 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
7455 6);
7456
7457 //Only two are supported so let's go through them without a loop
7458 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
7459 {
7460 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
7461 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
7462 16);
7463 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
7464 }
7465 else
7466 {
7467 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
7468 }
7469
7470 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
7471 {
7472 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
7473 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
7474 16);
7475 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
7476 }
7477 else
7478 {
7479 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
7480 }
7481 break;
7482#endif //WLAN_NS_OFFLOAD
7483 default:
7484 {
7485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7486 "No Handling for Offload Type %x in WDA "
7487 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
7488 //WDA_VOS_ASSERT(0) ;
7489 }
7490 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007491 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007492 if((NULL != pWDA->wdaMsgParam) ||
7493 (NULL != pWDA->wdaWdiApiMsgParam))
7494 {
7495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7496 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7497 VOS_ASSERT(0);
7498 vos_mem_free(wdiHostOffloadInfo);
7499 return VOS_STATUS_E_FAILURE;
7500 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007501 /* Store param pointer as passed in by caller */
7502 /* store Params pass it to WDI */
7503 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7504 pWdaParams->pWdaContext = pWDA;
7505 pWdaParams->wdaMsgParam = pHostOffloadParams;
7506
Jeff Johnson43971f52012-07-17 12:26:56 -07007507 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007508 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7509
Jeff Johnson43971f52012-07-17 12:26:56 -07007510 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007511 {
7512 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7513 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007514 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007515 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7516 vos_mem_free(pWdaParams->wdaMsgParam);
7517 vos_mem_free(pWdaParams) ;
7518 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007519 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007520
7521}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007522/*
7523 * FUNCTION: WDA_KeepAliveReqCallback
7524 *
7525 */
7526void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7527{
7528 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007529 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7530 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007531 vos_mem_free(pWDA->wdaWdiApiMsgParam);
7532 vos_mem_free(pWDA->wdaMsgParam);
7533 pWDA->wdaWdiApiMsgParam = NULL;
7534 pWDA->wdaMsgParam = NULL;
7535
Jeff Johnson295189b2012-06-20 16:38:30 -07007536 //print a msg, nothing else to do
7537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7538 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007539 return ;
7540}
Jeff Johnson295189b2012-06-20 16:38:30 -07007541/*
7542 * FUNCTION: WDA_ProcessKeepAliveReq
7543 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7544 * wakeup due to broadcast traffic (sta mode).
7545 */
7546VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7547 tSirKeepAliveReq *pKeepAliveParams)
7548{
7549 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007550 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007551 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7552 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7553 sizeof(WDI_KeepAliveReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7555 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007556 if(NULL == wdiKeepAliveInfo)
7557 {
7558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7559 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7560 VOS_ASSERT(0);
7561 return VOS_STATUS_E_NOMEM;
7562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007563 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7564 pKeepAliveParams->packetType;
7565 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7566 pKeepAliveParams->timePeriod;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007567
7568 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.bssId,
7569 pKeepAliveParams->bssId,
7570 sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007571
7572 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7573 {
7574 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7575 pKeepAliveParams->hostIpv4Addr,
7576 SIR_IPV4_ADDR_LEN);
7577 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7578 pKeepAliveParams->destIpv4Addr,
7579 SIR_IPV4_ADDR_LEN);
7580 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7581 pKeepAliveParams->destMacAddr,
7582 SIR_MAC_ADDR_LEN);
7583 }
7584 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7585 {
7586 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7587 SIR_IPV4_ADDR_LEN,
7588 0);
7589 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7590 SIR_IPV4_ADDR_LEN,
7591 0);
7592 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7593 SIR_MAC_ADDR_LEN,
7594 0);
7595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007596 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007597 if((NULL != pWDA->wdaMsgParam) ||
7598 (NULL != pWDA->wdaWdiApiMsgParam))
7599 {
7600 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7601 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7602 VOS_ASSERT(0);
7603 vos_mem_free(wdiKeepAliveInfo);
7604 return VOS_STATUS_E_FAILURE;
7605 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007606 /* Store param pointer as passed in by caller */
7607 pWDA->wdaMsgParam = pKeepAliveParams;
7608 /* store Params pass it to WDI */
7609 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007610 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7611 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7612 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7613 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7614 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7615 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7616 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7617 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7618 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7619 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7621 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7622 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7623 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7624 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7625 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7626 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7627 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7629 "TimePeriod %d PacketType %d",
7630 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7631 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007632 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007633 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007634 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007635 {
7636 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7637 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007638 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007639 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7640 vos_mem_free(pWDA->wdaMsgParam);
7641 pWDA->wdaWdiApiMsgParam = NULL;
7642 pWDA->wdaMsgParam = NULL;
7643 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007644 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007645
7646}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007647/*
7648 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7649 *
7650 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007651void WDA_WowlAddBcPtrnReqCallback(
7652 WDI_WowlAddBcPtrnRspParamsType *pWdiWowlAddBcstPtrRsp,
7653 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007654{
7655 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007656 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7657 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007658 if(NULL == pWdaParams)
7659 {
7660 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7661 "%s: pWdaParams received NULL", __FUNCTION__);
7662 VOS_ASSERT(0) ;
7663 return ;
7664 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007665 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7666 vos_mem_free(pWdaParams->wdaMsgParam);
7667 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007668 return ;
7669}
Jeff Johnson295189b2012-06-20 16:38:30 -07007670/*
7671 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7672 * Request to WDI to add WOWL Bcast pattern
7673 */
7674VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7675 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7676{
7677 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007678 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007679 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7680 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7681 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7682 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007683 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7684 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007685 if(NULL == wdiWowlAddBcPtrnInfo)
7686 {
7687 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7688 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7689 VOS_ASSERT(0);
7690 return VOS_STATUS_E_NOMEM;
7691 }
7692 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7693 if(NULL == pWdaParams)
7694 {
7695 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7696 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7697 VOS_ASSERT(0);
7698 vos_mem_free(wdiWowlAddBcPtrnInfo);
7699 return VOS_STATUS_E_NOMEM;
7700 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007701 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7702 pWowlAddBcPtrnParams->ucPatternId;
7703 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7704 pWowlAddBcPtrnParams->ucPatternByteOffset;
7705 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7706 pWowlAddBcPtrnParams->ucPatternMaskSize;
7707 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7708 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007709 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7710 {
7711 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7712 pWowlAddBcPtrnParams->ucPattern,
7713 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7714 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7715 pWowlAddBcPtrnParams->ucPatternMask,
7716 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7717 }
7718 else
7719 {
7720 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7721 pWowlAddBcPtrnParams->ucPattern,
7722 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7723 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7724 pWowlAddBcPtrnParams->ucPatternMask,
7725 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7726
7727 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7728 pWowlAddBcPtrnParams->ucPatternExt,
7729 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7730 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7731 pWowlAddBcPtrnParams->ucPatternMaskExt,
7732 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7733 }
7734
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007735 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.bssId,
7736 pWowlAddBcPtrnParams->bssId, sizeof(wpt_macAddr));
7737
Jeff Johnson295189b2012-06-20 16:38:30 -07007738 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007739 /* Store param pointer as passed in by caller */
7740 /* store Params pass it to WDI */
7741 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7742 pWdaParams->pWdaContext = pWDA;
7743 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007744 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007745 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007746 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007747 {
7748 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7749 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007750 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007751 vos_mem_free(pWdaParams->wdaMsgParam) ;
7752 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7753 vos_mem_free(pWdaParams) ;
7754 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007755 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007756
7757}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007758/*
7759 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7760 *
7761 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007762void WDA_WowlDelBcPtrnReqCallback(
7763 WDI_WowlDelBcPtrnRspParamsType *pWdiWowlDelBcstPtrRsp,
7764 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007765{
7766 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007767 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7768 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007769 if(NULL == pWdaParams)
7770 {
7771 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7772 "%s: pWdaParams received NULL", __FUNCTION__);
7773 VOS_ASSERT(0) ;
7774 return ;
7775 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007776 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7777 vos_mem_free(pWdaParams->wdaMsgParam);
7778 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007779 return ;
7780}
Jeff Johnson295189b2012-06-20 16:38:30 -07007781/*
7782 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7783 * Request to WDI to delete WOWL Bcast pattern
7784 */
7785VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7786 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7787{
7788 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007789 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007790 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7791 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7792 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7793 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007794 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7795 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007796 if(NULL == wdiWowlDelBcPtrnInfo)
7797 {
7798 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7799 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7800 VOS_ASSERT(0);
7801 return VOS_STATUS_E_NOMEM;
7802 }
7803 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7804 if(NULL == pWdaParams)
7805 {
7806 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7807 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7808 VOS_ASSERT(0);
7809 vos_mem_free(wdiWowlDelBcPtrnInfo);
7810 return VOS_STATUS_E_NOMEM;
7811 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007812 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7813 pWowlDelBcPtrnParams->ucPatternId;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007814
7815 vos_mem_copy(wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.bssId,
7816 pWowlDelBcPtrnParams->bssId, sizeof(wpt_macAddr));
7817
Jeff Johnson295189b2012-06-20 16:38:30 -07007818 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007819 /* Store param pointer as passed in by caller */
7820 /* store Params pass it to WDI */
7821 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7822 pWdaParams->pWdaContext = pWDA;
7823 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007824 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007825 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007826 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007827 {
7828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7829 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007830 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007831 vos_mem_free(pWdaParams->wdaMsgParam) ;
7832 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7833 vos_mem_free(pWdaParams) ;
7834 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007835 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007836
7837}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007838/*
7839 * FUNCTION: WDA_WowlEnterReqCallback
7840 *
7841 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007842void WDA_WowlEnterReqCallback(WDI_WowlEnterRspParamsType *pwdiWowlEnterRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007843{
7844 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7845 tWDA_CbContext *pWDA;
7846 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7848 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007849 if(NULL == pWdaParams)
7850 {
7851 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7852 "%s: pWdaParams received NULL", __FUNCTION__);
7853 VOS_ASSERT(0) ;
7854 return ;
7855 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007856 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7857 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
7858
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007859 pWowlEnterParams->bssIdx = pwdiWowlEnterRspParam->bssIdx;
7860
Jeff Johnson295189b2012-06-20 16:38:30 -07007861 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7862 vos_mem_free(pWdaParams) ;
7863
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007864 pWowlEnterParams->status =
7865 CONVERT_WDI2SIR_STATUS(pwdiWowlEnterRspParam->status);
Jeff Johnson295189b2012-06-20 16:38:30 -07007866 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007867 return ;
7868}
Jeff Johnson295189b2012-06-20 16:38:30 -07007869/*
7870 * FUNCTION: WDA_ProcessWowlEnterReq
7871 * Request to WDI to enter WOWL
7872 */
7873VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
7874 tSirHalWowlEnterParams *pWowlEnterParams)
7875{
7876 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007877 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007878 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
7879 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
7880 sizeof(WDI_WowlEnterReqParamsType)) ;
7881 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007882 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7883 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007884 if(NULL == wdiWowlEnterInfo)
7885 {
7886 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7887 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7888 VOS_ASSERT(0);
7889 return VOS_STATUS_E_NOMEM;
7890 }
7891 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7892 if(NULL == pWdaParams)
7893 {
7894 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7895 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7896 VOS_ASSERT(0);
7897 vos_mem_free(wdiWowlEnterInfo);
7898 return VOS_STATUS_E_NOMEM;
7899 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007900 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
7901 pWowlEnterParams->magicPtrn,
7902 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007903 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
7904 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007905 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
7906 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007907 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
7908 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007909 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
7910 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007911 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
7912 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007913 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
7914 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007915 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
7916 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07007917 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
7918 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07007919#ifdef WLAN_WAKEUP_EVENTS
7920 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
7921 pWowlEnterParams->ucWoWEAPIDRequestEnable;
7922
7923 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
7924 pWowlEnterParams->ucWoWEAPOL4WayEnable;
7925
7926 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
7927 pWowlEnterParams->ucWowNetScanOffloadMatch;
7928
7929 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
7930 pWowlEnterParams->ucWowGTKRekeyError;
7931
7932 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
7933 pWowlEnterParams->ucWoWBSSConnLoss;
7934#endif // WLAN_WAKEUP_EVENTS
7935
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007936 wdiWowlEnterInfo->wdiWowlEnterInfo.bssIdx =
7937 pWowlEnterParams->bssIdx;
7938
Jeff Johnson295189b2012-06-20 16:38:30 -07007939 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007940 /* Store param pointer as passed in by caller */
7941 /* store Params pass it to WDI */
7942 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
7943 pWdaParams->pWdaContext = pWDA;
7944 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007945 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007946 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007947 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007948 {
7949 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7950 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007951 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007952 vos_mem_free(pWdaParams->wdaMsgParam) ;
7953 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7954 vos_mem_free(pWdaParams) ;
7955 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007956 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007957
7958}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007959/*
7960 * FUNCTION: WDA_WowlExitReqCallback
7961 *
7962 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007963void WDA_WowlExitReqCallback( WDI_WowlExitRspParamsType *pwdiWowlExitRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007964{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007965 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7966 tWDA_CbContext *pWDA;
7967 tSirHalWowlExitParams *pWowlExitParams;
7968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7969 "<------ %s " ,__FUNCTION__);
7970 if(NULL == pWdaParams)
7971 {
7972 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7973 "%s: pWdaParams received NULL", __FUNCTION__);
7974 VOS_ASSERT(0) ;
7975 return ;
7976 }
7977 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7978 pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam ;
7979
7980 pWowlExitParams->bssIdx = pwdiWowlExitRsp->bssIdx;
7981 pWowlExitParams->status = CONVERT_WDI2SIR_STATUS(pwdiWowlExitRsp->status);
7982
7983 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7984 vos_mem_free(pWdaParams) ;
7985
Jeff Johnson295189b2012-06-20 16:38:30 -07007986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7987 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007988 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007989 return ;
7990}
Jeff Johnson295189b2012-06-20 16:38:30 -07007991/*
7992 * FUNCTION: WDA_ProcessWowlExitReq
7993 * Request to WDI to add WOWL Bcast pattern
7994 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007995VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA,
7996 tSirHalWowlExitParams *pWowlExitParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07007997{
7998 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007999 WDI_Status wstatus;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008000 WDI_WowlExitReqParamsType *wdiWowlExitInfo =
8001 (WDI_WowlExitReqParamsType *)vos_mem_malloc(
8002 sizeof(WDI_WowlExitReqParamsType)) ;
8003 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008004 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8005 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008006 if(NULL == wdiWowlExitInfo)
8007 {
8008 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8009 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8010 VOS_ASSERT(0);
8011 return VOS_STATUS_E_NOMEM;
8012 }
8013 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8014 if(NULL == pWdaParams)
8015 {
8016 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8017 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8018 VOS_ASSERT(0);
8019 vos_mem_free(wdiWowlExitInfo);
8020 return VOS_STATUS_E_NOMEM;
8021 }
8022
8023 wdiWowlExitInfo->wdiWowlExitInfo.bssIdx =
8024 pWowlExitParams->bssIdx;
8025
8026 wdiWowlExitInfo->wdiReqStatusCB = NULL;
8027
8028 /* Store param pointer as passed in by caller */
8029 /* store Params pass it to WDI */
8030 pWdaParams->wdaWdiApiMsgParam = wdiWowlExitInfo;
8031 pWdaParams->pWdaContext = pWDA;
8032 pWdaParams->wdaMsgParam = pWowlExitParams;
8033
8034 wstatus = WDI_WowlExitReq(wdiWowlExitInfo,
8035 (WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008036
Jeff Johnson43971f52012-07-17 12:26:56 -07008037 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008038 {
8039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8040 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008041 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008042 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8043 vos_mem_free(pWdaParams->wdaMsgParam);
8044 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008045 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008046 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008047}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008048/*
8049 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
8050 * Request to WDI to determine whether a given station is capable of
8051 * using HW-based frame translation
8052 */
8053v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
8054 tANI_U8 staIdx)
8055{
8056 return WDI_IsHwFrameTxTranslationCapable(staIdx);
8057}
Jeff Johnson295189b2012-06-20 16:38:30 -07008058/*
8059 * FUNCTION: WDA_NvDownloadReqCallback
8060 * send NV Download RSP back to PE
8061 */
8062void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
8063 void* pUserData)
8064{
Jeff Johnson295189b2012-06-20 16:38:30 -07008065 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8067 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008068 /*Cleaning */
8069 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8070 pWDA->wdaWdiApiMsgParam = NULL;
8071 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008072 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008073 return ;
8074}
Jeff Johnson295189b2012-06-20 16:38:30 -07008075/*
8076 * FUNCTION: WDA_ProcessNvDownloadReq
8077 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
8078 */
8079VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
8080{
8081 /* Initialize the local Variables*/
8082 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8083 v_VOID_t *pNvBuffer=NULL;
8084 v_SIZE_t bufferSize = 0;
8085 WDI_Status status = WDI_STATUS_E_FAILURE;
8086 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008087 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8088 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008089 if(NULL == pWDA)
8090 {
8091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8092 "%s:pWDA is NULL", __FUNCTION__);
8093 return VOS_STATUS_E_FAILURE;
8094 }
8095 if(NULL != pWDA->wdaWdiApiMsgParam)
8096 {
8097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8098 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8099 return VOS_STATUS_E_FAILURE;
8100 }
8101
8102 /* Get the NV structure base address and size from VOS */
8103 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07008104 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
8105 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008106 if(NULL == wdiNvDownloadReqParam)
8107 {
8108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8109 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8110 VOS_ASSERT(0);
8111 return VOS_STATUS_E_NOMEM;
8112 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008113 /* Copy Params to wdiNvDownloadReqParam*/
8114 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
8115 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07008116 /* store Params pass it to WDI */
8117 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008118 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008119 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
8120 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008121 if(IS_WDI_STATUS_FAILURE(status))
8122 {
8123 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8124 "Failure in NV Download REQ Params WDI API, free all the memory " );
8125 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8126 pWDA->wdaWdiApiMsgParam = NULL;
8127 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008128 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008129}
8130/*
8131 * FUNCTION: WDA_FlushAcReqCallback
8132 * send Flush AC RSP back to TL
8133 */
8134void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
8135{
8136 vos_msg_t wdaMsg = {0} ;
8137 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8138 tFlushACReq *pFlushACReqParams;
8139 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07008140 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8141 "<------ %s " ,__FUNCTION__);
8142 if(NULL == pWdaParams)
8143 {
8144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8145 "%s: pWdaParams received NULL", __FUNCTION__);
8146 VOS_ASSERT(0) ;
8147 return ;
8148 }
8149
8150 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
8151 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
8152 if(NULL == pFlushACRspParams)
8153 {
8154 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8155 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8156 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07008157 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008158 return ;
8159 }
8160 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
8161 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
8162 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
8163 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
8164 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
8165 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008166 vos_mem_free(pWdaParams->wdaMsgParam) ;
8167 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8168 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008169 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8170 wdaMsg.bodyptr = (void *)pFlushACRspParams;
8171 // POST message to TL
8172 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
8173
Jeff Johnson295189b2012-06-20 16:38:30 -07008174 return ;
8175}
Jeff Johnson295189b2012-06-20 16:38:30 -07008176/*
8177 * FUNCTION: WDA_ProcessFlushAcReq
8178 * Request to WDI to Update the DELBA REQ params.
8179 */
8180VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8181 tFlushACReq *pFlushAcReqParams)
8182{
8183 WDI_Status status = WDI_STATUS_SUCCESS ;
8184 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8185 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8186 sizeof(WDI_FlushAcReqParamsType)) ;
8187 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008188 if(NULL == wdiFlushAcReqParam)
8189 {
8190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8191 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8192 VOS_ASSERT(0);
8193 return VOS_STATUS_E_NOMEM;
8194 }
8195 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8196 if(NULL == pWdaParams)
8197 {
8198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8199 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8200 VOS_ASSERT(0);
8201 vos_mem_free(wdiFlushAcReqParam);
8202 return VOS_STATUS_E_NOMEM;
8203 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008204 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8205 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008206 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8207 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8208 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8209 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008210 /* Store Flush AC pointer, as this will be used for response */
8211 /* store Params pass it to WDI */
8212 pWdaParams->pWdaContext = pWDA;
8213 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8214 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008215 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8216 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008217 if(IS_WDI_STATUS_FAILURE(status))
8218 {
8219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8220 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8221 vos_mem_free(pWdaParams->wdaMsgParam) ;
8222 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8223 vos_mem_free(pWdaParams) ;
8224 //TODO: respond to TL with failure
8225 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008226 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008227}
Jeff Johnson295189b2012-06-20 16:38:30 -07008228/*
8229 * FUNCTION: WDA_BtAmpEventReqCallback
8230 *
8231 */
8232void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8233{
8234 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8235 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008236 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008237
8238 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8239 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008240 if(NULL == pWdaParams)
8241 {
8242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8243 "%s: pWdaParams received NULL", __FUNCTION__);
8244 VOS_ASSERT(0) ;
8245 return ;
8246 }
8247 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8248 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8249 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8250 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8251 {
8252 pWDA->wdaAmpSessionOn = VOS_FALSE;
8253 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008254 vos_mem_free(pWdaParams->wdaMsgParam) ;
8255 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8256 vos_mem_free(pWdaParams) ;
8257 /*
8258 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8259 * param here
8260 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008261 return ;
8262}
8263
Jeff Johnson295189b2012-06-20 16:38:30 -07008264/*
8265 * FUNCTION: WDA_ProcessBtAmpEventReq
8266 * Request to WDI to Update with BT AMP events.
8267 */
8268VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8269 tSmeBtAmpEvent *pBtAmpEventParams)
8270{
8271 WDI_Status status = WDI_STATUS_SUCCESS ;
8272 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8273 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8274 sizeof(WDI_BtAmpEventParamsType)) ;
8275 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8277 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008278 if(NULL == wdiBtAmpEventParam)
8279 {
8280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8281 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8282 VOS_ASSERT(0);
8283 return VOS_STATUS_E_NOMEM;
8284 }
8285 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8286 if(NULL == pWdaParams)
8287 {
8288 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8289 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8290 VOS_ASSERT(0);
8291 vos_mem_free(wdiBtAmpEventParam);
8292 return VOS_STATUS_E_NOMEM;
8293 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008294 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8295 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008296 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008297 /* Store BT AMP event pointer, as this will be used for response */
8298 /* store Params pass it to WDI */
8299 pWdaParams->pWdaContext = pWDA;
8300 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8301 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008302 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8303 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008304 if(IS_WDI_STATUS_FAILURE(status))
8305 {
8306 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8307 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8308 vos_mem_free(pWdaParams->wdaMsgParam) ;
8309 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8310 vos_mem_free(pWdaParams) ;
8311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008312 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8313 {
8314 pWDA->wdaAmpSessionOn = VOS_TRUE;
8315 }
8316 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008317}
8318
Jeff Johnson295189b2012-06-20 16:38:30 -07008319#ifdef ANI_MANF_DIAG
8320/*
8321 * FUNCTION: WDA_FTMCommandReqCallback
8322 * Handle FTM CMD response came from HAL
8323 * Route responce to HDD FTM
8324 */
8325void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8326 void *usrData)
8327{
8328 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008329 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8330 {
8331 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8332 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8333 return;
8334 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008335 /* Release Current FTM Command Request */
8336 vos_mem_free(pWDA->wdaFTMCmdReq);
8337 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008338#ifndef WLAN_FTM_STUB
8339 /* Post FTM Responce to HDD FTM */
8340 wlan_sys_ftm(ftmCmdRspData);
8341#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008342 return;
8343}
Jeff Johnson295189b2012-06-20 16:38:30 -07008344/*
8345 * FUNCTION: WDA_ProcessFTMCommand
8346 * Send FTM command to WDI
8347 */
8348VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8349 tPttMsgbuffer *pPTTFtmCmd)
8350{
8351 WDI_Status status = WDI_STATUS_SUCCESS;
8352 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008353 ftmCMDReq = (WDI_FTMCommandReqType *)
8354 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8355 if(NULL == ftmCMDReq)
8356 {
8357 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8358 "WDA FTM Command buffer alloc fail");
8359 return VOS_STATUS_E_NOMEM;
8360 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008361 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8362 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008363 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008364 /* Send command to WDI */
8365 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008366 return status;
8367}
8368#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008369#ifdef FEATURE_OEM_DATA_SUPPORT
8370/*
8371 * FUNCTION: WDA_StartOemDataReqCallback
8372 *
8373 */
8374void WDA_StartOemDataReqCallback(
8375 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8376 void* pUserData)
8377{
8378 VOS_STATUS status = VOS_STATUS_E_FAILURE;
8379 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8380 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008381
Jeff Johnsone7245742012-09-05 17:12:55 -07008382 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8383 "<------ %s " ,__FUNCTION__);
8384 if(NULL == pWDA)
8385 {
8386 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8387 "%s:pWDA is NULL", __FUNCTION__);
8388 VOS_ASSERT(0);
8389 return ;
8390 }
8391
8392 /*
8393 * Allocate memory for response params sent to PE
8394 */
8395 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8396
8397 // Check if memory is allocated for OemdataMeasRsp Params.
8398 if(NULL == pOemDataRspParams)
8399 {
8400 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8401 "OEM DATA WDA callback alloc fail");
8402 VOS_ASSERT(0) ;
8403 return;
8404 }
8405 // Free the memory allocated during request.
8406 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8407 vos_mem_free(pWDA->wdaMsgParam) ;
8408 pWDA->wdaWdiApiMsgParam = NULL;
8409 pWDA->wdaMsgParam = NULL;
8410 /*
8411 * Now go ahead and copy other stuff for PE in incase of sucess only
8412 * Also, here success always means that we have atleast one BSSID.
8413 */
8414 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8415
8416 //enable Tx
8417 status = WDA_ResumeDataTx(pWDA);
8418 if(status != VOS_STATUS_SUCCESS)
8419 {
8420 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8421 }
8422 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8423 return ;
8424}
8425/*
8426 * FUNCTION: WDA_ProcessStartOemDataReq
8427 * Send Start Oem Data Req to WDI
8428 */
8429VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8430 tStartOemDataReq *pOemDataReqParams)
8431{
8432 WDI_Status status = WDI_STATUS_SUCCESS;
8433 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
8434
8435 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8436
8437 if(NULL == wdiOemDataReqParams)
8438 {
8439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8440 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8441 VOS_ASSERT(0);
8442 return VOS_STATUS_E_NOMEM;
8443 }
8444
8445 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8446 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
8447
8448 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8449
8450 if((NULL != pWDA->wdaMsgParam) ||
8451 (NULL != pWDA->wdaWdiApiMsgParam))
8452 {
8453 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8454 "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__);
8455 VOS_ASSERT(0);
8456 vos_mem_free(wdiOemDataReqParams);
8457 return VOS_STATUS_E_FAILURE;
8458 }
8459 pWDA->wdaMsgParam = (void *)pOemDataReqParams;
8460 pWDA->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8461
8462 status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
8463
8464 if(IS_WDI_STATUS_FAILURE(status))
8465 {
8466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8467 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
8468 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8469 vos_mem_free(pWDA->wdaMsgParam);
8470 pWDA->wdaWdiApiMsgParam = NULL;
8471 pWDA->wdaMsgParam = NULL;
8472 }
8473 return CONVERT_WDI2VOS_STATUS(status) ;
8474}
8475#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008476/*
8477 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8478 *
8479 */
8480void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8481{
8482 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008483 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8484 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008485 if(NULL == pWdaParams)
8486 {
8487 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8488 "%s: pWdaParams received NULL", __FUNCTION__);
8489 VOS_ASSERT(0) ;
8490 return ;
8491 }
8492
8493 if(NULL != pWdaParams->wdaMsgParam)
8494 {
8495 vos_mem_free(pWdaParams->wdaMsgParam);
8496 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008497 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8498 {
8499 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8500 }
8501
8502 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008503 return ;
8504}
Jeff Johnson295189b2012-06-20 16:38:30 -07008505#ifdef WLAN_FEATURE_GTK_OFFLOAD
8506/*
8507 * FUNCTION: WDA_HostOffloadReqCallback
8508 *
8509 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008510void WDA_GTKOffloadReqCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparams,
8511 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008512{
8513 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8514
8515 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8516 "<------ %s " ,__FUNCTION__);
8517
8518 VOS_ASSERT(NULL != pWdaParams);
8519
8520 vos_mem_free(pWdaParams->wdaMsgParam) ;
8521 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8522 vos_mem_free(pWdaParams) ;
8523
8524 //print a msg, nothing else to do
8525 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8526 "WDA_GTKOffloadReqCallback invoked " );
8527
8528 return ;
8529}
8530
8531/*
8532 * FUNCTION: WDA_ProcessGTKOffloadReq
8533 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8534 * to broadcast traffic (sta mode).
8535 */
8536VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8537 tpSirGtkOffloadParams pGtkOffloadParams)
8538{
8539 VOS_STATUS status = VOS_STATUS_SUCCESS;
8540 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8541 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8542 sizeof(WDI_GtkOffloadReqMsg)) ;
8543 tWDA_ReqParams *pWdaParams ;
8544
8545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8546 "------> %s " ,__FUNCTION__);
8547
8548 if(NULL == wdiGtkOffloadReqMsg)
8549 {
8550 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8551 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8552 VOS_ASSERT(0);
8553 return VOS_STATUS_E_NOMEM;
8554 }
8555
8556 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8557 if(NULL == pWdaParams)
8558 {
8559 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8560 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8561 VOS_ASSERT(0);
8562 vos_mem_free(wdiGtkOffloadReqMsg);
8563 return VOS_STATUS_E_NOMEM;
8564 }
8565
8566 //
8567 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8568 //
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008569
8570 vos_mem_copy(wdiGtkOffloadReqMsg->gtkOffloadReqParams.bssId,
8571 pGtkOffloadParams->bssId, sizeof(wpt_macAddr))
8572
Jeff Johnson295189b2012-06-20 16:38:30 -07008573 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8574 // Copy KCK
8575 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8576 // Copy KEK
8577 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8578 // Copy KeyReplayCounter
8579 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8580 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8581
8582 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8583
8584 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8585 (NULL == pWDA->wdaWdiApiMsgParam));
8586
8587 /* Store Params pass it to WDI */
8588 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8589 pWdaParams->pWdaContext = pWDA;
8590 /* Store param pointer as passed in by caller */
8591 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8592
8593 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8594
8595 if(IS_WDI_STATUS_FAILURE(status))
8596 {
8597 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8598 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8599 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8600 vos_mem_free(pWdaParams->wdaMsgParam);
8601 vos_mem_free(pWdaParams);
8602 }
8603
8604 return CONVERT_WDI2VOS_STATUS(status) ;
8605}
8606
8607/*
8608 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8609 *
8610 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008611void WDA_GtkOffloadGetInfoCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkOffloadGetInfoRsparams,
8612 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008613{
8614 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8615 tWDA_CbContext *pWDA;
8616 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8617 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8618 tANI_U8 i;
8619 vos_msg_t vosMsg;
8620
8621 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8622 "<------ %s " ,__FUNCTION__);
8623
8624 VOS_ASSERT(NULL != pWdaParams);
8625
8626 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8627 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8628
8629 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8630 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8631
8632 /* Message Header */
8633 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8634 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8635
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008636 pGtkOffloadGetInfoRsp->ulStatus = pwdiGtkOffloadGetInfoRsparams->ulStatus;
8637 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pwdiGtkOffloadGetInfoRsparams->ullKeyReplayCounter;
8638 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulTotalRekeyCount;
8639 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulGTKRekeyCount;
8640 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulIGTKRekeyCount;
8641 pGtkOffloadGetInfoRsp->bssIdx = pwdiGtkOffloadGetInfoRsparams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07008642
8643 /* VOS message wrapper */
8644 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8645 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8646 vosMsg.bodyval = 0;
8647
8648 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8649 {
8650 /* free the mem and return */
8651 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8652 }
8653
8654 vos_mem_free(pWdaParams->wdaMsgParam) ;
8655 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8656 vos_mem_free(pWdaParams) ;
8657}
8658#endif
8659
8660/*
8661 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8662 * Request to WDI to set Tx Per Tracking configurations
8663 */
8664VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8665{
8666 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008667 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008668 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8669 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8670 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8671 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8673 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008674 if(NULL == pwdiSetTxPerTrackingReqParams)
8675 {
8676 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8677 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8678 vos_mem_free(pTxPerTrackingParams);
8679 VOS_ASSERT(0);
8680 return VOS_STATUS_E_NOMEM;
8681 }
8682 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8683 if(NULL == pWdaParams)
8684 {
8685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8686 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8687 vos_mem_free(pwdiSetTxPerTrackingReqParams);
8688 vos_mem_free(pTxPerTrackingParams);
8689 VOS_ASSERT(0);
8690 return VOS_STATUS_E_NOMEM;
8691 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008692 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8693 pTxPerTrackingParams->ucTxPerTrackingEnable;
8694 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8695 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8696 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8697 pTxPerTrackingParams->ucTxPerTrackingRatio;
8698 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8699 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008700 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008701 /* Store param pointer as passed in by caller */
8702 /* store Params pass it to WDI
8703 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8704 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8705 pWdaParams->pWdaContext = pWDA;
8706 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008707 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008708 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008709 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008710 {
8711 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8712 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008713 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008714 vos_mem_free(pWdaParams->wdaMsgParam) ;
8715 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8716 vos_mem_free(pWdaParams) ;
8717 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008718 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008719
8720}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008721/*
8722 * FUNCTION: WDA_HALDumpCmdCallback
8723 * Send the VOS complete .
8724 */
8725void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8726 void* pUserData)
8727{
8728 tANI_U8 *buffer = NULL;
8729 tWDA_CbContext *pWDA = NULL;
8730 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008731 if(NULL == pWdaParams)
8732 {
8733 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8734 "%s: pWdaParams received NULL", __FUNCTION__);
8735 VOS_ASSERT(0) ;
8736 return ;
8737 }
8738
8739 pWDA = pWdaParams->pWdaContext;
8740 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008741 if(wdiRspParams->usBufferLen > 0)
8742 {
8743 /*Copy the Resp data to UMAC supplied buffer*/
8744 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8745 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008746 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8747 vos_mem_free(pWdaParams);
8748
8749 /* Indicate VOSS about the start complete */
8750 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008751 return ;
8752}
8753
Jeff Johnson295189b2012-06-20 16:38:30 -07008754/*
8755 * FUNCTION: WDA_ProcessHALDumpCmdReq
8756 * Send Dump command to WDI
8757 */
8758VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8759 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8760 tANI_U32 arg4, tANI_U8 *pBuffer)
8761{
8762 WDI_Status status = WDI_STATUS_SUCCESS;
8763 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8764 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8765 tWDA_ReqParams *pWdaParams ;
8766 pVosContextType pVosContext = NULL;
8767 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008768 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8769 (void *)pMac);
8770
8771 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8772 if(NULL == pWdaParams)
8773 {
8774 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8775 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8776 return VOS_STATUS_E_NOMEM;
8777 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008778 /* Allocate memory WDI request structure*/
8779 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8780 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8781 if(NULL == wdiHALDumpCmdReqParam)
8782 {
8783 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8784 "WDA HAL DUMP Command buffer alloc fail");
8785 vos_mem_free(pWdaParams);
8786 return WDI_STATUS_E_FAILURE;
8787 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008788 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008789 /* Extract the arguments */
8790 wdiHalDumpCmdInfo->command = cmd;
8791 wdiHalDumpCmdInfo->argument1 = arg1;
8792 wdiHalDumpCmdInfo->argument2 = arg2;
8793 wdiHalDumpCmdInfo->argument3 = arg3;
8794 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07008795 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008796 pWdaParams->pWdaContext = pVosContext->pWDAContext;
8797
8798 /* Response message will be passed through the buffer */
8799 pWdaParams->wdaMsgParam = (void *)pBuffer;
8800
8801 /* store Params pass it to WDI */
8802 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008803 /* Send command to WDI */
8804 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008805 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07008806 if ( vStatus != VOS_STATUS_SUCCESS )
8807 {
8808 if ( vStatus == VOS_STATUS_E_TIMEOUT )
8809 {
8810 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8811 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
8812 }
8813 else
8814 {
8815 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8816 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
8817 }
8818 VOS_ASSERT(0);
8819 }
8820 return status;
8821}
Jeff Johnson295189b2012-06-20 16:38:30 -07008822#ifdef WLAN_FEATURE_GTK_OFFLOAD
8823/*
8824 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
8825 * Request to WDI to get GTK Offload Information
8826 */
8827VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
8828 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
8829{
8830 VOS_STATUS status = VOS_STATUS_SUCCESS;
8831 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
8832 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
8833 tWDA_ReqParams *pWdaParams ;
8834
8835 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
8836 {
8837 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8838 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8839 VOS_ASSERT(0);
8840 return VOS_STATUS_E_NOMEM;
8841 }
8842
8843 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8844 if(NULL == pWdaParams)
8845 {
8846 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8847 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8848 VOS_ASSERT(0);
8849 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
8850 return VOS_STATUS_E_NOMEM;
8851 }
8852
8853 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
8854
8855 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8856 (NULL == pWDA->wdaWdiApiMsgParam));
8857
8858 /* Store Params pass it to WDI */
8859 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
8860 pWdaParams->pWdaContext = pWDA;
8861 /* Store param pointer as passed in by caller */
8862 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
8863
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008864 vos_mem_copy(pwdiGtkOffloadGetInfoReqMsg->WDI_GtkOffloadGetInfoReqParams.bssId,
8865 pGtkOffloadGetInfoRsp->bssId, sizeof(wpt_macAddr))
8866
Jeff Johnson295189b2012-06-20 16:38:30 -07008867 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
8868
8869 if(IS_WDI_STATUS_FAILURE(status))
8870 {
8871 /* failure returned by WDI API */
8872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8873 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
8874 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8875 vos_mem_free(pWdaParams) ;
8876 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
8877 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
8878 }
8879
8880 return CONVERT_WDI2VOS_STATUS(status) ;
8881}
8882#endif // WLAN_FEATURE_GTK_OFFLOAD
8883
8884/*
8885 * -------------------------------------------------------------------------
8886 * DATA interface with WDI for Mgmt Frames
8887 * -------------------------------------------------------------------------
8888 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008889/*
8890 * FUNCTION: WDA_TxComplete
8891 * Callback function for the WDA_TxPacket
8892 */
8893VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
8894 VOS_STATUS status )
8895{
8896
8897 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8898 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
8899
8900 if(NULL == wdaContext)
8901 {
8902 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8903 "%s:pWDA is NULL",
8904 __FUNCTION__);
8905 VOS_ASSERT(0);
8906 return VOS_STATUS_E_FAILURE;
8907 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008908 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
8909 if( NULL!=wdaContext->pTxCbFunc)
8910 {
8911 /*check if packet is freed already*/
8912 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
8913 {
8914 wdaContext->pTxCbFunc(pMac, pData);
8915 }
8916 else
8917 {
8918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
8919 "%s:packet (0x%X) is already freed",
8920 __FUNCTION__, pData);
8921 //Return from here since we reaching here because the packet already timeout
8922 return status;
8923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008924 }
8925
8926 /*
8927 * Trigger the event to bring the HAL TL Tx complete function to come
8928 * out of wait
8929 * Let the coe above to complete the packet first. When this event is set,
8930 * the thread waiting for the event may run and set Vospacket_freed causing the original
8931 * packet not being freed.
8932 */
8933 status = vos_event_set(&wdaContext->txFrameEvent);
8934 if(!VOS_IS_STATUS_SUCCESS(status))
8935 {
8936 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8937 "NEW VOS Event Set failed - status = %d \n", status);
8938 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008939 return status;
8940}
Jeff Johnson295189b2012-06-20 16:38:30 -07008941/*
8942 * FUNCTION: WDA_TxPacket
8943 * Forward TX management frame to WDI
8944 */
8945VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
8946 void *pFrmBuf,
8947 tANI_U16 frmLen,
8948 eFrameType frmType,
8949 eFrameTxDir txDir,
8950 tANI_U8 tid,
8951 pWDATxRxCompFunc pCompFunc,
8952 void *pData,
8953 pWDAAckFnTxComp pAckTxComp,
8954 tANI_U8 txFlag)
8955{
8956 VOS_STATUS status = VOS_STATUS_SUCCESS ;
8957 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
8958 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
8959 tANI_U8 eventIdx = 0;
8960 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
8961 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07008962 if((NULL == pWDA)||(NULL == pFrmBuf))
8963 {
8964 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8965 "%s:pWDA %x or pFrmBuf %x is NULL",
8966 __FUNCTION__,pWDA,pFrmBuf);
8967 VOS_ASSERT(0);
8968 return VOS_STATUS_E_FAILURE;
8969 }
8970
8971 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
8972 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07008973 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
8974 if(NULL == pMac)
8975 {
8976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8977 "%s:pMac is NULL", __FUNCTION__);
8978 VOS_ASSERT(0);
8979 return VOS_STATUS_E_FAILURE;
8980 }
8981
8982
8983
8984 /* store the call back function in WDA context */
8985 pWDA->pTxCbFunc = pCompFunc;
8986 /* store the call back for the function of ackTxComplete */
8987 if( pAckTxComp )
8988 {
Jeff Johnsone7245742012-09-05 17:12:55 -07008989 if( NULL != pWDA->pAckTxCbFunc )
8990 {
8991 /* Already TxComp is active no need to active again */
8992 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8993 "There is already one request pending for tx complete\n");
8994 pWDA->pAckTxCbFunc( pMac, 0);
8995 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008996
Jeff Johnsone7245742012-09-05 17:12:55 -07008997 if( VOS_STATUS_SUCCESS !=
8998 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8999 {
9000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9001 "Tx Complete timeout Timer Stop Failed ");
9002 }
9003 else
9004 {
9005 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9006 "Tx Complete timeout Timer Stop Sucess ");
9007 }
9008 }
9009
9010 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
9011 pWDA->pAckTxCbFunc = pAckTxComp;
9012 if( VOS_STATUS_SUCCESS !=
9013 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
9014 {
9015 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9016 "Tx Complete Timer Start Failed ");
9017 pWDA->pAckTxCbFunc = NULL;
9018 return eHAL_STATUS_FAILURE;
9019 }
9020 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009021 /* Reset the event to be not signalled */
9022 status = vos_event_reset(&pWDA->txFrameEvent);
9023 if(!VOS_IS_STATUS_SUCCESS(status))
9024 {
9025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9026 "VOS Event reset failed - status = %d\n",status);
9027 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9028 if( pAckTxComp )
9029 {
9030 pWDA->pAckTxCbFunc = NULL;
9031 if( VOS_STATUS_SUCCESS !=
9032 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9033 {
9034 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9035 "Tx Complete timeout Timer Stop Failed ");
9036 }
9037 }
9038 return VOS_STATUS_E_FAILURE;
9039 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009040 /* Get system role, use the self station if in unknown role or STA role */
9041 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07009042 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
9043 (( eSYSTEM_STA_ROLE == systemRole )
9044#ifdef FEATURE_WLAN_CCX
9045 && frmType == HAL_TXRX_FRM_802_11_MGMT
9046#endif
9047 ))
9048 {
9049 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9050 }
9051
Jeff Johnsone7245742012-09-05 17:12:55 -07009052 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
9053 disassoc frame reaches the HW, HAL has already deleted the peer station */
9054 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07009055 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009056 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
9057 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9058 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
9059 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07009060 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009061 /*Send Probe request frames on self sta idx*/
9062 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07009063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009064 /* Since we donot want probe responses to be retried, send probe responses
9065 through the NO_ACK queues */
9066 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
9067 {
9068 //probe response is sent out using self station and no retries options.
9069 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
9070 }
9071 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
9072 {
9073 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
9074 }
9075 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009076 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
9077
9078 /*Set frame tag to 0
9079 We will use the WDA user data in order to tag a frame as expired*/
9080 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9081 (v_PVOID_t)0);
9082
9083
9084 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
9085 frmLen, ucTypeSubType, tid,
9086 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
9087 {
9088 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9089 "Sending Mgmt Frame failed - status = %d\n", status);
9090 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9091 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
9092 if( pAckTxComp )
9093 {
9094 pWDA->pAckTxCbFunc = NULL;
9095 if( VOS_STATUS_SUCCESS !=
9096 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9097 {
9098 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9099 "Tx Complete timeout Timer Stop Failed ");
9100 }
9101 }
9102 return VOS_STATUS_E_FAILURE;
9103 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009104 /*
9105 * Wait for the event to be set by the TL, to get the response of TX
9106 * complete, this event should be set by the Callback function called by TL
9107 */
9108 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
9109 &eventIdx);
9110 if(!VOS_IS_STATUS_SUCCESS(status))
9111 {
9112 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9113 "%s: Status %d when waiting for TX Frame Event",
9114 __FUNCTION__, status);
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -07009115 WDA_TransportChannelDebug(pWDA->pVosContext, 1, 0, VOS_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009116 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
9117 after the packet gets completed(packet freed once)*/
9118
9119 /* check whether the packet was freed already,so need not free again when
9120 * TL calls the WDA_Txcomplete routine
9121 */
9122 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
9123 {
9124 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9125 }
9126 if( pAckTxComp )
9127 {
9128 pWDA->pAckTxCbFunc = NULL;
9129 if( VOS_STATUS_SUCCESS !=
9130 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9131 {
9132 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9133 "Tx Complete timeout Timer Stop Failed ");
9134 }
9135 }
9136 status = VOS_STATUS_E_FAILURE;
9137 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009138 return status;
9139}
Jeff Johnson295189b2012-06-20 16:38:30 -07009140/*
9141 * FUNCTION: WDA_McProcessMsg
9142 * Trigger DAL-AL to start CFG download
9143 */
9144VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
9145{
9146 VOS_STATUS status = VOS_STATUS_SUCCESS;
9147 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009148 if(NULL == pMsg)
9149 {
9150 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9151 "%s:pMsg is NULL", __FUNCTION__);
9152 VOS_ASSERT(0);
9153 return VOS_STATUS_E_FAILURE;
9154 }
9155
9156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
9157 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
9158
9159 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
9160 if(NULL == pWDA )
9161 {
9162 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9163 "%s:pWDA is NULL", __FUNCTION__);
9164 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07009165 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009166 return VOS_STATUS_E_FAILURE;
9167 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009168 /* Process all the WDA messages.. */
9169 switch( pMsg->type )
9170 {
9171 case WNI_CFG_DNLD_REQ:
9172 {
9173 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07009174 /* call WDA complete event if config download success */
9175 if( VOS_IS_STATUS_SUCCESS(status) )
9176 {
9177 vos_WDAComplete_cback(pVosContext);
9178 }
9179 else
9180 {
9181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9182 "WDA Config Download failure" );
9183 }
9184 break ;
9185 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009186 /*
9187 * Init SCAN request from PE, convert it into DAL format
9188 * and send it to DAL
9189 */
9190 case WDA_INIT_SCAN_REQ:
9191 {
9192 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9193 break ;
9194 }
9195 /* start SCAN request from PE */
9196 case WDA_START_SCAN_REQ:
9197 {
9198 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9199 break ;
9200 }
9201 /* end SCAN request from PE */
9202 case WDA_END_SCAN_REQ:
9203 {
9204 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9205 break ;
9206 }
9207 /* end SCAN request from PE */
9208 case WDA_FINISH_SCAN_REQ:
9209 {
9210 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9211 break ;
9212 }
9213 /* join request from PE */
9214 case WDA_CHNL_SWITCH_REQ:
9215 {
9216 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9217 {
9218 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9219 }
9220 else
9221 {
9222 WDA_ProcessChannelSwitchReq(pWDA,
9223 (tSwitchChannelParams*)pMsg->bodyptr) ;
9224 }
9225 break ;
9226 }
9227 /* ADD BSS request from PE */
9228 case WDA_ADD_BSS_REQ:
9229 {
9230 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9231 break ;
9232 }
9233 case WDA_ADD_STA_REQ:
9234 {
9235 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9236 break ;
9237 }
9238 case WDA_DELETE_BSS_REQ:
9239 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009240 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9241 break ;
9242 }
9243 case WDA_DELETE_STA_REQ:
9244 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009245 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9246 break ;
9247 }
9248 case WDA_CONFIG_PARAM_UPDATE_REQ:
9249 {
9250 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9251 break ;
9252 }
9253 case WDA_SET_BSSKEY_REQ:
9254 {
9255 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9256 break ;
9257 }
9258 case WDA_SET_STAKEY_REQ:
9259 {
9260 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9261 break ;
9262 }
9263 case WDA_SET_STA_BCASTKEY_REQ:
9264 {
9265 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9266 break ;
9267 }
9268 case WDA_REMOVE_BSSKEY_REQ:
9269 {
9270 WDA_ProcessRemoveBssKeyReq(pWDA,
9271 (tRemoveBssKeyParams *)pMsg->bodyptr);
9272 break ;
9273 }
9274 case WDA_REMOVE_STAKEY_REQ:
9275 {
9276 WDA_ProcessRemoveStaKeyReq(pWDA,
9277 (tRemoveStaKeyParams *)pMsg->bodyptr);
9278 break ;
9279 }
9280 case WDA_REMOVE_STA_BCASTKEY_REQ:
9281 {
9282 /* TODO: currently UMAC is not sending this request, Add the code for
9283 handling this request when UMAC supports */
9284 break;
9285 }
9286#ifdef FEATURE_WLAN_CCX
9287 case WDA_TSM_STATS_REQ:
9288 {
9289 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9290 break;
9291 }
9292#endif
9293 case WDA_UPDATE_EDCA_PROFILE_IND:
9294 {
9295 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9296 break;
9297 }
9298 case WDA_ADD_TS_REQ:
9299 {
9300 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9301 break;
9302 }
9303 case WDA_DEL_TS_REQ:
9304 {
9305 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9306 break;
9307 }
9308 case WDA_ADDBA_REQ:
9309 {
9310 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9311 break;
9312 }
9313 case WDA_DELBA_IND:
9314 {
9315 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9316 break;
9317 }
9318 case WDA_SET_LINK_STATE:
9319 {
9320 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9321 break;
9322 }
9323 case WDA_GET_STATISTICS_REQ:
9324 {
9325 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9326 break;
9327 }
9328 case WDA_PWR_SAVE_CFG:
9329 {
9330 if(pWDA->wdaState == WDA_READY_STATE)
9331 {
9332 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9333 }
9334 else
9335 {
9336 if(NULL != pMsg->bodyptr)
9337 {
9338 vos_mem_free(pMsg->bodyptr);
9339 }
9340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9341 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9342 }
9343 break;
9344 }
9345 case WDA_ENTER_IMPS_REQ:
9346 {
9347 if(pWDA->wdaState == WDA_READY_STATE)
9348 {
9349 WDA_ProcessEnterImpsReq(pWDA);
9350 }
9351 else
9352 {
9353 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9354 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9355 }
9356 break;
9357 }
9358 case WDA_EXIT_IMPS_REQ:
9359 {
9360 if(pWDA->wdaState == WDA_READY_STATE)
9361 {
9362 WDA_ProcessExitImpsReq(pWDA);
9363 }
9364 else
9365 {
9366 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9367 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9368 }
9369 break;
9370 }
9371 case WDA_ENTER_BMPS_REQ:
9372 {
9373 if(pWDA->wdaState == WDA_READY_STATE)
9374 {
9375 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9376 }
9377 else
9378 {
9379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9380 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9381 }
9382 break;
9383 }
9384 case WDA_EXIT_BMPS_REQ:
9385 {
9386 if(pWDA->wdaState == WDA_READY_STATE)
9387 {
9388 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9389 }
9390 else
9391 {
9392 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9393 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9394 }
9395 break;
9396 }
9397 case WDA_ENTER_UAPSD_REQ:
9398 {
9399 if(pWDA->wdaState == WDA_READY_STATE)
9400 {
9401 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9402 }
9403 else
9404 {
9405 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9406 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9407 }
9408 break;
9409 }
9410 case WDA_EXIT_UAPSD_REQ:
9411 {
9412 if(pWDA->wdaState == WDA_READY_STATE)
9413 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009414 WDA_ProcessExitUapsdReq(pWDA, (tExitUapsdParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009415 }
9416 else
9417 {
9418 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9419 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9420 }
9421 break;
9422 }
9423 case WDA_UPDATE_UAPSD_IND:
9424 {
9425 if(pWDA->wdaState == WDA_READY_STATE)
9426 {
9427 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9428 }
9429 else
9430 {
9431 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9432 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9433 }
9434 break;
9435 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009436 case WDA_REGISTER_PE_CALLBACK :
9437 {
9438 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9439 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9440 /*TODO: store the PE callback */
9441 /* Do Nothing? MSG Body should be freed at here */
9442 if(NULL != pMsg->bodyptr)
9443 {
9444 vos_mem_free(pMsg->bodyptr);
9445 }
9446 break;
9447 }
9448 case WDA_SYS_READY_IND :
9449 {
9450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9451 "Handling msg type WDA_SYS_READY_IND " );
9452 pWDA->wdaState = WDA_READY_STATE;
9453 if(NULL != pMsg->bodyptr)
9454 {
9455 vos_mem_free(pMsg->bodyptr);
9456 }
9457 break;
9458 }
9459 case WDA_BEACON_FILTER_IND :
9460 {
9461 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9462 break;
9463 }
9464 case WDA_BTC_SET_CFG:
9465 {
9466 /*TODO: handle this while dealing with BTC */
9467 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9468 "Handling msg type WDA_BTC_SET_CFG " );
9469 /* Do Nothing? MSG Body should be freed at here */
9470 if(NULL != pMsg->bodyptr)
9471 {
9472 vos_mem_free(pMsg->bodyptr);
9473 }
9474 break;
9475 }
9476 case WDA_SIGNAL_BT_EVENT:
9477 {
9478 /*TODO: handle this while dealing with BTC */
9479 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9480 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9481 /* Do Nothing? MSG Body should be freed at here */
9482 if(NULL != pMsg->bodyptr)
9483 {
9484 vos_mem_free(pMsg->bodyptr);
9485 }
9486 break;
9487 }
9488 case WDA_CFG_RXP_FILTER_REQ:
9489 {
9490 WDA_ProcessConfigureRxpFilterReq(pWDA,
9491 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9492 break;
9493 }
9494 case WDA_SET_HOST_OFFLOAD:
9495 {
9496 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9497 break;
9498 }
9499 case WDA_SET_KEEP_ALIVE:
9500 {
9501 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9502 break;
9503 }
9504#ifdef WLAN_NS_OFFLOAD
9505 case WDA_SET_NS_OFFLOAD:
9506 {
9507 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9508 break;
9509 }
9510#endif //WLAN_NS_OFFLOAD
9511 case WDA_ADD_STA_SELF_REQ:
9512 {
9513 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9514 break;
9515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009516 case WDA_DEL_STA_SELF_REQ:
9517 {
9518 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9519 break;
9520 }
9521 case WDA_WOWL_ADD_BCAST_PTRN:
9522 {
9523 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9524 break;
9525 }
9526 case WDA_WOWL_DEL_BCAST_PTRN:
9527 {
9528 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9529 break;
9530 }
9531 case WDA_WOWL_ENTER_REQ:
9532 {
9533 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9534 break;
9535 }
9536 case WDA_WOWL_EXIT_REQ:
9537 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009538 WDA_ProcessWowlExitReq(pWDA, (tSirHalWowlExitParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009539 break;
9540 }
9541 case WDA_TL_FLUSH_AC_REQ:
9542 {
9543 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9544 break;
9545 }
9546 case WDA_SIGNAL_BTAMP_EVENT:
9547 {
9548 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9549 break;
9550 }
9551#ifdef WDA_UT
9552 case WDA_WDI_EVENT_MSG:
9553 {
9554 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9555 break ;
9556 }
9557#endif
9558 case WDA_UPDATE_BEACON_IND:
9559 {
9560 WDA_ProcessUpdateBeaconParams(pWDA,
9561 (tUpdateBeaconParams *)pMsg->bodyptr);
9562 break;
9563 }
9564 case WDA_SEND_BEACON_REQ:
9565 {
9566 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9567 break;
9568 }
9569 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9570 {
9571 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9572 (tSendProbeRespParams *)pMsg->bodyptr);
9573 break;
9574 }
9575#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9576 case WDA_SET_MAX_TX_POWER_REQ:
9577 {
9578 WDA_ProcessSetMaxTxPowerReq(pWDA,
9579 (tMaxTxPowerParams *)pMsg->bodyptr);
9580 break;
9581 }
9582#endif
9583#ifdef WLAN_FEATURE_P2P
9584 case WDA_SET_P2P_GO_NOA_REQ:
9585 {
9586 WDA_ProcessSetP2PGONOAReq(pWDA,
9587 (tP2pPsParams *)pMsg->bodyptr);
9588 break;
9589 }
9590#endif
9591 /* timer related messages */
9592 case WDA_TIMER_BA_ACTIVITY_REQ:
9593 {
9594 WDA_BaCheckActivity(pWDA) ;
9595 break ;
9596 }
9597#ifdef WLAN_FEATURE_VOWIFI_11R
9598 case WDA_AGGR_QOS_REQ:
9599 {
9600 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9601 break;
9602 }
9603#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009604#ifdef ANI_MANF_DIAG
9605 case WDA_FTM_CMD_REQ:
9606 {
9607 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9608 break ;
9609 }
9610#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009611#ifdef FEATURE_OEM_DATA_SUPPORT
9612 case WDA_START_OEM_DATA_REQ:
9613 {
9614 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9615 break;
9616 }
9617#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009618 /* Tx Complete Time out Indication */
9619 case WDA_TX_COMPLETE_TIMEOUT_IND:
9620 {
9621 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9622 break;
9623 }
9624 case WDA_WLAN_SUSPEND_IND:
9625 {
9626 WDA_ProcessWlanSuspendInd(pWDA,
9627 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9628 break;
9629 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009630 case WDA_WLAN_RESUME_REQ:
9631 {
9632 WDA_ProcessWlanResumeReq(pWDA,
9633 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9634 break;
9635 }
9636
9637 case WDA_UPDATE_CF_IND:
9638 {
9639 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9640 pMsg->bodyptr = NULL;
9641 break;
9642 }
9643#ifdef FEATURE_WLAN_SCAN_PNO
9644 case WDA_SET_PNO_REQ:
9645 {
9646 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9647 break;
9648 }
9649 case WDA_UPDATE_SCAN_PARAMS_REQ:
9650 {
9651 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9652 break;
9653 }
9654 case WDA_SET_RSSI_FILTER_REQ:
9655 {
9656 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9657 break;
9658 }
9659#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009660 case WDA_SET_TX_PER_TRACKING_REQ:
9661 {
9662 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9663 break;
9664 }
9665
9666#ifdef WLAN_FEATURE_PACKET_FILTERING
9667 case WDA_8023_MULTICAST_LIST_REQ:
9668 {
9669 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9670 break;
9671 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009672 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9673 {
9674 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9675 break;
9676 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009677 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9678 {
9679 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9680 break;
9681 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009682 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9683 {
9684 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9685 break;
9686 }
9687#endif // WLAN_FEATURE_PACKET_FILTERING
9688
9689
9690 case WDA_TRANSMISSION_CONTROL_IND:
9691 {
9692 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9693 break;
9694 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009695 case WDA_SET_POWER_PARAMS_REQ:
9696 {
9697 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9698 break;
9699 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009700#ifdef WLAN_FEATURE_GTK_OFFLOAD
9701 case WDA_GTK_OFFLOAD_REQ:
9702 {
9703 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9704 break;
9705 }
9706
9707 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9708 {
9709 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9710 break;
9711 }
9712#endif //WLAN_FEATURE_GTK_OFFLOAD
9713
9714 case WDA_SET_TM_LEVEL_REQ:
9715 {
9716 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9717 break;
9718 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009719#ifdef WLAN_FEATURE_11AC
9720 case WDA_UPDATE_OP_MODE:
9721 {
9722 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9723 {
9724 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9725 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9726 else
9727 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9728 " VHT OpMode Feature is Not Supported \n");
9729 }
9730 else
9731 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9732 " 11AC Feature is Not Supported \n");
9733 break;
9734 }
9735#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009736 default:
9737 {
9738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9739 "No Handling for msg type %x in WDA "
9740 ,pMsg->type);
9741 /* Do Nothing? MSG Body should be freed at here */
9742 if(NULL != pMsg->bodyptr)
9743 {
9744 vos_mem_free(pMsg->bodyptr);
9745 }
9746 //WDA_VOS_ASSERT(0) ;
9747 }
9748 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009749 return status ;
9750}
9751
Jeff Johnson295189b2012-06-20 16:38:30 -07009752/*
9753 * FUNCTION: WDA_LowLevelIndCallback
9754 * IND API callback from WDI, send Ind to PE
9755 */
9756void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9757 void* pUserData )
9758{
9759 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9760#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9761 tSirRSSINotification rssiNotification;
9762#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009763 if(NULL == pWDA)
9764 {
9765 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9766 "%s:pWDA is NULL", __FUNCTION__);
9767 VOS_ASSERT(0);
9768 return ;
9769 }
9770
9771 switch(wdiLowLevelInd->wdiIndicationType)
9772 {
9773 case WDI_RSSI_NOTIFICATION_IND:
9774 {
9775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9776 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009777#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9778 rssiNotification.bReserved =
9779 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
9780 rssiNotification.bRssiThres1NegCross =
9781 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
9782 rssiNotification.bRssiThres1PosCross =
9783 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
9784 rssiNotification.bRssiThres2NegCross =
9785 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
9786 rssiNotification.bRssiThres2PosCross =
9787 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
9788 rssiNotification.bRssiThres3NegCross =
9789 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
9790 rssiNotification.bRssiThres3PosCross =
9791 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -07009792 WLANTL_BMPSRSSIRegionChangedNotification(
9793 pWDA->pVosContext,
9794 &rssiNotification);
9795#endif
9796 break ;
9797 }
9798 case WDI_MISSED_BEACON_IND:
9799 {
9800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9801 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009802 /* send IND to PE */
9803 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
9804 break ;
9805 }
9806 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
9807 {
9808 /* TODO: Decode Ind and send Ind to PE */
9809 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9810 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
9811 break ;
9812 }
9813
9814 case WDI_MIC_FAILURE_IND:
9815 {
9816 tpSirSmeMicFailureInd pMicInd =
9817 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
9818
9819 if(NULL == pMicInd)
9820 {
9821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9822 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9823 break;
9824 }
9825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9826 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009827 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
9828 pMicInd->length = sizeof(tSirSmeMicFailureInd);
9829 vos_mem_copy(pMicInd->bssId,
9830 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
9831 sizeof(tSirMacAddr));
9832 vos_mem_copy(pMicInd->info.srcMacAddr,
9833 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
9834 sizeof(tSirMacAddr));
9835 vos_mem_copy(pMicInd->info.taMacAddr,
9836 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
9837 sizeof(tSirMacAddr));
9838 vos_mem_copy(pMicInd->info.dstMacAddr,
9839 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
9840 sizeof(tSirMacAddr));
9841 vos_mem_copy(pMicInd->info.rxMacAddr,
9842 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
9843 sizeof(tSirMacAddr));
9844 pMicInd->info.multicast =
9845 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
9846 pMicInd->info.keyId=
9847 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
9848 pMicInd->info.IV1=
9849 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
9850 vos_mem_copy(pMicInd->info.TSC,
9851 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009852 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
9853 (void *)pMicInd , 0) ;
9854 break ;
9855 }
9856 case WDI_FATAL_ERROR_IND:
9857 {
9858 /* TODO: Decode Ind and send Ind to PE */
9859 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9860 "Received WDI_FATAL_ERROR_IND from WDI ");
9861 break ;
9862 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009863 case WDI_DEL_STA_IND:
9864 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009865 tpDeleteStaContext pDelSTACtx =
9866 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
9867
9868 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9869 "Received WDI_DEL_STA_IND from WDI ");
9870 if(NULL == pDelSTACtx)
9871 {
9872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9873 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9874 break;
9875 }
9876 vos_mem_copy(pDelSTACtx->addr2,
9877 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
9878 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009879 vos_mem_copy(pDelSTACtx->bssId,
9880 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
9881 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009882 pDelSTACtx->assocId =
9883 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
9884 pDelSTACtx->reasonCode =
9885 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
9886 pDelSTACtx->staId =
9887 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009888 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
9889 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009890 break ;
9891 }
9892 case WDI_COEX_IND:
9893 {
9894 tANI_U32 index;
9895 vos_msg_t vosMsg;
9896 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
9897 if(NULL == pSmeCoexInd)
9898 {
9899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9900 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
9901 break;
9902 }
9903 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9904 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009905 /* Message Header */
9906 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
9907 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -07009908 /* Info from WDI Indication */
9909 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
9910 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
9911 {
9912 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
9913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009914 /* VOS message wrapper */
9915 vosMsg.type = eWNI_SME_COEX_IND;
9916 vosMsg.bodyptr = (void *)pSmeCoexInd;
9917 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009918 /* Send message to SME */
9919 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9920 {
9921 /* free the mem and return */
9922 vos_mem_free((v_VOID_t *)pSmeCoexInd);
9923 }
9924 else
9925 {
9926 /* DEBUG */
9927 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9928 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
9929 pSmeCoexInd->coexIndType,
9930 pSmeCoexInd->coexIndData[0],
9931 pSmeCoexInd->coexIndData[1],
9932 pSmeCoexInd->coexIndData[2],
9933 pSmeCoexInd->coexIndData[3]);
9934 }
9935 break;
9936 }
9937 case WDI_TX_COMPLETE_IND:
9938 {
9939 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
9940 /* Calling TxCompleteAck Indication from wda context*/
9941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9942 "Complete Indication received from HAL");
9943 if( pWDA->pAckTxCbFunc )
9944 {
9945 if( VOS_STATUS_SUCCESS !=
9946 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9947 {
9948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9949 "Tx Complete timeout Timer Stop Failed ");
9950 }
9951 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
9952 pWDA->pAckTxCbFunc = NULL;
9953 }
9954 else
9955 {
9956 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9957 "Tx Complete Indication is received after timeout ");
9958 }
9959 break;
9960 }
9961#ifdef WLAN_FEATURE_P2P
9962 case WDI_P2P_NOA_ATTR_IND :
9963 {
9964 tSirP2PNoaAttr *pP2pNoaAttr =
9965 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009966 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9967 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -07009968 if (NULL == pP2pNoaAttr)
9969 {
9970 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9971 "Memory allocation failure, "
9972 "WDI_P2P_NOA_ATTR_IND not forwarded");
9973 break;
9974 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009975 pP2pNoaAttr->index =
9976 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
9977 pP2pNoaAttr->oppPsFlag =
9978 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
9979 pP2pNoaAttr->ctWin =
9980 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
9981
9982 pP2pNoaAttr->uNoa1IntervalCnt =
9983 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
9984 pP2pNoaAttr->uNoa1Duration =
9985 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
9986 pP2pNoaAttr->uNoa1Interval =
9987 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
9988 pP2pNoaAttr->uNoa1StartTime =
9989 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009990 pP2pNoaAttr->uNoa2IntervalCnt =
9991 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
9992 pP2pNoaAttr->uNoa2Duration =
9993 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
9994 pP2pNoaAttr->uNoa2Interval =
9995 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
9996 pP2pNoaAttr->uNoa2StartTime =
9997 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009998 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
9999 (void *)pP2pNoaAttr , 0) ;
10000 break;
10001 }
10002#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070010003#ifdef FEATURE_WLAN_SCAN_PNO
10004 case WDI_PREF_NETWORK_FOUND_IND:
10005 {
10006 vos_msg_t vosMsg;
10007 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -070010008 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10009 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010010 if (NULL == pPrefNetworkFoundInd)
10011 {
10012 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10013 "Memory allocation failure, "
10014 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
10015 break;
10016 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010017 /* Message Header */
10018 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
10019 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
10020
10021 /* Info from WDI Indication */
10022 pPrefNetworkFoundInd->ssId.length =
10023 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070010024 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070010025 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
10026 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
10027 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -070010028 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -070010029 /* VOS message wrapper */
10030 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
10031 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
10032 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010033 /* Send message to SME */
10034 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10035 {
10036 /* free the mem and return */
10037 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
10038 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010039 break;
10040 }
10041#endif // FEATURE_WLAN_SCAN_PNO
10042
10043#ifdef WLAN_WAKEUP_EVENTS
10044 case WDI_WAKE_REASON_IND:
10045 {
10046 vos_msg_t vosMsg;
10047 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
10048 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
10049 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
10050
10051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10052 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
10053 wdiLowLevelInd->wdiIndicationType,
10054 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
10055 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
10056 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10057
10058 if (NULL == pWakeReasonInd)
10059 {
10060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10061 "Memory allocation failure, "
10062 "WDI_WAKE_REASON_IND not forwarded");
10063 break;
10064 }
10065
10066 vos_mem_zero(pWakeReasonInd, allocSize);
10067
10068 /* Message Header */
10069 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
10070 pWakeReasonInd->mesgLen = allocSize;
10071
10072 /* Info from WDI Indication */
10073 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
10074 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
10075 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
10076 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
10077 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
10078 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
10079 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
10080 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10081
10082 /* VOS message wrapper */
10083 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
10084 vosMsg.bodyptr = (void *) pWakeReasonInd;
10085 vosMsg.bodyval = 0;
10086
10087 /* Send message to SME */
10088 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10089 {
10090 /* free the mem and return */
10091 vos_mem_free((v_VOID_t *) pWakeReasonInd);
10092 }
10093
10094 break;
10095 }
10096#endif // WLAN_WAKEUP_EVENTS
10097
10098 case WDI_TX_PER_HIT_IND:
10099 {
10100 vos_msg_t vosMsg;
10101 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
10102 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
10103 /* VOS message wrapper */
10104 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
10105 vosMsg.bodyptr = NULL;
10106 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010107 /* Send message to SME */
10108 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10109 {
10110 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
10111 }
10112 break;
10113 }
10114
10115 default:
10116 {
10117 /* TODO error */
10118 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10119 "Received UNKNOWN Indication from WDI ");
10120 }
10121 }
10122 return ;
10123}
10124
Jeff Johnson295189b2012-06-20 16:38:30 -070010125/*
10126 * BA related processing in WDA.
10127 */
Jeff Johnson295189b2012-06-20 16:38:30 -070010128void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
10129 void* pUserData)
10130{
10131 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10132 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -070010133 if(NULL == pWdaParams)
10134 {
10135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10136 "%s: pWdaParams received NULL", __FUNCTION__);
10137 VOS_ASSERT(0) ;
10138 return ;
10139 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010140 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070010141 vos_mem_free(pWdaParams->wdaMsgParam) ;
10142 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10143 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10145 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010146 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
10147 {
10148 tANI_U8 i = 0 ;
10149 tBaActivityInd *baActivityInd = NULL ;
10150 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
10151 tANI_U8 allocSize = sizeof(tBaActivityInd)
10152 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
10153 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
10154 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010155 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010156 if(NULL == baActivityInd)
10157 {
10158 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10159 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10160 VOS_ASSERT(0) ;
10161 return;
10162 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010163 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
10164 sizeof(tSirMacAddr)) ;
10165 baActivityInd->baCandidateCnt = baCandidateCount ;
10166
10167 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
10168 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
10169
10170 for(i = 0 ; i < baCandidateCount ; i++)
10171 {
10172 tANI_U8 tid = 0 ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010173 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
10174 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010175 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
10176 {
10177 baCandidate->baInfo[tid].fBaEnable =
10178 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
10179 baCandidate->baInfo[tid].startingSeqNum =
10180 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
10181 }
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070010182 wdiBaCandidate++ ;
10183 baCandidate++ ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010184 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010185 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
10186 }
10187 else
10188 {
10189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10190 "BA Trigger RSP with Failure received ");
10191 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010192 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010193}
Jeff Johnson295189b2012-06-20 16:38:30 -070010194/*
10195 * BA Activity check timer handler
10196 */
10197void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10198{
10199 tANI_U8 curSta = 0 ;
10200 tANI_U8 tid = 0 ;
10201 tANI_U8 size = 0 ;
10202 tANI_U8 baCandidateCount = 0 ;
10203 tANI_U8 newBaCandidate = 0 ;
10204 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10205
10206 if(NULL == pWDA)
10207 {
10208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10209 "%s:pWDA is NULL", __FUNCTION__);
10210 VOS_ASSERT(0);
10211 return ;
10212 }
10213 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10214 {
10215 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10216 "Inconsistent STA entries in WDA");
10217 VOS_ASSERT(0) ;
10218 }
10219 /* walk through all STA entries and find out TX packet count */
10220 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10221 {
10222 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10223 {
10224 tANI_U32 txPktCount = 0 ;
10225 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010226 if((WDA_VALID_STA_INDEX == validStaIndex) &&
10227 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10228 curSta, tid, &txPktCount)))
10229 {
10230#if 0
10231 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10232 "************* %d:%d, %d ",curSta, txPktCount,
10233 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10234#endif
10235 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
10236 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10237 curSta, tid)))
10238 {
10239 /* get prepare for sending message to HAL */
10240 //baCandidate[baCandidateCount].staIdx = curSta ;
10241 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10242 newBaCandidate = WDA_ENABLE_BA ;
10243 }
10244 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10245 }
10246 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010247 /* fill the entry for all the sta with given TID's */
10248 if(WDA_ENABLE_BA == newBaCandidate)
10249 {
10250 /* move to next BA candidate */
10251 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10252 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10253 baCandidateCount++ ;
10254 newBaCandidate = WDA_DISABLE_BA ;
10255 }
10256 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010257 /* prepare and send message to hal */
10258 if( 0 < baCandidateCount)
10259 {
10260 WDI_Status status = WDI_STATUS_SUCCESS ;
10261 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10262 tWDA_ReqParams *pWdaParams =
10263 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010264 if(NULL == pWdaParams)
10265 {
10266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10267 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10268 VOS_ASSERT(0) ;
10269 return;
10270 }
10271 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10272 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10273 if(NULL == wdiTriggerBaReq)
10274 {
10275 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10276 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10277 VOS_ASSERT(0) ;
10278 vos_mem_free(pWdaParams);
10279 return;
10280 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010281 do
10282 {
10283 WDI_TriggerBAReqinfoType *triggerBaInfo =
10284 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10285 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10286 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10287 * for each request */
10288 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10289 triggerBaInfo->ucBASessionID = 0;
10290 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10291 } while(0) ;
10292 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10293 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10294 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010295 pWdaParams->pWdaContext = pWDA;
10296 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10297 pWdaParams->wdaMsgParam = NULL;
10298 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10299 WDA_TriggerBaReqCallback, pWdaParams) ;
10300 if(IS_WDI_STATUS_FAILURE(status))
10301 {
10302 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10303 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10304 vos_mem_free(pWdaParams->wdaMsgParam) ;
10305 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10306 vos_mem_free(pWdaParams) ;
10307 }
10308 }
10309 else
10310 {
10311 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10312 "There is no TID for initiating BA");
10313 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010314 if( VOS_STATUS_SUCCESS !=
10315 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10316 {
10317 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10318 "BA Activity Timer Stop Failed ");
10319 return ;
10320 }
10321 if( VOS_STATUS_SUCCESS !=
10322 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10323 {
10324 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10325 "BA Activity Timer Start Failed ");
10326 return;
10327 }
10328 return ;
10329}
Jeff Johnson295189b2012-06-20 16:38:30 -070010330/*
10331 * WDA common routine to create timer used by WDA.
10332 */
10333static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10334{
Jeff Johnson295189b2012-06-20 16:38:30 -070010335 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10336 tANI_U32 val = 0 ;
10337 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10338
10339 if(NULL == pMac)
10340 {
10341 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10342 "%s:MAC context is NULL", __FUNCTION__);
10343 VOS_ASSERT(0);
10344 return VOS_STATUS_E_FAILURE;
10345 }
10346 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10347 != eSIR_SUCCESS)
10348 {
10349 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10350 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10351 return VOS_STATUS_E_FAILURE;
10352 }
10353 val = SYS_MS_TO_TICKS(val) ;
10354
10355 /* BA activity check timer */
10356 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10357 "BA Activity Check timer", WDA_TimerHandler,
10358 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10359 if(status != TX_SUCCESS)
10360 {
10361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10362 "Unable to create BA activity timer");
10363 return eSIR_FAILURE ;
10364 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010365 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010366 /* Tx Complete Timeout timer */
10367 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10368 "Tx Complete Check timer", WDA_TimerHandler,
10369 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010370 if(status != TX_SUCCESS)
10371 {
10372 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10373 "Unable to create Tx Complete Timeout timer");
10374 /* Destroy timer of BA activity check timer */
10375 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10376 if(status != TX_SUCCESS)
10377 {
10378 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10379 "Unable to Destroy BA activity timer");
10380 return eSIR_FAILURE ;
10381 }
10382 return eSIR_FAILURE ;
10383 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010384 return eSIR_SUCCESS ;
10385}
Jeff Johnson295189b2012-06-20 16:38:30 -070010386/*
10387 * WDA common routine to destroy timer used by WDA.
10388 */
10389static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10390{
10391 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010392 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10393 if(status != TX_SUCCESS)
10394 {
10395 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10396 "Unable to Destroy Tx Complete Timeout timer");
10397 return eSIR_FAILURE ;
10398 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010399 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10400 if(status != TX_SUCCESS)
10401 {
10402 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10403 "Unable to Destroy BA activity timer");
10404 return eSIR_FAILURE ;
10405 }
10406
10407 return eSIR_SUCCESS ;
10408}
Jeff Johnson295189b2012-06-20 16:38:30 -070010409/*
10410 * WDA timer handler.
10411 */
10412void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10413{
10414 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10415 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010416 /*
10417 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10418 */
10419 wdaMsg.type = timerInfo ;
10420 wdaMsg.bodyptr = NULL;
10421 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010422 /* post the message.. */
10423 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10424 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10425 {
10426 vosStatus = VOS_STATUS_E_BADMSG;
10427 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010428}
Jeff Johnson295189b2012-06-20 16:38:30 -070010429/*
10430 * WDA Tx Complete timeout Indication.
10431 */
10432void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10433{
10434 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010435 if( pWDA->pAckTxCbFunc )
10436 {
10437 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10438 "TxComplete timer expired\n");
10439 pWDA->pAckTxCbFunc( pMac, 0);
10440 pWDA->pAckTxCbFunc = NULL;
10441 }
10442 else
10443 {
10444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10445 "There is no request pending for TxComplete and wait timer expired\n");
10446 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010447}
Jeff Johnson295189b2012-06-20 16:38:30 -070010448/*
10449 * WDA Set REG Domain to VOS NV
10450 */
10451eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10452{
10453 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10454 {
10455 return eHAL_STATUS_INVALID_PARAMETER;
10456 }
10457 return eHAL_STATUS_SUCCESS;
10458}
10459#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10460
Jeff Johnson295189b2012-06-20 16:38:30 -070010461#ifdef FEATURE_WLAN_SCAN_PNO
10462/*
10463 * FUNCTION: WDA_PNOScanReqCallback
10464 *
10465 */
10466void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10467{
10468 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010469 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10470 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010471 if(NULL == pWdaParams)
10472 {
10473 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10474 "%s: pWdaParams received NULL", __FUNCTION__);
10475 VOS_ASSERT(0) ;
10476 return ;
10477 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010478 if( pWdaParams != NULL )
10479 {
10480 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10481 {
10482 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10483 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010484 if( pWdaParams->wdaMsgParam != NULL)
10485 {
10486 vos_mem_free(pWdaParams->wdaMsgParam);
10487 }
10488
10489 vos_mem_free(pWdaParams) ;
10490 }
10491
10492 return ;
10493}
Jeff Johnson295189b2012-06-20 16:38:30 -070010494/*
10495 * FUNCTION: WDA_UpdateScanParamsCallback
10496 *
10497 */
10498void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10499{
10500 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010501 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10502 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010503 if(NULL == pWdaParams)
10504 {
10505 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10506 "%s: pWdaParams received NULL", __FUNCTION__);
10507 VOS_ASSERT(0) ;
10508 return ;
10509 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010510 if( pWdaParams != NULL )
10511 {
10512 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10513 {
10514 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10515 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010516 if( pWdaParams->wdaMsgParam != NULL)
10517 {
10518 vos_mem_free(pWdaParams->wdaMsgParam);
10519 }
10520 vos_mem_free(pWdaParams) ;
10521 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010522 return ;
10523}
Jeff Johnson295189b2012-06-20 16:38:30 -070010524/*
10525 * FUNCTION: WDA_SetPowerParamsCallback
10526 *
10527 */
10528void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10529{
Jeff Johnsone7245742012-09-05 17:12:55 -070010530 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010531
10532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10533 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010534 if(NULL == pWdaParams)
10535 {
10536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10537 "%s: pWdaParams received NULL", __FUNCTION__);
10538 VOS_ASSERT(0) ;
10539 return ;
10540 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010541 if( pWdaParams != NULL )
10542 {
10543 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10544 {
10545 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10546 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010547 if( pWdaParams->wdaMsgParam != NULL)
10548 {
10549 vos_mem_free(pWdaParams->wdaMsgParam);
10550 }
10551 vos_mem_free(pWdaParams) ;
10552 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010553 return ;
10554}
Jeff Johnson295189b2012-06-20 16:38:30 -070010555/*
10556 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10557 * Request to WDI to set Preferred Network List.Offload
10558 */
10559VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10560 tSirPNOScanReq *pPNOScanReqParams)
10561{
Jeff Johnson43971f52012-07-17 12:26:56 -070010562 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010563 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10564 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10565 tWDA_ReqParams *pWdaParams ;
10566 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10568 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010569 if(NULL == pwdiPNOScanReqInfo)
10570 {
10571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10572 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10573 VOS_ASSERT(0);
10574 return VOS_STATUS_E_NOMEM;
10575 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010576 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10577 if(NULL == pWdaParams)
10578 {
10579 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10580 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10581 VOS_ASSERT(0);
10582 vos_mem_free(pwdiPNOScanReqInfo);
10583 return VOS_STATUS_E_NOMEM;
10584 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010585 //
10586 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10587 //
10588 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10589 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010590 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10591 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10592 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010593 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10594 {
10595 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10596 &pPNOScanReqParams->aNetworks[i],
10597 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10598 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010599 /*Scan timer intervals*/
10600 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10601 &pPNOScanReqParams->scanTimers,
10602 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010603 /*Probe template for 2.4GHz band*/
10604 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10605 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10606 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010607 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10608 pPNOScanReqParams->p24GProbeTemplate,
10609 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010610 /*Probe template for 5GHz band*/
10611 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10612 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10613 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010614 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10615 pPNOScanReqParams->p5GProbeTemplate,
10616 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010617 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010618 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10619 {
10620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10621 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10622 VOS_ASSERT(0);
10623 vos_mem_free(pwdiPNOScanReqInfo) ;
10624 vos_mem_free(pWdaParams);
10625 return VOS_STATUS_E_FAILURE;
10626 }
10627
10628 /* Store Params pass it to WDI */
10629 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10630 pWdaParams->pWdaContext = pWDA;
10631 /* Store param pointer as passed in by caller */
10632 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010633 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10634 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010635 if(IS_WDI_STATUS_FAILURE(status))
10636 {
10637 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10638 "Failure in Set PNO REQ WDI API, free all the memory " );
10639 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10640 vos_mem_free(pWdaParams->wdaMsgParam);
10641 pWdaParams->wdaWdiApiMsgParam = NULL;
10642 pWdaParams->wdaMsgParam = NULL;
10643 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010644 return CONVERT_WDI2VOS_STATUS(status) ;
10645}
Jeff Johnson295189b2012-06-20 16:38:30 -070010646/*
10647 * FUNCTION: WDA_RssiFilterCallback
10648 *
10649 */
10650void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10651{
10652 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10653
10654 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10655 "<------ %s " ,__FUNCTION__);
10656
10657 VOS_ASSERT(NULL != pWdaParams);
10658
10659 vos_mem_free(pWdaParams->wdaMsgParam) ;
10660 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10661 vos_mem_free(pWdaParams) ;
10662
10663 return ;
10664}
10665/*
10666 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10667 * Request to WDI to set Preferred Network List.Offload
10668 */
10669VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10670 tSirSetRSSIFilterReq* pRssiFilterParams)
10671{
Jeff Johnson43971f52012-07-17 12:26:56 -070010672 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010673 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10674 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10675 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010676 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10677 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010678 if(NULL == pwdiSetRssiFilterReqInfo)
10679 {
10680 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10681 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10682 VOS_ASSERT(0);
10683 return VOS_STATUS_E_NOMEM;
10684 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010685 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10686 if(NULL == pWdaParams)
10687 {
10688 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10689 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10690 VOS_ASSERT(0);
10691 vos_mem_free(pwdiSetRssiFilterReqInfo);
10692 return VOS_STATUS_E_NOMEM;
10693 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010694 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10695 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010696 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10697 {
10698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10699 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10700 VOS_ASSERT(0);
10701 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
10702 vos_mem_free(pWdaParams);
10703 return VOS_STATUS_E_FAILURE;
10704 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010705 /* Store Params pass it to WDI */
10706 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10707 pWdaParams->pWdaContext = pWDA;
10708 /* Store param pointer as passed in by caller */
10709 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010710 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10711 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10712 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010713 if(IS_WDI_STATUS_FAILURE(status))
10714 {
10715 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10716 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10717 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10718 vos_mem_free(pWdaParams->wdaMsgParam);
10719 pWdaParams->wdaWdiApiMsgParam = NULL;
10720 pWdaParams->wdaMsgParam = NULL;
10721 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010722 return CONVERT_WDI2VOS_STATUS(status) ;
10723}
10724
Jeff Johnson295189b2012-06-20 16:38:30 -070010725/*
10726 * FUNCTION: WDA_ProcessUpdateScanParams
10727 * Request to WDI to update Scan Parameters
10728 */
10729VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10730 tSirUpdateScanParams *pUpdateScanParams)
10731{
Jeff Johnson43971f52012-07-17 12:26:56 -070010732 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010733 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10734 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10735 sizeof(WDI_UpdateScanParamsInfoType)) ;
10736 tWDA_ReqParams *pWdaParams ;
10737 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10739 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010740 if(NULL == wdiUpdateScanParamsInfoType)
10741 {
10742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10743 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10744 VOS_ASSERT(0);
10745 return VOS_STATUS_E_NOMEM;
10746 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010747 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10748 if ( NULL == pWdaParams )
10749 {
10750 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10751 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10752 VOS_ASSERT(0);
10753 vos_mem_free(wdiUpdateScanParamsInfoType);
10754 return VOS_STATUS_E_NOMEM;
10755 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010756 //
10757 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10758 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010759 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10760 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10761 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10762 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10763 "sir struct %d wdi struct %d",
10764 pUpdateScanParams->b11dEnabled,
10765 pUpdateScanParams->b11dResolved,
10766 pUpdateScanParams->ucChannelCount,
10767 pUpdateScanParams->usPassiveMinChTime,
10768 pUpdateScanParams->usPassiveMaxChTime,
10769 pUpdateScanParams->usActiveMinChTime,
10770 pUpdateScanParams->usActiveMaxChTime,
10771 sizeof(tSirUpdateScanParams),
10772 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10773
Jeff Johnson295189b2012-06-20 16:38:30 -070010774 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
10775 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070010776 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
10777 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070010778 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
10779 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070010780 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
10781 pUpdateScanParams->usActiveMaxChTime;
10782 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
10783 pUpdateScanParams->usActiveMinChTime;
10784 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
10785 pUpdateScanParams->usPassiveMaxChTime;
10786 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
10787 pUpdateScanParams->usPassiveMinChTime;
10788
Jeff Johnson295189b2012-06-20 16:38:30 -070010789 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
10790 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
10791 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
10792
Jeff Johnson295189b2012-06-20 16:38:30 -070010793 for ( i = 0; i <
10794 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
10795 i++)
10796 {
10797 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10798 "Update Scan Parameters channel: %d",
10799 pUpdateScanParams->aChannels[i]);
10800
10801 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
10802 pUpdateScanParams->aChannels[i];
10803 }
10804
Jeff Johnson295189b2012-06-20 16:38:30 -070010805 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010806 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10807 {
10808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10809 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10810 VOS_ASSERT(0);
10811 vos_mem_free(pWdaParams);
10812 vos_mem_free(wdiUpdateScanParamsInfoType);
10813 return VOS_STATUS_E_FAILURE;
10814 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010815 /* Store Params pass it to WDI */
10816 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
10817 pWdaParams->pWdaContext = pWDA;
10818 /* Store param pointer as passed in by caller */
10819 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070010820
Jeff Johnson295189b2012-06-20 16:38:30 -070010821
10822
10823 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
10824 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
10825 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010826 if(IS_WDI_STATUS_FAILURE(status))
10827 {
10828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10829 "Failure in Update Scan Params EQ WDI API, free all the memory " );
10830 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10831 vos_mem_free(pWdaParams->wdaMsgParam);
10832 vos_mem_free(pWdaParams);
10833 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010834 return CONVERT_WDI2VOS_STATUS(status) ;
10835}
10836#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070010837#ifdef WLAN_FEATURE_PACKET_FILTERING
10838/*
10839 * FUNCTION: WDA_8023MulticastListReqCallback
10840 *
10841 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070010842void WDA_8023MulticastListReqCallback(
10843 WDI_RcvFltPktSetMcListRspParamsType *pwdiRcvFltPktSetMcListRspInfo,
10844 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070010845{
10846 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10848 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010849 if(NULL == pWdaParams)
10850 {
10851 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10852 "%s: pWdaParams received NULL", __FUNCTION__);
10853 VOS_ASSERT(0) ;
10854 return ;
10855 }
10856
10857 vos_mem_free(pWdaParams->wdaMsgParam) ;
10858 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10859 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010860 //print a msg, nothing else to do
10861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10862 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010863 return ;
10864}
Jeff Johnson295189b2012-06-20 16:38:30 -070010865/*
10866 * FUNCTION: WDA_Process8023MulticastListReq
10867 * Request to WDI to add 8023 Multicast List
10868 */
10869VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
10870 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
10871{
Jeff Johnson43971f52012-07-17 12:26:56 -070010872 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010873 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
10874 tWDA_ReqParams *pWdaParams ;
10875 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010876 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10877 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010878 pwdiFltPktSetMcListReqParamsType =
10879 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
10880 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
10881 ) ;
10882 if(NULL == pwdiFltPktSetMcListReqParamsType)
10883 {
10884 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10885 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10886 return VOS_STATUS_E_NOMEM;
10887 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010888 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10889 if(NULL == pWdaParams)
10890 {
10891 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10892 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10893 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10894 return VOS_STATUS_E_NOMEM;
10895 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010896 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10897 {
10898 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10899 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
10900 __FUNCTION__);
10901 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10902 vos_mem_free(pWdaParams);
10903 return VOS_STATUS_E_FAILURE;
10904 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010905 //
10906 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
10907 //
10908 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070010909 pRcvFltMcAddrList->ulMulticastAddrCnt;
10910
10911 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
10912 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
10913 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
10914 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
10915
Jeff Johnson295189b2012-06-20 16:38:30 -070010916 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
10917 {
10918 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
10919 &(pRcvFltMcAddrList->multicastAddr[i]),
10920 sizeof(tSirMacAddr));
10921 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010922 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010923 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
10924 (NULL == pWDA->wdaWdiApiMsgParam)); */
Jeff Johnson295189b2012-06-20 16:38:30 -070010925 /* Store Params pass it to WDI */
10926 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
10927 pWdaParams->pWdaContext = pWDA;
10928 /* Store param pointer as passed in by caller */
10929 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070010930 status = WDI_8023MulticastListReq(
10931 pwdiFltPktSetMcListReqParamsType,
10932 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
10933 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010934 if(IS_WDI_STATUS_FAILURE(status))
10935 {
10936 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10937 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
10938 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10939 vos_mem_free(pWdaParams->wdaMsgParam);
10940 vos_mem_free(pWdaParams);
10941 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010942 return CONVERT_WDI2VOS_STATUS(status) ;
10943}
Jeff Johnson295189b2012-06-20 16:38:30 -070010944/*
10945 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
10946 *
10947 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070010948void WDA_ReceiveFilterSetFilterReqCallback(
10949 WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo,
10950 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070010951{
10952 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10954 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010955 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070010956 if(NULL == pWdaParams)
10957 {
10958 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10959 "%s: pWdaParams received NULL", __FUNCTION__);
10960 VOS_ASSERT(0) ;
10961 return ;
10962 }
10963
10964 vos_mem_free(pWdaParams->wdaMsgParam) ;
10965 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10966 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010967 //print a msg, nothing else to do
10968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10969 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010970 return ;
10971}
Jeff Johnson295189b2012-06-20 16:38:30 -070010972/*
10973 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
10974 * Request to WDI to set Receive Filters
10975 */
10976VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
10977 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
10978{
Jeff Johnson43971f52012-07-17 12:26:56 -070010979 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010980 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
10981 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
10982 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
10983 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
10984 tWDA_ReqParams *pWdaParams ;
10985 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10987 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010988 if(NULL == pwdiSetRcvPktFilterReqParamsType)
10989 {
10990 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10991 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10992 VOS_ASSERT(0);
10993 return VOS_STATUS_E_NOMEM;
10994 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010995 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10996 if(NULL == pWdaParams)
10997 {
10998 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10999 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11000 VOS_ASSERT(0);
11001 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
11002 return VOS_STATUS_E_NOMEM;
11003 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011004 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
11005 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
11006 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
11007 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070011008 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
11009 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
11010
11011 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
11012 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011013
11014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11015 "FID %d FT %d NParams %d CT %d",
11016 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
11017 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
11018 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
11019 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070011020 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
11021 {
11022 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
11023 &pRcvPktFilterCfg->paramsData[i],
11024 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070011025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11026 "Proto %d Comp Flag %d \n",
11027 pwdiSetRcvPktFilterReqParamsType->
11028 wdiPktFilterCfg.paramsData[i].protocolLayer,
11029 pwdiSetRcvPktFilterReqParamsType->
11030 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070011031 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11032 "Data Offset %d Data Len %d\n",
11033 pwdiSetRcvPktFilterReqParamsType->
11034 wdiPktFilterCfg.paramsData[i].dataOffset,
11035 pwdiSetRcvPktFilterReqParamsType->
11036 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070011037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11038 "CData: %d:%d:%d:%d:%d:%d\n",
11039 pwdiSetRcvPktFilterReqParamsType->
11040 wdiPktFilterCfg.paramsData[i].compareData[0],
11041 pwdiSetRcvPktFilterReqParamsType->
11042 wdiPktFilterCfg.paramsData[i].compareData[1],
11043 pwdiSetRcvPktFilterReqParamsType->
11044 wdiPktFilterCfg.paramsData[i].compareData[2],
11045 pwdiSetRcvPktFilterReqParamsType->
11046 wdiPktFilterCfg.paramsData[i].compareData[3],
11047 pwdiSetRcvPktFilterReqParamsType->
11048 wdiPktFilterCfg.paramsData[i].compareData[4],
11049 pwdiSetRcvPktFilterReqParamsType->
11050 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11052 "MData: %d:%d:%d:%d:%d:%d\n",
11053 pwdiSetRcvPktFilterReqParamsType->
11054 wdiPktFilterCfg.paramsData[i].dataMask[0],
11055 pwdiSetRcvPktFilterReqParamsType->
11056 wdiPktFilterCfg.paramsData[i].dataMask[1],
11057 pwdiSetRcvPktFilterReqParamsType->
11058 wdiPktFilterCfg.paramsData[i].dataMask[2],
11059 pwdiSetRcvPktFilterReqParamsType->
11060 wdiPktFilterCfg.paramsData[i].dataMask[3],
11061 pwdiSetRcvPktFilterReqParamsType->
11062 wdiPktFilterCfg.paramsData[i].dataMask[4],
11063 pwdiSetRcvPktFilterReqParamsType->
11064 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011065 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011066 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011067 /* Store Params pass it to WDI */
11068 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
11069 pWdaParams->pWdaContext = pWDA;
11070 /* Store param pointer as passed in by caller */
11071 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011072 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
11073 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
11074 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011075 if(IS_WDI_STATUS_FAILURE(status))
11076 {
11077 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11078 "Failure in SetFilter(),free all the memory,status %d ",status);
11079 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11080 vos_mem_free(pWdaParams->wdaMsgParam);
11081 vos_mem_free(pWdaParams);
11082 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011083 return CONVERT_WDI2VOS_STATUS(status) ;
11084}
Jeff Johnson295189b2012-06-20 16:38:30 -070011085/*
11086 * FUNCTION: WDA_FilterMatchCountReqCallback
11087 *
11088 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011089void WDA_FilterMatchCountReqCallback(
11090 WDI_RcvFltPktMatchCntRspParamsType *pwdiRcvFltPktMatchRspParams,
11091 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011092{
11093 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11094 tWDA_CbContext *pWDA;
11095 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
11096 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
11097 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
11098 tANI_U8 i;
11099 vos_msg_t vosMsg;
11100
11101 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11102 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011103 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
11104
Jeff Johnsone7245742012-09-05 17:12:55 -070011105 if(NULL == pRcvFltPktMatchCntRsp)
11106 {
11107 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11108 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
11109 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011110 vos_mem_free(pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -070011111 return ;
11112 }
11113
Jeff Johnson295189b2012-06-20 16:38:30 -070011114 if(NULL == pWdaParams)
11115 {
11116 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11117 "%s: pWdaParams received NULL", __FUNCTION__);
11118 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011119 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070011120 return ;
11121 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011122 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
11123 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011124 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
11125 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
11126
11127 /* Message Header */
11128 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11129 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
11130
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011131 pRcvFltPktMatchCntRsp->status = pwdiRcvFltPktMatchRspParams->wdiStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -070011132
11133 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
11134 {
11135 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
11136 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
11137 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011138 /* VOS message wrapper */
11139 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11140 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
11141 vosMsg.bodyval = 0;
11142 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
11143 {
11144 /* free the mem and return */
11145 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
11146 }
11147
11148 vos_mem_free(pWdaParams->wdaMsgParam) ;
11149 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11150 vos_mem_free(pWdaParams) ;
11151}
Jeff Johnson295189b2012-06-20 16:38:30 -070011152/*
11153 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
11154 * Request to WDI to get PC Filter Match Count
11155 */
11156VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
11157{
Jeff Johnson43971f52012-07-17 12:26:56 -070011158 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011159 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
11160 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
11161 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011162 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11163 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011164 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
11165 {
11166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11167 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11168 VOS_ASSERT(0);
11169 return VOS_STATUS_E_NOMEM;
11170 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011171 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11172 if(NULL == pWdaParams)
11173 {
11174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11175 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11176 VOS_ASSERT(0);
11177 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11178 return VOS_STATUS_E_NOMEM;
11179 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011180 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11181 {
11182 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11183 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11184 VOS_ASSERT(0);
11185 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11186 vos_mem_free(pWdaParams);
11187 return VOS_STATUS_E_FAILURE;
11188 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011189 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
11190
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011191 vos_mem_copy( pwdiRcvFltPktMatchCntReqParamsType->bssId,
11192 pRcvFltPktMatchRsp->bssId,
11193 sizeof(wpt_macAddr));
11194
Jeff Johnson295189b2012-06-20 16:38:30 -070011195 /* Store Params pass it to WDI */
11196 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
11197 pWdaParams->pWdaContext = pWDA;
11198 /* Store param pointer as passed in by caller */
11199 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011200 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11201 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11202 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011203 if(IS_WDI_STATUS_FAILURE(status))
11204 {
11205 /* failure returned by WDI API */
11206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11207 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11208 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11209 vos_mem_free(pWdaParams) ;
11210 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11211 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11212 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011213 return CONVERT_WDI2VOS_STATUS(status) ;
11214}
Jeff Johnson295189b2012-06-20 16:38:30 -070011215/*
11216 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11217 *
11218 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011219void WDA_ReceiveFilterClearFilterReqCallback(
11220 WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType,
11221 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011222{
11223 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011224 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11225 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011226/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11227 if(NULL == pWdaParams)
11228 {
11229 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11230 "%s: pWdaParams received NULL", __FUNCTION__);
11231 VOS_ASSERT(0) ;
11232 return ;
11233 }
11234
11235 vos_mem_free(pWdaParams->wdaMsgParam) ;
11236 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11237 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011238 //print a msg, nothing else to do
11239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11240 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011241 return ;
11242}
Jeff Johnson295189b2012-06-20 16:38:30 -070011243/*
11244 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11245 * Request to WDI to clear Receive Filters
11246 */
11247VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11248 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11249{
Jeff Johnson43971f52012-07-17 12:26:56 -070011250 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011251 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11252 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11253 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011254 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11255 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011256 if(NULL == pwdiRcvFltPktClearReqParamsType)
11257 {
11258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11259 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11260 VOS_ASSERT(0);
11261 return VOS_STATUS_E_NOMEM;
11262 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011263 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11264 if(NULL == pWdaParams)
11265 {
11266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11267 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11268 VOS_ASSERT(0);
11269 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11270 return VOS_STATUS_E_NOMEM;
11271 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011272 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11273 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011274 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11275 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11276 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11277 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011278
11279 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011280 /* Store Params pass it to WDI */
11281 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11282 pWdaParams->pWdaContext = pWDA;
11283 /* Store param pointer as passed in by caller */
11284 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011285 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11286 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11287 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011288 if(IS_WDI_STATUS_FAILURE(status))
11289 {
11290 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11291 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11292 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11293 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011294 return CONVERT_WDI2VOS_STATUS(status) ;
11295}
11296#endif // WLAN_FEATURE_PACKET_FILTERING
11297
Jeff Johnson295189b2012-06-20 16:38:30 -070011298/*
11299 * FUNCTION: WDA_ProcessSetPowerParamsReq
11300 * Request to WDI to set power params
11301 */
11302VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11303 tSirSetPowerParamsReq *pPowerParams)
11304{
Jeff Johnson43971f52012-07-17 12:26:56 -070011305 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011306 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11307 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011308 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011309 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11310 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011311 if(NULL == pwdiSetPowerParamsReqInfo)
11312 {
11313 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11314 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11315 VOS_ASSERT(0);
11316 return VOS_STATUS_E_NOMEM;
11317 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011318 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11319 if(NULL == pWdaParams)
11320 {
11321 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11322 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11323 VOS_ASSERT(0);
11324 vos_mem_free(pwdiSetPowerParamsReqInfo);
11325 return VOS_STATUS_E_NOMEM;
11326 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011327
Jeff Johnson295189b2012-06-20 16:38:30 -070011328
11329 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11330 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011331 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11332 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011333 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11334 pPowerParams->uListenInterval;
11335 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11336 pPowerParams->uBcastMcastFilter;
11337 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11338 pPowerParams->uEnableBET;
11339 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11340 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011341 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011342 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11343 {
11344 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11345 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11346 VOS_ASSERT(0);
11347 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
11348 vos_mem_free(pWdaParams);
11349 return VOS_STATUS_E_FAILURE;
11350 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011351 /* Store Params pass it to WDI */
11352 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11353 pWdaParams->pWdaContext = pWDA;
11354 /* Store param pointer as passed in by caller */
11355 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011356 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11357 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11358 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011359 if(IS_WDI_STATUS_FAILURE(status))
11360 {
11361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11362 "Failure in Set power params REQ WDI API, free all the memory " );
11363 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11364 vos_mem_free(pWdaParams->wdaMsgParam);
11365 pWdaParams->wdaWdiApiMsgParam = NULL;
11366 pWdaParams->wdaMsgParam = NULL;
11367 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011368 return CONVERT_WDI2VOS_STATUS(status) ;
11369}
11370
11371/*
11372 * FUNCTION: WDA_SetTmLevelRspCallback
11373 * Set TM Level response
11374 */
11375void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11376{
11377 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11378
11379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11380 "<------ %s " ,__FUNCTION__);
11381
11382 if(NULL == pWdaParams)
11383 {
11384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11385 "%s: pWdaParams received NULL", __FUNCTION__);
11386 VOS_ASSERT(0) ;
11387 return ;
11388 }
11389
11390 /* Dose not need to send notification to upper layer
11391 * Just free allocated resources */
11392 if( pWdaParams != NULL )
11393 {
11394 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11395 {
11396 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11397 }
11398 vos_mem_free(pWdaParams->wdaMsgParam) ;
11399 vos_mem_free(pWdaParams) ;
11400 }
11401}
11402
11403/*
11404 * FUNCTION: WDA_ProcessSetTmLevelReq
11405 * Set TM Level request
11406 */
11407VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11408 tAniSetTmLevelReq *setTmLevelReq)
11409{
11410 WDI_Status status = WDI_STATUS_SUCCESS ;
11411 tWDA_ReqParams *pWdaParams ;
11412 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11413 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11414 sizeof(WDI_SetTmLevelReqType)) ;
11415 if(NULL == wdiSetTmLevelReq)
11416 {
11417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11418 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11419 VOS_ASSERT(0);
11420 return VOS_STATUS_E_NOMEM;
11421 }
11422
11423 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11424 if(NULL == pWdaParams)
11425 {
11426 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11427 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11428 VOS_ASSERT(0);
11429 vos_mem_free(wdiSetTmLevelReq);
11430 return VOS_STATUS_E_NOMEM;
11431 }
11432
11433 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11434 "------> %s " ,__FUNCTION__);
11435
11436 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11437 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11438
11439 pWdaParams->pWdaContext = pWDA;
11440 pWdaParams->wdaMsgParam = setTmLevelReq;
11441 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11442
11443 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11444 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11445
11446 if(IS_WDI_STATUS_FAILURE(status))
11447 {
11448 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11449 "Failure set thernal mitigation level free all the memory " );
11450 vos_mem_free(pWdaParams->wdaMsgParam) ;
11451 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11452 vos_mem_free(pWdaParams) ;
11453 }
11454
11455 return CONVERT_WDI2VOS_STATUS(status) ;
11456}
11457
11458VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11459 tpTxControlParams pTxCtrlParam)
11460{
11461 VOS_STATUS wdaStatus;
11462
11463 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11464 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011465 if( pTxCtrlParam == NULL )
11466 {
11467 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11468 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11469 return VOS_STATUS_E_FAILURE;
11470 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011471 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11472 {
11473 wdaStatus = WDA_SuspendDataTx(pWDA);
11474 }
11475 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11476 {
11477 wdaStatus = WDA_ResumeDataTx(pWDA);
11478 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011479 return wdaStatus;
11480}
11481
11482 /* FUNCTION WDA_featureCapsExchange
11483 * WDA API to invoke capability exchange between host and FW.
11484 */
11485void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11486{
11487 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11488 "%s:enter", __FUNCTION__ );
11489 WDI_featureCapsExchangeReq( NULL, pVosContext);
11490}
11491
11492 /* FUNCTION WDA_getHostWlanFeatCaps
11493 * Wrapper for WDI API, that will return if the feature (enum value).passed
11494 * to this API is supported or not in Host
11495 * return value
11496 * 0 - implies feature is NOT Supported
11497 * any non zero value - implies feature is SUPPORTED
11498 */
11499tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11500{
11501 return WDI_getHostWlanFeatCaps(featEnumValue);
11502}
11503
11504 /* FUNCTION WDA_getFwWlanFeatCaps
11505 * Wrapper for WDI API, that will return if the feature (enum value).passed
11506 * to this API is supported or not in FW
11507 * return value
11508 * 0 - implies feature is NOT Supported
11509 * any non zero value - implies feature is SUPPORTED
11510 */
11511tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11512{
11513 return WDI_getFwWlanFeatCaps(featEnumValue);
11514}
11515
11516/*
11517 * FUNCTION: WDA_shutdown
11518 * Shutdown WDA/WDI without handshaking with Riva.
11519 * Synchronous function.
11520 */
11521VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11522{
11523 WDI_Status wdiStatus;
11524 //tANI_U8 eventIdx = 0;
11525 VOS_STATUS status = VOS_STATUS_SUCCESS;
11526 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011527 if (NULL == pWDA)
11528 {
11529 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11530 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11531 VOS_ASSERT(0);
11532 return VOS_STATUS_E_FAILURE;
11533 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011534 /* FTM mode stay START_STATE */
11535 if( (WDA_READY_STATE != pWDA->wdaState) &&
11536 (WDA_INIT_STATE != pWDA->wdaState) &&
11537 (WDA_START_STATE != pWDA->wdaState) )
11538 {
11539 VOS_ASSERT(0);
11540 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011541 if(NULL != pWDA->wdaWdiApiMsgParam)
11542 {
11543 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11544 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11545 VOS_ASSERT(0);
11546 /* the last request was not freed, probably a SSR
11547 * initiated by WLAN driver (WDI timeout) */
11548 vos_mem_free(pWDA->wdaWdiApiMsgParam);
11549 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011550 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11551 {
11552 wdaDestroyTimers(pWDA);
11553 }
11554 pWDA->wdaWdiApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011555 /* call WDI shutdown */
11556 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011557 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11558 {
11559 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11560 "error in WDA Stop" );
11561 status = VOS_STATUS_E_FAILURE;
11562 }
11563 /* WDI stop is synchrnous, shutdown is complete when it returns */
11564 pWDA->wdaState = WDA_STOP_STATE;
11565
Jeff Johnson295189b2012-06-20 16:38:30 -070011566 /* shutdown should perform the stop & close actions. */
11567 /* Destroy the event */
11568 status = vos_event_destroy(&pWDA->txFrameEvent);
11569 if(!VOS_IS_STATUS_SUCCESS(status))
11570 {
11571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11572 "VOS Event destroy failed - status = %d\n", status);
11573 status = VOS_STATUS_E_FAILURE;
11574 }
11575 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11576 if(!VOS_IS_STATUS_SUCCESS(status))
11577 {
11578 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11579 "VOS Event destroy failed - status = %d\n", status);
11580 status = VOS_STATUS_E_FAILURE;
11581 }
11582 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11583 if(!VOS_IS_STATUS_SUCCESS(status))
11584 {
11585 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11586 "VOS Event destroy failed - status = %d\n", status);
11587 status = VOS_STATUS_E_FAILURE;
11588 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011589 /* free WDA context */
11590 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11591 if ( !VOS_IS_STATUS_SUCCESS(status) )
11592 {
11593 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11594 "error in WDA close " );
11595 status = VOS_STATUS_E_FAILURE;
11596 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011597 return status;
11598}
Jeff Johnsone7245742012-09-05 17:12:55 -070011599/*
11600 * FUNCTION: WDA_stopFailed
11601 * WDA stop failed
11602 */
11603
11604void WDA_stopFailed(v_PVOID_t pVosContext)
11605{
11606 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11607 pWDA->needShutdown = TRUE;
11608}
11609/*
11610 * FUNCTION: WDA_needShutdown
11611 * WDA needs a shutdown
11612 */
11613
11614v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11615{
11616 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11617 return pWDA->needShutdown;
11618}
11619
Mohit Khanna4a70d262012-09-11 16:30:12 -070011620#ifdef WLAN_FEATURE_11AC
11621/*
11622 * FUNCTION: WDA_SetBeaconFilterReqCallback
11623 *
11624 */
11625void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11626{
11627 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11629 "<------ %s " ,__FUNCTION__);
11630 if(NULL == pWdaParams)
11631 {
11632 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11633 "%s: pWdaParams received NULL", __FUNCTION__);
11634 VOS_ASSERT(0) ;
11635 return ;
11636 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011637
Mohit Khanna4a70d262012-09-11 16:30:12 -070011638 vos_mem_free(pWdaParams->wdaMsgParam) ;
11639 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11640 vos_mem_free(pWdaParams) ;
11641 /*
11642 * No respone required for SetBeaconFilter req so just free the request
11643 * param here
11644 */
11645
11646 return ;
11647}
11648
11649VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11650 tUpdateVHTOpMode *pData)
11651{
11652 WDI_Status status = WDI_STATUS_SUCCESS ;
11653 tWDA_ReqParams *pWdaParams ;
11654 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11655 sizeof(WDI_UpdateVHTOpMode)) ;
11656 if(NULL == wdiTemp)
11657 {
11658 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11659 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11660 VOS_ASSERT(0);
11661 return VOS_STATUS_E_NOMEM;
11662 }
11663 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11664 if(NULL == pWdaParams)
11665 {
11666 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11667 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11668 VOS_ASSERT(0);
11669 vos_mem_free(wdiTemp);
11670 return VOS_STATUS_E_NOMEM;
11671 }
11672
11673 wdiTemp->opMode = pData->opMode;
11674 wdiTemp->staId = pData->staId;
11675
11676 pWdaParams->pWdaContext = pWDA;
11677 /* Store Req pointer, as this will be used for response */
11678 pWdaParams->wdaMsgParam = (void *)pData;
11679 /* store Params pass it to WDI */
11680 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11681
11682 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11683
11684 if(IS_WDI_STATUS_FAILURE(status))
11685 {
11686 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11687 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11688 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11689 vos_mem_free(pWdaParams->wdaMsgParam);
11690 vos_mem_free(pWdaParams);
11691 }
11692 return CONVERT_WDI2VOS_STATUS(status) ;
11693}
11694#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011695
11696/*==========================================================================
11697 FUNCTION WDA_TransportChannelDebug
11698
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -070011699 DESCRIPTION
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011700 Display Transport Channel debugging information
11701 User may request to display DXE channel snapshot
11702 Or if host driver detects any abnormal stcuk may display
11703
11704 PARAMETERS
11705 displaySnapshot : Dispaly DXE snapshot option
11706 enableStallDetect : Enable stall detect feature
11707 This feature will take effect to data performance
11708 Not integrate till fully verification
11709
11710 RETURN VALUE
11711 NONE
11712
11713===========================================================================*/
11714void WDA_TransportChannelDebug
11715(
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -070011716 v_PVOID_t pvosGCtx,
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011717 v_BOOL_t displaySnapshot,
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -070011718 v_BOOL_t toggleStallDetect,
11719 v_BOOL_t fullChannelsDump
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011720)
11721{
Madan Mohan Koyyalamudi48139e32012-10-11 14:43:56 -070011722 tWDA_CbContext *wdaContext = NULL;
11723 v_U32_t uDataAvailRes;
11724
11725 if ( NULL != pvosGCtx )
11726 {
11727 wdaContext = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pvosGCtx);
11728
11729 uDataAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
11730 WDI_DATA_POOL_ID);
11731
11732 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11733 "WDA_TransportChannelDebug :Flow Mask %d Res Available :%d",
11734 wdaContext->uTxFlowMask, uDataAvailRes );
11735 }
11736
11737 WDI_TransportChannelDebug(displaySnapshot, toggleStallDetect, fullChannelsDump);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011738 return;
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070011739}