blob: 16e36d7c452eeb54b7a8bb0d3f54e9761474bac6 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070023 W L A N _ Q C T _ WDA . C
Jeff Johnson295189b2012-06-20 16:38:30 -070024 OVERVIEW:
Jeff Johnson295189b2012-06-20 16:38:30 -070025 This software unit holds the implementation of the WLAN Transport Layer.
Jeff Johnson295189b2012-06-20 16:38:30 -070026 The functions externalized by this module are to be called ONLY by other
27 WLAN modules that properly register with the Transport Layer initially.
Jeff Johnson295189b2012-06-20 16:38:30 -070028 DEPENDENCIES:
Jeff Johnson295189b2012-06-20 16:38:30 -070029 Are listed for each API below.
30
Jeff Johnson295189b2012-06-20 16:38:30 -070031 Copyright (c) 2010-2011 QUALCOMM Incorporated.
32 All Rights Reserved.
33 Qualcomm Confidential and Proprietary
34===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070035/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070036 EDIT HISTORY FOR FILE
37
Jeff Johnson295189b2012-06-20 16:38:30 -070038 This section contains comments describing changes made to the module.
39 Notice that changes are listed in reverse chronological order.
40
Jeff Johnson295189b2012-06-20 16:38:30 -070041 $Header$$DateTime$$Author$
42
Jeff Johnson295189b2012-06-20 16:38:30 -070043 when who what, where, why
44---------- --- -------------------------------------------------
4510/05/2011 haparna Adding support for Keep Alive Feature
462010-12-30 smiryala UMAC convergence changes
472010-08-19 adwivedi WLAN DAL AL(WDA) layer for Prima
48===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070049#if defined( FEATURE_WLAN_INTEGRATED_SOC )
Jeff Johnson295189b2012-06-20 16:38:30 -070050#include "vos_mq.h"
51#include "vos_api.h"
52#include "vos_packet.h"
53#include "vos_nvitem.h"
54#include "sirApi.h"
55#include "wlan_qct_pal_packet.h"
56#include "wlan_qct_wda.h"
57#include "wlan_qct_wda_msg.h"
58#include "wlan_qct_wdi_cfg.h"
59#include "wlan_qct_wdi.h"
60#include "wlan_qct_wdi_ds.h"
61#include "wlan_hal_cfg.h"
62/**********************/
63#include "wniApi.h"
64#include "cfgApi.h"
65#include "limApi.h"
66#include "wlan_qct_tl.h"
67#include "wlan_qct_tli_ba.h"
68#include "limUtils.h"
69#include "btcApi.h"
70#include "vos_sched.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070071#ifdef ANI_MANF_DIAG
72#include "pttMsgApi.h"
73#include "wlan_qct_sys.h"
74#endif /* ANI_MANF_DIAG */
Jeff Johnson295189b2012-06-20 16:38:30 -070075/* Used MACRO's */
76/* Get WDA context from vOSS module */
77#define VOS_GET_WDA_CTXT(a) vos_get_context(VOS_MODULE_ID_WDA, a)
78#define VOS_GET_MAC_CTXT(a) vos_get_context(VOS_MODULE_ID_PE, a)
79#define OFFSET_OF(structType,fldName) (&((structType*)0)->fldName)
80#define WDA_BA_TX_FRM_THRESHOLD (5)
Jeff Johnson295189b2012-06-20 16:38:30 -070081#define CONVERT_WDI2SIR_STATUS(x) \
82 ((WDI_STATUS_SUCCESS != (x)) ? eSIR_FAILURE : eSIR_SUCCESS)
83
84#define IS_WDI_STATUS_FAILURE(status) \
85 ((WDI_STATUS_SUCCESS != (status)) && (WDI_STATUS_PENDING != (status)))
Jeff Johnson295189b2012-06-20 16:38:30 -070086#define CONVERT_WDI2VOS_STATUS(x) \
87 ((IS_WDI_STATUS_FAILURE(x)) ? VOS_STATUS_E_FAILURE : VOS_STATUS_SUCCESS)
88
89/* macro's for acessing TL API/data structures */
Jeff Johnson295189b2012-06-20 16:38:30 -070090#define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d)
Jeff Johnson295189b2012-06-20 16:38:30 -070091#define WDA_GET_BA_TXFLAG(a, b, c) \
92 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c)))
93
94#define WDA_SET_BA_TXFLAG(a, b, c) \
95 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) |= (1 << (c)))
96
97#define WDA_CLEAR_BA_TXFLAG(a, b, c) \
98 (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c))
Jeff Johnson295189b2012-06-20 16:38:30 -070099#define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \
100 WLANTL_BaSessionAdd(a, b, c, d, e, f, g)
Jeff Johnson295189b2012-06-20 16:38:30 -0700101/* timer related Macros */
102#define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \
103 tx_timer_create(a, b, c, d, e, f, g)
104#define WDA_START_TIMER(a) tx_timer_activate(a)
105#define WDA_STOP_TIMER(a) tx_timer_deactivate(a)
106#define WDA_DESTROY_TIMER(a) tx_timer_delete(a)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700107#define WDA_WDI_START_TIMEOUT (WDI_RESPONSE_TIMEOUT + 5000)
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
109#define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \
110 ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD)
Jeff Johnson295189b2012-06-20 16:38:30 -0700111#define WDA_BA_MAX_WINSIZE (64)
Jeff Johnson295189b2012-06-20 16:38:30 -0700112#define WDA_INVALID_KEY_INDEX 0xFF
Jeff Johnson295189b2012-06-20 16:38:30 -0700113#define WDA_NUM_PWR_SAVE_CFG 11
Jeff Johnson295189b2012-06-20 16:38:30 -0700114#define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000
115
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700116#define WDA_MAX_RETRIES_TILL_RING_EMPTY 1000 /* MAX 10000 msec = 10 seconds wait */
Jeff Johnson295189b2012-06-20 16:38:30 -0700117
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700118#define WDA_WAIT_MSEC_TILL_RING_EMPTY 10 /* 10 msec wait per cycle */
Jeff Johnson295189b2012-06-20 16:38:30 -0700119/* extern declarations */
120extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -0700121/* forward declarations */
122void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
123 void *pBodyptr, tANI_U32 bodyVal) ;
124VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
125 WDI_StartReqParamsType *wdiStartParams ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700126VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ;
127VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams);
128
129extern v_BOOL_t sys_validateStaConfig( void *pImage, unsigned long cbFile,
130 void **ppStaConfig, v_SIZE_t *pcbStaConfig ) ;
131void processCfgDownloadReq(tpAniSirGlobal pMac, tANI_U16 length,
132 tANI_U32 *pConfig) ;
133void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
134 WDI_ConfigBSSReqInfoType *wdiBssParams, tAddBssParams *wdaBssParams) ;
135void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
136 WDI_ConfigStaReqInfoType *wdiStaParams, tAddStaParams *wdaStaParams) ;
137void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
138 void* pUserData ) ;
139static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) ;
140static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA);
141void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ;
142void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData);
Jeff Johnson295189b2012-06-20 16:38:30 -0700143#ifdef WLAN_FEATURE_VOWIFI_11R
144VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams);
145#endif /* WLAN_FEATURE_VOWIFI_11R */
146
Jeff Johnson295189b2012-06-20 16:38:30 -0700147void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ;
148void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ;
149VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -0700150#ifdef FEATURE_WLAN_SCAN_PNO
151static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams);
152static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams);
153static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams);
154#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -0700155#ifdef WLAN_FEATURE_PACKET_FILTERING
156static VOS_STATUS WDA_Process8023MulticastListReq (
157 tWDA_CbContext *pWDA,
158 tSirRcvFltMcAddrList *pRcvFltMcAddrLis
159 );
160static VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (
161 tWDA_CbContext *pWDA,
162 tSirRcvPktFilterCfgType *pRcvPktFilterCfg
163 );
164static VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (
165 tWDA_CbContext *pWDA,
166 tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp
167 );
168static VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (
169 tWDA_CbContext *pWDA,
170 tSirRcvFltPktClearParam *pRcvFltPktClearParam
171 );
172#endif // WLAN_FEATURE_PACKET_FILTERING
Jeff Johnson295189b2012-06-20 16:38:30 -0700173VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700174static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
175 tpTxControlParams pTxCtrlParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700176VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
177 v_U8_t *pDefaultKeyId,
178 v_U8_t *pNumKeys,
179 WDI_KeysType *pWdiKeys );
180
181#ifdef WLAN_FEATURE_GTK_OFFLOAD
182static VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, tpSirGtkOffloadParams pGtkOffloadParams);
183static VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp);
184#endif // WLAN_FEATURE_GTK_OFFLOAD
185
186VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
187 tAniSetTmLevelReq *setTmLevelReq);
Mohit Khanna4a70d262012-09-11 16:30:12 -0700188#ifdef WLAN_FEATURE_11AC
189VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
190 tUpdateVHTOpMode *pData);
191#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700192/*
193 * FUNCTION: WDA_open
194 * Allocate the WDA context
195 */
196VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext,
197 tMacOpenParameters *pMacParams )
198{
199 tWDA_CbContext *wdaContext;
200 VOS_STATUS status;
201 WDI_DeviceCapabilityType wdiDevCapability = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700202 /* Allocate WDA context */
203 status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA,
204 (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ;
205 if(!VOS_IS_STATUS_SUCCESS(status))
206 {
207 return VOS_STATUS_E_NOMEM;
208 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700209 /*__asm int 3;*/
210 vos_mem_zero(wdaContext,sizeof(tWDA_CbContext));
211
212 /* Initialize data structures */
213 wdaContext->pVosContext = pVosContext;
214 wdaContext->wdaState = WDA_INIT_STATE;
215 wdaContext->uTxFlowMask = WDA_TXFLOWMASK;
216
217 /* Initialize WDA-WDI synchronization event */
218 status = vos_event_init(&wdaContext->wdaWdiEvent);
219 if(!VOS_IS_STATUS_SUCCESS(status))
220 {
221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
222 "WDI Sync Event init failed - status = %d\n", status);
223 status = VOS_STATUS_E_FAILURE;
224 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700225 /* Init Frame transfer event */
226 status = vos_event_init(&wdaContext->txFrameEvent);
227 if(!VOS_IS_STATUS_SUCCESS(status))
228 {
229 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
230 "VOS Mgmt Frame Event init failed - status = %d\n", status);
231 status = VOS_STATUS_E_FAILURE;
232 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700233 status = vos_event_init(&wdaContext->suspendDataTxEvent);
234 if(!VOS_IS_STATUS_SUCCESS(status))
235 {
236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
237 "VOS suspend data tx Event init failed - status = %d\n", status);
238 status = VOS_STATUS_E_FAILURE;
239 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700240 status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack);
241 if(!VOS_IS_STATUS_SUCCESS(status))
242 {
243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
244 "VOS wait On Wdi Ind Event init failed - status = %d\n", status);
245 status = VOS_STATUS_E_FAILURE;
246 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700247 vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR);
Jeff Johnson295189b2012-06-20 16:38:30 -0700248 wdaContext->driverMode = pMacParams->driverType;
249 if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext,
250 &wdiDevCapability, pMacParams->driverType))
251 {
252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
253 "WDI Init failed" );
254 status = VOS_STATUS_E_FAILURE;
255 }
256 else
257 {
258 pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ;
259 pMacParams->maxBssId = wdiDevCapability.ucMaxBSSSupported;
260 pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -0700261 /* update max STA in WDA used for BA */
262 wdaContext->wdaMaxSta = pMacParams->maxStation;
263 /* store the frameTransRequired flag in wdaContext, to send this to HAL
264 * in WDA_Start
265 */
266 wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
267 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700268 return status;
269}
270
Jeff Johnson295189b2012-06-20 16:38:30 -0700271/*
272 * FUNCTION: WDA_preStart
273 * Trigger DAL-AL to start CFG download
274 */
275VOS_STATUS WDA_preStart(v_PVOID_t pVosContext)
276{
277 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
278 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700279 /*
280 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
281 */
282 wdaMsg.type = WNI_CFG_DNLD_REQ ;
283 wdaMsg.bodyptr = NULL;
284 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 /* post the message.. */
286 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
287 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
288 {
289 vosStatus = VOS_STATUS_E_BADMSG;
290 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700291 return( vosStatus );
292}
Jeff Johnson295189b2012-06-20 16:38:30 -0700293/*
294 * FUNCTION: WDA_wdiStartCallback
295 * Once WDI_Start is finished, WDI start callback will be called by WDI
296 * to indicate completion of WDI_Start.
297 */
298void WDA_wdiStartCallback(WDI_StartRspParamsType *wdiRspParams,
299 void *pVosContext)
300{
301 tWDA_CbContext *wdaContext;
302 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700303 if (NULL == pVosContext)
304 {
305 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
306 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
307 return;
308 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700309 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
310 if (NULL == wdaContext)
311 {
312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
313 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
314 return;
315 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700316 if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus)
317 {
318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
319 "%s: WDI_Start() failure reported", __FUNCTION__ );
320 }
321 else
322 {
323 wdaContext->wdaState = WDA_START_STATE;
324 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700325 /* extract and save version information from the Start Response */
326 wdaContext->wcnssWlanCompiledVersion.major =
327 wdiRspParams->wlanCompiledVersion.major;
328 wdaContext->wcnssWlanCompiledVersion.minor =
329 wdiRspParams->wlanCompiledVersion.minor;
330 wdaContext->wcnssWlanCompiledVersion.version =
331 wdiRspParams->wlanCompiledVersion.version;
332 wdaContext->wcnssWlanCompiledVersion.revision =
333 wdiRspParams->wlanCompiledVersion.revision;
334 wdaContext->wcnssWlanReportedVersion.major =
335 wdiRspParams->wlanReportedVersion.major;
336 wdaContext->wcnssWlanReportedVersion.minor =
337 wdiRspParams->wlanReportedVersion.minor;
338 wdaContext->wcnssWlanReportedVersion.version =
339 wdiRspParams->wlanReportedVersion.version;
340 wdaContext->wcnssWlanReportedVersion.revision =
341 wdiRspParams->wlanReportedVersion.revision;
342 wpalMemoryCopy(wdaContext->wcnssSoftwareVersionString,
343 wdiRspParams->wcnssSoftwareVersion,
344 sizeof(wdaContext->wcnssSoftwareVersionString));
345 wpalMemoryCopy(wdaContext->wcnssHardwareVersionString,
346 wdiRspParams->wcnssHardwareVersion,
347 sizeof(wdaContext->wcnssHardwareVersionString));
Jeff Johnson295189b2012-06-20 16:38:30 -0700348 /* Notify WDA_start that WDI_Start has completed */
349 status = vos_event_set(&wdaContext->wdaWdiEvent);
Jeff Johnson43971f52012-07-17 12:26:56 -0700350 if (VOS_STATUS_SUCCESS != status)
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 {
352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
353 "%s: Unable to unblock WDA_start", __FUNCTION__ );
354 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700355 return;
356}
357
Jeff Johnson295189b2012-06-20 16:38:30 -0700358/*
359 * FUNCTION: WDA_start
360 * Prepare TLV configuration and call WDI_Start.
361 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700362VOS_STATUS WDA_start(v_PVOID_t pVosContext)
363{
364 tWDA_CbContext *wdaContext;
365 VOS_STATUS status;
366 WDI_Status wdiStatus;
367 WDI_StartReqParamsType wdiStartParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 if (NULL == pVosContext)
369 {
370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
371 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
372 return VOS_STATUS_E_FAILURE;
373 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700374 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
375 if (NULL == wdaContext)
376 {
377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
378 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
379 return VOS_STATUS_E_FAILURE;
380 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700381 /* Non-FTM mode, WDA status for START must be INIT
382 * FTM mode, WDA Status for START can be INIT or STOP */
383 if ( (WDA_INIT_STATE != wdaContext->wdaState) &&
384 (WDA_STOP_STATE != wdaContext->wdaState) )
385 {
386 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
387 "%s: Invoked from wrong state %d",
388 __FUNCTION__, wdaContext->wdaState );
389 return VOS_STATUS_E_FAILURE;
390 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700391 /* initialize the wdiStartParam. Note that we can create this on
392 the stack since we won't exit until WDI_Start() completes or
393 times out */
394 vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700395 wdiStartParam.wdiDriverType = wdaContext->driverMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700396 /* prepare the config TLV for the WDI */
397 status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam);
398 if ( !VOS_IS_STATUS_SUCCESS(status) )
399 {
400 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
401 "%s: Unable to prepare Config TLV", __FUNCTION__ );
402 return VOS_STATUS_E_FAILURE;
403 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700404 /* note from here onwards if an error occurs we must
405 reclaim the config TLV buffer */
Jeff Johnson295189b2012-06-20 16:38:30 -0700406 wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback;
407 wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext;
408 wdiStartParam.wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700409 /* initialize the WDA-WDI synchronization event */
410 vos_event_reset(&wdaContext->wdaWdiEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700411 /* call WDI start */
412 wdiStatus = WDI_Start(&wdiStartParam,
413 (WDI_StartRspCb)WDA_wdiStartCallback,
414 (v_VOID_t *)pVosContext);
415 if ( IS_WDI_STATUS_FAILURE(wdiStatus) )
416 {
417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
418 "%s: WDI Start failed", __FUNCTION__ );
419 vos_mem_free(wdiStartParam.pConfigBuffer);
420 return VOS_STATUS_E_FAILURE;
421 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 /* wait for WDI start to invoke our callback */
423 status = vos_wait_single_event( &wdaContext->wdaWdiEvent,
424 WDA_WDI_START_TIMEOUT );
425 if ( !VOS_IS_STATUS_SUCCESS(status) )
426 {
427 if ( VOS_STATUS_E_TIMEOUT == status )
428 {
429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
430 "%s: Timeout occurred during WDI_Start", __FUNCTION__ );
431 }
432 else
433 {
434 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
435 "%s: Error %d while waiting for WDI_Start",
436 __FUNCTION__, status);
437 }
438 vos_mem_free(wdiStartParam.pConfigBuffer);
439 return VOS_STATUS_E_FAILURE;
440 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700441 /* WDI_Start() has completed so we can resume our work */
Jeff Johnson295189b2012-06-20 16:38:30 -0700442 /* we no longer need the config TLV */
443 vos_mem_free(wdiStartParam.pConfigBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700444 /* if we are not in the START state then WDI_Start() failed */
445 if (WDA_START_STATE != wdaContext->wdaState)
446 {
447 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
448 "%s: WDI_Start() failure detected", __FUNCTION__ );
449 return VOS_STATUS_E_FAILURE;
450 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700451 /* FTM mode does not need to monitor BA activity */
452 if ( eDRIVER_TYPE_MFG != wdaContext->driverMode )
453 {
454 status = wdaCreateTimers(wdaContext) ;
455 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700456 return status;
457}
458
Jeff Johnson295189b2012-06-20 16:38:30 -0700459/*
460 * FUNCTION: WDA_prepareConfigTLV
461 * Function to prepare CFG for DAL(WDA)
462 */
463VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
464 WDI_StartReqParamsType *wdiStartParams )
465{
466 /* get pMac to acess CFG data base */
467 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext);
468 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
469 tHalCfg *tlvStruct = NULL ;
470 tANI_U8 *tlvStructStart = NULL ;
471 tANI_U32 strLength = WNI_CFG_STA_ID_LEN;
472 v_PVOID_t *configParam;
473 tANI_U32 configParamSize;
474 tANI_U32 *configDataValue;
475 WDI_WlanVersionType wcnssCompiledApiVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -0700476 if ((NULL == pMac)||(NULL == wdaContext))
477 {
478 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
479 "%s: Invoked with invalid wdaContext or pMac", __FUNCTION__ );
480 VOS_ASSERT(0);
481 return VOS_STATUS_E_FAILURE;
482 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700483 configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) +
484 WNI_CFG_STA_ID_LEN +
485 WNI_CFG_EDCA_WME_ACBK_LEN +
486 WNI_CFG_EDCA_WME_ACBE_LEN +
487 WNI_CFG_EDCA_WME_ACVI_LEN +
488 WNI_CFG_EDCA_WME_ACVO_LEN +
489 + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 /* malloc memory for all configs in one shot */
491 configParam = vos_mem_malloc(configParamSize);
492
493 if(NULL == configParam )
494 {
495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
496 "%s:configParam is NULL", __FUNCTION__);
497 VOS_ASSERT(0) ;
498 return VOS_STATUS_E_NOMEM;
499 }
500 vos_mem_set(configParam, configParamSize, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700501 wdiStartParams->pConfigBuffer = configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700502 tlvStruct = (tHalCfg *)configParam;
503 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700504 /* TODO: Remove Later */
505 /* QWLAN_HAL_CFG_STA_ID */
506 tlvStruct->type = QWLAN_HAL_CFG_STA_ID;
507 configDataValue = (tANI_U32*)((tANI_U8 *) tlvStruct + sizeof(tHalCfg));
508 if(wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, (tANI_U8*)configDataValue, &strLength) !=
509 eSIR_SUCCESS)
510 {
511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
512 "Failed to get value for WNI_CFG_STA_ID");
513 goto handle_failure;
514 }
515 tlvStruct->length = strLength ;
516 /* calculate the pad bytes to have the CFG in aligned format */
517 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
518 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
520 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */
522 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
523 tlvStruct->length = sizeof(tANI_U32);
524 configDataValue = (tANI_U32 *)(tlvStruct + 1);
525 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_TX_ANTENNA, configDataValue )
526 != eSIR_SUCCESS)
527 {
528 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
529 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
530 goto handle_failure;
531 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700532 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
533 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700534 /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */
535 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
536 tlvStruct->length = sizeof(tANI_U32);
537 configDataValue = (tANI_U32 *)(tlvStruct + 1);
538 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_RX_ANTENNA, configDataValue) !=
539 eSIR_SUCCESS)
540 {
541 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
542 "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA");
543 goto handle_failure;
544 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
546 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */
548 tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
549 tlvStruct->length = sizeof(tANI_U32);
550 configDataValue = (tANI_U32 *)(tlvStruct + 1);
551 if(wlan_cfgGetInt(pMac, WNI_CFG_LOW_GAIN_OVERRIDE, configDataValue )
552 != eSIR_SUCCESS)
553 {
554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
555 "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE");
556 goto handle_failure;
557 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
559 + sizeof(tHalCfg) + tlvStruct->length)) ;
560
561 /* QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN */
562 tlvStruct->type = QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
563 tlvStruct->length = sizeof(tANI_U32);
564 configDataValue = (tANI_U32 *)(tlvStruct + 1);
565 if(wlan_cfgGetInt(pMac, WNI_CFG_POWER_STATE_PER_CHAIN,
566 configDataValue ) != eSIR_SUCCESS)
567 {
568 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
569 "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN");
570 goto handle_failure;
571 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
573 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700574 /* QWLAN_HAL_CFG_CAL_PERIOD */
575 tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD;
576 tlvStruct->length = sizeof(tANI_U32);
577 configDataValue = (tANI_U32 *)(tlvStruct + 1);
578 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_PERIOD, configDataValue )
579 != eSIR_SUCCESS)
580 {
581 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
582 "Failed to get value for WNI_CFG_CAL_PERIOD");
583 goto handle_failure;
584 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700585 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
586 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700587 /* QWLAN_HAL_CFG_CAL_CONTROL */
588 tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ;
589 tlvStruct->length = sizeof(tANI_U32);
590 configDataValue = (tANI_U32 *)(tlvStruct + 1);
591 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_CONTROL, configDataValue )
592 != eSIR_SUCCESS)
593 {
594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
595 "Failed to get value for WNI_CFG_CAL_CONTROL");
596 goto handle_failure;
597 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700598 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
599 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700600 /* QWLAN_HAL_CFG_PROXIMITY */
601 tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ;
602 tlvStruct->length = sizeof(tANI_U32);
603 configDataValue = (tANI_U32 *)(tlvStruct + 1);
604 if(wlan_cfgGetInt(pMac, WNI_CFG_PROXIMITY, configDataValue )
605 != eSIR_SUCCESS)
606 {
607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
608 "Failed to get value for WNI_CFG_PROXIMITY");
609 goto handle_failure;
610 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700611 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
612 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 /* QWLAN_HAL_CFG_NETWORK_DENSITY */
614 tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ;
615 tlvStruct->length = sizeof(tANI_U32);
616 configDataValue = (tANI_U32 *)(tlvStruct + 1);
617 if(wlan_cfgGetInt(pMac, WNI_CFG_NETWORK_DENSITY, configDataValue )
618 != eSIR_SUCCESS)
619 {
620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
621 "Failed to get value for WNI_CFG_NETWORK_DENSITY");
622 goto handle_failure;
623 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700624 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
625 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700626 /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME */
627 tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ;
628 tlvStruct->length = sizeof(tANI_U32);
629 configDataValue = (tANI_U32 *)(tlvStruct + 1);
630 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MEDIUM_TIME, configDataValue ) !=
631 eSIR_SUCCESS)
632 {
633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
634 "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME");
635 goto handle_failure;
636 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700637 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
638 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700639 /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU */
640 tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU ;
641 tlvStruct->length = sizeof(tANI_U32);
642 configDataValue = (tANI_U32 *)(tlvStruct + 1);
643 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MPDUS_IN_AMPDU,
644 configDataValue ) != eSIR_SUCCESS)
645 {
646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
647 "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU");
648 goto handle_failure;
649 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700650 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
651 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700652 /* QWLAN_HAL_CFG_RTS_THRESHOLD */
653 tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD ;
654 tlvStruct->length = sizeof(tANI_U32);
655 configDataValue = (tANI_U32 *)(tlvStruct + 1);
656 if(wlan_cfgGetInt(pMac, WNI_CFG_RTS_THRESHOLD, configDataValue ) !=
657 eSIR_SUCCESS)
658 {
659 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
660 "Failed to get value for WNI_CFG_RTS_THRESHOLD");
661 goto handle_failure;
662 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700663 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
664 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700665 /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT */
666 tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT ;
667 tlvStruct->length = sizeof(tANI_U32);
668 configDataValue = (tANI_U32 *)(tlvStruct + 1);
669 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_RETRY_LIMIT, configDataValue ) !=
670 eSIR_SUCCESS)
671 {
672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
673 "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT");
674 goto handle_failure;
675 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
677 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT */
679 tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT ;
680 tlvStruct->length = sizeof(tANI_U32);
681 configDataValue = (tANI_U32 *)(tlvStruct + 1);
682 if(wlan_cfgGetInt(pMac, WNI_CFG_LONG_RETRY_LIMIT, configDataValue ) !=
683 eSIR_SUCCESS)
684 {
685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
686 "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT");
687 goto handle_failure;
688 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700689 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
690 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700691 /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD */
692 tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD ;
693 tlvStruct->length = sizeof(tANI_U32);
694 configDataValue = (tANI_U32 *)(tlvStruct + 1);
695 if(wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD,
696 configDataValue ) != eSIR_SUCCESS)
697 {
698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
699 "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD");
700 goto handle_failure;
701 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700702 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
703 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700704 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO */
705 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO ;
706 tlvStruct->length = sizeof(tANI_U32);
707 configDataValue = (tANI_U32 *)(tlvStruct + 1);
708 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ZERO,
709 configDataValue ) != eSIR_SUCCESS)
710 {
711 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
712 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO");
713 goto handle_failure;
714 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
716 + sizeof(tHalCfg) + tlvStruct->length));
717
718 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE */
719 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE ;
720 tlvStruct->length = sizeof(tANI_U32);
721 configDataValue = (tANI_U32 *)(tlvStruct + 1);
722 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ONE,
723 configDataValue ) != eSIR_SUCCESS)
724 {
725 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
726 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE");
727 goto handle_failure;
728 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700729 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
730 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700731 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO */
732 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO ;
733 tlvStruct->length = sizeof(tANI_U32);
734 configDataValue = (tANI_U32 *)(tlvStruct + 1);
735 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_TWO,
736 configDataValue ) != eSIR_SUCCESS)
737 {
738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
739 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO");
740 goto handle_failure;
741 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700742 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
743 + sizeof(tHalCfg) + tlvStruct->length));
744
745 /* QWLAN_HAL_CFG_FIXED_RATE */
746 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE ;
747 tlvStruct->length = sizeof(tANI_U32);
748 configDataValue = (tANI_U32 *)(tlvStruct + 1);
749 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE, configDataValue)
750 != eSIR_SUCCESS)
751 {
752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
753 "Failed to get value for WNI_CFG_FIXED_RATE");
754 goto handle_failure;
755 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700756 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
757 + sizeof(tHalCfg) + tlvStruct->length));
758
759 /* QWLAN_HAL_CFG_RETRYRATE_POLICY */
760 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_POLICY ;
761 tlvStruct->length = sizeof(tANI_U32);
762 configDataValue = (tANI_U32 *)(tlvStruct + 1);
763 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_POLICY, configDataValue )
764 != eSIR_SUCCESS)
765 {
766 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
767 "Failed to get value for WNI_CFG_RETRYRATE_POLICY");
768 goto handle_failure;
769 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700770 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
771 + sizeof(tHalCfg) + tlvStruct->length));
772
773 /* QWLAN_HAL_CFG_RETRYRATE_SECONDARY */
774 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_SECONDARY ;
775 tlvStruct->length = sizeof(tANI_U32);
776 configDataValue = (tANI_U32 *)(tlvStruct + 1);
777 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_SECONDARY,
778 configDataValue ) != eSIR_SUCCESS)
779 {
780 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
781 "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY");
782 goto handle_failure;
783 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700784 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
785 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700786 /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY */
787 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY ;
788 tlvStruct->length = sizeof(tANI_U32);
789 configDataValue = (tANI_U32 *)(tlvStruct + 1);
790 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_TERTIARY,
791 configDataValue ) != eSIR_SUCCESS)
792 {
793 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
794 "Failed to get value for WNI_CFG_RETRYRATE_TERTIARY");
795 goto handle_failure;
796 }
797 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
798 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700799 /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION */
800 tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION ;
801 tlvStruct->length = sizeof(tANI_U32);
802 configDataValue = (tANI_U32 *)(tlvStruct + 1);
803 if(wlan_cfgGetInt(pMac, WNI_CFG_FORCE_POLICY_PROTECTION,
804 configDataValue ) != eSIR_SUCCESS)
805 {
806 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
807 "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION");
808 goto handle_failure;
809 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700810 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
811 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700812 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ */
813 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ ;
814 tlvStruct->length = sizeof(tANI_U32);
815 configDataValue = (tANI_U32 *)(tlvStruct + 1);
816 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_24GHZ,
817 configDataValue ) != eSIR_SUCCESS)
818 {
819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
820 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ");
821 goto handle_failure;
822 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700823 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
824 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700825 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ */
826 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ ;
827 tlvStruct->length = sizeof(tANI_U32);
828 configDataValue = (tANI_U32 *)(tlvStruct + 1);
829 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_5GHZ,
830 configDataValue ) != eSIR_SUCCESS)
831 {
832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
833 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ");
834 goto handle_failure;
835 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700836 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
837 + sizeof(tHalCfg) + tlvStruct->length);
838
839#if 0 /*FIXME_PRIMA : Enable this after the RA is enabled in HAL*/
840 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ */
841 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ ;
842 tlvStruct->length = sizeof(tANI_U32);
843 configDataValue = (tANI_U32 *)(tlvStruct + 1);
844 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_24GHZ,
845 configDataValue ) != eSIR_SUCCESS)
846 {
847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
848 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ");
849 goto handle_failure;
850 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
852 + sizeof(tHalCfg) + tlvStruct->length);
853#endif
854 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ */
855 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ ;
856 tlvStruct->length = sizeof(tANI_U32);
857 configDataValue = (tANI_U32 *)(tlvStruct + 1);
858 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_5GHZ,
859 configDataValue ) != eSIR_SUCCESS)
860 {
861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
862 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ");
863 goto handle_failure;
864 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700865 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
866 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700867 /* QWLAN_HAL_CFG_MAX_BA_SESSIONS */
868 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS ;
869 tlvStruct->length = sizeof(tANI_U32);
870 configDataValue = (tANI_U32 *)(tlvStruct + 1);
871 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_SESSIONS, configDataValue ) !=
872 eSIR_SUCCESS)
873 {
874 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
875 "Failed to get value for WNI_CFG_MAX_BA_SESSIONS");
876 goto handle_failure;
877 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700878 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
879 + sizeof(tHalCfg) + tlvStruct->length);
880
881 /* QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT */
882 tlvStruct->type = QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT ;
883 tlvStruct->length = sizeof(tANI_U32);
884 configDataValue = (tANI_U32 *)(tlvStruct + 1);
885 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
886 configDataValue ) != eSIR_SUCCESS)
887 {
888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
889 "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
890 goto handle_failure;
891 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700892 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
893 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700894 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER */
895 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER ;
896 tlvStruct->length = sizeof(tANI_U32);
897 configDataValue = (tANI_U32 *)(tlvStruct + 1);
898 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_BCN_FILTER,
899 configDataValue ) != eSIR_SUCCESS)
900 {
901 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
902 "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER");
903 goto handle_failure;
904 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700905 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
906 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700907 /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR */
908 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR ;
909 tlvStruct->length = sizeof(tANI_U32);
910 configDataValue = (tANI_U32 *)(tlvStruct + 1);
911 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
912 configDataValue ) != eSIR_SUCCESS)
913 {
914 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
915 "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR");
916 goto handle_failure;
917 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700918 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
919 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700920 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
921 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE ;
922 tlvStruct->length = sizeof(tANI_U32);
923 configDataValue = (tANI_U32 *)(tlvStruct + 1);
924 if(wlan_cfgGetInt(pMac, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE,
925 configDataValue ) != eSIR_SUCCESS)
926 {
927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
928 "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE");
929 goto handle_failure;
930 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700931 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
932 + sizeof(tHalCfg) + tlvStruct->length);
933
934 /* QWLAN_HAL_CFG_STATS_PERIOD */
935 tlvStruct->type = QWLAN_HAL_CFG_STATS_PERIOD ;
936 tlvStruct->length = sizeof(tANI_U32);
937 configDataValue = (tANI_U32 *)(tlvStruct + 1);
938 if(wlan_cfgGetInt(pMac, WNI_CFG_STATS_PERIOD, configDataValue ) !=
939 eSIR_SUCCESS)
940 {
941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
942 "Failed to get value for WNI_CFG_STATS_PERIOD");
943 goto handle_failure;
944 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700945 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
946 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700947 /* QWLAN_HAL_CFG_CFP_MAX_DURATION */
948 tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION ;
949 tlvStruct->length = sizeof(tANI_U32);
950 configDataValue = (tANI_U32 *)(tlvStruct + 1);
951 if(wlan_cfgGetInt(pMac, WNI_CFG_CFP_MAX_DURATION, configDataValue ) !=
952 eSIR_SUCCESS)
953 {
954 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
955 "Failed to get value for WNI_CFG_CFP_MAX_DURATION");
956 goto handle_failure;
957 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700958 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
959 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700960 /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */
961 tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED ;
962 tlvStruct->length = sizeof(tANI_U32);
963 configDataValue = (tANI_U32 *)(tlvStruct + 1);
964 vos_mem_copy(configDataValue, &wdaContext->frameTransRequired,
965 sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700966 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
967 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700968 /* QWLAN_HAL_CFG_DTIM_PERIOD */
969 tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD ;
970 tlvStruct->length = sizeof(tANI_U32);
971 configDataValue = (tANI_U32 *)(tlvStruct + 1);
972 if(wlan_cfgGetInt(pMac, WNI_CFG_DTIM_PERIOD, configDataValue)
973 != eSIR_SUCCESS)
974 {
975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
976 "Failed to get value for WNI_CFG_DTIM_PERIOD");
977 goto handle_failure;
978 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
980 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700981 /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */
982 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK ;
983 strLength = WNI_CFG_EDCA_WME_ACBK_LEN;
984 configDataValue = (tANI_U32 *)(tlvStruct + 1);
985 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBK, (tANI_U8 *)configDataValue,
986 &strLength) != eSIR_SUCCESS)
987 {
988 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
989 "Failed to get value for WNI_CFG_EDCA_WME_ACBK");
990 goto handle_failure;
991 }
992 tlvStruct->length = strLength;
993 /* calculate the pad bytes to have the CFG in aligned format */
994 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
995 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -0700996 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
997 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700998 /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */
999 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE ;
1000 strLength = WNI_CFG_EDCA_WME_ACBE_LEN;
1001 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1002 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBE, (tANI_U8 *)configDataValue,
1003 &strLength) != eSIR_SUCCESS)
1004 {
1005 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1006 "Failed to get value for WNI_CFG_EDCA_WME_ACBE");
1007 goto handle_failure;
1008 }
1009 tlvStruct->length = strLength;
1010 /* calculate the pad bytes to have the CFG in aligned format */
1011 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1012 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001013 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1014 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001015 /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */
1016 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO ;
1017 strLength = WNI_CFG_EDCA_WME_ACVI_LEN;
1018 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1019 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVO, (tANI_U8 *)configDataValue,
1020 &strLength) != eSIR_SUCCESS)
1021 {
1022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1023 "Failed to get value for WNI_CFG_EDCA_WME_ACVI");
1024 goto handle_failure;
1025 }
1026 tlvStruct->length = strLength;
1027 /* calculate the pad bytes to have the CFG in aligned format */
1028 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1029 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001030 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1031 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001032 /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */
1033 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI ;
1034 strLength = WNI_CFG_EDCA_WME_ACVO_LEN;
1035 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1036 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVI, (tANI_U8 *)configDataValue,
1037 &strLength) != eSIR_SUCCESS)
1038 {
1039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1040 "Failed to get value for WNI_CFG_EDCA_WME_ACVO");
1041 goto handle_failure;
1042 }
1043 tlvStruct->length = strLength;
1044 /* calculate the pad bytes to have the CFG in aligned format */
1045 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1046 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001047 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1048 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001049 /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */
1050 tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH ;
1051 tlvStruct->length = sizeof(tANI_U32);
1052 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1053 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_THRESHOLD_HIGH, configDataValue)
1054 != eSIR_SUCCESS)
1055 {
1056 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1057 "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH");
1058 goto handle_failure;
1059 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001060 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1061 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001062 /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */
1063 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS ;
1064 tlvStruct->length = sizeof(tANI_U32);
1065 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1066 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_BUFFERS, configDataValue)
1067 != eSIR_SUCCESS)
1068 {
1069 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1070 "Failed to get value for WNI_CFG_MAX_BA_BUFFERS");
1071 goto handle_failure;
1072 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001073 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1074 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001075 /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */
1076 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE ;
1077 tlvStruct->length = sizeof(tANI_U32);
1078 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1079 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_PS_POLL_VALUE, configDataValue)
1080 != eSIR_SUCCESS)
1081 {
1082 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1083 "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE");
1084 goto handle_failure;
1085 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001086 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1087 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001088 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */
1089 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI ;
1090 tlvStruct->length = sizeof(tANI_U32);
1091 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1092 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI, configDataValue)
1093 != eSIR_SUCCESS)
1094 {
1095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1096 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI");
1097 goto handle_failure;
1098 }
1099 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1100 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001101 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */
1102 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS ;
1103 tlvStruct->length = sizeof(tANI_U32);
1104 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1105 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS, configDataValue)
1106 != eSIR_SUCCESS)
1107 {
1108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1109 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS");
1110 goto handle_failure;
1111 }
1112 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1113 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001114 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */
1115 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI ;
1116 tlvStruct->length = sizeof(tANI_U32);
1117 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1118 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI, configDataValue)
1119 != eSIR_SUCCESS)
1120 {
1121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1122 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI");
1123 goto handle_failure;
1124 }
1125 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1126 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001127 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */
1128 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS ;
1129 tlvStruct->length = sizeof(tANI_U32);
1130 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1131 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS, configDataValue)
1132 != eSIR_SUCCESS)
1133 {
1134 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1135 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS");
1136 goto handle_failure;
1137 }
1138 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1139 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001140 /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */
1141 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN ;
1142 tlvStruct->length = sizeof(tANI_U32);
1143 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1144 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, configDataValue)
1145 != eSIR_SUCCESS)
1146 {
1147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1148 "Failed to get value for WNI_CFG_TELE_BCN_WAKEUP_EN");
1149 goto handle_failure;
1150 }
1151 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1152 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001153 /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */
1154 tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD ;
1155 tlvStruct->length = sizeof(tANI_U32);
1156 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1157 if(wlan_cfgGetInt(pMac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, configDataValue)
1158 != eSIR_SUCCESS)
1159 {
1160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1161 "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
1162 goto handle_failure;
1163 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001164 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1165 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001166 /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/
1167 tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE ;
1168 tlvStruct->length = sizeof(tANI_U32);
1169 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1170 if(wlan_cfgGetInt(pMac, WNI_CFG_TX_PWR_CTRL_ENABLE, configDataValue)
1171 != eSIR_SUCCESS)
1172 {
1173 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1174 "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE");
1175 goto handle_failure;
1176 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001177 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1178 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP */
1180 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP ;
1181 tlvStruct->length = sizeof(tANI_U32);
1182 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1183 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_CLOSE_LOOP, configDataValue)
1184 != eSIR_SUCCESS)
1185 {
1186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1187 "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP");
1188 goto handle_failure;
1189 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001190 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1191 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001192 /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary,
1193 * but are from the WLAN_INI_FILE file. However, this is the only parameter download routine
1194 * into FW, so the parameters are added here.
1195 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001196 /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */
1197 tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE ;
1198 tlvStruct->length = sizeof(tANI_U32);
1199 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1200 *configDataValue = pMac->btc.btcConfig.btcExecutionMode;
1201 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1202 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */
1204 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK ;
1205 tlvStruct->length = sizeof(tANI_U32);
1206 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1207 *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp;
1208 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1209 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001210 /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */
1211 tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS ;
1212 tlvStruct->length = sizeof(tANI_U32);
1213 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1214 *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp;
1215 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1216 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson32d95a32012-09-10 13:15:23 -07001217 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT */
1218 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT ;
1219 tlvStruct->length = sizeof(tANI_U32);
1220 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1221 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqBt;
1222 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1223 + sizeof(tHalCfg) + tlvStruct->length) ;
1224
1225 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT */
1226 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT ;
1227 tlvStruct->length = sizeof(tANI_U32);
1228 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1229 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageBt;
1230 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1231 + sizeof(tHalCfg) + tlvStruct->length) ;
1232
1233 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT */
1234 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT ;
1235 tlvStruct->length = sizeof(tANI_U32);
1236 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1237 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnBt;
1238 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1239 + sizeof(tHalCfg) + tlvStruct->length) ;
1240
1241 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT */
1242 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT ;
1243 tlvStruct->length = sizeof(tANI_U32);
1244 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1245 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeBt;
1246 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1247 + sizeof(tHalCfg) + tlvStruct->length) ;
1248
1249 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN */
1250 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN ;
1251 tlvStruct->length = sizeof(tANI_U32);
1252 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1253 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqWlan;
1254 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1255 + sizeof(tHalCfg) + tlvStruct->length) ;
1256
1257 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN */
1258 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN ;
1259 tlvStruct->length = sizeof(tANI_U32);
1260 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1261 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageWlan;
1262 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1263 + sizeof(tHalCfg) + tlvStruct->length) ;
1264
1265 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN */
1266 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN ;
1267 tlvStruct->length = sizeof(tANI_U32);
1268 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1269 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnWlan;
1270 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1271 + sizeof(tHalCfg) + tlvStruct->length) ;
1272
1273 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN */
1274 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN ;
1275 tlvStruct->length = sizeof(tANI_U32);
1276 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1277 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeWlan;
1278 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1279 + sizeof(tHalCfg) + tlvStruct->length) ;
1280
1281 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT */
1282 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT ;
1283 tlvStruct->length = sizeof(tANI_U32);
1284 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1285 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenBt;
1286 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1287 + sizeof(tHalCfg) + tlvStruct->length) ;
1288
1289 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN */
1290 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN ;
1291 tlvStruct->length = sizeof(tANI_U32);
1292 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1293 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenWlan;
1294 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1295 + sizeof(tHalCfg) + tlvStruct->length) ;
1296
1297 /* [COEX] QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC */
1298 tlvStruct->type = QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC ;
1299 tlvStruct->length = sizeof(tANI_U32);
1300 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1301 *configDataValue = pMac->btc.btcConfig.btcMaxScoBlockPerc;
1302 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1303 + sizeof(tHalCfg) + tlvStruct->length) ;
1304
1305 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP */
1306 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP ;
1307 tlvStruct->length = sizeof(tANI_U32);
1308 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1309 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnA2dp;
1310 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1311 + sizeof(tHalCfg) + tlvStruct->length) ;
1312
1313 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO */
1314 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO ;
1315 tlvStruct->length = sizeof(tANI_U32);
1316 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1317 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnSco;
1318 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1319 + sizeof(tHalCfg) + tlvStruct->length) ;
1320
1321 /* QWLAN_HAL_CFG_WCNSS_API_VERSION */
Jeff Johnson295189b2012-06-20 16:38:30 -07001322 tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION ;
1323 tlvStruct->length = sizeof(tANI_U32);
1324 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1325 WDI_GetWcnssCompiledApiVersion(&wcnssCompiledApiVersion);
1326 *configDataValue = WLAN_HAL_CONSTRUCT_API_VERSION(wcnssCompiledApiVersion.major,
1327 wcnssCompiledApiVersion.minor,
1328 wcnssCompiledApiVersion.version,
1329 wcnssCompiledApiVersion.revision);
1330 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1331 + sizeof(tHalCfg) + tlvStruct->length) ;
1332
Jeff Johnsond13512a2012-07-17 11:42:19 -07001333 /* QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT */
1334 tlvStruct->type = QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT ;
1335 tlvStruct->length = sizeof(tANI_U32);
1336 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1337 if(wlan_cfgGetInt(pMac, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT,
1338 configDataValue ) != eSIR_SUCCESS)
1339 {
1340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1341 "Failed to get value for WNI_CFG_AP_KEEP_ALIVE_TIMEOUT");
1342 goto handle_failure;
1343 }
1344
1345 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1346 + sizeof(tHalCfg) + tlvStruct->length) ;
1347 /* QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT */
1348 tlvStruct->type = QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT ;
1349 tlvStruct->length = sizeof(tANI_U32);
1350 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1351 if(wlan_cfgGetInt(pMac, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT,
1352 configDataValue ) != eSIR_SUCCESS)
1353 {
1354 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1355 "Failed to get value for WNI_CFG_GO_KEEP_ALIVE_TIMEOUT");
1356 goto handle_failure;
1357 }
1358
1359 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1360 + sizeof(tHalCfg) + tlvStruct->length) ;
1361
1362 /* QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST */
1363 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST;
1364 tlvStruct->length = sizeof(tANI_U32);
1365 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1366 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MC_ADDR_LIST, configDataValue)
1367 != eSIR_SUCCESS)
1368 {
1369 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1370 "Failed to get value for WNI_CFG_ENABLE_MC_ADDR_LIST");
1371 goto handle_failure;
1372 }
1373
1374 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1375 + sizeof(tHalCfg) + tlvStruct->length) ;
1376
Jeff Johnson295189b2012-06-20 16:38:30 -07001377 wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001378#ifdef WLAN_DEBUG
1379 {
1380 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07001381 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1382 "****** Dumping CFG TLV ***** ");
1383 for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8)
1384 {
1385 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1386 "%02x %02x %02x %02x %02x %02x %02x %02x",
1387 tlvStructStart[i],
1388 tlvStructStart[i+1],
1389 tlvStructStart[i+2],
1390 tlvStructStart[i+3],
1391 tlvStructStart[i+4],
1392 tlvStructStart[i+5],
1393 tlvStructStart[i+6],
1394 tlvStructStart[i+7]);
1395 }
1396 /* Dump the bytes in the last line*/
1397 for (; i < wdiStartParams->usConfigBufferLen; i++)
1398 {
1399 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1400 "%02x ",tlvStructStart[i]);
1401 }
1402 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1403 "**************************** ");
1404 }
1405#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001406 return VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001407handle_failure:
1408 vos_mem_free(configParam);
1409 return VOS_STATUS_E_FAILURE;
1410}
Jeff Johnson295189b2012-06-20 16:38:30 -07001411/*
1412 * FUNCTION: WDA_wdiCompleteCB
1413 * call the voss call back function
1414 */
1415void WDA_stopCallback(WDI_Status status, v_PVOID_t *pVosContext)
1416{
1417 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001418 if (NULL == wdaContext)
1419 {
1420 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1421 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1422 return ;
1423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001424 /* free the config structure */
1425 if(wdaContext->wdaWdiApiMsgParam != NULL)
1426 {
1427 vos_mem_free(wdaContext->wdaWdiApiMsgParam);
1428 wdaContext->wdaWdiApiMsgParam = NULL;
1429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001430 if(WDI_STATUS_SUCCESS != status)
1431 {
1432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1433 "WDI stop callback returned failure" );
1434 VOS_ASSERT(0) ;
1435 }
1436 else
1437 {
1438 wdaContext->wdaState = WDA_STOP_STATE;
1439 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001440 /* Indicate VOSS about the start complete */
1441 vos_WDAComplete_cback(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001442 return ;
1443}
Jeff Johnson295189b2012-06-20 16:38:30 -07001444/*
1445 * FUNCTION: WDA_stop
1446 * call WDI_stop
1447 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001448VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
1449{
1450 WDI_Status wdiStatus;
1451 VOS_STATUS status = VOS_STATUS_SUCCESS;
1452 WDI_StopReqParamsType *wdiStopReq;
1453 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001454 if (NULL == pWDA)
1455 {
1456 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1457 "%s: Invoked with invalid pWDA", __FUNCTION__ );
1458 VOS_ASSERT(0);
1459 return VOS_STATUS_E_FAILURE;
1460 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001461 /* FTM mode stay START_STATE */
1462 if( (WDA_READY_STATE != pWDA->wdaState) &&
1463 (WDA_INIT_STATE != pWDA->wdaState) &&
1464 (WDA_START_STATE != pWDA->wdaState) )
1465 {
1466 VOS_ASSERT(0);
1467 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001468 wdiStopReq = (WDI_StopReqParamsType *)
1469 vos_mem_malloc(sizeof(WDI_StopReqParamsType));
1470 if(NULL == wdiStopReq)
1471 {
1472 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1473 "%s: VOS MEM Alloc Failure", __FUNCTION__);
1474 VOS_ASSERT(0);
1475 return VOS_STATUS_E_NOMEM;
1476 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001477 wdiStopReq->wdiStopReason = reason;
1478 wdiStopReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001479 if(NULL != pWDA->wdaWdiApiMsgParam)
1480 {
1481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1482 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
1483 VOS_ASSERT(0);
1484 vos_mem_free(wdiStopReq);
1485 return VOS_STATUS_E_FAILURE;
1486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001487 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
1488 {
1489 wdaDestroyTimers(pWDA);
1490 }
1491 pWDA->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 /* call WDI stop */
1493 wdiStatus = WDI_Stop(wdiStopReq,
1494 (WDI_StopRspCb)WDA_stopCallback, pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001495 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
1496 {
1497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1498 "error in WDA Stop" );
1499 vos_mem_free(pWDA->wdaWdiApiMsgParam);
1500 pWDA->wdaWdiApiMsgParam = NULL;
1501 status = VOS_STATUS_E_FAILURE;
1502 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001503 return status;
1504}
Jeff Johnson295189b2012-06-20 16:38:30 -07001505/*
1506 * FUNCTION: WDA_close
1507 * call WDI_close and free the WDA context
1508 */
1509VOS_STATUS WDA_close(v_PVOID_t pVosContext)
1510{
Jeff Johnson43971f52012-07-17 12:26:56 -07001511 VOS_STATUS status = VOS_STATUS_SUCCESS;
1512 WDI_Status wstatus;
1513 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07001514 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001515 if (NULL == wdaContext)
1516 {
1517 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1518 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1519 return VOS_STATUS_E_FAILURE;
1520 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001521 if((WDA_INIT_STATE != wdaContext->wdaState) &&
1522 (WDA_STOP_STATE != wdaContext->wdaState))
1523 {
1524 VOS_ASSERT(0);
1525 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001526 /*call WDI close*/
Jeff Johnson43971f52012-07-17 12:26:56 -07001527 wstatus = WDI_Close();
1528 if ( wstatus != WDI_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 {
1530 status = VOS_STATUS_E_FAILURE;
1531 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001532 wdaContext->wdaState = WDA_CLOSE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001533 /* Destroy the events */
Jeff Johnson43971f52012-07-17 12:26:56 -07001534 vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent);
1535 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001536 {
1537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1538 "WDI Sync Event destroy failed - status = %d\n", status);
1539 status = VOS_STATUS_E_FAILURE;
1540 }
1541
Jeff Johnson43971f52012-07-17 12:26:56 -07001542 vstatus = vos_event_destroy(&wdaContext->txFrameEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001543 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001544 {
1545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1546 "VOS Event destroy failed - status = %d\n", status);
1547 status = VOS_STATUS_E_FAILURE;
1548 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001549 vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001550 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001551 {
1552 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1553 "VOS Event destroy failed - status = %d\n", status);
1554 status = VOS_STATUS_E_FAILURE;
1555 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001556 vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
Jeff Johnsone7245742012-09-05 17:12:55 -07001557 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001558 {
1559 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1560 "VOS Event destroy failed - status = %d\n", status);
1561 status = VOS_STATUS_E_FAILURE;
1562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001563 /* free WDA context */
Jeff Johnson43971f52012-07-17 12:26:56 -07001564 vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07001565 if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001566 {
1567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1568 "error in WDA close " );
1569 status = VOS_STATUS_E_FAILURE;
1570 }
1571 return status;
1572}
Jeff Johnson295189b2012-06-20 16:38:30 -07001573/*
1574 * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
1575 * returns 1 if the compiled version is greater than or equal to the input version
1576 */
1577
1578uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1579{
1580 VOS_STATUS status = VOS_STATUS_SUCCESS;
1581 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1582 tSirVersionType compiledVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001583 status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001584 if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
1585 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
1586 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
1587 (compiledVersion.revision >= revision)))
1588 return 1;
1589 else
1590 return 0;
1591}
Jeff Johnson295189b2012-06-20 16:38:30 -07001592/*
1593 * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
1594 * returns 1 if the compiled version is greater than or equal to the input version
1595 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001596uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1597{
1598 VOS_STATUS status = VOS_STATUS_SUCCESS;
1599 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1600 tSirVersionType reportedVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001601 status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001602 if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
1603 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
1604 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
1605 (reportedVersion.revision >= revision)))
1606 return 1;
1607 else
1608 return 0;
1609}
Jeff Johnson295189b2012-06-20 16:38:30 -07001610/*
1611 * FUNCTION: WDA_GetWcnssWlanCompiledVersion
1612 * Returns the version of the WCNSS WLAN API with which the HOST
1613 * device driver was compiled
1614 */
1615VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx,
1616 tSirVersionType *pVersion)
1617{
1618 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001619 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1620 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001621 if ((NULL == pvosGCtx) || (NULL == pVersion))
1622 {
1623 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1624 "%s: Invoked with invalid parameter", __FUNCTION__);
1625 VOS_ASSERT(0);
1626 return VOS_STATUS_E_FAILURE;
1627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001628 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1629 if (NULL == pWDA )
1630 {
1631 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1632 "%s: Invalid WDA context", __FUNCTION__);
1633 VOS_ASSERT(0);
1634 return VOS_STATUS_E_FAILURE;
1635 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001636 *pVersion = pWDA->wcnssWlanCompiledVersion;
1637 return VOS_STATUS_SUCCESS;
1638}
Jeff Johnson295189b2012-06-20 16:38:30 -07001639/*
1640 * FUNCTION: WDA_GetWcnssWlanReportedVersion
1641 * Returns the version of the WCNSS WLAN API with which the WCNSS
1642 * device driver was compiled
1643 */
1644VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx,
1645 tSirVersionType *pVersion)
1646{
1647 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001648 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1649 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001650 if ((NULL == pvosGCtx) || (NULL == pVersion))
1651 {
1652 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1653 "%s: Invoked with invalid parameter", __FUNCTION__);
1654 VOS_ASSERT(0);
1655 return VOS_STATUS_E_FAILURE;
1656 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001657 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1658 if (NULL == pWDA )
1659 {
1660 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1661 "%s: Invalid WDA context", __FUNCTION__);
1662 VOS_ASSERT(0);
1663 return VOS_STATUS_E_FAILURE;
1664 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001665 *pVersion = pWDA->wcnssWlanReportedVersion;
1666 return VOS_STATUS_SUCCESS;
1667}
Jeff Johnson295189b2012-06-20 16:38:30 -07001668/*
1669 * FUNCTION: WDA_GetWcnssSoftwareVersion
1670 * Returns the WCNSS Software version string
1671 */
1672VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
1673 tANI_U8 *pVersion,
1674 tANI_U32 versionBufferSize)
1675{
1676 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001677 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1678 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 if ((NULL == pvosGCtx) || (NULL == pVersion))
1680 {
1681 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1682 "%s: Invoked with invalid parameter", __FUNCTION__);
1683 VOS_ASSERT(0);
1684 return VOS_STATUS_E_FAILURE;
1685 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001686 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1687 if (NULL == pWDA )
1688 {
1689 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1690 "%s: Invalid WDA context", __FUNCTION__);
1691 VOS_ASSERT(0);
1692 return VOS_STATUS_E_FAILURE;
1693 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001694 wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
1695 return VOS_STATUS_SUCCESS;
1696}
Jeff Johnson295189b2012-06-20 16:38:30 -07001697/*
1698 * FUNCTION: WDA_GetWcnssHardwareVersion
1699 * Returns the WCNSS Hardware version string
1700 */
1701VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx,
1702 tANI_U8 *pVersion,
1703 tANI_U32 versionBufferSize)
1704{
1705 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1707 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001708 if ((NULL == pvosGCtx) || (NULL == pVersion))
1709 {
1710 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1711 "%s: Invoked with invalid parameter", __FUNCTION__);
1712 VOS_ASSERT(0);
1713 return VOS_STATUS_E_FAILURE;
1714 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001715 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1716 if (NULL == pWDA )
1717 {
1718 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1719 "%s: Invalid WDA context", __FUNCTION__);
1720 VOS_ASSERT(0);
1721 return VOS_STATUS_E_FAILURE;
1722 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001723 wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
1724 return VOS_STATUS_SUCCESS;
1725}
Jeff Johnson295189b2012-06-20 16:38:30 -07001726/*
1727 * FUNCTION: WDA_WniCfgDnld
1728 * Trigger CFG Download
1729 */
1730VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA)
1731{
1732 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001733 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 v_VOID_t *pFileImage = NULL;
1735 v_SIZE_t cbFileImageSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001736 v_VOID_t *pCfgBinary = NULL;
1737 v_SIZE_t cbCfgBinarySize = 0;
1738
1739 v_BOOL_t bStatus = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 if (NULL == pMac )
1741 {
1742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1743 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
1744 VOS_ASSERT(0);
1745 return VOS_STATUS_E_FAILURE;
1746 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 /* get the number of bytes in the CFG Binary... */
1748 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL,
1749 &cbFileImageSize );
1750 if ( VOS_STATUS_E_NOMEM != vosStatus )
1751 {
1752 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1753 "Error obtaining binary size" );
1754 goto fail;
1755 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001756 // malloc a buffer to read in the Configuration binary file.
1757 pFileImage = vos_mem_malloc( cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001758 if ( NULL == pFileImage )
1759 {
1760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1761 "Unable to allocate memory for the CFG binary [size= %d bytes]",
1762 cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001763 vosStatus = VOS_STATUS_E_NOMEM;
1764 goto fail;
1765 }
1766
1767 /* Get the entire CFG file image... */
1768 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage,
1769 &cbFileImageSize );
1770 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1771 {
1772 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1773 "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]",
1774 cbFileImageSize );
1775 goto fail;
1776 }
1777
1778 /*
1779 * Validate the binary image. This function will return a pointer
1780 * and length where the CFG binary is located within the binary image file.
1781 */
1782 bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize,
1783 &pCfgBinary, &cbCfgBinarySize );
1784 if ( VOS_FALSE == bStatus )
1785 {
1786 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1787 "Error: Cannot find STA CFG in binary image file" );
1788 vosStatus = VOS_STATUS_E_FAILURE;
1789 goto fail;
1790 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001791 /*
1792 * TODO: call the config download function
1793 * for now calling the existing cfg download API
1794 */
1795 processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 if( pFileImage != NULL )
1797 {
1798 vos_mem_free( pFileImage );
1799 }
1800 return vosStatus;
1801
1802fail:
1803 if(pCfgBinary != NULL)
1804 vos_mem_free( pFileImage );
1805
1806 return vosStatus;
1807}
Jeff Johnson295189b2012-06-20 16:38:30 -07001808/* -----------------------------------------------------------------
1809 * WDI interface
1810 * -----------------------------------------------------------------
1811 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001812/*
1813 * FUNCTION: WDA_suspendDataTxCallback
1814 * call back function called from TL after suspend Transmission
1815 */
1816VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx,
1817 v_U8_t* ucSTAId,
1818 VOS_STATUS vosStatus)
1819{
1820 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1822 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 if (NULL == pWDA )
1824 {
1825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1826 "%s: Invoked with invalid WDA context ", __FUNCTION__ );
1827 VOS_ASSERT(0);
1828 return VOS_STATUS_E_FAILURE;
1829 }
1830 if(VOS_IS_STATUS_SUCCESS(vosStatus))
1831 {
1832 pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS;
1833 }
1834 else
1835 {
1836 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1837 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001838 /* Trigger the event to bring the WDA TL suspend function to come
1839 * out of wait*/
1840 vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
1841 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1842 {
1843 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1844 "NEW VOS Event Set failed - status = %d \n", vosStatus);
1845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001846 /* If TL suspended had timedout before this callback was called, resume back
1847 * TL.*/
1848 if (pWDA->txSuspendTimedOut)
1849 {
1850 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1851 "Late TLSuspendCallback, resuming TL back again\n");
1852 WDA_ResumeDataTx(pWDA);
1853 pWDA->txSuspendTimedOut = FALSE;
1854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001855 return VOS_STATUS_SUCCESS;
1856}
Jeff Johnson295189b2012-06-20 16:38:30 -07001857/*
1858 * FUNCTION: WDA_suspendDataTx
1859 * Update TL to suspend the data Transmission
1860 */
1861VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA)
1862{
1863 VOS_STATUS status = VOS_STATUS_E_FAILURE;
1864 tANI_U8 eventIdx = 0;
1865 tANI_U8 ucSTAId = 0;
1866
1867 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1868 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001869 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001870 if (pWDA->txSuspendTimedOut)
1871 {
1872 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1873 "TL suspend timedout previously, CB not called yet\n");
1874 return status;
1875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001876 /* Reset the event to be not signalled */
1877 status = vos_event_reset(&pWDA->suspendDataTxEvent);
1878 if(!VOS_IS_STATUS_SUCCESS(status))
1879 {
1880 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1881 "VOS Event reset failed - status = %d\n",status);
1882 return VOS_STATUS_E_FAILURE;
1883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001884 /*Indicate TL to suspend transmission for all Sta Id */
1885 ucSTAId = WLAN_ALL_STA;
1886 status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
1887 WDA_SuspendDataTxCallback);
1888 if(status != VOS_STATUS_SUCCESS)
1889 {
1890 return status;
1891 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001892 /* Wait for the event to be set by the TL, to get the response of
1893 * suspending the TX queues, this event should be set by the Callback
1894 * function called by TL*/
1895 status = vos_wait_events(&pWDA->suspendDataTxEvent, 1,
1896 WDA_TL_SUSPEND_TIMEOUT, &eventIdx);
1897 if(!VOS_IS_STATUS_SUCCESS(status))
1898 {
1899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1900 "%s: Status %d when waiting for Suspend Data TX Event",
1901 __FUNCTION__, status);
1902 /* Set this flag to true when TL suspend times out, so that when TL
1903 * suspend eventually happens and calls the callback, TL can be resumed
1904 * right away by looking at this flag when true.*/
1905 pWDA->txSuspendTimedOut = TRUE;
1906 }
1907 else
1908 {
1909 pWDA->txSuspendTimedOut = FALSE;
1910 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001911 if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
1912 {
1913 status = VOS_STATUS_SUCCESS;
1914 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001915 return status;
1916}
Jeff Johnson295189b2012-06-20 16:38:30 -07001917/*
1918 * FUNCTION: WDA_resumeDataTx
1919 * Update TL to resume the data Transmission
1920 */
1921VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA)
1922{
1923 VOS_STATUS status = VOS_STATUS_SUCCESS;
1924 tANI_U8 ucSTAId = 0;
1925
1926 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1927 "%s: Entered " ,__FUNCTION__);
1928 ucSTAId = WLAN_ALL_STA;
1929 status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
1930 return status;
1931}
Jeff Johnson295189b2012-06-20 16:38:30 -07001932/*
1933 * FUNCTION: WDA_InitScanReqCallback
1934 * Trigger Init SCAN callback
1935 */
1936void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData)
1937{
1938 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
1939 tWDA_CbContext *pWDA;
1940 tInitScanParams *pWDA_ScanParam ;
1941 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001942 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1943 "<------ %s " ,__FUNCTION__);
1944 if(NULL == pWdaParams)
1945 {
1946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1947 "%s: pWdaParams received NULL", __FUNCTION__);
1948 VOS_ASSERT(0) ;
1949 return ;
1950 }
1951 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
1952 pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07001953 if(NULL == pWDA_ScanParam)
1954 {
1955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1956 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07001957 VOS_ASSERT(0);
1958 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
1959 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001960 return ;
1961 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001962 if(WDI_STATUS_SUCCESS != wdiStatus)
1963 {
1964 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 if(VOS_STATUS_SUCCESS != status)
1966 {
1967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1968 "%s error in Resume Tx ", __FUNCTION__ );
1969 }
1970 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001971 /* free WDI command buffer */
1972 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07001974
Jeff Johnson295189b2012-06-20 16:38:30 -07001975
1976 /* assign status to scan params */
1977 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001978 /* send SCAN RSP message back to PE */
1979 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001980 return ;
1981}
1982
1983/*
1984 * FUNCTION: WDA_ProcessInitScanReq
1985 * Trigger Init SCAN in DAL
1986 */
1987VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA,
1988 tInitScanParams *initScanParams)
1989{
1990 WDI_Status status = WDI_STATUS_SUCCESS ;
1991 WDI_InitScanReqParamsType *wdiInitScanParam =
1992 (WDI_InitScanReqParamsType *)vos_mem_malloc(
1993 sizeof(WDI_InitScanReqParamsType)) ;
1994 tWDA_ReqParams *pWdaParams;
1995 tANI_U8 i = 0;
1996
1997 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1998 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001999 if(NULL == wdiInitScanParam)
2000 {
2001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2002 "%s:VOS MEM Alloc Failure", __FUNCTION__);
2003 VOS_ASSERT(0);
2004 return VOS_STATUS_E_NOMEM;
2005 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002006 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2007 if(NULL == pWdaParams)
2008 {
2009 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2010 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2011 VOS_ASSERT(0);
2012 vos_mem_free(wdiInitScanParam);
2013 return VOS_STATUS_E_NOMEM;
2014 }
2015
2016 /* Copy init Scan params to WDI structure */
2017 wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ;
2018 vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid,
2019 sizeof(tSirMacAddr)) ;
2020 wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ;
2021 wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ;
2022 wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ;
2023#ifdef WLAN_FEATURE_P2P
2024 wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA;
2025 wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration;
2026#else
2027 wdiInitScanParam->wdiReqInfo.bUseNOA = 0;
2028 wdiInitScanParam->wdiReqInfo.scanDuration = 0;
2029#endif
2030 wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt =
2031 initScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002032 for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
2033 {
2034 wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2035 initScanParams->scanEntry.bssIdx[i] ;
2036 }
2037
2038 /* if Frame length, copy macMgmtHdr or WDI structure */
2039 if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength)
2040 {
2041 vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr,
2042 &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ;
2043 }
2044 wdiInitScanParam->wdiReqStatusCB = NULL ;
2045
Jeff Johnson295189b2012-06-20 16:38:30 -07002046 /* Store Init Req pointer, as this will be used for response */
2047 pWdaParams->pWdaContext = pWDA;
2048 pWdaParams->wdaMsgParam = initScanParams;
2049 pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 /* first try to suspend TX */
2051 status = WDA_SuspendDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002052 if(WDI_STATUS_SUCCESS != status)
2053 {
2054 goto handleWdiFailure;
2055 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002056 /* call DAL API to pass init scan request to DAL */
2057 status = WDI_InitScanReq(wdiInitScanParam,
2058 WDA_InitScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002059 if(IS_WDI_STATUS_FAILURE(status))
2060 {
2061 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2062 "error in WDA Init Scan, Resume Tx " );
2063 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002064 VOS_ASSERT(0) ;
2065
2066 goto handleWdiFailure;
2067 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002068 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002069handleWdiFailure:
2070 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2071 "Failure in WDI Api, free all the memory " );
2072 /* free WDI command buffer */
2073 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2074 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002075 /* send Failure to PE */
2076 initScanParams->status = eSIR_FAILURE ;
2077 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 return CONVERT_WDI2VOS_STATUS(status) ;
2079}
2080
Jeff Johnson295189b2012-06-20 16:38:30 -07002081/*
2082 * FUNCTION: WDA_StartScanReqCallback
2083 * send Start SCAN RSP back to PE
2084 */
2085void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp,
2086 void* pUserData)
2087{
2088 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2089 tWDA_CbContext *pWDA;
2090 tStartScanParams *pWDA_ScanParam;
2091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2092 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 if(NULL == pWdaParams)
2094 {
2095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2096 "%s: pWdaParams received NULL", __FUNCTION__);
2097 VOS_ASSERT(0) ;
2098 return ;
2099 }
2100 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2101 pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 if(NULL == pWDA_ScanParam)
2103 {
2104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2105 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2106 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002107 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 return ;
2109 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002110 if(NULL == pWdaParams->wdaWdiApiMsgParam)
2111 {
2112 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2113 "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
2114 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002115 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002116 return ;
2117 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2119 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002120
Jeff Johnson295189b2012-06-20 16:38:30 -07002121
2122 /* assign status to scan params */
2123 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002124 /* send SCAN RSP message back to PE */
2125 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002126 return ;
2127}
2128
Jeff Johnson295189b2012-06-20 16:38:30 -07002129/*
2130 * FUNCTION: WDA_ProcessStartScanReq
2131 * Trigger start SCAN in WDI
2132 */
2133VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA,
2134 tStartScanParams *startScanParams)
2135{
2136 WDI_Status status = WDI_STATUS_SUCCESS;
2137 WDI_StartScanReqParamsType *wdiStartScanParams =
2138 (WDI_StartScanReqParamsType *)vos_mem_malloc(
2139 sizeof(WDI_StartScanReqParamsType)) ;
2140 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2142 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002143 if(NULL == wdiStartScanParams)
2144 {
2145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2146 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2147 VOS_ASSERT(0);
2148 return VOS_STATUS_E_NOMEM;
2149 }
2150 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2151 if(NULL == pWdaParams)
2152 {
2153 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2154 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2155 VOS_ASSERT(0);
2156 vos_mem_free(wdiStartScanParams);
2157 return VOS_STATUS_E_NOMEM;
2158 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002159 /* Copy init Scan params to WDI structure */
2160 wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
2161 wdiStartScanParams->wdiReqStatusCB = NULL ;
2162
Jeff Johnson295189b2012-06-20 16:38:30 -07002163 /* Store Init Req pointer, as this will be used for response */
2164 /* store Params pass it to WDI */
2165 pWdaParams->pWdaContext = pWDA;
2166 pWdaParams->wdaMsgParam = startScanParams;
2167 pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002168 /* call DAL API to pass init scan request to DAL */
2169 status = WDI_StartScanReq(wdiStartScanParams,
2170 WDA_StartScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002171 /* failure returned by WDI API */
2172 if(IS_WDI_STATUS_FAILURE(status))
2173 {
2174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2175 "Failure in Start Scan WDI API, free all the memory "
2176 "It should be due to previous abort scan." );
2177 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2178 vos_mem_free(pWdaParams) ;
2179 startScanParams->status = eSIR_FAILURE ;
2180 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
2181 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002182 return CONVERT_WDI2VOS_STATUS(status) ;
2183}
Jeff Johnson295189b2012-06-20 16:38:30 -07002184/*
2185 * FUNCTION: WDA_EndScanReqCallback
2186 * END SCAN callback
2187 */
2188void WDA_EndScanReqCallback(WDI_Status status, void* pUserData)
2189{
2190 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2191 tWDA_CbContext *pWDA;
2192 tEndScanParams *endScanParam;
2193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2194 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002195 if(NULL == pWdaParams)
2196 {
2197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2198 "%s: pWdaParams received NULL", __FUNCTION__);
2199 VOS_ASSERT(0) ;
2200 return ;
2201 }
2202 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2203 endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002204 if(NULL == endScanParam)
2205 {
2206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2207 "%s: endScanParam received NULL", __FUNCTION__);
2208 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002209 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2210 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 return ;
2212 }
2213
2214 /* Free WDI command buffer */
2215 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2216 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002217 /* assign status to scan params */
2218 endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002219 /* send response back to PE */
2220 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
2221 return ;
2222}
2223
Jeff Johnson295189b2012-06-20 16:38:30 -07002224/*
2225 * FUNCTION: WDA_ProcessEndScanReq
2226 * Trigger END SCAN in WDI
2227 */
2228VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA,
2229 tEndScanParams *endScanParams)
2230{
2231 WDI_Status status = WDI_STATUS_SUCCESS;
2232 WDI_EndScanReqParamsType *wdiEndScanParams =
2233 (WDI_EndScanReqParamsType *)vos_mem_malloc(
2234 sizeof(WDI_EndScanReqParamsType)) ;
2235 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2237 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002238 if(NULL == wdiEndScanParams)
2239 {
2240 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2241 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2242 VOS_ASSERT(0);
2243 return VOS_STATUS_E_NOMEM;
2244 }
2245 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2246 if(NULL == pWdaParams)
2247 {
2248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2249 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2250 VOS_ASSERT(0);
2251 vos_mem_free(wdiEndScanParams);
2252 return VOS_STATUS_E_NOMEM;
2253 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002254 /* Copy init Scan params to WDI structure */
2255 wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
2256 wdiEndScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002257 /* Store Init Req pointer, as this will be used for response */
2258 /* store Params pass it to WDI */
2259 pWdaParams->pWdaContext = pWDA;
2260 pWdaParams->wdaMsgParam = endScanParams;
2261 pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002262 /* call DAL API to pass init scan request to DAL */
2263 status = WDI_EndScanReq(wdiEndScanParams,
2264 WDA_EndScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002265 if(IS_WDI_STATUS_FAILURE(status))
2266 {
2267 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2268 "Failure in End Scan WDI API, free all the memory "
2269 "It should be due to previous abort scan." );
2270 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2271 vos_mem_free(pWdaParams) ;
2272 endScanParams->status = eSIR_FAILURE ;
2273 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
2274 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002275 return CONVERT_WDI2VOS_STATUS(status) ;
2276}
Jeff Johnson295189b2012-06-20 16:38:30 -07002277/*
2278 * FUNCTION: WDA_FinishScanReqCallback
2279 * Trigger Finish SCAN callback
2280 */
2281void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2282{
2283 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2284 tWDA_CbContext *pWDA;
2285 tFinishScanParams *finishScanParam;
2286 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07002287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2288 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002289 if(NULL == pWdaParams)
2290 {
2291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2292 "%s: pWdaParams received NULL", __FUNCTION__);
2293 VOS_ASSERT(0) ;
2294 return ;
2295 }
2296
2297 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2298 finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002299 if(NULL == finishScanParam)
2300 {
2301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2302 "%s: finishScanParam is NULL", __FUNCTION__);
2303 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002304 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2305 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002306 return ;
2307 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002308 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2309 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002310 /*
2311 * Now Resume TX, if we reached here means, TX is already suspended, we
2312 * have to resume it unconditionaly
2313 */
2314 status = WDA_ResumeDataTx(pWDA) ;
2315
2316 if(VOS_STATUS_SUCCESS != status)
2317 {
2318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2319 "%s error in Resume Tx ", __FUNCTION__ );
2320 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002322 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
2323 return ;
2324}
Jeff Johnson295189b2012-06-20 16:38:30 -07002325/*
2326 * FUNCTION: WDA_ProcessFinshScanReq
2327 * Trigger Finish SCAN in WDI
2328 */
2329VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA,
2330 tFinishScanParams *finishScanParams)
2331{
2332 WDI_Status status = WDI_STATUS_SUCCESS;
2333 WDI_FinishScanReqParamsType *wdiFinishScanParams =
2334 (WDI_FinishScanReqParamsType *)vos_mem_malloc(
2335 sizeof(WDI_FinishScanReqParamsType)) ;
2336 tWDA_ReqParams *pWdaParams ;
2337 tANI_U8 i = 0;
2338 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2339 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002340 if(NULL == wdiFinishScanParams)
2341 {
2342 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2343 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2344 VOS_ASSERT(0);
2345 return VOS_STATUS_E_NOMEM;
2346 }
2347 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2348 if(NULL == pWdaParams)
2349 {
2350 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2351 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2352 VOS_ASSERT(0);
2353 vos_mem_free(wdiFinishScanParams);
2354 return VOS_STATUS_E_NOMEM;
2355 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002356 /* Copy init Scan params to WDI structure */
2357 wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
2358 vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID,
2359 finishScanParams->bssid, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002360 wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
2361 wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
2362 wdiFinishScanParams->wdiReqInfo.ucFrameLength =
2363 finishScanParams->frameLength ;
2364 wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel =
2365 finishScanParams->currentOperChannel ;
2366 wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
2367 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt =
2368 finishScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002369 for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
2370 {
2371 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2372 finishScanParams->scanEntry.bssIdx[i] ;
2373 }
2374
2375
Jeff Johnson295189b2012-06-20 16:38:30 -07002376 /* if Frame length, copy macMgmtHdr ro WDI structure */
2377 if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
2378 {
2379 vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr,
2380 &finishScanParams->macMgmtHdr,
2381 sizeof(WDI_MacMgmtHdr)) ;
2382 }
2383 wdiFinishScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002384 /* Store Init Req pointer, as this will be used for response */
2385 /* store Params pass it to WDI */
2386 pWdaParams->pWdaContext = pWDA;
2387 pWdaParams->wdaMsgParam = finishScanParams;
2388 pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002389 /* call DAL API to pass init scan request to DAL */
2390 status = WDI_FinishScanReq(wdiFinishScanParams,
2391 WDA_FinishScanReqCallback, pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002392
Jeff Johnson295189b2012-06-20 16:38:30 -07002393
2394 /*
2395 * WDI API returns failure..
2396 */
2397 if(IS_WDI_STATUS_FAILURE( status))
2398 {
2399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2400 "Failure in Finish Scan WDI API, free all the memory " );
2401 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2402 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002403 finishScanParams->status = eSIR_FAILURE ;
2404 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
2405 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002406 return CONVERT_WDI2VOS_STATUS(status) ;
2407}
Jeff Johnson295189b2012-06-20 16:38:30 -07002408/*---------------------------------------------------------------------
2409 * ASSOC API's
2410 *---------------------------------------------------------------------
2411 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002412/*
2413 * FUNCTION: WDA_JoinReqCallback
2414 * Trigger Init SCAN callback
2415 */
2416void WDA_JoinReqCallback(WDI_Status status, void* pUserData)
2417{
2418 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2419 tWDA_CbContext *pWDA;
2420 tSwitchChannelParams *joinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002421 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2422 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002423 if(NULL == pWdaParams)
2424 {
2425 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2426 "%s: pWdaParams received NULL", __FUNCTION__);
2427 VOS_ASSERT(0) ;
2428 return ;
2429 }
2430 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2431 joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002432 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2433 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 /* reset macBSSID */
2435 vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002436 /* reset macSTASelf */
2437 vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002438 joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002439 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002440 return ;
2441}
Jeff Johnson295189b2012-06-20 16:38:30 -07002442/*
2443 * FUNCTION: WDA_ProcessJoinReq
2444 * Trigger Join REQ in WDI
2445 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002446VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA,
2447 tSwitchChannelParams* joinReqParam)
2448{
2449 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002450 WDI_JoinReqParamsType *wdiJoinReqParam =
2451 (WDI_JoinReqParamsType *)vos_mem_malloc(
2452 sizeof(WDI_JoinReqParamsType)) ;
2453 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2455 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002456 if(NULL == wdiJoinReqParam)
2457 {
2458 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2459 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2460 VOS_ASSERT(0);
2461 return VOS_STATUS_E_NOMEM;
2462 }
2463 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2464 if(NULL == pWdaParams)
2465 {
2466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2467 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2468 VOS_ASSERT(0);
2469 vos_mem_free(wdiJoinReqParam);
2470 return VOS_STATUS_E_NOMEM;
2471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002472 /* copy the BSSID for pWDA */
2473 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID,
2474 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf,
2476 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002477 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel =
2478 joinReqParam->channelNumber ;
2479#ifndef WLAN_FEATURE_VOWIFI
2480 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint =
2481 joinReqParam->localPowerConstraint ;
2482#endif
2483 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset =
2484 joinReqParam->secondaryChannelOffset ;
2485 wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
2486
2487 wdiJoinReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002488 /* Store Init Req pointer, as this will be used for response */
2489 /* store Params pass it to WDI */
2490 pWdaParams->pWdaContext = pWDA;
2491 pWdaParams->wdaMsgParam = joinReqParam;
2492 pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002493 status = WDI_JoinReq(wdiJoinReqParam,
2494 (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002495 if(IS_WDI_STATUS_FAILURE(status))
2496 {
2497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2498 "Failure in Join WDI API, free all the memory " );
2499 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2500 vos_mem_free(pWdaParams) ;
2501 joinReqParam->status = eSIR_FAILURE ;
2502 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2503 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002504 return CONVERT_WDI2VOS_STATUS(status) ;
2505}
Jeff Johnson295189b2012-06-20 16:38:30 -07002506/*
2507 * FUNCTION: WDA_SwitchChannelReqCallback
2508 * send Switch channel RSP back to PE
2509 */
2510void WDA_SwitchChannelReqCallback(
2511 WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData)
2512{
2513 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
2514 tWDA_CbContext *pWDA;
2515 tSwitchChannelParams *pSwitchChanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2517 "<------ %s " ,__FUNCTION__);
2518 if(NULL == pWdaParams)
2519 {
2520 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2521 "%s: pWdaParams received NULL", __FUNCTION__);
2522 VOS_ASSERT(0) ;
2523 return ;
2524 }
2525 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2526 pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2527
2528#ifdef WLAN_FEATURE_VOWIFI
2529 pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower;
2530#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002531 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2532 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002533 pSwitchChanParams->status =
2534 CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002535 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 return ;
2537}
Jeff Johnson295189b2012-06-20 16:38:30 -07002538/*
2539 * FUNCTION: WDA_ProcessChannelSwitchReq
2540 * Request to WDI to switch channel REQ params.
2541 */
2542VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA,
2543 tSwitchChannelParams *pSwitchChanParams)
2544{
2545 WDI_Status status = WDI_STATUS_SUCCESS ;
2546 WDI_SwitchChReqParamsType *wdiSwitchChanParam =
2547 (WDI_SwitchChReqParamsType *)vos_mem_malloc(
2548 sizeof(WDI_SwitchChReqParamsType)) ;
2549 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2551 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002552 if(NULL == wdiSwitchChanParam)
2553 {
2554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2555 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2556 VOS_ASSERT(0);
2557 return VOS_STATUS_E_NOMEM;
2558 }
2559 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2560 if(NULL == pWdaParams)
2561 {
2562 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2563 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2564 VOS_ASSERT(0);
2565 vos_mem_free(wdiSwitchChanParam);
2566 return VOS_STATUS_E_NOMEM;
2567 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002568 wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
2569#ifndef WLAN_FEATURE_VOWIFI
2570 wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint =
2571 pSwitchChanParams->localPowerConstraint;
2572#endif
2573 wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset =
2574 pSwitchChanParams->secondaryChannelOffset;
2575 wdiSwitchChanParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002576 /* Store req pointer, as this will be used for response */
2577 /* store Params pass it to WDI */
2578 pWdaParams->pWdaContext = pWDA;
2579 pWdaParams->wdaMsgParam = pSwitchChanParams;
2580 pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002581#ifdef WLAN_FEATURE_VOWIFI
2582 wdiSwitchChanParam->wdiChInfo.cMaxTxPower
2583 = pSwitchChanParams->maxTxPower;
2584 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr,
2585 pSwitchChanParams ->selfStaMacAddr,
2586 sizeof(tSirMacAddr));
2587#endif
2588 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId,
2589 pSwitchChanParams->bssId,
2590 sizeof(tSirMacAddr));
2591
2592 status = WDI_SwitchChReq(wdiSwitchChanParam,
2593 (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002594 if(IS_WDI_STATUS_FAILURE(status))
2595 {
2596 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2597 "Failure in process channel switch Req WDI API, free all the memory " );
2598 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2599 vos_mem_free(pWdaParams) ;
2600 pSwitchChanParams->status = eSIR_FAILURE ;
2601 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
2602 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002603 return CONVERT_WDI2VOS_STATUS(status) ;
2604}
Jeff Johnson295189b2012-06-20 16:38:30 -07002605/*
2606 * FUNCTION: WDA_ConfigBssReqCallback
2607 * config BSS Req Callback, called by WDI
2608 */
2609void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp
2610 ,void* pUserData)
2611{
2612 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2613 tWDA_CbContext *pWDA;
2614 tAddBssParams *configBssReqParam;
2615 tAddStaParams *staConfigBssParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2617 "<------ %s " ,__FUNCTION__);
2618 if(NULL == pWdaParams)
2619 {
2620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2621 "%s: pWdaParams received NULL", __FUNCTION__);
2622 VOS_ASSERT(0) ;
2623 return ;
2624 }
2625 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2626 configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
2627 staConfigBssParam = &configBssReqParam->staContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002628 configBssReqParam->status =
2629 CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07002630 if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
2631 {
2632 vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID,
2633 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002634 configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2635 configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
2636 configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
2637
2638 if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA)
2639 {
2640 if(configBssReqParam->bssType == eSIR_IBSS_MODE)
2641 {
2642 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE;
2643 staConfigBssParam->staType = STA_ENTRY_BSSID;
2644 }
2645 else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) &&
2646 (staConfigBssParam->staType == STA_ENTRY_SELF))
2647 {
2648 /* This is the 1st add BSS Req for the BTAMP STA */
2649 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2650 staConfigBssParam->staType = STA_ENTRY_BSSID;
2651 }
2652 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2653 (staConfigBssParam->staType == STA_ENTRY_PEER))
2654 {
2655 /* This is the 2nd ADD BSS Request that is sent
2656 * on the BTAMP STA side. The Sta type is
2657 * set to STA_ENTRY_PEER here.*/
2658 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2659 }
2660 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2661 (staConfigBssParam->staType == STA_ENTRY_SELF))
2662 {
2663 /* statype is already set by PE.
2664 * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/
2665 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE;
2666 staConfigBssParam->staType = STA_ENTRY_BSSID;
2667 }
2668 else
2669 {
2670 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE;
2671 staConfigBssParam->staType = STA_ENTRY_PEER;
2672 }
2673 }
2674 else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP)
2675 {
2676 pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE;
2677 staConfigBssParam->staType = STA_ENTRY_SELF;
2678 }
2679 else
2680 {
2681 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2682 "Invalid operation mode specified");
2683 VOS_ASSERT(0);
2684 }
2685
2686 staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002687 staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002688 staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002689 staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002690 vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
2691 sizeof(tSirMacAddr));
2692 staConfigBssParam->txChannelWidthSet =
2693 configBssReqParam->txChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 if(staConfigBssParam->staType == STA_ENTRY_PEER &&
2695 staConfigBssParam->htCapable)
2696 {
2697 pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx =
2698 wdiConfigBssRsp->ucBSSIdx;
2699 pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex =
2700 WDA_VALID_STA_INDEX ;
2701 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002702 if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
2703 wdiConfigBssRsp->ucBSSIdx,
2704 wdiConfigBssRsp->ucSTAIdx))
2705 {
2706 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2707 "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
2708 VOS_ASSERT(0) ;
2709 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002710 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
2711 {
2712 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2713 "%s: add BSS into mempool fail", __FUNCTION__);
2714 VOS_ASSERT(0) ;
2715 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002716#ifdef WLAN_FEATURE_VOWIFI
2717 configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
2718#endif
2719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002720 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2721 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002722 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002723 return ;
2724}
Jeff Johnson295189b2012-06-20 16:38:30 -07002725/*
2726 * FUNCTION: WDA_UpdateEdcaParamsForAC
2727 * Update WDI EDCA params with PE edca params
2728 */
2729void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA,
2730 WDI_EdcaParamRecord *wdiEdcaParam,
2731 tSirMacEdcaParamRecord *macEdcaParam)
2732{
2733 wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn;
2734 wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm;
2735 wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci;
2736 wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min;
2737 wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
2738 wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
2739}
Jeff Johnson295189b2012-06-20 16:38:30 -07002740/*
2741 * FUNCTION: WDA_ProcessConfigBssReq
2742 * Configure BSS before starting Assoc with AP
2743 */
2744VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA,
2745 tAddBssParams* configBssReqParam)
2746{
2747 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002748 WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
2749 (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
2750 sizeof(WDI_ConfigBSSReqParamsType)) ;
2751 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2753 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002754 if(NULL == wdiConfigBssReqParam)
2755 {
2756 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2757 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2758 VOS_ASSERT(0);
2759 return VOS_STATUS_E_NOMEM;
2760 }
2761 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2762 if(NULL == pWdaParams)
2763 {
2764 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2765 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2766 VOS_ASSERT(0);
2767 vos_mem_free(wdiConfigBssReqParam);
2768 return VOS_STATUS_E_NOMEM;
2769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002771 WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo,
2772 configBssReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002773 /* Store Init Req pointer, as this will be used for response */
2774 /* store Params pass it to WDI */
2775 pWdaParams->pWdaContext = pWDA;
2776 pWdaParams->wdaMsgParam = configBssReqParam;
2777 pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 status = WDI_ConfigBSSReq(wdiConfigBssReqParam,
2779 (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 if(IS_WDI_STATUS_FAILURE(status))
2781 {
2782 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2783 "Failure in Config BSS WDI API, free all the memory " );
2784 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2785 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 configBssReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002787 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
2788 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002789 return CONVERT_WDI2VOS_STATUS(status) ;
2790}
Jeff Johnson295189b2012-06-20 16:38:30 -07002791#ifdef ENABLE_HAL_COMBINED_MESSAGES
2792/*
2793 * FUNCTION: WDA_PostAssocReqCallback
2794 * Post ASSOC req callback, send RSP back to PE
2795 */
2796void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp,
2797 void* pUserData)
2798{
2799 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
2800 tPostAssocParams *postAssocReqParam =
2801 (tPostAssocParams *)pWDA->wdaMsgParam ;
2802 /*STA context within the BSS Params*/
2803 tAddStaParams *staPostAssocParam =
2804 &postAssocReqParam->addBssParams.staContext ;
2805 /*STA Params for self STA*/
2806 tAddStaParams *selfStaPostAssocParam =
2807 &postAssocReqParam->addStaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2809 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002810 postAssocReqParam->status =
2811 CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002812 if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
2813 {
2814 staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
2815 vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA,
2816 sizeof(tSirMacAddr)) ;
2817 staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
2818 staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
2819 staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
2821 }
2822 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2823 pWDA->wdaWdiApiMsgParam = NULL;
2824 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002825 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002826 return ;
2827}
Jeff Johnson295189b2012-06-20 16:38:30 -07002828/*
2829 * FUNCTION: WDA_ProcessPostAssocReq
2830 * Trigger POST ASSOC processing in WDI
2831 */
2832VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA,
2833 tPostAssocParams *postAssocReqParam)
2834{
Jeff Johnson295189b2012-06-20 16:38:30 -07002835 WDI_Status status = WDI_STATUS_SUCCESS ;
2836
2837 WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
2838 (WDI_PostAssocReqParamsType *)vos_mem_malloc(
2839 sizeof(WDI_PostAssocReqParamsType)) ;
2840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2841 "------> %s " ,__FUNCTION__);
2842
Jeff Johnson295189b2012-06-20 16:38:30 -07002843 if(NULL == wdiPostAssocReqParam)
2844 {
2845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2846 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2847 VOS_ASSERT(0);
2848 return VOS_STATUS_E_NOMEM;
2849 }
2850
2851 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
2852 {
2853 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2854 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
2855 VOS_ASSERT(0);
2856 return VOS_STATUS_E_FAILURE;
2857 }
2858
Jeff Johnson295189b2012-06-20 16:38:30 -07002859 /* update BSS params into WDI structure */
2860 WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams,
2861 &postAssocReqParam->addBssParams) ;
2862 /* update STA params into WDI structure */
2863 WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams,
2864 &postAssocReqParam->addStaParams) ;
2865
2866 wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid =
2867 postAssocReqParam->addBssParams.highPerformance;
2868 WDA_UpdateEdcaParamsForAC(pWDA,
2869 &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams,
2870 &postAssocReqParam->addBssParams.acbe);
2871 WDA_UpdateEdcaParamsForAC(pWDA,
2872 &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams,
2873 &postAssocReqParam->addBssParams.acbk);
2874 WDA_UpdateEdcaParamsForAC(pWDA,
2875 &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams,
2876 &postAssocReqParam->addBssParams.acvi);
2877 WDA_UpdateEdcaParamsForAC(pWDA,
2878 &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
2879 &postAssocReqParam->addBssParams.acvo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002880 /* Store Init Req pointer, as this will be used for response */
2881 pWDA->wdaMsgParam = (void *)postAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002882 /* store Params pass it to WDI */
2883 pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002884 status = WDI_PostAssocReq(wdiPostAssocReqParam,
2885 (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002886 if(IS_WDI_STATUS_FAILURE(status))
2887 {
2888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2889 "Failure in Post Assoc WDI API, free all the memory " );
2890 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2891 pWDA->wdaWdiApiMsgParam = NULL;
2892 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002893 postAssocReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002894 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
2895 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002896 return CONVERT_WDI2VOS_STATUS(status) ;
2897}
2898#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002899/*
2900 * FUNCTION: WDA_AddStaReqCallback
2901 * ADD STA req callback, send RSP back to PE
2902 */
2903void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp,
2904 void* pUserData)
2905{
2906 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2907 tWDA_CbContext *pWDA;
2908 tAddStaParams *addStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2910 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002911 if(NULL == pWdaParams)
2912 {
2913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
2914 VOS_ASSERT(0) ;
2915 return ;
2916 }
2917 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2918 addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002919 addStaReqParam->status =
2920 CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002921 if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
2922 {
2923 addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
2924 /*TODO: UMAC structure doesn't have these fields*/
2925 /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex;
2926 addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex;
2927 addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */
2928 addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig;
2929 addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig;
2930 /* update staIndex as valid index for BA if STA is HT capable*/
2931 if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable)
2932 {
2933 pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx =
2934 wdiConfigStaRsp->ucBssIdx;
2935 pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex =
2936 WDA_VALID_STA_INDEX ;
2937 }
2938 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx))
2939 {
2940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2941 "%s: add STA into mempool fail", __FUNCTION__);
2942 VOS_ASSERT(0) ;
2943 return ;
2944 }
2945 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002946 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2947 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002948 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002949 return ;
2950}
Jeff Johnson295189b2012-06-20 16:38:30 -07002951/*
2952 * FUNCTION: WDA_ConfigStaReq
2953 * Trigger Config STA processing in WDI
2954 */
2955VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA,
2956 tAddStaParams *addStaReqParam)
2957{
Jeff Johnson295189b2012-06-20 16:38:30 -07002958 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002959 WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
2960 (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
2961 sizeof(WDI_ConfigSTAReqParamsType)) ;
2962 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002963 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2964 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002965 if(NULL == wdiConfigStaReqParam)
2966 {
2967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2968 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2969 VOS_ASSERT(0);
2970 return VOS_STATUS_E_NOMEM;
2971 }
2972 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2973 if(NULL == pWdaParams)
2974 {
2975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2976 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2977 VOS_ASSERT(0);
2978 vos_mem_free(wdiConfigStaReqParam);
2979 return VOS_STATUS_E_NOMEM;
2980 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002981 vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002982 /* update STA params into WDI structure */
2983 WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo,
2984 addStaReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002985 /* Store Init Req pointer, as this will be used for response */
2986 /* store Params pass it to WDI */
2987 pWdaParams->pWdaContext = pWDA;
2988 pWdaParams->wdaMsgParam = addStaReqParam;
2989 pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002990 status = WDI_ConfigSTAReq(wdiConfigStaReqParam,
2991 (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002992 if(IS_WDI_STATUS_FAILURE(status))
2993 {
2994 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2995 "Failure in Config STA WDI API, free all the memory " );
2996 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2997 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002998 addStaReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002999 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3000 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003001 return CONVERT_WDI2VOS_STATUS(status) ;
3002}
Jeff Johnson295189b2012-06-20 16:38:30 -07003003/*
3004 * FUNCTION: WDA_DelBSSReqCallback
3005 * Dens DEL BSS RSP back to PE
3006 */
3007void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp,
3008 void* pUserData)
3009{
3010 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3011 tWDA_CbContext *pWDA;
3012 tDeleteBssParams *delBssReqParam;
3013 tANI_U8 staIdx,tid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3015 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003016 if(NULL == pWdaParams)
3017 {
3018 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3019 "%s: pWdaParams received NULL", __FUNCTION__);
3020 VOS_ASSERT(0) ;
3021 return ;
3022 }
3023 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3024 delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003025 delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003026 if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
3027 {
3028 vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID,
3029 sizeof(tSirMacAddr)) ;
3030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003031 if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
3032 {
3033 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3034 "%s: Get STA index from BSS index Fail", __FUNCTION__);
3035 VOS_ASSERT(0) ;
3036 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003037 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
3038 {
3039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3040 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3041 VOS_ASSERT(0) ;
3042 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003043 if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
3044 {
3045 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3046 "%s: Clear STA index form table Fail", __FUNCTION__);
3047 VOS_ASSERT(0) ;
3048 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003049 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3050 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003051 /* reset the the system role*/
3052 pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
3053
3054 /* Reset the BA related information */
3055 for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++)
3056 {
3057 if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx )
3058 {
3059 pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX;
3060 pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0;
3061 /* Reset framesTxed counters here */
3062 for(tid = 0; tid < STACFG_MAX_TC; tid++)
3063 {
3064 pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0;
3065 }
3066 }
3067 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003068 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003069 return ;
3070}
3071
Jeff Johnson295189b2012-06-20 16:38:30 -07003072/*
3073 * FUNCTION: WDA_ProcessDelBssReq
3074 * Init DEL BSS req with WDI
3075 */
3076VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA,
3077 tDeleteBssParams *delBssParam)
3078{
3079 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003080 WDI_DelBSSReqParamsType *wdiDelBssReqParam =
3081 (WDI_DelBSSReqParamsType *)vos_mem_malloc(
3082 sizeof(WDI_DelBSSReqParamsType)) ;
3083 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003084 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3085 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003086 if(NULL == wdiDelBssReqParam)
3087 {
3088 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3089 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3090 VOS_ASSERT(0);
3091 return VOS_STATUS_E_NOMEM;
3092 }
3093 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3094 if(NULL == pWdaParams)
3095 {
3096 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3097 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3098 VOS_ASSERT(0);
3099 vos_mem_free(wdiDelBssReqParam);
3100 return VOS_STATUS_E_NOMEM;
3101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
3103 wdiDelBssReqParam->wdiReqStatusCB = NULL ;
3104
3105 /* Store Init Req pointer, as this will be used for response */
3106 /* store Params pass it to WDI */
3107 pWdaParams->pWdaContext = pWDA;
3108 pWdaParams->wdaMsgParam = delBssParam;
3109 pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003110 status = WDI_DelBSSReq(wdiDelBssReqParam,
3111 (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003112 if(IS_WDI_STATUS_FAILURE(status))
3113 {
3114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3115 "Failure in Del BSS WDI API, free all the memory " );
3116 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3117 vos_mem_free(pWdaParams) ;
3118 delBssParam->status = eSIR_FAILURE ;
3119 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
3120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003121 return CONVERT_WDI2VOS_STATUS(status) ;
3122}
Jeff Johnson295189b2012-06-20 16:38:30 -07003123/*
3124 * FUNCTION: WDA_DelSTAReqCallback
3125 * Dens DEL STA RSP back to PE
3126 */
3127void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp,
3128 void* pUserData)
3129{
3130 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3131 tWDA_CbContext *pWDA;
3132 tDeleteStaParams *delStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3134 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003135 if(NULL == pWdaParams)
3136 {
3137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3138 "%s: pWdaParams received NULL", __FUNCTION__);
3139 VOS_ASSERT(0) ;
3140 return ;
3141 }
3142 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3143 delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003144 delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003145 if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
3146 {
3147 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
3148 {
3149 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3150 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3151 VOS_ASSERT(0) ;
3152 }
3153 delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ;
3154 }
3155 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3156 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003157 /*Reset the BA information corresponding to this STAIdx */
3158 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex =
3159 WDA_INVALID_STA_INDEX;
3160 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
3161
3162 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003163 return ;
3164}
Jeff Johnson295189b2012-06-20 16:38:30 -07003165/*
3166 * FUNCTION: WDA_ProcessDelStaReq
3167 * Init DEL STA req with WDI
3168 */
3169VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA,
3170 tDeleteStaParams *delStaParam)
3171{
3172 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003173 WDI_DelSTAReqParamsType *wdiDelStaReqParam =
3174 (WDI_DelSTAReqParamsType *)vos_mem_malloc(
3175 sizeof(WDI_DelSTAReqParamsType)) ;
3176 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003177 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3178 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003179 if(NULL == wdiDelStaReqParam)
3180 {
3181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3183 VOS_ASSERT(0);
3184 return VOS_STATUS_E_NOMEM;
3185 }
3186 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3187 if(NULL == pWdaParams)
3188 {
3189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3190 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3191 VOS_ASSERT(0);
3192 vos_mem_free(wdiDelStaReqParam);
3193 return VOS_STATUS_E_NOMEM;
3194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003195 wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
3196 wdiDelStaReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003197 /* Store Init Req pointer, as this will be used for response */
3198 /* store Params pass it to WDI */
3199 pWdaParams->pWdaContext = pWDA;
3200 pWdaParams->wdaMsgParam = delStaParam;
3201 pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003202 status = WDI_DelSTAReq(wdiDelStaReqParam,
3203 (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 if(IS_WDI_STATUS_FAILURE(status))
3205 {
3206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3207 "Failure in Del STA WDI API, free all the memory status = %d",
3208 status );
3209 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3210 vos_mem_free(pWdaParams) ;
3211 delStaParam->status = eSIR_FAILURE ;
3212 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
3213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003214 return CONVERT_WDI2VOS_STATUS(status) ;
3215}
Jeff Johnson295189b2012-06-20 16:38:30 -07003216void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
3217{
3218 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3219 tWDA_CbContext *pWDA;
3220 tAddStaSelfParams *pAddStaSelfRsp = NULL;
3221 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3222 "<------ %s " ,__FUNCTION__);
3223 if(NULL == pWdaParams)
3224 {
3225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3226 "%s: pWdaParams received NULL", __FUNCTION__);
3227 VOS_ASSERT(0) ;
3228 return ;
3229 }
3230 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3231 pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003232 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3233 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003234 pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
3235 vos_mem_copy(pAddStaSelfRsp->selfMacAddr,
3236 pwdiAddSTASelfRsp->macSelfSta,
3237 sizeof(pAddStaSelfRsp->selfMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003238 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 return ;
3240}
Jeff Johnson295189b2012-06-20 16:38:30 -07003241/*
3242 * FUNCTION: WDA_ProcessAddStaSelfReq
3243 *
3244 */
3245VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq)
3246{
3247 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003248 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003249 WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq =
3250 (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
3251 sizeof(WDI_AddSTASelfReqParamsType)) ;
3252 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003253 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3254 "------> %s " ,__FUNCTION__);
3255 if( NULL == wdiAddStaSelfReq )
3256 {
3257 VOS_ASSERT( 0 );
3258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3259 "%s: Unable to allocate memory " ,__FUNCTION__);
3260 return( VOS_STATUS_E_NOMEM );
3261 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003263 if( NULL == pWdaParams )
3264 {
3265 VOS_ASSERT( 0 );
3266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3267 "%s: Unable to allocate memory " ,__FUNCTION__);
3268 vos_mem_free(wdiAddStaSelfReq) ;
3269 return( VOS_STATUS_E_NOMEM );
3270 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003271 wdiAddStaSelfReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
3273 /* Store Init Req pointer, as this will be used for response */
3274 /* store Params pass it to WDI */
3275 pWdaParams->pWdaContext = pWDA;
3276 pWdaParams->wdaMsgParam = pAddStaSelfReq;
3277 pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq;
Jeff Johnson43971f52012-07-17 12:26:56 -07003278 wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003279
Jeff Johnson43971f52012-07-17 12:26:56 -07003280 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003281 {
3282 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3283 "Failure in Add Self Sta Request API, free all the memory status = %d",
Jeff Johnson43971f52012-07-17 12:26:56 -07003284 wstatus );
3285 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003286 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3287 vos_mem_free(pWdaParams) ;
3288 pAddStaSelfReq->status = eSIR_FAILURE ;
3289 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
3290 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003291 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003292}
Jeff Johnson295189b2012-06-20 16:38:30 -07003293/*
3294 * FUNCTION: WDA_DelSTASelfRespCallback
3295 *
3296 */
3297void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType *
3298 wdiDelStaSelfRspParams , void* pUserData)
3299{
3300 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3301 tWDA_CbContext *pWDA;
3302 tDelStaSelfParams *delStaSelfParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003303 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3304 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003305 if (NULL == pWdaParams)
3306 {
3307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3308 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3309 VOS_ASSERT(0);
3310 return;
3311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003312 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3313 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003314 delStaSelfParams->status =
3315 CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
3316
3317 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3318 vos_mem_free(pWdaParams) ;
3319
3320 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003321 return ;
3322}
Jeff Johnson295189b2012-06-20 16:38:30 -07003323/*
3324 * FUNCTION: WDA_DelSTASelfReqCallback
3325 *
3326 */
3327void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus,
3328 void* pUserData)
3329{
3330 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3331 tWDA_CbContext *pWDA;
3332 tDelStaSelfParams *delStaSelfParams;
3333
3334 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3335 "<------ %s, wdiStatus: %d pWdaParams: 0x%x",
3336 __FUNCTION__, wdiStatus, pWdaParams);
3337
3338 if (NULL == pWdaParams)
3339 {
3340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3341 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3342 VOS_ASSERT(0);
3343 return;
3344 }
3345
3346 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3347 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3348
3349 delStaSelfParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
3350
3351 if(IS_WDI_STATUS_FAILURE(wdiStatus))
3352 {
3353 VOS_ASSERT(0);
3354 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3355 vos_mem_free(pWdaParams) ;
3356 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3357 }
3358
3359 return ;
3360}
3361
3362/*
3363 * FUNCTION: WDA_DelSTASelfReq
3364 * Trigger Config STA processing in WDI
3365 */
3366VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA,
3367 tDelStaSelfParams* pDelStaSelfReqParam)
3368{
3369 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003370 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003371 tWDA_ReqParams *pWdaParams = NULL;
3372 WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq =
3373 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
3374 sizeof(WDI_DelSTASelfReqParamsType)) ;
3375
Jeff Johnson295189b2012-06-20 16:38:30 -07003376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3377 "------> %s " ,__FUNCTION__);
3378 if( NULL == wdiDelStaSelfReq )
3379 {
3380 VOS_ASSERT( 0 );
3381 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3382 "%s: Unable to allocate memory " ,__FUNCTION__);
3383 return( VOS_STATUS_E_NOMEM );
3384 }
3385
3386 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3387 if( NULL == pWdaParams )
3388 {
3389 VOS_ASSERT( 0 );
3390 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3391 "%s: Unable to allocate memory " ,__FUNCTION__);
3392 vos_mem_free(wdiDelStaSelfReq) ;
3393 return( VOS_STATUS_E_NOMEM );
3394 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003395 pWdaParams->pWdaContext = pWDA;
3396 /* Store param pointer as passed in by caller */
3397 pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
3398 /* store Params pass it to WDI */
3399 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003400 vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr,
3401 pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
3402
3403 wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback;
3404 wdiDelStaSelfReq->pUserData = pWdaParams;
3405
Jeff Johnson43971f52012-07-17 12:26:56 -07003406 wstatus = WDI_DelSTASelfReq(wdiDelStaSelfReq,
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams);
3408
Jeff Johnson43971f52012-07-17 12:26:56 -07003409 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 {
3411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
3412 "Failure in Del Sta Self REQ WDI API, free all the memory " );
3413 VOS_ASSERT(0);
Jeff Johnson43971f52012-07-17 12:26:56 -07003414 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003415 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3416 vos_mem_free(pWdaParams) ;
3417 pDelStaSelfReqParam->status = eSIR_FAILURE ;
3418 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
3419 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003420 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003421}
3422
Jeff Johnson295189b2012-06-20 16:38:30 -07003423/*
3424 * FUNCTION: WDA_SendMsg
3425 * Send Message back to PE
3426 */
3427void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
3428 void *pBodyptr, tANI_U32 bodyVal)
3429{
3430 tSirMsgQ msg = {0} ;
3431 tANI_U32 status = VOS_STATUS_SUCCESS ;
3432 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 msg.type = msgType;
3434 msg.bodyval = bodyVal;
3435 msg.bodyptr = pBodyptr;
Jeff Johnson295189b2012-06-20 16:38:30 -07003436 status = limPostMsgApi(pMac, &msg);
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 if (VOS_STATUS_SUCCESS != status)
3438 {
3439 if(NULL != pBodyptr)
3440 {
3441 vos_mem_free(pBodyptr);
3442 }
3443 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3444 "%s: limPostMsgApi is failed " ,__FUNCTION__);
3445 VOS_ASSERT(0) ;
3446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003447 return ;
3448}
Jeff Johnson295189b2012-06-20 16:38:30 -07003449/*
3450 * FUNCTION: WDA_UpdateBSSParams
3451 * Translated WDA/PE BSS info into WDI BSS info..
3452 */
3453void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
3454 WDI_ConfigBSSReqInfoType *wdiBssParams,
3455 tAddBssParams *wdaBssParams)
3456{
3457 v_U8_t keyIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003458 /* copy bssReq Params to WDI structure */
3459 vos_mem_copy(wdiBssParams->macBSSID,
3460 wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
3461 vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr,
3462 sizeof(tSirMacAddr)) ;
3463 wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
3464 wdiBssParams->ucOperMode = wdaBssParams->operMode ;
3465 wdiBssParams->wdiNWType = wdaBssParams->nwType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003466 wdiBssParams->ucShortSlotTimeSupported =
3467 wdaBssParams->shortSlotTimeSupported ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003468 wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ;
3469 wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ;
3470 wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ;
3471 wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ;
3472 wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ;
3473
3474 wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
3475 wdiBssParams->ucTXOPProtectionFullSupport =
3476 wdaBssParams->fLsigTXOPProtectionFullSupport ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003477 wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
3478 wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003479 wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
3481 wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
3482 wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
3483 wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
3484
3485 /* copy SSID into WDI structure */
3486 wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
3487 vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
3488 wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003489 WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext,
3490 &wdaBssParams->staContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003491 wdiBssParams->wdiAction = wdaBssParams->updateBss;
Jeff Johnson295189b2012-06-20 16:38:30 -07003492#ifdef WLAN_FEATURE_VOWIFI
3493 wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
3494#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003495 wdiBssParams->ucPersona = wdaBssParams->halPersona;
Jeff Johnson295189b2012-06-20 16:38:30 -07003496 wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07003497#ifdef WLAN_FEATURE_VOWIFI_11R
3498 wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003499 if(wdiBssParams->bExtSetStaKeyParamValid)
3500 {
3501 /* copy set STA key params to WDI structure */
3502 wdiBssParams->wdiExtSetKeyParam.ucSTAIdx =
3503 wdaBssParams->extSetStaKeyParam.staIdx;
3504 wdiBssParams->wdiExtSetKeyParam.wdiEncType =
3505 wdaBssParams->extSetStaKeyParam.encType;
3506 wdiBssParams->wdiExtSetKeyParam.wdiWEPType =
3507 wdaBssParams->extSetStaKeyParam.wepType;
3508 wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx =
3509 wdaBssParams->extSetStaKeyParam.defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
3511 {
Jeff Johnson43971f52012-07-17 12:26:56 -07003512 if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07003513 (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) &&
3514 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
3515 {
3516 WDA_GetWepKeysFromCfg( pWDA,
3517 &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx,
3518 &wdiBssParams->wdiExtSetKeyParam.ucNumKeys,
3519 wdiBssParams->wdiExtSetKeyParam.wdiKey );
3520 }
3521 else
3522 {
3523#ifdef WLAN_SOFTAP_FEATURE
3524 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3525 keyIndex++)
3526 {
3527 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId =
3528 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId;
3529 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast =
3530 wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
3531 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
3532 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07003533 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
3534 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
3535 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
3536 wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole;
3537 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength =
3538 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength;
3539 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key,
3540 wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
3541 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003542 wdiBssParams->wdiExtSetKeyParam.ucNumKeys =
3543 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3544#else
3545 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyId =
3546 wdaBssParams->extSetStaKeyParam.key.keyId;
3547 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].unicast =
3548 wdaBssParams->extSetStaKeyParam.key.unicast;
3549 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyDirection =
3550 wdaBssParams->extSetStaKeyParam.key.keyDirection;
3551 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyRsc,
3552 wdaBssParams->extSetStaKeyParam.key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
3553 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].paeRole =
3554 wdaBssParams->extSetStaKeyParam.key.paeRole;
3555 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyLength =
3556 wdaBssParams->extSetStaKeyParam.key.keyLength;
3557 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].key,
3558 wdaBssParams->extSetStaKeyParam.key[keyIndex].key,
3559 SIR_MAC_MAX_KEY_LENGTH);
3560 wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 1;
3561#endif
3562 }
3563 }
3564 wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc;
3565 }
3566 else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */
3567 {
3568 vos_mem_zero( &wdaBssParams->extSetStaKeyParam,
3569 sizeof(wdaBssParams->extSetStaKeyParam) );
3570 }
3571#endif /*WLAN_FEATURE_VOWIFI_11R*/
Jeff Johnsone7245742012-09-05 17:12:55 -07003572#ifdef WLAN_FEATURE_11AC
3573 wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable;
3574 wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet;
3575#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003576
3577 return ;
3578}
Jeff Johnson295189b2012-06-20 16:38:30 -07003579/*
3580 * FUNCTION: WDA_UpdateSTAParams
3581 * Translated WDA/PE BSS info into WDI BSS info..
3582 */
3583void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
3584 WDI_ConfigStaReqInfoType *wdiStaParams,
3585 tAddStaParams *wdaStaParams)
3586{
3587 tANI_U8 i = 0;
3588 /* Update STA params */
3589 vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId,
3590 sizeof(tSirMacAddr)) ;
3591 wdiStaParams->usAssocId = wdaStaParams->assocId;
3592 wdiStaParams->wdiSTAType = wdaStaParams->staType;
3593
3594 wdiStaParams->ucShortPreambleSupported =
3595 wdaStaParams->shortPreambleSupported;
3596 vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac,
3597 sizeof(tSirMacAddr)) ;
3598 wdiStaParams->usListenInterval = wdaStaParams->listenInterval;
3599
3600 wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled;
3601
3602 wdiStaParams->ucHTCapable = wdaStaParams->htCapable;
3603 wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet;
3604 wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode;
3605 wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection;
3606 wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize;
3607 wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity;
3608 wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize;
3609
3610 wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
3611 wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
Jeff Johnson295189b2012-06-20 16:38:30 -07003612 wdiStaParams->wdiSupportedRates.opRateMode =
3613 wdaStaParams->supportedRates.opRateMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 for(i = 0;i < WDI_NUM_11B_RATES;i++)
3615 {
3616 wdiStaParams->wdiSupportedRates.llbRates[i] =
3617 wdaStaParams->supportedRates.llbRates[i];
3618 }
3619 for(i = 0;i < WDI_NUM_11A_RATES;i++)
3620 {
3621 wdiStaParams->wdiSupportedRates.llaRates[i] =
3622 wdaStaParams->supportedRates.llaRates[i];
3623 }
3624 for(i = 0;i < SIR_NUM_POLARIS_RATES;i++)
3625 {
3626 wdiStaParams->wdiSupportedRates.aLegacyRates[i] =
3627 wdaStaParams->supportedRates.aniLegacyRates[i];
3628 }
3629 wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap =
3630 wdaStaParams->supportedRates.aniEnhancedRateBitmap;
Jeff Johnsone7245742012-09-05 17:12:55 -07003631#ifdef WLAN_FEATURE_11AC
3632 wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap;
3633 wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate;
3634 wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap;
3635 wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate;
3636#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003637 for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
3638 {
3639 wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] =
3640 wdaStaParams->supportedRates.supportedMCSSet[i];
3641 }
3642 wdiStaParams->wdiSupportedRates.aRxHighestDataRate =
3643 wdaStaParams->supportedRates.rxHighestDataRate;
3644
3645 wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled;
3646
3647 wdiStaParams->wdiAction = wdaStaParams->updateSta;
3648
3649 wdiStaParams->ucAPSD = wdaStaParams->uAPSD;
3650 wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen;
3651 wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable;
3652
3653 wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport;
3654 wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration;
3655 wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz;
3656 wdiStaParams->ucEncryptType = wdaStaParams->encryptType;
3657#ifdef WLAN_FEATURE_P2P
3658 wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
3659#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07003660#ifdef WLAN_FEATURE_11AC
3661 wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable;
3662 wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet;
3663#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003664 return ;
3665}
Jeff Johnson295189b2012-06-20 16:38:30 -07003666/*
3667 * -------------------------------------------------------------------------
3668 * CFG update to WDI
3669 * -------------------------------------------------------------------------
3670 */
3671
3672 /*
3673 * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
3674 * Convert the WNI CFG ID to HAL CFG ID
3675 */
Jeff Johnsone7245742012-09-05 17:12:55 -07003676static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
Jeff Johnson295189b2012-06-20 16:38:30 -07003677{
3678 switch(wniCfgId)
3679 {
3680 case WNI_CFG_STA_ID:
3681 return QWLAN_HAL_CFG_STA_ID;
3682 case WNI_CFG_CURRENT_TX_ANTENNA:
3683 return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
3684 case WNI_CFG_CURRENT_RX_ANTENNA:
3685 return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
3686 case WNI_CFG_LOW_GAIN_OVERRIDE:
3687 return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
3688 case WNI_CFG_POWER_STATE_PER_CHAIN:
3689 return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
3690 case WNI_CFG_CAL_PERIOD:
3691 return QWLAN_HAL_CFG_CAL_PERIOD;
3692 case WNI_CFG_CAL_CONTROL:
3693 return QWLAN_HAL_CFG_CAL_CONTROL;
3694 case WNI_CFG_PROXIMITY:
3695 return QWLAN_HAL_CFG_PROXIMITY;
3696 case WNI_CFG_NETWORK_DENSITY:
3697 return QWLAN_HAL_CFG_NETWORK_DENSITY;
3698 case WNI_CFG_MAX_MEDIUM_TIME:
3699 return QWLAN_HAL_CFG_MAX_MEDIUM_TIME;
3700 case WNI_CFG_MAX_MPDUS_IN_AMPDU:
3701 return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU;
3702 case WNI_CFG_RTS_THRESHOLD:
3703 return QWLAN_HAL_CFG_RTS_THRESHOLD;
3704 case WNI_CFG_SHORT_RETRY_LIMIT:
3705 return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT;
3706 case WNI_CFG_LONG_RETRY_LIMIT:
3707 return QWLAN_HAL_CFG_LONG_RETRY_LIMIT;
3708 case WNI_CFG_FRAGMENTATION_THRESHOLD:
3709 return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD;
3710 case WNI_CFG_DYNAMIC_THRESHOLD_ZERO:
3711 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO;
3712 case WNI_CFG_DYNAMIC_THRESHOLD_ONE:
3713 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE;
3714 case WNI_CFG_DYNAMIC_THRESHOLD_TWO:
3715 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO;
3716 case WNI_CFG_FIXED_RATE:
3717 return QWLAN_HAL_CFG_FIXED_RATE;
3718 case WNI_CFG_RETRYRATE_POLICY:
3719 return QWLAN_HAL_CFG_RETRYRATE_POLICY;
3720 case WNI_CFG_RETRYRATE_SECONDARY:
3721 return QWLAN_HAL_CFG_RETRYRATE_SECONDARY;
3722 case WNI_CFG_RETRYRATE_TERTIARY:
3723 return QWLAN_HAL_CFG_RETRYRATE_TERTIARY;
3724 case WNI_CFG_FORCE_POLICY_PROTECTION:
3725 return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION;
3726 case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ:
3727 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ;
3728 case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ:
3729 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ;
3730 case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ:
3731 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ;
3732 case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ:
3733 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ;
3734 case WNI_CFG_MAX_BA_SESSIONS:
3735 return QWLAN_HAL_CFG_MAX_BA_SESSIONS;
3736 case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT:
3737 return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT;
3738 case WNI_CFG_PS_ENABLE_BCN_FILTER:
3739 return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER;
3740 case WNI_CFG_PS_ENABLE_RSSI_MONITOR:
3741 return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR;
3742 case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE:
3743 return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
3744 case WNI_CFG_STATS_PERIOD:
3745 return QWLAN_HAL_CFG_STATS_PERIOD;
3746 case WNI_CFG_CFP_MAX_DURATION:
3747 return QWLAN_HAL_CFG_CFP_MAX_DURATION;
3748#if 0 /*This is not part of CFG*/
3749 case WNI_CFG_FRAME_TRANS_ENABLED:
3750 return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED;
3751#endif
3752 case WNI_CFG_DTIM_PERIOD:
3753 return QWLAN_HAL_CFG_DTIM_PERIOD;
3754 case WNI_CFG_EDCA_WME_ACBK:
3755 return QWLAN_HAL_CFG_EDCA_WMM_ACBK;
3756 case WNI_CFG_EDCA_WME_ACBE:
3757 return QWLAN_HAL_CFG_EDCA_WMM_ACBE;
3758 case WNI_CFG_EDCA_WME_ACVI:
3759 return QWLAN_HAL_CFG_EDCA_WMM_ACVI;
3760 case WNI_CFG_EDCA_WME_ACVO:
3761 return QWLAN_HAL_CFG_EDCA_WMM_ACVO;
3762#if 0
3763 case WNI_CFG_TELE_BCN_WAKEUP_EN:
3764 return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN;
3765 case WNI_CFG_TELE_BCN_TRANS_LI:
3766 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI;
3767 case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS:
3768 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS;
3769 case WNI_CFG_TELE_BCN_MAX_LI:
3770 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI;
3771 case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS:
3772 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS;
3773#endif
3774 case WNI_CFG_ENABLE_CLOSE_LOOP:
3775 return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP;
3776 default:
3777 {
3778 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3779 "There is no HAL CFG Id corresponding to WNI CFG Id: %d\n",
3780 wniCfgId);
3781 return VOS_STATUS_E_INVAL;
3782 }
3783 }
3784}
Jeff Johnson295189b2012-06-20 16:38:30 -07003785/*
3786 * FUNCTION: WDA_UpdateCfgCallback
3787 *
3788 */
3789void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData)
3790{
3791 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
3792 WDI_UpdateCfgReqParamsType *wdiCfgParam =
3793 (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003794 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3795 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003796 /*
3797 * currently there is no response message is expected between PE and
3798 * WDA, Failure return from WDI is a ASSERT condition
3799 */
3800 if(WDI_STATUS_SUCCESS != wdiStatus)
3801 {
3802 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3803 "%s: CFG (%d) config failure \n", __FUNCTION__,
3804 ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
3805 }
3806
3807 vos_mem_free(wdiCfgParam->pConfigBuffer) ;
3808 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3809 pWDA->wdaWdiCfgApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003810 return ;
3811}
Jeff Johnson295189b2012-06-20 16:38:30 -07003812/*
3813 * FUNCTION: WDA_UpdateCfg
3814 *
3815 */
3816VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam)
3817{
3818
3819 WDI_Status status = WDI_STATUS_SUCCESS ;
3820 tANI_U32 val =0;
3821 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
3822 tHalCfg *configData;
3823 WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
3824 tANI_U8 *configDataValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3826 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 if (NULL == pMac )
3828 {
3829 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3830 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3831 return VOS_STATUS_E_FAILURE;
3832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 if(WDA_START_STATE != pWDA->wdaState)
3834 {
3835 return VOS_STATUS_E_FAILURE;
3836 }
3837
3838 if(NULL != pWDA->wdaWdiCfgApiMsgParam)
3839 {
3840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3841 "%s:wdaWdiCfgApiMsgParam is not NULL", __FUNCTION__);
3842 VOS_ASSERT(0);
3843 return VOS_STATUS_E_FAILURE;
3844 }
3845
3846 wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
3847 sizeof(WDI_UpdateCfgReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003848 if(NULL == wdiCfgReqParam)
3849 {
3850 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3851 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3852 VOS_ASSERT(0);
3853 return VOS_STATUS_E_NOMEM;
3854 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003855 wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) +
3856 sizeof(tANI_U32)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003857 if(NULL == wdiCfgReqParam->pConfigBuffer)
3858 {
3859 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3860 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
3861 vos_mem_free(wdiCfgReqParam);
3862 VOS_ASSERT(0);
3863 return VOS_STATUS_E_NOMEM;
3864 }
3865
3866 /*convert the WNI CFG Id to HAL CFG Id*/
3867 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
3868 WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
3869
3870 /*TODO: revisit this for handling string parameters */
3871 if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval,
3872 &val) != eSIR_SUCCESS)
3873 {
3874 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3875 "Failed to cfg get id %d\n", cfgParam->bodyval);
3876 vos_mem_free(wdiCfgReqParam->pConfigBuffer);
3877 vos_mem_free(wdiCfgReqParam);
3878 return eSIR_FAILURE;
3879 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003880 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
3881 configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
3882 configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
3883 vos_mem_copy( configDataValue, &val, sizeof(tANI_U32));
3884 wdiCfgReqParam->wdiReqStatusCB = NULL ;
3885
3886 /* store Params pass it to WDI */
3887 pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003888#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
3889 status = WDI_UpdateCfgReq(wdiCfgReqParam,
3890 (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003891 if(IS_WDI_STATUS_FAILURE(status))
3892 {
3893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3894 "Failure in Update CFG WDI API, free all the memory " );
3895 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3896 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3897 pWDA->wdaWdiCfgApiMsgParam = NULL;
3898 /* Failure is not expected */
3899 VOS_ASSERT(0) ;
3900 }
3901#else
3902 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3903 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3904 pWDA->wdaWdiCfgApiMsgParam = NULL;
3905#endif
3906 return CONVERT_WDI2VOS_STATUS(status) ;
3907}
3908
Jeff Johnson295189b2012-06-20 16:38:30 -07003909VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
3910 v_U8_t *pDefaultKeyId,
3911 v_U8_t *pNumKeys,
3912 WDI_KeysType *pWdiKeys )
3913{
3914 v_U32_t i, j, defKeyId = 0;
3915 v_U32_t val = SIR_MAC_KEY_LENGTH;
3916 VOS_STATUS status = WDI_STATUS_SUCCESS;
3917 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003918 if (NULL == pMac )
3919 {
3920 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3921 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3922 return VOS_STATUS_E_FAILURE;
3923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
3925 &defKeyId ))
3926 {
3927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3928 "Unable to retrieve defaultKeyId from CFG. Defaulting to 0...");
3929 }
3930
3931 *pDefaultKeyId = (v_U8_t)defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07003932 /* Need to extract ALL of the configured WEP Keys */
3933 for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
3934 {
3935 val = SIR_MAC_KEY_LENGTH;
3936 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3937 (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i),
3938 pWdiKeys[j].key,
3939 &val ))
3940 {
3941 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3942 "WEP Key index [%d] may not configured in CFG\n",i);
3943 }
3944 else
3945 {
3946 pWdiKeys[j].keyId = (tANI_U8) i;
3947 /*
3948 * Actually, a DC (Don't Care) because
3949 * this is determined (and set) by PE/MLME
3950 */
3951 pWdiKeys[j].unicast = 0;
3952 /*
3953 * Another DC (Don't Care)
3954 */
3955 pWdiKeys[j].keyDirection = eSIR_TX_RX;
3956 /* Another DC (Don't Care). Unused for WEP */
3957 pWdiKeys[j].paeRole = 0;
3958 /* Determined from wlan_cfgGetStr() above.*/
3959 pWdiKeys[j].keyLength = (tANI_U16) val;
Jeff Johnson295189b2012-06-20 16:38:30 -07003960 j++;
3961 *pNumKeys = (tANI_U8) j;
3962 }
3963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003964 return status;
3965}
Jeff Johnson295189b2012-06-20 16:38:30 -07003966/*
3967 * FUNCTION: WDA_SetBssKeyReqCallback
3968 * send SET BSS key RSP back to PE
3969 */
3970void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData)
3971{
3972 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3973 tWDA_CbContext *pWDA;
3974 tSetBssKeyParams *setBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3976 "<------ %s " ,__FUNCTION__);
3977 if(NULL == pWdaParams)
3978 {
3979 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3980 "%s: pWdaParams received NULL", __FUNCTION__);
3981 VOS_ASSERT(0) ;
3982 return ;
3983 }
3984 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3985 setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003986 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3987 vos_mem_free(pWdaParams) ;
3988 setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003989 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 return ;
3991}
Jeff Johnson295189b2012-06-20 16:38:30 -07003992/*
3993 * FUNCTION: WDA_ProcessSetBssKeyReq
3994 * Request to WDI for programming the BSS key( key for
3995 * broadcast/multicast frames Encryption)
3996 */
3997VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA,
3998 tSetBssKeyParams *setBssKeyParams )
3999{
4000 WDI_Status status = WDI_STATUS_SUCCESS ;
4001 WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam =
4002 (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
4003 sizeof(WDI_SetBSSKeyReqParamsType)) ;
4004 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004005 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4007 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 if(NULL == wdiSetBssKeyParam)
4009 {
4010 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4011 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4012 VOS_ASSERT(0);
4013 return VOS_STATUS_E_NOMEM;
4014 }
4015 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4016 if(NULL == pWdaParams)
4017 {
4018 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4019 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4020 VOS_ASSERT(0);
4021 vos_mem_free(wdiSetBssKeyParam);
4022 return VOS_STATUS_E_NOMEM;
4023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004025 /* copy set BSS params to WDI structure */
4026 wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
4027 wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
4028 wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
Jeff Johnson295189b2012-06-20 16:38:30 -07004029 if(setBssKeyParams->encType != eSIR_ED_NONE)
4030 {
4031 if( setBssKeyParams->numKeys == 0 &&
4032 (( setBssKeyParams->encType == eSIR_ED_WEP40)||
4033 setBssKeyParams->encType == eSIR_ED_WEP104))
4034 {
4035 tANI_U8 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004036 WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId,
4037 &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
4038 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
4039 }
4040 else
4041 {
4042 for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++)
4043 {
4044 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId =
4045 setBssKeyParams->key[keyIndex].keyId;
4046 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast =
4047 setBssKeyParams->key[keyIndex].unicast;
4048 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection =
4049 setBssKeyParams->key[keyIndex].keyDirection;
4050 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
4051 setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4052 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole =
4053 setBssKeyParams->key[keyIndex].paeRole;
4054 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength =
4055 setBssKeyParams->key[keyIndex].keyLength;
4056 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key,
4057 setBssKeyParams->key[keyIndex].key,
4058 SIR_MAC_MAX_KEY_LENGTH);
4059 }
4060 }
4061 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc =
4063 setBssKeyParams->singleTidRc;
4064 wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 /* Store set key pointer, as this will be used for response */
4066 /* store Params pass it to WDI */
4067 pWdaParams->pWdaContext = pWDA;
4068 pWdaParams->wdaMsgParam = setBssKeyParams;
4069 pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004070 status = WDI_SetBSSKeyReq(wdiSetBssKeyParam,
4071 (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
4072
4073 if(IS_WDI_STATUS_FAILURE(status))
4074 {
4075 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4076 "Failure in Set BSS Key Req WDI API, free all the memory " );
4077 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4078 vos_mem_free(pWdaParams) ;
4079 setBssKeyParams->status = eSIR_FAILURE ;
4080 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
4081 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004082 return CONVERT_WDI2VOS_STATUS(status) ;
4083}
Jeff Johnson295189b2012-06-20 16:38:30 -07004084/*
4085 * FUNCTION: WDA_RemoveBssKeyReqCallback
4086 * send SET BSS key RSP back to PE
4087 */
4088void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData)
4089{
4090 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4091 tWDA_CbContext *pWDA;
4092 tRemoveBssKeyParams *removeBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4094 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 if(NULL == pWdaParams)
4096 {
4097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4098 "%s: pWdaParams received NULL", __FUNCTION__);
4099 VOS_ASSERT(0) ;
4100 return ;
4101 }
4102 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4103 removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004104 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4105 vos_mem_free(pWdaParams) ;
4106
4107 removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004109 return ;
4110}
Jeff Johnson295189b2012-06-20 16:38:30 -07004111/*
4112 * FUNCTION: WDA_ProcessRemoveBssKeyReq
4113 * Request to WDI to remove the BSS key( key for broadcast/multicast
4114 * frames Encryption)
4115 */
4116VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA,
4117 tRemoveBssKeyParams *removeBssKeyParams )
4118{
4119 WDI_Status status = WDI_STATUS_SUCCESS ;
4120 WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam =
4121 (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
4122 sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
4123 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4125 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004126 if(NULL == wdiRemoveBssKeyParam)
4127 {
4128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4129 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4130 VOS_ASSERT(0);
4131 return VOS_STATUS_E_NOMEM;
4132 }
4133 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4134 if(NULL == pWdaParams)
4135 {
4136 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4137 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4138 VOS_ASSERT(0);
4139 vos_mem_free(wdiRemoveBssKeyParam);
4140 return VOS_STATUS_E_NOMEM;
4141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 /* copy Remove BSS key params to WDI structure*/
4143 wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
4144 wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
4145 wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
4146 wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
4147 wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 /* Store remove key pointer, as this will be used for response */
4149 /* store Params pass it to WDI */
4150 pWdaParams->pWdaContext = pWDA;
4151 pWdaParams->wdaMsgParam = removeBssKeyParams;
4152 pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004153 status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam,
4154 (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004155 if(IS_WDI_STATUS_FAILURE(status))
4156 {
4157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4158 "Failure in Remove BSS Key Req WDI API, free all the memory " );
4159 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4160 vos_mem_free(pWdaParams) ;
4161 removeBssKeyParams->status = eSIR_FAILURE ;
4162 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
4163 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004164 return CONVERT_WDI2VOS_STATUS(status) ;
4165}
Jeff Johnson295189b2012-06-20 16:38:30 -07004166/*
4167 * FUNCTION: WDA_SetBssKeyReqCallback
4168 * send SET BSS key RSP back to PE
4169 */
4170void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData)
4171{
4172 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4173 tWDA_CbContext *pWDA;
4174 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004175 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4176 "<------ %s " ,__FUNCTION__);
4177 if(NULL == pWdaParams)
4178 {
4179 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR
4180 ,"%s: pWdaParams received NULL", __FUNCTION__);
4181 VOS_ASSERT(0) ;
4182 return ;
4183 }
4184 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4185 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004186 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4187 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004188 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004189 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004190 return ;
4191}
Jeff Johnson295189b2012-06-20 16:38:30 -07004192/*
4193 * FUNCTION: WDA_ProcessSetStaKeyReq
4194 * Request to WDI for programming the STA key( key for Unicast frames
4195 * Encryption)
4196 */
4197VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA,
4198 tSetStaKeyParams *setStaKeyParams )
4199{
4200 WDI_Status status = WDI_STATUS_SUCCESS ;
4201 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4202 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4203 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4204 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004205 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4207 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 if(NULL == wdiSetStaKeyParam)
4209 {
4210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4211 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4212 VOS_ASSERT(0);
4213 return VOS_STATUS_E_NOMEM;
4214 }
4215 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4216 if(NULL == pWdaParams)
4217 {
4218 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4219 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4220 VOS_ASSERT(0);
4221 vos_mem_free(wdiSetStaKeyParam);
4222 return VOS_STATUS_E_NOMEM;
4223 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004225 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004226 /* copy set STA key params to WDI structure */
4227 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4228 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4229 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4230 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004231 if(setStaKeyParams->encType != eSIR_ED_NONE)
4232 {
Jeff Johnson43971f52012-07-17 12:26:56 -07004233 if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004234 (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) &&
4235 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
4236 {
4237 WDA_GetWepKeysFromCfg( pWDA,
4238 &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx,
4239 &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys,
4240 wdiSetStaKeyParam->wdiKeyInfo.wdiKey );
4241 }
4242 else
4243 {
4244#ifdef WLAN_SOFTAP_FEATURE
4245 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4246 keyIndex++)
4247 {
4248 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4249 setStaKeyParams->key[keyIndex].keyId;
4250 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4251 setStaKeyParams->key[keyIndex].unicast;
4252 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4253 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004254 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4255 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4256 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4257 setStaKeyParams->key[keyIndex].paeRole;
4258 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4259 setStaKeyParams->key[keyIndex].keyLength;
4260 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4261 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4262 /* set default index to index which have key direction as WDI_TX_DEFAULT */
4263 if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection)
4264 {
4265 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
4266 }
4267 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4269 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4270#else
4271 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4272 setStaKeyParams->key.keyId;
4273 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4274 setStaKeyParams->key.unicast;
4275 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4276 setStaKeyParams->key.keyDirection;
4277 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4278 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4279 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4280 setStaKeyParams->key.paeRole;
4281 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4282 setStaKeyParams->key.keyLength;
4283 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4284 setStaKeyParams->key[keyIndex].key,
4285 SIR_MAC_MAX_KEY_LENGTH);
4286 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4287#endif
4288 }
4289 }
4290 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4291 wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004292 /* Store set key pointer, as this will be used for response */
4293 /* store Params pass it to WDI */
4294 pWdaParams->pWdaContext = pWDA;
4295 pWdaParams->wdaMsgParam = setStaKeyParams;
4296 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004297 status = WDI_SetSTAKeyReq(wdiSetStaKeyParam,
4298 (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004299 if(IS_WDI_STATUS_FAILURE(status))
4300 {
4301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4302 "Failure in set STA Key Req WDI API, free all the memory " );
4303 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4304 vos_mem_free(pWdaParams) ;
4305 setStaKeyParams->status = eSIR_FAILURE ;
4306 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
4307 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004308 return CONVERT_WDI2VOS_STATUS(status) ;
4309}
Jeff Johnson295189b2012-06-20 16:38:30 -07004310/*
4311 * FUNCTION: WDA_SetBcastStaKeyReqCallback
4312 * send SET Bcast STA key RSP back to PE
4313 */
4314void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData)
4315{
4316 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4317 tWDA_CbContext *pWDA;
4318 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004319 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4320 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004321 if(NULL == pWdaParams)
4322 {
4323 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4324 "%s: pWdaParams received NULL", __FUNCTION__);
4325 VOS_ASSERT(0) ;
4326 return ;
4327 }
4328 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4329 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4331 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004332 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004333 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004334 return ;
4335}
4336
Jeff Johnson295189b2012-06-20 16:38:30 -07004337/*
4338 * FUNCTION: WDA_ProcessSetBcastStaKeyReq
4339 * Request to WDI for programming the Bcast STA key( key for Broadcast frames
4340 * Encryption)
4341 */
4342VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA,
4343 tSetStaKeyParams *setStaKeyParams )
4344{
4345 WDI_Status status = WDI_STATUS_SUCCESS ;
4346 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4347 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4348 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4349 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004351 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4352 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004353 if(NULL == wdiSetStaKeyParam)
4354 {
4355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4356 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4357 VOS_ASSERT(0);
4358 return VOS_STATUS_E_NOMEM;
4359 }
4360 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4361 if(NULL == pWdaParams)
4362 {
4363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4364 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4365 VOS_ASSERT(0);
4366 vos_mem_free(wdiSetStaKeyParam);
4367 return VOS_STATUS_E_NOMEM;
4368 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004369 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004370 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004371 /* copy set STA key params to WDI structure */
4372 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4373 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4374 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4375 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004376 if(setStaKeyParams->encType != eSIR_ED_NONE)
4377 {
4378#ifdef WLAN_SOFTAP_FEATURE
4379 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4380 keyIndex++)
4381 {
4382 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4383 setStaKeyParams->key[keyIndex].keyId;
4384 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4385 setStaKeyParams->key[keyIndex].unicast;
4386 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4387 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004388 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4389 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4390 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4391 setStaKeyParams->key[keyIndex].paeRole;
4392 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4393 setStaKeyParams->key[keyIndex].keyLength;
4394 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4395 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4396 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004397 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4398 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4399#else
4400 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4401 setStaKeyParams->key.keyId;
4402 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4403 setStaKeyParams->key.unicast;
4404 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4405 setStaKeyParams->key.keyDirection;
4406 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4407 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4408 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4409 setStaKeyParams->key.paeRole;
4410 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4411 setStaKeyParams->key.keyLength;
4412 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4413 setStaKeyParams->key[keyIndex].key,
4414 SIR_MAC_MAX_KEY_LENGTH);
4415 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4416#endif
4417 }
4418 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
Jeff Johnson295189b2012-06-20 16:38:30 -07004419 /* Store set key pointer, as this will be used for response */
4420 /* store Params pass it to WDI */
4421 pWdaParams->pWdaContext = pWDA;
4422 pWdaParams->wdaMsgParam = setStaKeyParams;
4423 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004424 status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam,
4425 (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 if(IS_WDI_STATUS_FAILURE(status))
4427 {
4428 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4429 "Failure in set BCAST STA Key Req WDI API, free all the memory " );
4430 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4431 vos_mem_free(pWdaParams) ;
4432 setStaKeyParams->status = eSIR_FAILURE ;
4433 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
4434 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004435 return CONVERT_WDI2VOS_STATUS(status) ;
4436}
Jeff Johnson295189b2012-06-20 16:38:30 -07004437/*
4438 * FUNCTION: WDA_RemoveStaKeyReqCallback
4439 * send SET BSS key RSP back to PE
4440 */
4441void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData)
4442{
4443 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4444 tWDA_CbContext *pWDA;
4445 tRemoveStaKeyParams *removeStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4447 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004448 if(NULL == pWdaParams)
4449 {
4450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4451 "%s: pWdaParams received NULL", __FUNCTION__);
4452 VOS_ASSERT(0) ;
4453 return ;
4454 }
4455 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4456 removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4458 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004459 removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004460 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 return ;
4462}
4463
Jeff Johnson295189b2012-06-20 16:38:30 -07004464/*
4465 * FUNCTION: WDA_ProcessRemoveStaKeyReq
4466 * Request to WDI to remove the STA key( key for Unicast frames Encryption)
4467 */
4468VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA,
4469 tRemoveStaKeyParams *removeStaKeyParams )
4470{
4471 WDI_Status status = WDI_STATUS_SUCCESS ;
4472 WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam =
4473 (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
4474 sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
4475 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4477 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004478 if(NULL == wdiRemoveStaKeyParam)
4479 {
4480 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4481 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4482 VOS_ASSERT(0);
4483 return VOS_STATUS_E_NOMEM;
4484 }
4485 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4486 if(NULL == pWdaParams)
4487 {
4488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4489 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4490 VOS_ASSERT(0);
4491 vos_mem_free(wdiRemoveStaKeyParam);
4492 return VOS_STATUS_E_NOMEM;
4493 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004494 /* copy remove STA key params to WDI structure*/
4495 wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
4496 wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
4497 wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
4498 wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
4499 wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004500 /* Store remove key pointer, as this will be used for response */
4501 /* store Params pass it to WDI */
4502 pWdaParams->pWdaContext = pWDA;
4503 pWdaParams->wdaMsgParam = removeStaKeyParams;
4504 pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam,
4506 (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004507 if(IS_WDI_STATUS_FAILURE(status))
4508 {
4509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4510 "Failure in remove STA Key Req WDI API, free all the memory " );
4511 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4512 vos_mem_free(pWdaParams) ;
4513 removeStaKeyParams->status = eSIR_FAILURE ;
4514 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
4515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004516 return CONVERT_WDI2VOS_STATUS(status) ;
4517}
Jeff Johnson295189b2012-06-20 16:38:30 -07004518/*
4519 * FUNCTION: WDA_IsHandleSetLinkStateReq
4520 * Update the WDA state and return the status to handle this message or not
4521 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004522WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
4523 tWDA_CbContext *pWDA,
4524 tLinkStateParams *linkStateParams)
4525{
4526 WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 switch(linkStateParams->state)
4528 {
4529 case eSIR_LINK_PREASSOC_STATE:
4530 case eSIR_LINK_BTAMP_PREASSOC_STATE:
4531 /*
4532 * set the WDA state to PRE ASSOC
4533 * copy the BSSID into pWDA to use it in join request and return,
4534 * No need to handle these messages.
4535 */
4536 vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid,
4537 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004538 vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr,
4539 sizeof(tSirMacAddr));
4540 /* UMAC is issuing the setlink state with PREASSOC twice (before set
4541 *channel and after ) so reset the WDA state to ready when the second
4542 * time UMAC issue the link state with PREASSOC
4543 */
4544 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
4545 {
4546 /* RESET WDA state back to WDA_READY_STATE */
4547 pWDA->wdaState = WDA_READY_STATE;
4548 }
4549 else
4550 {
4551 pWDA->wdaState = WDA_PRE_ASSOC_STATE;
4552 }
4553 //populate linkState info in WDACbCtxt
4554 pWDA->linkState = linkStateParams->state;
4555 status = WDA_IGNORE_SET_LINK_STATE;
4556 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004557 default:
4558 if(pWDA->wdaState != WDA_READY_STATE)
4559 {
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004560 /*If WDA_SET_LINK_STATE is recieved with any other link state apart
4561 *from eSIR_LINK_PREASSOC_STATE and eSIR_LINK_BTAMP_PREASSOC_STATE when
4562 *pWDA->wdaState is in WDA_PRE_ASSOC_STATE(This can happen only in
4563 *error cases) so reset the WDA state to WDA_READY_STATE to avoid
4564 *the ASSERT in WDA_Stop during module unload.*/
4565 if (pWDA->wdaState == WDA_PRE_ASSOC_STATE)
4566 {
4567 pWDA->wdaState = WDA_READY_STATE;
4568 }
4569 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4570 "Set link state called when WDA is not in READY STATE " );
4571 status = WDA_IGNORE_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 }
4573 break;
4574 }
4575
4576 return status;
4577}
Jeff Johnson295189b2012-06-20 16:38:30 -07004578/*
4579 * FUNCTION: WDA_SetLinkStateCallback
4580 * call back function for set link state from WDI
4581 */
4582void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
4583{
4584 tWDA_CbContext *pWDA;
4585 tLinkStateParams *linkStateParams;
4586 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4588 "<------ %s " ,__FUNCTION__);
4589 if(NULL == pWdaParams)
4590 {
4591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4592 "%s: pWdaParams received NULL", __FUNCTION__);
4593 VOS_ASSERT(0) ;
4594 return ;
4595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004598 /*
4599 * In STA mode start the BA activity check timer after association
4600 * and in AP mode start BA activity check timer after BSS start */
4601 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
4602 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
4603 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
4604 {
4605 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4606 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004607 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004608 /*
4609 * No respone required for WDA_SET_LINK_STATE so free the request
4610 * param here
4611 */
4612 if( pWdaParams != NULL )
4613 {
4614 if( pWdaParams->wdaWdiApiMsgParam != NULL )
4615 {
4616 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4617 }
4618 vos_mem_free(pWdaParams);
4619 }
4620 return ;
4621}
Jeff Johnson295189b2012-06-20 16:38:30 -07004622/*
4623 * FUNCTION: WDA_ProcessSetLinkState
4624 * Request to WDI to set the link status.
4625 */
4626VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
4627 tLinkStateParams *linkStateParams)
4628{
4629 WDI_Status status = WDI_STATUS_SUCCESS ;
4630 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
4631 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
4632 sizeof(WDI_SetLinkReqParamsType)) ;
4633 tWDA_ReqParams *pWdaParams ;
4634 tpAniSirGlobal pMac;
4635 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
4636
4637 if(NULL == pMac)
4638 {
4639 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4640 "%s:pMac is NULL", __FUNCTION__);
4641 VOS_ASSERT(0);
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004642 vos_mem_free(wdiSetLinkStateParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004643 return VOS_STATUS_E_FAILURE;
4644 }
4645
4646 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4647 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004648 if(NULL == wdiSetLinkStateParam)
4649 {
4650 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4651 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4652 VOS_ASSERT(0);
4653 return VOS_STATUS_E_NOMEM;
4654 }
4655 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4656 if(NULL == pWdaParams)
4657 {
4658 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4659 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4660 VOS_ASSERT(0);
4661 vos_mem_free(wdiSetLinkStateParam);
4662 return VOS_STATUS_E_NOMEM;
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 if(WDA_IGNORE_SET_LINK_STATE ==
4665 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
4666 {
4667 status = WDI_STATUS_E_FAILURE;
4668 }
4669 else
4670 {
4671 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
4672 linkStateParams->bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004673 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
4674 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
4676 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004677 pWdaParams->pWdaContext = pWDA;
4678 /* Store remove key pointer, as this will be used for response */
4679 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004680 /* store Params pass it to WDI */
4681 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
4682 /* Stop Timer only other than GO role and concurrent session */
4683 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
4684 && !vos_concurrent_sessions_running() &&
4685 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
4686 {
4687 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4688 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
4690 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004691 if(IS_WDI_STATUS_FAILURE(status))
4692 {
4693 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4694 "Failure in set link state Req WDI API, free all the memory " );
4695 }
4696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004697 if(IS_WDI_STATUS_FAILURE(status))
4698 {
4699 vos_mem_free(wdiSetLinkStateParam) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07004700 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004701 vos_mem_free(pWdaParams);
4702 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004703 return CONVERT_WDI2VOS_STATUS(status) ;
4704}
Jeff Johnson295189b2012-06-20 16:38:30 -07004705/*
4706 * FUNCTION: WDA_GetStatsReqParamsCallback
4707 * send the response to PE with Stats received from WDI
4708 */
4709void WDA_GetStatsReqParamsCallback(
4710 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
4711 void* pUserData)
4712{
4713 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4714 tAniGetPEStatsRsp *pGetPEStatsRspParams;
4715
4716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4717 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004718 pGetPEStatsRspParams =
4719 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
4720 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
4721
4722 if(NULL == pGetPEStatsRspParams)
4723 {
4724 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4725 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4726 VOS_ASSERT(0);
4727 return;
4728 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004729 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
4730 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
4731 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
4732 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
4733 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
4734
4735 //Fill the Session Id Properly in PE
4736 pGetPEStatsRspParams->sessionId = 0;
4737 pGetPEStatsRspParams->rc =
4738 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
4739 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
4740 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 vos_mem_copy( pGetPEStatsRspParams + 1,
4742 wdiGetStatsRsp + 1,
4743 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 /* send response to UMAC*/
4745 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
4746
4747 return;
4748}
4749
Jeff Johnson295189b2012-06-20 16:38:30 -07004750/*
4751 * FUNCTION: WDA_ProcessGetStatsReq
4752 * Request to WDI to get the statistics
4753 */
4754VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
4755 tAniGetPEStatsReq *pGetStatsParams)
4756{
4757 WDI_Status status = WDI_STATUS_SUCCESS ;
4758 WDI_GetStatsReqParamsType wdiGetStatsParam;
4759 tAniGetPEStatsRsp *pGetPEStatsRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4761 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004762 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
4763 pGetStatsParams->staId;
4764 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
4765 pGetStatsParams->statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004766 wdiGetStatsParam.wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004767 status = WDI_GetStatsReq(&wdiGetStatsParam,
4768 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07004769 if(IS_WDI_STATUS_FAILURE(status))
4770 {
4771 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4772 "Failure in Get Stats Req WDI API, free all the memory " );
4773 pGetPEStatsRspParams =
4774 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
4775 if(NULL == pGetPEStatsRspParams)
4776 {
4777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4778 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4779 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004780 vos_mem_free(pGetStatsParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 return VOS_STATUS_E_NOMEM;
4782 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004783 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
4784 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
4785 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
4786 pGetPEStatsRspParams->rc = eSIR_FAILURE;
4787 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
4788 (void *)pGetPEStatsRspParams, 0) ;
4789 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004790 /* Free the request message */
4791 vos_mem_free(pGetStatsParams);
4792 return CONVERT_WDI2VOS_STATUS(status);
4793}
Jeff Johnson295189b2012-06-20 16:38:30 -07004794/*
4795 * FUNCTION: WDA_UpdateEDCAParamCallback
4796 * call back function for Update EDCA params from WDI
4797 */
4798void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
4799{
4800 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4801 tEdcaParams *pEdcaParams;
4802
4803 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4804 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004805 if(NULL == pWdaParams)
4806 {
4807 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4808 "%s: pWdaParams received NULL", __FUNCTION__);
4809 VOS_ASSERT(0) ;
4810 return ;
4811 }
4812 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004813 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4814 vos_mem_free(pWdaParams);
4815 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004816 return ;
4817}
Jeff Johnson295189b2012-06-20 16:38:30 -07004818/*
4819 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
4820 * Request to WDI to Update the EDCA params.
4821 */
4822VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
4823 tEdcaParams *pEdcaParams)
4824{
4825 WDI_Status status = WDI_STATUS_SUCCESS ;
4826 WDI_UpdateEDCAParamsType *wdiEdcaParam =
4827 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
4828 sizeof(WDI_UpdateEDCAParamsType)) ;
4829 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004830 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4831 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004832 if(NULL == wdiEdcaParam)
4833 {
4834 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4835 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4836 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07004837 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 return VOS_STATUS_E_NOMEM;
4839 }
4840 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4841 if(NULL == pWdaParams)
4842 {
4843 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4844 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4845 VOS_ASSERT(0);
4846 vos_mem_free(wdiEdcaParam);
Jeff Johnsone7245742012-09-05 17:12:55 -07004847 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004848 return VOS_STATUS_E_NOMEM;
4849 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004850 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
4851 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
4852 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
4853 &pEdcaParams->acbe);
4854 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
4855 &pEdcaParams->acbk);
4856 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
4857 &pEdcaParams->acvi);
4858 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
4859 &pEdcaParams->acvo);
4860 wdiEdcaParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004861 pWdaParams->pWdaContext = pWDA;
4862 /* Store remove key pointer, as this will be used for response */
4863 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 /* store Params pass it to WDI */
4865 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004866 status = WDI_UpdateEDCAParams(wdiEdcaParam,
4867 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004868 if(IS_WDI_STATUS_FAILURE(status))
4869 {
4870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4871 "Failure in Update EDCA Params WDI API, free all the memory " );
4872 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4873 vos_mem_free(pWdaParams);
4874 vos_mem_free(pEdcaParams);
4875 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004876 return CONVERT_WDI2VOS_STATUS(status) ;
4877}
Jeff Johnson295189b2012-06-20 16:38:30 -07004878/*
4879 * FUNCTION: WDA_AddBAReqCallback
4880 * send ADD BA RSP back to PE
4881 */
4882void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
4883 void* pUserData)
4884{
4885 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4886 tWDA_CbContext *pWDA;
4887 tAddBAParams *pAddBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4889 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004890 if(NULL == pWdaParams)
4891 {
4892 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4893 "%s: pWdaParams received NULL", __FUNCTION__);
4894 VOS_ASSERT(0) ;
4895 return ;
4896 }
4897 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4898 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004899 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4900 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004901 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004902 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004903 return ;
4904}
4905
Jeff Johnson295189b2012-06-20 16:38:30 -07004906/*
4907 * FUNCTION: WDA_ProcessAddBAReq
4908 * Request to WDI to Update the ADDBA REQ params.
4909 */
4910VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
4911 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
4912{
Jeff Johnson43971f52012-07-17 12:26:56 -07004913 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 WDI_AddBAReqParamsType *wdiAddBAReqParam =
4915 (WDI_AddBAReqParamsType *)vos_mem_malloc(
4916 sizeof(WDI_AddBAReqParamsType)) ;
4917 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4919 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004920 if(NULL == wdiAddBAReqParam)
4921 {
4922 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4923 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4924 VOS_ASSERT(0);
4925 return VOS_STATUS_E_NOMEM;
4926 }
4927 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4928 if(NULL == pWdaParams)
4929 {
4930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4931 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4932 VOS_ASSERT(0);
4933 vos_mem_free(wdiAddBAReqParam);
4934 return VOS_STATUS_E_NOMEM;
4935 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004936 do
4937 {
4938 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004939 wdiAddBaInfo->ucSTAIdx = staIdx ;
4940 wdiAddBaInfo->ucBaSessionID = baSessionID ;
4941 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004942 } while(0) ;
4943 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004944 pWdaParams->pWdaContext = pWDA;
4945 /* store Params pass it to WDI */
4946 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
4947 pWdaParams->wdaMsgParam = pAddBAReqParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07004948 wstatus = WDI_AddBAReq(wdiAddBAReqParam,
4949 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004950
Jeff Johnson43971f52012-07-17 12:26:56 -07004951 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 {
4953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07004954 "Failure in ADD BA REQ Params WDI API, free all the memory" );
4955 status = CONVERT_WDI2VOS_STATUS(wstatus);
4956 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004957 vos_mem_free(pWdaParams);
4958 pAddBAReqParams->status = eSIR_FAILURE;
4959 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
4960 }
Jeff Johnson43971f52012-07-17 12:26:56 -07004961 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07004962}
Jeff Johnson295189b2012-06-20 16:38:30 -07004963/*
4964 * FUNCTION: WDA_AddBASessionReqCallback
4965 * send ADD BA SESSION RSP back to PE/(or TL)
4966 */
4967void WDA_AddBASessionReqCallback(
4968 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
4969{
4970 VOS_STATUS status = VOS_STATUS_SUCCESS ;
4971 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4972 tWDA_CbContext *pWDA;
4973 tAddBAParams *pAddBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004974 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4975 "<------ %s " ,__FUNCTION__);
4976 if(NULL == pWdaParams)
4977 {
4978 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4979 "%s: pWdaParams received NULL", __FUNCTION__);
4980 VOS_ASSERT(0) ;
4981 return ;
4982 }
4983 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4984 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 if( NULL == pAddBAReqParams )
4986 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4988 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
4989 VOS_ASSERT( 0 );
Jeff Johnsone7245742012-09-05 17:12:55 -07004990 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4991 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004992 return ;
4993 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004994 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4995 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004996 /*
4997 * if WDA in update TL state, update TL with BA session parama and send
4998 * another request to HAL(/WDI) (ADD_BA_REQ)
4999 */
5000
5001 if((VOS_STATUS_SUCCESS ==
5002 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
5003 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
5004 {
5005 /* Update TL with BA info received from HAL/WDI */
5006 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
5007 wdiAddBaSession->usBaSessionID,
5008 wdiAddBaSession->ucSTAIdx,
5009 wdiAddBaSession->ucBaTID,
5010 wdiAddBaSession->ucBaBufferSize,
5011 wdiAddBaSession->ucWinSize,
5012 wdiAddBaSession->usBaSSN );
Jeff Johnson295189b2012-06-20 16:38:30 -07005013 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5014 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5015 }
5016 else
5017 {
5018 pAddBAReqParams->status =
5019 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5020
5021 /* Setting Flag to indicate that Set BA is success */
5022 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5023 {
5024 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5025 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5026 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5027 }
5028 pWDA->wdaMsgParam = NULL;
5029 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5030 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005031 /*Reset the WDA state to READY */
5032 pWDA->wdaState = WDA_READY_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005033 return ;
5034}
5035
Jeff Johnson295189b2012-06-20 16:38:30 -07005036/*
5037 * FUNCTION: WDA_ProcessAddBASessionReq
5038 * Request to WDI to Update the ADDBA REQ params.
5039 */
5040VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5041 tAddBAParams *pAddBAReqParams)
5042{
5043 WDI_Status status = WDI_STATUS_SUCCESS ;
5044 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5045 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5046 sizeof(WDI_AddBASessionReqParamsType)) ;
5047 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5049 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005050 if(NULL == wdiAddBASessionReqParam)
5051 {
5052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5053 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5054 VOS_ASSERT(0);
5055 return VOS_STATUS_E_NOMEM;
5056 }
5057 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5058 if(NULL == pWdaParams)
5059 {
5060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5061 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5062 VOS_ASSERT(0);
5063 vos_mem_free(wdiAddBASessionReqParam);
5064 return VOS_STATUS_E_NOMEM;
5065 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005066 /*
5067 * Populate ADD BA parameters and pass these paarmeters to WDI.
5068 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5069 * the state to track if these is BA recipient case or BA initiator
5070 * case.
5071 */
5072 do
5073 {
5074 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5075 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5076 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5077 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5078 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5079 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5080 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005081 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
Jeff Johnson295189b2012-06-20 16:38:30 -07005082 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5083 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5084 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5085 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5086 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 /* check the BA direction and update state accordingly */
5088 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5089 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5090 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5091
5092 }while(0) ;
5093 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005094 pWdaParams->pWdaContext = pWDA;
5095 /* Store ADD BA pointer, as this will be used for response */
5096 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5097 /* store Params pass it to WDI */
5098 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005099 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5100 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005101 if(IS_WDI_STATUS_FAILURE(status))
5102 {
5103 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5104 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5105 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5106 vos_mem_free(pWdaParams->wdaMsgParam);
5107 vos_mem_free(pWdaParams);
5108 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005109 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005110}
Jeff Johnson295189b2012-06-20 16:38:30 -07005111/*
5112 * FUNCTION: WDA_DelBANotifyTL
5113 * send DEL BA IND to TL
5114 */
5115void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5116 tDelBAParams *pDelBAReqParams)
5117{
5118 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5119 //tSirMsgQ msg;
5120 vos_msg_t vosMsg;
5121 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005122 if(NULL == pDelBAInd)
5123 {
5124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5125 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5126 VOS_ASSERT(0) ;
5127 return;
5128 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005129 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5130 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5131 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5132 pDelBAInd->mesgLen = sizeof( tDelBAInd );
Jeff Johnsone7245742012-09-05 17:12:55 -07005133
Jeff Johnson295189b2012-06-20 16:38:30 -07005134
5135 vosMsg.type = WDA_DELETEBA_IND;
5136 vosMsg.bodyptr = pDelBAInd;
5137 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5138 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5139 {
5140 vosStatus = VOS_STATUS_E_BADMSG;
5141 }
5142}
Jeff Johnson295189b2012-06-20 16:38:30 -07005143/*
5144 * FUNCTION: WDA_DelBAReqCallback
5145 * send DEL BA RSP back to PE
5146 */
5147void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5148{
5149 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5150 tWDA_CbContext *pWDA;
5151 tDelBAParams *pDelBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07005152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5153 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005154 if(NULL == pWdaParams)
5155 {
5156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5157 "%s: pWdaParams received NULL", __FUNCTION__);
5158 VOS_ASSERT(0) ;
5159 return ;
5160 }
5161 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5162 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005163 /* Notify TL about DEL BA in case of recipinet */
5164 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5165 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5166 {
5167 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5168 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005169 /*
5170 * No respone required for WDA_DELBA_IND so just free the request
5171 * param here
5172 */
5173 vos_mem_free(pDelBAReqParams);
5174 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5175 vos_mem_free(pWdaParams);
5176 return ;
5177}
5178
Jeff Johnson295189b2012-06-20 16:38:30 -07005179/*
5180 * FUNCTION: WDA_ProcessDelBAReq
5181 * Request to WDI to Update the DELBA REQ params.
5182 */
5183VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5184 tDelBAParams *pDelBAReqParams)
5185{
5186 WDI_Status status = WDI_STATUS_SUCCESS ;
5187 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5188 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5189 sizeof(WDI_DelBAReqParamsType)) ;
5190 tWDA_ReqParams *pWdaParams ;
5191 tANI_U16 staIdx = 0;
5192 tANI_U8 tid = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5194 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005195 if(NULL == wdiDelBAReqParam)
5196 {
5197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5198 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5199 VOS_ASSERT(0);
5200 return VOS_STATUS_E_NOMEM;
5201 }
5202 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5203 if(NULL == pWdaParams)
5204 {
5205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5206 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5207 VOS_ASSERT(0);
5208 vos_mem_free(wdiDelBAReqParam);
5209 return VOS_STATUS_E_NOMEM;
5210 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005211 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5212 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5213 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5214 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005215 pWdaParams->pWdaContext = pWDA;
5216 /* Store DEL BA pointer, as this will be used for response */
5217 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005218 /* store Params pass it to WDI */
5219 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5221 * maintained in WDA, so that WDA can retry for another BA session
5222 */
5223 staIdx = pDelBAReqParams->staIdx;
5224 tid = pDelBAReqParams->baTID;
5225 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
Jeff Johnson295189b2012-06-20 16:38:30 -07005226 status = WDI_DelBAReq(wdiDelBAReqParam,
5227 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005228 if(IS_WDI_STATUS_FAILURE(status))
5229 {
5230 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5231 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5232 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5233 vos_mem_free(pWdaParams->wdaMsgParam);
5234 vos_mem_free(pWdaParams);
5235 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005236 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005237}
Jeff Johnson295189b2012-06-20 16:38:30 -07005238/*
5239 * FUNCTION: WDA_AddTSReqCallback
5240 * send ADD TS RSP back to PE
5241 */
5242void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5243{
5244 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5245 tWDA_CbContext *pWDA;
5246 tAddTsParams *pAddTsReqParams;
5247
5248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5249 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005250 if(NULL == pWdaParams)
5251 {
5252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5253 "%s: pWdaParams received NULL", __FUNCTION__);
5254 VOS_ASSERT(0) ;
5255 return ;
5256 }
5257 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5258 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5259 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5260 vos_mem_free(pWdaParams);
5261
5262 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005263 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005264 return ;
5265}
5266
Jeff Johnson295189b2012-06-20 16:38:30 -07005267/*
5268 * FUNCTION: WDA_ProcessAddTSReq
5269 * Request to WDI to Update the ADD TS REQ params.
5270 */
5271VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5272 tAddTsParams *pAddTsReqParams)
5273{
5274 WDI_Status status = WDI_STATUS_SUCCESS ;
5275 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5276 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5277 sizeof(WDI_AddTSReqParamsType)) ;
5278 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005279 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5280 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005281 if(NULL == wdiAddTSReqParam)
5282 {
5283 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5284 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5285 VOS_ASSERT(0);
5286 return VOS_STATUS_E_NOMEM;
5287 }
5288 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5289 if(NULL == pWdaParams)
5290 {
5291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5292 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5293 VOS_ASSERT(0);
5294 vos_mem_free(wdiAddTSReqParam);
5295 return VOS_STATUS_E_NOMEM;
5296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005297 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5298 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005299 //TS IE
5300 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5301 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5302 pAddTsReqParams->tspec.length;
5303
5304 //TS IE : TS INFO : TRAFFIC
5305 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5306 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5307 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5308 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5309 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5310 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5311 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5312 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5313 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5314 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5315 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5316 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5317 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5318 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5319 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5320 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5321
5322 //TS IE : TS INFO : SCHEDULE
5323 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5324 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5325 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5326 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
Jeff Johnson295189b2012-06-20 16:38:30 -07005327 //TS IE
5328 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5329 pAddTsReqParams->tspec.nomMsduSz;
5330 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5331 pAddTsReqParams->tspec.maxMsduSz;
5332 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5333 pAddTsReqParams->tspec.minSvcInterval;
5334 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5335 pAddTsReqParams->tspec.maxSvcInterval;
5336 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5337 pAddTsReqParams->tspec.inactInterval;
5338 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5339 pAddTsReqParams->tspec.suspendInterval;
5340 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5341 pAddTsReqParams->tspec.svcStartTime;
5342 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5343 pAddTsReqParams->tspec.minDataRate;
5344 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5345 pAddTsReqParams->tspec.meanDataRate;
5346 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5347 pAddTsReqParams->tspec.peakDataRate;
5348 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5349 pAddTsReqParams->tspec.maxBurstSz;
5350 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5351 pAddTsReqParams->tspec.delayBound;
5352 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5353 pAddTsReqParams->tspec.minPhyRate;
5354 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5355 pAddTsReqParams->tspec.surplusBw;
5356 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5357 pAddTsReqParams->tspec.mediumTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07005358 /* TODO: tAddTsParams doesn't have the following fields */
5359#if 0
5360 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5361 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5362 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5363 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5364#endif
5365 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5366
5367 pWdaParams->pWdaContext = pWDA;
5368 /* Store ADD TS pointer, as this will be used for response */
5369 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005370 /* store Params pass it to WDI */
5371 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005372 status = WDI_AddTSReq(wdiAddTSReqParam,
5373 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005374 if(IS_WDI_STATUS_FAILURE(status))
5375 {
5376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5377 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5378 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5379 vos_mem_free(pWdaParams);
5380 pAddTsReqParams->status = eSIR_FAILURE ;
5381 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5382 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005383 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005384}
5385
Jeff Johnson295189b2012-06-20 16:38:30 -07005386/*
5387 * FUNCTION: WDA_DelTSReqCallback
5388 * send DEL TS RSP back to PE
5389 */
5390void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5391{
5392 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5394 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005395 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5396 vos_mem_free(pWdaParams->wdaMsgParam) ;
5397 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005398 /*
5399 * No respone required for WDA_DEL_TS_REQ so just free the request
5400 * param here
5401 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005402 return ;
5403}
5404
Jeff Johnson295189b2012-06-20 16:38:30 -07005405/*
5406 * FUNCTION: WDA_ProcessDelTSReq
5407 * Request to WDI to Update the DELTS REQ params.
5408 */
5409VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5410 tDelTsParams *pDelTSReqParams)
5411{
5412 WDI_Status status = WDI_STATUS_SUCCESS ;
5413 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5414 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5415 sizeof(WDI_DelTSReqParamsType)) ;
5416 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005417 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5418 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005419 if(NULL == wdiDelTSReqParam)
5420 {
5421 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5422 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5423 VOS_ASSERT(0);
5424 return VOS_STATUS_E_NOMEM;
5425 }
5426 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5427 if(NULL == pWdaParams)
5428 {
5429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5430 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5431 VOS_ASSERT(0);
5432 vos_mem_free(wdiDelTSReqParam);
5433 return VOS_STATUS_E_NOMEM;
5434 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005435 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
5436 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
5437 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
5438 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
5439 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005440 pWdaParams->pWdaContext = pWDA;
5441 /* Store DEL TS pointer, as this will be used for response */
5442 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005443 /* store Params pass it to WDI */
5444 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005445 status = WDI_DelTSReq(wdiDelTSReqParam,
5446 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005447 if(IS_WDI_STATUS_FAILURE(status))
5448 {
5449 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5450 "Failure in DEL TS REQ Params WDI API, free all the memory " );
5451 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5452 vos_mem_free(pWdaParams->wdaMsgParam);
5453 vos_mem_free(pWdaParams);
5454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005455 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005456}
Jeff Johnson295189b2012-06-20 16:38:30 -07005457/*
5458 * FUNCTION: WDA_UpdateBeaconParamsCallback
5459 * Free the memory. No need to send any response to PE in this case
5460 */
5461void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
5462{
5463 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005464 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5465 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 if(NULL == pWdaParams)
5467 {
5468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5469 "%s: pWdaParams received NULL", __FUNCTION__);
5470 VOS_ASSERT(0) ;
5471 return ;
5472 }
5473 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5474 vos_mem_free(pWdaParams->wdaMsgParam) ;
5475 vos_mem_free(pWdaParams);
5476 /*
5477 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
5478 * param here
5479 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005480 return ;
5481}
Jeff Johnson295189b2012-06-20 16:38:30 -07005482/*
5483 * FUNCTION: WDA_ProcessUpdateBeaconParams
5484 * Request to WDI to send the beacon parameters to HAL to update the Hardware
5485 */
5486VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
5487 tUpdateBeaconParams *pUpdateBeaconParams)
5488{
5489 WDI_Status status = WDI_STATUS_SUCCESS ;
5490 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
5491 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
5492 sizeof(WDI_UpdateBeaconParamsType)) ;
5493 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5495 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005496 if(NULL == wdiUpdateBeaconParams)
5497 {
5498 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5499 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5500 VOS_ASSERT(0);
5501 return VOS_STATUS_E_NOMEM;
5502 }
5503 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5504 if(NULL == pWdaParams)
5505 {
5506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5507 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5508 VOS_ASSERT(0);
5509 vos_mem_free(wdiUpdateBeaconParams);
5510 return VOS_STATUS_E_NOMEM;
5511 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005512 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
5513 pUpdateBeaconParams->bssIdx;
5514 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
5515 pUpdateBeaconParams->fShortPreamble;
5516 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
5517 pUpdateBeaconParams->fShortSlotTime;
5518 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
5519 pUpdateBeaconParams->beaconInterval;
5520 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
5521 pUpdateBeaconParams->llaCoexist;
5522 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
5523 pUpdateBeaconParams->llbCoexist;
5524 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
5525 pUpdateBeaconParams->llgCoexist;
5526 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
5527 pUpdateBeaconParams->ht20MhzCoexist;
5528 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
5529 pUpdateBeaconParams->llnNonGFCoexist;
5530 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
5531 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
5532 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
5533 pUpdateBeaconParams->fRIFSMode;
5534 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
5535 pUpdateBeaconParams->paramChangeBitmap;
5536 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
5537
5538 pWdaParams->pWdaContext = pWDA;
5539 /* Store UpdateBeacon Req pointer, as this will be used for response */
5540 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005541 /* store Params pass it to WDI */
5542 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005543 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
5544 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
5545 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005546 if(IS_WDI_STATUS_FAILURE(status))
5547 {
5548 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5549 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
5550 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5551 vos_mem_free(pWdaParams->wdaMsgParam);
5552 vos_mem_free(pWdaParams);
5553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005554 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005555}
Jeff Johnson295189b2012-06-20 16:38:30 -07005556#ifdef FEATURE_WLAN_CCX
Jeff Johnson295189b2012-06-20 16:38:30 -07005557/*
5558 * FUNCTION: WDA_TSMStatsReqCallback
5559 * send TSM Stats RSP back to PE
5560 */
5561void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
5562{
5563 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5564 tWDA_CbContext *pWDA = NULL;
5565 tTSMStats *pTsmRspParams = NULL;
5566
5567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5568 "<------ Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005569 if(NULL == pWdaParams)
5570 {
5571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5572 "%s: pWdaParams received NULL", __FUNCTION__);
5573 VOS_ASSERT(0) ;
5574 return ;
5575 }
5576 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5577 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005578 if( NULL == pTsmRspParams )
5579 {
5580 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5581 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
5582 VOS_ASSERT( 0 );
5583 return ;
5584 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005585 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5586 vos_mem_free(pWdaParams);
5587
5588 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
5589 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
5590 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
5591 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
5592 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
5593 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
5594 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
5595 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
5596 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
5597 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
Jeff Johnson295189b2012-06-20 16:38:30 -07005598 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005599 return ;
5600}
5601
5602
Jeff Johnson295189b2012-06-20 16:38:30 -07005603/*
5604 * FUNCTION: WDA_ProcessTsmStatsReq
5605 * Request to WDI to get the TSM Stats params.
5606 */
5607VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
5608 tTSMStats *pTsmStats)
5609{
5610 WDI_Status status = WDI_STATUS_SUCCESS ;
5611 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
5612 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005613 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5614 "------> Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005615 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5616 {
5617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5618 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5619 VOS_ASSERT(0);
5620 return VOS_STATUS_E_FAILURE;
5621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005622 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
5623 sizeof(WDI_TSMStatsReqParamsType));
5624 if(NULL == wdiTSMReqParam)
5625 {
5626 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5627 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5628 VOS_ASSERT(0);
5629 return VOS_STATUS_E_NOMEM;
5630 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005631 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5632 if(NULL == pWdaParams)
5633 {
5634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5636 VOS_ASSERT(0);
5637 vos_mem_free(wdiTSMReqParam);
5638 return VOS_STATUS_E_NOMEM;
5639 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005640 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
5641 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
5642 pTsmStats->bssId,
5643 sizeof(wpt_macAddr));
5644 wdiTSMReqParam->wdiReqStatusCB = NULL ;
5645
5646 pWdaParams->pWdaContext = pWDA;
5647 /* Store TSM Stats pointer, as this will be used for response */
5648 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005649 /* store Params pass it to WDI */
5650 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005651 status = WDI_TSMStatsReq(wdiTSMReqParam,
5652 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005653 if(IS_WDI_STATUS_FAILURE(status))
5654 {
5655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5656 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
5657 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5658 vos_mem_free(pWdaParams) ;
5659 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005660 return CONVERT_WDI2VOS_STATUS(status) ;
5661}
5662#endif
5663/*
5664 * FUNCTION: WDA_SendBeaconParamsCallback
5665 * No need to send any response to PE in this case
5666 */
5667void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
5668{
5669
Jeff Johnson295189b2012-06-20 16:38:30 -07005670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5671 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005672 return ;
5673}
Jeff Johnson295189b2012-06-20 16:38:30 -07005674/*
5675 * FUNCTION: WDA_ProcessSendBeacon
5676 * Request to WDI to send the beacon template to HAL to update the TPE memory and
5677 * start beacon trasmission
5678 */
5679VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
5680 tSendbeaconParams *pSendbeaconParams)
5681{
5682 WDI_Status status = WDI_STATUS_SUCCESS ;
5683 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005684 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5685 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005686 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
5687 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
5688 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
5689 pSendbeaconParams->beaconLength;
5690#ifdef WLAN_SOFTAP_FEATURE
5691 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
5692 pSendbeaconParams->timIeOffset;
5693#endif
5694#ifdef WLAN_FEATURE_P2P
5695 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
5696 pSendbeaconParams->p2pIeOffset;
5697#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005698 /* Copy the beacon template to local buffer */
5699 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
5700 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
5701 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
5702
Jeff Johnson295189b2012-06-20 16:38:30 -07005703 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
5704 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005705 if(IS_WDI_STATUS_FAILURE(status))
5706 {
5707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5708 "Failure in SEND BEACON REQ Params WDI API" );
5709 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005710 vos_mem_free(pSendbeaconParams);
5711 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005712}
Jeff Johnson295189b2012-06-20 16:38:30 -07005713/*
5714 * FUNCTION: WDA_UpdateProbeRspParamsCallback
5715 * No need to send any response to PE in this case
5716 */
5717void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
5718{
Jeff Johnson295189b2012-06-20 16:38:30 -07005719 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5720 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005721 return ;
5722}
5723
Jeff Johnson295189b2012-06-20 16:38:30 -07005724/*
5725 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
5726 * Request to WDI to send the probe response template to HAL to update the TPE memory and
5727 * send probe response
5728 */
5729VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
5730 tSendProbeRespParams *pSendProbeRspParams)
5731{
5732 WDI_Status status = WDI_STATUS_SUCCESS ;
5733 WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam;
5734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5735 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005736 /*Copy update probe response parameters*/
5737 vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID,
5738 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
5739 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
5740 pSendProbeRspParams->probeRespTemplateLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07005741 /* Copy the Probe Response template to local buffer */
5742 vos_mem_copy(
5743 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
5744 pSendProbeRspParams->pProbeRespTemplate,
5745 pSendProbeRspParams->probeRespTemplateLen);
5746 vos_mem_copy(
5747 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
5748 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
5749 WDI_PROBE_REQ_BITMAP_IE_LEN);
5750
5751 wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
5752
Jeff Johnson295189b2012-06-20 16:38:30 -07005753 status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam,
5754 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005755 if(IS_WDI_STATUS_FAILURE(status))
5756 {
5757 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5758 "Failure in SEND Probe RSP Params WDI API" );
5759 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005760 vos_mem_free(pSendProbeRspParams);
5761 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005762}
Jeff Johnson295189b2012-06-20 16:38:30 -07005763#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
5764/*
5765 * FUNCTION: WDA_SetMaxTxPowerCallBack
5766 * send the response to PE with power value received from WDI
5767 */
5768void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
5769 void* pUserData)
5770{
5771 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5772 tWDA_CbContext *pWDA = NULL;
5773 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
5774
5775 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5776 "<------ %s " ,__FUNCTION__);
5777 if(NULL == pWdaParams)
5778 {
5779 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5780 "%s: pWdaParams received NULL", __FUNCTION__);
5781 VOS_ASSERT(0) ;
5782 return ;
5783 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005784 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5785 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005786 if( NULL == pMaxTxPowerParams )
5787 {
5788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5789 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07005790 VOS_ASSERT(0);
5791 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5792 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005793 return ;
5794 }
Jeff Johnsone7245742012-09-05 17:12:55 -07005795
Jeff Johnson295189b2012-06-20 16:38:30 -07005796
5797 /*need to free memory for the pointers used in the
5798 WDA Process.Set Max Tx Power Req function*/
Jeff Johnson295189b2012-06-20 16:38:30 -07005799 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5800 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005801 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
Jeff Johnsone7245742012-09-05 17:12:55 -07005802
Jeff Johnson295189b2012-06-20 16:38:30 -07005803
5804 /* send response to UMAC*/
5805 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
5806
5807 return;
5808}
Jeff Johnson295189b2012-06-20 16:38:30 -07005809/*
5810 * FUNCTION: WDA_SetMaxTxPowerCallBack
5811 * Request to WDI to send set Max Tx Power Request
5812 */
5813 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
5814 tMaxTxPowerParams *MaxTxPowerParams)
5815{
5816 WDI_Status status = WDI_STATUS_SUCCESS;
5817 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
5818 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005819 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5820 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005821 if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
5822 {
5823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5824 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5825 VOS_ASSERT(0);
5826 return VOS_STATUS_E_FAILURE;
5827 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005828 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
5829 sizeof(WDI_SetMaxTxPowerParamsType));
5830 if(NULL == wdiSetMaxTxPowerParams)
5831 {
5832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5833 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5834 VOS_ASSERT(0);
5835 return VOS_STATUS_E_NOMEM;
5836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005837 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5838 if(NULL == pWdaParams)
5839 {
5840 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5841 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5842 vos_mem_free(wdiSetMaxTxPowerParams);
5843 VOS_ASSERT(0);
5844 return VOS_STATUS_E_NOMEM;
5845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005846 /* Copy.Max.Tx.Power Params to WDI structure */
5847 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
5848 MaxTxPowerParams->bssId,
5849 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
5851 MaxTxPowerParams->selfStaMacAddr,
5852 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005853 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
5854 MaxTxPowerParams->power;
Jeff Johnson295189b2012-06-20 16:38:30 -07005855 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005856 pWdaParams->pWdaContext = pWDA;
5857 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005858 /* store Params pass it to WDI */
5859 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005860 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
5861 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005862 if(IS_WDI_STATUS_FAILURE(status))
5863 {
5864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5865 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
5866 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5867 vos_mem_free(pWdaParams);
5868 }
5869 return CONVERT_WDI2VOS_STATUS(status);
5870
5871}
Jeff Johnson295189b2012-06-20 16:38:30 -07005872#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005873#ifdef WLAN_FEATURE_P2P
Jeff Johnson295189b2012-06-20 16:38:30 -07005874/*
5875 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
5876 * Free the memory. No need to send any response to PE in this case
5877 */
5878void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
5879{
5880 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005881 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5882 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005883 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5884 pWDA->wdaWdiApiMsgParam = NULL;
5885 vos_mem_free(pWDA->wdaMsgParam) ;
5886 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005887 /*
5888 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
5889 * so just free the request param here
5890 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005891 return ;
5892}
5893
Jeff Johnson295189b2012-06-20 16:38:30 -07005894/*
5895 * FUNCTION: WDA_ProcessSetP2PGONOAReq
5896 * Request to WDI to set the P2P Group Owner Notice of Absence Req
5897 */
5898VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
5899 tP2pPsParams *pP2pPsConfigParams)
5900{
5901 WDI_Status status = WDI_STATUS_SUCCESS ;
5902 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
5903 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
5904 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005905 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5906 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005907 if(NULL == wdiSetP2PGONOAReqParam)
5908 {
5909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5910 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5911 VOS_ASSERT(0);
5912 return VOS_STATUS_E_NOMEM;
5913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005914 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
5915 pP2pPsConfigParams->opp_ps;
5916 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
5917 pP2pPsConfigParams->ctWindow;
5918 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
5919 pP2pPsConfigParams->count;
5920 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
5921 pP2pPsConfigParams->duration;
5922 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
5923 pP2pPsConfigParams->interval;
5924 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
5925 pP2pPsConfigParams->single_noa_duration;
5926 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
5927 pP2pPsConfigParams->psSelection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005928 if((NULL != pWDA->wdaMsgParam) ||
5929 (NULL != pWDA->wdaWdiApiMsgParam))
5930 {
5931 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5932 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5933 VOS_ASSERT(0);
5934 vos_mem_free(wdiSetP2PGONOAReqParam);
5935 return VOS_STATUS_E_FAILURE;
5936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005937 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
5938 /* Store msg pointer from PE, as this will be used for response */
5939 pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005940 /* store Params pass it to WDI */
5941 pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005942 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
5943 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005944 if(IS_WDI_STATUS_FAILURE(status))
5945 {
5946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5947 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
5948 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5949 vos_mem_free(pWDA->wdaMsgParam);
5950 pWDA->wdaWdiApiMsgParam = NULL;
5951 pWDA->wdaMsgParam = NULL;
5952 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005953 return CONVERT_WDI2VOS_STATUS(status);
5954
Jeff Johnson295189b2012-06-20 16:38:30 -07005955}
5956#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005957#ifdef WLAN_FEATURE_VOWIFI_11R
5958/*
5959 * FUNCTION: WDA_AggrAddTSReqCallback
5960 * send ADD AGGREGATED TS RSP back to PE
5961 */
5962void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
5963{
5964 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
5965 tAggrAddTsParams *pAggrAddTsReqParams =
5966 (tAggrAddTsParams *)pWDA->wdaMsgParam ;
5967 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07005968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5969 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005970 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5971 pWDA->wdaWdiApiMsgParam = NULL;
5972 pWDA->wdaMsgParam = NULL;
5973
5974 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
5975 {
5976 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
5977 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005978 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 return ;
5980}/* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07005981/*
5982 * FUNCTION: WDA_ProcessAddTSReq
5983 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
5984 */
5985VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
5986 tAggrAddTsParams *pAggrAddTsReqParams)
5987{
5988 WDI_Status status = WDI_STATUS_SUCCESS ;
5989 int i;
5990 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005991 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5992 "------> %s " ,__FUNCTION__);
5993 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5994 {
5995 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5996 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5997 VOS_ASSERT(0);
5998 return VOS_STATUS_E_FAILURE;
5999 }
6000
6001 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
6002 sizeof(WDI_AggrAddTSReqParamsType)) ;
6003 if(NULL == wdiAggrAddTSReqParam)
6004 {
6005 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6006 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6007 VOS_ASSERT(0);
6008 return VOS_STATUS_E_NOMEM;
6009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006010 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6011 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6012 pAggrAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006013 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6014 {
6015 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6016 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6017 pAggrAddTsReqParams->tspec[i].length;
Jeff Johnson295189b2012-06-20 16:38:30 -07006018 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6019 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6020 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6021 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6022 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6023 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6024 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6025 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6026 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6027 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6028 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6029 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6030 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6031 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6032 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6033 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
Jeff Johnson295189b2012-06-20 16:38:30 -07006034 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6035 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
Jeff Johnson295189b2012-06-20 16:38:30 -07006036 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6037 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6038 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6039 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6040 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6041 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6042 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6043 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6044 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6045 pAggrAddTsReqParams->tspec[i].inactInterval;
6046 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6047 pAggrAddTsReqParams->tspec[i].suspendInterval;
6048 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6049 pAggrAddTsReqParams->tspec[i].svcStartTime;
6050 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6051 pAggrAddTsReqParams->tspec[i].minDataRate;
6052 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6053 pAggrAddTsReqParams->tspec[i].meanDataRate;
6054 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6055 pAggrAddTsReqParams->tspec[i].peakDataRate;
6056 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6057 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6058 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6059 pAggrAddTsReqParams->tspec[i].delayBound;
6060 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6061 pAggrAddTsReqParams->tspec[i].minPhyRate;
6062 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6063 pAggrAddTsReqParams->tspec[i].surplusBw;
6064 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6065 pAggrAddTsReqParams->tspec[i].mediumTime;
6066 }
6067
6068 /* TODO: tAggrAddTsParams doesn't have the following fields */
6069#if 0
6070 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6071 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6072 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6073 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6074#endif
6075 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6076
6077 /* Store ADD TS pointer, as this will be used for response */
6078 pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006079 /* store Params pass it to WDI */
6080 pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006081 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
6082 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006083 if(IS_WDI_STATUS_FAILURE(status))
6084 {
6085 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6086 "Failure in ADD TS REQ Params WDI API, free all the memory " );
6087 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6088 vos_mem_free(pWDA->wdaMsgParam);
6089 pWDA->wdaWdiApiMsgParam = NULL;
6090 pWDA->wdaMsgParam = NULL;
6091 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006092 return CONVERT_WDI2VOS_STATUS(status) ;
6093}
6094#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006095/*
6096 * FUNCTION: WDA_EnterImpsReqCallback
6097 * send Enter IMPS RSP back to PE
6098 */
6099void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6100{
6101 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006102 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6103 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006104 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006105 return ;
6106}
Jeff Johnson295189b2012-06-20 16:38:30 -07006107/*
6108 * FUNCTION: WDA_ProcessEnterImpsReq
6109 * Request to WDI to Enter IMPS power state.
6110 */
6111VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6112{
6113 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6115 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006116 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006117 if(IS_WDI_STATUS_FAILURE(status))
6118 {
6119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6120 "Failure in Enter IMPS REQ WDI API, free all the memory " );
6121 pWDA->wdaWdiApiMsgParam = NULL;
6122 pWDA->wdaMsgParam = NULL;
6123 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006124 return CONVERT_WDI2VOS_STATUS(status) ;
6125}
Jeff Johnson295189b2012-06-20 16:38:30 -07006126/*
6127 * FUNCTION: WDA_ExitImpsReqCallback
6128 * send Exit IMPS RSP back to PE
6129 */
6130void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6131{
6132 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006133 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6134 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006135 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006136 return ;
6137}
Jeff Johnson295189b2012-06-20 16:38:30 -07006138/*
6139 * FUNCTION: WDA_ProcessExitImpsReq
6140 * Request to WDI to Exit IMPS power state.
6141 */
6142VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6143{
6144 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6146 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006147 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006148 if(IS_WDI_STATUS_FAILURE(status))
6149 {
6150 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6151 "Failure in Exit IMPS REQ WDI API, free all the memory " );
6152 pWDA->wdaWdiApiMsgParam = NULL;
6153 pWDA->wdaMsgParam = NULL;
6154 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006155 return CONVERT_WDI2VOS_STATUS(status) ;
6156}
Jeff Johnson295189b2012-06-20 16:38:30 -07006157/*
6158 * FUNCTION: WDA_EnterBmpsReqCallback
6159 * send Enter BMPS RSP back to PE
6160 */
6161void WDA_EnterBmpsReqCallback(WDI_Status status, void* pUserData)
6162{
6163 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6164 tWDA_CbContext *pWDA;
6165 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6166 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006167 if(NULL == pWdaParams)
6168 {
6169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6170 "%s: pWdaParams received NULL", __FUNCTION__);
6171 VOS_ASSERT(0) ;
6172 return ;
6173 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006174 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6175 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6176 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006177 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006178 return ;
6179}
Jeff Johnson295189b2012-06-20 16:38:30 -07006180/*
6181 * FUNCTION: WDA_ProcessEnterBmpsReq
6182 * Request to WDI to Enter BMPS power state.
6183 */
6184VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6185 tEnterBmpsParams *pEnterBmpsReqParams)
6186{
6187 WDI_Status status = WDI_STATUS_SUCCESS;
6188 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6189 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6191 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006192 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6193 {
6194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6195 "%s: invalid param", __FUNCTION__);
6196 VOS_ASSERT(0);
6197 return VOS_STATUS_E_FAILURE;
6198 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006199 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6200 if (NULL == wdiEnterBmpsReqParams)
6201 {
6202 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6203 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6204 VOS_ASSERT(0);
6205 return VOS_STATUS_E_NOMEM;
6206 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006207 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6208 if (NULL == pWdaParams)
6209 {
6210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6211 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6212 VOS_ASSERT(0);
6213 vos_mem_free(wdiEnterBmpsReqParams);
6214 return VOS_STATUS_E_NOMEM;
6215 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006216 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6217 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6218 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6219 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
Jeff Johnson295189b2012-06-20 16:38:30 -07006220 // For CCX and 11R Roaming
6221 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6222 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6223 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6224 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 // we are done with the input
6226 vos_mem_free(pEnterBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006227 /* Store param pointer as passed in by caller */
6228 /* store Params pass it to WDI */
6229 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
6230 pWdaParams->pWdaContext = pWDA;
6231 pWdaParams->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006232 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6233 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006234 if (IS_WDI_STATUS_FAILURE(status))
6235 {
6236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6237 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6238 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6239 vos_mem_free(pWdaParams);
6240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006241 return CONVERT_WDI2VOS_STATUS(status);
6242}
Jeff Johnson295189b2012-06-20 16:38:30 -07006243/*
6244 * FUNCTION: WDA_ExitBmpsReqCallback
6245 * send Exit BMPS RSP back to PE
6246 */
6247void WDA_ExitBmpsReqCallback(WDI_Status status, void* pUserData)
6248{
6249 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6250 tWDA_CbContext *pWDA;
6251 tExitBmpsParams *pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6253 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006254 if(NULL == pWdaParams)
6255 {
6256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6257 "%s: pWdaParams received NULL", __FUNCTION__);
6258 VOS_ASSERT(0) ;
6259 return ;
6260 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006261 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
6262 pExitBmpsReqParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam ;
6263
Jeff Johnson295189b2012-06-20 16:38:30 -07006264 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6265 vos_mem_free(pWdaParams) ;
6266
Jeff Johnson295189b2012-06-20 16:38:30 -07006267 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006268 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006269 return ;
6270}
Jeff Johnson295189b2012-06-20 16:38:30 -07006271/*
6272 * FUNCTION: WDA_ProcessExitBmpsReq
6273 * Request to WDI to Exit BMPS power state.
6274 */
6275VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
6276 tExitBmpsParams *pExitBmpsReqParams)
6277{
6278 WDI_Status status = WDI_STATUS_SUCCESS ;
6279 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
6280 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
6281 sizeof(WDI_ExitBmpsReqParamsType)) ;
6282 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006283 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6284 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006285 if(NULL == wdiExitBmpsReqParams)
6286 {
6287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6288 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6289 VOS_ASSERT(0);
6290 return VOS_STATUS_E_NOMEM;
6291 }
6292 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6293 if(NULL == pWdaParams)
6294 {
6295 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6296 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6297 VOS_ASSERT(0);
6298 vos_mem_free(wdiExitBmpsReqParams);
6299 return VOS_STATUS_E_NOMEM;
6300 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006301 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
Jeff Johnsone7245742012-09-05 17:12:55 -07006302
6303 wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
6304
Jeff Johnson295189b2012-06-20 16:38:30 -07006305 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
6306
6307 /* Store param pointer as passed in by caller */
6308 /* store Params pass it to WDI */
6309 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
6310 pWdaParams->pWdaContext = pWDA;
6311 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006312 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
6313 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006314 if(IS_WDI_STATUS_FAILURE(status))
6315 {
6316 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6317 "Failure in Exit BMPS REQ WDI API, free all the memory " );
6318 vos_mem_free(pWdaParams->wdaMsgParam) ;
6319 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6320 vos_mem_free(pWdaParams) ;
6321 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006322 return CONVERT_WDI2VOS_STATUS(status) ;
6323}
Jeff Johnson295189b2012-06-20 16:38:30 -07006324/*
6325 * FUNCTION: WDA_EnterUapsdReqCallback
6326 * send Enter UAPSD RSP back to PE
6327 */
6328void WDA_EnterUapsdReqCallback(WDI_Status status, void* pUserData)
6329{
6330 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6331 tWDA_CbContext *pWDA;
6332 tUapsdParams *pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006333 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6334 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006335 if(NULL == pWdaParams)
6336 {
6337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6338 "%s: pWdaParams received NULL", __FUNCTION__);
6339 VOS_ASSERT(0) ;
6340 return ;
6341 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006342 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006343 pEnterUapsdReqParams = (tUapsdParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006344 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6345 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006346 pEnterUapsdReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006347 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006348 return ;
6349}
Jeff Johnson295189b2012-06-20 16:38:30 -07006350/*
6351 * FUNCTION: WDA_ProcessEnterUapsdReq
6352 * Request to WDI to Enter UAPSD power state.
6353 */
6354VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
6355 tUapsdParams *pEnterUapsdReqParams)
6356{
6357 WDI_Status status = WDI_STATUS_SUCCESS ;
6358 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
6359 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
6360 sizeof(WDI_EnterUapsdReqParamsType)) ;
6361 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006362 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6363 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006364 if(NULL == wdiEnterUapsdReqParams)
6365 {
6366 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6367 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6368 VOS_ASSERT(0);
6369 return VOS_STATUS_E_NOMEM;
6370 }
6371 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6372 if(NULL == pWdaParams)
6373 {
6374 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6375 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6376 VOS_ASSERT(0);
6377 vos_mem_free(wdiEnterUapsdReqParams);
6378 return VOS_STATUS_E_NOMEM;
6379 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006380 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
6381 pEnterUapsdReqParams->beDeliveryEnabled;
6382 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
6383 pEnterUapsdReqParams->beTriggerEnabled;
6384 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
6385 pEnterUapsdReqParams->bkDeliveryEnabled;
6386 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
6387 pEnterUapsdReqParams->bkTriggerEnabled;
6388 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
6389 pEnterUapsdReqParams->viDeliveryEnabled;
6390 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
6391 pEnterUapsdReqParams->viTriggerEnabled;
6392 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
6393 pEnterUapsdReqParams->voDeliveryEnabled;
6394 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
6395 pEnterUapsdReqParams->voTriggerEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07006396 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006397
6398 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
6399
Jeff Johnson295189b2012-06-20 16:38:30 -07006400 /* Store param pointer as passed in by caller */
6401 /* store Params pass it to WDI */
6402 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
6403 pWdaParams->pWdaContext = pWDA;
6404 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006405 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
6406 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006407 if(IS_WDI_STATUS_FAILURE(status))
6408 {
6409 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6410 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
6411 vos_mem_free(pWdaParams->wdaMsgParam) ;
6412 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6413 vos_mem_free(pWdaParams) ;
6414 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006415 return CONVERT_WDI2VOS_STATUS(status) ;
6416}
Jeff Johnson295189b2012-06-20 16:38:30 -07006417/*
6418 * FUNCTION: WDA_ExitUapsdReqCallback
6419 * send Exit UAPSD RSP back to PE
6420 */
6421void WDA_ExitUapsdReqCallback(WDI_Status status, void* pUserData)
6422{
6423 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6425 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006426 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006427 return ;
6428}
Jeff Johnson295189b2012-06-20 16:38:30 -07006429/*
6430 * FUNCTION: WDA_ProcessExitUapsdReq
6431 * Request to WDI to Exit UAPSD power state.
6432 */
6433VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA)
6434{
6435 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6437 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006438 status = WDI_ExitUapsdReq((WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006439 if(IS_WDI_STATUS_FAILURE(status))
6440 {
6441 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6442 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
6443 pWDA->wdaWdiApiMsgParam = NULL;
6444 pWDA->wdaMsgParam = NULL;
6445 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006446 return CONVERT_WDI2VOS_STATUS(status) ;
6447}
6448
Jeff Johnson295189b2012-06-20 16:38:30 -07006449/*
6450 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
6451 *
6452 */
6453void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
6454{
6455 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006456 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6457 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006458 if(NULL == pWdaParams)
6459 {
6460 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6461 "%s: pWdaParams received NULL", __FUNCTION__);
6462 VOS_ASSERT(0) ;
6463 return ;
6464 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006465 if( pWdaParams != NULL )
6466 {
6467 if( pWdaParams->wdaWdiApiMsgParam != NULL )
6468 {
6469 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6470 }
6471 if( pWdaParams->wdaMsgParam != NULL )
6472 {
6473 vos_mem_free(pWdaParams->wdaMsgParam) ;
6474 }
6475 vos_mem_free(pWdaParams) ;
6476 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006477 return ;
6478}
Jeff Johnson295189b2012-06-20 16:38:30 -07006479/*
6480 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
6481 * Request to WDI to set the power save params at start.
6482 */
6483VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
6484 tSirPowerSaveCfg *pPowerSaveCfg)
6485{
6486 WDI_Status status = WDI_STATUS_SUCCESS ;
6487 tHalCfg *tlvStruct = NULL ;
6488 tANI_U8 *tlvStructStart = NULL ;
6489 v_PVOID_t *configParam;
6490 tANI_U32 configParamSize;
6491 tANI_U32 *configDataValue;
6492 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
6493 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6495 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006496 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
6497 {
6498 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6499 "%s: invalid param", __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_FAILURE;
6503 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006504 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
6505 if (NULL == wdiPowerSaveCfg)
6506 {
6507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6508 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6509 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07006510 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006511 return VOS_STATUS_E_NOMEM;
6512 }
6513 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6514 if(NULL == pWdaParams)
6515 {
6516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6517 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6518 VOS_ASSERT(0);
6519 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006520 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006521 return VOS_STATUS_E_NOMEM;
6522 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006523 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
6524 configParam = vos_mem_malloc(configParamSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07006525 if(NULL == configParam)
6526 {
6527 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6528 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07006529 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006530 vos_mem_free(pWdaParams);
6531 vos_mem_free(wdiPowerSaveCfg);
Jeff Johnsone7245742012-09-05 17:12:55 -07006532 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006533 return VOS_STATUS_E_NOMEM;
6534 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006535 vos_mem_set(configParam, configParamSize, 0);
6536 wdiPowerSaveCfg->pConfigBuffer = configParam;
6537 tlvStruct = (tHalCfg *)configParam;
6538 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006539 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
6540 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
6541 tlvStruct->length = sizeof(tANI_U32);
6542 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6543 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006544 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6545 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006546 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
6547 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
6548 tlvStruct->length = sizeof(tANI_U32);
6549 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6550 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07006551 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6552 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006553 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
6554 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
6555 tlvStruct->length = sizeof(tANI_U32);
6556 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6557 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
Jeff Johnson295189b2012-06-20 16:38:30 -07006558 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6559 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006560 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
6561 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
6562 tlvStruct->length = sizeof(tANI_U32);
6563 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6564 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07006565 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6566 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006567 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
6568 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
6569 tlvStruct->length = sizeof(tANI_U32);
6570 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6571 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
Jeff Johnson295189b2012-06-20 16:38:30 -07006572 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6573 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006574 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
6575 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
6576 tlvStruct->length = sizeof(tANI_U32);
6577 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6578 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07006579 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6580 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006581 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
6582 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
6583 tlvStruct->length = sizeof(tANI_U32);
6584 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6585 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006586 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6587 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006588 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
6589 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
6590 tlvStruct->length = sizeof(tANI_U32);
6591 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6592 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
6593 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6594 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006595 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
6596 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
6597 tlvStruct->length = sizeof(tANI_U32);
6598 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6599 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
6600 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6601 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006602 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
6603 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
6604 tlvStruct->length = sizeof(tANI_U32);
6605 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6606 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
Jeff Johnson295189b2012-06-20 16:38:30 -07006607 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6608 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006609 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
6610 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
6611 tlvStruct->length = sizeof(tANI_U32);
6612 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6613 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -07006614 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6615 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006616 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006617 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006618 /* store Params pass it to WDI */
6619 pWdaParams->wdaMsgParam = configParam;
6620 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
6621 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006622 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
6623 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006624 if(IS_WDI_STATUS_FAILURE(status))
6625 {
6626 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6627 "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " );
6628 vos_mem_free(pWdaParams->wdaMsgParam);
6629 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6630 vos_mem_free(pWdaParams);
6631 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006632 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006633 return CONVERT_WDI2VOS_STATUS(status);
6634}
Jeff Johnson295189b2012-06-20 16:38:30 -07006635/*
6636 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
6637 *
6638 */
6639void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
6640{
6641 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6643 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006644 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6645 vos_mem_free(pWdaParams);
6646
Jeff Johnson295189b2012-06-20 16:38:30 -07006647 return ;
6648}
Jeff Johnson295189b2012-06-20 16:38:30 -07006649/*
6650 * FUNCTION: WDA_SetUapsdAcParamsReq
6651 * Request to WDI to set the UAPSD params for an ac (sta mode).
6652 */
6653VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
6654 tUapsdInfo *pUapsdInfo)
6655{
6656 WDI_Status status = WDI_STATUS_SUCCESS;
6657 tWDA_CbContext *pWDA = NULL ;
6658 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
6659 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
6660 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
6661 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006662 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6663 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006664 if(NULL == wdiUapsdParams)
6665 {
6666 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6667 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6668 VOS_ASSERT(0);
6669 return VOS_STATUS_E_NOMEM;
6670 }
6671 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6672 if(NULL == pWdaParams)
6673 {
6674 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6675 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6676 VOS_ASSERT(0);
6677 vos_mem_free(wdiUapsdParams);
6678 return VOS_STATUS_E_NOMEM;
6679 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006680 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
6681 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
6682 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
6683 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
6684 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
6685 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
Jeff Johnson295189b2012-06-20 16:38:30 -07006686 wdiUapsdParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006687 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07006688 pWdaParams->pWdaContext = pWDA;
6689 /* Store param pointer as passed in by caller */
6690 pWdaParams->wdaMsgParam = pUapsdInfo;
6691 /* store Params pass it to WDI */
6692 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006693 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
6694 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
6695 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006696 if(IS_WDI_STATUS_FAILURE(status))
6697 {
6698 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6699 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
6700 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6701 vos_mem_free(pWdaParams);
6702 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006703 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
6704 return VOS_STATUS_SUCCESS;
6705 else
6706 return VOS_STATUS_E_FAILURE;
6707
Jeff Johnson295189b2012-06-20 16:38:30 -07006708}
6709/*
6710 * FUNCTION: WDA_ClearUapsdAcParamsReq
6711 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
6712 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
6713 * and again enter the UPASD with the modified params. Hence the disable
6714 * function was kept empty.
6715 *
6716 */
6717VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
6718{
6719 /* do nothing */
6720 return VOS_STATUS_SUCCESS;
6721}
Jeff Johnson295189b2012-06-20 16:38:30 -07006722/*
6723 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
6724 *
6725 */
6726void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
6727{
6728 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006729 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6730 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006731 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6732 pWDA->wdaWdiApiMsgParam = NULL;
6733 pWDA->wdaMsgParam = NULL;
6734
Jeff Johnson295189b2012-06-20 16:38:30 -07006735 //print a msg, nothing else to do
6736 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6737 "WDA_UpdateUapsdParamsReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006738 return ;
6739}
Jeff Johnson295189b2012-06-20 16:38:30 -07006740/*
6741 * FUNCTION: WDA_UpdateUapsdParamsReq
6742 * Request to WDI to update UAPSD params (in softAP mode) for a station.
6743 */
6744VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
6745 tUpdateUapsdParams* pUpdateUapsdInfo)
6746{
6747 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006748 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006749 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
6750 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
6751 sizeof(WDI_UpdateUapsdReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6753 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006754 if(NULL == wdiUpdateUapsdParams)
6755 {
6756 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6757 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6758 VOS_ASSERT(0);
6759 return VOS_STATUS_E_NOMEM;
6760 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006761 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
6762 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
6763 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07006764 if((NULL != pWDA->wdaMsgParam) ||
6765 (NULL != pWDA->wdaWdiApiMsgParam))
6766 {
6767 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6768 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6769 vos_mem_free(wdiUpdateUapsdParams);
6770 VOS_ASSERT(0);
6771 return VOS_STATUS_E_FAILURE;
6772 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006773 /* Store param pointer as passed in by caller */
6774 pWDA->wdaMsgParam = pUpdateUapsdInfo;
6775 /* store Params pass it to WDI */
6776 pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006777 wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
6778 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006779
Jeff Johnson43971f52012-07-17 12:26:56 -07006780 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006781 {
6782 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6783 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006784 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006785 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6786 vos_mem_free(pWDA->wdaMsgParam);
6787 pWDA->wdaWdiApiMsgParam = NULL;
6788 pWDA->wdaMsgParam = NULL;
6789 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006790 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006791}
Jeff Johnson295189b2012-06-20 16:38:30 -07006792/*
6793 * FUNCTION: WDA_ConfigureRxpFilterCallback
6794 *
6795 */
6796void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
6797{
6798 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006799 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6800 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006801 if(WDI_STATUS_SUCCESS != wdiStatus)
6802 {
6803 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6804 "%s: RXP config filter failure \n", __FUNCTION__ );
6805 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006806 if(NULL == pWdaParams)
6807 {
6808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6809 "%s: pWdaParams received NULL", __FUNCTION__);
6810 VOS_ASSERT(0) ;
6811 return ;
6812 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006813 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6814 vos_mem_free(pWdaParams->wdaMsgParam);
6815 vos_mem_free(pWdaParams);
6816 return ;
6817}
Jeff Johnson295189b2012-06-20 16:38:30 -07006818/*
6819 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
6820 *
6821 */
6822VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
6823 tSirWlanSetRxpFilters *pWlanSuspendParam)
6824{
Jeff Johnson295189b2012-06-20 16:38:30 -07006825 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006826 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006827 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
6828 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
6829 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
6830 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006831 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6832 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006833 if(NULL == wdiRxpFilterParams)
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(pWlanSuspendParam);
6839 return VOS_STATUS_E_NOMEM;
6840 }
6841 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6842 if(NULL == pWdaParams)
6843 {
6844 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6845 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6846 VOS_ASSERT(0);
6847 vos_mem_free(wdiRxpFilterParams);
6848 vos_mem_free(pWlanSuspendParam);
6849 return VOS_STATUS_E_NOMEM;
6850 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006851 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
6852 pWlanSuspendParam->setMcstBcstFilter;
6853 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
6854 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6855
6856 wdiRxpFilterParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006857 pWdaParams->pWdaContext = pWDA;
6858 pWdaParams->wdaMsgParam = pWlanSuspendParam;
6859 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006860 wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07006861 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
6862 pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07006863 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006864 {
6865 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6866 "Failure in configure RXP filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006867 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006868 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6869 vos_mem_free(pWdaParams->wdaMsgParam);
6870 vos_mem_free(pWdaParams);
6871 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006872 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006873}
Jeff Johnson295189b2012-06-20 16:38:30 -07006874/*
6875 * FUNCTION: WDA_WdiIndicationCallback
6876 *
6877 */
6878void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
6879 void* pUserData)
6880{
6881 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6882 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006883}
Jeff Johnson295189b2012-06-20 16:38:30 -07006884/*
6885 * FUNCTION: WDA_ProcessWlanSuspendInd
6886 *
6887 */
6888VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
6889 tSirWlanSuspendParam *pWlanSuspendParam)
6890{
6891 WDI_Status wdiStatus;
6892 WDI_SuspendParamsType wdiSuspendParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6894 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006895 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
6896 pWlanSuspendParam->configuredMcstBcstFilterSetting;
6897 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
6898 wdiSuspendParams.pUserData = pWDA;
6899 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
Jeff Johnson295189b2012-06-20 16:38:30 -07006900 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
6901 if(WDI_STATUS_PENDING == wdiStatus)
6902 {
6903 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6904 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006905 }
6906 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
6907 {
6908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6909 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
6910 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006911 vos_mem_free(pWlanSuspendParam);
6912 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
6913}
6914
Jeff Johnson295189b2012-06-20 16:38:30 -07006915/*
6916 * FUNCTION: WDA_ProcessWlanResumeCallback
6917 *
6918 */
6919void WDA_ProcessWlanResumeCallback(
6920 WDI_SuspendResumeRspParamsType *resumeRspParams,
6921 void* pUserData)
6922{
6923 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006924 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6925 "<------ %s " ,__FUNCTION__);
6926 if(NULL == pWdaParams)
6927 {
6928 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6929 "%s: pWdaParams received NULL", __FUNCTION__);
6930 VOS_ASSERT(0) ;
6931 return ;
6932 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006933 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
6934 {
6935 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6936 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
6937 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006938 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6939 vos_mem_free(pWdaParams->wdaMsgParam);
6940 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006941 return ;
6942}
Jeff Johnson295189b2012-06-20 16:38:30 -07006943/*
6944 * FUNCTION: WDA_ProcessWlanResumeReq
6945 *
6946 */
6947VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
6948 tSirWlanResumeParam *pWlanResumeParam)
6949{
6950 WDI_Status wdiStatus;
6951 WDI_ResumeParamsType *wdiResumeParams =
6952 (WDI_ResumeParamsType *)vos_mem_malloc(
6953 sizeof(WDI_ResumeParamsType) ) ;
6954 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6956 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006957 if(NULL == wdiResumeParams)
6958 {
6959 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6960 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6961 VOS_ASSERT(0);
6962 return VOS_STATUS_E_NOMEM;
6963 }
6964 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6965 if(NULL == pWdaParams)
6966 {
6967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6968 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6969 VOS_ASSERT(0);
6970 vos_mem_free(wdiResumeParams);
6971 return VOS_STATUS_E_NOMEM;
6972 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006973 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
6974 pWlanResumeParam->configuredMcstBcstFilterSetting;
Jeff Johnson295189b2012-06-20 16:38:30 -07006975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
6976 wdiResumeParams->wdiReqStatusCB = NULL;
6977 pWdaParams->wdaMsgParam = pWlanResumeParam;
6978 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
6979 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006980 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
6981 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
6982 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006983 if(IS_WDI_STATUS_FAILURE(wdiStatus))
6984 {
6985 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6986 "Failure in Host Resume REQ WDI API, free all the memory " );
6987 VOS_ASSERT(0);
6988 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6989 vos_mem_free(pWdaParams->wdaMsgParam);
6990 vos_mem_free(pWdaParams);
6991 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006992 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
6993}
6994
Jeff Johnson295189b2012-06-20 16:38:30 -07006995/*
6996 * FUNCTION: WDA_SetBeaconFilterReqCallback
6997 *
6998 */
6999void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7000{
7001 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007002 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7003 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007004 if(NULL == pWdaParams)
7005 {
7006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7007 "%s: pWdaParams received NULL", __FUNCTION__);
7008 VOS_ASSERT(0) ;
7009 return ;
7010 }
7011
7012 vos_mem_free(pWdaParams->wdaMsgParam) ;
7013 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7014 vos_mem_free(pWdaParams) ;
7015 /*
7016 * No respone required for SetBeaconFilter req so just free the request
7017 * param here
7018 */
7019
Jeff Johnson295189b2012-06-20 16:38:30 -07007020 return ;
7021}
Jeff Johnson295189b2012-06-20 16:38:30 -07007022/*
7023 * FUNCTION: WDA_SetBeaconFilterReq
7024 * Request to WDI to send the beacon filtering related information.
7025 */
7026VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7027 tBeaconFilterMsg* pBeaconFilterInfo)
7028{
7029 WDI_Status status = WDI_STATUS_SUCCESS;
7030 tANI_U8 *dstPtr, *srcPtr;
7031 tANI_U8 filterLength;
7032 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7033 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7034 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7035 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007036 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7037 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007038 if(NULL == wdiBeaconFilterInfo)
7039 {
7040 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7041 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7042 VOS_ASSERT(0);
7043 return VOS_STATUS_E_NOMEM;
7044 }
7045 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7046 if(NULL == pWdaParams)
7047 {
7048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7049 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7050 VOS_ASSERT(0);
7051 vos_mem_free(wdiBeaconFilterInfo);
7052 return VOS_STATUS_E_NOMEM;
7053 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007054 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7055 pBeaconFilterInfo->beaconInterval;
7056 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7057 pBeaconFilterInfo->capabilityInfo;
7058 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7059 pBeaconFilterInfo->capabilityMask;
7060 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
Jeff Johnson295189b2012-06-20 16:38:30 -07007061 //Fill structure with info contained in the beaconFilterTable
7062 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7063 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7064 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7065 if(WDI_BEACON_FILTER_LEN < filterLength)
7066 {
7067 filterLength = WDI_BEACON_FILTER_LEN;
7068 }
7069 vos_mem_copy(dstPtr, srcPtr, filterLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07007070 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7071 /* Store param pointer as passed in by caller */
7072 /* store Params pass it to WDI */
7073 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7074 pWdaParams->pWdaContext = pWDA;
7075 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7076
Jeff Johnson295189b2012-06-20 16:38:30 -07007077 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7078 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007079 if(IS_WDI_STATUS_FAILURE(status))
7080 {
7081 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7082 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7083 vos_mem_free(pWdaParams->wdaMsgParam) ;
7084 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7085 vos_mem_free(pWdaParams) ;
7086 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007087 return CONVERT_WDI2VOS_STATUS(status) ;
7088}
Jeff Johnson295189b2012-06-20 16:38:30 -07007089/*
7090 * FUNCTION: WDA_RemBeaconFilterReqCallback
7091 *
7092 */
7093void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7094{
7095 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007096 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7097 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007098 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7099 pWDA->wdaWdiApiMsgParam = NULL;
7100 pWDA->wdaMsgParam = NULL;
7101
Jeff Johnson295189b2012-06-20 16:38:30 -07007102 //print a msg, nothing else to do
7103 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7104 "WDA_RemBeaconFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007105 return ;
7106}
Jeff Johnson295189b2012-06-20 16:38:30 -07007107 // TODO: PE does not have this feature for now implemented,
7108 // but the support for removing beacon filter exists between
7109 // HAL and FW. This function can be called whenever PE defines
7110 // a new message for beacon filter removal
Jeff Johnson295189b2012-06-20 16:38:30 -07007111/*
7112 * FUNCTION: WDA_RemBeaconFilterReq
7113 * Request to WDI to send the removal of beacon filtering related information.
7114 */
7115VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
7116 tRemBeaconFilterMsg* pBeaconFilterInfo)
7117{
7118 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007119 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007120 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
7121 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
7122 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007123 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7124 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007125 if(NULL == wdiBeaconFilterInfo)
7126 {
7127 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7128 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7129 VOS_ASSERT(0);
7130 return VOS_STATUS_E_NOMEM;
7131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007132 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
7133 pBeaconFilterInfo->ucIeCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07007134 //Fill structure with info contained in the ucRemIeId
7135 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
7136 pBeaconFilterInfo->ucRemIeId,
7137 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
7138 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007139 if((NULL != pWDA->wdaMsgParam) ||
7140 (NULL != pWDA->wdaWdiApiMsgParam))
7141 {
7142 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7143 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7144 vos_mem_free(wdiBeaconFilterInfo);
7145 VOS_ASSERT(0);
7146 return VOS_STATUS_E_FAILURE;
7147 }
7148
7149 /* Store param pointer as passed in by caller */
7150 pWDA->wdaMsgParam = pBeaconFilterInfo;
7151 /* store Params pass it to WDI */
7152 pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
Jeff Johnson43971f52012-07-17 12:26:56 -07007153 wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007154 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007155 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007156 {
7157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7158 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007159 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007160 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7161 vos_mem_free(pWDA->wdaMsgParam);
7162 pWDA->wdaWdiApiMsgParam = NULL;
7163 pWDA->wdaMsgParam = NULL;
7164 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007165 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007166}
Jeff Johnson295189b2012-06-20 16:38:30 -07007167/*
7168 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
7169 *
7170 */
7171void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
7172{
7173 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7175 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007176 if(NULL == pWdaParams)
7177 {
7178 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7179 "%s: pWdaParams received NULL", __FUNCTION__);
7180 VOS_ASSERT(0) ;
7181 return ;
7182 }
7183
7184 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7185 vos_mem_free(pWdaParams) ;
7186
Jeff Johnson295189b2012-06-20 16:38:30 -07007187 return ;
7188}
Jeff Johnson295189b2012-06-20 16:38:30 -07007189/*
7190 * FUNCTION: WDA_SetRSSIThresholdsReq
7191 * Request to WDI to set the RSSI thresholds (sta mode).
7192 */
7193VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
7194{
7195 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007196 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007197 tWDA_CbContext *pWDA = NULL ;
7198 v_PVOID_t pVosContext = NULL;
7199 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
7200 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
7201 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
7202 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007203 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7204 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007205 if(NULL == wdiRSSIThresholdsInfo)
7206 {
7207 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7208 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7209 VOS_ASSERT(0);
7210 return VOS_STATUS_E_NOMEM;
7211 }
7212 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7213 if(NULL == pWdaParams)
7214 {
7215 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7216 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7217 VOS_ASSERT(0);
7218 vos_mem_free(wdiRSSIThresholdsInfo);
7219 return VOS_STATUS_E_NOMEM;
7220 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007221 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
Jeff Johnson295189b2012-06-20 16:38:30 -07007222 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
7223 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
7224 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
Jeff Johnson295189b2012-06-20 16:38:30 -07007225 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
7226 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
7227 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007228 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
7229 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
7230 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007231 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007232 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
7233 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7234
Jeff Johnson295189b2012-06-20 16:38:30 -07007235 /* Store param pointer as passed in by caller */
7236 /* store Params pass it to WDI */
7237 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
7238 pWdaParams->pWdaContext = pWDA;
7239 pWdaParams->wdaMsgParam = pBmpsThresholds;
Jeff Johnson43971f52012-07-17 12:26:56 -07007240 wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007241 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007242 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007243 {
7244 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7245 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007246 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007247 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7248 vos_mem_free(pWdaParams) ;
7249 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007250 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007251
7252}/*WDA_SetRSSIThresholdsReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007253/*
7254 * FUNCTION: WDA_HostOffloadReqCallback
7255 *
7256 */
7257void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
7258{
7259 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7260
7261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7262 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007263 if(NULL == pWdaParams)
7264 {
7265 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7266 "%s: pWdaParams received NULL", __FUNCTION__);
7267 VOS_ASSERT(0) ;
7268 return ;
7269 }
7270
7271 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7272 vos_mem_free(pWdaParams->wdaMsgParam);
7273 vos_mem_free(pWdaParams) ;
7274
7275 //print a msg, nothing else to do
7276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7277 "WDA_HostOffloadReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007278 return ;
7279}
Jeff Johnson295189b2012-06-20 16:38:30 -07007280/*
7281 * FUNCTION: WDA_ProcessHostOffloadReq
7282 * Request to WDI to set the filter to minimize unnecessary host wakeup due
7283 * to broadcast traffic (sta mode).
7284 */
7285VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
7286 tSirHostOffloadReq *pHostOffloadParams)
7287{
7288 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007289 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007290 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
7291 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
7292 sizeof(WDI_HostOffloadReqParamsType)) ;
7293 tWDA_ReqParams *pWdaParams ;
7294
7295 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7296 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
7297
7298 if(NULL == wdiHostOffloadInfo)
7299 {
7300 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7301 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7302 VOS_ASSERT(0);
7303 return VOS_STATUS_E_NOMEM;
7304 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007305 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7306 if(NULL == pWdaParams)
7307 {
7308 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7309 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7310 VOS_ASSERT(0);
7311 vos_mem_free(wdiHostOffloadInfo);
7312 return VOS_STATUS_E_NOMEM;
7313 }
7314
7315 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
7316 pHostOffloadParams->offloadType;
7317 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
7318 pHostOffloadParams->enableOrDisable;
7319
Jeff Johnsone7245742012-09-05 17:12:55 -07007320 wdiHostOffloadInfo->wdiHostOffloadInfo.bssIdx =
7321 pHostOffloadParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07007322 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
7323 {
7324 case SIR_IPV4_ARP_REPLY_OFFLOAD:
7325 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
7326 pHostOffloadParams->params.hostIpv4Addr,
7327 4);
7328 break;
7329 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7330 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7331 pHostOffloadParams->params.hostIpv6Addr,
7332 16);
7333 break;
7334 case SIR_IPV6_NS_OFFLOAD:
7335 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7336 pHostOffloadParams->params.hostIpv6Addr,
7337 16);
7338
7339#ifdef WLAN_NS_OFFLOAD
7340 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
7341 {
7342 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
7343 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
7344 16);
7345 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
7346 }
7347 else
7348 {
7349 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
7350 }
7351
7352 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
7353 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
7354 16);
7355 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
7356 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
7357 6);
7358
7359 //Only two are supported so let's go through them without a loop
7360 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
7361 {
7362 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
7363 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
7364 16);
7365 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
7366 }
7367 else
7368 {
7369 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
7370 }
7371
7372 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
7373 {
7374 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
7375 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
7376 16);
7377 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
7378 }
7379 else
7380 {
7381 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
7382 }
7383 break;
7384#endif //WLAN_NS_OFFLOAD
7385 default:
7386 {
7387 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7388 "No Handling for Offload Type %x in WDA "
7389 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
7390 //WDA_VOS_ASSERT(0) ;
7391 }
7392 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007393 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007394 if((NULL != pWDA->wdaMsgParam) ||
7395 (NULL != pWDA->wdaWdiApiMsgParam))
7396 {
7397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7398 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7399 VOS_ASSERT(0);
7400 vos_mem_free(wdiHostOffloadInfo);
7401 return VOS_STATUS_E_FAILURE;
7402 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007403 /* Store param pointer as passed in by caller */
7404 /* store Params pass it to WDI */
7405 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7406 pWdaParams->pWdaContext = pWDA;
7407 pWdaParams->wdaMsgParam = pHostOffloadParams;
7408
Jeff Johnson43971f52012-07-17 12:26:56 -07007409 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007410 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7411
Jeff Johnson43971f52012-07-17 12:26:56 -07007412 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007413 {
7414 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7415 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007416 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007417 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7418 vos_mem_free(pWdaParams->wdaMsgParam);
7419 vos_mem_free(pWdaParams) ;
7420 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007421 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007422
7423}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007424/*
7425 * FUNCTION: WDA_KeepAliveReqCallback
7426 *
7427 */
7428void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7429{
7430 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007431 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7432 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007433 vos_mem_free(pWDA->wdaWdiApiMsgParam);
7434 vos_mem_free(pWDA->wdaMsgParam);
7435 pWDA->wdaWdiApiMsgParam = NULL;
7436 pWDA->wdaMsgParam = NULL;
7437
Jeff Johnson295189b2012-06-20 16:38:30 -07007438 //print a msg, nothing else to do
7439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7440 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007441 return ;
7442}
Jeff Johnson295189b2012-06-20 16:38:30 -07007443/*
7444 * FUNCTION: WDA_ProcessKeepAliveReq
7445 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7446 * wakeup due to broadcast traffic (sta mode).
7447 */
7448VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7449 tSirKeepAliveReq *pKeepAliveParams)
7450{
7451 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007452 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007453 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7454 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7455 sizeof(WDI_KeepAliveReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007456 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7457 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007458 if(NULL == wdiKeepAliveInfo)
7459 {
7460 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7461 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7462 VOS_ASSERT(0);
7463 return VOS_STATUS_E_NOMEM;
7464 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007465 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7466 pKeepAliveParams->packetType;
7467 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7468 pKeepAliveParams->timePeriod;
Jeff Johnsone7245742012-09-05 17:12:55 -07007469 wdiKeepAliveInfo->wdiKeepAliveInfo.bssIdx =
7470 pKeepAliveParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07007471
7472 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7473 {
7474 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7475 pKeepAliveParams->hostIpv4Addr,
7476 SIR_IPV4_ADDR_LEN);
7477 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7478 pKeepAliveParams->destIpv4Addr,
7479 SIR_IPV4_ADDR_LEN);
7480 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7481 pKeepAliveParams->destMacAddr,
7482 SIR_MAC_ADDR_LEN);
7483 }
7484 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7485 {
7486 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7487 SIR_IPV4_ADDR_LEN,
7488 0);
7489 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7490 SIR_IPV4_ADDR_LEN,
7491 0);
7492 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7493 SIR_MAC_ADDR_LEN,
7494 0);
7495 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007496 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007497 if((NULL != pWDA->wdaMsgParam) ||
7498 (NULL != pWDA->wdaWdiApiMsgParam))
7499 {
7500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7501 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7502 VOS_ASSERT(0);
7503 vos_mem_free(wdiKeepAliveInfo);
7504 return VOS_STATUS_E_FAILURE;
7505 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007506 /* Store param pointer as passed in by caller */
7507 pWDA->wdaMsgParam = pKeepAliveParams;
7508 /* store Params pass it to WDI */
7509 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007510 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7511 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7512 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7513 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7514 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7515 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7516 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7517 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7518 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7519 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7520 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7521 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7522 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7523 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7524 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7525 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7526 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7527 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7528 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7529 "TimePeriod %d PacketType %d",
7530 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7531 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007532 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007533 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007534 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007535 {
7536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7537 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007538 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007539 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7540 vos_mem_free(pWDA->wdaMsgParam);
7541 pWDA->wdaWdiApiMsgParam = NULL;
7542 pWDA->wdaMsgParam = NULL;
7543 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007544 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007545
7546}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007547/*
7548 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7549 *
7550 */
7551void WDA_WowlAddBcPtrnReqCallback(WDI_Status status, void* pUserData)
7552{
7553 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007554 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7555 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007556 if(NULL == pWdaParams)
7557 {
7558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7559 "%s: pWdaParams received NULL", __FUNCTION__);
7560 VOS_ASSERT(0) ;
7561 return ;
7562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007563 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7564 vos_mem_free(pWdaParams->wdaMsgParam);
7565 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007566 return ;
7567}
Jeff Johnson295189b2012-06-20 16:38:30 -07007568/*
7569 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7570 * Request to WDI to add WOWL Bcast pattern
7571 */
7572VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7573 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7574{
7575 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007576 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007577 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7578 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7579 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7580 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007581 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7582 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007583 if(NULL == wdiWowlAddBcPtrnInfo)
7584 {
7585 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7586 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7587 VOS_ASSERT(0);
7588 return VOS_STATUS_E_NOMEM;
7589 }
7590 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7591 if(NULL == pWdaParams)
7592 {
7593 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7594 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7595 VOS_ASSERT(0);
7596 vos_mem_free(wdiWowlAddBcPtrnInfo);
7597 return VOS_STATUS_E_NOMEM;
7598 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007599 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7600 pWowlAddBcPtrnParams->ucPatternId;
7601 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7602 pWowlAddBcPtrnParams->ucPatternByteOffset;
7603 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7604 pWowlAddBcPtrnParams->ucPatternMaskSize;
7605 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7606 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007607 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7608 {
7609 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7610 pWowlAddBcPtrnParams->ucPattern,
7611 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7612 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7613 pWowlAddBcPtrnParams->ucPatternMask,
7614 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7615 }
7616 else
7617 {
7618 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7619 pWowlAddBcPtrnParams->ucPattern,
7620 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7621 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7622 pWowlAddBcPtrnParams->ucPatternMask,
7623 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7624
7625 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7626 pWowlAddBcPtrnParams->ucPatternExt,
7627 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7628 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7629 pWowlAddBcPtrnParams->ucPatternMaskExt,
7630 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7631 }
7632
7633 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007634 /* Store param pointer as passed in by caller */
7635 /* store Params pass it to WDI */
7636 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7637 pWdaParams->pWdaContext = pWDA;
7638 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007639 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007640 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007641 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007642 {
7643 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7644 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007645 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007646 vos_mem_free(pWdaParams->wdaMsgParam) ;
7647 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7648 vos_mem_free(pWdaParams) ;
7649 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007650 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007651
7652}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007653/*
7654 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7655 *
7656 */
7657void WDA_WowlDelBcPtrnReqCallback(WDI_Status status, void* pUserData)
7658{
7659 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007660 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7661 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007662 if(NULL == pWdaParams)
7663 {
7664 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7665 "%s: pWdaParams received NULL", __FUNCTION__);
7666 VOS_ASSERT(0) ;
7667 return ;
7668 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007669 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7670 vos_mem_free(pWdaParams->wdaMsgParam);
7671 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007672 return ;
7673}
Jeff Johnson295189b2012-06-20 16:38:30 -07007674/*
7675 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7676 * Request to WDI to delete WOWL Bcast pattern
7677 */
7678VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7679 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7680{
7681 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007682 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007683 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7684 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7685 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7686 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007687 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7688 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007689 if(NULL == wdiWowlDelBcPtrnInfo)
7690 {
7691 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7692 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7693 VOS_ASSERT(0);
7694 return VOS_STATUS_E_NOMEM;
7695 }
7696 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7697 if(NULL == pWdaParams)
7698 {
7699 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7700 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7701 VOS_ASSERT(0);
7702 vos_mem_free(wdiWowlDelBcPtrnInfo);
7703 return VOS_STATUS_E_NOMEM;
7704 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007705 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7706 pWowlDelBcPtrnParams->ucPatternId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007707 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007708 /* Store param pointer as passed in by caller */
7709 /* store Params pass it to WDI */
7710 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7711 pWdaParams->pWdaContext = pWDA;
7712 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007713 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007714 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007715 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007716 {
7717 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7718 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007719 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007720 vos_mem_free(pWdaParams->wdaMsgParam) ;
7721 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7722 vos_mem_free(pWdaParams) ;
7723 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007724 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007725
7726}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007727/*
7728 * FUNCTION: WDA_WowlEnterReqCallback
7729 *
7730 */
7731void WDA_WowlEnterReqCallback(WDI_Status status, void* pUserData)
7732{
7733 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7734 tWDA_CbContext *pWDA;
7735 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007736 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7737 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007738 if(NULL == pWdaParams)
7739 {
7740 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7741 "%s: pWdaParams received NULL", __FUNCTION__);
7742 VOS_ASSERT(0) ;
7743 return ;
7744 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007745 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7746 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
7747
Jeff Johnson295189b2012-06-20 16:38:30 -07007748 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7749 vos_mem_free(pWdaParams) ;
7750
Jeff Johnson295189b2012-06-20 16:38:30 -07007751 pWowlEnterParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007752 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007753 return ;
7754}
Jeff Johnson295189b2012-06-20 16:38:30 -07007755/*
7756 * FUNCTION: WDA_ProcessWowlEnterReq
7757 * Request to WDI to enter WOWL
7758 */
7759VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
7760 tSirHalWowlEnterParams *pWowlEnterParams)
7761{
7762 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007763 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007764 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
7765 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
7766 sizeof(WDI_WowlEnterReqParamsType)) ;
7767 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007768 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7769 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007770 if(NULL == wdiWowlEnterInfo)
7771 {
7772 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7773 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7774 VOS_ASSERT(0);
7775 return VOS_STATUS_E_NOMEM;
7776 }
7777 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7778 if(NULL == pWdaParams)
7779 {
7780 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7781 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7782 VOS_ASSERT(0);
7783 vos_mem_free(wdiWowlEnterInfo);
7784 return VOS_STATUS_E_NOMEM;
7785 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007786 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
7787 pWowlEnterParams->magicPtrn,
7788 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007789 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
7790 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007791 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
7792 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007793 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
7794 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007795 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
7796 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007797 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
7798 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007799 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
7800 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007801 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
7802 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07007803 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
7804 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07007805#ifdef WLAN_WAKEUP_EVENTS
7806 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
7807 pWowlEnterParams->ucWoWEAPIDRequestEnable;
7808
7809 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
7810 pWowlEnterParams->ucWoWEAPOL4WayEnable;
7811
7812 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
7813 pWowlEnterParams->ucWowNetScanOffloadMatch;
7814
7815 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
7816 pWowlEnterParams->ucWowGTKRekeyError;
7817
7818 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
7819 pWowlEnterParams->ucWoWBSSConnLoss;
7820#endif // WLAN_WAKEUP_EVENTS
7821
7822 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007823 /* Store param pointer as passed in by caller */
7824 /* store Params pass it to WDI */
7825 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
7826 pWdaParams->pWdaContext = pWDA;
7827 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007828 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007829 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007830 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007831 {
7832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7833 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007834 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007835 vos_mem_free(pWdaParams->wdaMsgParam) ;
7836 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7837 vos_mem_free(pWdaParams) ;
7838 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007839 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007840
7841}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007842/*
7843 * FUNCTION: WDA_WowlExitReqCallback
7844 *
7845 */
7846void WDA_WowlExitReqCallback(WDI_Status status, void* pUserData)
7847{
7848 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007849 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7850 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007851 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007852 return ;
7853}
Jeff Johnson295189b2012-06-20 16:38:30 -07007854/*
7855 * FUNCTION: WDA_ProcessWowlExitReq
7856 * Request to WDI to add WOWL Bcast pattern
7857 */
7858VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA)
7859{
7860 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007861 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007862
7863 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7864 "------> %s " ,__FUNCTION__);
Jeff Johnson43971f52012-07-17 12:26:56 -07007865 wstatus = WDI_WowlExitReq((WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07007866
Jeff Johnson43971f52012-07-17 12:26:56 -07007867 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007868 {
7869 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7870 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007871 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007872 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7873 vos_mem_free(pWDA->wdaMsgParam);
7874 pWDA->wdaWdiApiMsgParam = NULL;
7875 pWDA->wdaMsgParam = NULL;
7876 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007877 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007878}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007879/*
7880 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
7881 * Request to WDI to determine whether a given station is capable of
7882 * using HW-based frame translation
7883 */
7884v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
7885 tANI_U8 staIdx)
7886{
7887 return WDI_IsHwFrameTxTranslationCapable(staIdx);
7888}
Jeff Johnson295189b2012-06-20 16:38:30 -07007889/*
7890 * FUNCTION: WDA_NvDownloadReqCallback
7891 * send NV Download RSP back to PE
7892 */
7893void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
7894 void* pUserData)
7895{
Jeff Johnson295189b2012-06-20 16:38:30 -07007896 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007897 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7898 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007899 /*Cleaning */
7900 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7901 pWDA->wdaWdiApiMsgParam = NULL;
7902 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007903 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07007904 return ;
7905}
Jeff Johnson295189b2012-06-20 16:38:30 -07007906/*
7907 * FUNCTION: WDA_ProcessNvDownloadReq
7908 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
7909 */
7910VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
7911{
7912 /* Initialize the local Variables*/
7913 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
7914 v_VOID_t *pNvBuffer=NULL;
7915 v_SIZE_t bufferSize = 0;
7916 WDI_Status status = WDI_STATUS_E_FAILURE;
7917 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7919 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007920 if(NULL == pWDA)
7921 {
7922 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7923 "%s:pWDA is NULL", __FUNCTION__);
7924 return VOS_STATUS_E_FAILURE;
7925 }
7926 if(NULL != pWDA->wdaWdiApiMsgParam)
7927 {
7928 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7929 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7930 return VOS_STATUS_E_FAILURE;
7931 }
7932
7933 /* Get the NV structure base address and size from VOS */
7934 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07007935 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
7936 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007937 if(NULL == wdiNvDownloadReqParam)
7938 {
7939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7940 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7941 VOS_ASSERT(0);
7942 return VOS_STATUS_E_NOMEM;
7943 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007944 /* Copy Params to wdiNvDownloadReqParam*/
7945 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
7946 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007947 /* store Params pass it to WDI */
7948 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007949 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007950 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
7951 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07007952 if(IS_WDI_STATUS_FAILURE(status))
7953 {
7954 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7955 "Failure in NV Download REQ Params WDI API, free all the memory " );
7956 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7957 pWDA->wdaWdiApiMsgParam = NULL;
7958 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007959 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007960}
7961/*
7962 * FUNCTION: WDA_FlushAcReqCallback
7963 * send Flush AC RSP back to TL
7964 */
7965void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
7966{
7967 vos_msg_t wdaMsg = {0} ;
7968 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7969 tFlushACReq *pFlushACReqParams;
7970 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007971 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7972 "<------ %s " ,__FUNCTION__);
7973 if(NULL == pWdaParams)
7974 {
7975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7976 "%s: pWdaParams received NULL", __FUNCTION__);
7977 VOS_ASSERT(0) ;
7978 return ;
7979 }
7980
7981 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
7982 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
7983 if(NULL == pFlushACRspParams)
7984 {
7985 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7986 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7987 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07007988 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007989 return ;
7990 }
7991 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
7992 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
7993 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
7994 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
7995 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
7996 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007997 vos_mem_free(pWdaParams->wdaMsgParam) ;
7998 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7999 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008000 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8001 wdaMsg.bodyptr = (void *)pFlushACRspParams;
8002 // POST message to TL
8003 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
8004
Jeff Johnson295189b2012-06-20 16:38:30 -07008005 return ;
8006}
Jeff Johnson295189b2012-06-20 16:38:30 -07008007/*
8008 * FUNCTION: WDA_ProcessFlushAcReq
8009 * Request to WDI to Update the DELBA REQ params.
8010 */
8011VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8012 tFlushACReq *pFlushAcReqParams)
8013{
8014 WDI_Status status = WDI_STATUS_SUCCESS ;
8015 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8016 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8017 sizeof(WDI_FlushAcReqParamsType)) ;
8018 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008019 if(NULL == wdiFlushAcReqParam)
8020 {
8021 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8022 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8023 VOS_ASSERT(0);
8024 return VOS_STATUS_E_NOMEM;
8025 }
8026 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8027 if(NULL == pWdaParams)
8028 {
8029 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8030 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8031 VOS_ASSERT(0);
8032 vos_mem_free(wdiFlushAcReqParam);
8033 return VOS_STATUS_E_NOMEM;
8034 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8036 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008037 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8038 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8039 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8040 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008041 /* Store Flush AC pointer, as this will be used for response */
8042 /* store Params pass it to WDI */
8043 pWdaParams->pWdaContext = pWDA;
8044 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8045 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008046 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8047 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008048 if(IS_WDI_STATUS_FAILURE(status))
8049 {
8050 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8051 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8052 vos_mem_free(pWdaParams->wdaMsgParam) ;
8053 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8054 vos_mem_free(pWdaParams) ;
8055 //TODO: respond to TL with failure
8056 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008057 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008058}
Jeff Johnson295189b2012-06-20 16:38:30 -07008059/*
8060 * FUNCTION: WDA_BtAmpEventReqCallback
8061 *
8062 */
8063void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8064{
8065 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8066 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008067 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008068
8069 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8070 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008071 if(NULL == pWdaParams)
8072 {
8073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8074 "%s: pWdaParams received NULL", __FUNCTION__);
8075 VOS_ASSERT(0) ;
8076 return ;
8077 }
8078 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8079 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8080 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8081 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8082 {
8083 pWDA->wdaAmpSessionOn = VOS_FALSE;
8084 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008085 vos_mem_free(pWdaParams->wdaMsgParam) ;
8086 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8087 vos_mem_free(pWdaParams) ;
8088 /*
8089 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8090 * param here
8091 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008092 return ;
8093}
8094
Jeff Johnson295189b2012-06-20 16:38:30 -07008095/*
8096 * FUNCTION: WDA_ProcessBtAmpEventReq
8097 * Request to WDI to Update with BT AMP events.
8098 */
8099VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8100 tSmeBtAmpEvent *pBtAmpEventParams)
8101{
8102 WDI_Status status = WDI_STATUS_SUCCESS ;
8103 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8104 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8105 sizeof(WDI_BtAmpEventParamsType)) ;
8106 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008107 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8108 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008109 if(NULL == wdiBtAmpEventParam)
8110 {
8111 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8112 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8113 VOS_ASSERT(0);
8114 return VOS_STATUS_E_NOMEM;
8115 }
8116 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8117 if(NULL == pWdaParams)
8118 {
8119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8120 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8121 VOS_ASSERT(0);
8122 vos_mem_free(wdiBtAmpEventParam);
8123 return VOS_STATUS_E_NOMEM;
8124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008125 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8126 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008127 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008128 /* Store BT AMP event pointer, as this will be used for response */
8129 /* store Params pass it to WDI */
8130 pWdaParams->pWdaContext = pWDA;
8131 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8132 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008133 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8134 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008135 if(IS_WDI_STATUS_FAILURE(status))
8136 {
8137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8138 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8139 vos_mem_free(pWdaParams->wdaMsgParam) ;
8140 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8141 vos_mem_free(pWdaParams) ;
8142 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008143 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8144 {
8145 pWDA->wdaAmpSessionOn = VOS_TRUE;
8146 }
8147 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008148}
8149
Jeff Johnson295189b2012-06-20 16:38:30 -07008150#ifdef ANI_MANF_DIAG
8151/*
8152 * FUNCTION: WDA_FTMCommandReqCallback
8153 * Handle FTM CMD response came from HAL
8154 * Route responce to HDD FTM
8155 */
8156void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8157 void *usrData)
8158{
8159 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008160 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8161 {
8162 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8163 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8164 return;
8165 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008166 /* Release Current FTM Command Request */
8167 vos_mem_free(pWDA->wdaFTMCmdReq);
8168 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008169#ifndef WLAN_FTM_STUB
8170 /* Post FTM Responce to HDD FTM */
8171 wlan_sys_ftm(ftmCmdRspData);
8172#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008173 return;
8174}
Jeff Johnson295189b2012-06-20 16:38:30 -07008175/*
8176 * FUNCTION: WDA_ProcessFTMCommand
8177 * Send FTM command to WDI
8178 */
8179VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8180 tPttMsgbuffer *pPTTFtmCmd)
8181{
8182 WDI_Status status = WDI_STATUS_SUCCESS;
8183 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008184 ftmCMDReq = (WDI_FTMCommandReqType *)
8185 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8186 if(NULL == ftmCMDReq)
8187 {
8188 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8189 "WDA FTM Command buffer alloc fail");
8190 return VOS_STATUS_E_NOMEM;
8191 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008192 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8193 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008194 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008195 /* Send command to WDI */
8196 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008197 return status;
8198}
8199#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008200#ifdef FEATURE_OEM_DATA_SUPPORT
8201/*
8202 * FUNCTION: WDA_StartOemDataReqCallback
8203 *
8204 */
8205void WDA_StartOemDataReqCallback(
8206 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8207 void* pUserData)
8208{
8209 VOS_STATUS status = VOS_STATUS_E_FAILURE;
8210 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8211 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008212
Jeff Johnsone7245742012-09-05 17:12:55 -07008213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8214 "<------ %s " ,__FUNCTION__);
8215 if(NULL == pWDA)
8216 {
8217 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8218 "%s:pWDA is NULL", __FUNCTION__);
8219 VOS_ASSERT(0);
8220 return ;
8221 }
8222
8223 /*
8224 * Allocate memory for response params sent to PE
8225 */
8226 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8227
8228 // Check if memory is allocated for OemdataMeasRsp Params.
8229 if(NULL == pOemDataRspParams)
8230 {
8231 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8232 "OEM DATA WDA callback alloc fail");
8233 VOS_ASSERT(0) ;
8234 return;
8235 }
8236 // Free the memory allocated during request.
8237 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8238 vos_mem_free(pWDA->wdaMsgParam) ;
8239 pWDA->wdaWdiApiMsgParam = NULL;
8240 pWDA->wdaMsgParam = NULL;
8241 /*
8242 * Now go ahead and copy other stuff for PE in incase of sucess only
8243 * Also, here success always means that we have atleast one BSSID.
8244 */
8245 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8246
8247 //enable Tx
8248 status = WDA_ResumeDataTx(pWDA);
8249 if(status != VOS_STATUS_SUCCESS)
8250 {
8251 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8252 }
8253 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8254 return ;
8255}
8256/*
8257 * FUNCTION: WDA_ProcessStartOemDataReq
8258 * Send Start Oem Data Req to WDI
8259 */
8260VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8261 tStartOemDataReq *pOemDataReqParams)
8262{
8263 WDI_Status status = WDI_STATUS_SUCCESS;
8264 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
8265
8266 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8267
8268 if(NULL == wdiOemDataReqParams)
8269 {
8270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8271 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8272 VOS_ASSERT(0);
8273 return VOS_STATUS_E_NOMEM;
8274 }
8275
8276 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8277 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
8278
8279 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8280
8281 if((NULL != pWDA->wdaMsgParam) ||
8282 (NULL != pWDA->wdaWdiApiMsgParam))
8283 {
8284 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8285 "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__);
8286 VOS_ASSERT(0);
8287 vos_mem_free(wdiOemDataReqParams);
8288 return VOS_STATUS_E_FAILURE;
8289 }
8290 pWDA->wdaMsgParam = (void *)pOemDataReqParams;
8291 pWDA->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8292
8293 status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
8294
8295 if(IS_WDI_STATUS_FAILURE(status))
8296 {
8297 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8298 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
8299 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8300 vos_mem_free(pWDA->wdaMsgParam);
8301 pWDA->wdaWdiApiMsgParam = NULL;
8302 pWDA->wdaMsgParam = NULL;
8303 }
8304 return CONVERT_WDI2VOS_STATUS(status) ;
8305}
8306#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008307/*
8308 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8309 *
8310 */
8311void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8312{
8313 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008314 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8315 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008316 if(NULL == pWdaParams)
8317 {
8318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8319 "%s: pWdaParams received NULL", __FUNCTION__);
8320 VOS_ASSERT(0) ;
8321 return ;
8322 }
8323
8324 if(NULL != pWdaParams->wdaMsgParam)
8325 {
8326 vos_mem_free(pWdaParams->wdaMsgParam);
8327 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008328 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8329 {
8330 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8331 }
8332
8333 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008334 return ;
8335}
Jeff Johnson295189b2012-06-20 16:38:30 -07008336#ifdef WLAN_FEATURE_GTK_OFFLOAD
8337/*
8338 * FUNCTION: WDA_HostOffloadReqCallback
8339 *
8340 */
8341void WDA_GTKOffloadReqCallback(WDI_Status status, void* pUserData)
8342{
8343 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8344
8345 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8346 "<------ %s " ,__FUNCTION__);
8347
8348 VOS_ASSERT(NULL != pWdaParams);
8349
8350 vos_mem_free(pWdaParams->wdaMsgParam) ;
8351 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8352 vos_mem_free(pWdaParams) ;
8353
8354 //print a msg, nothing else to do
8355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8356 "WDA_GTKOffloadReqCallback invoked " );
8357
8358 return ;
8359}
8360
8361/*
8362 * FUNCTION: WDA_ProcessGTKOffloadReq
8363 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8364 * to broadcast traffic (sta mode).
8365 */
8366VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8367 tpSirGtkOffloadParams pGtkOffloadParams)
8368{
8369 VOS_STATUS status = VOS_STATUS_SUCCESS;
8370 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8371 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8372 sizeof(WDI_GtkOffloadReqMsg)) ;
8373 tWDA_ReqParams *pWdaParams ;
8374
8375 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8376 "------> %s " ,__FUNCTION__);
8377
8378 if(NULL == wdiGtkOffloadReqMsg)
8379 {
8380 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8381 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8382 VOS_ASSERT(0);
8383 return VOS_STATUS_E_NOMEM;
8384 }
8385
8386 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8387 if(NULL == pWdaParams)
8388 {
8389 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8390 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8391 VOS_ASSERT(0);
8392 vos_mem_free(wdiGtkOffloadReqMsg);
8393 return VOS_STATUS_E_NOMEM;
8394 }
8395
8396 //
8397 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8398 //
8399 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8400 // Copy KCK
8401 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8402 // Copy KEK
8403 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8404 // Copy KeyReplayCounter
8405 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8406 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8407
8408 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8409
8410 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8411 (NULL == pWDA->wdaWdiApiMsgParam));
8412
8413 /* Store Params pass it to WDI */
8414 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8415 pWdaParams->pWdaContext = pWDA;
8416 /* Store param pointer as passed in by caller */
8417 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8418
8419 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8420
8421 if(IS_WDI_STATUS_FAILURE(status))
8422 {
8423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8424 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8425 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8426 vos_mem_free(pWdaParams->wdaMsgParam);
8427 vos_mem_free(pWdaParams);
8428 }
8429
8430 return CONVERT_WDI2VOS_STATUS(status) ;
8431}
8432
8433/*
8434 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8435 *
8436 */
8437void WDA_GtkOffloadGetInfoCallback(WDI_Status status, void * pUserData)
8438{
8439 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8440 tWDA_CbContext *pWDA;
8441 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8442 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8443 tANI_U8 i;
8444 vos_msg_t vosMsg;
8445
8446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8447 "<------ %s " ,__FUNCTION__);
8448
8449 VOS_ASSERT(NULL != pWdaParams);
8450
8451 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8452 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8453
8454 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8455 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8456
8457 /* Message Header */
8458 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8459 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8460
8461 pGtkOffloadGetInfoRsp->ulStatus = pGtkOffloadGetInfoReq->ulStatus;
8462 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pGtkOffloadGetInfoReq->ullKeyReplayCounter;
8463 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pGtkOffloadGetInfoReq->ulTotalRekeyCount;
8464 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pGtkOffloadGetInfoReq->ulGTKRekeyCount;
8465 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pGtkOffloadGetInfoReq->ulIGTKRekeyCount;
8466
8467 /* VOS message wrapper */
8468 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8469 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8470 vosMsg.bodyval = 0;
8471
8472 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8473 {
8474 /* free the mem and return */
8475 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8476 }
8477
8478 vos_mem_free(pWdaParams->wdaMsgParam) ;
8479 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8480 vos_mem_free(pWdaParams) ;
8481}
8482#endif
8483
8484/*
8485 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8486 * Request to WDI to set Tx Per Tracking configurations
8487 */
8488VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8489{
8490 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008491 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008492 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8493 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8494 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8495 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8497 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008498 if(NULL == pwdiSetTxPerTrackingReqParams)
8499 {
8500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8501 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8502 vos_mem_free(pTxPerTrackingParams);
8503 VOS_ASSERT(0);
8504 return VOS_STATUS_E_NOMEM;
8505 }
8506 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8507 if(NULL == pWdaParams)
8508 {
8509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8510 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8511 vos_mem_free(pwdiSetTxPerTrackingReqParams);
8512 vos_mem_free(pTxPerTrackingParams);
8513 VOS_ASSERT(0);
8514 return VOS_STATUS_E_NOMEM;
8515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008516 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8517 pTxPerTrackingParams->ucTxPerTrackingEnable;
8518 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8519 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8520 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8521 pTxPerTrackingParams->ucTxPerTrackingRatio;
8522 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8523 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008524 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008525 /* Store param pointer as passed in by caller */
8526 /* store Params pass it to WDI
8527 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8528 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8529 pWdaParams->pWdaContext = pWDA;
8530 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008531 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008532 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008533 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008534 {
8535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8536 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008537 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008538 vos_mem_free(pWdaParams->wdaMsgParam) ;
8539 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8540 vos_mem_free(pWdaParams) ;
8541 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008542 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008543
8544}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008545/*
8546 * FUNCTION: WDA_HALDumpCmdCallback
8547 * Send the VOS complete .
8548 */
8549void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8550 void* pUserData)
8551{
8552 tANI_U8 *buffer = NULL;
8553 tWDA_CbContext *pWDA = NULL;
8554 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008555 if(NULL == pWdaParams)
8556 {
8557 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8558 "%s: pWdaParams received NULL", __FUNCTION__);
8559 VOS_ASSERT(0) ;
8560 return ;
8561 }
8562
8563 pWDA = pWdaParams->pWdaContext;
8564 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008565 if(wdiRspParams->usBufferLen > 0)
8566 {
8567 /*Copy the Resp data to UMAC supplied buffer*/
8568 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8569 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008570 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8571 vos_mem_free(pWdaParams);
8572
8573 /* Indicate VOSS about the start complete */
8574 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008575 return ;
8576}
8577
Jeff Johnson295189b2012-06-20 16:38:30 -07008578/*
8579 * FUNCTION: WDA_ProcessHALDumpCmdReq
8580 * Send Dump command to WDI
8581 */
8582VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8583 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8584 tANI_U32 arg4, tANI_U8 *pBuffer)
8585{
8586 WDI_Status status = WDI_STATUS_SUCCESS;
8587 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8588 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8589 tWDA_ReqParams *pWdaParams ;
8590 pVosContextType pVosContext = NULL;
8591 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008592 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8593 (void *)pMac);
8594
8595 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8596 if(NULL == pWdaParams)
8597 {
8598 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8599 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8600 return VOS_STATUS_E_NOMEM;
8601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008602 /* Allocate memory WDI request structure*/
8603 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8604 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8605 if(NULL == wdiHALDumpCmdReqParam)
8606 {
8607 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8608 "WDA HAL DUMP Command buffer alloc fail");
8609 vos_mem_free(pWdaParams);
8610 return WDI_STATUS_E_FAILURE;
8611 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008612 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008613 /* Extract the arguments */
8614 wdiHalDumpCmdInfo->command = cmd;
8615 wdiHalDumpCmdInfo->argument1 = arg1;
8616 wdiHalDumpCmdInfo->argument2 = arg2;
8617 wdiHalDumpCmdInfo->argument3 = arg3;
8618 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07008619 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008620 pWdaParams->pWdaContext = pVosContext->pWDAContext;
8621
8622 /* Response message will be passed through the buffer */
8623 pWdaParams->wdaMsgParam = (void *)pBuffer;
8624
8625 /* store Params pass it to WDI */
8626 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008627 /* Send command to WDI */
8628 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008629 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07008630 if ( vStatus != VOS_STATUS_SUCCESS )
8631 {
8632 if ( vStatus == VOS_STATUS_E_TIMEOUT )
8633 {
8634 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8635 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
8636 }
8637 else
8638 {
8639 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8640 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
8641 }
8642 VOS_ASSERT(0);
8643 }
8644 return status;
8645}
Jeff Johnson295189b2012-06-20 16:38:30 -07008646#ifdef WLAN_FEATURE_GTK_OFFLOAD
8647/*
8648 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
8649 * Request to WDI to get GTK Offload Information
8650 */
8651VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
8652 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
8653{
8654 VOS_STATUS status = VOS_STATUS_SUCCESS;
8655 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
8656 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
8657 tWDA_ReqParams *pWdaParams ;
8658
8659 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
8660 {
8661 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8662 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8663 VOS_ASSERT(0);
8664 return VOS_STATUS_E_NOMEM;
8665 }
8666
8667 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8668 if(NULL == pWdaParams)
8669 {
8670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8671 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8672 VOS_ASSERT(0);
8673 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
8674 return VOS_STATUS_E_NOMEM;
8675 }
8676
8677 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
8678
8679 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8680 (NULL == pWDA->wdaWdiApiMsgParam));
8681
8682 /* Store Params pass it to WDI */
8683 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
8684 pWdaParams->pWdaContext = pWDA;
8685 /* Store param pointer as passed in by caller */
8686 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
8687
8688 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
8689
8690 if(IS_WDI_STATUS_FAILURE(status))
8691 {
8692 /* failure returned by WDI API */
8693 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8694 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
8695 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8696 vos_mem_free(pWdaParams) ;
8697 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
8698 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
8699 }
8700
8701 return CONVERT_WDI2VOS_STATUS(status) ;
8702}
8703#endif // WLAN_FEATURE_GTK_OFFLOAD
8704
8705/*
8706 * -------------------------------------------------------------------------
8707 * DATA interface with WDI for Mgmt Frames
8708 * -------------------------------------------------------------------------
8709 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008710/*
8711 * FUNCTION: WDA_TxComplete
8712 * Callback function for the WDA_TxPacket
8713 */
8714VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
8715 VOS_STATUS status )
8716{
8717
8718 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8719 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
8720
8721 if(NULL == wdaContext)
8722 {
8723 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8724 "%s:pWDA is NULL",
8725 __FUNCTION__);
8726 VOS_ASSERT(0);
8727 return VOS_STATUS_E_FAILURE;
8728 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008729 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
8730 if( NULL!=wdaContext->pTxCbFunc)
8731 {
8732 /*check if packet is freed already*/
8733 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
8734 {
8735 wdaContext->pTxCbFunc(pMac, pData);
8736 }
8737 else
8738 {
8739 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
8740 "%s:packet (0x%X) is already freed",
8741 __FUNCTION__, pData);
8742 //Return from here since we reaching here because the packet already timeout
8743 return status;
8744 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008745 }
8746
8747 /*
8748 * Trigger the event to bring the HAL TL Tx complete function to come
8749 * out of wait
8750 * Let the coe above to complete the packet first. When this event is set,
8751 * the thread waiting for the event may run and set Vospacket_freed causing the original
8752 * packet not being freed.
8753 */
8754 status = vos_event_set(&wdaContext->txFrameEvent);
8755 if(!VOS_IS_STATUS_SUCCESS(status))
8756 {
8757 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8758 "NEW VOS Event Set failed - status = %d \n", status);
8759 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008760 return status;
8761}
Jeff Johnson295189b2012-06-20 16:38:30 -07008762/*
8763 * FUNCTION: WDA_TxPacket
8764 * Forward TX management frame to WDI
8765 */
8766VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
8767 void *pFrmBuf,
8768 tANI_U16 frmLen,
8769 eFrameType frmType,
8770 eFrameTxDir txDir,
8771 tANI_U8 tid,
8772 pWDATxRxCompFunc pCompFunc,
8773 void *pData,
8774 pWDAAckFnTxComp pAckTxComp,
8775 tANI_U8 txFlag)
8776{
8777 VOS_STATUS status = VOS_STATUS_SUCCESS ;
8778 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
8779 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
8780 tANI_U8 eventIdx = 0;
8781 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
8782 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07008783 if((NULL == pWDA)||(NULL == pFrmBuf))
8784 {
8785 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8786 "%s:pWDA %x or pFrmBuf %x is NULL",
8787 __FUNCTION__,pWDA,pFrmBuf);
8788 VOS_ASSERT(0);
8789 return VOS_STATUS_E_FAILURE;
8790 }
8791
8792 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
8793 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07008794 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
8795 if(NULL == pMac)
8796 {
8797 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8798 "%s:pMac is NULL", __FUNCTION__);
8799 VOS_ASSERT(0);
8800 return VOS_STATUS_E_FAILURE;
8801 }
8802
8803
8804
8805 /* store the call back function in WDA context */
8806 pWDA->pTxCbFunc = pCompFunc;
8807 /* store the call back for the function of ackTxComplete */
8808 if( pAckTxComp )
8809 {
Jeff Johnsone7245742012-09-05 17:12:55 -07008810 if( NULL != pWDA->pAckTxCbFunc )
8811 {
8812 /* Already TxComp is active no need to active again */
8813 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8814 "There is already one request pending for tx complete\n");
8815 pWDA->pAckTxCbFunc( pMac, 0);
8816 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008817
Jeff Johnsone7245742012-09-05 17:12:55 -07008818 if( VOS_STATUS_SUCCESS !=
8819 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8820 {
8821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8822 "Tx Complete timeout Timer Stop Failed ");
8823 }
8824 else
8825 {
8826 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8827 "Tx Complete timeout Timer Stop Sucess ");
8828 }
8829 }
8830
8831 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
8832 pWDA->pAckTxCbFunc = pAckTxComp;
8833 if( VOS_STATUS_SUCCESS !=
8834 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
8835 {
8836 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8837 "Tx Complete Timer Start Failed ");
8838 pWDA->pAckTxCbFunc = NULL;
8839 return eHAL_STATUS_FAILURE;
8840 }
8841 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008842 /* Reset the event to be not signalled */
8843 status = vos_event_reset(&pWDA->txFrameEvent);
8844 if(!VOS_IS_STATUS_SUCCESS(status))
8845 {
8846 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8847 "VOS Event reset failed - status = %d\n",status);
8848 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
8849 if( pAckTxComp )
8850 {
8851 pWDA->pAckTxCbFunc = NULL;
8852 if( VOS_STATUS_SUCCESS !=
8853 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8854 {
8855 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8856 "Tx Complete timeout Timer Stop Failed ");
8857 }
8858 }
8859 return VOS_STATUS_E_FAILURE;
8860 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008861 /* Get system role, use the self station if in unknown role or STA role */
8862 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07008863 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
8864 (( eSYSTEM_STA_ROLE == systemRole )
8865#ifdef FEATURE_WLAN_CCX
8866 && frmType == HAL_TXRX_FRM_802_11_MGMT
8867#endif
8868 ))
8869 {
8870 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
8871 }
8872
Jeff Johnsone7245742012-09-05 17:12:55 -07008873 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
8874 disassoc frame reaches the HW, HAL has already deleted the peer station */
8875 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07008876 {
Jeff Johnsone7245742012-09-05 17:12:55 -07008877 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
8878 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
8879 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
8880 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07008881 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008882 /*Send Probe request frames on self sta idx*/
8883 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07008884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008885 /* Since we donot want probe responses to be retried, send probe responses
8886 through the NO_ACK queues */
8887 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
8888 {
8889 //probe response is sent out using self station and no retries options.
8890 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
8891 }
8892 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
8893 {
8894 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
8895 }
8896 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008897 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
8898
8899 /*Set frame tag to 0
8900 We will use the WDA user data in order to tag a frame as expired*/
8901 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
8902 (v_PVOID_t)0);
8903
8904
8905 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
8906 frmLen, ucTypeSubType, tid,
8907 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
8908 {
8909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8910 "Sending Mgmt Frame failed - status = %d\n", status);
8911 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
8912 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
8913 if( pAckTxComp )
8914 {
8915 pWDA->pAckTxCbFunc = NULL;
8916 if( VOS_STATUS_SUCCESS !=
8917 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8918 {
8919 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8920 "Tx Complete timeout Timer Stop Failed ");
8921 }
8922 }
8923 return VOS_STATUS_E_FAILURE;
8924 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008925 /*
8926 * Wait for the event to be set by the TL, to get the response of TX
8927 * complete, this event should be set by the Callback function called by TL
8928 */
8929 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
8930 &eventIdx);
8931 if(!VOS_IS_STATUS_SUCCESS(status))
8932 {
8933 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8934 "%s: Status %d when waiting for TX Frame Event",
8935 __FUNCTION__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07008936 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
8937 after the packet gets completed(packet freed once)*/
8938
8939 /* check whether the packet was freed already,so need not free again when
8940 * TL calls the WDA_Txcomplete routine
8941 */
8942 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
8943 {
8944 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
8945 }
8946 if( pAckTxComp )
8947 {
8948 pWDA->pAckTxCbFunc = NULL;
8949 if( VOS_STATUS_SUCCESS !=
8950 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
8951 {
8952 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8953 "Tx Complete timeout Timer Stop Failed ");
8954 }
8955 }
8956 status = VOS_STATUS_E_FAILURE;
8957 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008958 return status;
8959}
Jeff Johnson295189b2012-06-20 16:38:30 -07008960/*
8961 * FUNCTION: WDA_McProcessMsg
8962 * Trigger DAL-AL to start CFG download
8963 */
8964VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
8965{
8966 VOS_STATUS status = VOS_STATUS_SUCCESS;
8967 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008968 if(NULL == pMsg)
8969 {
8970 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8971 "%s:pMsg is NULL", __FUNCTION__);
8972 VOS_ASSERT(0);
8973 return VOS_STATUS_E_FAILURE;
8974 }
8975
8976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
8977 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
8978
8979 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
8980 if(NULL == pWDA )
8981 {
8982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8983 "%s:pWDA is NULL", __FUNCTION__);
8984 VOS_ASSERT(0);
Jeff Johnsone7245742012-09-05 17:12:55 -07008985 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07008986 return VOS_STATUS_E_FAILURE;
8987 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008988 /* Process all the WDA messages.. */
8989 switch( pMsg->type )
8990 {
8991 case WNI_CFG_DNLD_REQ:
8992 {
8993 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008994 /* call WDA complete event if config download success */
8995 if( VOS_IS_STATUS_SUCCESS(status) )
8996 {
8997 vos_WDAComplete_cback(pVosContext);
8998 }
8999 else
9000 {
9001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9002 "WDA Config Download failure" );
9003 }
9004 break ;
9005 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009006 /*
9007 * Init SCAN request from PE, convert it into DAL format
9008 * and send it to DAL
9009 */
9010 case WDA_INIT_SCAN_REQ:
9011 {
9012 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9013 break ;
9014 }
9015 /* start SCAN request from PE */
9016 case WDA_START_SCAN_REQ:
9017 {
9018 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9019 break ;
9020 }
9021 /* end SCAN request from PE */
9022 case WDA_END_SCAN_REQ:
9023 {
9024 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9025 break ;
9026 }
9027 /* end SCAN request from PE */
9028 case WDA_FINISH_SCAN_REQ:
9029 {
9030 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9031 break ;
9032 }
9033 /* join request from PE */
9034 case WDA_CHNL_SWITCH_REQ:
9035 {
9036 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9037 {
9038 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9039 }
9040 else
9041 {
9042 WDA_ProcessChannelSwitchReq(pWDA,
9043 (tSwitchChannelParams*)pMsg->bodyptr) ;
9044 }
9045 break ;
9046 }
9047 /* ADD BSS request from PE */
9048 case WDA_ADD_BSS_REQ:
9049 {
9050 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9051 break ;
9052 }
9053 case WDA_ADD_STA_REQ:
9054 {
9055 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9056 break ;
9057 }
9058 case WDA_DELETE_BSS_REQ:
9059 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009060 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9061 break ;
9062 }
9063 case WDA_DELETE_STA_REQ:
9064 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009065 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9066 break ;
9067 }
9068 case WDA_CONFIG_PARAM_UPDATE_REQ:
9069 {
9070 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9071 break ;
9072 }
9073 case WDA_SET_BSSKEY_REQ:
9074 {
9075 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9076 break ;
9077 }
9078 case WDA_SET_STAKEY_REQ:
9079 {
9080 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9081 break ;
9082 }
9083 case WDA_SET_STA_BCASTKEY_REQ:
9084 {
9085 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9086 break ;
9087 }
9088 case WDA_REMOVE_BSSKEY_REQ:
9089 {
9090 WDA_ProcessRemoveBssKeyReq(pWDA,
9091 (tRemoveBssKeyParams *)pMsg->bodyptr);
9092 break ;
9093 }
9094 case WDA_REMOVE_STAKEY_REQ:
9095 {
9096 WDA_ProcessRemoveStaKeyReq(pWDA,
9097 (tRemoveStaKeyParams *)pMsg->bodyptr);
9098 break ;
9099 }
9100 case WDA_REMOVE_STA_BCASTKEY_REQ:
9101 {
9102 /* TODO: currently UMAC is not sending this request, Add the code for
9103 handling this request when UMAC supports */
9104 break;
9105 }
9106#ifdef FEATURE_WLAN_CCX
9107 case WDA_TSM_STATS_REQ:
9108 {
9109 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9110 break;
9111 }
9112#endif
9113 case WDA_UPDATE_EDCA_PROFILE_IND:
9114 {
9115 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9116 break;
9117 }
9118 case WDA_ADD_TS_REQ:
9119 {
9120 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9121 break;
9122 }
9123 case WDA_DEL_TS_REQ:
9124 {
9125 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9126 break;
9127 }
9128 case WDA_ADDBA_REQ:
9129 {
9130 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9131 break;
9132 }
9133 case WDA_DELBA_IND:
9134 {
9135 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9136 break;
9137 }
9138 case WDA_SET_LINK_STATE:
9139 {
9140 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9141 break;
9142 }
9143 case WDA_GET_STATISTICS_REQ:
9144 {
9145 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9146 break;
9147 }
9148 case WDA_PWR_SAVE_CFG:
9149 {
9150 if(pWDA->wdaState == WDA_READY_STATE)
9151 {
9152 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9153 }
9154 else
9155 {
9156 if(NULL != pMsg->bodyptr)
9157 {
9158 vos_mem_free(pMsg->bodyptr);
9159 }
9160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9161 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9162 }
9163 break;
9164 }
9165 case WDA_ENTER_IMPS_REQ:
9166 {
9167 if(pWDA->wdaState == WDA_READY_STATE)
9168 {
9169 WDA_ProcessEnterImpsReq(pWDA);
9170 }
9171 else
9172 {
9173 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9174 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9175 }
9176 break;
9177 }
9178 case WDA_EXIT_IMPS_REQ:
9179 {
9180 if(pWDA->wdaState == WDA_READY_STATE)
9181 {
9182 WDA_ProcessExitImpsReq(pWDA);
9183 }
9184 else
9185 {
9186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9187 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9188 }
9189 break;
9190 }
9191 case WDA_ENTER_BMPS_REQ:
9192 {
9193 if(pWDA->wdaState == WDA_READY_STATE)
9194 {
9195 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9196 }
9197 else
9198 {
9199 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9200 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9201 }
9202 break;
9203 }
9204 case WDA_EXIT_BMPS_REQ:
9205 {
9206 if(pWDA->wdaState == WDA_READY_STATE)
9207 {
9208 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9209 }
9210 else
9211 {
9212 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9213 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9214 }
9215 break;
9216 }
9217 case WDA_ENTER_UAPSD_REQ:
9218 {
9219 if(pWDA->wdaState == WDA_READY_STATE)
9220 {
9221 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9222 }
9223 else
9224 {
9225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9226 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9227 }
9228 break;
9229 }
9230 case WDA_EXIT_UAPSD_REQ:
9231 {
9232 if(pWDA->wdaState == WDA_READY_STATE)
9233 {
9234 WDA_ProcessExitUapsdReq(pWDA);
9235 }
9236 else
9237 {
9238 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9239 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9240 }
9241 break;
9242 }
9243 case WDA_UPDATE_UAPSD_IND:
9244 {
9245 if(pWDA->wdaState == WDA_READY_STATE)
9246 {
9247 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9248 }
9249 else
9250 {
9251 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9252 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9253 }
9254 break;
9255 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009256 case WDA_REGISTER_PE_CALLBACK :
9257 {
9258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9259 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9260 /*TODO: store the PE callback */
9261 /* Do Nothing? MSG Body should be freed at here */
9262 if(NULL != pMsg->bodyptr)
9263 {
9264 vos_mem_free(pMsg->bodyptr);
9265 }
9266 break;
9267 }
9268 case WDA_SYS_READY_IND :
9269 {
9270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9271 "Handling msg type WDA_SYS_READY_IND " );
9272 pWDA->wdaState = WDA_READY_STATE;
9273 if(NULL != pMsg->bodyptr)
9274 {
9275 vos_mem_free(pMsg->bodyptr);
9276 }
9277 break;
9278 }
9279 case WDA_BEACON_FILTER_IND :
9280 {
9281 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9282 break;
9283 }
9284 case WDA_BTC_SET_CFG:
9285 {
9286 /*TODO: handle this while dealing with BTC */
9287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9288 "Handling msg type WDA_BTC_SET_CFG " );
9289 /* Do Nothing? MSG Body should be freed at here */
9290 if(NULL != pMsg->bodyptr)
9291 {
9292 vos_mem_free(pMsg->bodyptr);
9293 }
9294 break;
9295 }
9296 case WDA_SIGNAL_BT_EVENT:
9297 {
9298 /*TODO: handle this while dealing with BTC */
9299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9300 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9301 /* Do Nothing? MSG Body should be freed at here */
9302 if(NULL != pMsg->bodyptr)
9303 {
9304 vos_mem_free(pMsg->bodyptr);
9305 }
9306 break;
9307 }
9308 case WDA_CFG_RXP_FILTER_REQ:
9309 {
9310 WDA_ProcessConfigureRxpFilterReq(pWDA,
9311 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9312 break;
9313 }
9314 case WDA_SET_HOST_OFFLOAD:
9315 {
9316 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9317 break;
9318 }
9319 case WDA_SET_KEEP_ALIVE:
9320 {
9321 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9322 break;
9323 }
9324#ifdef WLAN_NS_OFFLOAD
9325 case WDA_SET_NS_OFFLOAD:
9326 {
9327 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9328 break;
9329 }
9330#endif //WLAN_NS_OFFLOAD
9331 case WDA_ADD_STA_SELF_REQ:
9332 {
9333 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9334 break;
9335 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009336 case WDA_DEL_STA_SELF_REQ:
9337 {
9338 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9339 break;
9340 }
9341 case WDA_WOWL_ADD_BCAST_PTRN:
9342 {
9343 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9344 break;
9345 }
9346 case WDA_WOWL_DEL_BCAST_PTRN:
9347 {
9348 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9349 break;
9350 }
9351 case WDA_WOWL_ENTER_REQ:
9352 {
9353 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9354 break;
9355 }
9356 case WDA_WOWL_EXIT_REQ:
9357 {
9358 WDA_ProcessWowlExitReq(pWDA);
9359 break;
9360 }
9361 case WDA_TL_FLUSH_AC_REQ:
9362 {
9363 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9364 break;
9365 }
9366 case WDA_SIGNAL_BTAMP_EVENT:
9367 {
9368 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9369 break;
9370 }
9371#ifdef WDA_UT
9372 case WDA_WDI_EVENT_MSG:
9373 {
9374 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9375 break ;
9376 }
9377#endif
9378 case WDA_UPDATE_BEACON_IND:
9379 {
9380 WDA_ProcessUpdateBeaconParams(pWDA,
9381 (tUpdateBeaconParams *)pMsg->bodyptr);
9382 break;
9383 }
9384 case WDA_SEND_BEACON_REQ:
9385 {
9386 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9387 break;
9388 }
9389 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9390 {
9391 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9392 (tSendProbeRespParams *)pMsg->bodyptr);
9393 break;
9394 }
9395#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9396 case WDA_SET_MAX_TX_POWER_REQ:
9397 {
9398 WDA_ProcessSetMaxTxPowerReq(pWDA,
9399 (tMaxTxPowerParams *)pMsg->bodyptr);
9400 break;
9401 }
9402#endif
9403#ifdef WLAN_FEATURE_P2P
9404 case WDA_SET_P2P_GO_NOA_REQ:
9405 {
9406 WDA_ProcessSetP2PGONOAReq(pWDA,
9407 (tP2pPsParams *)pMsg->bodyptr);
9408 break;
9409 }
9410#endif
9411 /* timer related messages */
9412 case WDA_TIMER_BA_ACTIVITY_REQ:
9413 {
9414 WDA_BaCheckActivity(pWDA) ;
9415 break ;
9416 }
9417#ifdef WLAN_FEATURE_VOWIFI_11R
9418 case WDA_AGGR_QOS_REQ:
9419 {
9420 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9421 break;
9422 }
9423#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009424#ifdef ANI_MANF_DIAG
9425 case WDA_FTM_CMD_REQ:
9426 {
9427 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9428 break ;
9429 }
9430#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009431#ifdef FEATURE_OEM_DATA_SUPPORT
9432 case WDA_START_OEM_DATA_REQ:
9433 {
9434 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9435 break;
9436 }
9437#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009438 /* Tx Complete Time out Indication */
9439 case WDA_TX_COMPLETE_TIMEOUT_IND:
9440 {
9441 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9442 break;
9443 }
9444 case WDA_WLAN_SUSPEND_IND:
9445 {
9446 WDA_ProcessWlanSuspendInd(pWDA,
9447 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9448 break;
9449 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009450 case WDA_WLAN_RESUME_REQ:
9451 {
9452 WDA_ProcessWlanResumeReq(pWDA,
9453 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9454 break;
9455 }
9456
9457 case WDA_UPDATE_CF_IND:
9458 {
9459 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9460 pMsg->bodyptr = NULL;
9461 break;
9462 }
9463#ifdef FEATURE_WLAN_SCAN_PNO
9464 case WDA_SET_PNO_REQ:
9465 {
9466 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9467 break;
9468 }
9469 case WDA_UPDATE_SCAN_PARAMS_REQ:
9470 {
9471 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9472 break;
9473 }
9474 case WDA_SET_RSSI_FILTER_REQ:
9475 {
9476 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9477 break;
9478 }
9479#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009480 case WDA_SET_TX_PER_TRACKING_REQ:
9481 {
9482 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9483 break;
9484 }
9485
9486#ifdef WLAN_FEATURE_PACKET_FILTERING
9487 case WDA_8023_MULTICAST_LIST_REQ:
9488 {
9489 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9490 break;
9491 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009492 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9493 {
9494 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9495 break;
9496 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009497 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9498 {
9499 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9500 break;
9501 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009502 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9503 {
9504 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9505 break;
9506 }
9507#endif // WLAN_FEATURE_PACKET_FILTERING
9508
9509
9510 case WDA_TRANSMISSION_CONTROL_IND:
9511 {
9512 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9513 break;
9514 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009515 case WDA_SET_POWER_PARAMS_REQ:
9516 {
9517 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9518 break;
9519 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009520#ifdef WLAN_FEATURE_GTK_OFFLOAD
9521 case WDA_GTK_OFFLOAD_REQ:
9522 {
9523 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9524 break;
9525 }
9526
9527 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9528 {
9529 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9530 break;
9531 }
9532#endif //WLAN_FEATURE_GTK_OFFLOAD
9533
9534 case WDA_SET_TM_LEVEL_REQ:
9535 {
9536 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9537 break;
9538 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009539#ifdef WLAN_FEATURE_11AC
9540 case WDA_UPDATE_OP_MODE:
9541 {
9542 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9543 {
9544 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9545 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9546 else
9547 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9548 " VHT OpMode Feature is Not Supported \n");
9549 }
9550 else
9551 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9552 " 11AC Feature is Not Supported \n");
9553 break;
9554 }
9555#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009556 default:
9557 {
9558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9559 "No Handling for msg type %x in WDA "
9560 ,pMsg->type);
9561 /* Do Nothing? MSG Body should be freed at here */
9562 if(NULL != pMsg->bodyptr)
9563 {
9564 vos_mem_free(pMsg->bodyptr);
9565 }
9566 //WDA_VOS_ASSERT(0) ;
9567 }
9568 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009569 return status ;
9570}
9571
Jeff Johnson295189b2012-06-20 16:38:30 -07009572/*
9573 * FUNCTION: WDA_LowLevelIndCallback
9574 * IND API callback from WDI, send Ind to PE
9575 */
9576void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9577 void* pUserData )
9578{
9579 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9580#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9581 tSirRSSINotification rssiNotification;
9582#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009583 if(NULL == pWDA)
9584 {
9585 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9586 "%s:pWDA is NULL", __FUNCTION__);
9587 VOS_ASSERT(0);
9588 return ;
9589 }
9590
9591 switch(wdiLowLevelInd->wdiIndicationType)
9592 {
9593 case WDI_RSSI_NOTIFICATION_IND:
9594 {
9595 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9596 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009597#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9598 rssiNotification.bReserved =
9599 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
9600 rssiNotification.bRssiThres1NegCross =
9601 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
9602 rssiNotification.bRssiThres1PosCross =
9603 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
9604 rssiNotification.bRssiThres2NegCross =
9605 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
9606 rssiNotification.bRssiThres2PosCross =
9607 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
9608 rssiNotification.bRssiThres3NegCross =
9609 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
9610 rssiNotification.bRssiThres3PosCross =
9611 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -07009612 WLANTL_BMPSRSSIRegionChangedNotification(
9613 pWDA->pVosContext,
9614 &rssiNotification);
9615#endif
9616 break ;
9617 }
9618 case WDI_MISSED_BEACON_IND:
9619 {
9620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9621 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009622 /* send IND to PE */
9623 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
9624 break ;
9625 }
9626 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
9627 {
9628 /* TODO: Decode Ind and send Ind to PE */
9629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9630 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
9631 break ;
9632 }
9633
9634 case WDI_MIC_FAILURE_IND:
9635 {
9636 tpSirSmeMicFailureInd pMicInd =
9637 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
9638
9639 if(NULL == pMicInd)
9640 {
9641 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9642 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9643 break;
9644 }
9645 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9646 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009647 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
9648 pMicInd->length = sizeof(tSirSmeMicFailureInd);
9649 vos_mem_copy(pMicInd->bssId,
9650 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
9651 sizeof(tSirMacAddr));
9652 vos_mem_copy(pMicInd->info.srcMacAddr,
9653 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
9654 sizeof(tSirMacAddr));
9655 vos_mem_copy(pMicInd->info.taMacAddr,
9656 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
9657 sizeof(tSirMacAddr));
9658 vos_mem_copy(pMicInd->info.dstMacAddr,
9659 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
9660 sizeof(tSirMacAddr));
9661 vos_mem_copy(pMicInd->info.rxMacAddr,
9662 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
9663 sizeof(tSirMacAddr));
9664 pMicInd->info.multicast =
9665 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
9666 pMicInd->info.keyId=
9667 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
9668 pMicInd->info.IV1=
9669 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
9670 vos_mem_copy(pMicInd->info.TSC,
9671 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009672 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
9673 (void *)pMicInd , 0) ;
9674 break ;
9675 }
9676 case WDI_FATAL_ERROR_IND:
9677 {
9678 /* TODO: Decode Ind and send Ind to PE */
9679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9680 "Received WDI_FATAL_ERROR_IND from WDI ");
9681 break ;
9682 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009683 case WDI_DEL_STA_IND:
9684 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009685 tpDeleteStaContext pDelSTACtx =
9686 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
9687
9688 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9689 "Received WDI_DEL_STA_IND from WDI ");
9690 if(NULL == pDelSTACtx)
9691 {
9692 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9693 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9694 break;
9695 }
9696 vos_mem_copy(pDelSTACtx->addr2,
9697 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
9698 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009699 vos_mem_copy(pDelSTACtx->bssId,
9700 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
9701 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009702 pDelSTACtx->assocId =
9703 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
9704 pDelSTACtx->reasonCode =
9705 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
9706 pDelSTACtx->staId =
9707 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009708 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
9709 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009710 break ;
9711 }
9712 case WDI_COEX_IND:
9713 {
9714 tANI_U32 index;
9715 vos_msg_t vosMsg;
9716 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
9717 if(NULL == pSmeCoexInd)
9718 {
9719 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9720 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
9721 break;
9722 }
9723 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9724 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009725 /* Message Header */
9726 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
9727 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -07009728 /* Info from WDI Indication */
9729 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
9730 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
9731 {
9732 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
9733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009734 /* VOS message wrapper */
9735 vosMsg.type = eWNI_SME_COEX_IND;
9736 vosMsg.bodyptr = (void *)pSmeCoexInd;
9737 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009738 /* Send message to SME */
9739 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9740 {
9741 /* free the mem and return */
9742 vos_mem_free((v_VOID_t *)pSmeCoexInd);
9743 }
9744 else
9745 {
9746 /* DEBUG */
9747 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9748 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
9749 pSmeCoexInd->coexIndType,
9750 pSmeCoexInd->coexIndData[0],
9751 pSmeCoexInd->coexIndData[1],
9752 pSmeCoexInd->coexIndData[2],
9753 pSmeCoexInd->coexIndData[3]);
9754 }
9755 break;
9756 }
9757 case WDI_TX_COMPLETE_IND:
9758 {
9759 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
9760 /* Calling TxCompleteAck Indication from wda context*/
9761 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9762 "Complete Indication received from HAL");
9763 if( pWDA->pAckTxCbFunc )
9764 {
9765 if( VOS_STATUS_SUCCESS !=
9766 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9767 {
9768 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9769 "Tx Complete timeout Timer Stop Failed ");
9770 }
9771 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
9772 pWDA->pAckTxCbFunc = NULL;
9773 }
9774 else
9775 {
9776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9777 "Tx Complete Indication is received after timeout ");
9778 }
9779 break;
9780 }
9781#ifdef WLAN_FEATURE_P2P
9782 case WDI_P2P_NOA_ATTR_IND :
9783 {
9784 tSirP2PNoaAttr *pP2pNoaAttr =
9785 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009786 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9787 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -07009788 if (NULL == pP2pNoaAttr)
9789 {
9790 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9791 "Memory allocation failure, "
9792 "WDI_P2P_NOA_ATTR_IND not forwarded");
9793 break;
9794 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009795 pP2pNoaAttr->index =
9796 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
9797 pP2pNoaAttr->oppPsFlag =
9798 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
9799 pP2pNoaAttr->ctWin =
9800 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
9801
9802 pP2pNoaAttr->uNoa1IntervalCnt =
9803 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
9804 pP2pNoaAttr->uNoa1Duration =
9805 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
9806 pP2pNoaAttr->uNoa1Interval =
9807 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
9808 pP2pNoaAttr->uNoa1StartTime =
9809 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009810 pP2pNoaAttr->uNoa2IntervalCnt =
9811 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
9812 pP2pNoaAttr->uNoa2Duration =
9813 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
9814 pP2pNoaAttr->uNoa2Interval =
9815 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
9816 pP2pNoaAttr->uNoa2StartTime =
9817 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07009818 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
9819 (void *)pP2pNoaAttr , 0) ;
9820 break;
9821 }
9822#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009823#ifdef FEATURE_WLAN_SCAN_PNO
9824 case WDI_PREF_NETWORK_FOUND_IND:
9825 {
9826 vos_msg_t vosMsg;
9827 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -07009828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9829 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -07009830 if (NULL == pPrefNetworkFoundInd)
9831 {
9832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9833 "Memory allocation failure, "
9834 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
9835 break;
9836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009837 /* Message Header */
9838 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
9839 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
9840
9841 /* Info from WDI Indication */
9842 pPrefNetworkFoundInd->ssId.length =
9843 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -07009844 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009845 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
9846 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
9847 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07009848 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -07009849 /* VOS message wrapper */
9850 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
9851 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
9852 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009853 /* Send message to SME */
9854 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9855 {
9856 /* free the mem and return */
9857 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
9858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009859 break;
9860 }
9861#endif // FEATURE_WLAN_SCAN_PNO
9862
9863#ifdef WLAN_WAKEUP_EVENTS
9864 case WDI_WAKE_REASON_IND:
9865 {
9866 vos_msg_t vosMsg;
9867 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
9868 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
9869 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
9870
9871 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9872 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
9873 wdiLowLevelInd->wdiIndicationType,
9874 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
9875 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
9876 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
9877
9878 if (NULL == pWakeReasonInd)
9879 {
9880 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9881 "Memory allocation failure, "
9882 "WDI_WAKE_REASON_IND not forwarded");
9883 break;
9884 }
9885
9886 vos_mem_zero(pWakeReasonInd, allocSize);
9887
9888 /* Message Header */
9889 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
9890 pWakeReasonInd->mesgLen = allocSize;
9891
9892 /* Info from WDI Indication */
9893 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
9894 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
9895 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
9896 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
9897 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
9898 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
9899 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
9900 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
9901
9902 /* VOS message wrapper */
9903 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
9904 vosMsg.bodyptr = (void *) pWakeReasonInd;
9905 vosMsg.bodyval = 0;
9906
9907 /* Send message to SME */
9908 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9909 {
9910 /* free the mem and return */
9911 vos_mem_free((v_VOID_t *) pWakeReasonInd);
9912 }
9913
9914 break;
9915 }
9916#endif // WLAN_WAKEUP_EVENTS
9917
9918 case WDI_TX_PER_HIT_IND:
9919 {
9920 vos_msg_t vosMsg;
9921 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
9922 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
9923 /* VOS message wrapper */
9924 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
9925 vosMsg.bodyptr = NULL;
9926 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009927 /* Send message to SME */
9928 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9929 {
9930 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
9931 }
9932 break;
9933 }
9934
9935 default:
9936 {
9937 /* TODO error */
9938 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9939 "Received UNKNOWN Indication from WDI ");
9940 }
9941 }
9942 return ;
9943}
9944
Jeff Johnson295189b2012-06-20 16:38:30 -07009945/*
9946 * BA related processing in WDA.
9947 */
Jeff Johnson295189b2012-06-20 16:38:30 -07009948void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
9949 void* pUserData)
9950{
9951 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
9952 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07009953 if(NULL == pWdaParams)
9954 {
9955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9956 "%s: pWdaParams received NULL", __FUNCTION__);
9957 VOS_ASSERT(0) ;
9958 return ;
9959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009960 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07009961 vos_mem_free(pWdaParams->wdaMsgParam) ;
9962 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9963 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009964 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9965 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07009966 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
9967 {
9968 tANI_U8 i = 0 ;
9969 tBaActivityInd *baActivityInd = NULL ;
9970 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
9971 tANI_U8 allocSize = sizeof(tBaActivityInd)
9972 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
9973 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
9974 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009975 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009976 if(NULL == baActivityInd)
9977 {
9978 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9979 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9980 VOS_ASSERT(0) ;
9981 return;
9982 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009983 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
9984 sizeof(tSirMacAddr)) ;
9985 baActivityInd->baCandidateCnt = baCandidateCount ;
9986
9987 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
9988 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
9989
9990 for(i = 0 ; i < baCandidateCount ; i++)
9991 {
9992 tANI_U8 tid = 0 ;
9993 wdiBaCandidate = (wdiBaCandidate + i) ;
9994 baCandidate = (baCandidate + i) ;
9995 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
9996 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009997 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
9998 {
9999 baCandidate->baInfo[tid].fBaEnable =
10000 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
10001 baCandidate->baInfo[tid].startingSeqNum =
10002 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
10003 }
10004 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010005 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
10006 }
10007 else
10008 {
10009 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10010 "BA Trigger RSP with Failure received ");
10011 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010012 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010013}
Jeff Johnson295189b2012-06-20 16:38:30 -070010014/*
10015 * BA Activity check timer handler
10016 */
10017void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10018{
10019 tANI_U8 curSta = 0 ;
10020 tANI_U8 tid = 0 ;
10021 tANI_U8 size = 0 ;
10022 tANI_U8 baCandidateCount = 0 ;
10023 tANI_U8 newBaCandidate = 0 ;
10024 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10025
10026 if(NULL == pWDA)
10027 {
10028 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10029 "%s:pWDA is NULL", __FUNCTION__);
10030 VOS_ASSERT(0);
10031 return ;
10032 }
10033 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10034 {
10035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10036 "Inconsistent STA entries in WDA");
10037 VOS_ASSERT(0) ;
10038 }
10039 /* walk through all STA entries and find out TX packet count */
10040 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10041 {
10042 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10043 {
10044 tANI_U32 txPktCount = 0 ;
10045 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010046 if((WDA_VALID_STA_INDEX == validStaIndex) &&
10047 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10048 curSta, tid, &txPktCount)))
10049 {
10050#if 0
10051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10052 "************* %d:%d, %d ",curSta, txPktCount,
10053 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10054#endif
10055 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
10056 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10057 curSta, tid)))
10058 {
10059 /* get prepare for sending message to HAL */
10060 //baCandidate[baCandidateCount].staIdx = curSta ;
10061 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10062 newBaCandidate = WDA_ENABLE_BA ;
10063 }
10064 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10065 }
10066 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010067 /* fill the entry for all the sta with given TID's */
10068 if(WDA_ENABLE_BA == newBaCandidate)
10069 {
10070 /* move to next BA candidate */
10071 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10072 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10073 baCandidateCount++ ;
10074 newBaCandidate = WDA_DISABLE_BA ;
10075 }
10076 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010077 /* prepare and send message to hal */
10078 if( 0 < baCandidateCount)
10079 {
10080 WDI_Status status = WDI_STATUS_SUCCESS ;
10081 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10082 tWDA_ReqParams *pWdaParams =
10083 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010084 if(NULL == pWdaParams)
10085 {
10086 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10087 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10088 VOS_ASSERT(0) ;
10089 return;
10090 }
10091 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10092 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10093 if(NULL == wdiTriggerBaReq)
10094 {
10095 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10096 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10097 VOS_ASSERT(0) ;
10098 vos_mem_free(pWdaParams);
10099 return;
10100 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010101 do
10102 {
10103 WDI_TriggerBAReqinfoType *triggerBaInfo =
10104 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10105 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10106 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10107 * for each request */
10108 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10109 triggerBaInfo->ucBASessionID = 0;
10110 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10111 } while(0) ;
10112 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10114 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010115 pWdaParams->pWdaContext = pWDA;
10116 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10117 pWdaParams->wdaMsgParam = NULL;
10118 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10119 WDA_TriggerBaReqCallback, pWdaParams) ;
10120 if(IS_WDI_STATUS_FAILURE(status))
10121 {
10122 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10123 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10124 vos_mem_free(pWdaParams->wdaMsgParam) ;
10125 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10126 vos_mem_free(pWdaParams) ;
10127 }
10128 }
10129 else
10130 {
10131 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10132 "There is no TID for initiating BA");
10133 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010134 if( VOS_STATUS_SUCCESS !=
10135 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10136 {
10137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10138 "BA Activity Timer Stop Failed ");
10139 return ;
10140 }
10141 if( VOS_STATUS_SUCCESS !=
10142 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10143 {
10144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10145 "BA Activity Timer Start Failed ");
10146 return;
10147 }
10148 return ;
10149}
Jeff Johnson295189b2012-06-20 16:38:30 -070010150/*
10151 * WDA common routine to create timer used by WDA.
10152 */
10153static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10154{
Jeff Johnson295189b2012-06-20 16:38:30 -070010155 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10156 tANI_U32 val = 0 ;
10157 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10158
10159 if(NULL == pMac)
10160 {
10161 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10162 "%s:MAC context is NULL", __FUNCTION__);
10163 VOS_ASSERT(0);
10164 return VOS_STATUS_E_FAILURE;
10165 }
10166 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10167 != eSIR_SUCCESS)
10168 {
10169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10170 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10171 return VOS_STATUS_E_FAILURE;
10172 }
10173 val = SYS_MS_TO_TICKS(val) ;
10174
10175 /* BA activity check timer */
10176 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10177 "BA Activity Check timer", WDA_TimerHandler,
10178 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10179 if(status != TX_SUCCESS)
10180 {
10181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10182 "Unable to create BA activity timer");
10183 return eSIR_FAILURE ;
10184 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010185 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010186 /* Tx Complete Timeout timer */
10187 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10188 "Tx Complete Check timer", WDA_TimerHandler,
10189 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010190 if(status != TX_SUCCESS)
10191 {
10192 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10193 "Unable to create Tx Complete Timeout timer");
10194 /* Destroy timer of BA activity check timer */
10195 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10196 if(status != TX_SUCCESS)
10197 {
10198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10199 "Unable to Destroy BA activity timer");
10200 return eSIR_FAILURE ;
10201 }
10202 return eSIR_FAILURE ;
10203 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010204 return eSIR_SUCCESS ;
10205}
Jeff Johnson295189b2012-06-20 16:38:30 -070010206/*
10207 * WDA common routine to destroy timer used by WDA.
10208 */
10209static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10210{
10211 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010212 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10213 if(status != TX_SUCCESS)
10214 {
10215 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10216 "Unable to Destroy Tx Complete Timeout timer");
10217 return eSIR_FAILURE ;
10218 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010219 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10220 if(status != TX_SUCCESS)
10221 {
10222 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10223 "Unable to Destroy BA activity timer");
10224 return eSIR_FAILURE ;
10225 }
10226
10227 return eSIR_SUCCESS ;
10228}
Jeff Johnson295189b2012-06-20 16:38:30 -070010229/*
10230 * WDA timer handler.
10231 */
10232void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10233{
10234 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10235 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010236 /*
10237 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10238 */
10239 wdaMsg.type = timerInfo ;
10240 wdaMsg.bodyptr = NULL;
10241 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010242 /* post the message.. */
10243 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10244 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10245 {
10246 vosStatus = VOS_STATUS_E_BADMSG;
10247 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010248}
Jeff Johnson295189b2012-06-20 16:38:30 -070010249/*
10250 * WDA Tx Complete timeout Indication.
10251 */
10252void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10253{
10254 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010255 if( pWDA->pAckTxCbFunc )
10256 {
10257 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10258 "TxComplete timer expired\n");
10259 pWDA->pAckTxCbFunc( pMac, 0);
10260 pWDA->pAckTxCbFunc = NULL;
10261 }
10262 else
10263 {
10264 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10265 "There is no request pending for TxComplete and wait timer expired\n");
10266 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010267}
Jeff Johnson295189b2012-06-20 16:38:30 -070010268/*
10269 * WDA Set REG Domain to VOS NV
10270 */
10271eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10272{
10273 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10274 {
10275 return eHAL_STATUS_INVALID_PARAMETER;
10276 }
10277 return eHAL_STATUS_SUCCESS;
10278}
10279#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10280
Jeff Johnson295189b2012-06-20 16:38:30 -070010281#ifdef FEATURE_WLAN_SCAN_PNO
10282/*
10283 * FUNCTION: WDA_PNOScanReqCallback
10284 *
10285 */
10286void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10287{
10288 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010289 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10290 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010291 if(NULL == pWdaParams)
10292 {
10293 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10294 "%s: pWdaParams received NULL", __FUNCTION__);
10295 VOS_ASSERT(0) ;
10296 return ;
10297 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010298 if( pWdaParams != NULL )
10299 {
10300 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10301 {
10302 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10303 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010304 if( pWdaParams->wdaMsgParam != NULL)
10305 {
10306 vos_mem_free(pWdaParams->wdaMsgParam);
10307 }
10308
10309 vos_mem_free(pWdaParams) ;
10310 }
10311
10312 return ;
10313}
Jeff Johnson295189b2012-06-20 16:38:30 -070010314/*
10315 * FUNCTION: WDA_UpdateScanParamsCallback
10316 *
10317 */
10318void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10319{
10320 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010321 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10322 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010323 if(NULL == pWdaParams)
10324 {
10325 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10326 "%s: pWdaParams received NULL", __FUNCTION__);
10327 VOS_ASSERT(0) ;
10328 return ;
10329 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010330 if( pWdaParams != NULL )
10331 {
10332 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10333 {
10334 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10335 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010336 if( pWdaParams->wdaMsgParam != NULL)
10337 {
10338 vos_mem_free(pWdaParams->wdaMsgParam);
10339 }
10340 vos_mem_free(pWdaParams) ;
10341 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010342 return ;
10343}
Jeff Johnson295189b2012-06-20 16:38:30 -070010344/*
10345 * FUNCTION: WDA_SetPowerParamsCallback
10346 *
10347 */
10348void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10349{
Jeff Johnsone7245742012-09-05 17:12:55 -070010350 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010351
10352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10353 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010354 if(NULL == pWdaParams)
10355 {
10356 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10357 "%s: pWdaParams received NULL", __FUNCTION__);
10358 VOS_ASSERT(0) ;
10359 return ;
10360 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010361 if( pWdaParams != NULL )
10362 {
10363 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10364 {
10365 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10366 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010367 if( pWdaParams->wdaMsgParam != NULL)
10368 {
10369 vos_mem_free(pWdaParams->wdaMsgParam);
10370 }
10371 vos_mem_free(pWdaParams) ;
10372 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010373 return ;
10374}
Jeff Johnson295189b2012-06-20 16:38:30 -070010375/*
10376 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10377 * Request to WDI to set Preferred Network List.Offload
10378 */
10379VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10380 tSirPNOScanReq *pPNOScanReqParams)
10381{
Jeff Johnson43971f52012-07-17 12:26:56 -070010382 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010383 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10384 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10385 tWDA_ReqParams *pWdaParams ;
10386 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010387 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10388 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010389 if(NULL == pwdiPNOScanReqInfo)
10390 {
10391 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10392 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10393 VOS_ASSERT(0);
10394 return VOS_STATUS_E_NOMEM;
10395 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010396 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10397 if(NULL == pWdaParams)
10398 {
10399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10400 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10401 VOS_ASSERT(0);
10402 vos_mem_free(pwdiPNOScanReqInfo);
10403 return VOS_STATUS_E_NOMEM;
10404 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010405 //
10406 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10407 //
10408 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10409 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010410 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10411 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10412 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010413 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10414 {
10415 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10416 &pPNOScanReqParams->aNetworks[i],
10417 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10418 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010419 /*Scan timer intervals*/
10420 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10421 &pPNOScanReqParams->scanTimers,
10422 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010423 /*Probe template for 2.4GHz band*/
10424 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10425 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10426 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010427 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10428 pPNOScanReqParams->p24GProbeTemplate,
10429 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010430 /*Probe template for 5GHz band*/
10431 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10432 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10433 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010434 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10435 pPNOScanReqParams->p5GProbeTemplate,
10436 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010437 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010438 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10439 {
10440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10441 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10442 VOS_ASSERT(0);
10443 vos_mem_free(pwdiPNOScanReqInfo) ;
10444 vos_mem_free(pWdaParams);
10445 return VOS_STATUS_E_FAILURE;
10446 }
10447
10448 /* Store Params pass it to WDI */
10449 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10450 pWdaParams->pWdaContext = pWDA;
10451 /* Store param pointer as passed in by caller */
10452 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010453 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10454 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010455 if(IS_WDI_STATUS_FAILURE(status))
10456 {
10457 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10458 "Failure in Set PNO REQ WDI API, free all the memory " );
10459 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10460 vos_mem_free(pWdaParams->wdaMsgParam);
10461 pWdaParams->wdaWdiApiMsgParam = NULL;
10462 pWdaParams->wdaMsgParam = NULL;
10463 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010464 return CONVERT_WDI2VOS_STATUS(status) ;
10465}
Jeff Johnson295189b2012-06-20 16:38:30 -070010466/*
10467 * FUNCTION: WDA_RssiFilterCallback
10468 *
10469 */
10470void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10471{
10472 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10473
10474 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10475 "<------ %s " ,__FUNCTION__);
10476
10477 VOS_ASSERT(NULL != pWdaParams);
10478
10479 vos_mem_free(pWdaParams->wdaMsgParam) ;
10480 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10481 vos_mem_free(pWdaParams) ;
10482
10483 return ;
10484}
10485/*
10486 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10487 * Request to WDI to set Preferred Network List.Offload
10488 */
10489VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10490 tSirSetRSSIFilterReq* pRssiFilterParams)
10491{
Jeff Johnson43971f52012-07-17 12:26:56 -070010492 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010493 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10494 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10495 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10497 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010498 if(NULL == pwdiSetRssiFilterReqInfo)
10499 {
10500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10501 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10502 VOS_ASSERT(0);
10503 return VOS_STATUS_E_NOMEM;
10504 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010505 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10506 if(NULL == pWdaParams)
10507 {
10508 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10509 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10510 VOS_ASSERT(0);
10511 vos_mem_free(pwdiSetRssiFilterReqInfo);
10512 return VOS_STATUS_E_NOMEM;
10513 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010514 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10515 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010516 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10517 {
10518 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10519 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10520 VOS_ASSERT(0);
10521 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
10522 vos_mem_free(pWdaParams);
10523 return VOS_STATUS_E_FAILURE;
10524 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010525 /* Store Params pass it to WDI */
10526 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10527 pWdaParams->pWdaContext = pWDA;
10528 /* Store param pointer as passed in by caller */
10529 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010530 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10531 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10532 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010533 if(IS_WDI_STATUS_FAILURE(status))
10534 {
10535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10536 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10537 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10538 vos_mem_free(pWdaParams->wdaMsgParam);
10539 pWdaParams->wdaWdiApiMsgParam = NULL;
10540 pWdaParams->wdaMsgParam = NULL;
10541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010542 return CONVERT_WDI2VOS_STATUS(status) ;
10543}
10544
Jeff Johnson295189b2012-06-20 16:38:30 -070010545/*
10546 * FUNCTION: WDA_ProcessUpdateScanParams
10547 * Request to WDI to update Scan Parameters
10548 */
10549VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10550 tSirUpdateScanParams *pUpdateScanParams)
10551{
Jeff Johnson43971f52012-07-17 12:26:56 -070010552 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010553 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10554 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10555 sizeof(WDI_UpdateScanParamsInfoType)) ;
10556 tWDA_ReqParams *pWdaParams ;
10557 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10559 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010560 if(NULL == wdiUpdateScanParamsInfoType)
10561 {
10562 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10563 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10564 VOS_ASSERT(0);
10565 return VOS_STATUS_E_NOMEM;
10566 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010567 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10568 if ( NULL == pWdaParams )
10569 {
10570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10571 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10572 VOS_ASSERT(0);
10573 vos_mem_free(wdiUpdateScanParamsInfoType);
10574 return VOS_STATUS_E_NOMEM;
10575 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010576 //
10577 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10578 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010579 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10580 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10581 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10582 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10583 "sir struct %d wdi struct %d",
10584 pUpdateScanParams->b11dEnabled,
10585 pUpdateScanParams->b11dResolved,
10586 pUpdateScanParams->ucChannelCount,
10587 pUpdateScanParams->usPassiveMinChTime,
10588 pUpdateScanParams->usPassiveMaxChTime,
10589 pUpdateScanParams->usActiveMinChTime,
10590 pUpdateScanParams->usActiveMaxChTime,
10591 sizeof(tSirUpdateScanParams),
10592 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10593
Jeff Johnson295189b2012-06-20 16:38:30 -070010594 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
10595 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070010596 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
10597 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070010598 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
10599 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070010600 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
10601 pUpdateScanParams->usActiveMaxChTime;
10602 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
10603 pUpdateScanParams->usActiveMinChTime;
10604 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
10605 pUpdateScanParams->usPassiveMaxChTime;
10606 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
10607 pUpdateScanParams->usPassiveMinChTime;
10608
Jeff Johnson295189b2012-06-20 16:38:30 -070010609 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
10610 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
10611 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
10612
Jeff Johnson295189b2012-06-20 16:38:30 -070010613 for ( i = 0; i <
10614 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
10615 i++)
10616 {
10617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10618 "Update Scan Parameters channel: %d",
10619 pUpdateScanParams->aChannels[i]);
10620
10621 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
10622 pUpdateScanParams->aChannels[i];
10623 }
10624
Jeff Johnson295189b2012-06-20 16:38:30 -070010625 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010626 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10627 {
10628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10629 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10630 VOS_ASSERT(0);
10631 vos_mem_free(pWdaParams);
10632 vos_mem_free(wdiUpdateScanParamsInfoType);
10633 return VOS_STATUS_E_FAILURE;
10634 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010635 /* Store Params pass it to WDI */
10636 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
10637 pWdaParams->pWdaContext = pWDA;
10638 /* Store param pointer as passed in by caller */
10639 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070010640
Jeff Johnson295189b2012-06-20 16:38:30 -070010641
10642
10643 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
10644 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
10645 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010646 if(IS_WDI_STATUS_FAILURE(status))
10647 {
10648 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10649 "Failure in Update Scan Params EQ WDI API, free all the memory " );
10650 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10651 vos_mem_free(pWdaParams->wdaMsgParam);
10652 vos_mem_free(pWdaParams);
10653 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010654 return CONVERT_WDI2VOS_STATUS(status) ;
10655}
10656#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070010657#ifdef WLAN_FEATURE_PACKET_FILTERING
10658/*
10659 * FUNCTION: WDA_8023MulticastListReqCallback
10660 *
10661 */
10662void WDA_8023MulticastListReqCallback(WDI_Status status, void * pUserData)
10663{
10664 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010665 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10666 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010667 if(NULL == pWdaParams)
10668 {
10669 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10670 "%s: pWdaParams received NULL", __FUNCTION__);
10671 VOS_ASSERT(0) ;
10672 return ;
10673 }
10674
10675 vos_mem_free(pWdaParams->wdaMsgParam) ;
10676 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10677 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010678 //print a msg, nothing else to do
10679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10680 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010681 return ;
10682}
Jeff Johnson295189b2012-06-20 16:38:30 -070010683/*
10684 * FUNCTION: WDA_Process8023MulticastListReq
10685 * Request to WDI to add 8023 Multicast List
10686 */
10687VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
10688 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
10689{
Jeff Johnson43971f52012-07-17 12:26:56 -070010690 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010691 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
10692 tWDA_ReqParams *pWdaParams ;
10693 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010694 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10695 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010696 pwdiFltPktSetMcListReqParamsType =
10697 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
10698 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
10699 ) ;
10700 if(NULL == pwdiFltPktSetMcListReqParamsType)
10701 {
10702 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10703 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10704 return VOS_STATUS_E_NOMEM;
10705 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010706 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10707 if(NULL == pWdaParams)
10708 {
10709 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10710 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10711 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10712 return VOS_STATUS_E_NOMEM;
10713 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010714 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10715 {
10716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10717 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
10718 __FUNCTION__);
10719 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10720 vos_mem_free(pWdaParams);
10721 return VOS_STATUS_E_FAILURE;
10722 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010723 //
10724 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
10725 //
10726 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070010727 pRcvFltMcAddrList->ulMulticastAddrCnt;
10728
10729 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
10730 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
10731 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
10732 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
10733
Jeff Johnson295189b2012-06-20 16:38:30 -070010734 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
10735 {
10736 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
10737 &(pRcvFltMcAddrList->multicastAddr[i]),
10738 sizeof(tSirMacAddr));
10739 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010740 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010741 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
10742 (NULL == pWDA->wdaWdiApiMsgParam)); */
Jeff Johnson295189b2012-06-20 16:38:30 -070010743 /* Store Params pass it to WDI */
10744 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
10745 pWdaParams->pWdaContext = pWDA;
10746 /* Store param pointer as passed in by caller */
10747 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070010748 status = WDI_8023MulticastListReq(
10749 pwdiFltPktSetMcListReqParamsType,
10750 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
10751 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010752 if(IS_WDI_STATUS_FAILURE(status))
10753 {
10754 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10755 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
10756 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10757 vos_mem_free(pWdaParams->wdaMsgParam);
10758 vos_mem_free(pWdaParams);
10759 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010760 return CONVERT_WDI2VOS_STATUS(status) ;
10761}
Jeff Johnson295189b2012-06-20 16:38:30 -070010762/*
10763 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
10764 *
10765 */
10766void WDA_ReceiveFilterSetFilterReqCallback(WDI_Status status, void * pUserData)
10767{
10768 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010769 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10770 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010771 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070010772 if(NULL == pWdaParams)
10773 {
10774 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10775 "%s: pWdaParams received NULL", __FUNCTION__);
10776 VOS_ASSERT(0) ;
10777 return ;
10778 }
10779
10780 vos_mem_free(pWdaParams->wdaMsgParam) ;
10781 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10782 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010783 //print a msg, nothing else to do
10784 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10785 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010786 return ;
10787}
Jeff Johnson295189b2012-06-20 16:38:30 -070010788/*
10789 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
10790 * Request to WDI to set Receive Filters
10791 */
10792VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
10793 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
10794{
Jeff Johnson43971f52012-07-17 12:26:56 -070010795 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010796 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
10797 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
10798 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
10799 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
10800 tWDA_ReqParams *pWdaParams ;
10801 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010802 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10803 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010804 if(NULL == pwdiSetRcvPktFilterReqParamsType)
10805 {
10806 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10807 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10808 VOS_ASSERT(0);
10809 return VOS_STATUS_E_NOMEM;
10810 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010811 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10812 if(NULL == pWdaParams)
10813 {
10814 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10815 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10816 VOS_ASSERT(0);
10817 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
10818 return VOS_STATUS_E_NOMEM;
10819 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010820 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
10821 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
10822 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
10823 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070010824 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
10825 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
10826
10827 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
10828 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010829
10830 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10831 "FID %d FT %d NParams %d CT %d",
10832 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
10833 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
10834 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
10835 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070010836 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
10837 {
10838 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
10839 &pRcvPktFilterCfg->paramsData[i],
10840 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070010841 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10842 "Proto %d Comp Flag %d \n",
10843 pwdiSetRcvPktFilterReqParamsType->
10844 wdiPktFilterCfg.paramsData[i].protocolLayer,
10845 pwdiSetRcvPktFilterReqParamsType->
10846 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070010847 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10848 "Data Offset %d Data Len %d\n",
10849 pwdiSetRcvPktFilterReqParamsType->
10850 wdiPktFilterCfg.paramsData[i].dataOffset,
10851 pwdiSetRcvPktFilterReqParamsType->
10852 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070010853 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10854 "CData: %d:%d:%d:%d:%d:%d\n",
10855 pwdiSetRcvPktFilterReqParamsType->
10856 wdiPktFilterCfg.paramsData[i].compareData[0],
10857 pwdiSetRcvPktFilterReqParamsType->
10858 wdiPktFilterCfg.paramsData[i].compareData[1],
10859 pwdiSetRcvPktFilterReqParamsType->
10860 wdiPktFilterCfg.paramsData[i].compareData[2],
10861 pwdiSetRcvPktFilterReqParamsType->
10862 wdiPktFilterCfg.paramsData[i].compareData[3],
10863 pwdiSetRcvPktFilterReqParamsType->
10864 wdiPktFilterCfg.paramsData[i].compareData[4],
10865 pwdiSetRcvPktFilterReqParamsType->
10866 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070010867 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10868 "MData: %d:%d:%d:%d:%d:%d\n",
10869 pwdiSetRcvPktFilterReqParamsType->
10870 wdiPktFilterCfg.paramsData[i].dataMask[0],
10871 pwdiSetRcvPktFilterReqParamsType->
10872 wdiPktFilterCfg.paramsData[i].dataMask[1],
10873 pwdiSetRcvPktFilterReqParamsType->
10874 wdiPktFilterCfg.paramsData[i].dataMask[2],
10875 pwdiSetRcvPktFilterReqParamsType->
10876 wdiPktFilterCfg.paramsData[i].dataMask[3],
10877 pwdiSetRcvPktFilterReqParamsType->
10878 wdiPktFilterCfg.paramsData[i].dataMask[4],
10879 pwdiSetRcvPktFilterReqParamsType->
10880 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070010881 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010882 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010883 /* Store Params pass it to WDI */
10884 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
10885 pWdaParams->pWdaContext = pWDA;
10886 /* Store param pointer as passed in by caller */
10887 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070010888 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
10889 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
10890 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010891 if(IS_WDI_STATUS_FAILURE(status))
10892 {
10893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10894 "Failure in SetFilter(),free all the memory,status %d ",status);
10895 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10896 vos_mem_free(pWdaParams->wdaMsgParam);
10897 vos_mem_free(pWdaParams);
10898 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010899 return CONVERT_WDI2VOS_STATUS(status) ;
10900}
Jeff Johnson295189b2012-06-20 16:38:30 -070010901/*
10902 * FUNCTION: WDA_FilterMatchCountReqCallback
10903 *
10904 */
10905void WDA_FilterMatchCountReqCallback(WDI_Status status, void * pUserData)
10906{
10907 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10908 tWDA_CbContext *pWDA;
10909 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
10910 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
10911 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
10912 tANI_U8 i;
10913 vos_msg_t vosMsg;
10914
10915 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10916 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010917 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
10918
Jeff Johnsone7245742012-09-05 17:12:55 -070010919 if(NULL == pRcvFltPktMatchCntRsp)
10920 {
10921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10922 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
10923 VOS_ASSERT(0) ;
10924 vos_mem_free(pWdaParams);
10925 return ;
10926 }
10927
Jeff Johnson295189b2012-06-20 16:38:30 -070010928 if(NULL == pWdaParams)
10929 {
10930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10931 "%s: pWdaParams received NULL", __FUNCTION__);
10932 VOS_ASSERT(0) ;
Jeff Johnsone7245742012-09-05 17:12:55 -070010933 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070010934 return ;
10935 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010936 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
10937 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070010938 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
10939 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
10940
10941 /* Message Header */
10942 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
10943 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
10944
10945 pRcvFltPktMatchCntRsp->status = pRcvFltPktMatchCntReq->status;
10946
10947 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
10948 {
10949 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
10950 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
10951 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010952 /* VOS message wrapper */
10953 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
10954 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
10955 vosMsg.bodyval = 0;
10956 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10957 {
10958 /* free the mem and return */
10959 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
10960 }
10961
10962 vos_mem_free(pWdaParams->wdaMsgParam) ;
10963 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10964 vos_mem_free(pWdaParams) ;
10965}
Jeff Johnson295189b2012-06-20 16:38:30 -070010966/*
10967 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
10968 * Request to WDI to get PC Filter Match Count
10969 */
10970VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
10971{
Jeff Johnson43971f52012-07-17 12:26:56 -070010972 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010973 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
10974 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
10975 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10977 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010978 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
10979 {
10980 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10981 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10982 VOS_ASSERT(0);
10983 return VOS_STATUS_E_NOMEM;
10984 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010985 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10986 if(NULL == pWdaParams)
10987 {
10988 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10989 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10990 VOS_ASSERT(0);
10991 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
10992 return VOS_STATUS_E_NOMEM;
10993 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010994 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10995 {
10996 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10997 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10998 VOS_ASSERT(0);
10999 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11000 vos_mem_free(pWdaParams);
11001 return VOS_STATUS_E_FAILURE;
11002 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011003 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
11004
Jeff Johnson295189b2012-06-20 16:38:30 -070011005 /* Store Params pass it to WDI */
11006 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
11007 pWdaParams->pWdaContext = pWDA;
11008 /* Store param pointer as passed in by caller */
11009 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011010 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11011 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11012 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011013 if(IS_WDI_STATUS_FAILURE(status))
11014 {
11015 /* failure returned by WDI API */
11016 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11017 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11018 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11019 vos_mem_free(pWdaParams) ;
11020 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11021 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11022 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011023 return CONVERT_WDI2VOS_STATUS(status) ;
11024}
Jeff Johnson295189b2012-06-20 16:38:30 -070011025/*
11026 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11027 *
11028 */
11029void WDA_ReceiveFilterClearFilterReqCallback(WDI_Status status, void * pUserData)
11030{
11031 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011032 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11033 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011034/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11035 if(NULL == pWdaParams)
11036 {
11037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11038 "%s: pWdaParams received NULL", __FUNCTION__);
11039 VOS_ASSERT(0) ;
11040 return ;
11041 }
11042
11043 vos_mem_free(pWdaParams->wdaMsgParam) ;
11044 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11045 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011046 //print a msg, nothing else to do
11047 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11048 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011049 return ;
11050}
Jeff Johnson295189b2012-06-20 16:38:30 -070011051/*
11052 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11053 * Request to WDI to clear Receive Filters
11054 */
11055VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11056 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11057{
Jeff Johnson43971f52012-07-17 12:26:56 -070011058 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011059 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11060 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11061 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11063 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011064 if(NULL == pwdiRcvFltPktClearReqParamsType)
11065 {
11066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11067 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11068 VOS_ASSERT(0);
11069 return VOS_STATUS_E_NOMEM;
11070 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011071 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11072 if(NULL == pWdaParams)
11073 {
11074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11075 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11076 VOS_ASSERT(0);
11077 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11078 return VOS_STATUS_E_NOMEM;
11079 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011080 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11081 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011082 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11083 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11084 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11085 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011086
11087 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011088 /* Store Params pass it to WDI */
11089 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11090 pWdaParams->pWdaContext = pWDA;
11091 /* Store param pointer as passed in by caller */
11092 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011093 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11094 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11095 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011096 if(IS_WDI_STATUS_FAILURE(status))
11097 {
11098 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11099 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11100 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11101 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011102 return CONVERT_WDI2VOS_STATUS(status) ;
11103}
11104#endif // WLAN_FEATURE_PACKET_FILTERING
11105
Jeff Johnson295189b2012-06-20 16:38:30 -070011106/*
11107 * FUNCTION: WDA_ProcessSetPowerParamsReq
11108 * Request to WDI to set power params
11109 */
11110VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11111 tSirSetPowerParamsReq *pPowerParams)
11112{
Jeff Johnson43971f52012-07-17 12:26:56 -070011113 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011114 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11115 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011116 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011117 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11118 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011119 if(NULL == pwdiSetPowerParamsReqInfo)
11120 {
11121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11122 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11123 VOS_ASSERT(0);
11124 return VOS_STATUS_E_NOMEM;
11125 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011126 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11127 if(NULL == pWdaParams)
11128 {
11129 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11130 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11131 VOS_ASSERT(0);
11132 vos_mem_free(pwdiSetPowerParamsReqInfo);
11133 return VOS_STATUS_E_NOMEM;
11134 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011135
Jeff Johnson295189b2012-06-20 16:38:30 -070011136
11137 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11138 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011139 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11140 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011141 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11142 pPowerParams->uListenInterval;
11143 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11144 pPowerParams->uBcastMcastFilter;
11145 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11146 pPowerParams->uEnableBET;
11147 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11148 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011149 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011150 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11151 {
11152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11153 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11154 VOS_ASSERT(0);
11155 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
11156 vos_mem_free(pWdaParams);
11157 return VOS_STATUS_E_FAILURE;
11158 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011159 /* Store Params pass it to WDI */
11160 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11161 pWdaParams->pWdaContext = pWDA;
11162 /* Store param pointer as passed in by caller */
11163 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011164 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11165 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11166 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011167 if(IS_WDI_STATUS_FAILURE(status))
11168 {
11169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11170 "Failure in Set power params REQ WDI API, free all the memory " );
11171 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11172 vos_mem_free(pWdaParams->wdaMsgParam);
11173 pWdaParams->wdaWdiApiMsgParam = NULL;
11174 pWdaParams->wdaMsgParam = NULL;
11175 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011176 return CONVERT_WDI2VOS_STATUS(status) ;
11177}
11178
11179/*
11180 * FUNCTION: WDA_SetTmLevelRspCallback
11181 * Set TM Level response
11182 */
11183void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11184{
11185 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11186
11187 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11188 "<------ %s " ,__FUNCTION__);
11189
11190 if(NULL == pWdaParams)
11191 {
11192 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11193 "%s: pWdaParams received NULL", __FUNCTION__);
11194 VOS_ASSERT(0) ;
11195 return ;
11196 }
11197
11198 /* Dose not need to send notification to upper layer
11199 * Just free allocated resources */
11200 if( pWdaParams != NULL )
11201 {
11202 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11203 {
11204 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11205 }
11206 vos_mem_free(pWdaParams->wdaMsgParam) ;
11207 vos_mem_free(pWdaParams) ;
11208 }
11209}
11210
11211/*
11212 * FUNCTION: WDA_ProcessSetTmLevelReq
11213 * Set TM Level request
11214 */
11215VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11216 tAniSetTmLevelReq *setTmLevelReq)
11217{
11218 WDI_Status status = WDI_STATUS_SUCCESS ;
11219 tWDA_ReqParams *pWdaParams ;
11220 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11221 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11222 sizeof(WDI_SetTmLevelReqType)) ;
11223 if(NULL == wdiSetTmLevelReq)
11224 {
11225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11226 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11227 VOS_ASSERT(0);
11228 return VOS_STATUS_E_NOMEM;
11229 }
11230
11231 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11232 if(NULL == pWdaParams)
11233 {
11234 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11235 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11236 VOS_ASSERT(0);
11237 vos_mem_free(wdiSetTmLevelReq);
11238 return VOS_STATUS_E_NOMEM;
11239 }
11240
11241 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11242 "------> %s " ,__FUNCTION__);
11243
11244 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11245 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11246
11247 pWdaParams->pWdaContext = pWDA;
11248 pWdaParams->wdaMsgParam = setTmLevelReq;
11249 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11250
11251 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11252 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11253
11254 if(IS_WDI_STATUS_FAILURE(status))
11255 {
11256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11257 "Failure set thernal mitigation level free all the memory " );
11258 vos_mem_free(pWdaParams->wdaMsgParam) ;
11259 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11260 vos_mem_free(pWdaParams) ;
11261 }
11262
11263 return CONVERT_WDI2VOS_STATUS(status) ;
11264}
11265
11266VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11267 tpTxControlParams pTxCtrlParam)
11268{
11269 VOS_STATUS wdaStatus;
11270
11271 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11272 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011273 if( pTxCtrlParam == NULL )
11274 {
11275 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11276 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11277 return VOS_STATUS_E_FAILURE;
11278 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011279 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11280 {
11281 wdaStatus = WDA_SuspendDataTx(pWDA);
11282 }
11283 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11284 {
11285 wdaStatus = WDA_ResumeDataTx(pWDA);
11286 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011287 return wdaStatus;
11288}
11289
11290 /* FUNCTION WDA_featureCapsExchange
11291 * WDA API to invoke capability exchange between host and FW.
11292 */
11293void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11294{
11295 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11296 "%s:enter", __FUNCTION__ );
11297 WDI_featureCapsExchangeReq( NULL, pVosContext);
11298}
11299
11300 /* FUNCTION WDA_getHostWlanFeatCaps
11301 * Wrapper for WDI API, that will return if the feature (enum value).passed
11302 * to this API is supported or not in Host
11303 * return value
11304 * 0 - implies feature is NOT Supported
11305 * any non zero value - implies feature is SUPPORTED
11306 */
11307tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11308{
11309 return WDI_getHostWlanFeatCaps(featEnumValue);
11310}
11311
11312 /* FUNCTION WDA_getFwWlanFeatCaps
11313 * Wrapper for WDI API, that will return if the feature (enum value).passed
11314 * to this API is supported or not in FW
11315 * return value
11316 * 0 - implies feature is NOT Supported
11317 * any non zero value - implies feature is SUPPORTED
11318 */
11319tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11320{
11321 return WDI_getFwWlanFeatCaps(featEnumValue);
11322}
11323
11324/*
11325 * FUNCTION: WDA_shutdown
11326 * Shutdown WDA/WDI without handshaking with Riva.
11327 * Synchronous function.
11328 */
11329VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11330{
11331 WDI_Status wdiStatus;
11332 //tANI_U8 eventIdx = 0;
11333 VOS_STATUS status = VOS_STATUS_SUCCESS;
11334 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011335 if (NULL == pWDA)
11336 {
11337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11338 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11339 VOS_ASSERT(0);
11340 return VOS_STATUS_E_FAILURE;
11341 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011342 /* FTM mode stay START_STATE */
11343 if( (WDA_READY_STATE != pWDA->wdaState) &&
11344 (WDA_INIT_STATE != pWDA->wdaState) &&
11345 (WDA_START_STATE != pWDA->wdaState) )
11346 {
11347 VOS_ASSERT(0);
11348 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011349 if(NULL != pWDA->wdaWdiApiMsgParam)
11350 {
11351 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11352 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11353 VOS_ASSERT(0);
11354 /* the last request was not freed, probably a SSR
11355 * initiated by WLAN driver (WDI timeout) */
11356 vos_mem_free(pWDA->wdaWdiApiMsgParam);
11357 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011358 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11359 {
11360 wdaDestroyTimers(pWDA);
11361 }
11362 pWDA->wdaWdiApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011363 /* call WDI shutdown */
11364 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011365 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11366 {
11367 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11368 "error in WDA Stop" );
11369 status = VOS_STATUS_E_FAILURE;
11370 }
11371 /* WDI stop is synchrnous, shutdown is complete when it returns */
11372 pWDA->wdaState = WDA_STOP_STATE;
11373
Jeff Johnson295189b2012-06-20 16:38:30 -070011374 /* shutdown should perform the stop & close actions. */
11375 /* Destroy the event */
11376 status = vos_event_destroy(&pWDA->txFrameEvent);
11377 if(!VOS_IS_STATUS_SUCCESS(status))
11378 {
11379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11380 "VOS Event destroy failed - status = %d\n", status);
11381 status = VOS_STATUS_E_FAILURE;
11382 }
11383 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11384 if(!VOS_IS_STATUS_SUCCESS(status))
11385 {
11386 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11387 "VOS Event destroy failed - status = %d\n", status);
11388 status = VOS_STATUS_E_FAILURE;
11389 }
11390 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11391 if(!VOS_IS_STATUS_SUCCESS(status))
11392 {
11393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11394 "VOS Event destroy failed - status = %d\n", status);
11395 status = VOS_STATUS_E_FAILURE;
11396 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011397 /* free WDA context */
11398 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11399 if ( !VOS_IS_STATUS_SUCCESS(status) )
11400 {
11401 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11402 "error in WDA close " );
11403 status = VOS_STATUS_E_FAILURE;
11404 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011405 return status;
11406}
Jeff Johnsone7245742012-09-05 17:12:55 -070011407/*
11408 * FUNCTION: WDA_stopFailed
11409 * WDA stop failed
11410 */
11411
11412void WDA_stopFailed(v_PVOID_t pVosContext)
11413{
11414 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11415 pWDA->needShutdown = TRUE;
11416}
11417/*
11418 * FUNCTION: WDA_needShutdown
11419 * WDA needs a shutdown
11420 */
11421
11422v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11423{
11424 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11425 return pWDA->needShutdown;
11426}
11427
Mohit Khanna4a70d262012-09-11 16:30:12 -070011428#ifdef WLAN_FEATURE_11AC
11429/*
11430 * FUNCTION: WDA_SetBeaconFilterReqCallback
11431 *
11432 */
11433void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11434{
11435 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11437 "<------ %s " ,__FUNCTION__);
11438 if(NULL == pWdaParams)
11439 {
11440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11441 "%s: pWdaParams received NULL", __FUNCTION__);
11442 VOS_ASSERT(0) ;
11443 return ;
11444 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011445
Mohit Khanna4a70d262012-09-11 16:30:12 -070011446 vos_mem_free(pWdaParams->wdaMsgParam) ;
11447 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11448 vos_mem_free(pWdaParams) ;
11449 /*
11450 * No respone required for SetBeaconFilter req so just free the request
11451 * param here
11452 */
11453
11454 return ;
11455}
11456
11457VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11458 tUpdateVHTOpMode *pData)
11459{
11460 WDI_Status status = WDI_STATUS_SUCCESS ;
11461 tWDA_ReqParams *pWdaParams ;
11462 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11463 sizeof(WDI_UpdateVHTOpMode)) ;
11464 if(NULL == wdiTemp)
11465 {
11466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11467 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11468 VOS_ASSERT(0);
11469 return VOS_STATUS_E_NOMEM;
11470 }
11471 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11472 if(NULL == pWdaParams)
11473 {
11474 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11475 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11476 VOS_ASSERT(0);
11477 vos_mem_free(wdiTemp);
11478 return VOS_STATUS_E_NOMEM;
11479 }
11480
11481 wdiTemp->opMode = pData->opMode;
11482 wdiTemp->staId = pData->staId;
11483
11484 pWdaParams->pWdaContext = pWDA;
11485 /* Store Req pointer, as this will be used for response */
11486 pWdaParams->wdaMsgParam = (void *)pData;
11487 /* store Params pass it to WDI */
11488 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11489
11490 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11491
11492 if(IS_WDI_STATUS_FAILURE(status))
11493 {
11494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11495 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11496 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11497 vos_mem_free(pWdaParams->wdaMsgParam);
11498 vos_mem_free(pWdaParams);
11499 }
11500 return CONVERT_WDI2VOS_STATUS(status) ;
11501}
11502#endif