blob: 4fc82c32b3bb72ba3dcadc083ea52c033fc00627 [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 {
4560 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4561 "Set link state called when WDA is not in READY STATE " );
4562 status = WDA_IGNORE_SET_LINK_STATE;
4563 }
4564 break;
4565 }
4566
4567 return status;
4568}
Jeff Johnson295189b2012-06-20 16:38:30 -07004569/*
4570 * FUNCTION: WDA_SetLinkStateCallback
4571 * call back function for set link state from WDI
4572 */
4573void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
4574{
4575 tWDA_CbContext *pWDA;
4576 tLinkStateParams *linkStateParams;
4577 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07004578 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4579 "<------ %s " ,__FUNCTION__);
4580 if(NULL == pWdaParams)
4581 {
4582 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4583 "%s: pWdaParams received NULL", __FUNCTION__);
4584 VOS_ASSERT(0) ;
4585 return ;
4586 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07004588 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004589 /*
4590 * In STA mode start the BA activity check timer after association
4591 * and in AP mode start BA activity check timer after BSS start */
4592 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
4593 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
4594 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
4595 {
4596 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4597 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004598 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004599 /*
4600 * No respone required for WDA_SET_LINK_STATE so free the request
4601 * param here
4602 */
4603 if( pWdaParams != NULL )
4604 {
4605 if( pWdaParams->wdaWdiApiMsgParam != NULL )
4606 {
4607 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4608 }
4609 vos_mem_free(pWdaParams);
4610 }
4611 return ;
4612}
Jeff Johnson295189b2012-06-20 16:38:30 -07004613/*
4614 * FUNCTION: WDA_ProcessSetLinkState
4615 * Request to WDI to set the link status.
4616 */
4617VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
4618 tLinkStateParams *linkStateParams)
4619{
4620 WDI_Status status = WDI_STATUS_SUCCESS ;
4621 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
4622 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
4623 sizeof(WDI_SetLinkReqParamsType)) ;
4624 tWDA_ReqParams *pWdaParams ;
4625 tpAniSirGlobal pMac;
4626 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
4627
4628 if(NULL == pMac)
4629 {
4630 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4631 "%s:pMac is NULL", __FUNCTION__);
4632 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004633 vos_mem_free(wdiSetLinkStateParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004634 return VOS_STATUS_E_FAILURE;
4635 }
4636
4637 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4638 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004639 if(NULL == wdiSetLinkStateParam)
4640 {
4641 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4642 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4643 VOS_ASSERT(0);
4644 return VOS_STATUS_E_NOMEM;
4645 }
4646 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4647 if(NULL == pWdaParams)
4648 {
4649 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4650 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4651 VOS_ASSERT(0);
4652 vos_mem_free(wdiSetLinkStateParam);
4653 return VOS_STATUS_E_NOMEM;
4654 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004655 if(WDA_IGNORE_SET_LINK_STATE ==
4656 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
4657 {
4658 status = WDI_STATUS_E_FAILURE;
4659 }
4660 else
4661 {
4662 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
4663 linkStateParams->bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
4665 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004666 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
4667 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004668 pWdaParams->pWdaContext = pWDA;
4669 /* Store remove key pointer, as this will be used for response */
4670 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004671 /* store Params pass it to WDI */
4672 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
4673 /* Stop Timer only other than GO role and concurrent session */
4674 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
4675 && !vos_concurrent_sessions_running() &&
4676 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
4677 {
4678 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4679 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004680 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
4681 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004682 if(IS_WDI_STATUS_FAILURE(status))
4683 {
4684 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4685 "Failure in set link state Req WDI API, free all the memory " );
4686 }
4687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004688 if(IS_WDI_STATUS_FAILURE(status))
4689 {
4690 vos_mem_free(wdiSetLinkStateParam) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07004691 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 vos_mem_free(pWdaParams);
4693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004694 return CONVERT_WDI2VOS_STATUS(status) ;
4695}
Jeff Johnson295189b2012-06-20 16:38:30 -07004696/*
4697 * FUNCTION: WDA_GetStatsReqParamsCallback
4698 * send the response to PE with Stats received from WDI
4699 */
4700void WDA_GetStatsReqParamsCallback(
4701 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
4702 void* pUserData)
4703{
4704 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4705 tAniGetPEStatsRsp *pGetPEStatsRspParams;
4706
4707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4708 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004709 pGetPEStatsRspParams =
4710 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
4711 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
4712
4713 if(NULL == pGetPEStatsRspParams)
4714 {
4715 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4716 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4717 VOS_ASSERT(0);
4718 return;
4719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004720 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
4721 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
4722 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
4723 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
4724 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
4725
4726 //Fill the Session Id Properly in PE
4727 pGetPEStatsRspParams->sessionId = 0;
4728 pGetPEStatsRspParams->rc =
4729 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
4730 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
4731 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 vos_mem_copy( pGetPEStatsRspParams + 1,
4733 wdiGetStatsRsp + 1,
4734 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004735 /* send response to UMAC*/
4736 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
4737
4738 return;
4739}
4740
Jeff Johnson295189b2012-06-20 16:38:30 -07004741/*
4742 * FUNCTION: WDA_ProcessGetStatsReq
4743 * Request to WDI to get the statistics
4744 */
4745VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
4746 tAniGetPEStatsReq *pGetStatsParams)
4747{
4748 WDI_Status status = WDI_STATUS_SUCCESS ;
4749 WDI_GetStatsReqParamsType wdiGetStatsParam;
4750 tAniGetPEStatsRsp *pGetPEStatsRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004751 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4752 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004753 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
4754 pGetStatsParams->staId;
4755 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
4756 pGetStatsParams->statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004757 wdiGetStatsParam.wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 status = WDI_GetStatsReq(&wdiGetStatsParam,
4759 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07004760 if(IS_WDI_STATUS_FAILURE(status))
4761 {
4762 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4763 "Failure in Get Stats Req WDI API, free all the memory " );
4764 pGetPEStatsRspParams =
4765 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
4766 if(NULL == pGetPEStatsRspParams)
4767 {
4768 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4769 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4770 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004771 vos_mem_free(pGetStatsParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004772 return VOS_STATUS_E_NOMEM;
4773 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004774 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
4775 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
4776 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
4777 pGetPEStatsRspParams->rc = eSIR_FAILURE;
4778 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
4779 (void *)pGetPEStatsRspParams, 0) ;
4780 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 /* Free the request message */
4782 vos_mem_free(pGetStatsParams);
4783 return CONVERT_WDI2VOS_STATUS(status);
4784}
Jeff Johnson295189b2012-06-20 16:38:30 -07004785/*
4786 * FUNCTION: WDA_UpdateEDCAParamCallback
4787 * call back function for Update EDCA params from WDI
4788 */
4789void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
4790{
4791 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4792 tEdcaParams *pEdcaParams;
4793
4794 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4795 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004796 if(NULL == pWdaParams)
4797 {
4798 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4799 "%s: pWdaParams received NULL", __FUNCTION__);
4800 VOS_ASSERT(0) ;
4801 return ;
4802 }
4803 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004804 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4805 vos_mem_free(pWdaParams);
4806 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004807 return ;
4808}
Jeff Johnson295189b2012-06-20 16:38:30 -07004809/*
4810 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
4811 * Request to WDI to Update the EDCA params.
4812 */
4813VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
4814 tEdcaParams *pEdcaParams)
4815{
4816 WDI_Status status = WDI_STATUS_SUCCESS ;
4817 WDI_UpdateEDCAParamsType *wdiEdcaParam =
4818 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
4819 sizeof(WDI_UpdateEDCAParamsType)) ;
4820 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4822 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004823 if(NULL == wdiEdcaParam)
4824 {
4825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4826 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4827 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004828 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004829 return VOS_STATUS_E_NOMEM;
4830 }
4831 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4832 if(NULL == pWdaParams)
4833 {
4834 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4835 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4836 VOS_ASSERT(0);
4837 vos_mem_free(wdiEdcaParam);
Jeff Johnsone7245742012-09-05 17:12:55 -07004838 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004839 return VOS_STATUS_E_NOMEM;
4840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004841 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
4842 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
4843 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
4844 &pEdcaParams->acbe);
4845 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
4846 &pEdcaParams->acbk);
4847 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
4848 &pEdcaParams->acvi);
4849 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
4850 &pEdcaParams->acvo);
4851 wdiEdcaParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004852 pWdaParams->pWdaContext = pWDA;
4853 /* Store remove key pointer, as this will be used for response */
4854 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004855 /* store Params pass it to WDI */
4856 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004857 status = WDI_UpdateEDCAParams(wdiEdcaParam,
4858 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 if(IS_WDI_STATUS_FAILURE(status))
4860 {
4861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4862 "Failure in Update EDCA Params WDI API, free all the memory " );
4863 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4864 vos_mem_free(pWdaParams);
4865 vos_mem_free(pEdcaParams);
4866 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004867 return CONVERT_WDI2VOS_STATUS(status) ;
4868}
Jeff Johnson295189b2012-06-20 16:38:30 -07004869/*
4870 * FUNCTION: WDA_AddBAReqCallback
4871 * send ADD BA RSP back to PE
4872 */
4873void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
4874 void* pUserData)
4875{
4876 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4877 tWDA_CbContext *pWDA;
4878 tAddBAParams *pAddBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004879 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4880 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004881 if(NULL == pWdaParams)
4882 {
4883 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4884 "%s: pWdaParams received NULL", __FUNCTION__);
4885 VOS_ASSERT(0) ;
4886 return ;
4887 }
4888 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4889 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004890 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4891 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004892 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004893 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004894 return ;
4895}
4896
Jeff Johnson295189b2012-06-20 16:38:30 -07004897/*
4898 * FUNCTION: WDA_ProcessAddBAReq
4899 * Request to WDI to Update the ADDBA REQ params.
4900 */
4901VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
4902 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
4903{
Jeff Johnson43971f52012-07-17 12:26:56 -07004904 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07004905 WDI_AddBAReqParamsType *wdiAddBAReqParam =
4906 (WDI_AddBAReqParamsType *)vos_mem_malloc(
4907 sizeof(WDI_AddBAReqParamsType)) ;
4908 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4910 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004911 if(NULL == wdiAddBAReqParam)
4912 {
4913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4914 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4915 VOS_ASSERT(0);
4916 return VOS_STATUS_E_NOMEM;
4917 }
4918 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4919 if(NULL == pWdaParams)
4920 {
4921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4922 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4923 VOS_ASSERT(0);
4924 vos_mem_free(wdiAddBAReqParam);
4925 return VOS_STATUS_E_NOMEM;
4926 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004927 do
4928 {
4929 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004930 wdiAddBaInfo->ucSTAIdx = staIdx ;
4931 wdiAddBaInfo->ucBaSessionID = baSessionID ;
4932 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004933 } while(0) ;
4934 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004935 pWdaParams->pWdaContext = pWDA;
4936 /* store Params pass it to WDI */
4937 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
4938 pWdaParams->wdaMsgParam = pAddBAReqParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07004939 wstatus = WDI_AddBAReq(wdiAddBAReqParam,
4940 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004941
Jeff Johnson43971f52012-07-17 12:26:56 -07004942 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07004943 {
4944 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07004945 "Failure in ADD BA REQ Params WDI API, free all the memory" );
4946 status = CONVERT_WDI2VOS_STATUS(wstatus);
4947 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004948 vos_mem_free(pWdaParams);
4949 pAddBAReqParams->status = eSIR_FAILURE;
4950 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
4951 }
Jeff Johnson43971f52012-07-17 12:26:56 -07004952 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07004953}
Jeff Johnson295189b2012-06-20 16:38:30 -07004954/*
4955 * FUNCTION: WDA_AddBASessionReqCallback
4956 * send ADD BA SESSION RSP back to PE/(or TL)
4957 */
4958void WDA_AddBASessionReqCallback(
4959 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
4960{
4961 VOS_STATUS status = VOS_STATUS_SUCCESS ;
4962 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4963 tWDA_CbContext *pWDA;
4964 tAddBAParams *pAddBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004965 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4966 "<------ %s " ,__FUNCTION__);
4967 if(NULL == pWdaParams)
4968 {
4969 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4970 "%s: pWdaParams received NULL", __FUNCTION__);
4971 VOS_ASSERT(0) ;
4972 return ;
4973 }
4974 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4975 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004976 if( NULL == pAddBAReqParams )
4977 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004978 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4979 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
4980 VOS_ASSERT( 0 );
Jeff Johnsone7245742012-09-05 17:12:55 -07004981 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4982 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004983 return ;
4984 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4986 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 /*
4988 * if WDA in update TL state, update TL with BA session parama and send
4989 * another request to HAL(/WDI) (ADD_BA_REQ)
4990 */
4991
4992 if((VOS_STATUS_SUCCESS ==
4993 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
4994 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
4995 {
4996 /* Update TL with BA info received from HAL/WDI */
4997 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
4998 wdiAddBaSession->usBaSessionID,
4999 wdiAddBaSession->ucSTAIdx,
5000 wdiAddBaSession->ucBaTID,
5001 wdiAddBaSession->ucBaBufferSize,
5002 wdiAddBaSession->ucWinSize,
5003 wdiAddBaSession->usBaSSN );
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5005 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5006 }
5007 else
5008 {
5009 pAddBAReqParams->status =
5010 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5011
5012 /* Setting Flag to indicate that Set BA is success */
5013 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5014 {
5015 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5016 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5017 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5018 }
5019 pWDA->wdaMsgParam = NULL;
5020 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5021 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005022 /*Reset the WDA state to READY */
5023 pWDA->wdaState = WDA_READY_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005024 return ;
5025}
5026
Jeff Johnson295189b2012-06-20 16:38:30 -07005027/*
5028 * FUNCTION: WDA_ProcessAddBASessionReq
5029 * Request to WDI to Update the ADDBA REQ params.
5030 */
5031VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5032 tAddBAParams *pAddBAReqParams)
5033{
5034 WDI_Status status = WDI_STATUS_SUCCESS ;
5035 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5036 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5037 sizeof(WDI_AddBASessionReqParamsType)) ;
5038 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5040 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005041 if(NULL == wdiAddBASessionReqParam)
5042 {
5043 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5044 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5045 VOS_ASSERT(0);
5046 return VOS_STATUS_E_NOMEM;
5047 }
5048 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5049 if(NULL == pWdaParams)
5050 {
5051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5052 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5053 VOS_ASSERT(0);
5054 vos_mem_free(wdiAddBASessionReqParam);
5055 return VOS_STATUS_E_NOMEM;
5056 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005057 /*
5058 * Populate ADD BA parameters and pass these paarmeters to WDI.
5059 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5060 * the state to track if these is BA recipient case or BA initiator
5061 * case.
5062 */
5063 do
5064 {
5065 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5066 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5067 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5068 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5069 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5070 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5071 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005072 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
Jeff Johnson295189b2012-06-20 16:38:30 -07005073 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5074 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5075 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5076 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5077 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 /* check the BA direction and update state accordingly */
5079 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5080 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5081 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5082
5083 }while(0) ;
5084 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005085 pWdaParams->pWdaContext = pWDA;
5086 /* Store ADD BA pointer, as this will be used for response */
5087 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5088 /* store Params pass it to WDI */
5089 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005090 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5091 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005092 if(IS_WDI_STATUS_FAILURE(status))
5093 {
5094 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5095 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5096 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5097 vos_mem_free(pWdaParams->wdaMsgParam);
5098 vos_mem_free(pWdaParams);
5099 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005100 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005101}
Jeff Johnson295189b2012-06-20 16:38:30 -07005102/*
5103 * FUNCTION: WDA_DelBANotifyTL
5104 * send DEL BA IND to TL
5105 */
5106void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5107 tDelBAParams *pDelBAReqParams)
5108{
5109 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5110 //tSirMsgQ msg;
5111 vos_msg_t vosMsg;
5112 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005113 if(NULL == pDelBAInd)
5114 {
5115 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5116 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5117 VOS_ASSERT(0) ;
5118 return;
5119 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005120 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5121 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5122 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5123 pDelBAInd->mesgLen = sizeof( tDelBAInd );
Jeff Johnsone7245742012-09-05 17:12:55 -07005124
Jeff Johnson295189b2012-06-20 16:38:30 -07005125
5126 vosMsg.type = WDA_DELETEBA_IND;
5127 vosMsg.bodyptr = pDelBAInd;
5128 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5129 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5130 {
5131 vosStatus = VOS_STATUS_E_BADMSG;
5132 }
5133}
Jeff Johnson295189b2012-06-20 16:38:30 -07005134/*
5135 * FUNCTION: WDA_DelBAReqCallback
5136 * send DEL BA RSP back to PE
5137 */
5138void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5139{
5140 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5141 tWDA_CbContext *pWDA;
5142 tDelBAParams *pDelBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07005143 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5144 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005145 if(NULL == pWdaParams)
5146 {
5147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5148 "%s: pWdaParams received NULL", __FUNCTION__);
5149 VOS_ASSERT(0) ;
5150 return ;
5151 }
5152 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5153 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005154 /* Notify TL about DEL BA in case of recipinet */
5155 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5156 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5157 {
5158 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5159 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005160 /*
5161 * No respone required for WDA_DELBA_IND so just free the request
5162 * param here
5163 */
5164 vos_mem_free(pDelBAReqParams);
5165 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5166 vos_mem_free(pWdaParams);
5167 return ;
5168}
5169
Jeff Johnson295189b2012-06-20 16:38:30 -07005170/*
5171 * FUNCTION: WDA_ProcessDelBAReq
5172 * Request to WDI to Update the DELBA REQ params.
5173 */
5174VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5175 tDelBAParams *pDelBAReqParams)
5176{
5177 WDI_Status status = WDI_STATUS_SUCCESS ;
5178 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5179 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5180 sizeof(WDI_DelBAReqParamsType)) ;
5181 tWDA_ReqParams *pWdaParams ;
5182 tANI_U16 staIdx = 0;
5183 tANI_U8 tid = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005184 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5185 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005186 if(NULL == wdiDelBAReqParam)
5187 {
5188 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5189 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5190 VOS_ASSERT(0);
5191 return VOS_STATUS_E_NOMEM;
5192 }
5193 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5194 if(NULL == pWdaParams)
5195 {
5196 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5197 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5198 VOS_ASSERT(0);
5199 vos_mem_free(wdiDelBAReqParam);
5200 return VOS_STATUS_E_NOMEM;
5201 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005202 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5203 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5204 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5205 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005206 pWdaParams->pWdaContext = pWDA;
5207 /* Store DEL BA pointer, as this will be used for response */
5208 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005209 /* store Params pass it to WDI */
5210 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005211 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5212 * maintained in WDA, so that WDA can retry for another BA session
5213 */
5214 staIdx = pDelBAReqParams->staIdx;
5215 tid = pDelBAReqParams->baTID;
5216 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
Jeff Johnson295189b2012-06-20 16:38:30 -07005217 status = WDI_DelBAReq(wdiDelBAReqParam,
5218 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005219 if(IS_WDI_STATUS_FAILURE(status))
5220 {
5221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5222 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5223 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5224 vos_mem_free(pWdaParams->wdaMsgParam);
5225 vos_mem_free(pWdaParams);
5226 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005227 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005228}
Jeff Johnson295189b2012-06-20 16:38:30 -07005229/*
5230 * FUNCTION: WDA_AddTSReqCallback
5231 * send ADD TS RSP back to PE
5232 */
5233void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5234{
5235 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5236 tWDA_CbContext *pWDA;
5237 tAddTsParams *pAddTsReqParams;
5238
5239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5240 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005241 if(NULL == pWdaParams)
5242 {
5243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5244 "%s: pWdaParams received NULL", __FUNCTION__);
5245 VOS_ASSERT(0) ;
5246 return ;
5247 }
5248 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5249 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5250 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5251 vos_mem_free(pWdaParams);
5252
5253 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005254 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005255 return ;
5256}
5257
Jeff Johnson295189b2012-06-20 16:38:30 -07005258/*
5259 * FUNCTION: WDA_ProcessAddTSReq
5260 * Request to WDI to Update the ADD TS REQ params.
5261 */
5262VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5263 tAddTsParams *pAddTsReqParams)
5264{
5265 WDI_Status status = WDI_STATUS_SUCCESS ;
5266 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5267 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5268 sizeof(WDI_AddTSReqParamsType)) ;
5269 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5271 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005272 if(NULL == wdiAddTSReqParam)
5273 {
5274 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5275 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5276 VOS_ASSERT(0);
5277 return VOS_STATUS_E_NOMEM;
5278 }
5279 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5280 if(NULL == pWdaParams)
5281 {
5282 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5283 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5284 VOS_ASSERT(0);
5285 vos_mem_free(wdiAddTSReqParam);
5286 return VOS_STATUS_E_NOMEM;
5287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005288 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5289 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005290 //TS IE
5291 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5292 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5293 pAddTsReqParams->tspec.length;
5294
5295 //TS IE : TS INFO : TRAFFIC
5296 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5297 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5298 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5299 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5300 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5301 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5302 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5303 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5304 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5305 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5306 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5307 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5308 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5309 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5310 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5311 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5312
5313 //TS IE : TS INFO : SCHEDULE
5314 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5315 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5316 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5317 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
Jeff Johnson295189b2012-06-20 16:38:30 -07005318 //TS IE
5319 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5320 pAddTsReqParams->tspec.nomMsduSz;
5321 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5322 pAddTsReqParams->tspec.maxMsduSz;
5323 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5324 pAddTsReqParams->tspec.minSvcInterval;
5325 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5326 pAddTsReqParams->tspec.maxSvcInterval;
5327 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5328 pAddTsReqParams->tspec.inactInterval;
5329 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5330 pAddTsReqParams->tspec.suspendInterval;
5331 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5332 pAddTsReqParams->tspec.svcStartTime;
5333 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5334 pAddTsReqParams->tspec.minDataRate;
5335 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5336 pAddTsReqParams->tspec.meanDataRate;
5337 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5338 pAddTsReqParams->tspec.peakDataRate;
5339 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5340 pAddTsReqParams->tspec.maxBurstSz;
5341 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5342 pAddTsReqParams->tspec.delayBound;
5343 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5344 pAddTsReqParams->tspec.minPhyRate;
5345 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5346 pAddTsReqParams->tspec.surplusBw;
5347 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5348 pAddTsReqParams->tspec.mediumTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07005349 /* TODO: tAddTsParams doesn't have the following fields */
5350#if 0
5351 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5352 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5353 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5354 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5355#endif
5356 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5357
5358 pWdaParams->pWdaContext = pWDA;
5359 /* Store ADD TS pointer, as this will be used for response */
5360 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005361 /* store Params pass it to WDI */
5362 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005363 status = WDI_AddTSReq(wdiAddTSReqParam,
5364 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005365 if(IS_WDI_STATUS_FAILURE(status))
5366 {
5367 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5368 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5369 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5370 vos_mem_free(pWdaParams);
5371 pAddTsReqParams->status = eSIR_FAILURE ;
5372 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5373 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005374 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005375}
5376
Jeff Johnson295189b2012-06-20 16:38:30 -07005377/*
5378 * FUNCTION: WDA_DelTSReqCallback
5379 * send DEL TS RSP back to PE
5380 */
5381void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5382{
5383 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5385 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005386 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5387 vos_mem_free(pWdaParams->wdaMsgParam) ;
5388 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005389 /*
5390 * No respone required for WDA_DEL_TS_REQ so just free the request
5391 * param here
5392 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005393 return ;
5394}
5395
Jeff Johnson295189b2012-06-20 16:38:30 -07005396/*
5397 * FUNCTION: WDA_ProcessDelTSReq
5398 * Request to WDI to Update the DELTS REQ params.
5399 */
5400VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5401 tDelTsParams *pDelTSReqParams)
5402{
5403 WDI_Status status = WDI_STATUS_SUCCESS ;
5404 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5405 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5406 sizeof(WDI_DelTSReqParamsType)) ;
5407 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005408 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5409 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005410 if(NULL == wdiDelTSReqParam)
5411 {
5412 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5413 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5414 VOS_ASSERT(0);
5415 return VOS_STATUS_E_NOMEM;
5416 }
5417 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5418 if(NULL == pWdaParams)
5419 {
5420 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5421 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5422 VOS_ASSERT(0);
5423 vos_mem_free(wdiDelTSReqParam);
5424 return VOS_STATUS_E_NOMEM;
5425 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005426 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
5427 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
5428 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
5429 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
5430 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005431 pWdaParams->pWdaContext = pWDA;
5432 /* Store DEL TS pointer, as this will be used for response */
5433 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005434 /* store Params pass it to WDI */
5435 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005436 status = WDI_DelTSReq(wdiDelTSReqParam,
5437 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005438 if(IS_WDI_STATUS_FAILURE(status))
5439 {
5440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5441 "Failure in DEL TS REQ Params WDI API, free all the memory " );
5442 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5443 vos_mem_free(pWdaParams->wdaMsgParam);
5444 vos_mem_free(pWdaParams);
5445 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005446 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005447}
Jeff Johnson295189b2012-06-20 16:38:30 -07005448/*
5449 * FUNCTION: WDA_UpdateBeaconParamsCallback
5450 * Free the memory. No need to send any response to PE in this case
5451 */
5452void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
5453{
5454 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005455 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5456 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005457 if(NULL == pWdaParams)
5458 {
5459 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5460 "%s: pWdaParams received NULL", __FUNCTION__);
5461 VOS_ASSERT(0) ;
5462 return ;
5463 }
5464 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5465 vos_mem_free(pWdaParams->wdaMsgParam) ;
5466 vos_mem_free(pWdaParams);
5467 /*
5468 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
5469 * param here
5470 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005471 return ;
5472}
Jeff Johnson295189b2012-06-20 16:38:30 -07005473/*
5474 * FUNCTION: WDA_ProcessUpdateBeaconParams
5475 * Request to WDI to send the beacon parameters to HAL to update the Hardware
5476 */
5477VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
5478 tUpdateBeaconParams *pUpdateBeaconParams)
5479{
5480 WDI_Status status = WDI_STATUS_SUCCESS ;
5481 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
5482 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
5483 sizeof(WDI_UpdateBeaconParamsType)) ;
5484 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5486 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005487 if(NULL == wdiUpdateBeaconParams)
5488 {
5489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5490 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5491 VOS_ASSERT(0);
5492 return VOS_STATUS_E_NOMEM;
5493 }
5494 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5495 if(NULL == pWdaParams)
5496 {
5497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5498 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5499 VOS_ASSERT(0);
5500 vos_mem_free(wdiUpdateBeaconParams);
5501 return VOS_STATUS_E_NOMEM;
5502 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005503 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
5504 pUpdateBeaconParams->bssIdx;
5505 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
5506 pUpdateBeaconParams->fShortPreamble;
5507 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
5508 pUpdateBeaconParams->fShortSlotTime;
5509 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
5510 pUpdateBeaconParams->beaconInterval;
5511 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
5512 pUpdateBeaconParams->llaCoexist;
5513 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
5514 pUpdateBeaconParams->llbCoexist;
5515 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
5516 pUpdateBeaconParams->llgCoexist;
5517 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
5518 pUpdateBeaconParams->ht20MhzCoexist;
5519 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
5520 pUpdateBeaconParams->llnNonGFCoexist;
5521 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
5522 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
5523 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
5524 pUpdateBeaconParams->fRIFSMode;
5525 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
5526 pUpdateBeaconParams->paramChangeBitmap;
5527 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
5528
5529 pWdaParams->pWdaContext = pWDA;
5530 /* Store UpdateBeacon Req pointer, as this will be used for response */
5531 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005532 /* store Params pass it to WDI */
5533 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005534 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
5535 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
5536 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005537 if(IS_WDI_STATUS_FAILURE(status))
5538 {
5539 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5540 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
5541 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5542 vos_mem_free(pWdaParams->wdaMsgParam);
5543 vos_mem_free(pWdaParams);
5544 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005545 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005546}
Jeff Johnson295189b2012-06-20 16:38:30 -07005547#ifdef FEATURE_WLAN_CCX
Jeff Johnson295189b2012-06-20 16:38:30 -07005548/*
5549 * FUNCTION: WDA_TSMStatsReqCallback
5550 * send TSM Stats RSP back to PE
5551 */
5552void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
5553{
5554 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5555 tWDA_CbContext *pWDA = NULL;
5556 tTSMStats *pTsmRspParams = NULL;
5557
5558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5559 "<------ Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005560 if(NULL == pWdaParams)
5561 {
5562 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5563 "%s: pWdaParams received NULL", __FUNCTION__);
5564 VOS_ASSERT(0) ;
5565 return ;
5566 }
5567 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5568 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005569 if( NULL == pTsmRspParams )
5570 {
5571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5572 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
5573 VOS_ASSERT( 0 );
5574 return ;
5575 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005576 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5577 vos_mem_free(pWdaParams);
5578
5579 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
5580 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
5581 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
5582 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
5583 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
5584 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
5585 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
5586 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
5587 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
5588 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
Jeff Johnson295189b2012-06-20 16:38:30 -07005589 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005590 return ;
5591}
5592
5593
Jeff Johnson295189b2012-06-20 16:38:30 -07005594/*
5595 * FUNCTION: WDA_ProcessTsmStatsReq
5596 * Request to WDI to get the TSM Stats params.
5597 */
5598VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
5599 tTSMStats *pTsmStats)
5600{
5601 WDI_Status status = WDI_STATUS_SUCCESS ;
5602 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
5603 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005604 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5605 "------> Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005606 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5607 {
5608 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5609 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5610 VOS_ASSERT(0);
5611 return VOS_STATUS_E_FAILURE;
5612 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005613 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
5614 sizeof(WDI_TSMStatsReqParamsType));
5615 if(NULL == wdiTSMReqParam)
5616 {
5617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5618 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5619 VOS_ASSERT(0);
5620 return VOS_STATUS_E_NOMEM;
5621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005622 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5623 if(NULL == pWdaParams)
5624 {
5625 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5626 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5627 VOS_ASSERT(0);
5628 vos_mem_free(wdiTSMReqParam);
5629 return VOS_STATUS_E_NOMEM;
5630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005631 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
5632 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
5633 pTsmStats->bssId,
5634 sizeof(wpt_macAddr));
5635 wdiTSMReqParam->wdiReqStatusCB = NULL ;
5636
5637 pWdaParams->pWdaContext = pWDA;
5638 /* Store TSM Stats pointer, as this will be used for response */
5639 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005640 /* store Params pass it to WDI */
5641 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005642 status = WDI_TSMStatsReq(wdiTSMReqParam,
5643 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005644 if(IS_WDI_STATUS_FAILURE(status))
5645 {
5646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5647 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
5648 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5649 vos_mem_free(pWdaParams) ;
5650 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005651 return CONVERT_WDI2VOS_STATUS(status) ;
5652}
5653#endif
5654/*
5655 * FUNCTION: WDA_SendBeaconParamsCallback
5656 * No need to send any response to PE in this case
5657 */
5658void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
5659{
5660
Jeff Johnson295189b2012-06-20 16:38:30 -07005661 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5662 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005663 return ;
5664}
Jeff Johnson295189b2012-06-20 16:38:30 -07005665/*
5666 * FUNCTION: WDA_ProcessSendBeacon
5667 * Request to WDI to send the beacon template to HAL to update the TPE memory and
5668 * start beacon trasmission
5669 */
5670VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
5671 tSendbeaconParams *pSendbeaconParams)
5672{
5673 WDI_Status status = WDI_STATUS_SUCCESS ;
5674 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005675 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5676 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005677 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
5678 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
5679 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
5680 pSendbeaconParams->beaconLength;
5681#ifdef WLAN_SOFTAP_FEATURE
5682 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
5683 pSendbeaconParams->timIeOffset;
5684#endif
5685#ifdef WLAN_FEATURE_P2P
5686 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
5687 pSendbeaconParams->p2pIeOffset;
5688#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005689 /* Copy the beacon template to local buffer */
5690 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
5691 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
5692 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
5693
Jeff Johnson295189b2012-06-20 16:38:30 -07005694 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
5695 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005696 if(IS_WDI_STATUS_FAILURE(status))
5697 {
5698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5699 "Failure in SEND BEACON REQ Params WDI API" );
5700 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005701 vos_mem_free(pSendbeaconParams);
5702 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005703}
Jeff Johnson295189b2012-06-20 16:38:30 -07005704/*
5705 * FUNCTION: WDA_UpdateProbeRspParamsCallback
5706 * No need to send any response to PE in this case
5707 */
5708void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
5709{
Jeff Johnson295189b2012-06-20 16:38:30 -07005710 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5711 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005712 return ;
5713}
5714
Jeff Johnson295189b2012-06-20 16:38:30 -07005715/*
5716 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
5717 * Request to WDI to send the probe response template to HAL to update the TPE memory and
5718 * send probe response
5719 */
5720VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
5721 tSendProbeRespParams *pSendProbeRspParams)
5722{
5723 WDI_Status status = WDI_STATUS_SUCCESS ;
5724 WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam;
5725 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5726 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005727 /*Copy update probe response parameters*/
5728 vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID,
5729 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
5730 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
5731 pSendProbeRspParams->probeRespTemplateLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07005732 /* Copy the Probe Response template to local buffer */
5733 vos_mem_copy(
5734 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
5735 pSendProbeRspParams->pProbeRespTemplate,
5736 pSendProbeRspParams->probeRespTemplateLen);
5737 vos_mem_copy(
5738 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
5739 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
5740 WDI_PROBE_REQ_BITMAP_IE_LEN);
5741
5742 wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
5743
Jeff Johnson295189b2012-06-20 16:38:30 -07005744 status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam,
5745 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005746 if(IS_WDI_STATUS_FAILURE(status))
5747 {
5748 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5749 "Failure in SEND Probe RSP Params WDI API" );
5750 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005751 vos_mem_free(pSendProbeRspParams);
5752 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005753}
Jeff Johnson295189b2012-06-20 16:38:30 -07005754#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
5755/*
5756 * FUNCTION: WDA_SetMaxTxPowerCallBack
5757 * send the response to PE with power value received from WDI
5758 */
5759void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
5760 void* pUserData)
5761{
5762 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5763 tWDA_CbContext *pWDA = NULL;
5764 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
5765
5766 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5767 "<------ %s " ,__FUNCTION__);
5768 if(NULL == pWdaParams)
5769 {
5770 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5771 "%s: pWdaParams received NULL", __FUNCTION__);
5772 VOS_ASSERT(0) ;
5773 return ;
5774 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005775 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5776 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005777 if( NULL == pMaxTxPowerParams )
5778 {
5779 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5780 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07005781 VOS_ASSERT(0);
5782 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5783 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005784 return ;
5785 }
Jeff Johnsone7245742012-09-05 17:12:55 -07005786
Jeff Johnson295189b2012-06-20 16:38:30 -07005787
5788 /*need to free memory for the pointers used in the
5789 WDA Process.Set Max Tx Power Req function*/
Jeff Johnson295189b2012-06-20 16:38:30 -07005790 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5791 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005792 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
Jeff Johnsone7245742012-09-05 17:12:55 -07005793
Jeff Johnson295189b2012-06-20 16:38:30 -07005794
5795 /* send response to UMAC*/
5796 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
5797
5798 return;
5799}
Jeff Johnson295189b2012-06-20 16:38:30 -07005800/*
5801 * FUNCTION: WDA_SetMaxTxPowerCallBack
5802 * Request to WDI to send set Max Tx Power Request
5803 */
5804 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
5805 tMaxTxPowerParams *MaxTxPowerParams)
5806{
5807 WDI_Status status = WDI_STATUS_SUCCESS;
5808 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
5809 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005810 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5811 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005812 if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
5813 {
5814 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5815 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5816 VOS_ASSERT(0);
5817 return VOS_STATUS_E_FAILURE;
5818 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005819 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
5820 sizeof(WDI_SetMaxTxPowerParamsType));
5821 if(NULL == wdiSetMaxTxPowerParams)
5822 {
5823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5824 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5825 VOS_ASSERT(0);
5826 return VOS_STATUS_E_NOMEM;
5827 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005828 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5829 if(NULL == pWdaParams)
5830 {
5831 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5832 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5833 vos_mem_free(wdiSetMaxTxPowerParams);
5834 VOS_ASSERT(0);
5835 return VOS_STATUS_E_NOMEM;
5836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 /* Copy.Max.Tx.Power Params to WDI structure */
5838 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
5839 MaxTxPowerParams->bssId,
5840 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005841 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
5842 MaxTxPowerParams->selfStaMacAddr,
5843 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005844 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
5845 MaxTxPowerParams->power;
Jeff Johnson295189b2012-06-20 16:38:30 -07005846 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005847 pWdaParams->pWdaContext = pWDA;
5848 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005849 /* store Params pass it to WDI */
5850 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005851 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
5852 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005853 if(IS_WDI_STATUS_FAILURE(status))
5854 {
5855 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5856 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
5857 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5858 vos_mem_free(pWdaParams);
5859 }
5860 return CONVERT_WDI2VOS_STATUS(status);
5861
5862}
Jeff Johnson295189b2012-06-20 16:38:30 -07005863#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005864#ifdef WLAN_FEATURE_P2P
Jeff Johnson295189b2012-06-20 16:38:30 -07005865/*
5866 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
5867 * Free the memory. No need to send any response to PE in this case
5868 */
5869void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
5870{
5871 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5873 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005874 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5875 pWDA->wdaWdiApiMsgParam = NULL;
5876 vos_mem_free(pWDA->wdaMsgParam) ;
5877 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005878 /*
5879 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
5880 * so just free the request param here
5881 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005882 return ;
5883}
5884
Jeff Johnson295189b2012-06-20 16:38:30 -07005885/*
5886 * FUNCTION: WDA_ProcessSetP2PGONOAReq
5887 * Request to WDI to set the P2P Group Owner Notice of Absence Req
5888 */
5889VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
5890 tP2pPsParams *pP2pPsConfigParams)
5891{
5892 WDI_Status status = WDI_STATUS_SUCCESS ;
5893 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
5894 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
5895 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005896 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5897 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005898 if(NULL == wdiSetP2PGONOAReqParam)
5899 {
5900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5901 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5902 VOS_ASSERT(0);
5903 return VOS_STATUS_E_NOMEM;
5904 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005905 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
5906 pP2pPsConfigParams->opp_ps;
5907 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
5908 pP2pPsConfigParams->ctWindow;
5909 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
5910 pP2pPsConfigParams->count;
5911 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
5912 pP2pPsConfigParams->duration;
5913 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
5914 pP2pPsConfigParams->interval;
5915 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
5916 pP2pPsConfigParams->single_noa_duration;
5917 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
5918 pP2pPsConfigParams->psSelection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005919 if((NULL != pWDA->wdaMsgParam) ||
5920 (NULL != pWDA->wdaWdiApiMsgParam))
5921 {
5922 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5923 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5924 VOS_ASSERT(0);
5925 vos_mem_free(wdiSetP2PGONOAReqParam);
5926 return VOS_STATUS_E_FAILURE;
5927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005928 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
5929 /* Store msg pointer from PE, as this will be used for response */
5930 pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005931 /* store Params pass it to WDI */
5932 pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005933 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
5934 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005935 if(IS_WDI_STATUS_FAILURE(status))
5936 {
5937 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5938 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
5939 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5940 vos_mem_free(pWDA->wdaMsgParam);
5941 pWDA->wdaWdiApiMsgParam = NULL;
5942 pWDA->wdaMsgParam = NULL;
5943 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005944 return CONVERT_WDI2VOS_STATUS(status);
5945
Jeff Johnson295189b2012-06-20 16:38:30 -07005946}
5947#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005948#ifdef WLAN_FEATURE_VOWIFI_11R
5949/*
5950 * FUNCTION: WDA_AggrAddTSReqCallback
5951 * send ADD AGGREGATED TS RSP back to PE
5952 */
5953void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
5954{
5955 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
5956 tAggrAddTsParams *pAggrAddTsReqParams =
5957 (tAggrAddTsParams *)pWDA->wdaMsgParam ;
5958 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07005959 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5960 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005961 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5962 pWDA->wdaWdiApiMsgParam = NULL;
5963 pWDA->wdaMsgParam = NULL;
5964
5965 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
5966 {
5967 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
5968 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005969 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005970 return ;
5971}/* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07005972/*
5973 * FUNCTION: WDA_ProcessAddTSReq
5974 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
5975 */
5976VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
5977 tAggrAddTsParams *pAggrAddTsReqParams)
5978{
5979 WDI_Status status = WDI_STATUS_SUCCESS ;
5980 int i;
5981 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5983 "------> %s " ,__FUNCTION__);
5984 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5985 {
5986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5987 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5988 VOS_ASSERT(0);
5989 return VOS_STATUS_E_FAILURE;
5990 }
5991
5992 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
5993 sizeof(WDI_AggrAddTSReqParamsType)) ;
5994 if(NULL == wdiAggrAddTSReqParam)
5995 {
5996 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5997 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5998 VOS_ASSERT(0);
5999 return VOS_STATUS_E_NOMEM;
6000 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006001 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6002 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6003 pAggrAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006004 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6005 {
6006 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6007 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6008 pAggrAddTsReqParams->tspec[i].length;
Jeff Johnson295189b2012-06-20 16:38:30 -07006009 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6010 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6011 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6012 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6013 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6014 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6015 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6016 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6017 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6018 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6019 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6020 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6021 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6022 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6023 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6024 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
Jeff Johnson295189b2012-06-20 16:38:30 -07006025 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6026 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
Jeff Johnson295189b2012-06-20 16:38:30 -07006027 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6028 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6029 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6030 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6031 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6032 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6033 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6034 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6035 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6036 pAggrAddTsReqParams->tspec[i].inactInterval;
6037 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6038 pAggrAddTsReqParams->tspec[i].suspendInterval;
6039 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6040 pAggrAddTsReqParams->tspec[i].svcStartTime;
6041 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6042 pAggrAddTsReqParams->tspec[i].minDataRate;
6043 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6044 pAggrAddTsReqParams->tspec[i].meanDataRate;
6045 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6046 pAggrAddTsReqParams->tspec[i].peakDataRate;
6047 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6048 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6049 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6050 pAggrAddTsReqParams->tspec[i].delayBound;
6051 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6052 pAggrAddTsReqParams->tspec[i].minPhyRate;
6053 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6054 pAggrAddTsReqParams->tspec[i].surplusBw;
6055 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6056 pAggrAddTsReqParams->tspec[i].mediumTime;
6057 }
6058
6059 /* TODO: tAggrAddTsParams doesn't have the following fields */
6060#if 0
6061 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6062 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6063 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6064 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6065#endif
6066 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6067
6068 /* Store ADD TS pointer, as this will be used for response */
6069 pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006070 /* store Params pass it to WDI */
6071 pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006072 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
6073 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006074 if(IS_WDI_STATUS_FAILURE(status))
6075 {
6076 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6077 "Failure in ADD TS REQ Params WDI API, free all the memory " );
6078 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6079 vos_mem_free(pWDA->wdaMsgParam);
6080 pWDA->wdaWdiApiMsgParam = NULL;
6081 pWDA->wdaMsgParam = NULL;
6082 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006083 return CONVERT_WDI2VOS_STATUS(status) ;
6084}
6085#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006086/*
6087 * FUNCTION: WDA_EnterImpsReqCallback
6088 * send Enter IMPS RSP back to PE
6089 */
6090void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6091{
6092 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6094 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006095 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006096 return ;
6097}
Jeff Johnson295189b2012-06-20 16:38:30 -07006098/*
6099 * FUNCTION: WDA_ProcessEnterImpsReq
6100 * Request to WDI to Enter IMPS power state.
6101 */
6102VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6103{
6104 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006105 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6106 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006107 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006108 if(IS_WDI_STATUS_FAILURE(status))
6109 {
6110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6111 "Failure in Enter IMPS REQ WDI API, free all the memory " );
6112 pWDA->wdaWdiApiMsgParam = NULL;
6113 pWDA->wdaMsgParam = NULL;
6114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006115 return CONVERT_WDI2VOS_STATUS(status) ;
6116}
Jeff Johnson295189b2012-06-20 16:38:30 -07006117/*
6118 * FUNCTION: WDA_ExitImpsReqCallback
6119 * send Exit IMPS RSP back to PE
6120 */
6121void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6122{
6123 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6125 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006126 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006127 return ;
6128}
Jeff Johnson295189b2012-06-20 16:38:30 -07006129/*
6130 * FUNCTION: WDA_ProcessExitImpsReq
6131 * Request to WDI to Exit IMPS power state.
6132 */
6133VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6134{
6135 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006136 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6137 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006138 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006139 if(IS_WDI_STATUS_FAILURE(status))
6140 {
6141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6142 "Failure in Exit IMPS REQ WDI API, free all the memory " );
6143 pWDA->wdaWdiApiMsgParam = NULL;
6144 pWDA->wdaMsgParam = NULL;
6145 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006146 return CONVERT_WDI2VOS_STATUS(status) ;
6147}
Jeff Johnson295189b2012-06-20 16:38:30 -07006148/*
6149 * FUNCTION: WDA_EnterBmpsReqCallback
6150 * send Enter BMPS RSP back to PE
6151 */
6152void WDA_EnterBmpsReqCallback(WDI_Status status, void* pUserData)
6153{
6154 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6155 tWDA_CbContext *pWDA;
6156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6157 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006158 if(NULL == pWdaParams)
6159 {
6160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6161 "%s: pWdaParams received NULL", __FUNCTION__);
6162 VOS_ASSERT(0) ;
6163 return ;
6164 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006165 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6166 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6167 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006168 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006169 return ;
6170}
Jeff Johnson295189b2012-06-20 16:38:30 -07006171/*
6172 * FUNCTION: WDA_ProcessEnterBmpsReq
6173 * Request to WDI to Enter BMPS power state.
6174 */
6175VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6176 tEnterBmpsParams *pEnterBmpsReqParams)
6177{
6178 WDI_Status status = WDI_STATUS_SUCCESS;
6179 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6180 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6182 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006183 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6184 {
6185 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6186 "%s: invalid param", __FUNCTION__);
6187 VOS_ASSERT(0);
6188 return VOS_STATUS_E_FAILURE;
6189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006190 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6191 if (NULL == wdiEnterBmpsReqParams)
6192 {
6193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6194 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6195 VOS_ASSERT(0);
6196 return VOS_STATUS_E_NOMEM;
6197 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006198 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6199 if (NULL == pWdaParams)
6200 {
6201 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6202 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6203 VOS_ASSERT(0);
6204 vos_mem_free(wdiEnterBmpsReqParams);
6205 return VOS_STATUS_E_NOMEM;
6206 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006207 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6208 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6209 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6210 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
Jeff Johnson295189b2012-06-20 16:38:30 -07006211 // For CCX and 11R Roaming
6212 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6213 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6214 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6215 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006216 // we are done with the input
6217 vos_mem_free(pEnterBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006218 /* Store param pointer as passed in by caller */
6219 /* store Params pass it to WDI */
6220 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
6221 pWdaParams->pWdaContext = pWDA;
6222 pWdaParams->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006223 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6224 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 if (IS_WDI_STATUS_FAILURE(status))
6226 {
6227 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6228 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6229 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6230 vos_mem_free(pWdaParams);
6231 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006232 return CONVERT_WDI2VOS_STATUS(status);
6233}
Jeff Johnson295189b2012-06-20 16:38:30 -07006234/*
6235 * FUNCTION: WDA_ExitBmpsReqCallback
6236 * send Exit BMPS RSP back to PE
6237 */
6238void WDA_ExitBmpsReqCallback(WDI_Status status, void* pUserData)
6239{
6240 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6241 tWDA_CbContext *pWDA;
6242 tExitBmpsParams *pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6244 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006245 if(NULL == pWdaParams)
6246 {
6247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6248 "%s: pWdaParams received NULL", __FUNCTION__);
6249 VOS_ASSERT(0) ;
6250 return ;
6251 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006252 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6253 pExitBmpsReqParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam ;
6254
Jeff Johnson295189b2012-06-20 16:38:30 -07006255 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6256 vos_mem_free(pWdaParams) ;
6257
Jeff Johnson295189b2012-06-20 16:38:30 -07006258 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006259 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006260 return ;
6261}
Jeff Johnson295189b2012-06-20 16:38:30 -07006262/*
6263 * FUNCTION: WDA_ProcessExitBmpsReq
6264 * Request to WDI to Exit BMPS power state.
6265 */
6266VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
6267 tExitBmpsParams *pExitBmpsReqParams)
6268{
6269 WDI_Status status = WDI_STATUS_SUCCESS ;
6270 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
6271 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
6272 sizeof(WDI_ExitBmpsReqParamsType)) ;
6273 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006274 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6275 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006276 if(NULL == wdiExitBmpsReqParams)
6277 {
6278 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6279 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6280 VOS_ASSERT(0);
6281 return VOS_STATUS_E_NOMEM;
6282 }
6283 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6284 if(NULL == pWdaParams)
6285 {
6286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6287 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6288 VOS_ASSERT(0);
6289 vos_mem_free(wdiExitBmpsReqParams);
6290 return VOS_STATUS_E_NOMEM;
6291 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006292 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
Jeff Johnsone7245742012-09-05 17:12:55 -07006293
6294 wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
6295
Jeff Johnson295189b2012-06-20 16:38:30 -07006296 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
6297
6298 /* Store param pointer as passed in by caller */
6299 /* store Params pass it to WDI */
6300 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
6301 pWdaParams->pWdaContext = pWDA;
6302 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006303 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
6304 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006305 if(IS_WDI_STATUS_FAILURE(status))
6306 {
6307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6308 "Failure in Exit BMPS REQ WDI API, free all the memory " );
6309 vos_mem_free(pWdaParams->wdaMsgParam) ;
6310 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6311 vos_mem_free(pWdaParams) ;
6312 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006313 return CONVERT_WDI2VOS_STATUS(status) ;
6314}
Jeff Johnson295189b2012-06-20 16:38:30 -07006315/*
6316 * FUNCTION: WDA_EnterUapsdReqCallback
6317 * send Enter UAPSD RSP back to PE
6318 */
6319void WDA_EnterUapsdReqCallback(WDI_Status status, void* pUserData)
6320{
6321 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6322 tWDA_CbContext *pWDA;
6323 tUapsdParams *pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006324 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6325 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006326 if(NULL == pWdaParams)
6327 {
6328 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6329 "%s: pWdaParams received NULL", __FUNCTION__);
6330 VOS_ASSERT(0) ;
6331 return ;
6332 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006333 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006334 pEnterUapsdReqParams = (tUapsdParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006335 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6336 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006337 pEnterUapsdReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006338 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006339 return ;
6340}
Jeff Johnson295189b2012-06-20 16:38:30 -07006341/*
6342 * FUNCTION: WDA_ProcessEnterUapsdReq
6343 * Request to WDI to Enter UAPSD power state.
6344 */
6345VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
6346 tUapsdParams *pEnterUapsdReqParams)
6347{
6348 WDI_Status status = WDI_STATUS_SUCCESS ;
6349 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
6350 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
6351 sizeof(WDI_EnterUapsdReqParamsType)) ;
6352 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006353 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6354 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006355 if(NULL == wdiEnterUapsdReqParams)
6356 {
6357 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6358 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6359 VOS_ASSERT(0);
6360 return VOS_STATUS_E_NOMEM;
6361 }
6362 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6363 if(NULL == pWdaParams)
6364 {
6365 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6366 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6367 VOS_ASSERT(0);
6368 vos_mem_free(wdiEnterUapsdReqParams);
6369 return VOS_STATUS_E_NOMEM;
6370 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006371 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
6372 pEnterUapsdReqParams->beDeliveryEnabled;
6373 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
6374 pEnterUapsdReqParams->beTriggerEnabled;
6375 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
6376 pEnterUapsdReqParams->bkDeliveryEnabled;
6377 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
6378 pEnterUapsdReqParams->bkTriggerEnabled;
6379 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
6380 pEnterUapsdReqParams->viDeliveryEnabled;
6381 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
6382 pEnterUapsdReqParams->viTriggerEnabled;
6383 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
6384 pEnterUapsdReqParams->voDeliveryEnabled;
6385 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
6386 pEnterUapsdReqParams->voTriggerEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07006387 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006388
6389 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
6390
Jeff Johnson295189b2012-06-20 16:38:30 -07006391 /* Store param pointer as passed in by caller */
6392 /* store Params pass it to WDI */
6393 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
6394 pWdaParams->pWdaContext = pWDA;
6395 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006396 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
6397 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006398 if(IS_WDI_STATUS_FAILURE(status))
6399 {
6400 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6401 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
6402 vos_mem_free(pWdaParams->wdaMsgParam) ;
6403 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6404 vos_mem_free(pWdaParams) ;
6405 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006406 return CONVERT_WDI2VOS_STATUS(status) ;
6407}
Jeff Johnson295189b2012-06-20 16:38:30 -07006408/*
6409 * FUNCTION: WDA_ExitUapsdReqCallback
6410 * send Exit UAPSD RSP back to PE
6411 */
6412void WDA_ExitUapsdReqCallback(WDI_Status status, void* pUserData)
6413{
6414 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006415 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6416 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006417 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006418 return ;
6419}
Jeff Johnson295189b2012-06-20 16:38:30 -07006420/*
6421 * FUNCTION: WDA_ProcessExitUapsdReq
6422 * Request to WDI to Exit UAPSD power state.
6423 */
6424VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA)
6425{
6426 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6428 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006429 status = WDI_ExitUapsdReq((WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006430 if(IS_WDI_STATUS_FAILURE(status))
6431 {
6432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6433 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
6434 pWDA->wdaWdiApiMsgParam = NULL;
6435 pWDA->wdaMsgParam = NULL;
6436 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006437 return CONVERT_WDI2VOS_STATUS(status) ;
6438}
6439
Jeff Johnson295189b2012-06-20 16:38:30 -07006440/*
6441 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
6442 *
6443 */
6444void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
6445{
6446 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006447 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6448 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006449 if(NULL == pWdaParams)
6450 {
6451 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6452 "%s: pWdaParams received NULL", __FUNCTION__);
6453 VOS_ASSERT(0) ;
6454 return ;
6455 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006456 if( pWdaParams != NULL )
6457 {
6458 if( pWdaParams->wdaWdiApiMsgParam != NULL )
6459 {
6460 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6461 }
6462 if( pWdaParams->wdaMsgParam != NULL )
6463 {
6464 vos_mem_free(pWdaParams->wdaMsgParam) ;
6465 }
6466 vos_mem_free(pWdaParams) ;
6467 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006468 return ;
6469}
Jeff Johnson295189b2012-06-20 16:38:30 -07006470/*
6471 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
6472 * Request to WDI to set the power save params at start.
6473 */
6474VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
6475 tSirPowerSaveCfg *pPowerSaveCfg)
6476{
6477 WDI_Status status = WDI_STATUS_SUCCESS ;
6478 tHalCfg *tlvStruct = NULL ;
6479 tANI_U8 *tlvStructStart = NULL ;
6480 v_PVOID_t *configParam;
6481 tANI_U32 configParamSize;
6482 tANI_U32 *configDataValue;
6483 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
6484 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6486 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006487 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
6488 {
6489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6490 "%s: invalid param", __FUNCTION__);
6491 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07006492 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006493 return VOS_STATUS_E_FAILURE;
6494 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006495 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
6496 if (NULL == wdiPowerSaveCfg)
6497 {
6498 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6499 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6500 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07006501 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006502 return VOS_STATUS_E_NOMEM;
6503 }
6504 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6505 if(NULL == pWdaParams)
6506 {
6507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6508 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6509 VOS_ASSERT(0);
6510 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006511 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006512 return VOS_STATUS_E_NOMEM;
6513 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006514 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
6515 configParam = vos_mem_malloc(configParamSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07006516 if(NULL == configParam)
6517 {
6518 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6519 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07006520 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006521 vos_mem_free(pWdaParams);
6522 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006523 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006524 return VOS_STATUS_E_NOMEM;
6525 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006526 vos_mem_set(configParam, configParamSize, 0);
6527 wdiPowerSaveCfg->pConfigBuffer = configParam;
6528 tlvStruct = (tHalCfg *)configParam;
6529 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006530 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
6531 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
6532 tlvStruct->length = sizeof(tANI_U32);
6533 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6534 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006535 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6536 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006537 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
6538 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
6539 tlvStruct->length = sizeof(tANI_U32);
6540 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6541 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07006542 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6543 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006544 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
6545 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
6546 tlvStruct->length = sizeof(tANI_U32);
6547 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6548 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
Jeff Johnson295189b2012-06-20 16:38:30 -07006549 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6550 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006551 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
6552 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
6553 tlvStruct->length = sizeof(tANI_U32);
6554 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6555 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07006556 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6557 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006558 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
6559 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
6560 tlvStruct->length = sizeof(tANI_U32);
6561 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6562 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
Jeff Johnson295189b2012-06-20 16:38:30 -07006563 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6564 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006565 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
6566 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
6567 tlvStruct->length = sizeof(tANI_U32);
6568 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6569 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07006570 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6571 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006572 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
6573 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
6574 tlvStruct->length = sizeof(tANI_U32);
6575 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6576 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006577 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6578 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006579 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
6580 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
6581 tlvStruct->length = sizeof(tANI_U32);
6582 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6583 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
6584 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6585 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006586 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
6587 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
6588 tlvStruct->length = sizeof(tANI_U32);
6589 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6590 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
6591 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6592 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006593 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
6594 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
6595 tlvStruct->length = sizeof(tANI_U32);
6596 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6597 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
Jeff Johnson295189b2012-06-20 16:38:30 -07006598 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6599 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006600 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
6601 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
6602 tlvStruct->length = sizeof(tANI_U32);
6603 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6604 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -07006605 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6606 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006607 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006608 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006609 /* store Params pass it to WDI */
6610 pWdaParams->wdaMsgParam = configParam;
6611 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
6612 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006613 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
6614 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006615 if(IS_WDI_STATUS_FAILURE(status))
6616 {
6617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6618 "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " );
6619 vos_mem_free(pWdaParams->wdaMsgParam);
6620 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6621 vos_mem_free(pWdaParams);
6622 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006623 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006624 return CONVERT_WDI2VOS_STATUS(status);
6625}
Jeff Johnson295189b2012-06-20 16:38:30 -07006626/*
6627 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
6628 *
6629 */
6630void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
6631{
6632 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6634 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006635 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6636 vos_mem_free(pWdaParams);
6637
Jeff Johnson295189b2012-06-20 16:38:30 -07006638 return ;
6639}
Jeff Johnson295189b2012-06-20 16:38:30 -07006640/*
6641 * FUNCTION: WDA_SetUapsdAcParamsReq
6642 * Request to WDI to set the UAPSD params for an ac (sta mode).
6643 */
6644VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
6645 tUapsdInfo *pUapsdInfo)
6646{
6647 WDI_Status status = WDI_STATUS_SUCCESS;
6648 tWDA_CbContext *pWDA = NULL ;
6649 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
6650 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
6651 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
6652 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006653 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6654 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006655 if(NULL == wdiUapsdParams)
6656 {
6657 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6658 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6659 VOS_ASSERT(0);
6660 return VOS_STATUS_E_NOMEM;
6661 }
6662 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6663 if(NULL == pWdaParams)
6664 {
6665 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6666 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6667 VOS_ASSERT(0);
6668 vos_mem_free(wdiUapsdParams);
6669 return VOS_STATUS_E_NOMEM;
6670 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006671 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
6672 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
6673 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
6674 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
6675 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
6676 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
Jeff Johnson295189b2012-06-20 16:38:30 -07006677 wdiUapsdParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006678 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07006679 pWdaParams->pWdaContext = pWDA;
6680 /* Store param pointer as passed in by caller */
6681 pWdaParams->wdaMsgParam = pUapsdInfo;
6682 /* store Params pass it to WDI */
6683 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006684 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
6685 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
6686 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006687 if(IS_WDI_STATUS_FAILURE(status))
6688 {
6689 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6690 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
6691 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6692 vos_mem_free(pWdaParams);
6693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006694 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
6695 return VOS_STATUS_SUCCESS;
6696 else
6697 return VOS_STATUS_E_FAILURE;
6698
Jeff Johnson295189b2012-06-20 16:38:30 -07006699}
6700/*
6701 * FUNCTION: WDA_ClearUapsdAcParamsReq
6702 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
6703 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
6704 * and again enter the UPASD with the modified params. Hence the disable
6705 * function was kept empty.
6706 *
6707 */
6708VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
6709{
6710 /* do nothing */
6711 return VOS_STATUS_SUCCESS;
6712}
Jeff Johnson295189b2012-06-20 16:38:30 -07006713/*
6714 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
6715 *
6716 */
6717void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
6718{
6719 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006720 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6721 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006722 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6723 pWDA->wdaWdiApiMsgParam = NULL;
6724 pWDA->wdaMsgParam = NULL;
6725
Jeff Johnson295189b2012-06-20 16:38:30 -07006726 //print a msg, nothing else to do
6727 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6728 "WDA_UpdateUapsdParamsReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006729 return ;
6730}
Jeff Johnson295189b2012-06-20 16:38:30 -07006731/*
6732 * FUNCTION: WDA_UpdateUapsdParamsReq
6733 * Request to WDI to update UAPSD params (in softAP mode) for a station.
6734 */
6735VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
6736 tUpdateUapsdParams* pUpdateUapsdInfo)
6737{
6738 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006739 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006740 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
6741 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
6742 sizeof(WDI_UpdateUapsdReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6744 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006745 if(NULL == wdiUpdateUapsdParams)
6746 {
6747 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6748 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6749 VOS_ASSERT(0);
6750 return VOS_STATUS_E_NOMEM;
6751 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006752 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
6753 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
6754 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07006755 if((NULL != pWDA->wdaMsgParam) ||
6756 (NULL != pWDA->wdaWdiApiMsgParam))
6757 {
6758 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6759 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6760 vos_mem_free(wdiUpdateUapsdParams);
6761 VOS_ASSERT(0);
6762 return VOS_STATUS_E_FAILURE;
6763 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006764 /* Store param pointer as passed in by caller */
6765 pWDA->wdaMsgParam = pUpdateUapsdInfo;
6766 /* store Params pass it to WDI */
6767 pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006768 wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
6769 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006770
Jeff Johnson43971f52012-07-17 12:26:56 -07006771 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006772 {
6773 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6774 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006775 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006776 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6777 vos_mem_free(pWDA->wdaMsgParam);
6778 pWDA->wdaWdiApiMsgParam = NULL;
6779 pWDA->wdaMsgParam = NULL;
6780 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006781 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006782}
Jeff Johnson295189b2012-06-20 16:38:30 -07006783/*
6784 * FUNCTION: WDA_ConfigureRxpFilterCallback
6785 *
6786 */
6787void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
6788{
6789 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006790 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6791 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006792 if(WDI_STATUS_SUCCESS != wdiStatus)
6793 {
6794 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6795 "%s: RXP config filter failure \n", __FUNCTION__ );
6796 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006797 if(NULL == pWdaParams)
6798 {
6799 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6800 "%s: pWdaParams received NULL", __FUNCTION__);
6801 VOS_ASSERT(0) ;
6802 return ;
6803 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006804 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6805 vos_mem_free(pWdaParams->wdaMsgParam);
6806 vos_mem_free(pWdaParams);
6807 return ;
6808}
Jeff Johnson295189b2012-06-20 16:38:30 -07006809/*
6810 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
6811 *
6812 */
6813VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
6814 tSirWlanSetRxpFilters *pWlanSuspendParam)
6815{
Jeff Johnson295189b2012-06-20 16:38:30 -07006816 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006817 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006818 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
6819 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
6820 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
6821 tWDA_ReqParams *pWdaParams ;
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 if(NULL == wdiRxpFilterParams)
6825 {
6826 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6827 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6828 VOS_ASSERT(0);
6829 vos_mem_free(pWlanSuspendParam);
6830 return VOS_STATUS_E_NOMEM;
6831 }
6832 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6833 if(NULL == pWdaParams)
6834 {
6835 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6836 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6837 VOS_ASSERT(0);
6838 vos_mem_free(wdiRxpFilterParams);
6839 vos_mem_free(pWlanSuspendParam);
6840 return VOS_STATUS_E_NOMEM;
6841 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006842 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
6843 pWlanSuspendParam->setMcstBcstFilter;
6844 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
6845 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6846
6847 wdiRxpFilterParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006848 pWdaParams->pWdaContext = pWDA;
6849 pWdaParams->wdaMsgParam = pWlanSuspendParam;
6850 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006851 wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07006852 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
6853 pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07006854 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006855 {
6856 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6857 "Failure in configure RXP filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006858 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006859 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6860 vos_mem_free(pWdaParams->wdaMsgParam);
6861 vos_mem_free(pWdaParams);
6862 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006863 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006864}
Jeff Johnson295189b2012-06-20 16:38:30 -07006865/*
6866 * FUNCTION: WDA_WdiIndicationCallback
6867 *
6868 */
6869void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
6870 void* pUserData)
6871{
6872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6873 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006874}
Jeff Johnson295189b2012-06-20 16:38:30 -07006875/*
6876 * FUNCTION: WDA_ProcessWlanSuspendInd
6877 *
6878 */
6879VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
6880 tSirWlanSuspendParam *pWlanSuspendParam)
6881{
6882 WDI_Status wdiStatus;
6883 WDI_SuspendParamsType wdiSuspendParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006884 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6885 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006886 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
6887 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6888 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
6889 wdiSuspendParams.pUserData = pWDA;
6890 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
Jeff Johnson295189b2012-06-20 16:38:30 -07006891 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
6892 if(WDI_STATUS_PENDING == wdiStatus)
6893 {
6894 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6895 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006896 }
6897 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
6898 {
6899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6900 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
6901 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006902 vos_mem_free(pWlanSuspendParam);
6903 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
6904}
6905
Jeff Johnson295189b2012-06-20 16:38:30 -07006906/*
6907 * FUNCTION: WDA_ProcessWlanResumeCallback
6908 *
6909 */
6910void WDA_ProcessWlanResumeCallback(
6911 WDI_SuspendResumeRspParamsType *resumeRspParams,
6912 void* pUserData)
6913{
6914 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006915 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6916 "<------ %s " ,__FUNCTION__);
6917 if(NULL == pWdaParams)
6918 {
6919 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6920 "%s: pWdaParams received NULL", __FUNCTION__);
6921 VOS_ASSERT(0) ;
6922 return ;
6923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006924 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
6925 {
6926 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6927 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
6928 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006929 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6930 vos_mem_free(pWdaParams->wdaMsgParam);
6931 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006932 return ;
6933}
Jeff Johnson295189b2012-06-20 16:38:30 -07006934/*
6935 * FUNCTION: WDA_ProcessWlanResumeReq
6936 *
6937 */
6938VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
6939 tSirWlanResumeParam *pWlanResumeParam)
6940{
6941 WDI_Status wdiStatus;
6942 WDI_ResumeParamsType *wdiResumeParams =
6943 (WDI_ResumeParamsType *)vos_mem_malloc(
6944 sizeof(WDI_ResumeParamsType) ) ;
6945 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6947 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006948 if(NULL == wdiResumeParams)
6949 {
6950 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6951 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6952 VOS_ASSERT(0);
6953 return VOS_STATUS_E_NOMEM;
6954 }
6955 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6956 if(NULL == pWdaParams)
6957 {
6958 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6959 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6960 VOS_ASSERT(0);
6961 vos_mem_free(wdiResumeParams);
6962 return VOS_STATUS_E_NOMEM;
6963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006964 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
6965 pWlanResumeParam->configuredMcstBcstFilterSetting;
Jeff Johnson295189b2012-06-20 16:38:30 -07006966 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
6967 wdiResumeParams->wdiReqStatusCB = NULL;
6968 pWdaParams->wdaMsgParam = pWlanResumeParam;
6969 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
6970 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006971 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
6972 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
6973 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006974 if(IS_WDI_STATUS_FAILURE(wdiStatus))
6975 {
6976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6977 "Failure in Host Resume REQ WDI API, free all the memory " );
6978 VOS_ASSERT(0);
6979 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6980 vos_mem_free(pWdaParams->wdaMsgParam);
6981 vos_mem_free(pWdaParams);
6982 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006983 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
6984}
6985
Jeff Johnson295189b2012-06-20 16:38:30 -07006986/*
6987 * FUNCTION: WDA_SetBeaconFilterReqCallback
6988 *
6989 */
6990void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
6991{
6992 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006993 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6994 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006995 if(NULL == pWdaParams)
6996 {
6997 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6998 "%s: pWdaParams received NULL", __FUNCTION__);
6999 VOS_ASSERT(0) ;
7000 return ;
7001 }
7002
7003 vos_mem_free(pWdaParams->wdaMsgParam) ;
7004 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7005 vos_mem_free(pWdaParams) ;
7006 /*
7007 * No respone required for SetBeaconFilter req so just free the request
7008 * param here
7009 */
7010
Jeff Johnson295189b2012-06-20 16:38:30 -07007011 return ;
7012}
Jeff Johnson295189b2012-06-20 16:38:30 -07007013/*
7014 * FUNCTION: WDA_SetBeaconFilterReq
7015 * Request to WDI to send the beacon filtering related information.
7016 */
7017VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7018 tBeaconFilterMsg* pBeaconFilterInfo)
7019{
7020 WDI_Status status = WDI_STATUS_SUCCESS;
7021 tANI_U8 *dstPtr, *srcPtr;
7022 tANI_U8 filterLength;
7023 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7024 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7025 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7026 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007027 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7028 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007029 if(NULL == wdiBeaconFilterInfo)
7030 {
7031 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7032 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7033 VOS_ASSERT(0);
7034 return VOS_STATUS_E_NOMEM;
7035 }
7036 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7037 if(NULL == pWdaParams)
7038 {
7039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7040 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7041 VOS_ASSERT(0);
7042 vos_mem_free(wdiBeaconFilterInfo);
7043 return VOS_STATUS_E_NOMEM;
7044 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007045 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7046 pBeaconFilterInfo->beaconInterval;
7047 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7048 pBeaconFilterInfo->capabilityInfo;
7049 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7050 pBeaconFilterInfo->capabilityMask;
7051 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
Jeff Johnson295189b2012-06-20 16:38:30 -07007052 //Fill structure with info contained in the beaconFilterTable
7053 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7054 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7055 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7056 if(WDI_BEACON_FILTER_LEN < filterLength)
7057 {
7058 filterLength = WDI_BEACON_FILTER_LEN;
7059 }
7060 vos_mem_copy(dstPtr, srcPtr, filterLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07007061 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7062 /* Store param pointer as passed in by caller */
7063 /* store Params pass it to WDI */
7064 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7065 pWdaParams->pWdaContext = pWDA;
7066 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7067
Jeff Johnson295189b2012-06-20 16:38:30 -07007068 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7069 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007070 if(IS_WDI_STATUS_FAILURE(status))
7071 {
7072 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7073 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7074 vos_mem_free(pWdaParams->wdaMsgParam) ;
7075 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7076 vos_mem_free(pWdaParams) ;
7077 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007078 return CONVERT_WDI2VOS_STATUS(status) ;
7079}
Jeff Johnson295189b2012-06-20 16:38:30 -07007080/*
7081 * FUNCTION: WDA_RemBeaconFilterReqCallback
7082 *
7083 */
7084void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7085{
7086 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007087 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7088 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007089 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7090 pWDA->wdaWdiApiMsgParam = NULL;
7091 pWDA->wdaMsgParam = NULL;
7092
Jeff Johnson295189b2012-06-20 16:38:30 -07007093 //print a msg, nothing else to do
7094 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7095 "WDA_RemBeaconFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007096 return ;
7097}
Jeff Johnson295189b2012-06-20 16:38:30 -07007098 // TODO: PE does not have this feature for now implemented,
7099 // but the support for removing beacon filter exists between
7100 // HAL and FW. This function can be called whenever PE defines
7101 // a new message for beacon filter removal
Jeff Johnson295189b2012-06-20 16:38:30 -07007102/*
7103 * FUNCTION: WDA_RemBeaconFilterReq
7104 * Request to WDI to send the removal of beacon filtering related information.
7105 */
7106VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
7107 tRemBeaconFilterMsg* pBeaconFilterInfo)
7108{
7109 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007110 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007111 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
7112 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
7113 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7115 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007116 if(NULL == wdiBeaconFilterInfo)
7117 {
7118 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7119 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7120 VOS_ASSERT(0);
7121 return VOS_STATUS_E_NOMEM;
7122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007123 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
7124 pBeaconFilterInfo->ucIeCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07007125 //Fill structure with info contained in the ucRemIeId
7126 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
7127 pBeaconFilterInfo->ucRemIeId,
7128 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
7129 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007130 if((NULL != pWDA->wdaMsgParam) ||
7131 (NULL != pWDA->wdaWdiApiMsgParam))
7132 {
7133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7134 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7135 vos_mem_free(wdiBeaconFilterInfo);
7136 VOS_ASSERT(0);
7137 return VOS_STATUS_E_FAILURE;
7138 }
7139
7140 /* Store param pointer as passed in by caller */
7141 pWDA->wdaMsgParam = pBeaconFilterInfo;
7142 /* store Params pass it to WDI */
7143 pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
Jeff Johnson43971f52012-07-17 12:26:56 -07007144 wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007145 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007146 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007147 {
7148 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7149 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007150 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007151 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7152 vos_mem_free(pWDA->wdaMsgParam);
7153 pWDA->wdaWdiApiMsgParam = NULL;
7154 pWDA->wdaMsgParam = NULL;
7155 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007156 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007157}
Jeff Johnson295189b2012-06-20 16:38:30 -07007158/*
7159 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
7160 *
7161 */
7162void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
7163{
7164 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007165 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7166 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007167 if(NULL == pWdaParams)
7168 {
7169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7170 "%s: pWdaParams received NULL", __FUNCTION__);
7171 VOS_ASSERT(0) ;
7172 return ;
7173 }
7174
7175 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7176 vos_mem_free(pWdaParams) ;
7177
Jeff Johnson295189b2012-06-20 16:38:30 -07007178 return ;
7179}
Jeff Johnson295189b2012-06-20 16:38:30 -07007180/*
7181 * FUNCTION: WDA_SetRSSIThresholdsReq
7182 * Request to WDI to set the RSSI thresholds (sta mode).
7183 */
7184VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
7185{
7186 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007187 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007188 tWDA_CbContext *pWDA = NULL ;
7189 v_PVOID_t pVosContext = NULL;
7190 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
7191 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
7192 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
7193 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7195 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007196 if(NULL == wdiRSSIThresholdsInfo)
7197 {
7198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7199 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7200 VOS_ASSERT(0);
7201 return VOS_STATUS_E_NOMEM;
7202 }
7203 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7204 if(NULL == pWdaParams)
7205 {
7206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7207 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7208 VOS_ASSERT(0);
7209 vos_mem_free(wdiRSSIThresholdsInfo);
7210 return VOS_STATUS_E_NOMEM;
7211 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007212 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
Jeff Johnson295189b2012-06-20 16:38:30 -07007213 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
7214 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
7215 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
Jeff Johnson295189b2012-06-20 16:38:30 -07007216 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
7217 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
7218 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007219 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
7220 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
7221 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007222 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007223 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
7224 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7225
Jeff Johnson295189b2012-06-20 16:38:30 -07007226 /* Store param pointer as passed in by caller */
7227 /* store Params pass it to WDI */
7228 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
7229 pWdaParams->pWdaContext = pWDA;
7230 pWdaParams->wdaMsgParam = pBmpsThresholds;
Jeff Johnson43971f52012-07-17 12:26:56 -07007231 wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007232 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007233 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007234 {
7235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7236 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007237 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007238 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7239 vos_mem_free(pWdaParams) ;
7240 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007241 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007242
7243}/*WDA_SetRSSIThresholdsReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007244/*
7245 * FUNCTION: WDA_HostOffloadReqCallback
7246 *
7247 */
7248void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
7249{
7250 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7251
7252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7253 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007254 if(NULL == pWdaParams)
7255 {
7256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7257 "%s: pWdaParams received NULL", __FUNCTION__);
7258 VOS_ASSERT(0) ;
7259 return ;
7260 }
7261
7262 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7263 vos_mem_free(pWdaParams->wdaMsgParam);
7264 vos_mem_free(pWdaParams) ;
7265
7266 //print a msg, nothing else to do
7267 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7268 "WDA_HostOffloadReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007269 return ;
7270}
Jeff Johnson295189b2012-06-20 16:38:30 -07007271/*
7272 * FUNCTION: WDA_ProcessHostOffloadReq
7273 * Request to WDI to set the filter to minimize unnecessary host wakeup due
7274 * to broadcast traffic (sta mode).
7275 */
7276VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
7277 tSirHostOffloadReq *pHostOffloadParams)
7278{
7279 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007280 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007281 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
7282 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
7283 sizeof(WDI_HostOffloadReqParamsType)) ;
7284 tWDA_ReqParams *pWdaParams ;
7285
7286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7287 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
7288
7289 if(NULL == wdiHostOffloadInfo)
7290 {
7291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7292 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7293 VOS_ASSERT(0);
7294 return VOS_STATUS_E_NOMEM;
7295 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007296 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7297 if(NULL == pWdaParams)
7298 {
7299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7300 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7301 VOS_ASSERT(0);
7302 vos_mem_free(wdiHostOffloadInfo);
7303 return VOS_STATUS_E_NOMEM;
7304 }
7305
7306 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
7307 pHostOffloadParams->offloadType;
7308 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
7309 pHostOffloadParams->enableOrDisable;
7310
Jeff Johnsone7245742012-09-05 17:12:55 -07007311 wdiHostOffloadInfo->wdiHostOffloadInfo.bssIdx =
7312 pHostOffloadParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07007313 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
7314 {
7315 case SIR_IPV4_ARP_REPLY_OFFLOAD:
7316 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
7317 pHostOffloadParams->params.hostIpv4Addr,
7318 4);
7319 break;
7320 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7321 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7322 pHostOffloadParams->params.hostIpv6Addr,
7323 16);
7324 break;
7325 case SIR_IPV6_NS_OFFLOAD:
7326 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7327 pHostOffloadParams->params.hostIpv6Addr,
7328 16);
7329
7330#ifdef WLAN_NS_OFFLOAD
7331 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
7332 {
7333 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
7334 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
7335 16);
7336 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
7337 }
7338 else
7339 {
7340 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
7341 }
7342
7343 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
7344 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
7345 16);
7346 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
7347 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
7348 6);
7349
7350 //Only two are supported so let's go through them without a loop
7351 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
7352 {
7353 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
7354 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
7355 16);
7356 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
7357 }
7358 else
7359 {
7360 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
7361 }
7362
7363 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
7364 {
7365 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
7366 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
7367 16);
7368 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
7369 }
7370 else
7371 {
7372 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
7373 }
7374 break;
7375#endif //WLAN_NS_OFFLOAD
7376 default:
7377 {
7378 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7379 "No Handling for Offload Type %x in WDA "
7380 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
7381 //WDA_VOS_ASSERT(0) ;
7382 }
7383 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007384 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007385 if((NULL != pWDA->wdaMsgParam) ||
7386 (NULL != pWDA->wdaWdiApiMsgParam))
7387 {
7388 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7389 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7390 VOS_ASSERT(0);
7391 vos_mem_free(wdiHostOffloadInfo);
7392 return VOS_STATUS_E_FAILURE;
7393 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007394 /* Store param pointer as passed in by caller */
7395 /* store Params pass it to WDI */
7396 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7397 pWdaParams->pWdaContext = pWDA;
7398 pWdaParams->wdaMsgParam = pHostOffloadParams;
7399
Jeff Johnson43971f52012-07-17 12:26:56 -07007400 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007401 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7402
Jeff Johnson43971f52012-07-17 12:26:56 -07007403 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007404 {
7405 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7406 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007407 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007408 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7409 vos_mem_free(pWdaParams->wdaMsgParam);
7410 vos_mem_free(pWdaParams) ;
7411 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007412 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007413
7414}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007415/*
7416 * FUNCTION: WDA_KeepAliveReqCallback
7417 *
7418 */
7419void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7420{
7421 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007422 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7423 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007424 vos_mem_free(pWDA->wdaWdiApiMsgParam);
7425 vos_mem_free(pWDA->wdaMsgParam);
7426 pWDA->wdaWdiApiMsgParam = NULL;
7427 pWDA->wdaMsgParam = NULL;
7428
Jeff Johnson295189b2012-06-20 16:38:30 -07007429 //print a msg, nothing else to do
7430 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7431 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007432 return ;
7433}
Jeff Johnson295189b2012-06-20 16:38:30 -07007434/*
7435 * FUNCTION: WDA_ProcessKeepAliveReq
7436 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7437 * wakeup due to broadcast traffic (sta mode).
7438 */
7439VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7440 tSirKeepAliveReq *pKeepAliveParams)
7441{
7442 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007443 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007444 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7445 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7446 sizeof(WDI_KeepAliveReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007447 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7448 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007449 if(NULL == wdiKeepAliveInfo)
7450 {
7451 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7452 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7453 VOS_ASSERT(0);
7454 return VOS_STATUS_E_NOMEM;
7455 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007456 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7457 pKeepAliveParams->packetType;
7458 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7459 pKeepAliveParams->timePeriod;
Jeff Johnsone7245742012-09-05 17:12:55 -07007460 wdiKeepAliveInfo->wdiKeepAliveInfo.bssIdx =
7461 pKeepAliveParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07007462
7463 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7464 {
7465 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7466 pKeepAliveParams->hostIpv4Addr,
7467 SIR_IPV4_ADDR_LEN);
7468 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7469 pKeepAliveParams->destIpv4Addr,
7470 SIR_IPV4_ADDR_LEN);
7471 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7472 pKeepAliveParams->destMacAddr,
7473 SIR_MAC_ADDR_LEN);
7474 }
7475 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7476 {
7477 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7478 SIR_IPV4_ADDR_LEN,
7479 0);
7480 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7481 SIR_IPV4_ADDR_LEN,
7482 0);
7483 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7484 SIR_MAC_ADDR_LEN,
7485 0);
7486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007487 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007488 if((NULL != pWDA->wdaMsgParam) ||
7489 (NULL != pWDA->wdaWdiApiMsgParam))
7490 {
7491 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7492 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7493 VOS_ASSERT(0);
7494 vos_mem_free(wdiKeepAliveInfo);
7495 return VOS_STATUS_E_FAILURE;
7496 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007497 /* Store param pointer as passed in by caller */
7498 pWDA->wdaMsgParam = pKeepAliveParams;
7499 /* store Params pass it to WDI */
7500 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007501 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7502 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7503 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7504 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7505 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7507 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7508 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7509 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7510 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7512 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7513 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7514 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7515 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7516 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7517 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7518 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7519 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7520 "TimePeriod %d PacketType %d",
7521 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7522 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007523 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007524 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007525 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007526 {
7527 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7528 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007529 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007530 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7531 vos_mem_free(pWDA->wdaMsgParam);
7532 pWDA->wdaWdiApiMsgParam = NULL;
7533 pWDA->wdaMsgParam = NULL;
7534 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007535 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007536
7537}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007538/*
7539 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7540 *
7541 */
7542void WDA_WowlAddBcPtrnReqCallback(WDI_Status status, void* pUserData)
7543{
7544 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7546 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007547 if(NULL == pWdaParams)
7548 {
7549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7550 "%s: pWdaParams received NULL", __FUNCTION__);
7551 VOS_ASSERT(0) ;
7552 return ;
7553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007554 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7555 vos_mem_free(pWdaParams->wdaMsgParam);
7556 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007557 return ;
7558}
Jeff Johnson295189b2012-06-20 16:38:30 -07007559/*
7560 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7561 * Request to WDI to add WOWL Bcast pattern
7562 */
7563VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7564 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7565{
7566 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007567 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007568 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7569 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7570 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7571 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007572 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7573 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007574 if(NULL == wdiWowlAddBcPtrnInfo)
7575 {
7576 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7577 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7578 VOS_ASSERT(0);
7579 return VOS_STATUS_E_NOMEM;
7580 }
7581 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7582 if(NULL == pWdaParams)
7583 {
7584 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7585 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7586 VOS_ASSERT(0);
7587 vos_mem_free(wdiWowlAddBcPtrnInfo);
7588 return VOS_STATUS_E_NOMEM;
7589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007590 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7591 pWowlAddBcPtrnParams->ucPatternId;
7592 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7593 pWowlAddBcPtrnParams->ucPatternByteOffset;
7594 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7595 pWowlAddBcPtrnParams->ucPatternMaskSize;
7596 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7597 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007598 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7599 {
7600 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7601 pWowlAddBcPtrnParams->ucPattern,
7602 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7603 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7604 pWowlAddBcPtrnParams->ucPatternMask,
7605 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7606 }
7607 else
7608 {
7609 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7610 pWowlAddBcPtrnParams->ucPattern,
7611 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7612 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7613 pWowlAddBcPtrnParams->ucPatternMask,
7614 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7615
7616 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7617 pWowlAddBcPtrnParams->ucPatternExt,
7618 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7619 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7620 pWowlAddBcPtrnParams->ucPatternMaskExt,
7621 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7622 }
7623
7624 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007625 /* Store param pointer as passed in by caller */
7626 /* store Params pass it to WDI */
7627 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7628 pWdaParams->pWdaContext = pWDA;
7629 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007630 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007631 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007632 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007633 {
7634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7635 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007636 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007637 vos_mem_free(pWdaParams->wdaMsgParam) ;
7638 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7639 vos_mem_free(pWdaParams) ;
7640 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007641 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007642
7643}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007644/*
7645 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7646 *
7647 */
7648void WDA_WowlDelBcPtrnReqCallback(WDI_Status status, void* pUserData)
7649{
7650 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007651 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7652 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007653 if(NULL == pWdaParams)
7654 {
7655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7656 "%s: pWdaParams received NULL", __FUNCTION__);
7657 VOS_ASSERT(0) ;
7658 return ;
7659 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007660 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7661 vos_mem_free(pWdaParams->wdaMsgParam);
7662 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007663 return ;
7664}
Jeff Johnson295189b2012-06-20 16:38:30 -07007665/*
7666 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7667 * Request to WDI to delete WOWL Bcast pattern
7668 */
7669VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7670 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7671{
7672 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007673 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007674 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7675 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7676 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7677 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7679 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007680 if(NULL == wdiWowlDelBcPtrnInfo)
7681 {
7682 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7683 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7684 VOS_ASSERT(0);
7685 return VOS_STATUS_E_NOMEM;
7686 }
7687 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7688 if(NULL == pWdaParams)
7689 {
7690 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7691 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7692 VOS_ASSERT(0);
7693 vos_mem_free(wdiWowlDelBcPtrnInfo);
7694 return VOS_STATUS_E_NOMEM;
7695 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007696 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7697 pWowlDelBcPtrnParams->ucPatternId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007698 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007699 /* Store param pointer as passed in by caller */
7700 /* store Params pass it to WDI */
7701 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7702 pWdaParams->pWdaContext = pWDA;
7703 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007704 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007705 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007706 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007707 {
7708 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7709 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007710 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007711 vos_mem_free(pWdaParams->wdaMsgParam) ;
7712 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7713 vos_mem_free(pWdaParams) ;
7714 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007715 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007716
7717}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007718/*
7719 * FUNCTION: WDA_WowlEnterReqCallback
7720 *
7721 */
7722void WDA_WowlEnterReqCallback(WDI_Status status, void* pUserData)
7723{
7724 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7725 tWDA_CbContext *pWDA;
7726 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007727 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7728 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007729 if(NULL == pWdaParams)
7730 {
7731 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7732 "%s: pWdaParams received NULL", __FUNCTION__);
7733 VOS_ASSERT(0) ;
7734 return ;
7735 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007736 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7737 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
7738
Jeff Johnson295189b2012-06-20 16:38:30 -07007739 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7740 vos_mem_free(pWdaParams) ;
7741
Jeff Johnson295189b2012-06-20 16:38:30 -07007742 pWowlEnterParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007743 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007744 return ;
7745}
Jeff Johnson295189b2012-06-20 16:38:30 -07007746/*
7747 * FUNCTION: WDA_ProcessWowlEnterReq
7748 * Request to WDI to enter WOWL
7749 */
7750VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
7751 tSirHalWowlEnterParams *pWowlEnterParams)
7752{
7753 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007754 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007755 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
7756 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
7757 sizeof(WDI_WowlEnterReqParamsType)) ;
7758 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007759 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7760 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007761 if(NULL == wdiWowlEnterInfo)
7762 {
7763 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7764 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7765 VOS_ASSERT(0);
7766 return VOS_STATUS_E_NOMEM;
7767 }
7768 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7769 if(NULL == pWdaParams)
7770 {
7771 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7772 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7773 VOS_ASSERT(0);
7774 vos_mem_free(wdiWowlEnterInfo);
7775 return VOS_STATUS_E_NOMEM;
7776 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007777 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
7778 pWowlEnterParams->magicPtrn,
7779 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007780 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
7781 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007782 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
7783 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007784 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
7785 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007786 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
7787 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007788 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
7789 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007790 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
7791 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007792 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
7793 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07007794 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
7795 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07007796#ifdef WLAN_WAKEUP_EVENTS
7797 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
7798 pWowlEnterParams->ucWoWEAPIDRequestEnable;
7799
7800 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
7801 pWowlEnterParams->ucWoWEAPOL4WayEnable;
7802
7803 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
7804 pWowlEnterParams->ucWowNetScanOffloadMatch;
7805
7806 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
7807 pWowlEnterParams->ucWowGTKRekeyError;
7808
7809 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
7810 pWowlEnterParams->ucWoWBSSConnLoss;
7811#endif // WLAN_WAKEUP_EVENTS
7812
7813 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007814 /* Store param pointer as passed in by caller */
7815 /* store Params pass it to WDI */
7816 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
7817 pWdaParams->pWdaContext = pWDA;
7818 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007819 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007820 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007821 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007822 {
7823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7824 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007825 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007826 vos_mem_free(pWdaParams->wdaMsgParam) ;
7827 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7828 vos_mem_free(pWdaParams) ;
7829 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007830 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007831
7832}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007833/*
7834 * FUNCTION: WDA_WowlExitReqCallback
7835 *
7836 */
7837void WDA_WowlExitReqCallback(WDI_Status status, void* pUserData)
7838{
7839 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7841 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007842 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007843 return ;
7844}
Jeff Johnson295189b2012-06-20 16:38:30 -07007845/*
7846 * FUNCTION: WDA_ProcessWowlExitReq
7847 * Request to WDI to add WOWL Bcast pattern
7848 */
7849VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA)
7850{
7851 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007852 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007853
7854 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7855 "------> %s " ,__FUNCTION__);
Jeff Johnson43971f52012-07-17 12:26:56 -07007856 wstatus = WDI_WowlExitReq((WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07007857
Jeff Johnson43971f52012-07-17 12:26:56 -07007858 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007859 {
7860 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7861 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007862 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007863 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7864 vos_mem_free(pWDA->wdaMsgParam);
7865 pWDA->wdaWdiApiMsgParam = NULL;
7866 pWDA->wdaMsgParam = NULL;
7867 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007868 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007869}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007870/*
7871 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
7872 * Request to WDI to determine whether a given station is capable of
7873 * using HW-based frame translation
7874 */
7875v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
7876 tANI_U8 staIdx)
7877{
7878 return WDI_IsHwFrameTxTranslationCapable(staIdx);
7879}
Jeff Johnson295189b2012-06-20 16:38:30 -07007880/*
7881 * FUNCTION: WDA_NvDownloadReqCallback
7882 * send NV Download RSP back to PE
7883 */
7884void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
7885 void* pUserData)
7886{
Jeff Johnson295189b2012-06-20 16:38:30 -07007887 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7889 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007890 /*Cleaning */
7891 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7892 pWDA->wdaWdiApiMsgParam = NULL;
7893 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007894 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07007895 return ;
7896}
Jeff Johnson295189b2012-06-20 16:38:30 -07007897/*
7898 * FUNCTION: WDA_ProcessNvDownloadReq
7899 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
7900 */
7901VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
7902{
7903 /* Initialize the local Variables*/
7904 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
7905 v_VOID_t *pNvBuffer=NULL;
7906 v_SIZE_t bufferSize = 0;
7907 WDI_Status status = WDI_STATUS_E_FAILURE;
7908 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7910 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007911 if(NULL == pWDA)
7912 {
7913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7914 "%s:pWDA is NULL", __FUNCTION__);
7915 return VOS_STATUS_E_FAILURE;
7916 }
7917 if(NULL != pWDA->wdaWdiApiMsgParam)
7918 {
7919 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7920 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7921 return VOS_STATUS_E_FAILURE;
7922 }
7923
7924 /* Get the NV structure base address and size from VOS */
7925 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07007926 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
7927 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007928 if(NULL == wdiNvDownloadReqParam)
7929 {
7930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7931 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7932 VOS_ASSERT(0);
7933 return VOS_STATUS_E_NOMEM;
7934 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007935 /* Copy Params to wdiNvDownloadReqParam*/
7936 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
7937 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007938 /* store Params pass it to WDI */
7939 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007940 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007941 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
7942 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07007943 if(IS_WDI_STATUS_FAILURE(status))
7944 {
7945 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7946 "Failure in NV Download REQ Params WDI API, free all the memory " );
7947 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7948 pWDA->wdaWdiApiMsgParam = NULL;
7949 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007950 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007951}
7952/*
7953 * FUNCTION: WDA_FlushAcReqCallback
7954 * send Flush AC RSP back to TL
7955 */
7956void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
7957{
7958 vos_msg_t wdaMsg = {0} ;
7959 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7960 tFlushACReq *pFlushACReqParams;
7961 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007962 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7963 "<------ %s " ,__FUNCTION__);
7964 if(NULL == pWdaParams)
7965 {
7966 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7967 "%s: pWdaParams received NULL", __FUNCTION__);
7968 VOS_ASSERT(0) ;
7969 return ;
7970 }
7971
7972 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
7973 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
7974 if(NULL == pFlushACRspParams)
7975 {
7976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7977 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7978 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07007979 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007980 return ;
7981 }
7982 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
7983 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
7984 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
7985 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
7986 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
7987 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007988 vos_mem_free(pWdaParams->wdaMsgParam) ;
7989 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7990 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007991 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
7992 wdaMsg.bodyptr = (void *)pFlushACRspParams;
7993 // POST message to TL
7994 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
7995
Jeff Johnson295189b2012-06-20 16:38:30 -07007996 return ;
7997}
Jeff Johnson295189b2012-06-20 16:38:30 -07007998/*
7999 * FUNCTION: WDA_ProcessFlushAcReq
8000 * Request to WDI to Update the DELBA REQ params.
8001 */
8002VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8003 tFlushACReq *pFlushAcReqParams)
8004{
8005 WDI_Status status = WDI_STATUS_SUCCESS ;
8006 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8007 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8008 sizeof(WDI_FlushAcReqParamsType)) ;
8009 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008010 if(NULL == wdiFlushAcReqParam)
8011 {
8012 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8013 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8014 VOS_ASSERT(0);
8015 return VOS_STATUS_E_NOMEM;
8016 }
8017 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8018 if(NULL == pWdaParams)
8019 {
8020 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8021 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8022 VOS_ASSERT(0);
8023 vos_mem_free(wdiFlushAcReqParam);
8024 return VOS_STATUS_E_NOMEM;
8025 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008026 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8027 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008028 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8029 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8030 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8031 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008032 /* Store Flush AC pointer, as this will be used for response */
8033 /* store Params pass it to WDI */
8034 pWdaParams->pWdaContext = pWDA;
8035 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8036 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008037 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8038 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008039 if(IS_WDI_STATUS_FAILURE(status))
8040 {
8041 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8042 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8043 vos_mem_free(pWdaParams->wdaMsgParam) ;
8044 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8045 vos_mem_free(pWdaParams) ;
8046 //TODO: respond to TL with failure
8047 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008048 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008049}
Jeff Johnson295189b2012-06-20 16:38:30 -07008050/*
8051 * FUNCTION: WDA_BtAmpEventReqCallback
8052 *
8053 */
8054void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8055{
8056 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8057 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008058 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008059
8060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8061 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008062 if(NULL == pWdaParams)
8063 {
8064 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8065 "%s: pWdaParams received NULL", __FUNCTION__);
8066 VOS_ASSERT(0) ;
8067 return ;
8068 }
8069 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8070 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8071 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8072 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8073 {
8074 pWDA->wdaAmpSessionOn = VOS_FALSE;
8075 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008076 vos_mem_free(pWdaParams->wdaMsgParam) ;
8077 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8078 vos_mem_free(pWdaParams) ;
8079 /*
8080 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8081 * param here
8082 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008083 return ;
8084}
8085
Jeff Johnson295189b2012-06-20 16:38:30 -07008086/*
8087 * FUNCTION: WDA_ProcessBtAmpEventReq
8088 * Request to WDI to Update with BT AMP events.
8089 */
8090VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8091 tSmeBtAmpEvent *pBtAmpEventParams)
8092{
8093 WDI_Status status = WDI_STATUS_SUCCESS ;
8094 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8095 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8096 sizeof(WDI_BtAmpEventParamsType)) ;
8097 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008098 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8099 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008100 if(NULL == wdiBtAmpEventParam)
8101 {
8102 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8103 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8104 VOS_ASSERT(0);
8105 return VOS_STATUS_E_NOMEM;
8106 }
8107 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8108 if(NULL == pWdaParams)
8109 {
8110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8111 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8112 VOS_ASSERT(0);
8113 vos_mem_free(wdiBtAmpEventParam);
8114 return VOS_STATUS_E_NOMEM;
8115 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008116 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8117 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008118 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008119 /* Store BT AMP event pointer, as this will be used for response */
8120 /* store Params pass it to WDI */
8121 pWdaParams->pWdaContext = pWDA;
8122 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8123 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008124 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8125 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008126 if(IS_WDI_STATUS_FAILURE(status))
8127 {
8128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8129 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8130 vos_mem_free(pWdaParams->wdaMsgParam) ;
8131 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8132 vos_mem_free(pWdaParams) ;
8133 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008134 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8135 {
8136 pWDA->wdaAmpSessionOn = VOS_TRUE;
8137 }
8138 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008139}
8140
Jeff Johnson295189b2012-06-20 16:38:30 -07008141#ifdef ANI_MANF_DIAG
8142/*
8143 * FUNCTION: WDA_FTMCommandReqCallback
8144 * Handle FTM CMD response came from HAL
8145 * Route responce to HDD FTM
8146 */
8147void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8148 void *usrData)
8149{
8150 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008151 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8152 {
8153 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8154 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8155 return;
8156 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008157 /* Release Current FTM Command Request */
8158 vos_mem_free(pWDA->wdaFTMCmdReq);
8159 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008160#ifndef WLAN_FTM_STUB
8161 /* Post FTM Responce to HDD FTM */
8162 wlan_sys_ftm(ftmCmdRspData);
8163#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008164 return;
8165}
Jeff Johnson295189b2012-06-20 16:38:30 -07008166/*
8167 * FUNCTION: WDA_ProcessFTMCommand
8168 * Send FTM command to WDI
8169 */
8170VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8171 tPttMsgbuffer *pPTTFtmCmd)
8172{
8173 WDI_Status status = WDI_STATUS_SUCCESS;
8174 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008175 ftmCMDReq = (WDI_FTMCommandReqType *)
8176 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8177 if(NULL == ftmCMDReq)
8178 {
8179 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8180 "WDA FTM Command buffer alloc fail");
8181 return VOS_STATUS_E_NOMEM;
8182 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008183 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8184 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008185 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008186 /* Send command to WDI */
8187 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008188 return status;
8189}
8190#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008191#ifdef FEATURE_OEM_DATA_SUPPORT
8192/*
8193 * FUNCTION: WDA_StartOemDataReqCallback
8194 *
8195 */
8196void WDA_StartOemDataReqCallback(
8197 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8198 void* pUserData)
8199{
8200 VOS_STATUS status = VOS_STATUS_E_FAILURE;
8201 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8202 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008203
Jeff Johnsone7245742012-09-05 17:12:55 -07008204 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8205 "<------ %s " ,__FUNCTION__);
8206 if(NULL == pWDA)
8207 {
8208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8209 "%s:pWDA is NULL", __FUNCTION__);
8210 VOS_ASSERT(0);
8211 return ;
8212 }
8213
8214 /*
8215 * Allocate memory for response params sent to PE
8216 */
8217 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8218
8219 // Check if memory is allocated for OemdataMeasRsp Params.
8220 if(NULL == pOemDataRspParams)
8221 {
8222 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8223 "OEM DATA WDA callback alloc fail");
8224 VOS_ASSERT(0) ;
8225 return;
8226 }
8227 // Free the memory allocated during request.
8228 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8229 vos_mem_free(pWDA->wdaMsgParam) ;
8230 pWDA->wdaWdiApiMsgParam = NULL;
8231 pWDA->wdaMsgParam = NULL;
8232 /*
8233 * Now go ahead and copy other stuff for PE in incase of sucess only
8234 * Also, here success always means that we have atleast one BSSID.
8235 */
8236 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8237
8238 //enable Tx
8239 status = WDA_ResumeDataTx(pWDA);
8240 if(status != VOS_STATUS_SUCCESS)
8241 {
8242 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8243 }
8244 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8245 return ;
8246}
8247/*
8248 * FUNCTION: WDA_ProcessStartOemDataReq
8249 * Send Start Oem Data Req to WDI
8250 */
8251VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8252 tStartOemDataReq *pOemDataReqParams)
8253{
8254 WDI_Status status = WDI_STATUS_SUCCESS;
8255 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
8256
8257 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8258
8259 if(NULL == wdiOemDataReqParams)
8260 {
8261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8262 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8263 VOS_ASSERT(0);
8264 return VOS_STATUS_E_NOMEM;
8265 }
8266
8267 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8268 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
8269
8270 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8271
8272 if((NULL != pWDA->wdaMsgParam) ||
8273 (NULL != pWDA->wdaWdiApiMsgParam))
8274 {
8275 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8276 "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__);
8277 VOS_ASSERT(0);
8278 vos_mem_free(wdiOemDataReqParams);
8279 return VOS_STATUS_E_FAILURE;
8280 }
8281 pWDA->wdaMsgParam = (void *)pOemDataReqParams;
8282 pWDA->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8283
8284 status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
8285
8286 if(IS_WDI_STATUS_FAILURE(status))
8287 {
8288 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8289 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
8290 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8291 vos_mem_free(pWDA->wdaMsgParam);
8292 pWDA->wdaWdiApiMsgParam = NULL;
8293 pWDA->wdaMsgParam = NULL;
8294 }
8295 return CONVERT_WDI2VOS_STATUS(status) ;
8296}
8297#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008298/*
8299 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8300 *
8301 */
8302void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8303{
8304 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008305 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8306 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008307 if(NULL == pWdaParams)
8308 {
8309 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8310 "%s: pWdaParams received NULL", __FUNCTION__);
8311 VOS_ASSERT(0) ;
8312 return ;
8313 }
8314
8315 if(NULL != pWdaParams->wdaMsgParam)
8316 {
8317 vos_mem_free(pWdaParams->wdaMsgParam);
8318 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008319 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8320 {
8321 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8322 }
8323
8324 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008325 return ;
8326}
Jeff Johnson295189b2012-06-20 16:38:30 -07008327#ifdef WLAN_FEATURE_GTK_OFFLOAD
8328/*
8329 * FUNCTION: WDA_HostOffloadReqCallback
8330 *
8331 */
8332void WDA_GTKOffloadReqCallback(WDI_Status status, void* pUserData)
8333{
8334 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8335
8336 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8337 "<------ %s " ,__FUNCTION__);
8338
8339 VOS_ASSERT(NULL != pWdaParams);
8340
8341 vos_mem_free(pWdaParams->wdaMsgParam) ;
8342 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8343 vos_mem_free(pWdaParams) ;
8344
8345 //print a msg, nothing else to do
8346 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8347 "WDA_GTKOffloadReqCallback invoked " );
8348
8349 return ;
8350}
8351
8352/*
8353 * FUNCTION: WDA_ProcessGTKOffloadReq
8354 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8355 * to broadcast traffic (sta mode).
8356 */
8357VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8358 tpSirGtkOffloadParams pGtkOffloadParams)
8359{
8360 VOS_STATUS status = VOS_STATUS_SUCCESS;
8361 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8362 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8363 sizeof(WDI_GtkOffloadReqMsg)) ;
8364 tWDA_ReqParams *pWdaParams ;
8365
8366 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8367 "------> %s " ,__FUNCTION__);
8368
8369 if(NULL == wdiGtkOffloadReqMsg)
8370 {
8371 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8372 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8373 VOS_ASSERT(0);
8374 return VOS_STATUS_E_NOMEM;
8375 }
8376
8377 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8378 if(NULL == pWdaParams)
8379 {
8380 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8381 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8382 VOS_ASSERT(0);
8383 vos_mem_free(wdiGtkOffloadReqMsg);
8384 return VOS_STATUS_E_NOMEM;
8385 }
8386
8387 //
8388 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8389 //
8390 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8391 // Copy KCK
8392 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8393 // Copy KEK
8394 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8395 // Copy KeyReplayCounter
8396 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8397 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8398
8399 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8400
8401 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8402 (NULL == pWDA->wdaWdiApiMsgParam));
8403
8404 /* Store Params pass it to WDI */
8405 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8406 pWdaParams->pWdaContext = pWDA;
8407 /* Store param pointer as passed in by caller */
8408 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8409
8410 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8411
8412 if(IS_WDI_STATUS_FAILURE(status))
8413 {
8414 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8415 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8416 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8417 vos_mem_free(pWdaParams->wdaMsgParam);
8418 vos_mem_free(pWdaParams);
8419 }
8420
8421 return CONVERT_WDI2VOS_STATUS(status) ;
8422}
8423
8424/*
8425 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8426 *
8427 */
8428void WDA_GtkOffloadGetInfoCallback(WDI_Status status, void * pUserData)
8429{
8430 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8431 tWDA_CbContext *pWDA;
8432 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8433 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8434 tANI_U8 i;
8435 vos_msg_t vosMsg;
8436
8437 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8438 "<------ %s " ,__FUNCTION__);
8439
8440 VOS_ASSERT(NULL != pWdaParams);
8441
8442 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8443 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8444
8445 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8446 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8447
8448 /* Message Header */
8449 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8450 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8451
8452 pGtkOffloadGetInfoRsp->ulStatus = pGtkOffloadGetInfoReq->ulStatus;
8453 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pGtkOffloadGetInfoReq->ullKeyReplayCounter;
8454 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pGtkOffloadGetInfoReq->ulTotalRekeyCount;
8455 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pGtkOffloadGetInfoReq->ulGTKRekeyCount;
8456 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pGtkOffloadGetInfoReq->ulIGTKRekeyCount;
8457
8458 /* VOS message wrapper */
8459 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8460 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8461 vosMsg.bodyval = 0;
8462
8463 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8464 {
8465 /* free the mem and return */
8466 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8467 }
8468
8469 vos_mem_free(pWdaParams->wdaMsgParam) ;
8470 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8471 vos_mem_free(pWdaParams) ;
8472}
8473#endif
8474
8475/*
8476 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8477 * Request to WDI to set Tx Per Tracking configurations
8478 */
8479VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8480{
8481 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008482 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008483 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8484 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8485 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8486 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008487 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8488 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008489 if(NULL == pwdiSetTxPerTrackingReqParams)
8490 {
8491 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8492 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8493 vos_mem_free(pTxPerTrackingParams);
8494 VOS_ASSERT(0);
8495 return VOS_STATUS_E_NOMEM;
8496 }
8497 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8498 if(NULL == pWdaParams)
8499 {
8500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8501 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8502 vos_mem_free(pwdiSetTxPerTrackingReqParams);
8503 vos_mem_free(pTxPerTrackingParams);
8504 VOS_ASSERT(0);
8505 return VOS_STATUS_E_NOMEM;
8506 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008507 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8508 pTxPerTrackingParams->ucTxPerTrackingEnable;
8509 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8510 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8511 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8512 pTxPerTrackingParams->ucTxPerTrackingRatio;
8513 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8514 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008515 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008516 /* Store param pointer as passed in by caller */
8517 /* store Params pass it to WDI
8518 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8519 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8520 pWdaParams->pWdaContext = pWDA;
8521 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008522 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008523 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008524 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008525 {
8526 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8527 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008528 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008529 vos_mem_free(pWdaParams->wdaMsgParam) ;
8530 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8531 vos_mem_free(pWdaParams) ;
8532 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008533 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008534
8535}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008536/*
8537 * FUNCTION: WDA_HALDumpCmdCallback
8538 * Send the VOS complete .
8539 */
8540void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8541 void* pUserData)
8542{
8543 tANI_U8 *buffer = NULL;
8544 tWDA_CbContext *pWDA = NULL;
8545 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008546 if(NULL == pWdaParams)
8547 {
8548 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8549 "%s: pWdaParams received NULL", __FUNCTION__);
8550 VOS_ASSERT(0) ;
8551 return ;
8552 }
8553
8554 pWDA = pWdaParams->pWdaContext;
8555 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008556 if(wdiRspParams->usBufferLen > 0)
8557 {
8558 /*Copy the Resp data to UMAC supplied buffer*/
8559 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8560 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008561 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8562 vos_mem_free(pWdaParams);
8563
8564 /* Indicate VOSS about the start complete */
8565 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008566 return ;
8567}
8568
Jeff Johnson295189b2012-06-20 16:38:30 -07008569/*
8570 * FUNCTION: WDA_ProcessHALDumpCmdReq
8571 * Send Dump command to WDI
8572 */
8573VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8574 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8575 tANI_U32 arg4, tANI_U8 *pBuffer)
8576{
8577 WDI_Status status = WDI_STATUS_SUCCESS;
8578 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8579 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8580 tWDA_ReqParams *pWdaParams ;
8581 pVosContextType pVosContext = NULL;
8582 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008583 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8584 (void *)pMac);
8585
8586 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8587 if(NULL == pWdaParams)
8588 {
8589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8590 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8591 return VOS_STATUS_E_NOMEM;
8592 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008593 /* Allocate memory WDI request structure*/
8594 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8595 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8596 if(NULL == wdiHALDumpCmdReqParam)
8597 {
8598 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8599 "WDA HAL DUMP Command buffer alloc fail");
8600 vos_mem_free(pWdaParams);
8601 return WDI_STATUS_E_FAILURE;
8602 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008603 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008604 /* Extract the arguments */
8605 wdiHalDumpCmdInfo->command = cmd;
8606 wdiHalDumpCmdInfo->argument1 = arg1;
8607 wdiHalDumpCmdInfo->argument2 = arg2;
8608 wdiHalDumpCmdInfo->argument3 = arg3;
8609 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07008610 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008611 pWdaParams->pWdaContext = pVosContext->pWDAContext;
8612
8613 /* Response message will be passed through the buffer */
8614 pWdaParams->wdaMsgParam = (void *)pBuffer;
8615
8616 /* store Params pass it to WDI */
8617 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008618 /* Send command to WDI */
8619 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008620 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07008621 if ( vStatus != VOS_STATUS_SUCCESS )
8622 {
8623 if ( vStatus == VOS_STATUS_E_TIMEOUT )
8624 {
8625 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8626 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
8627 }
8628 else
8629 {
8630 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8631 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
8632 }
8633 VOS_ASSERT(0);
8634 }
8635 return status;
8636}
Jeff Johnson295189b2012-06-20 16:38:30 -07008637#ifdef WLAN_FEATURE_GTK_OFFLOAD
8638/*
8639 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
8640 * Request to WDI to get GTK Offload Information
8641 */
8642VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
8643 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
8644{
8645 VOS_STATUS status = VOS_STATUS_SUCCESS;
8646 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
8647 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
8648 tWDA_ReqParams *pWdaParams ;
8649
8650 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
8651 {
8652 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8653 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8654 VOS_ASSERT(0);
8655 return VOS_STATUS_E_NOMEM;
8656 }
8657
8658 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8659 if(NULL == pWdaParams)
8660 {
8661 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8662 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8663 VOS_ASSERT(0);
8664 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
8665 return VOS_STATUS_E_NOMEM;
8666 }
8667
8668 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
8669
8670 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8671 (NULL == pWDA->wdaWdiApiMsgParam));
8672
8673 /* Store Params pass it to WDI */
8674 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
8675 pWdaParams->pWdaContext = pWDA;
8676 /* Store param pointer as passed in by caller */
8677 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
8678
8679 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
8680
8681 if(IS_WDI_STATUS_FAILURE(status))
8682 {
8683 /* failure returned by WDI API */
8684 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8685 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
8686 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8687 vos_mem_free(pWdaParams) ;
8688 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
8689 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
8690 }
8691
8692 return CONVERT_WDI2VOS_STATUS(status) ;
8693}
8694#endif // WLAN_FEATURE_GTK_OFFLOAD
8695
8696/*
8697 * -------------------------------------------------------------------------
8698 * DATA interface with WDI for Mgmt Frames
8699 * -------------------------------------------------------------------------
8700 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008701/*
8702 * FUNCTION: WDA_TxComplete
8703 * Callback function for the WDA_TxPacket
8704 */
8705VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
8706 VOS_STATUS status )
8707{
8708
8709 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8710 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
8711
8712 if(NULL == wdaContext)
8713 {
8714 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8715 "%s:pWDA is NULL",
8716 __FUNCTION__);
8717 VOS_ASSERT(0);
8718 return VOS_STATUS_E_FAILURE;
8719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008720 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
8721 if( NULL!=wdaContext->pTxCbFunc)
8722 {
8723 /*check if packet is freed already*/
8724 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
8725 {
8726 wdaContext->pTxCbFunc(pMac, pData);
8727 }
8728 else
8729 {
8730 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
8731 "%s:packet (0x%X) is already freed",
8732 __FUNCTION__, pData);
8733 //Return from here since we reaching here because the packet already timeout
8734 return status;
8735 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008736 }
8737
8738 /*
8739 * Trigger the event to bring the HAL TL Tx complete function to come
8740 * out of wait
8741 * Let the coe above to complete the packet first. When this event is set,
8742 * the thread waiting for the event may run and set Vospacket_freed causing the original
8743 * packet not being freed.
8744 */
8745 status = vos_event_set(&wdaContext->txFrameEvent);
8746 if(!VOS_IS_STATUS_SUCCESS(status))
8747 {
8748 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8749 "NEW VOS Event Set failed - status = %d \n", status);
8750 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008751 return status;
8752}
Jeff Johnson295189b2012-06-20 16:38:30 -07008753/*
8754 * FUNCTION: WDA_TxPacket
8755 * Forward TX management frame to WDI
8756 */
8757VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
8758 void *pFrmBuf,
8759 tANI_U16 frmLen,
8760 eFrameType frmType,
8761 eFrameTxDir txDir,
8762 tANI_U8 tid,
8763 pWDATxRxCompFunc pCompFunc,
8764 void *pData,
8765 pWDAAckFnTxComp pAckTxComp,
8766 tANI_U8 txFlag)
8767{
8768 VOS_STATUS status = VOS_STATUS_SUCCESS ;
8769 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
8770 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
8771 tANI_U8 eventIdx = 0;
8772 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
8773 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07008774 if((NULL == pWDA)||(NULL == pFrmBuf))
8775 {
8776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8777 "%s:pWDA %x or pFrmBuf %x is NULL",
8778 __FUNCTION__,pWDA,pFrmBuf);
8779 VOS_ASSERT(0);
8780 return VOS_STATUS_E_FAILURE;
8781 }
8782
8783 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
8784 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07008785 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
8786 if(NULL == pMac)
8787 {
8788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8789 "%s:pMac is NULL", __FUNCTION__);
8790 VOS_ASSERT(0);
8791 return VOS_STATUS_E_FAILURE;
8792 }
8793
8794
8795
8796 /* store the call back function in WDA context */
8797 pWDA->pTxCbFunc = pCompFunc;
8798 /* store the call back for the function of ackTxComplete */
8799 if( pAckTxComp )
8800 {
Jeff Johnsone7245742012-09-05 17:12:55 -07008801 if( NULL != pWDA->pAckTxCbFunc )
8802 {
8803 /* Already TxComp is active no need to active again */
8804 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8805 "There is already one request pending for tx complete\n");
8806 pWDA->pAckTxCbFunc( pMac, 0);
8807 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008808
Jeff Johnsone7245742012-09-05 17:12:55 -07008809 if( VOS_STATUS_SUCCESS !=
8810 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8811 {
8812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8813 "Tx Complete timeout Timer Stop Failed ");
8814 }
8815 else
8816 {
8817 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8818 "Tx Complete timeout Timer Stop Sucess ");
8819 }
8820 }
8821
8822 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
8823 pWDA->pAckTxCbFunc = pAckTxComp;
8824 if( VOS_STATUS_SUCCESS !=
8825 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
8826 {
8827 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8828 "Tx Complete Timer Start Failed ");
8829 pWDA->pAckTxCbFunc = NULL;
8830 return eHAL_STATUS_FAILURE;
8831 }
8832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008833 /* Reset the event to be not signalled */
8834 status = vos_event_reset(&pWDA->txFrameEvent);
8835 if(!VOS_IS_STATUS_SUCCESS(status))
8836 {
8837 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8838 "VOS Event reset failed - status = %d\n",status);
8839 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
8840 if( pAckTxComp )
8841 {
8842 pWDA->pAckTxCbFunc = NULL;
8843 if( VOS_STATUS_SUCCESS !=
8844 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8845 {
8846 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8847 "Tx Complete timeout Timer Stop Failed ");
8848 }
8849 }
8850 return VOS_STATUS_E_FAILURE;
8851 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008852 /* Get system role, use the self station if in unknown role or STA role */
8853 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07008854 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
8855 (( eSYSTEM_STA_ROLE == systemRole )
8856#ifdef FEATURE_WLAN_CCX
8857 && frmType == HAL_TXRX_FRM_802_11_MGMT
8858#endif
8859 ))
8860 {
8861 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
8862 }
8863
Jeff Johnsone7245742012-09-05 17:12:55 -07008864 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
8865 disassoc frame reaches the HW, HAL has already deleted the peer station */
8866 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07008867 {
Jeff Johnsone7245742012-09-05 17:12:55 -07008868 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
8869 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
8870 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
8871 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07008872 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008873 /*Send Probe request frames on self sta idx*/
8874 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07008875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008876 /* Since we donot want probe responses to be retried, send probe responses
8877 through the NO_ACK queues */
8878 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
8879 {
8880 //probe response is sent out using self station and no retries options.
8881 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
8882 }
8883 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
8884 {
8885 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
8886 }
8887 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008888 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
8889
8890 /*Set frame tag to 0
8891 We will use the WDA user data in order to tag a frame as expired*/
8892 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
8893 (v_PVOID_t)0);
8894
8895
8896 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
8897 frmLen, ucTypeSubType, tid,
8898 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
8899 {
8900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8901 "Sending Mgmt Frame failed - status = %d\n", status);
8902 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
8903 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
8904 if( pAckTxComp )
8905 {
8906 pWDA->pAckTxCbFunc = NULL;
8907 if( VOS_STATUS_SUCCESS !=
8908 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8909 {
8910 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8911 "Tx Complete timeout Timer Stop Failed ");
8912 }
8913 }
8914 return VOS_STATUS_E_FAILURE;
8915 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008916 /*
8917 * Wait for the event to be set by the TL, to get the response of TX
8918 * complete, this event should be set by the Callback function called by TL
8919 */
8920 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
8921 &eventIdx);
8922 if(!VOS_IS_STATUS_SUCCESS(status))
8923 {
8924 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8925 "%s: Status %d when waiting for TX Frame Event",
8926 __FUNCTION__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07008927 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
8928 after the packet gets completed(packet freed once)*/
8929
8930 /* check whether the packet was freed already,so need not free again when
8931 * TL calls the WDA_Txcomplete routine
8932 */
8933 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
8934 {
8935 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
8936 }
8937 if( pAckTxComp )
8938 {
8939 pWDA->pAckTxCbFunc = NULL;
8940 if( VOS_STATUS_SUCCESS !=
8941 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8942 {
8943 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8944 "Tx Complete timeout Timer Stop Failed ");
8945 }
8946 }
8947 status = VOS_STATUS_E_FAILURE;
8948 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008949 return status;
8950}
Jeff Johnson295189b2012-06-20 16:38:30 -07008951/*
8952 * FUNCTION: WDA_McProcessMsg
8953 * Trigger DAL-AL to start CFG download
8954 */
8955VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
8956{
8957 VOS_STATUS status = VOS_STATUS_SUCCESS;
8958 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008959 if(NULL == pMsg)
8960 {
8961 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8962 "%s:pMsg is NULL", __FUNCTION__);
8963 VOS_ASSERT(0);
8964 return VOS_STATUS_E_FAILURE;
8965 }
8966
8967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
8968 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
8969
8970 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
8971 if(NULL == pWDA )
8972 {
8973 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8974 "%s:pWDA is NULL", __FUNCTION__);
8975 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07008976 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07008977 return VOS_STATUS_E_FAILURE;
8978 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008979 /* Process all the WDA messages.. */
8980 switch( pMsg->type )
8981 {
8982 case WNI_CFG_DNLD_REQ:
8983 {
8984 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008985 /* call WDA complete event if config download success */
8986 if( VOS_IS_STATUS_SUCCESS(status) )
8987 {
8988 vos_WDAComplete_cback(pVosContext);
8989 }
8990 else
8991 {
8992 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8993 "WDA Config Download failure" );
8994 }
8995 break ;
8996 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008997 /*
8998 * Init SCAN request from PE, convert it into DAL format
8999 * and send it to DAL
9000 */
9001 case WDA_INIT_SCAN_REQ:
9002 {
9003 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9004 break ;
9005 }
9006 /* start SCAN request from PE */
9007 case WDA_START_SCAN_REQ:
9008 {
9009 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9010 break ;
9011 }
9012 /* end SCAN request from PE */
9013 case WDA_END_SCAN_REQ:
9014 {
9015 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9016 break ;
9017 }
9018 /* end SCAN request from PE */
9019 case WDA_FINISH_SCAN_REQ:
9020 {
9021 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9022 break ;
9023 }
9024 /* join request from PE */
9025 case WDA_CHNL_SWITCH_REQ:
9026 {
9027 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9028 {
9029 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9030 }
9031 else
9032 {
9033 WDA_ProcessChannelSwitchReq(pWDA,
9034 (tSwitchChannelParams*)pMsg->bodyptr) ;
9035 }
9036 break ;
9037 }
9038 /* ADD BSS request from PE */
9039 case WDA_ADD_BSS_REQ:
9040 {
9041 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9042 break ;
9043 }
9044 case WDA_ADD_STA_REQ:
9045 {
9046 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9047 break ;
9048 }
9049 case WDA_DELETE_BSS_REQ:
9050 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009051 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9052 break ;
9053 }
9054 case WDA_DELETE_STA_REQ:
9055 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009056 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9057 break ;
9058 }
9059 case WDA_CONFIG_PARAM_UPDATE_REQ:
9060 {
9061 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9062 break ;
9063 }
9064 case WDA_SET_BSSKEY_REQ:
9065 {
9066 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9067 break ;
9068 }
9069 case WDA_SET_STAKEY_REQ:
9070 {
9071 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9072 break ;
9073 }
9074 case WDA_SET_STA_BCASTKEY_REQ:
9075 {
9076 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9077 break ;
9078 }
9079 case WDA_REMOVE_BSSKEY_REQ:
9080 {
9081 WDA_ProcessRemoveBssKeyReq(pWDA,
9082 (tRemoveBssKeyParams *)pMsg->bodyptr);
9083 break ;
9084 }
9085 case WDA_REMOVE_STAKEY_REQ:
9086 {
9087 WDA_ProcessRemoveStaKeyReq(pWDA,
9088 (tRemoveStaKeyParams *)pMsg->bodyptr);
9089 break ;
9090 }
9091 case WDA_REMOVE_STA_BCASTKEY_REQ:
9092 {
9093 /* TODO: currently UMAC is not sending this request, Add the code for
9094 handling this request when UMAC supports */
9095 break;
9096 }
9097#ifdef FEATURE_WLAN_CCX
9098 case WDA_TSM_STATS_REQ:
9099 {
9100 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9101 break;
9102 }
9103#endif
9104 case WDA_UPDATE_EDCA_PROFILE_IND:
9105 {
9106 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9107 break;
9108 }
9109 case WDA_ADD_TS_REQ:
9110 {
9111 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9112 break;
9113 }
9114 case WDA_DEL_TS_REQ:
9115 {
9116 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9117 break;
9118 }
9119 case WDA_ADDBA_REQ:
9120 {
9121 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9122 break;
9123 }
9124 case WDA_DELBA_IND:
9125 {
9126 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9127 break;
9128 }
9129 case WDA_SET_LINK_STATE:
9130 {
9131 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9132 break;
9133 }
9134 case WDA_GET_STATISTICS_REQ:
9135 {
9136 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9137 break;
9138 }
9139 case WDA_PWR_SAVE_CFG:
9140 {
9141 if(pWDA->wdaState == WDA_READY_STATE)
9142 {
9143 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9144 }
9145 else
9146 {
9147 if(NULL != pMsg->bodyptr)
9148 {
9149 vos_mem_free(pMsg->bodyptr);
9150 }
9151 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9152 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9153 }
9154 break;
9155 }
9156 case WDA_ENTER_IMPS_REQ:
9157 {
9158 if(pWDA->wdaState == WDA_READY_STATE)
9159 {
9160 WDA_ProcessEnterImpsReq(pWDA);
9161 }
9162 else
9163 {
9164 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9165 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9166 }
9167 break;
9168 }
9169 case WDA_EXIT_IMPS_REQ:
9170 {
9171 if(pWDA->wdaState == WDA_READY_STATE)
9172 {
9173 WDA_ProcessExitImpsReq(pWDA);
9174 }
9175 else
9176 {
9177 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9178 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9179 }
9180 break;
9181 }
9182 case WDA_ENTER_BMPS_REQ:
9183 {
9184 if(pWDA->wdaState == WDA_READY_STATE)
9185 {
9186 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9187 }
9188 else
9189 {
9190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9191 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9192 }
9193 break;
9194 }
9195 case WDA_EXIT_BMPS_REQ:
9196 {
9197 if(pWDA->wdaState == WDA_READY_STATE)
9198 {
9199 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9200 }
9201 else
9202 {
9203 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9204 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9205 }
9206 break;
9207 }
9208 case WDA_ENTER_UAPSD_REQ:
9209 {
9210 if(pWDA->wdaState == WDA_READY_STATE)
9211 {
9212 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9213 }
9214 else
9215 {
9216 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9217 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9218 }
9219 break;
9220 }
9221 case WDA_EXIT_UAPSD_REQ:
9222 {
9223 if(pWDA->wdaState == WDA_READY_STATE)
9224 {
9225 WDA_ProcessExitUapsdReq(pWDA);
9226 }
9227 else
9228 {
9229 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9230 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9231 }
9232 break;
9233 }
9234 case WDA_UPDATE_UAPSD_IND:
9235 {
9236 if(pWDA->wdaState == WDA_READY_STATE)
9237 {
9238 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9239 }
9240 else
9241 {
9242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9243 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9244 }
9245 break;
9246 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009247 case WDA_REGISTER_PE_CALLBACK :
9248 {
9249 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9250 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9251 /*TODO: store the PE callback */
9252 /* Do Nothing? MSG Body should be freed at here */
9253 if(NULL != pMsg->bodyptr)
9254 {
9255 vos_mem_free(pMsg->bodyptr);
9256 }
9257 break;
9258 }
9259 case WDA_SYS_READY_IND :
9260 {
9261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9262 "Handling msg type WDA_SYS_READY_IND " );
9263 pWDA->wdaState = WDA_READY_STATE;
9264 if(NULL != pMsg->bodyptr)
9265 {
9266 vos_mem_free(pMsg->bodyptr);
9267 }
9268 break;
9269 }
9270 case WDA_BEACON_FILTER_IND :
9271 {
9272 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9273 break;
9274 }
9275 case WDA_BTC_SET_CFG:
9276 {
9277 /*TODO: handle this while dealing with BTC */
9278 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9279 "Handling msg type WDA_BTC_SET_CFG " );
9280 /* Do Nothing? MSG Body should be freed at here */
9281 if(NULL != pMsg->bodyptr)
9282 {
9283 vos_mem_free(pMsg->bodyptr);
9284 }
9285 break;
9286 }
9287 case WDA_SIGNAL_BT_EVENT:
9288 {
9289 /*TODO: handle this while dealing with BTC */
9290 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9291 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9292 /* Do Nothing? MSG Body should be freed at here */
9293 if(NULL != pMsg->bodyptr)
9294 {
9295 vos_mem_free(pMsg->bodyptr);
9296 }
9297 break;
9298 }
9299 case WDA_CFG_RXP_FILTER_REQ:
9300 {
9301 WDA_ProcessConfigureRxpFilterReq(pWDA,
9302 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9303 break;
9304 }
9305 case WDA_SET_HOST_OFFLOAD:
9306 {
9307 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9308 break;
9309 }
9310 case WDA_SET_KEEP_ALIVE:
9311 {
9312 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9313 break;
9314 }
9315#ifdef WLAN_NS_OFFLOAD
9316 case WDA_SET_NS_OFFLOAD:
9317 {
9318 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9319 break;
9320 }
9321#endif //WLAN_NS_OFFLOAD
9322 case WDA_ADD_STA_SELF_REQ:
9323 {
9324 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9325 break;
9326 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009327 case WDA_DEL_STA_SELF_REQ:
9328 {
9329 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9330 break;
9331 }
9332 case WDA_WOWL_ADD_BCAST_PTRN:
9333 {
9334 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9335 break;
9336 }
9337 case WDA_WOWL_DEL_BCAST_PTRN:
9338 {
9339 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9340 break;
9341 }
9342 case WDA_WOWL_ENTER_REQ:
9343 {
9344 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9345 break;
9346 }
9347 case WDA_WOWL_EXIT_REQ:
9348 {
9349 WDA_ProcessWowlExitReq(pWDA);
9350 break;
9351 }
9352 case WDA_TL_FLUSH_AC_REQ:
9353 {
9354 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9355 break;
9356 }
9357 case WDA_SIGNAL_BTAMP_EVENT:
9358 {
9359 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9360 break;
9361 }
9362#ifdef WDA_UT
9363 case WDA_WDI_EVENT_MSG:
9364 {
9365 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9366 break ;
9367 }
9368#endif
9369 case WDA_UPDATE_BEACON_IND:
9370 {
9371 WDA_ProcessUpdateBeaconParams(pWDA,
9372 (tUpdateBeaconParams *)pMsg->bodyptr);
9373 break;
9374 }
9375 case WDA_SEND_BEACON_REQ:
9376 {
9377 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9378 break;
9379 }
9380 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9381 {
9382 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9383 (tSendProbeRespParams *)pMsg->bodyptr);
9384 break;
9385 }
9386#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9387 case WDA_SET_MAX_TX_POWER_REQ:
9388 {
9389 WDA_ProcessSetMaxTxPowerReq(pWDA,
9390 (tMaxTxPowerParams *)pMsg->bodyptr);
9391 break;
9392 }
9393#endif
9394#ifdef WLAN_FEATURE_P2P
9395 case WDA_SET_P2P_GO_NOA_REQ:
9396 {
9397 WDA_ProcessSetP2PGONOAReq(pWDA,
9398 (tP2pPsParams *)pMsg->bodyptr);
9399 break;
9400 }
9401#endif
9402 /* timer related messages */
9403 case WDA_TIMER_BA_ACTIVITY_REQ:
9404 {
9405 WDA_BaCheckActivity(pWDA) ;
9406 break ;
9407 }
9408#ifdef WLAN_FEATURE_VOWIFI_11R
9409 case WDA_AGGR_QOS_REQ:
9410 {
9411 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9412 break;
9413 }
9414#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009415#ifdef ANI_MANF_DIAG
9416 case WDA_FTM_CMD_REQ:
9417 {
9418 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9419 break ;
9420 }
9421#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009422#ifdef FEATURE_OEM_DATA_SUPPORT
9423 case WDA_START_OEM_DATA_REQ:
9424 {
9425 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9426 break;
9427 }
9428#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009429 /* Tx Complete Time out Indication */
9430 case WDA_TX_COMPLETE_TIMEOUT_IND:
9431 {
9432 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9433 break;
9434 }
9435 case WDA_WLAN_SUSPEND_IND:
9436 {
9437 WDA_ProcessWlanSuspendInd(pWDA,
9438 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9439 break;
9440 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009441 case WDA_WLAN_RESUME_REQ:
9442 {
9443 WDA_ProcessWlanResumeReq(pWDA,
9444 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9445 break;
9446 }
9447
9448 case WDA_UPDATE_CF_IND:
9449 {
9450 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9451 pMsg->bodyptr = NULL;
9452 break;
9453 }
9454#ifdef FEATURE_WLAN_SCAN_PNO
9455 case WDA_SET_PNO_REQ:
9456 {
9457 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9458 break;
9459 }
9460 case WDA_UPDATE_SCAN_PARAMS_REQ:
9461 {
9462 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9463 break;
9464 }
9465 case WDA_SET_RSSI_FILTER_REQ:
9466 {
9467 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9468 break;
9469 }
9470#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009471 case WDA_SET_TX_PER_TRACKING_REQ:
9472 {
9473 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9474 break;
9475 }
9476
9477#ifdef WLAN_FEATURE_PACKET_FILTERING
9478 case WDA_8023_MULTICAST_LIST_REQ:
9479 {
9480 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9481 break;
9482 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009483 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9484 {
9485 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9486 break;
9487 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009488 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9489 {
9490 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9491 break;
9492 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009493 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9494 {
9495 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9496 break;
9497 }
9498#endif // WLAN_FEATURE_PACKET_FILTERING
9499
9500
9501 case WDA_TRANSMISSION_CONTROL_IND:
9502 {
9503 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9504 break;
9505 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009506 case WDA_SET_POWER_PARAMS_REQ:
9507 {
9508 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9509 break;
9510 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009511#ifdef WLAN_FEATURE_GTK_OFFLOAD
9512 case WDA_GTK_OFFLOAD_REQ:
9513 {
9514 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9515 break;
9516 }
9517
9518 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9519 {
9520 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9521 break;
9522 }
9523#endif //WLAN_FEATURE_GTK_OFFLOAD
9524
9525 case WDA_SET_TM_LEVEL_REQ:
9526 {
9527 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9528 break;
9529 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009530#ifdef WLAN_FEATURE_11AC
9531 case WDA_UPDATE_OP_MODE:
9532 {
9533 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9534 {
9535 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9536 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9537 else
9538 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9539 " VHT OpMode Feature is Not Supported \n");
9540 }
9541 else
9542 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9543 " 11AC Feature is Not Supported \n");
9544 break;
9545 }
9546#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009547 default:
9548 {
9549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9550 "No Handling for msg type %x in WDA "
9551 ,pMsg->type);
9552 /* Do Nothing? MSG Body should be freed at here */
9553 if(NULL != pMsg->bodyptr)
9554 {
9555 vos_mem_free(pMsg->bodyptr);
9556 }
9557 //WDA_VOS_ASSERT(0) ;
9558 }
9559 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009560 return status ;
9561}
9562
Jeff Johnson295189b2012-06-20 16:38:30 -07009563/*
9564 * FUNCTION: WDA_LowLevelIndCallback
9565 * IND API callback from WDI, send Ind to PE
9566 */
9567void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9568 void* pUserData )
9569{
9570 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9571#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9572 tSirRSSINotification rssiNotification;
9573#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009574 if(NULL == pWDA)
9575 {
9576 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9577 "%s:pWDA is NULL", __FUNCTION__);
9578 VOS_ASSERT(0);
9579 return ;
9580 }
9581
9582 switch(wdiLowLevelInd->wdiIndicationType)
9583 {
9584 case WDI_RSSI_NOTIFICATION_IND:
9585 {
9586 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9587 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009588#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9589 rssiNotification.bReserved =
9590 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
9591 rssiNotification.bRssiThres1NegCross =
9592 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
9593 rssiNotification.bRssiThres1PosCross =
9594 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
9595 rssiNotification.bRssiThres2NegCross =
9596 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
9597 rssiNotification.bRssiThres2PosCross =
9598 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
9599 rssiNotification.bRssiThres3NegCross =
9600 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
9601 rssiNotification.bRssiThres3PosCross =
9602 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -07009603 WLANTL_BMPSRSSIRegionChangedNotification(
9604 pWDA->pVosContext,
9605 &rssiNotification);
9606#endif
9607 break ;
9608 }
9609 case WDI_MISSED_BEACON_IND:
9610 {
9611 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9612 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009613 /* send IND to PE */
9614 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
9615 break ;
9616 }
9617 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
9618 {
9619 /* TODO: Decode Ind and send Ind to PE */
9620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9621 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
9622 break ;
9623 }
9624
9625 case WDI_MIC_FAILURE_IND:
9626 {
9627 tpSirSmeMicFailureInd pMicInd =
9628 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
9629
9630 if(NULL == pMicInd)
9631 {
9632 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9633 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9634 break;
9635 }
9636 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9637 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009638 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
9639 pMicInd->length = sizeof(tSirSmeMicFailureInd);
9640 vos_mem_copy(pMicInd->bssId,
9641 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
9642 sizeof(tSirMacAddr));
9643 vos_mem_copy(pMicInd->info.srcMacAddr,
9644 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
9645 sizeof(tSirMacAddr));
9646 vos_mem_copy(pMicInd->info.taMacAddr,
9647 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
9648 sizeof(tSirMacAddr));
9649 vos_mem_copy(pMicInd->info.dstMacAddr,
9650 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
9651 sizeof(tSirMacAddr));
9652 vos_mem_copy(pMicInd->info.rxMacAddr,
9653 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
9654 sizeof(tSirMacAddr));
9655 pMicInd->info.multicast =
9656 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
9657 pMicInd->info.keyId=
9658 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
9659 pMicInd->info.IV1=
9660 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
9661 vos_mem_copy(pMicInd->info.TSC,
9662 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009663 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
9664 (void *)pMicInd , 0) ;
9665 break ;
9666 }
9667 case WDI_FATAL_ERROR_IND:
9668 {
9669 /* TODO: Decode Ind and send Ind to PE */
9670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9671 "Received WDI_FATAL_ERROR_IND from WDI ");
9672 break ;
9673 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009674 case WDI_DEL_STA_IND:
9675 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009676 tpDeleteStaContext pDelSTACtx =
9677 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
9678
9679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9680 "Received WDI_DEL_STA_IND from WDI ");
9681 if(NULL == pDelSTACtx)
9682 {
9683 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9684 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9685 break;
9686 }
9687 vos_mem_copy(pDelSTACtx->addr2,
9688 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
9689 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009690 vos_mem_copy(pDelSTACtx->bssId,
9691 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
9692 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009693 pDelSTACtx->assocId =
9694 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
9695 pDelSTACtx->reasonCode =
9696 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
9697 pDelSTACtx->staId =
9698 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009699 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
9700 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009701 break ;
9702 }
9703 case WDI_COEX_IND:
9704 {
9705 tANI_U32 index;
9706 vos_msg_t vosMsg;
9707 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
9708 if(NULL == pSmeCoexInd)
9709 {
9710 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9711 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
9712 break;
9713 }
9714 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9715 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009716 /* Message Header */
9717 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
9718 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -07009719 /* Info from WDI Indication */
9720 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
9721 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
9722 {
9723 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
9724 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009725 /* VOS message wrapper */
9726 vosMsg.type = eWNI_SME_COEX_IND;
9727 vosMsg.bodyptr = (void *)pSmeCoexInd;
9728 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009729 /* Send message to SME */
9730 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9731 {
9732 /* free the mem and return */
9733 vos_mem_free((v_VOID_t *)pSmeCoexInd);
9734 }
9735 else
9736 {
9737 /* DEBUG */
9738 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9739 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
9740 pSmeCoexInd->coexIndType,
9741 pSmeCoexInd->coexIndData[0],
9742 pSmeCoexInd->coexIndData[1],
9743 pSmeCoexInd->coexIndData[2],
9744 pSmeCoexInd->coexIndData[3]);
9745 }
9746 break;
9747 }
9748 case WDI_TX_COMPLETE_IND:
9749 {
9750 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
9751 /* Calling TxCompleteAck Indication from wda context*/
9752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9753 "Complete Indication received from HAL");
9754 if( pWDA->pAckTxCbFunc )
9755 {
9756 if( VOS_STATUS_SUCCESS !=
9757 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9758 {
9759 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9760 "Tx Complete timeout Timer Stop Failed ");
9761 }
9762 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
9763 pWDA->pAckTxCbFunc = NULL;
9764 }
9765 else
9766 {
9767 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9768 "Tx Complete Indication is received after timeout ");
9769 }
9770 break;
9771 }
9772#ifdef WLAN_FEATURE_P2P
9773 case WDI_P2P_NOA_ATTR_IND :
9774 {
9775 tSirP2PNoaAttr *pP2pNoaAttr =
9776 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9778 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -07009779 if (NULL == pP2pNoaAttr)
9780 {
9781 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9782 "Memory allocation failure, "
9783 "WDI_P2P_NOA_ATTR_IND not forwarded");
9784 break;
9785 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009786 pP2pNoaAttr->index =
9787 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
9788 pP2pNoaAttr->oppPsFlag =
9789 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
9790 pP2pNoaAttr->ctWin =
9791 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
9792
9793 pP2pNoaAttr->uNoa1IntervalCnt =
9794 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
9795 pP2pNoaAttr->uNoa1Duration =
9796 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
9797 pP2pNoaAttr->uNoa1Interval =
9798 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
9799 pP2pNoaAttr->uNoa1StartTime =
9800 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009801 pP2pNoaAttr->uNoa2IntervalCnt =
9802 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
9803 pP2pNoaAttr->uNoa2Duration =
9804 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
9805 pP2pNoaAttr->uNoa2Interval =
9806 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
9807 pP2pNoaAttr->uNoa2StartTime =
9808 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009809 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
9810 (void *)pP2pNoaAttr , 0) ;
9811 break;
9812 }
9813#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009814#ifdef FEATURE_WLAN_SCAN_PNO
9815 case WDI_PREF_NETWORK_FOUND_IND:
9816 {
9817 vos_msg_t vosMsg;
9818 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -07009819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9820 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -07009821 if (NULL == pPrefNetworkFoundInd)
9822 {
9823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9824 "Memory allocation failure, "
9825 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
9826 break;
9827 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009828 /* Message Header */
9829 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
9830 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
9831
9832 /* Info from WDI Indication */
9833 pPrefNetworkFoundInd->ssId.length =
9834 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -07009835 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009836 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
9837 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
9838 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07009839 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -07009840 /* VOS message wrapper */
9841 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
9842 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
9843 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009844 /* Send message to SME */
9845 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9846 {
9847 /* free the mem and return */
9848 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
9849 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009850 break;
9851 }
9852#endif // FEATURE_WLAN_SCAN_PNO
9853
9854#ifdef WLAN_WAKEUP_EVENTS
9855 case WDI_WAKE_REASON_IND:
9856 {
9857 vos_msg_t vosMsg;
9858 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
9859 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
9860 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
9861
9862 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9863 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
9864 wdiLowLevelInd->wdiIndicationType,
9865 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
9866 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
9867 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
9868
9869 if (NULL == pWakeReasonInd)
9870 {
9871 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9872 "Memory allocation failure, "
9873 "WDI_WAKE_REASON_IND not forwarded");
9874 break;
9875 }
9876
9877 vos_mem_zero(pWakeReasonInd, allocSize);
9878
9879 /* Message Header */
9880 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
9881 pWakeReasonInd->mesgLen = allocSize;
9882
9883 /* Info from WDI Indication */
9884 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
9885 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
9886 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
9887 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
9888 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
9889 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
9890 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
9891 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
9892
9893 /* VOS message wrapper */
9894 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
9895 vosMsg.bodyptr = (void *) pWakeReasonInd;
9896 vosMsg.bodyval = 0;
9897
9898 /* Send message to SME */
9899 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9900 {
9901 /* free the mem and return */
9902 vos_mem_free((v_VOID_t *) pWakeReasonInd);
9903 }
9904
9905 break;
9906 }
9907#endif // WLAN_WAKEUP_EVENTS
9908
9909 case WDI_TX_PER_HIT_IND:
9910 {
9911 vos_msg_t vosMsg;
9912 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
9913 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
9914 /* VOS message wrapper */
9915 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
9916 vosMsg.bodyptr = NULL;
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 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
9922 }
9923 break;
9924 }
9925
9926 default:
9927 {
9928 /* TODO error */
9929 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9930 "Received UNKNOWN Indication from WDI ");
9931 }
9932 }
9933 return ;
9934}
9935
Jeff Johnson295189b2012-06-20 16:38:30 -07009936/*
9937 * BA related processing in WDA.
9938 */
Jeff Johnson295189b2012-06-20 16:38:30 -07009939void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
9940 void* pUserData)
9941{
9942 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9943 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07009944 if(NULL == pWdaParams)
9945 {
9946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9947 "%s: pWdaParams received NULL", __FUNCTION__);
9948 VOS_ASSERT(0) ;
9949 return ;
9950 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009951 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07009952 vos_mem_free(pWdaParams->wdaMsgParam) ;
9953 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9954 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9956 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07009957 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
9958 {
9959 tANI_U8 i = 0 ;
9960 tBaActivityInd *baActivityInd = NULL ;
9961 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
9962 tANI_U8 allocSize = sizeof(tBaActivityInd)
9963 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
9964 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
9965 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009966 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009967 if(NULL == baActivityInd)
9968 {
9969 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9970 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9971 VOS_ASSERT(0) ;
9972 return;
9973 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009974 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
9975 sizeof(tSirMacAddr)) ;
9976 baActivityInd->baCandidateCnt = baCandidateCount ;
9977
9978 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
9979 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
9980
9981 for(i = 0 ; i < baCandidateCount ; i++)
9982 {
9983 tANI_U8 tid = 0 ;
9984 wdiBaCandidate = (wdiBaCandidate + i) ;
9985 baCandidate = (baCandidate + i) ;
9986 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
9987 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009988 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
9989 {
9990 baCandidate->baInfo[tid].fBaEnable =
9991 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
9992 baCandidate->baInfo[tid].startingSeqNum =
9993 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
9994 }
9995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009996 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
9997 }
9998 else
9999 {
10000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10001 "BA Trigger RSP with Failure received ");
10002 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010003 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010004}
Jeff Johnson295189b2012-06-20 16:38:30 -070010005/*
10006 * BA Activity check timer handler
10007 */
10008void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10009{
10010 tANI_U8 curSta = 0 ;
10011 tANI_U8 tid = 0 ;
10012 tANI_U8 size = 0 ;
10013 tANI_U8 baCandidateCount = 0 ;
10014 tANI_U8 newBaCandidate = 0 ;
10015 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10016
10017 if(NULL == pWDA)
10018 {
10019 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10020 "%s:pWDA is NULL", __FUNCTION__);
10021 VOS_ASSERT(0);
10022 return ;
10023 }
10024 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10025 {
10026 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10027 "Inconsistent STA entries in WDA");
10028 VOS_ASSERT(0) ;
10029 }
10030 /* walk through all STA entries and find out TX packet count */
10031 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10032 {
10033 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10034 {
10035 tANI_U32 txPktCount = 0 ;
10036 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010037 if((WDA_VALID_STA_INDEX == validStaIndex) &&
10038 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10039 curSta, tid, &txPktCount)))
10040 {
10041#if 0
10042 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10043 "************* %d:%d, %d ",curSta, txPktCount,
10044 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10045#endif
10046 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
10047 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10048 curSta, tid)))
10049 {
10050 /* get prepare for sending message to HAL */
10051 //baCandidate[baCandidateCount].staIdx = curSta ;
10052 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10053 newBaCandidate = WDA_ENABLE_BA ;
10054 }
10055 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10056 }
10057 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010058 /* fill the entry for all the sta with given TID's */
10059 if(WDA_ENABLE_BA == newBaCandidate)
10060 {
10061 /* move to next BA candidate */
10062 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10063 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10064 baCandidateCount++ ;
10065 newBaCandidate = WDA_DISABLE_BA ;
10066 }
10067 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010068 /* prepare and send message to hal */
10069 if( 0 < baCandidateCount)
10070 {
10071 WDI_Status status = WDI_STATUS_SUCCESS ;
10072 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10073 tWDA_ReqParams *pWdaParams =
10074 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010075 if(NULL == pWdaParams)
10076 {
10077 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10078 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10079 VOS_ASSERT(0) ;
10080 return;
10081 }
10082 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10083 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10084 if(NULL == wdiTriggerBaReq)
10085 {
10086 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10087 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10088 VOS_ASSERT(0) ;
10089 vos_mem_free(pWdaParams);
10090 return;
10091 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010092 do
10093 {
10094 WDI_TriggerBAReqinfoType *triggerBaInfo =
10095 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10096 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10097 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10098 * for each request */
10099 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10100 triggerBaInfo->ucBASessionID = 0;
10101 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10102 } while(0) ;
10103 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10105 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010106 pWdaParams->pWdaContext = pWDA;
10107 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10108 pWdaParams->wdaMsgParam = NULL;
10109 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10110 WDA_TriggerBaReqCallback, pWdaParams) ;
10111 if(IS_WDI_STATUS_FAILURE(status))
10112 {
10113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10114 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10115 vos_mem_free(pWdaParams->wdaMsgParam) ;
10116 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10117 vos_mem_free(pWdaParams) ;
10118 }
10119 }
10120 else
10121 {
10122 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10123 "There is no TID for initiating BA");
10124 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010125 if( VOS_STATUS_SUCCESS !=
10126 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10127 {
10128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10129 "BA Activity Timer Stop Failed ");
10130 return ;
10131 }
10132 if( VOS_STATUS_SUCCESS !=
10133 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10134 {
10135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10136 "BA Activity Timer Start Failed ");
10137 return;
10138 }
10139 return ;
10140}
Jeff Johnson295189b2012-06-20 16:38:30 -070010141/*
10142 * WDA common routine to create timer used by WDA.
10143 */
10144static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10145{
Jeff Johnson295189b2012-06-20 16:38:30 -070010146 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10147 tANI_U32 val = 0 ;
10148 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10149
10150 if(NULL == pMac)
10151 {
10152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10153 "%s:MAC context is NULL", __FUNCTION__);
10154 VOS_ASSERT(0);
10155 return VOS_STATUS_E_FAILURE;
10156 }
10157 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10158 != eSIR_SUCCESS)
10159 {
10160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10161 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10162 return VOS_STATUS_E_FAILURE;
10163 }
10164 val = SYS_MS_TO_TICKS(val) ;
10165
10166 /* BA activity check timer */
10167 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10168 "BA Activity Check timer", WDA_TimerHandler,
10169 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10170 if(status != TX_SUCCESS)
10171 {
10172 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10173 "Unable to create BA activity timer");
10174 return eSIR_FAILURE ;
10175 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010176 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010177 /* Tx Complete Timeout timer */
10178 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10179 "Tx Complete Check timer", WDA_TimerHandler,
10180 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010181 if(status != TX_SUCCESS)
10182 {
10183 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10184 "Unable to create Tx Complete Timeout timer");
10185 /* Destroy timer of BA activity check timer */
10186 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10187 if(status != TX_SUCCESS)
10188 {
10189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10190 "Unable to Destroy BA activity timer");
10191 return eSIR_FAILURE ;
10192 }
10193 return eSIR_FAILURE ;
10194 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010195 return eSIR_SUCCESS ;
10196}
Jeff Johnson295189b2012-06-20 16:38:30 -070010197/*
10198 * WDA common routine to destroy timer used by WDA.
10199 */
10200static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10201{
10202 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010203 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10204 if(status != TX_SUCCESS)
10205 {
10206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10207 "Unable to Destroy Tx Complete Timeout timer");
10208 return eSIR_FAILURE ;
10209 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010210 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10211 if(status != TX_SUCCESS)
10212 {
10213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10214 "Unable to Destroy BA activity timer");
10215 return eSIR_FAILURE ;
10216 }
10217
10218 return eSIR_SUCCESS ;
10219}
Jeff Johnson295189b2012-06-20 16:38:30 -070010220/*
10221 * WDA timer handler.
10222 */
10223void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10224{
10225 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10226 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010227 /*
10228 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10229 */
10230 wdaMsg.type = timerInfo ;
10231 wdaMsg.bodyptr = NULL;
10232 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010233 /* post the message.. */
10234 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10235 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10236 {
10237 vosStatus = VOS_STATUS_E_BADMSG;
10238 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010239}
Jeff Johnson295189b2012-06-20 16:38:30 -070010240/*
10241 * WDA Tx Complete timeout Indication.
10242 */
10243void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10244{
10245 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010246 if( pWDA->pAckTxCbFunc )
10247 {
10248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10249 "TxComplete timer expired\n");
10250 pWDA->pAckTxCbFunc( pMac, 0);
10251 pWDA->pAckTxCbFunc = NULL;
10252 }
10253 else
10254 {
10255 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10256 "There is no request pending for TxComplete and wait timer expired\n");
10257 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010258}
Jeff Johnson295189b2012-06-20 16:38:30 -070010259/*
10260 * WDA Set REG Domain to VOS NV
10261 */
10262eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10263{
10264 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10265 {
10266 return eHAL_STATUS_INVALID_PARAMETER;
10267 }
10268 return eHAL_STATUS_SUCCESS;
10269}
10270#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10271
Jeff Johnson295189b2012-06-20 16:38:30 -070010272#ifdef FEATURE_WLAN_SCAN_PNO
10273/*
10274 * FUNCTION: WDA_PNOScanReqCallback
10275 *
10276 */
10277void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10278{
10279 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10281 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010282 if(NULL == pWdaParams)
10283 {
10284 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10285 "%s: pWdaParams received NULL", __FUNCTION__);
10286 VOS_ASSERT(0) ;
10287 return ;
10288 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010289 if( pWdaParams != NULL )
10290 {
10291 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10292 {
10293 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10294 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010295 if( pWdaParams->wdaMsgParam != NULL)
10296 {
10297 vos_mem_free(pWdaParams->wdaMsgParam);
10298 }
10299
10300 vos_mem_free(pWdaParams) ;
10301 }
10302
10303 return ;
10304}
Jeff Johnson295189b2012-06-20 16:38:30 -070010305/*
10306 * FUNCTION: WDA_UpdateScanParamsCallback
10307 *
10308 */
10309void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10310{
10311 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10313 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010314 if(NULL == pWdaParams)
10315 {
10316 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10317 "%s: pWdaParams received NULL", __FUNCTION__);
10318 VOS_ASSERT(0) ;
10319 return ;
10320 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010321 if( pWdaParams != NULL )
10322 {
10323 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10324 {
10325 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10326 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010327 if( pWdaParams->wdaMsgParam != NULL)
10328 {
10329 vos_mem_free(pWdaParams->wdaMsgParam);
10330 }
10331 vos_mem_free(pWdaParams) ;
10332 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010333 return ;
10334}
Jeff Johnson295189b2012-06-20 16:38:30 -070010335/*
10336 * FUNCTION: WDA_SetPowerParamsCallback
10337 *
10338 */
10339void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10340{
Jeff Johnsone7245742012-09-05 17:12:55 -070010341 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010342
10343 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10344 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010345 if(NULL == pWdaParams)
10346 {
10347 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10348 "%s: pWdaParams received NULL", __FUNCTION__);
10349 VOS_ASSERT(0) ;
10350 return ;
10351 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010352 if( pWdaParams != NULL )
10353 {
10354 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10355 {
10356 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10357 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010358 if( pWdaParams->wdaMsgParam != NULL)
10359 {
10360 vos_mem_free(pWdaParams->wdaMsgParam);
10361 }
10362 vos_mem_free(pWdaParams) ;
10363 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010364 return ;
10365}
Jeff Johnson295189b2012-06-20 16:38:30 -070010366/*
10367 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10368 * Request to WDI to set Preferred Network List.Offload
10369 */
10370VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10371 tSirPNOScanReq *pPNOScanReqParams)
10372{
Jeff Johnson43971f52012-07-17 12:26:56 -070010373 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010374 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10375 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10376 tWDA_ReqParams *pWdaParams ;
10377 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010378 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10379 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010380 if(NULL == pwdiPNOScanReqInfo)
10381 {
10382 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10383 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10384 VOS_ASSERT(0);
10385 return VOS_STATUS_E_NOMEM;
10386 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010387 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10388 if(NULL == pWdaParams)
10389 {
10390 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10391 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10392 VOS_ASSERT(0);
10393 vos_mem_free(pwdiPNOScanReqInfo);
10394 return VOS_STATUS_E_NOMEM;
10395 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010396 //
10397 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10398 //
10399 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10400 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010401 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10402 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10403 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010404 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10405 {
10406 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10407 &pPNOScanReqParams->aNetworks[i],
10408 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10409 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010410 /*Scan timer intervals*/
10411 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10412 &pPNOScanReqParams->scanTimers,
10413 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010414 /*Probe template for 2.4GHz band*/
10415 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10416 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10417 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010418 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10419 pPNOScanReqParams->p24GProbeTemplate,
10420 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010421 /*Probe template for 5GHz band*/
10422 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10423 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10424 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010425 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10426 pPNOScanReqParams->p5GProbeTemplate,
10427 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010428 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010429 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10430 {
10431 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10432 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10433 VOS_ASSERT(0);
10434 vos_mem_free(pwdiPNOScanReqInfo) ;
10435 vos_mem_free(pWdaParams);
10436 return VOS_STATUS_E_FAILURE;
10437 }
10438
10439 /* Store Params pass it to WDI */
10440 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10441 pWdaParams->pWdaContext = pWDA;
10442 /* Store param pointer as passed in by caller */
10443 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010444 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10445 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010446 if(IS_WDI_STATUS_FAILURE(status))
10447 {
10448 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10449 "Failure in Set PNO REQ WDI API, free all the memory " );
10450 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10451 vos_mem_free(pWdaParams->wdaMsgParam);
10452 pWdaParams->wdaWdiApiMsgParam = NULL;
10453 pWdaParams->wdaMsgParam = NULL;
10454 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010455 return CONVERT_WDI2VOS_STATUS(status) ;
10456}
Jeff Johnson295189b2012-06-20 16:38:30 -070010457/*
10458 * FUNCTION: WDA_RssiFilterCallback
10459 *
10460 */
10461void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10462{
10463 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10464
10465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10466 "<------ %s " ,__FUNCTION__);
10467
10468 VOS_ASSERT(NULL != pWdaParams);
10469
10470 vos_mem_free(pWdaParams->wdaMsgParam) ;
10471 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10472 vos_mem_free(pWdaParams) ;
10473
10474 return ;
10475}
10476/*
10477 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10478 * Request to WDI to set Preferred Network List.Offload
10479 */
10480VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10481 tSirSetRSSIFilterReq* pRssiFilterParams)
10482{
Jeff Johnson43971f52012-07-17 12:26:56 -070010483 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010484 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10485 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10486 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010487 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10488 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010489 if(NULL == pwdiSetRssiFilterReqInfo)
10490 {
10491 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10492 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10493 VOS_ASSERT(0);
10494 return VOS_STATUS_E_NOMEM;
10495 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010496 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10497 if(NULL == pWdaParams)
10498 {
10499 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10500 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10501 VOS_ASSERT(0);
10502 vos_mem_free(pwdiSetRssiFilterReqInfo);
10503 return VOS_STATUS_E_NOMEM;
10504 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010505 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10506 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010507 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10508 {
10509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10510 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10511 VOS_ASSERT(0);
10512 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
10513 vos_mem_free(pWdaParams);
10514 return VOS_STATUS_E_FAILURE;
10515 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010516 /* Store Params pass it to WDI */
10517 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10518 pWdaParams->pWdaContext = pWDA;
10519 /* Store param pointer as passed in by caller */
10520 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010521 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10522 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10523 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010524 if(IS_WDI_STATUS_FAILURE(status))
10525 {
10526 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10527 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10528 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10529 vos_mem_free(pWdaParams->wdaMsgParam);
10530 pWdaParams->wdaWdiApiMsgParam = NULL;
10531 pWdaParams->wdaMsgParam = NULL;
10532 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010533 return CONVERT_WDI2VOS_STATUS(status) ;
10534}
10535
Jeff Johnson295189b2012-06-20 16:38:30 -070010536/*
10537 * FUNCTION: WDA_ProcessUpdateScanParams
10538 * Request to WDI to update Scan Parameters
10539 */
10540VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10541 tSirUpdateScanParams *pUpdateScanParams)
10542{
Jeff Johnson43971f52012-07-17 12:26:56 -070010543 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010544 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10545 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10546 sizeof(WDI_UpdateScanParamsInfoType)) ;
10547 tWDA_ReqParams *pWdaParams ;
10548 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10550 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010551 if(NULL == wdiUpdateScanParamsInfoType)
10552 {
10553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10554 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10555 VOS_ASSERT(0);
10556 return VOS_STATUS_E_NOMEM;
10557 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010558 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10559 if ( NULL == pWdaParams )
10560 {
10561 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10562 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10563 VOS_ASSERT(0);
10564 vos_mem_free(wdiUpdateScanParamsInfoType);
10565 return VOS_STATUS_E_NOMEM;
10566 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010567 //
10568 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10569 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10571 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10572 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10573 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10574 "sir struct %d wdi struct %d",
10575 pUpdateScanParams->b11dEnabled,
10576 pUpdateScanParams->b11dResolved,
10577 pUpdateScanParams->ucChannelCount,
10578 pUpdateScanParams->usPassiveMinChTime,
10579 pUpdateScanParams->usPassiveMaxChTime,
10580 pUpdateScanParams->usActiveMinChTime,
10581 pUpdateScanParams->usActiveMaxChTime,
10582 sizeof(tSirUpdateScanParams),
10583 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10584
Jeff Johnson295189b2012-06-20 16:38:30 -070010585 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
10586 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070010587 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
10588 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070010589 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
10590 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070010591 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
10592 pUpdateScanParams->usActiveMaxChTime;
10593 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
10594 pUpdateScanParams->usActiveMinChTime;
10595 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
10596 pUpdateScanParams->usPassiveMaxChTime;
10597 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
10598 pUpdateScanParams->usPassiveMinChTime;
10599
Jeff Johnson295189b2012-06-20 16:38:30 -070010600 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
10601 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
10602 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
10603
Jeff Johnson295189b2012-06-20 16:38:30 -070010604 for ( i = 0; i <
10605 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
10606 i++)
10607 {
10608 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10609 "Update Scan Parameters channel: %d",
10610 pUpdateScanParams->aChannels[i]);
10611
10612 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
10613 pUpdateScanParams->aChannels[i];
10614 }
10615
Jeff Johnson295189b2012-06-20 16:38:30 -070010616 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010617 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10618 {
10619 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10620 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10621 VOS_ASSERT(0);
10622 vos_mem_free(pWdaParams);
10623 vos_mem_free(wdiUpdateScanParamsInfoType);
10624 return VOS_STATUS_E_FAILURE;
10625 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010626 /* Store Params pass it to WDI */
10627 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
10628 pWdaParams->pWdaContext = pWDA;
10629 /* Store param pointer as passed in by caller */
10630 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070010631
Jeff Johnson295189b2012-06-20 16:38:30 -070010632
10633
10634 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
10635 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
10636 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010637 if(IS_WDI_STATUS_FAILURE(status))
10638 {
10639 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10640 "Failure in Update Scan Params EQ WDI API, free all the memory " );
10641 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10642 vos_mem_free(pWdaParams->wdaMsgParam);
10643 vos_mem_free(pWdaParams);
10644 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010645 return CONVERT_WDI2VOS_STATUS(status) ;
10646}
10647#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070010648#ifdef WLAN_FEATURE_PACKET_FILTERING
10649/*
10650 * FUNCTION: WDA_8023MulticastListReqCallback
10651 *
10652 */
10653void WDA_8023MulticastListReqCallback(WDI_Status status, void * pUserData)
10654{
10655 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010656 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10657 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010658 if(NULL == pWdaParams)
10659 {
10660 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10661 "%s: pWdaParams received NULL", __FUNCTION__);
10662 VOS_ASSERT(0) ;
10663 return ;
10664 }
10665
10666 vos_mem_free(pWdaParams->wdaMsgParam) ;
10667 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10668 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010669 //print a msg, nothing else to do
10670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10671 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010672 return ;
10673}
Jeff Johnson295189b2012-06-20 16:38:30 -070010674/*
10675 * FUNCTION: WDA_Process8023MulticastListReq
10676 * Request to WDI to add 8023 Multicast List
10677 */
10678VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
10679 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
10680{
Jeff Johnson43971f52012-07-17 12:26:56 -070010681 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010682 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
10683 tWDA_ReqParams *pWdaParams ;
10684 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10686 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010687 pwdiFltPktSetMcListReqParamsType =
10688 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
10689 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
10690 ) ;
10691 if(NULL == pwdiFltPktSetMcListReqParamsType)
10692 {
10693 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10694 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10695 return VOS_STATUS_E_NOMEM;
10696 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010697 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10698 if(NULL == pWdaParams)
10699 {
10700 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10701 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10702 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10703 return VOS_STATUS_E_NOMEM;
10704 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010705 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10706 {
10707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10708 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
10709 __FUNCTION__);
10710 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10711 vos_mem_free(pWdaParams);
10712 return VOS_STATUS_E_FAILURE;
10713 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010714 //
10715 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
10716 //
10717 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070010718 pRcvFltMcAddrList->ulMulticastAddrCnt;
10719
10720 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
10721 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
10722 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
10723 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
10724
Jeff Johnson295189b2012-06-20 16:38:30 -070010725 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
10726 {
10727 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
10728 &(pRcvFltMcAddrList->multicastAddr[i]),
10729 sizeof(tSirMacAddr));
10730 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010731 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010732 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
10733 (NULL == pWDA->wdaWdiApiMsgParam)); */
Jeff Johnson295189b2012-06-20 16:38:30 -070010734 /* Store Params pass it to WDI */
10735 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
10736 pWdaParams->pWdaContext = pWDA;
10737 /* Store param pointer as passed in by caller */
10738 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070010739 status = WDI_8023MulticastListReq(
10740 pwdiFltPktSetMcListReqParamsType,
10741 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
10742 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010743 if(IS_WDI_STATUS_FAILURE(status))
10744 {
10745 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10746 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
10747 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10748 vos_mem_free(pWdaParams->wdaMsgParam);
10749 vos_mem_free(pWdaParams);
10750 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010751 return CONVERT_WDI2VOS_STATUS(status) ;
10752}
Jeff Johnson295189b2012-06-20 16:38:30 -070010753/*
10754 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
10755 *
10756 */
10757void WDA_ReceiveFilterSetFilterReqCallback(WDI_Status status, void * pUserData)
10758{
10759 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10761 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010762 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070010763 if(NULL == pWdaParams)
10764 {
10765 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10766 "%s: pWdaParams received NULL", __FUNCTION__);
10767 VOS_ASSERT(0) ;
10768 return ;
10769 }
10770
10771 vos_mem_free(pWdaParams->wdaMsgParam) ;
10772 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10773 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010774 //print a msg, nothing else to do
10775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10776 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010777 return ;
10778}
Jeff Johnson295189b2012-06-20 16:38:30 -070010779/*
10780 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
10781 * Request to WDI to set Receive Filters
10782 */
10783VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
10784 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
10785{
Jeff Johnson43971f52012-07-17 12:26:56 -070010786 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010787 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
10788 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
10789 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
10790 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
10791 tWDA_ReqParams *pWdaParams ;
10792 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010793 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10794 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010795 if(NULL == pwdiSetRcvPktFilterReqParamsType)
10796 {
10797 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10798 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10799 VOS_ASSERT(0);
10800 return VOS_STATUS_E_NOMEM;
10801 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010802 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10803 if(NULL == pWdaParams)
10804 {
10805 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10806 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10807 VOS_ASSERT(0);
10808 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
10809 return VOS_STATUS_E_NOMEM;
10810 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010811 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
10812 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
10813 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
10814 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070010815 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
10816 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
10817
10818 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
10819 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010820
10821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10822 "FID %d FT %d NParams %d CT %d",
10823 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
10824 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
10825 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
10826 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070010827 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
10828 {
10829 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
10830 &pRcvPktFilterCfg->paramsData[i],
10831 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070010832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10833 "Proto %d Comp Flag %d \n",
10834 pwdiSetRcvPktFilterReqParamsType->
10835 wdiPktFilterCfg.paramsData[i].protocolLayer,
10836 pwdiSetRcvPktFilterReqParamsType->
10837 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070010838 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10839 "Data Offset %d Data Len %d\n",
10840 pwdiSetRcvPktFilterReqParamsType->
10841 wdiPktFilterCfg.paramsData[i].dataOffset,
10842 pwdiSetRcvPktFilterReqParamsType->
10843 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070010844 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10845 "CData: %d:%d:%d:%d:%d:%d\n",
10846 pwdiSetRcvPktFilterReqParamsType->
10847 wdiPktFilterCfg.paramsData[i].compareData[0],
10848 pwdiSetRcvPktFilterReqParamsType->
10849 wdiPktFilterCfg.paramsData[i].compareData[1],
10850 pwdiSetRcvPktFilterReqParamsType->
10851 wdiPktFilterCfg.paramsData[i].compareData[2],
10852 pwdiSetRcvPktFilterReqParamsType->
10853 wdiPktFilterCfg.paramsData[i].compareData[3],
10854 pwdiSetRcvPktFilterReqParamsType->
10855 wdiPktFilterCfg.paramsData[i].compareData[4],
10856 pwdiSetRcvPktFilterReqParamsType->
10857 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070010858 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10859 "MData: %d:%d:%d:%d:%d:%d\n",
10860 pwdiSetRcvPktFilterReqParamsType->
10861 wdiPktFilterCfg.paramsData[i].dataMask[0],
10862 pwdiSetRcvPktFilterReqParamsType->
10863 wdiPktFilterCfg.paramsData[i].dataMask[1],
10864 pwdiSetRcvPktFilterReqParamsType->
10865 wdiPktFilterCfg.paramsData[i].dataMask[2],
10866 pwdiSetRcvPktFilterReqParamsType->
10867 wdiPktFilterCfg.paramsData[i].dataMask[3],
10868 pwdiSetRcvPktFilterReqParamsType->
10869 wdiPktFilterCfg.paramsData[i].dataMask[4],
10870 pwdiSetRcvPktFilterReqParamsType->
10871 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070010872 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010873 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010874 /* Store Params pass it to WDI */
10875 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
10876 pWdaParams->pWdaContext = pWDA;
10877 /* Store param pointer as passed in by caller */
10878 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070010879 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
10880 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
10881 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010882 if(IS_WDI_STATUS_FAILURE(status))
10883 {
10884 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10885 "Failure in SetFilter(),free all the memory,status %d ",status);
10886 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10887 vos_mem_free(pWdaParams->wdaMsgParam);
10888 vos_mem_free(pWdaParams);
10889 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010890 return CONVERT_WDI2VOS_STATUS(status) ;
10891}
Jeff Johnson295189b2012-06-20 16:38:30 -070010892/*
10893 * FUNCTION: WDA_FilterMatchCountReqCallback
10894 *
10895 */
10896void WDA_FilterMatchCountReqCallback(WDI_Status status, void * pUserData)
10897{
10898 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10899 tWDA_CbContext *pWDA;
10900 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
10901 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
10902 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
10903 tANI_U8 i;
10904 vos_msg_t vosMsg;
10905
10906 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10907 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010908 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
10909
Jeff Johnsone7245742012-09-05 17:12:55 -070010910 if(NULL == pRcvFltPktMatchCntRsp)
10911 {
10912 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10913 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
10914 VOS_ASSERT(0) ;
10915 vos_mem_free(pWdaParams);
10916 return ;
10917 }
10918
Jeff Johnson295189b2012-06-20 16:38:30 -070010919 if(NULL == pWdaParams)
10920 {
10921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10922 "%s: pWdaParams received NULL", __FUNCTION__);
10923 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -070010924 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070010925 return ;
10926 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010927 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
10928 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070010929 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
10930 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
10931
10932 /* Message Header */
10933 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
10934 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
10935
10936 pRcvFltPktMatchCntRsp->status = pRcvFltPktMatchCntReq->status;
10937
10938 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
10939 {
10940 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
10941 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
10942 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010943 /* VOS message wrapper */
10944 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
10945 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
10946 vosMsg.bodyval = 0;
10947 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10948 {
10949 /* free the mem and return */
10950 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
10951 }
10952
10953 vos_mem_free(pWdaParams->wdaMsgParam) ;
10954 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10955 vos_mem_free(pWdaParams) ;
10956}
Jeff Johnson295189b2012-06-20 16:38:30 -070010957/*
10958 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
10959 * Request to WDI to get PC Filter Match Count
10960 */
10961VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
10962{
Jeff Johnson43971f52012-07-17 12:26:56 -070010963 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010964 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
10965 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
10966 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10968 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010969 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
10970 {
10971 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10972 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10973 VOS_ASSERT(0);
10974 return VOS_STATUS_E_NOMEM;
10975 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010976 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10977 if(NULL == pWdaParams)
10978 {
10979 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10980 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10981 VOS_ASSERT(0);
10982 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
10983 return VOS_STATUS_E_NOMEM;
10984 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010985 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10986 {
10987 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10988 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10989 VOS_ASSERT(0);
10990 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
10991 vos_mem_free(pWdaParams);
10992 return VOS_STATUS_E_FAILURE;
10993 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010994 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
10995
Jeff Johnson295189b2012-06-20 16:38:30 -070010996 /* Store Params pass it to WDI */
10997 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
10998 pWdaParams->pWdaContext = pWDA;
10999 /* Store param pointer as passed in by caller */
11000 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011001 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11002 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11003 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011004 if(IS_WDI_STATUS_FAILURE(status))
11005 {
11006 /* failure returned by WDI API */
11007 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11008 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11009 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11010 vos_mem_free(pWdaParams) ;
11011 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11012 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11013 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011014 return CONVERT_WDI2VOS_STATUS(status) ;
11015}
Jeff Johnson295189b2012-06-20 16:38:30 -070011016/*
11017 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11018 *
11019 */
11020void WDA_ReceiveFilterClearFilterReqCallback(WDI_Status status, void * pUserData)
11021{
11022 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011023 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11024 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011025/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11026 if(NULL == pWdaParams)
11027 {
11028 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11029 "%s: pWdaParams received NULL", __FUNCTION__);
11030 VOS_ASSERT(0) ;
11031 return ;
11032 }
11033
11034 vos_mem_free(pWdaParams->wdaMsgParam) ;
11035 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11036 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011037 //print a msg, nothing else to do
11038 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11039 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011040 return ;
11041}
Jeff Johnson295189b2012-06-20 16:38:30 -070011042/*
11043 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11044 * Request to WDI to clear Receive Filters
11045 */
11046VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11047 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11048{
Jeff Johnson43971f52012-07-17 12:26:56 -070011049 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011050 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11051 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11052 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011053 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11054 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011055 if(NULL == pwdiRcvFltPktClearReqParamsType)
11056 {
11057 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11058 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11059 VOS_ASSERT(0);
11060 return VOS_STATUS_E_NOMEM;
11061 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011062 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11063 if(NULL == pWdaParams)
11064 {
11065 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11066 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11067 VOS_ASSERT(0);
11068 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11069 return VOS_STATUS_E_NOMEM;
11070 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011071 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11072 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011073 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11074 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11075 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11076 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011077
11078 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011079 /* Store Params pass it to WDI */
11080 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11081 pWdaParams->pWdaContext = pWDA;
11082 /* Store param pointer as passed in by caller */
11083 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011084 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11085 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11086 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011087 if(IS_WDI_STATUS_FAILURE(status))
11088 {
11089 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11090 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11091 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11092 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011093 return CONVERT_WDI2VOS_STATUS(status) ;
11094}
11095#endif // WLAN_FEATURE_PACKET_FILTERING
11096
Jeff Johnson295189b2012-06-20 16:38:30 -070011097/*
11098 * FUNCTION: WDA_ProcessSetPowerParamsReq
11099 * Request to WDI to set power params
11100 */
11101VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11102 tSirSetPowerParamsReq *pPowerParams)
11103{
Jeff Johnson43971f52012-07-17 12:26:56 -070011104 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011105 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11106 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011107 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11109 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011110 if(NULL == pwdiSetPowerParamsReqInfo)
11111 {
11112 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11113 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11114 VOS_ASSERT(0);
11115 return VOS_STATUS_E_NOMEM;
11116 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011117 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11118 if(NULL == pWdaParams)
11119 {
11120 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11121 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11122 VOS_ASSERT(0);
11123 vos_mem_free(pwdiSetPowerParamsReqInfo);
11124 return VOS_STATUS_E_NOMEM;
11125 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011126
Jeff Johnson295189b2012-06-20 16:38:30 -070011127
11128 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11129 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011130 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11131 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011132 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11133 pPowerParams->uListenInterval;
11134 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11135 pPowerParams->uBcastMcastFilter;
11136 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11137 pPowerParams->uEnableBET;
11138 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11139 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011140 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011141 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11142 {
11143 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11144 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11145 VOS_ASSERT(0);
11146 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
11147 vos_mem_free(pWdaParams);
11148 return VOS_STATUS_E_FAILURE;
11149 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011150 /* Store Params pass it to WDI */
11151 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11152 pWdaParams->pWdaContext = pWDA;
11153 /* Store param pointer as passed in by caller */
11154 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011155 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11156 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11157 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011158 if(IS_WDI_STATUS_FAILURE(status))
11159 {
11160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11161 "Failure in Set power params REQ WDI API, free all the memory " );
11162 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11163 vos_mem_free(pWdaParams->wdaMsgParam);
11164 pWdaParams->wdaWdiApiMsgParam = NULL;
11165 pWdaParams->wdaMsgParam = NULL;
11166 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011167 return CONVERT_WDI2VOS_STATUS(status) ;
11168}
11169
11170/*
11171 * FUNCTION: WDA_SetTmLevelRspCallback
11172 * Set TM Level response
11173 */
11174void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11175{
11176 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11177
11178 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11179 "<------ %s " ,__FUNCTION__);
11180
11181 if(NULL == pWdaParams)
11182 {
11183 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11184 "%s: pWdaParams received NULL", __FUNCTION__);
11185 VOS_ASSERT(0) ;
11186 return ;
11187 }
11188
11189 /* Dose not need to send notification to upper layer
11190 * Just free allocated resources */
11191 if( pWdaParams != NULL )
11192 {
11193 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11194 {
11195 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11196 }
11197 vos_mem_free(pWdaParams->wdaMsgParam) ;
11198 vos_mem_free(pWdaParams) ;
11199 }
11200}
11201
11202/*
11203 * FUNCTION: WDA_ProcessSetTmLevelReq
11204 * Set TM Level request
11205 */
11206VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11207 tAniSetTmLevelReq *setTmLevelReq)
11208{
11209 WDI_Status status = WDI_STATUS_SUCCESS ;
11210 tWDA_ReqParams *pWdaParams ;
11211 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11212 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11213 sizeof(WDI_SetTmLevelReqType)) ;
11214 if(NULL == wdiSetTmLevelReq)
11215 {
11216 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11217 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11218 VOS_ASSERT(0);
11219 return VOS_STATUS_E_NOMEM;
11220 }
11221
11222 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11223 if(NULL == pWdaParams)
11224 {
11225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11226 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11227 VOS_ASSERT(0);
11228 vos_mem_free(wdiSetTmLevelReq);
11229 return VOS_STATUS_E_NOMEM;
11230 }
11231
11232 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11233 "------> %s " ,__FUNCTION__);
11234
11235 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11236 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11237
11238 pWdaParams->pWdaContext = pWDA;
11239 pWdaParams->wdaMsgParam = setTmLevelReq;
11240 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11241
11242 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11243 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11244
11245 if(IS_WDI_STATUS_FAILURE(status))
11246 {
11247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11248 "Failure set thernal mitigation level free all the memory " );
11249 vos_mem_free(pWdaParams->wdaMsgParam) ;
11250 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11251 vos_mem_free(pWdaParams) ;
11252 }
11253
11254 return CONVERT_WDI2VOS_STATUS(status) ;
11255}
11256
11257VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11258 tpTxControlParams pTxCtrlParam)
11259{
11260 VOS_STATUS wdaStatus;
11261
11262 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11263 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011264 if( pTxCtrlParam == NULL )
11265 {
11266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11267 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11268 return VOS_STATUS_E_FAILURE;
11269 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011270 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11271 {
11272 wdaStatus = WDA_SuspendDataTx(pWDA);
11273 }
11274 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11275 {
11276 wdaStatus = WDA_ResumeDataTx(pWDA);
11277 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011278 return wdaStatus;
11279}
11280
11281 /* FUNCTION WDA_featureCapsExchange
11282 * WDA API to invoke capability exchange between host and FW.
11283 */
11284void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11285{
11286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11287 "%s:enter", __FUNCTION__ );
11288 WDI_featureCapsExchangeReq( NULL, pVosContext);
11289}
11290
11291 /* FUNCTION WDA_getHostWlanFeatCaps
11292 * Wrapper for WDI API, that will return if the feature (enum value).passed
11293 * to this API is supported or not in Host
11294 * return value
11295 * 0 - implies feature is NOT Supported
11296 * any non zero value - implies feature is SUPPORTED
11297 */
11298tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11299{
11300 return WDI_getHostWlanFeatCaps(featEnumValue);
11301}
11302
11303 /* FUNCTION WDA_getFwWlanFeatCaps
11304 * Wrapper for WDI API, that will return if the feature (enum value).passed
11305 * to this API is supported or not in FW
11306 * return value
11307 * 0 - implies feature is NOT Supported
11308 * any non zero value - implies feature is SUPPORTED
11309 */
11310tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11311{
11312 return WDI_getFwWlanFeatCaps(featEnumValue);
11313}
11314
11315/*
11316 * FUNCTION: WDA_shutdown
11317 * Shutdown WDA/WDI without handshaking with Riva.
11318 * Synchronous function.
11319 */
11320VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11321{
11322 WDI_Status wdiStatus;
11323 //tANI_U8 eventIdx = 0;
11324 VOS_STATUS status = VOS_STATUS_SUCCESS;
11325 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011326 if (NULL == pWDA)
11327 {
11328 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11329 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11330 VOS_ASSERT(0);
11331 return VOS_STATUS_E_FAILURE;
11332 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011333 /* FTM mode stay START_STATE */
11334 if( (WDA_READY_STATE != pWDA->wdaState) &&
11335 (WDA_INIT_STATE != pWDA->wdaState) &&
11336 (WDA_START_STATE != pWDA->wdaState) )
11337 {
11338 VOS_ASSERT(0);
11339 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011340 if(NULL != pWDA->wdaWdiApiMsgParam)
11341 {
11342 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11343 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11344 VOS_ASSERT(0);
11345 /* the last request was not freed, probably a SSR
11346 * initiated by WLAN driver (WDI timeout) */
11347 vos_mem_free(pWDA->wdaWdiApiMsgParam);
11348 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011349 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11350 {
11351 wdaDestroyTimers(pWDA);
11352 }
11353 pWDA->wdaWdiApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011354 /* call WDI shutdown */
11355 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011356 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11357 {
11358 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11359 "error in WDA Stop" );
11360 status = VOS_STATUS_E_FAILURE;
11361 }
11362 /* WDI stop is synchrnous, shutdown is complete when it returns */
11363 pWDA->wdaState = WDA_STOP_STATE;
11364
Jeff Johnson295189b2012-06-20 16:38:30 -070011365 /* shutdown should perform the stop & close actions. */
11366 /* Destroy the event */
11367 status = vos_event_destroy(&pWDA->txFrameEvent);
11368 if(!VOS_IS_STATUS_SUCCESS(status))
11369 {
11370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11371 "VOS Event destroy failed - status = %d\n", status);
11372 status = VOS_STATUS_E_FAILURE;
11373 }
11374 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11375 if(!VOS_IS_STATUS_SUCCESS(status))
11376 {
11377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11378 "VOS Event destroy failed - status = %d\n", status);
11379 status = VOS_STATUS_E_FAILURE;
11380 }
11381 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11382 if(!VOS_IS_STATUS_SUCCESS(status))
11383 {
11384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11385 "VOS Event destroy failed - status = %d\n", status);
11386 status = VOS_STATUS_E_FAILURE;
11387 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011388 /* free WDA context */
11389 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11390 if ( !VOS_IS_STATUS_SUCCESS(status) )
11391 {
11392 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11393 "error in WDA close " );
11394 status = VOS_STATUS_E_FAILURE;
11395 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011396 return status;
11397}
Jeff Johnsone7245742012-09-05 17:12:55 -070011398/*
11399 * FUNCTION: WDA_stopFailed
11400 * WDA stop failed
11401 */
11402
11403void WDA_stopFailed(v_PVOID_t pVosContext)
11404{
11405 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11406 pWDA->needShutdown = TRUE;
11407}
11408/*
11409 * FUNCTION: WDA_needShutdown
11410 * WDA needs a shutdown
11411 */
11412
11413v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11414{
11415 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11416 return pWDA->needShutdown;
11417}
11418
Mohit Khanna4a70d262012-09-11 16:30:12 -070011419#ifdef WLAN_FEATURE_11AC
11420/*
11421 * FUNCTION: WDA_SetBeaconFilterReqCallback
11422 *
11423 */
11424void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11425{
11426 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11428 "<------ %s " ,__FUNCTION__);
11429 if(NULL == pWdaParams)
11430 {
11431 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11432 "%s: pWdaParams received NULL", __FUNCTION__);
11433 VOS_ASSERT(0) ;
11434 return ;
11435 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011436
Mohit Khanna4a70d262012-09-11 16:30:12 -070011437 vos_mem_free(pWdaParams->wdaMsgParam) ;
11438 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11439 vos_mem_free(pWdaParams) ;
11440 /*
11441 * No respone required for SetBeaconFilter req so just free the request
11442 * param here
11443 */
11444
11445 return ;
11446}
11447
11448VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11449 tUpdateVHTOpMode *pData)
11450{
11451 WDI_Status status = WDI_STATUS_SUCCESS ;
11452 tWDA_ReqParams *pWdaParams ;
11453 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11454 sizeof(WDI_UpdateVHTOpMode)) ;
11455 if(NULL == wdiTemp)
11456 {
11457 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11458 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11459 VOS_ASSERT(0);
11460 return VOS_STATUS_E_NOMEM;
11461 }
11462 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11463 if(NULL == pWdaParams)
11464 {
11465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11466 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11467 VOS_ASSERT(0);
11468 vos_mem_free(wdiTemp);
11469 return VOS_STATUS_E_NOMEM;
11470 }
11471
11472 wdiTemp->opMode = pData->opMode;
11473 wdiTemp->staId = pData->staId;
11474
11475 pWdaParams->pWdaContext = pWDA;
11476 /* Store Req pointer, as this will be used for response */
11477 pWdaParams->wdaMsgParam = (void *)pData;
11478 /* store Params pass it to WDI */
11479 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11480
11481 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11482
11483 if(IS_WDI_STATUS_FAILURE(status))
11484 {
11485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11486 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11487 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11488 vos_mem_free(pWdaParams->wdaMsgParam);
11489 vos_mem_free(pWdaParams);
11490 }
11491 return CONVERT_WDI2VOS_STATUS(status) ;
11492}
11493#endif