blob: 125b67faf1d134c3bd71771f40584187629ed0e9 [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 */
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070090#define WDA_TL_GET_STA_STATE(a, b, c) WLANTL_GetSTAState(a, b, c)
Jeff Johnson295189b2012-06-20 16:38:30 -070091#define WDA_TL_GET_TX_PKTCOUNT(a, b, c, d) WLANTL_GetTxPktCount(a, b, c, d)
Jeff Johnson295189b2012-06-20 16:38:30 -070092#define WDA_GET_BA_TXFLAG(a, b, c) \
93 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) & (1 << (c)))
94
95#define WDA_SET_BA_TXFLAG(a, b, c) \
96 (((a)->wdaStaInfo[(b)].ucUseBaBitmap) |= (1 << (c)))
97
98#define WDA_CLEAR_BA_TXFLAG(a, b, c) \
99 (((a)->wdaStaInfo[b].ucUseBaBitmap) &= ~(1 << c))
Jeff Johnson295189b2012-06-20 16:38:30 -0700100#define WDA_TL_BA_SESSION_ADD(a, b, c, d, e, f, g) \
101 WLANTL_BaSessionAdd(a, b, c, d, e, f, g)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102/* timer related Macros */
103#define WDA_CREATE_TIMER(a, b, c, d, e, f, g) \
104 tx_timer_create(a, b, c, d, e, f, g)
105#define WDA_START_TIMER(a) tx_timer_activate(a)
106#define WDA_STOP_TIMER(a) tx_timer_deactivate(a)
107#define WDA_DESTROY_TIMER(a) tx_timer_delete(a)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700108#define WDA_WDI_START_TIMEOUT (WDI_RESPONSE_TIMEOUT + 5000)
Jeff Johnson295189b2012-06-20 16:38:30 -0700109
110#define WDA_LAST_POLLED_THRESHOLD(a, curSta, tid) \
111 ((a)->wdaStaInfo[curSta].framesTxed[tid] + WDA_BA_TX_FRM_THRESHOLD)
Jeff Johnson295189b2012-06-20 16:38:30 -0700112#define WDA_BA_MAX_WINSIZE (64)
Jeff Johnson295189b2012-06-20 16:38:30 -0700113#define WDA_INVALID_KEY_INDEX 0xFF
Jeff Johnson295189b2012-06-20 16:38:30 -0700114#define WDA_NUM_PWR_SAVE_CFG 11
Jeff Johnson295189b2012-06-20 16:38:30 -0700115#define WDA_TX_COMPLETE_TIME_OUT_VALUE 1000
116
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700117#define WDA_MAX_RETRIES_TILL_RING_EMPTY 1000 /* MAX 10000 msec = 10 seconds wait */
Jeff Johnson295189b2012-06-20 16:38:30 -0700118
Jeff Johnson04dd8a82012-06-29 20:41:40 -0700119#define WDA_WAIT_MSEC_TILL_RING_EMPTY 10 /* 10 msec wait per cycle */
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -0700120#define WDA_IS_NULL_MAC_ADDRESS(mac_addr) \
121 ((mac_addr[0] == 0x00) && (mac_addr[1] == 0x00) && (mac_addr[2] == 0x00) &&\
122 (mac_addr[1] == 0x00) && (mac_addr[2] == 0x00) && (mac_addr[3] == 0x00))
123
124#define WDA_MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
125#define WDA_MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
Jeff Johnson295189b2012-06-20 16:38:30 -0700126/* extern declarations */
127extern void vos_WDAComplete_cback(v_PVOID_t pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -0700128/* forward declarations */
129void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
130 void *pBodyptr, tANI_U32 bodyVal) ;
131VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
132 WDI_StartReqParamsType *wdiStartParams ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700133VOS_STATUS WDA_wdiCompleteCB(v_PVOID_t pVosContext) ;
134VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams);
135
136extern v_BOOL_t sys_validateStaConfig( void *pImage, unsigned long cbFile,
137 void **ppStaConfig, v_SIZE_t *pcbStaConfig ) ;
138void processCfgDownloadReq(tpAniSirGlobal pMac, tANI_U16 length,
139 tANI_U32 *pConfig) ;
140void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
141 WDI_ConfigBSSReqInfoType *wdiBssParams, tAddBssParams *wdaBssParams) ;
142void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
143 WDI_ConfigStaReqInfoType *wdiStaParams, tAddStaParams *wdaStaParams) ;
144void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
145 void* pUserData ) ;
146static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA) ;
147static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA);
148void WDA_BaCheckActivity(tWDA_CbContext *pWDA) ;
149void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams, void* pUserData);
Jeff Johnson295189b2012-06-20 16:38:30 -0700150#ifdef WLAN_FEATURE_VOWIFI_11R
151VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA, tAggrAddTsParams *pAggrAddTsReqParams);
152#endif /* WLAN_FEATURE_VOWIFI_11R */
153
Jeff Johnson295189b2012-06-20 16:38:30 -0700154void WDA_TimerHandler(v_VOID_t *pWDA, tANI_U32 timerInfo) ;
155void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pContext) ;
156VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -0700157#ifdef FEATURE_WLAN_SCAN_PNO
158static VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA, tSirPNOScanReq *pPNOScanReqParams);
159static VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA, tSirSetRSSIFilterReq* pRssiFilterParams);
160static VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA, tSirUpdateScanParams *pUpdateScanParams);
161#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -0700162#ifdef WLAN_FEATURE_PACKET_FILTERING
163static VOS_STATUS WDA_Process8023MulticastListReq (
164 tWDA_CbContext *pWDA,
165 tSirRcvFltMcAddrList *pRcvFltMcAddrLis
166 );
167static VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (
168 tWDA_CbContext *pWDA,
169 tSirRcvPktFilterCfgType *pRcvPktFilterCfg
170 );
171static VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (
172 tWDA_CbContext *pWDA,
173 tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp
174 );
175static VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (
176 tWDA_CbContext *pWDA,
177 tSirRcvFltPktClearParam *pRcvFltPktClearParam
178 );
179#endif // WLAN_FEATURE_PACKET_FILTERING
Jeff Johnson295189b2012-06-20 16:38:30 -0700180VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA, tSirSetPowerParamsReq *pPowerParams);
Jeff Johnson295189b2012-06-20 16:38:30 -0700181static VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
182 tpTxControlParams pTxCtrlParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700183VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
184 v_U8_t *pDefaultKeyId,
185 v_U8_t *pNumKeys,
186 WDI_KeysType *pWdiKeys );
187
188#ifdef WLAN_FEATURE_GTK_OFFLOAD
189static VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA, tpSirGtkOffloadParams pGtkOffloadParams);
190static VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA, tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp);
191#endif // WLAN_FEATURE_GTK_OFFLOAD
192
193VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
194 tAniSetTmLevelReq *setTmLevelReq);
Mohit Khanna4a70d262012-09-11 16:30:12 -0700195#ifdef WLAN_FEATURE_11AC
196VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
197 tUpdateVHTOpMode *pData);
198#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700199/*
200 * FUNCTION: WDA_open
201 * Allocate the WDA context
202 */
203VOS_STATUS WDA_open(v_PVOID_t pVosContext, v_PVOID_t pOSContext,
204 tMacOpenParameters *pMacParams )
205{
206 tWDA_CbContext *wdaContext;
207 VOS_STATUS status;
208 WDI_DeviceCapabilityType wdiDevCapability = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700209 /* Allocate WDA context */
210 status = vos_alloc_context(pVosContext, VOS_MODULE_ID_WDA,
211 (v_VOID_t **)&wdaContext, sizeof(tWDA_CbContext)) ;
212 if(!VOS_IS_STATUS_SUCCESS(status))
213 {
214 return VOS_STATUS_E_NOMEM;
215 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700216 /*__asm int 3;*/
217 vos_mem_zero(wdaContext,sizeof(tWDA_CbContext));
218
219 /* Initialize data structures */
220 wdaContext->pVosContext = pVosContext;
221 wdaContext->wdaState = WDA_INIT_STATE;
222 wdaContext->uTxFlowMask = WDA_TXFLOWMASK;
223
224 /* Initialize WDA-WDI synchronization event */
225 status = vos_event_init(&wdaContext->wdaWdiEvent);
226 if(!VOS_IS_STATUS_SUCCESS(status))
227 {
228 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
229 "WDI Sync Event init failed - status = %d\n", status);
230 status = VOS_STATUS_E_FAILURE;
231 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700232 /* Init Frame transfer event */
233 status = vos_event_init(&wdaContext->txFrameEvent);
234 if(!VOS_IS_STATUS_SUCCESS(status))
235 {
236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
237 "VOS Mgmt Frame 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->suspendDataTxEvent);
241 if(!VOS_IS_STATUS_SUCCESS(status))
242 {
243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
244 "VOS suspend data tx Event init failed - status = %d\n", status);
245 status = VOS_STATUS_E_FAILURE;
246 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700247 status = vos_event_init(&wdaContext->waitOnWdiIndicationCallBack);
248 if(!VOS_IS_STATUS_SUCCESS(status))
249 {
250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
251 "VOS wait On Wdi Ind Event init failed - status = %d\n", status);
252 status = VOS_STATUS_E_FAILURE;
253 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700254 vos_trace_setLevel(VOS_MODULE_ID_WDA,VOS_TRACE_LEVEL_ERROR);
Jeff Johnson295189b2012-06-20 16:38:30 -0700255 wdaContext->driverMode = pMacParams->driverType;
256 if(WDI_STATUS_SUCCESS != WDI_Init(pOSContext, &wdaContext->pWdiContext,
257 &wdiDevCapability, pMacParams->driverType))
258 {
259 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
260 "WDI Init failed" );
261 status = VOS_STATUS_E_FAILURE;
262 }
263 else
264 {
265 pMacParams->maxStation = wdiDevCapability.ucMaxSTASupported ;
266 pMacParams->maxBssId = wdiDevCapability.ucMaxBSSSupported;
267 pMacParams->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -0700268 /* update max STA in WDA used for BA */
269 wdaContext->wdaMaxSta = pMacParams->maxStation;
270 /* store the frameTransRequired flag in wdaContext, to send this to HAL
271 * in WDA_Start
272 */
273 wdaContext->frameTransRequired = wdiDevCapability.bFrameXtlSupported;
274 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700275 return status;
276}
277
Jeff Johnson295189b2012-06-20 16:38:30 -0700278/*
279 * FUNCTION: WDA_preStart
280 * Trigger DAL-AL to start CFG download
281 */
282VOS_STATUS WDA_preStart(v_PVOID_t pVosContext)
283{
284 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
285 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700286 /*
287 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
288 */
289 wdaMsg.type = WNI_CFG_DNLD_REQ ;
290 wdaMsg.bodyptr = NULL;
291 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700292 /* post the message.. */
293 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
294 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
295 {
296 vosStatus = VOS_STATUS_E_BADMSG;
297 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700298 return( vosStatus );
299}
Jeff Johnson295189b2012-06-20 16:38:30 -0700300/*
301 * FUNCTION: WDA_wdiStartCallback
302 * Once WDI_Start is finished, WDI start callback will be called by WDI
303 * to indicate completion of WDI_Start.
304 */
305void WDA_wdiStartCallback(WDI_StartRspParamsType *wdiRspParams,
306 void *pVosContext)
307{
308 tWDA_CbContext *wdaContext;
309 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700310 if (NULL == pVosContext)
311 {
312 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
313 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
314 return;
315 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700316 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
317 if (NULL == wdaContext)
318 {
319 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
320 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
321 return;
322 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700323 if (WDI_STATUS_SUCCESS != wdiRspParams->wdiStatus)
324 {
325 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
326 "%s: WDI_Start() failure reported", __FUNCTION__ );
327 }
328 else
329 {
330 wdaContext->wdaState = WDA_START_STATE;
331 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 /* extract and save version information from the Start Response */
333 wdaContext->wcnssWlanCompiledVersion.major =
334 wdiRspParams->wlanCompiledVersion.major;
335 wdaContext->wcnssWlanCompiledVersion.minor =
336 wdiRspParams->wlanCompiledVersion.minor;
337 wdaContext->wcnssWlanCompiledVersion.version =
338 wdiRspParams->wlanCompiledVersion.version;
339 wdaContext->wcnssWlanCompiledVersion.revision =
340 wdiRspParams->wlanCompiledVersion.revision;
341 wdaContext->wcnssWlanReportedVersion.major =
342 wdiRspParams->wlanReportedVersion.major;
343 wdaContext->wcnssWlanReportedVersion.minor =
344 wdiRspParams->wlanReportedVersion.minor;
345 wdaContext->wcnssWlanReportedVersion.version =
346 wdiRspParams->wlanReportedVersion.version;
347 wdaContext->wcnssWlanReportedVersion.revision =
348 wdiRspParams->wlanReportedVersion.revision;
349 wpalMemoryCopy(wdaContext->wcnssSoftwareVersionString,
350 wdiRspParams->wcnssSoftwareVersion,
351 sizeof(wdaContext->wcnssSoftwareVersionString));
352 wpalMemoryCopy(wdaContext->wcnssHardwareVersionString,
353 wdiRspParams->wcnssHardwareVersion,
354 sizeof(wdaContext->wcnssHardwareVersionString));
Jeff Johnson295189b2012-06-20 16:38:30 -0700355 /* Notify WDA_start that WDI_Start has completed */
356 status = vos_event_set(&wdaContext->wdaWdiEvent);
Jeff Johnson43971f52012-07-17 12:26:56 -0700357 if (VOS_STATUS_SUCCESS != status)
Jeff Johnson295189b2012-06-20 16:38:30 -0700358 {
359 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
360 "%s: Unable to unblock WDA_start", __FUNCTION__ );
361 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700362 return;
363}
364
Jeff Johnson295189b2012-06-20 16:38:30 -0700365/*
366 * FUNCTION: WDA_start
367 * Prepare TLV configuration and call WDI_Start.
368 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700369VOS_STATUS WDA_start(v_PVOID_t pVosContext)
370{
371 tWDA_CbContext *wdaContext;
372 VOS_STATUS status;
373 WDI_Status wdiStatus;
374 WDI_StartReqParamsType wdiStartParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700375 if (NULL == pVosContext)
376 {
377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
378 "%s: Invoked with invalid pVosContext", __FUNCTION__ );
379 return VOS_STATUS_E_FAILURE;
380 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700381 wdaContext = VOS_GET_WDA_CTXT(pVosContext);
382 if (NULL == wdaContext)
383 {
384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
385 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
386 return VOS_STATUS_E_FAILURE;
387 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700388 /* Non-FTM mode, WDA status for START must be INIT
389 * FTM mode, WDA Status for START can be INIT or STOP */
390 if ( (WDA_INIT_STATE != wdaContext->wdaState) &&
391 (WDA_STOP_STATE != wdaContext->wdaState) )
392 {
393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
394 "%s: Invoked from wrong state %d",
395 __FUNCTION__, wdaContext->wdaState );
396 return VOS_STATUS_E_FAILURE;
397 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700398 /* initialize the wdiStartParam. Note that we can create this on
399 the stack since we won't exit until WDI_Start() completes or
400 times out */
401 vos_mem_set(&wdiStartParam, sizeof(wdiStartParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700402 wdiStartParam.wdiDriverType = wdaContext->driverMode;
Jeff Johnson295189b2012-06-20 16:38:30 -0700403 /* prepare the config TLV for the WDI */
404 status = WDA_prepareConfigTLV(pVosContext, &wdiStartParam);
405 if ( !VOS_IS_STATUS_SUCCESS(status) )
406 {
407 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
408 "%s: Unable to prepare Config TLV", __FUNCTION__ );
409 return VOS_STATUS_E_FAILURE;
410 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700411 /* note from here onwards if an error occurs we must
412 reclaim the config TLV buffer */
Jeff Johnson295189b2012-06-20 16:38:30 -0700413 wdiStartParam.wdiLowLevelIndCB = WDA_lowLevelIndCallback;
414 wdiStartParam.pIndUserData = (v_PVOID_t *)wdaContext;
415 wdiStartParam.wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700416 /* initialize the WDA-WDI synchronization event */
417 vos_event_reset(&wdaContext->wdaWdiEvent);
Jeff Johnson295189b2012-06-20 16:38:30 -0700418 /* call WDI start */
419 wdiStatus = WDI_Start(&wdiStartParam,
420 (WDI_StartRspCb)WDA_wdiStartCallback,
421 (v_VOID_t *)pVosContext);
422 if ( IS_WDI_STATUS_FAILURE(wdiStatus) )
423 {
424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
425 "%s: WDI Start failed", __FUNCTION__ );
426 vos_mem_free(wdiStartParam.pConfigBuffer);
427 return VOS_STATUS_E_FAILURE;
428 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700429 /* wait for WDI start to invoke our callback */
430 status = vos_wait_single_event( &wdaContext->wdaWdiEvent,
431 WDA_WDI_START_TIMEOUT );
432 if ( !VOS_IS_STATUS_SUCCESS(status) )
433 {
434 if ( VOS_STATUS_E_TIMEOUT == status )
435 {
436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
437 "%s: Timeout occurred during WDI_Start", __FUNCTION__ );
438 }
439 else
440 {
441 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
442 "%s: Error %d while waiting for WDI_Start",
443 __FUNCTION__, status);
444 }
445 vos_mem_free(wdiStartParam.pConfigBuffer);
446 return VOS_STATUS_E_FAILURE;
447 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700448 /* WDI_Start() has completed so we can resume our work */
Jeff Johnson295189b2012-06-20 16:38:30 -0700449 /* we no longer need the config TLV */
450 vos_mem_free(wdiStartParam.pConfigBuffer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700451 /* if we are not in the START state then WDI_Start() failed */
452 if (WDA_START_STATE != wdaContext->wdaState)
453 {
454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
455 "%s: WDI_Start() failure detected", __FUNCTION__ );
456 return VOS_STATUS_E_FAILURE;
457 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700458 /* FTM mode does not need to monitor BA activity */
459 if ( eDRIVER_TYPE_MFG != wdaContext->driverMode )
460 {
461 status = wdaCreateTimers(wdaContext) ;
462 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700463 return status;
464}
465
Jeff Johnson295189b2012-06-20 16:38:30 -0700466/*
467 * FUNCTION: WDA_prepareConfigTLV
468 * Function to prepare CFG for DAL(WDA)
469 */
470VOS_STATUS WDA_prepareConfigTLV(v_PVOID_t pVosContext,
471 WDI_StartReqParamsType *wdiStartParams )
472{
473 /* get pMac to acess CFG data base */
474 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pVosContext);
475 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
476 tHalCfg *tlvStruct = NULL ;
477 tANI_U8 *tlvStructStart = NULL ;
478 tANI_U32 strLength = WNI_CFG_STA_ID_LEN;
479 v_PVOID_t *configParam;
480 tANI_U32 configParamSize;
481 tANI_U32 *configDataValue;
482 WDI_WlanVersionType wcnssCompiledApiVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -0700483 if ((NULL == pMac)||(NULL == wdaContext))
484 {
485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
486 "%s: Invoked with invalid wdaContext or pMac", __FUNCTION__ );
487 VOS_ASSERT(0);
488 return VOS_STATUS_E_FAILURE;
489 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 configParamSize = (sizeof(tHalCfg) * QWLAN_HAL_CFG_MAX_PARAMS) +
491 WNI_CFG_STA_ID_LEN +
492 WNI_CFG_EDCA_WME_ACBK_LEN +
493 WNI_CFG_EDCA_WME_ACBE_LEN +
494 WNI_CFG_EDCA_WME_ACVI_LEN +
495 WNI_CFG_EDCA_WME_ACVO_LEN +
496 + (QWLAN_HAL_CFG_INTEGER_PARAM * sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 /* malloc memory for all configs in one shot */
498 configParam = vos_mem_malloc(configParamSize);
499
500 if(NULL == configParam )
501 {
502 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
503 "%s:configParam is NULL", __FUNCTION__);
504 VOS_ASSERT(0) ;
505 return VOS_STATUS_E_NOMEM;
506 }
507 vos_mem_set(configParam, configParamSize, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 wdiStartParams->pConfigBuffer = configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700509 tlvStruct = (tHalCfg *)configParam;
510 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -0700511 /* TODO: Remove Later */
512 /* QWLAN_HAL_CFG_STA_ID */
513 tlvStruct->type = QWLAN_HAL_CFG_STA_ID;
514 configDataValue = (tANI_U32*)((tANI_U8 *) tlvStruct + sizeof(tHalCfg));
515 if(wlan_cfgGetStr(pMac, WNI_CFG_STA_ID, (tANI_U8*)configDataValue, &strLength) !=
516 eSIR_SUCCESS)
517 {
518 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
519 "Failed to get value for WNI_CFG_STA_ID");
520 goto handle_failure;
521 }
522 tlvStruct->length = strLength ;
523 /* calculate the pad bytes to have the CFG in aligned format */
524 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
525 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
527 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700528 /* QWLAN_HAL_CFG_CURRENT_TX_ANTENNA */
529 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
530 tlvStruct->length = sizeof(tANI_U32);
531 configDataValue = (tANI_U32 *)(tlvStruct + 1);
532 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_TX_ANTENNA, configDataValue )
533 != eSIR_SUCCESS)
534 {
535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
536 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
537 goto handle_failure;
538 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700539 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
540 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700541 /* QWLAN_HAL_CFG_CURRENT_RX_ANTENNA */
542 tlvStruct->type = QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
543 tlvStruct->length = sizeof(tANI_U32);
544 configDataValue = (tANI_U32 *)(tlvStruct + 1);
545 if(wlan_cfgGetInt(pMac, WNI_CFG_CURRENT_RX_ANTENNA, configDataValue) !=
546 eSIR_SUCCESS)
547 {
548 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
549 "Failed to get value for WNI_CFG_CURRENT_RX_ANTENNA");
550 goto handle_failure;
551 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
553 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 /* QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE */
555 tlvStruct->type = QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
556 tlvStruct->length = sizeof(tANI_U32);
557 configDataValue = (tANI_U32 *)(tlvStruct + 1);
558 if(wlan_cfgGetInt(pMac, WNI_CFG_LOW_GAIN_OVERRIDE, configDataValue )
559 != eSIR_SUCCESS)
560 {
561 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
562 "Failed to get value for WNI_CFG_LOW_GAIN_OVERRIDE");
563 goto handle_failure;
564 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700565 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
566 + sizeof(tHalCfg) + tlvStruct->length)) ;
567
568 /* QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN */
569 tlvStruct->type = QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
570 tlvStruct->length = sizeof(tANI_U32);
571 configDataValue = (tANI_U32 *)(tlvStruct + 1);
572 if(wlan_cfgGetInt(pMac, WNI_CFG_POWER_STATE_PER_CHAIN,
573 configDataValue ) != eSIR_SUCCESS)
574 {
575 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
576 "Failed to get value for WNI_CFG_POWER_STATE_PER_CHAIN");
577 goto handle_failure;
578 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700579 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
580 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 /* QWLAN_HAL_CFG_CAL_PERIOD */
582 tlvStruct->type = QWLAN_HAL_CFG_CAL_PERIOD;
583 tlvStruct->length = sizeof(tANI_U32);
584 configDataValue = (tANI_U32 *)(tlvStruct + 1);
585 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_PERIOD, configDataValue )
586 != eSIR_SUCCESS)
587 {
588 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
589 "Failed to get value for WNI_CFG_CAL_PERIOD");
590 goto handle_failure;
591 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700592 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
593 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700594 /* QWLAN_HAL_CFG_CAL_CONTROL */
595 tlvStruct->type = QWLAN_HAL_CFG_CAL_CONTROL ;
596 tlvStruct->length = sizeof(tANI_U32);
597 configDataValue = (tANI_U32 *)(tlvStruct + 1);
598 if(wlan_cfgGetInt(pMac, WNI_CFG_CAL_CONTROL, configDataValue )
599 != eSIR_SUCCESS)
600 {
601 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
602 "Failed to get value for WNI_CFG_CAL_CONTROL");
603 goto handle_failure;
604 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700605 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
606 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700607 /* QWLAN_HAL_CFG_PROXIMITY */
608 tlvStruct->type = QWLAN_HAL_CFG_PROXIMITY ;
609 tlvStruct->length = sizeof(tANI_U32);
610 configDataValue = (tANI_U32 *)(tlvStruct + 1);
611 if(wlan_cfgGetInt(pMac, WNI_CFG_PROXIMITY, configDataValue )
612 != eSIR_SUCCESS)
613 {
614 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
615 "Failed to get value for WNI_CFG_PROXIMITY");
616 goto handle_failure;
617 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700618 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
619 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700620 /* QWLAN_HAL_CFG_NETWORK_DENSITY */
621 tlvStruct->type = QWLAN_HAL_CFG_NETWORK_DENSITY ;
622 tlvStruct->length = sizeof(tANI_U32);
623 configDataValue = (tANI_U32 *)(tlvStruct + 1);
624 if(wlan_cfgGetInt(pMac, WNI_CFG_NETWORK_DENSITY, configDataValue )
625 != eSIR_SUCCESS)
626 {
627 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
628 "Failed to get value for WNI_CFG_NETWORK_DENSITY");
629 goto handle_failure;
630 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700631 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
632 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700633 /* QWLAN_HAL_CFG_MAX_MEDIUM_TIME */
634 tlvStruct->type = QWLAN_HAL_CFG_MAX_MEDIUM_TIME ;
635 tlvStruct->length = sizeof(tANI_U32);
636 configDataValue = (tANI_U32 *)(tlvStruct + 1);
637 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MEDIUM_TIME, configDataValue ) !=
638 eSIR_SUCCESS)
639 {
640 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
641 "Failed to get value for WNI_CFG_MAX_MEDIUM_TIME");
642 goto handle_failure;
643 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700644 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
645 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700646 /* QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU */
647 tlvStruct->type = QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU ;
648 tlvStruct->length = sizeof(tANI_U32);
649 configDataValue = (tANI_U32 *)(tlvStruct + 1);
650 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_MPDUS_IN_AMPDU,
651 configDataValue ) != eSIR_SUCCESS)
652 {
653 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
654 "Failed to get value for WNI_CFG_MAX_MPDUS_IN_AMPDU");
655 goto handle_failure;
656 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700657 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
658 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700659 /* QWLAN_HAL_CFG_RTS_THRESHOLD */
660 tlvStruct->type = QWLAN_HAL_CFG_RTS_THRESHOLD ;
661 tlvStruct->length = sizeof(tANI_U32);
662 configDataValue = (tANI_U32 *)(tlvStruct + 1);
663 if(wlan_cfgGetInt(pMac, WNI_CFG_RTS_THRESHOLD, configDataValue ) !=
664 eSIR_SUCCESS)
665 {
666 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
667 "Failed to get value for WNI_CFG_RTS_THRESHOLD");
668 goto handle_failure;
669 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700670 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
671 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700672 /* QWLAN_HAL_CFG_SHORT_RETRY_LIMIT */
673 tlvStruct->type = QWLAN_HAL_CFG_SHORT_RETRY_LIMIT ;
674 tlvStruct->length = sizeof(tANI_U32);
675 configDataValue = (tANI_U32 *)(tlvStruct + 1);
676 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_RETRY_LIMIT, configDataValue ) !=
677 eSIR_SUCCESS)
678 {
679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
680 "Failed to get value for WNI_CFG_SHORT_RETRY_LIMIT");
681 goto handle_failure;
682 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700683 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
684 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700685 /* QWLAN_HAL_CFG_LONG_RETRY_LIMIT */
686 tlvStruct->type = QWLAN_HAL_CFG_LONG_RETRY_LIMIT ;
687 tlvStruct->length = sizeof(tANI_U32);
688 configDataValue = (tANI_U32 *)(tlvStruct + 1);
689 if(wlan_cfgGetInt(pMac, WNI_CFG_LONG_RETRY_LIMIT, configDataValue ) !=
690 eSIR_SUCCESS)
691 {
692 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
693 "Failed to get value for WNI_CFG_LONG_RETRY_LIMIT");
694 goto handle_failure;
695 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700696 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
697 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700698 /* QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD */
699 tlvStruct->type = QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD ;
700 tlvStruct->length = sizeof(tANI_U32);
701 configDataValue = (tANI_U32 *)(tlvStruct + 1);
702 if(wlan_cfgGetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD,
703 configDataValue ) != eSIR_SUCCESS)
704 {
705 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
706 "Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD");
707 goto handle_failure;
708 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700709 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
710 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700711 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO */
712 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO ;
713 tlvStruct->length = sizeof(tANI_U32);
714 configDataValue = (tANI_U32 *)(tlvStruct + 1);
715 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ZERO,
716 configDataValue ) != eSIR_SUCCESS)
717 {
718 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
719 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ZERO");
720 goto handle_failure;
721 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
723 + sizeof(tHalCfg) + tlvStruct->length));
724
725 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE */
726 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE ;
727 tlvStruct->length = sizeof(tANI_U32);
728 configDataValue = (tANI_U32 *)(tlvStruct + 1);
729 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_ONE,
730 configDataValue ) != eSIR_SUCCESS)
731 {
732 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
733 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_ONE");
734 goto handle_failure;
735 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
737 + sizeof(tHalCfg) + tlvStruct->length));
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 /* QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO */
739 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO ;
740 tlvStruct->length = sizeof(tANI_U32);
741 configDataValue = (tANI_U32 *)(tlvStruct + 1);
742 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_THRESHOLD_TWO,
743 configDataValue ) != eSIR_SUCCESS)
744 {
745 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
746 "Failed to get value for WNI_CFG_DYNAMIC_THRESHOLD_TWO");
747 goto handle_failure;
748 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700749 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
750 + sizeof(tHalCfg) + tlvStruct->length));
751
752 /* QWLAN_HAL_CFG_FIXED_RATE */
753 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE ;
754 tlvStruct->length = sizeof(tANI_U32);
755 configDataValue = (tANI_U32 *)(tlvStruct + 1);
756 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE, configDataValue)
757 != eSIR_SUCCESS)
758 {
759 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
760 "Failed to get value for WNI_CFG_FIXED_RATE");
761 goto handle_failure;
762 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700763 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
764 + sizeof(tHalCfg) + tlvStruct->length));
765
766 /* QWLAN_HAL_CFG_RETRYRATE_POLICY */
767 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_POLICY ;
768 tlvStruct->length = sizeof(tANI_U32);
769 configDataValue = (tANI_U32 *)(tlvStruct + 1);
770 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_POLICY, configDataValue )
771 != eSIR_SUCCESS)
772 {
773 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
774 "Failed to get value for WNI_CFG_RETRYRATE_POLICY");
775 goto handle_failure;
776 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700777 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
778 + sizeof(tHalCfg) + tlvStruct->length));
779
780 /* QWLAN_HAL_CFG_RETRYRATE_SECONDARY */
781 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_SECONDARY ;
782 tlvStruct->length = sizeof(tANI_U32);
783 configDataValue = (tANI_U32 *)(tlvStruct + 1);
784 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_SECONDARY,
785 configDataValue ) != eSIR_SUCCESS)
786 {
787 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
788 "Failed to get value for WNI_CFG_RETRYRATE_SECONDARY");
789 goto handle_failure;
790 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700791 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
792 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700793 /* QWLAN_HAL_CFG_RETRYRATE_TERTIARY */
794 tlvStruct->type = QWLAN_HAL_CFG_RETRYRATE_TERTIARY ;
795 tlvStruct->length = sizeof(tANI_U32);
796 configDataValue = (tANI_U32 *)(tlvStruct + 1);
797 if(wlan_cfgGetInt(pMac, WNI_CFG_RETRYRATE_TERTIARY,
798 configDataValue ) != eSIR_SUCCESS)
799 {
800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
801 "Failed to get value for WNI_CFG_RETRYRATE_TERTIARY");
802 goto handle_failure;
803 }
804 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
805 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700806 /* QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION */
807 tlvStruct->type = QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION ;
808 tlvStruct->length = sizeof(tANI_U32);
809 configDataValue = (tANI_U32 *)(tlvStruct + 1);
810 if(wlan_cfgGetInt(pMac, WNI_CFG_FORCE_POLICY_PROTECTION,
811 configDataValue ) != eSIR_SUCCESS)
812 {
813 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
814 "Failed to get value for WNI_CFG_FORCE_POLICY_PROTECTION");
815 goto handle_failure;
816 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700817 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
818 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700819 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ */
820 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ ;
821 tlvStruct->length = sizeof(tANI_U32);
822 configDataValue = (tANI_U32 *)(tlvStruct + 1);
823 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_24GHZ,
824 configDataValue ) != eSIR_SUCCESS)
825 {
826 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
827 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_24GHZ");
828 goto handle_failure;
829 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700830 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
831 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700832 /* QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ */
833 tlvStruct->type = QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ ;
834 tlvStruct->length = sizeof(tANI_U32);
835 configDataValue = (tANI_U32 *)(tlvStruct + 1);
836 if(wlan_cfgGetInt(pMac, WNI_CFG_FIXED_RATE_MULTICAST_5GHZ,
837 configDataValue ) != eSIR_SUCCESS)
838 {
839 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
840 "Failed to get value for WNI_CFG_FIXED_RATE_MULTICAST_5GHZ");
841 goto handle_failure;
842 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
844 + sizeof(tHalCfg) + tlvStruct->length);
845
846#if 0 /*FIXME_PRIMA : Enable this after the RA is enabled in HAL*/
847 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ */
848 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ ;
849 tlvStruct->length = sizeof(tANI_U32);
850 configDataValue = (tANI_U32 *)(tlvStruct + 1);
851 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_24GHZ,
852 configDataValue ) != eSIR_SUCCESS)
853 {
854 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
855 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_24GHZ");
856 goto handle_failure;
857 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700858 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
859 + sizeof(tHalCfg) + tlvStruct->length);
860#endif
861 /* QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ */
862 tlvStruct->type = QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ ;
863 tlvStruct->length = sizeof(tANI_U32);
864 configDataValue = (tANI_U32 *)(tlvStruct + 1);
865 if(wlan_cfgGetInt(pMac, WNI_CFG_DEFAULT_RATE_INDEX_5GHZ,
866 configDataValue ) != eSIR_SUCCESS)
867 {
868 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
869 "Failed to get value for WNI_CFG_DEFAULT_RATE_INDEX_5GHZ");
870 goto handle_failure;
871 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700872 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
873 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700874 /* QWLAN_HAL_CFG_MAX_BA_SESSIONS */
875 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_SESSIONS ;
876 tlvStruct->length = sizeof(tANI_U32);
877 configDataValue = (tANI_U32 *)(tlvStruct + 1);
878 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_SESSIONS, configDataValue ) !=
879 eSIR_SUCCESS)
880 {
881 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
882 "Failed to get value for WNI_CFG_MAX_BA_SESSIONS");
883 goto handle_failure;
884 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700885 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
886 + sizeof(tHalCfg) + tlvStruct->length);
887
888 /* QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT */
889 tlvStruct->type = QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT ;
890 tlvStruct->length = sizeof(tANI_U32);
891 configDataValue = (tANI_U32 *)(tlvStruct + 1);
892 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
893 configDataValue ) != eSIR_SUCCESS)
894 {
895 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
896 "Failed to get value for WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT");
897 goto handle_failure;
898 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700899 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
900 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700901 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER */
902 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER ;
903 tlvStruct->length = sizeof(tANI_U32);
904 configDataValue = (tANI_U32 *)(tlvStruct + 1);
905 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_BCN_FILTER,
906 configDataValue ) != eSIR_SUCCESS)
907 {
908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
909 "Failed to get value for WNI_CFG_PS_ENABLE_BCN_FILTER");
910 goto handle_failure;
911 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700912 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
913 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700914 /* QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR */
915 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR ;
916 tlvStruct->length = sizeof(tANI_U32);
917 configDataValue = (tANI_U32 *)(tlvStruct + 1);
918 if(wlan_cfgGetInt(pMac, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
919 configDataValue ) != eSIR_SUCCESS)
920 {
921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
922 "Failed to get value for WNI_CFG_PS_ENABLE_RSSI_MONITOR");
923 goto handle_failure;
924 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700925 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
926 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700927 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
928 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE ;
929 tlvStruct->length = sizeof(tANI_U32);
930 configDataValue = (tANI_U32 *)(tlvStruct + 1);
931 if(wlan_cfgGetInt(pMac, WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE,
932 configDataValue ) != eSIR_SUCCESS)
933 {
934 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
935 "Failed to get value for WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE");
936 goto handle_failure;
937 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700938 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
939 + sizeof(tHalCfg) + tlvStruct->length);
940
941 /* QWLAN_HAL_CFG_STATS_PERIOD */
942 tlvStruct->type = QWLAN_HAL_CFG_STATS_PERIOD ;
943 tlvStruct->length = sizeof(tANI_U32);
944 configDataValue = (tANI_U32 *)(tlvStruct + 1);
945 if(wlan_cfgGetInt(pMac, WNI_CFG_STATS_PERIOD, configDataValue ) !=
946 eSIR_SUCCESS)
947 {
948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
949 "Failed to get value for WNI_CFG_STATS_PERIOD");
950 goto handle_failure;
951 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700952 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
953 + sizeof(tHalCfg) + tlvStruct->length);
Jeff Johnson295189b2012-06-20 16:38:30 -0700954 /* QWLAN_HAL_CFG_CFP_MAX_DURATION */
955 tlvStruct->type = QWLAN_HAL_CFG_CFP_MAX_DURATION ;
956 tlvStruct->length = sizeof(tANI_U32);
957 configDataValue = (tANI_U32 *)(tlvStruct + 1);
958 if(wlan_cfgGetInt(pMac, WNI_CFG_CFP_MAX_DURATION, configDataValue ) !=
959 eSIR_SUCCESS)
960 {
961 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
962 "Failed to get value for WNI_CFG_CFP_MAX_DURATION");
963 goto handle_failure;
964 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700965 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
966 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700967 /* QWLAN_HAL_CFG_FRAME_TRANS_ENABLED */
968 tlvStruct->type = QWLAN_HAL_CFG_FRAME_TRANS_ENABLED ;
969 tlvStruct->length = sizeof(tANI_U32);
970 configDataValue = (tANI_U32 *)(tlvStruct + 1);
971 vos_mem_copy(configDataValue, &wdaContext->frameTransRequired,
972 sizeof(tANI_U32));
Jeff Johnson295189b2012-06-20 16:38:30 -0700973 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
974 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700975 /* QWLAN_HAL_CFG_DTIM_PERIOD */
976 tlvStruct->type = QWLAN_HAL_CFG_DTIM_PERIOD ;
977 tlvStruct->length = sizeof(tANI_U32);
978 configDataValue = (tANI_U32 *)(tlvStruct + 1);
979 if(wlan_cfgGetInt(pMac, WNI_CFG_DTIM_PERIOD, configDataValue)
980 != eSIR_SUCCESS)
981 {
982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
983 "Failed to get value for WNI_CFG_DTIM_PERIOD");
984 goto handle_failure;
985 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700986 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
987 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -0700988 /* QWLAN_HAL_CFG_EDCA_WMM_ACBK */
989 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBK ;
990 strLength = WNI_CFG_EDCA_WME_ACBK_LEN;
991 configDataValue = (tANI_U32 *)(tlvStruct + 1);
992 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBK, (tANI_U8 *)configDataValue,
993 &strLength) != eSIR_SUCCESS)
994 {
995 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
996 "Failed to get value for WNI_CFG_EDCA_WME_ACBK");
997 goto handle_failure;
998 }
999 tlvStruct->length = strLength;
1000 /* calculate the pad bytes to have the CFG in aligned format */
1001 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1002 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001003 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1004 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001005 /* QWLAN_HAL_CFG_EDCA_WMM_ACBE */
1006 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACBE ;
1007 strLength = WNI_CFG_EDCA_WME_ACBE_LEN;
1008 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1009 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACBE, (tANI_U8 *)configDataValue,
1010 &strLength) != eSIR_SUCCESS)
1011 {
1012 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1013 "Failed to get value for WNI_CFG_EDCA_WME_ACBE");
1014 goto handle_failure;
1015 }
1016 tlvStruct->length = strLength;
1017 /* calculate the pad bytes to have the CFG in aligned format */
1018 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1019 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001020 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1021 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001022 /* QWLAN_HAL_CFG_EDCA_WMM_ACVI */
1023 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVO ;
1024 strLength = WNI_CFG_EDCA_WME_ACVI_LEN;
1025 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1026 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVO, (tANI_U8 *)configDataValue,
1027 &strLength) != eSIR_SUCCESS)
1028 {
1029 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1030 "Failed to get value for WNI_CFG_EDCA_WME_ACVI");
1031 goto handle_failure;
1032 }
1033 tlvStruct->length = strLength;
1034 /* calculate the pad bytes to have the CFG in aligned format */
1035 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1036 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001037 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1038 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001039 /* QWLAN_HAL_CFG_EDCA_WMM_ACVO */
1040 tlvStruct->type = QWLAN_HAL_CFG_EDCA_WMM_ACVI ;
1041 strLength = WNI_CFG_EDCA_WME_ACVO_LEN;
1042 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1043 if(wlan_cfgGetStr(pMac, WNI_CFG_EDCA_WME_ACVI, (tANI_U8 *)configDataValue,
1044 &strLength) != eSIR_SUCCESS)
1045 {
1046 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1047 "Failed to get value for WNI_CFG_EDCA_WME_ACVO");
1048 goto handle_failure;
1049 }
1050 tlvStruct->length = strLength;
1051 /* calculate the pad bytes to have the CFG in aligned format */
1052 tlvStruct->padBytes = ALIGNED_WORD_SIZE -
1053 (tlvStruct->length & (ALIGNED_WORD_SIZE - 1));
Jeff Johnson295189b2012-06-20 16:38:30 -07001054 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1055 + sizeof(tHalCfg) + tlvStruct->length + tlvStruct->padBytes) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001056 /* QWLAN_HAL_CFG_BA_THRESHOLD_HIGH */
1057 tlvStruct->type = QWLAN_HAL_CFG_BA_THRESHOLD_HIGH ;
1058 tlvStruct->length = sizeof(tANI_U32);
1059 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1060 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_THRESHOLD_HIGH, configDataValue)
1061 != eSIR_SUCCESS)
1062 {
1063 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1064 "Failed to get value for WNI_CFG_BA_THRESHOLD_HIGH");
1065 goto handle_failure;
1066 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001067 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1068 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 /* QWLAN_HAL_CFG_MAX_BA_BUFFERS */
1070 tlvStruct->type = QWLAN_HAL_CFG_MAX_BA_BUFFERS ;
1071 tlvStruct->length = sizeof(tANI_U32);
1072 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1073 if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_BA_BUFFERS, configDataValue)
1074 != eSIR_SUCCESS)
1075 {
1076 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1077 "Failed to get value for WNI_CFG_MAX_BA_BUFFERS");
1078 goto handle_failure;
1079 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001080 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1081 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001082 /* QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE */
1083 tlvStruct->type = QWLAN_HAL_CFG_DYNAMIC_PS_POLL_VALUE ;
1084 tlvStruct->length = sizeof(tANI_U32);
1085 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1086 if(wlan_cfgGetInt(pMac, WNI_CFG_DYNAMIC_PS_POLL_VALUE, configDataValue)
1087 != eSIR_SUCCESS)
1088 {
1089 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1090 "Failed to get value for WNI_CFG_DYNAMIC_PS_POLL_VALUE");
1091 goto handle_failure;
1092 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001093 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1094 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001095 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI */
1096 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI ;
1097 tlvStruct->length = sizeof(tANI_U32);
1098 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1099 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI, configDataValue)
1100 != eSIR_SUCCESS)
1101 {
1102 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1103 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI");
1104 goto handle_failure;
1105 }
1106 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1107 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001108 /* QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS */
1109 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS ;
1110 tlvStruct->length = sizeof(tANI_U32);
1111 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1112 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS, configDataValue)
1113 != eSIR_SUCCESS)
1114 {
1115 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1116 "Failed to get value for WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS");
1117 goto handle_failure;
1118 }
1119 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1120 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001121 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI */
1122 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI ;
1123 tlvStruct->length = sizeof(tANI_U32);
1124 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1125 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI, configDataValue)
1126 != eSIR_SUCCESS)
1127 {
1128 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1129 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI");
1130 goto handle_failure;
1131 }
1132 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1133 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001134 /* QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS */
1135 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS ;
1136 tlvStruct->length = sizeof(tANI_U32);
1137 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1138 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS, configDataValue)
1139 != eSIR_SUCCESS)
1140 {
1141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1142 "Failed to get value for WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS");
1143 goto handle_failure;
1144 }
1145 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1146 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001147 /* QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN */
1148 tlvStruct->type = QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN ;
1149 tlvStruct->length = sizeof(tANI_U32);
1150 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1151 if(wlan_cfgGetInt(pMac, WNI_CFG_TELE_BCN_WAKEUP_EN, configDataValue)
1152 != eSIR_SUCCESS)
1153 {
1154 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1155 "Failed to get value for WNI_CFG_TELE_BCN_WAKEUP_EN");
1156 goto handle_failure;
1157 }
1158 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1159 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001160 /* QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD */
1161 tlvStruct->type = QWLAN_HAL_CFG_INFRA_STA_KEEP_ALIVE_PERIOD ;
1162 tlvStruct->length = sizeof(tANI_U32);
1163 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1164 if(wlan_cfgGetInt(pMac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD, configDataValue)
1165 != eSIR_SUCCESS)
1166 {
1167 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1168 "Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
1169 goto handle_failure;
1170 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001171 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1172 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001173 /*QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE*/
1174 tlvStruct->type = QWLAN_HAL_CFG_TX_PWR_CTRL_ENABLE ;
1175 tlvStruct->length = sizeof(tANI_U32);
1176 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1177 if(wlan_cfgGetInt(pMac, WNI_CFG_TX_PWR_CTRL_ENABLE, configDataValue)
1178 != eSIR_SUCCESS)
1179 {
1180 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1181 "Failed to get value for WNI_CFG_TX_PWR_CTRL_ENABLE");
1182 goto handle_failure;
1183 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001184 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1185 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001186 /* QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP */
1187 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP ;
1188 tlvStruct->length = sizeof(tANI_U32);
1189 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1190 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_CLOSE_LOOP, configDataValue)
1191 != eSIR_SUCCESS)
1192 {
1193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1194 "Failed to get value for WNI_CFG_ENABLE_CLOSE_LOOP");
1195 goto handle_failure;
1196 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001197 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1198 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001199 /* [COEX] strictly speaking, the Coex parameters are not part of the WLAN_CFG_FILE binary,
1200 * but are from the WLAN_INI_FILE file. However, this is the only parameter download routine
1201 * into FW, so the parameters are added here.
1202 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001203 /* [COEX] QWLAN_HAL_CFG_BTC_EXECUTION_MODE */
1204 tlvStruct->type = QWLAN_HAL_CFG_BTC_EXECUTION_MODE ;
1205 tlvStruct->length = sizeof(tANI_U32);
1206 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1207 *configDataValue = pMac->btc.btcConfig.btcExecutionMode;
1208 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1209 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001210 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK */
1211 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_BT_SLOTS_TO_BLOCK ;
1212 tlvStruct->length = sizeof(tANI_U32);
1213 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1214 *configDataValue = pMac->btc.btcConfig.btcConsBtSlotsToBlockDuringDhcp;
1215 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1216 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001217 /* [COEX] QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS */
1218 tlvStruct->type = QWLAN_HAL_CFG_BTC_A2DP_DHCP_BT_SUB_INTERVALS ;
1219 tlvStruct->length = sizeof(tANI_U32);
1220 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1221 *configDataValue = pMac->btc.btcConfig.btcA2DPBtSubIntervalsDuringDhcp;
1222 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1223 + sizeof(tHalCfg) + tlvStruct->length) ;
Jeff Johnson32d95a32012-09-10 13:15:23 -07001224 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT */
1225 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_BT ;
1226 tlvStruct->length = sizeof(tANI_U32);
1227 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1228 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqBt;
1229 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1230 + sizeof(tHalCfg) + tlvStruct->length) ;
1231
1232 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT */
1233 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_BT ;
1234 tlvStruct->length = sizeof(tANI_U32);
1235 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1236 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageBt;
1237 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1238 + sizeof(tHalCfg) + tlvStruct->length) ;
1239
1240 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT */
1241 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_BT ;
1242 tlvStruct->length = sizeof(tANI_U32);
1243 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1244 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnBt;
1245 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1246 + sizeof(tHalCfg) + tlvStruct->length) ;
1247
1248 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT */
1249 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_BT ;
1250 tlvStruct->length = sizeof(tANI_U32);
1251 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1252 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeBt;
1253 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1254 + sizeof(tHalCfg) + tlvStruct->length) ;
1255
1256 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN */
1257 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_INQ_WLAN ;
1258 tlvStruct->length = sizeof(tANI_U32);
1259 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1260 *configDataValue = pMac->btc.btcConfig.btcStaticLenInqWlan;
1261 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1262 + sizeof(tHalCfg) + tlvStruct->length) ;
1263
1264 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN */
1265 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_PAGE_WLAN ;
1266 tlvStruct->length = sizeof(tANI_U32);
1267 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1268 *configDataValue = pMac->btc.btcConfig.btcStaticLenPageWlan;
1269 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1270 + sizeof(tHalCfg) + tlvStruct->length) ;
1271
1272 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN */
1273 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_CONN_WLAN ;
1274 tlvStruct->length = sizeof(tANI_U32);
1275 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1276 *configDataValue = pMac->btc.btcConfig.btcStaticLenConnWlan;
1277 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1278 + sizeof(tHalCfg) + tlvStruct->length) ;
1279
1280 /* [COEX] QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN */
1281 tlvStruct->type = QWLAN_HAL_CFG_BTC_STATIC_LEN_LE_WLAN ;
1282 tlvStruct->length = sizeof(tANI_U32);
1283 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1284 *configDataValue = pMac->btc.btcConfig.btcStaticLenLeWlan;
1285 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1286 + sizeof(tHalCfg) + tlvStruct->length) ;
1287
1288 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT */
1289 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_BT ;
1290 tlvStruct->length = sizeof(tANI_U32);
1291 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1292 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenBt;
1293 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1294 + sizeof(tHalCfg) + tlvStruct->length) ;
1295
1296 /* [COEX] QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN */
1297 tlvStruct->type = QWLAN_HAL_CFG_BTC_DYN_MAX_LEN_WLAN ;
1298 tlvStruct->length = sizeof(tANI_U32);
1299 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1300 *configDataValue = pMac->btc.btcConfig.btcDynMaxLenWlan;
1301 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1302 + sizeof(tHalCfg) + tlvStruct->length) ;
1303
1304 /* [COEX] QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC */
1305 tlvStruct->type = QWLAN_HAL_CFG_BTC_MAX_SCO_BLOCK_PERC ;
1306 tlvStruct->length = sizeof(tANI_U32);
1307 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1308 *configDataValue = pMac->btc.btcConfig.btcMaxScoBlockPerc;
1309 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1310 + sizeof(tHalCfg) + tlvStruct->length) ;
1311
1312 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP */
1313 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_A2DP ;
1314 tlvStruct->length = sizeof(tANI_U32);
1315 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1316 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnA2dp;
1317 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1318 + sizeof(tHalCfg) + tlvStruct->length) ;
1319
1320 /* [COEX] QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO */
1321 tlvStruct->type = QWLAN_HAL_CFG_BTC_DHCP_PROT_ON_SCO ;
1322 tlvStruct->length = sizeof(tANI_U32);
1323 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1324 *configDataValue = pMac->btc.btcConfig.btcDhcpProtOnSco;
1325 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1326 + sizeof(tHalCfg) + tlvStruct->length) ;
1327
1328 /* QWLAN_HAL_CFG_WCNSS_API_VERSION */
Jeff Johnson295189b2012-06-20 16:38:30 -07001329 tlvStruct->type = QWLAN_HAL_CFG_WCNSS_API_VERSION ;
1330 tlvStruct->length = sizeof(tANI_U32);
1331 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1332 WDI_GetWcnssCompiledApiVersion(&wcnssCompiledApiVersion);
1333 *configDataValue = WLAN_HAL_CONSTRUCT_API_VERSION(wcnssCompiledApiVersion.major,
1334 wcnssCompiledApiVersion.minor,
1335 wcnssCompiledApiVersion.version,
1336 wcnssCompiledApiVersion.revision);
1337 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1338 + sizeof(tHalCfg) + tlvStruct->length) ;
1339
Jeff Johnsond13512a2012-07-17 11:42:19 -07001340 /* QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT */
1341 tlvStruct->type = QWLAN_HAL_CFG_AP_KEEPALIVE_TIMEOUT ;
1342 tlvStruct->length = sizeof(tANI_U32);
1343 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1344 if(wlan_cfgGetInt(pMac, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT,
1345 configDataValue ) != eSIR_SUCCESS)
1346 {
1347 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1348 "Failed to get value for WNI_CFG_AP_KEEP_ALIVE_TIMEOUT");
1349 goto handle_failure;
1350 }
1351
1352 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1353 + sizeof(tHalCfg) + tlvStruct->length) ;
1354 /* QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT */
1355 tlvStruct->type = QWLAN_HAL_CFG_GO_KEEPALIVE_TIMEOUT ;
1356 tlvStruct->length = sizeof(tANI_U32);
1357 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1358 if(wlan_cfgGetInt(pMac, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT,
1359 configDataValue ) != eSIR_SUCCESS)
1360 {
1361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1362 "Failed to get value for WNI_CFG_GO_KEEP_ALIVE_TIMEOUT");
1363 goto handle_failure;
1364 }
1365
1366 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1367 + sizeof(tHalCfg) + tlvStruct->length) ;
1368
1369 /* QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST */
1370 tlvStruct->type = QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST;
1371 tlvStruct->length = sizeof(tANI_U32);
1372 configDataValue = (tANI_U32 *)(tlvStruct + 1);
1373 if(wlan_cfgGetInt(pMac, WNI_CFG_ENABLE_MC_ADDR_LIST, configDataValue)
1374 != eSIR_SUCCESS)
1375 {
1376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1377 "Failed to get value for WNI_CFG_ENABLE_MC_ADDR_LIST");
1378 goto handle_failure;
1379 }
1380
1381 tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
1382 + sizeof(tHalCfg) + tlvStruct->length) ;
1383
Jeff Johnson295189b2012-06-20 16:38:30 -07001384 wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001385#ifdef WLAN_DEBUG
1386 {
1387 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07001388 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1389 "****** Dumping CFG TLV ***** ");
1390 for (i=0; (i+7) < wdiStartParams->usConfigBufferLen; i+=8)
1391 {
1392 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1393 "%02x %02x %02x %02x %02x %02x %02x %02x",
1394 tlvStructStart[i],
1395 tlvStructStart[i+1],
1396 tlvStructStart[i+2],
1397 tlvStructStart[i+3],
1398 tlvStructStart[i+4],
1399 tlvStructStart[i+5],
1400 tlvStructStart[i+6],
1401 tlvStructStart[i+7]);
1402 }
1403 /* Dump the bytes in the last line*/
1404 for (; i < wdiStartParams->usConfigBufferLen; i++)
1405 {
1406 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1407 "%02x ",tlvStructStart[i]);
1408 }
1409 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1410 "**************************** ");
1411 }
1412#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001413 return VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001414handle_failure:
1415 vos_mem_free(configParam);
1416 return VOS_STATUS_E_FAILURE;
1417}
Jeff Johnson295189b2012-06-20 16:38:30 -07001418/*
1419 * FUNCTION: WDA_wdiCompleteCB
1420 * call the voss call back function
1421 */
1422void WDA_stopCallback(WDI_Status status, v_PVOID_t *pVosContext)
1423{
1424 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001425 if (NULL == wdaContext)
1426 {
1427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1428 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1429 return ;
1430 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001431 /* free the config structure */
1432 if(wdaContext->wdaWdiApiMsgParam != NULL)
1433 {
1434 vos_mem_free(wdaContext->wdaWdiApiMsgParam);
1435 wdaContext->wdaWdiApiMsgParam = NULL;
1436 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001437 if(WDI_STATUS_SUCCESS != status)
1438 {
1439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1440 "WDI stop callback returned failure" );
1441 VOS_ASSERT(0) ;
1442 }
1443 else
1444 {
1445 wdaContext->wdaState = WDA_STOP_STATE;
1446 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001447 /* Indicate VOSS about the start complete */
1448 vos_WDAComplete_cback(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001449 return ;
1450}
Jeff Johnson295189b2012-06-20 16:38:30 -07001451/*
1452 * FUNCTION: WDA_stop
1453 * call WDI_stop
1454 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001455VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
1456{
1457 WDI_Status wdiStatus;
1458 VOS_STATUS status = VOS_STATUS_SUCCESS;
1459 WDI_StopReqParamsType *wdiStopReq;
1460 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001461 if (NULL == pWDA)
1462 {
1463 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1464 "%s: Invoked with invalid pWDA", __FUNCTION__ );
1465 VOS_ASSERT(0);
1466 return VOS_STATUS_E_FAILURE;
1467 }
Madan Mohan Koyyalamudia2fc6412012-10-21 12:06:12 -07001468 if (pWDA->wdiFailed == true)
1469 {
1470 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
1471 "%s: WDI in failed state", __FUNCTION__ );
1472 return VOS_STATUS_E_ALREADY;
1473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001474 /* FTM mode stay START_STATE */
1475 if( (WDA_READY_STATE != pWDA->wdaState) &&
1476 (WDA_INIT_STATE != pWDA->wdaState) &&
1477 (WDA_START_STATE != pWDA->wdaState) )
1478 {
1479 VOS_ASSERT(0);
1480 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001481 wdiStopReq = (WDI_StopReqParamsType *)
1482 vos_mem_malloc(sizeof(WDI_StopReqParamsType));
1483 if(NULL == wdiStopReq)
1484 {
1485 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1486 "%s: VOS MEM Alloc Failure", __FUNCTION__);
1487 VOS_ASSERT(0);
1488 return VOS_STATUS_E_NOMEM;
1489 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001490 wdiStopReq->wdiStopReason = reason;
1491 wdiStopReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001492 if(NULL != pWDA->wdaWdiApiMsgParam)
1493 {
1494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1495 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
1496 VOS_ASSERT(0);
1497 vos_mem_free(wdiStopReq);
1498 return VOS_STATUS_E_FAILURE;
1499 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001500 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
1501 {
1502 wdaDestroyTimers(pWDA);
1503 }
1504 pWDA->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07001505 /* call WDI stop */
1506 wdiStatus = WDI_Stop(wdiStopReq,
1507 (WDI_StopRspCb)WDA_stopCallback, pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001508 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
1509 {
1510 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1511 "error in WDA Stop" );
1512 vos_mem_free(pWDA->wdaWdiApiMsgParam);
1513 pWDA->wdaWdiApiMsgParam = NULL;
1514 status = VOS_STATUS_E_FAILURE;
1515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 return status;
1517}
Jeff Johnson295189b2012-06-20 16:38:30 -07001518/*
1519 * FUNCTION: WDA_close
1520 * call WDI_close and free the WDA context
1521 */
1522VOS_STATUS WDA_close(v_PVOID_t pVosContext)
1523{
Jeff Johnson43971f52012-07-17 12:26:56 -07001524 VOS_STATUS status = VOS_STATUS_SUCCESS;
1525 WDI_Status wstatus;
1526 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07001527 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001528 if (NULL == wdaContext)
1529 {
1530 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1531 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1532 return VOS_STATUS_E_FAILURE;
1533 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001534 if((WDA_INIT_STATE != wdaContext->wdaState) &&
1535 (WDA_STOP_STATE != wdaContext->wdaState))
1536 {
1537 VOS_ASSERT(0);
1538 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001539 /*call WDI close*/
Jeff Johnson43971f52012-07-17 12:26:56 -07001540 wstatus = WDI_Close();
1541 if ( wstatus != WDI_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07001542 {
1543 status = VOS_STATUS_E_FAILURE;
1544 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001545 wdaContext->wdaState = WDA_CLOSE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001546 /* Destroy the events */
Jeff Johnson43971f52012-07-17 12:26:56 -07001547 vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent);
1548 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 {
1550 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1551 "WDI Sync Event destroy failed - status = %d\n", status);
1552 status = VOS_STATUS_E_FAILURE;
1553 }
1554
Jeff Johnson43971f52012-07-17 12:26:56 -07001555 vstatus = vos_event_destroy(&wdaContext->txFrameEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001556 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001557 {
1558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1559 "VOS Event destroy failed - status = %d\n", status);
1560 status = VOS_STATUS_E_FAILURE;
1561 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001562 vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001563 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001564 {
1565 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1566 "VOS Event destroy failed - status = %d\n", status);
1567 status = VOS_STATUS_E_FAILURE;
1568 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001569 vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
Jeff Johnsone7245742012-09-05 17:12:55 -07001570 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001571 {
1572 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1573 "VOS Event destroy failed - status = %d\n", status);
1574 status = VOS_STATUS_E_FAILURE;
1575 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001576 /* free WDA context */
Jeff Johnson43971f52012-07-17 12:26:56 -07001577 vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07001578 if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001579 {
1580 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1581 "error in WDA close " );
1582 status = VOS_STATUS_E_FAILURE;
1583 }
1584 return status;
1585}
Jeff Johnson295189b2012-06-20 16:38:30 -07001586/*
1587 * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
1588 * returns 1 if the compiled version is greater than or equal to the input version
1589 */
1590
1591uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1592{
1593 VOS_STATUS status = VOS_STATUS_SUCCESS;
1594 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1595 tSirVersionType compiledVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001596 status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001597 if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
1598 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
1599 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
1600 (compiledVersion.revision >= revision)))
1601 return 1;
1602 else
1603 return 0;
1604}
Jeff Johnson295189b2012-06-20 16:38:30 -07001605/*
1606 * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
1607 * returns 1 if the compiled version is greater than or equal to the input version
1608 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001609uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1610{
1611 VOS_STATUS status = VOS_STATUS_SUCCESS;
1612 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1613 tSirVersionType reportedVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001614 status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001615 if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
1616 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
1617 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
1618 (reportedVersion.revision >= revision)))
1619 return 1;
1620 else
1621 return 0;
1622}
Jeff Johnson295189b2012-06-20 16:38:30 -07001623/*
1624 * FUNCTION: WDA_GetWcnssWlanCompiledVersion
1625 * Returns the version of the WCNSS WLAN API with which the HOST
1626 * device driver was compiled
1627 */
1628VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx,
1629 tSirVersionType *pVersion)
1630{
1631 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07001632 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001634 if ((NULL == pvosGCtx) || (NULL == pVersion))
1635 {
1636 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1637 "%s: Invoked with invalid parameter", __FUNCTION__);
1638 VOS_ASSERT(0);
1639 return VOS_STATUS_E_FAILURE;
1640 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001641 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1642 if (NULL == pWDA )
1643 {
1644 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1645 "%s: Invalid WDA context", __FUNCTION__);
1646 VOS_ASSERT(0);
1647 return VOS_STATUS_E_FAILURE;
1648 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001649 *pVersion = pWDA->wcnssWlanCompiledVersion;
1650 return VOS_STATUS_SUCCESS;
1651}
Jeff Johnson295189b2012-06-20 16:38:30 -07001652/*
1653 * FUNCTION: WDA_GetWcnssWlanReportedVersion
1654 * Returns the version of the WCNSS WLAN API with which the WCNSS
1655 * device driver was compiled
1656 */
1657VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx,
1658 tSirVersionType *pVersion)
1659{
1660 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07001661 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001662 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001663 if ((NULL == pvosGCtx) || (NULL == pVersion))
1664 {
1665 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1666 "%s: Invoked with invalid parameter", __FUNCTION__);
1667 VOS_ASSERT(0);
1668 return VOS_STATUS_E_FAILURE;
1669 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001670 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1671 if (NULL == pWDA )
1672 {
1673 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1674 "%s: Invalid WDA context", __FUNCTION__);
1675 VOS_ASSERT(0);
1676 return VOS_STATUS_E_FAILURE;
1677 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001678 *pVersion = pWDA->wcnssWlanReportedVersion;
1679 return VOS_STATUS_SUCCESS;
1680}
Jeff Johnson295189b2012-06-20 16:38:30 -07001681/*
1682 * FUNCTION: WDA_GetWcnssSoftwareVersion
1683 * Returns the WCNSS Software version string
1684 */
1685VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
1686 tANI_U8 *pVersion,
1687 tANI_U32 versionBufferSize)
1688{
1689 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1691 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001692 if ((NULL == pvosGCtx) || (NULL == pVersion))
1693 {
1694 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1695 "%s: Invoked with invalid parameter", __FUNCTION__);
1696 VOS_ASSERT(0);
1697 return VOS_STATUS_E_FAILURE;
1698 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001699 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1700 if (NULL == pWDA )
1701 {
1702 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1703 "%s: Invalid WDA context", __FUNCTION__);
1704 VOS_ASSERT(0);
1705 return VOS_STATUS_E_FAILURE;
1706 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001707 wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
1708 return VOS_STATUS_SUCCESS;
1709}
Jeff Johnson295189b2012-06-20 16:38:30 -07001710/*
1711 * FUNCTION: WDA_GetWcnssHardwareVersion
1712 * Returns the WCNSS Hardware version string
1713 */
1714VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx,
1715 tANI_U8 *pVersion,
1716 tANI_U32 versionBufferSize)
1717{
1718 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001719 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1720 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 if ((NULL == pvosGCtx) || (NULL == pVersion))
1722 {
1723 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1724 "%s: Invoked with invalid parameter", __FUNCTION__);
1725 VOS_ASSERT(0);
1726 return VOS_STATUS_E_FAILURE;
1727 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001728 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1729 if (NULL == pWDA )
1730 {
1731 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1732 "%s: Invalid WDA context", __FUNCTION__);
1733 VOS_ASSERT(0);
1734 return VOS_STATUS_E_FAILURE;
1735 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001736 wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
1737 return VOS_STATUS_SUCCESS;
1738}
Jeff Johnson295189b2012-06-20 16:38:30 -07001739/*
1740 * FUNCTION: WDA_WniCfgDnld
1741 * Trigger CFG Download
1742 */
1743VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA)
1744{
1745 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001746 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001747 v_VOID_t *pFileImage = NULL;
1748 v_SIZE_t cbFileImageSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001749 v_VOID_t *pCfgBinary = NULL;
1750 v_SIZE_t cbCfgBinarySize = 0;
1751
1752 v_BOOL_t bStatus = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001753 if (NULL == pMac )
1754 {
1755 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1756 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
1757 VOS_ASSERT(0);
1758 return VOS_STATUS_E_FAILURE;
1759 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001760 /* get the number of bytes in the CFG Binary... */
1761 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL,
1762 &cbFileImageSize );
1763 if ( VOS_STATUS_E_NOMEM != vosStatus )
1764 {
1765 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1766 "Error obtaining binary size" );
1767 goto fail;
1768 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001769 // malloc a buffer to read in the Configuration binary file.
1770 pFileImage = vos_mem_malloc( cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001771 if ( NULL == pFileImage )
1772 {
1773 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1774 "Unable to allocate memory for the CFG binary [size= %d bytes]",
1775 cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001776 vosStatus = VOS_STATUS_E_NOMEM;
1777 goto fail;
1778 }
1779
1780 /* Get the entire CFG file image... */
1781 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage,
1782 &cbFileImageSize );
1783 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1784 {
1785 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1786 "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]",
1787 cbFileImageSize );
1788 goto fail;
1789 }
1790
1791 /*
1792 * Validate the binary image. This function will return a pointer
1793 * and length where the CFG binary is located within the binary image file.
1794 */
1795 bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize,
1796 &pCfgBinary, &cbCfgBinarySize );
1797 if ( VOS_FALSE == bStatus )
1798 {
1799 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1800 "Error: Cannot find STA CFG in binary image file" );
1801 vosStatus = VOS_STATUS_E_FAILURE;
1802 goto fail;
1803 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 /*
1805 * TODO: call the config download function
1806 * for now calling the existing cfg download API
1807 */
1808 processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
Jeff Johnson295189b2012-06-20 16:38:30 -07001809 if( pFileImage != NULL )
1810 {
1811 vos_mem_free( pFileImage );
1812 }
1813 return vosStatus;
1814
1815fail:
1816 if(pCfgBinary != NULL)
1817 vos_mem_free( pFileImage );
1818
1819 return vosStatus;
1820}
Jeff Johnson295189b2012-06-20 16:38:30 -07001821/* -----------------------------------------------------------------
1822 * WDI interface
1823 * -----------------------------------------------------------------
1824 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001825/*
1826 * FUNCTION: WDA_suspendDataTxCallback
1827 * call back function called from TL after suspend Transmission
1828 */
1829VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx,
1830 v_U8_t* ucSTAId,
1831 VOS_STATUS vosStatus)
1832{
1833 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001834 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1835 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001836 if (NULL == pWDA )
1837 {
1838 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1839 "%s: Invoked with invalid WDA context ", __FUNCTION__ );
1840 VOS_ASSERT(0);
1841 return VOS_STATUS_E_FAILURE;
1842 }
1843 if(VOS_IS_STATUS_SUCCESS(vosStatus))
1844 {
1845 pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS;
1846 }
1847 else
1848 {
1849 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1850 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001851 /* Trigger the event to bring the WDA TL suspend function to come
1852 * out of wait*/
1853 vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
1854 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1855 {
1856 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1857 "NEW VOS Event Set failed - status = %d \n", vosStatus);
1858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001859 /* If TL suspended had timedout before this callback was called, resume back
1860 * TL.*/
1861 if (pWDA->txSuspendTimedOut)
1862 {
1863 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1864 "Late TLSuspendCallback, resuming TL back again\n");
1865 WDA_ResumeDataTx(pWDA);
1866 pWDA->txSuspendTimedOut = FALSE;
1867 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001868 return VOS_STATUS_SUCCESS;
1869}
Jeff Johnson295189b2012-06-20 16:38:30 -07001870/*
1871 * FUNCTION: WDA_suspendDataTx
1872 * Update TL to suspend the data Transmission
1873 */
1874VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA)
1875{
1876 VOS_STATUS status = VOS_STATUS_E_FAILURE;
1877 tANI_U8 eventIdx = 0;
1878 tANI_U8 ucSTAId = 0;
1879
1880 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1881 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001882 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001883 if (pWDA->txSuspendTimedOut)
1884 {
1885 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1886 "TL suspend timedout previously, CB not called yet\n");
1887 return status;
1888 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001889 /* Reset the event to be not signalled */
1890 status = vos_event_reset(&pWDA->suspendDataTxEvent);
1891 if(!VOS_IS_STATUS_SUCCESS(status))
1892 {
1893 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1894 "VOS Event reset failed - status = %d\n",status);
1895 return VOS_STATUS_E_FAILURE;
1896 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001897 /*Indicate TL to suspend transmission for all Sta Id */
1898 ucSTAId = WLAN_ALL_STA;
1899 status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
1900 WDA_SuspendDataTxCallback);
1901 if(status != VOS_STATUS_SUCCESS)
1902 {
1903 return status;
1904 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 /* Wait for the event to be set by the TL, to get the response of
1906 * suspending the TX queues, this event should be set by the Callback
1907 * function called by TL*/
1908 status = vos_wait_events(&pWDA->suspendDataTxEvent, 1,
1909 WDA_TL_SUSPEND_TIMEOUT, &eventIdx);
1910 if(!VOS_IS_STATUS_SUCCESS(status))
1911 {
1912 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1913 "%s: Status %d when waiting for Suspend Data TX Event",
1914 __FUNCTION__, status);
1915 /* Set this flag to true when TL suspend times out, so that when TL
1916 * suspend eventually happens and calls the callback, TL can be resumed
1917 * right away by looking at this flag when true.*/
1918 pWDA->txSuspendTimedOut = TRUE;
1919 }
1920 else
1921 {
1922 pWDA->txSuspendTimedOut = FALSE;
1923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001924 if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
1925 {
1926 status = VOS_STATUS_SUCCESS;
1927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 return status;
1929}
Jeff Johnson295189b2012-06-20 16:38:30 -07001930/*
1931 * FUNCTION: WDA_resumeDataTx
1932 * Update TL to resume the data Transmission
1933 */
1934VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA)
1935{
1936 VOS_STATUS status = VOS_STATUS_SUCCESS;
1937 tANI_U8 ucSTAId = 0;
1938
1939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1940 "%s: Entered " ,__FUNCTION__);
1941 ucSTAId = WLAN_ALL_STA;
1942 status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
1943 return status;
1944}
Jeff Johnson295189b2012-06-20 16:38:30 -07001945/*
1946 * FUNCTION: WDA_InitScanReqCallback
1947 * Trigger Init SCAN callback
1948 */
1949void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData)
1950{
1951 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
1952 tWDA_CbContext *pWDA;
1953 tInitScanParams *pWDA_ScanParam ;
1954 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001955 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1956 "<------ %s " ,__FUNCTION__);
1957 if(NULL == pWdaParams)
1958 {
1959 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1960 "%s: pWdaParams received NULL", __FUNCTION__);
1961 VOS_ASSERT(0) ;
1962 return ;
1963 }
1964 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
1965 pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07001966 if(NULL == pWDA_ScanParam)
1967 {
1968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1969 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07001970 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07001971 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
1972 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 return ;
1974 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001975 if(WDI_STATUS_SUCCESS != wdiStatus)
1976 {
1977 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001978 if(VOS_STATUS_SUCCESS != status)
1979 {
1980 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1981 "%s error in Resume Tx ", __FUNCTION__ );
1982 }
1983 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001984 /* free WDI command buffer */
1985 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07001986 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07001987
Jeff Johnson295189b2012-06-20 16:38:30 -07001988
1989 /* assign status to scan params */
1990 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001991 /* send SCAN RSP message back to PE */
1992 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07001993 return ;
1994}
1995
1996/*
1997 * FUNCTION: WDA_ProcessInitScanReq
1998 * Trigger Init SCAN in DAL
1999 */
2000VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA,
2001 tInitScanParams *initScanParams)
2002{
2003 WDI_Status status = WDI_STATUS_SUCCESS ;
2004 WDI_InitScanReqParamsType *wdiInitScanParam =
2005 (WDI_InitScanReqParamsType *)vos_mem_malloc(
2006 sizeof(WDI_InitScanReqParamsType)) ;
2007 tWDA_ReqParams *pWdaParams;
2008 tANI_U8 i = 0;
2009
2010 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2011 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002012 if(NULL == wdiInitScanParam)
2013 {
2014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2015 "%s:VOS MEM Alloc Failure", __FUNCTION__);
2016 VOS_ASSERT(0);
2017 return VOS_STATUS_E_NOMEM;
2018 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002019 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2020 if(NULL == pWdaParams)
2021 {
2022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2023 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2024 VOS_ASSERT(0);
2025 vos_mem_free(wdiInitScanParam);
2026 return VOS_STATUS_E_NOMEM;
2027 }
2028
2029 /* Copy init Scan params to WDI structure */
2030 wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ;
2031 vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid,
2032 sizeof(tSirMacAddr)) ;
2033 wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ;
2034 wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ;
2035 wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ;
2036#ifdef WLAN_FEATURE_P2P
2037 wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA;
2038 wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration;
2039#else
2040 wdiInitScanParam->wdiReqInfo.bUseNOA = 0;
2041 wdiInitScanParam->wdiReqInfo.scanDuration = 0;
2042#endif
2043 wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt =
2044 initScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002045 for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
2046 {
2047 wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2048 initScanParams->scanEntry.bssIdx[i] ;
2049 }
2050
2051 /* if Frame length, copy macMgmtHdr or WDI structure */
2052 if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength)
2053 {
2054 vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr,
2055 &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ;
2056 }
2057 wdiInitScanParam->wdiReqStatusCB = NULL ;
2058
Jeff Johnson295189b2012-06-20 16:38:30 -07002059 /* Store Init Req pointer, as this will be used for response */
2060 pWdaParams->pWdaContext = pWDA;
2061 pWdaParams->wdaMsgParam = initScanParams;
2062 pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002063 /* first try to suspend TX */
2064 status = WDA_SuspendDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002065 if(WDI_STATUS_SUCCESS != status)
2066 {
2067 goto handleWdiFailure;
2068 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002069 /* call DAL API to pass init scan request to DAL */
2070 status = WDI_InitScanReq(wdiInitScanParam,
2071 WDA_InitScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002072 if(IS_WDI_STATUS_FAILURE(status))
2073 {
2074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2075 "error in WDA Init Scan, Resume Tx " );
2076 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002077 VOS_ASSERT(0) ;
2078
2079 goto handleWdiFailure;
2080 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002081 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002082handleWdiFailure:
2083 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2084 "Failure in WDI Api, free all the memory " );
2085 /* free WDI command buffer */
2086 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2087 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002088 /* send Failure to PE */
2089 initScanParams->status = eSIR_FAILURE ;
2090 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002091 return CONVERT_WDI2VOS_STATUS(status) ;
2092}
2093
Jeff Johnson295189b2012-06-20 16:38:30 -07002094/*
2095 * FUNCTION: WDA_StartScanReqCallback
2096 * send Start SCAN RSP back to PE
2097 */
2098void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp,
2099 void* pUserData)
2100{
2101 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2102 tWDA_CbContext *pWDA;
2103 tStartScanParams *pWDA_ScanParam;
2104 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2105 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002106 if(NULL == pWdaParams)
2107 {
2108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2109 "%s: pWdaParams received NULL", __FUNCTION__);
2110 VOS_ASSERT(0) ;
2111 return ;
2112 }
2113 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2114 pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002115 if(NULL == pWDA_ScanParam)
2116 {
2117 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2118 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2119 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002120 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002121 return ;
2122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002123 if(NULL == pWdaParams->wdaWdiApiMsgParam)
2124 {
2125 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2126 "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
2127 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002128 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002129 return ;
2130 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002131 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2132 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002133
Jeff Johnson295189b2012-06-20 16:38:30 -07002134
2135 /* assign status to scan params */
2136 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002137 /* send SCAN RSP message back to PE */
2138 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002139 return ;
2140}
2141
Jeff Johnson295189b2012-06-20 16:38:30 -07002142/*
2143 * FUNCTION: WDA_ProcessStartScanReq
2144 * Trigger start SCAN in WDI
2145 */
2146VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA,
2147 tStartScanParams *startScanParams)
2148{
2149 WDI_Status status = WDI_STATUS_SUCCESS;
2150 WDI_StartScanReqParamsType *wdiStartScanParams =
2151 (WDI_StartScanReqParamsType *)vos_mem_malloc(
2152 sizeof(WDI_StartScanReqParamsType)) ;
2153 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002154 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2155 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002156 if(NULL == wdiStartScanParams)
2157 {
2158 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2159 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2160 VOS_ASSERT(0);
2161 return VOS_STATUS_E_NOMEM;
2162 }
2163 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2164 if(NULL == pWdaParams)
2165 {
2166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2167 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2168 VOS_ASSERT(0);
2169 vos_mem_free(wdiStartScanParams);
2170 return VOS_STATUS_E_NOMEM;
2171 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002172 /* Copy init Scan params to WDI structure */
2173 wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
2174 wdiStartScanParams->wdiReqStatusCB = NULL ;
2175
Jeff Johnson295189b2012-06-20 16:38:30 -07002176 /* Store Init Req pointer, as this will be used for response */
2177 /* store Params pass it to WDI */
2178 pWdaParams->pWdaContext = pWDA;
2179 pWdaParams->wdaMsgParam = startScanParams;
2180 pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002181 /* call DAL API to pass init scan request to DAL */
2182 status = WDI_StartScanReq(wdiStartScanParams,
2183 WDA_StartScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 /* failure returned by WDI API */
2185 if(IS_WDI_STATUS_FAILURE(status))
2186 {
2187 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2188 "Failure in Start Scan WDI API, free all the memory "
2189 "It should be due to previous abort scan." );
2190 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2191 vos_mem_free(pWdaParams) ;
2192 startScanParams->status = eSIR_FAILURE ;
2193 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
2194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002195 return CONVERT_WDI2VOS_STATUS(status) ;
2196}
Jeff Johnson295189b2012-06-20 16:38:30 -07002197/*
2198 * FUNCTION: WDA_EndScanReqCallback
2199 * END SCAN callback
2200 */
2201void WDA_EndScanReqCallback(WDI_Status status, void* pUserData)
2202{
2203 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2204 tWDA_CbContext *pWDA;
2205 tEndScanParams *endScanParam;
2206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2207 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002208 if(NULL == pWdaParams)
2209 {
2210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2211 "%s: pWdaParams received NULL", __FUNCTION__);
2212 VOS_ASSERT(0) ;
2213 return ;
2214 }
2215 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2216 endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002217 if(NULL == endScanParam)
2218 {
2219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2220 "%s: endScanParam received NULL", __FUNCTION__);
2221 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002222 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2223 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002224 return ;
2225 }
2226
2227 /* Free WDI command buffer */
2228 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2229 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002230 /* assign status to scan params */
2231 endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002232 /* send response back to PE */
2233 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
2234 return ;
2235}
2236
Jeff Johnson295189b2012-06-20 16:38:30 -07002237/*
2238 * FUNCTION: WDA_ProcessEndScanReq
2239 * Trigger END SCAN in WDI
2240 */
2241VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA,
2242 tEndScanParams *endScanParams)
2243{
2244 WDI_Status status = WDI_STATUS_SUCCESS;
2245 WDI_EndScanReqParamsType *wdiEndScanParams =
2246 (WDI_EndScanReqParamsType *)vos_mem_malloc(
2247 sizeof(WDI_EndScanReqParamsType)) ;
2248 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002249 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2250 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 if(NULL == wdiEndScanParams)
2252 {
2253 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2254 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2255 VOS_ASSERT(0);
2256 return VOS_STATUS_E_NOMEM;
2257 }
2258 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2259 if(NULL == pWdaParams)
2260 {
2261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2262 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2263 VOS_ASSERT(0);
2264 vos_mem_free(wdiEndScanParams);
2265 return VOS_STATUS_E_NOMEM;
2266 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002267 /* Copy init Scan params to WDI structure */
2268 wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
2269 wdiEndScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002270 /* Store Init Req pointer, as this will be used for response */
2271 /* store Params pass it to WDI */
2272 pWdaParams->pWdaContext = pWDA;
2273 pWdaParams->wdaMsgParam = endScanParams;
2274 pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002275 /* call DAL API to pass init scan request to DAL */
2276 status = WDI_EndScanReq(wdiEndScanParams,
2277 WDA_EndScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002278 if(IS_WDI_STATUS_FAILURE(status))
2279 {
2280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2281 "Failure in End Scan WDI API, free all the memory "
2282 "It should be due to previous abort scan." );
2283 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2284 vos_mem_free(pWdaParams) ;
2285 endScanParams->status = eSIR_FAILURE ;
2286 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
2287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002288 return CONVERT_WDI2VOS_STATUS(status) ;
2289}
Jeff Johnson295189b2012-06-20 16:38:30 -07002290/*
2291 * FUNCTION: WDA_FinishScanReqCallback
2292 * Trigger Finish SCAN callback
2293 */
2294void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2295{
2296 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2297 tWDA_CbContext *pWDA;
2298 tFinishScanParams *finishScanParam;
2299 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07002300 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2301 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002302 if(NULL == pWdaParams)
2303 {
2304 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2305 "%s: pWdaParams received NULL", __FUNCTION__);
2306 VOS_ASSERT(0) ;
2307 return ;
2308 }
2309
2310 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2311 finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002312 if(NULL == finishScanParam)
2313 {
2314 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2315 "%s: finishScanParam is NULL", __FUNCTION__);
2316 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002317 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2318 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002319 return ;
2320 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2322 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002323 /*
2324 * Now Resume TX, if we reached here means, TX is already suspended, we
2325 * have to resume it unconditionaly
2326 */
2327 status = WDA_ResumeDataTx(pWDA) ;
2328
2329 if(VOS_STATUS_SUCCESS != status)
2330 {
2331 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2332 "%s error in Resume Tx ", __FUNCTION__ );
2333 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002334 finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002335 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
2336 return ;
2337}
Jeff Johnson295189b2012-06-20 16:38:30 -07002338/*
2339 * FUNCTION: WDA_ProcessFinshScanReq
2340 * Trigger Finish SCAN in WDI
2341 */
2342VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA,
2343 tFinishScanParams *finishScanParams)
2344{
2345 WDI_Status status = WDI_STATUS_SUCCESS;
2346 WDI_FinishScanReqParamsType *wdiFinishScanParams =
2347 (WDI_FinishScanReqParamsType *)vos_mem_malloc(
2348 sizeof(WDI_FinishScanReqParamsType)) ;
2349 tWDA_ReqParams *pWdaParams ;
2350 tANI_U8 i = 0;
2351 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2352 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002353 if(NULL == wdiFinishScanParams)
2354 {
2355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2356 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2357 VOS_ASSERT(0);
2358 return VOS_STATUS_E_NOMEM;
2359 }
2360 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2361 if(NULL == pWdaParams)
2362 {
2363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2364 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2365 VOS_ASSERT(0);
2366 vos_mem_free(wdiFinishScanParams);
2367 return VOS_STATUS_E_NOMEM;
2368 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002369 /* Copy init Scan params to WDI structure */
2370 wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
2371 vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID,
2372 finishScanParams->bssid, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
2374 wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
2375 wdiFinishScanParams->wdiReqInfo.ucFrameLength =
2376 finishScanParams->frameLength ;
2377 wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel =
2378 finishScanParams->currentOperChannel ;
2379 wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
2380 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt =
2381 finishScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002382 for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
2383 {
2384 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2385 finishScanParams->scanEntry.bssIdx[i] ;
2386 }
2387
2388
Jeff Johnson295189b2012-06-20 16:38:30 -07002389 /* if Frame length, copy macMgmtHdr ro WDI structure */
2390 if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
2391 {
2392 vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr,
2393 &finishScanParams->macMgmtHdr,
2394 sizeof(WDI_MacMgmtHdr)) ;
2395 }
2396 wdiFinishScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002397 /* Store Init Req pointer, as this will be used for response */
2398 /* store Params pass it to WDI */
2399 pWdaParams->pWdaContext = pWDA;
2400 pWdaParams->wdaMsgParam = finishScanParams;
2401 pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002402 /* call DAL API to pass init scan request to DAL */
2403 status = WDI_FinishScanReq(wdiFinishScanParams,
2404 WDA_FinishScanReqCallback, pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002405
Jeff Johnson295189b2012-06-20 16:38:30 -07002406
2407 /*
2408 * WDI API returns failure..
2409 */
2410 if(IS_WDI_STATUS_FAILURE( status))
2411 {
2412 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2413 "Failure in Finish Scan WDI API, free all the memory " );
2414 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2415 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002416 finishScanParams->status = eSIR_FAILURE ;
2417 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
2418 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002419 return CONVERT_WDI2VOS_STATUS(status) ;
2420}
Jeff Johnson295189b2012-06-20 16:38:30 -07002421/*---------------------------------------------------------------------
2422 * ASSOC API's
2423 *---------------------------------------------------------------------
2424 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002425/*
2426 * FUNCTION: WDA_JoinReqCallback
2427 * Trigger Init SCAN callback
2428 */
2429void WDA_JoinReqCallback(WDI_Status status, void* pUserData)
2430{
2431 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2432 tWDA_CbContext *pWDA;
2433 tSwitchChannelParams *joinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2435 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002436 if(NULL == pWdaParams)
2437 {
2438 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2439 "%s: pWdaParams received NULL", __FUNCTION__);
2440 VOS_ASSERT(0) ;
2441 return ;
2442 }
2443 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2444 joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002445 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2446 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002447 /* reset macBSSID */
2448 vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002449 /* reset macSTASelf */
2450 vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002451 joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002452 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002453 return ;
2454}
Jeff Johnson295189b2012-06-20 16:38:30 -07002455/*
2456 * FUNCTION: WDA_ProcessJoinReq
2457 * Trigger Join REQ in WDI
2458 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002459VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA,
2460 tSwitchChannelParams* joinReqParam)
2461{
2462 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 WDI_JoinReqParamsType *wdiJoinReqParam =
2464 (WDI_JoinReqParamsType *)vos_mem_malloc(
2465 sizeof(WDI_JoinReqParamsType)) ;
2466 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002467 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2468 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002469 if(NULL == wdiJoinReqParam)
2470 {
2471 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2472 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2473 VOS_ASSERT(0);
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002474 vos_mem_free(joinReqParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 return VOS_STATUS_E_NOMEM;
2476 }
2477 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2478 if(NULL == pWdaParams)
2479 {
2480 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2481 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2482 VOS_ASSERT(0);
2483 vos_mem_free(wdiJoinReqParam);
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002484 vos_mem_free(joinReqParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07002485 return VOS_STATUS_E_NOMEM;
2486 }
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002487
2488 /*if the BSSID or self STA in pWDA is NULL, join request can't be processed*/
2489 if(WDA_IS_NULL_MAC_ADDRESS(pWDA->macBSSID) ||
2490 WDA_IS_NULL_MAC_ADDRESS(pWDA->macSTASelf))
2491 {
2492 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
2493 "%s: received join request when BSSID or self-STA is NULL "
2494 " BSSID:" WDA_MAC_ADDRESS_STR "Self-STA:" WDA_MAC_ADDRESS_STR,
2495 __FUNCTION__, WDA_MAC_ADDR_ARRAY(pWDA->macBSSID),
2496 WDA_MAC_ADDR_ARRAY(pWDA->macSTASelf));
2497 VOS_ASSERT(0);
2498 vos_mem_free(wdiJoinReqParam);
2499 vos_mem_free(pWdaParams);
2500 joinReqParam->status = eSIR_FAILURE ;
2501 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2502 return VOS_STATUS_E_INVAL;
2503 }
2504
Jeff Johnson295189b2012-06-20 16:38:30 -07002505 /* copy the BSSID for pWDA */
2506 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID,
2507 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002508 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf,
2509 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002510 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel =
2511 joinReqParam->channelNumber ;
2512#ifndef WLAN_FEATURE_VOWIFI
2513 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint =
2514 joinReqParam->localPowerConstraint ;
2515#endif
2516 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset =
2517 joinReqParam->secondaryChannelOffset ;
2518 wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
2519
2520 wdiJoinReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002521 /* Store Init Req pointer, as this will be used for response */
2522 /* store Params pass it to WDI */
2523 pWdaParams->pWdaContext = pWDA;
2524 pWdaParams->wdaMsgParam = joinReqParam;
2525 pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002526 status = WDI_JoinReq(wdiJoinReqParam,
2527 (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002528 if(IS_WDI_STATUS_FAILURE(status))
2529 {
2530 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2531 "Failure in Join WDI API, free all the memory " );
2532 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2533 vos_mem_free(pWdaParams) ;
2534 joinReqParam->status = eSIR_FAILURE ;
2535 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2536 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002537 return CONVERT_WDI2VOS_STATUS(status) ;
2538}
Jeff Johnson295189b2012-06-20 16:38:30 -07002539/*
2540 * FUNCTION: WDA_SwitchChannelReqCallback
2541 * send Switch channel RSP back to PE
2542 */
2543void WDA_SwitchChannelReqCallback(
2544 WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData)
2545{
2546 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
2547 tWDA_CbContext *pWDA;
2548 tSwitchChannelParams *pSwitchChanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2550 "<------ %s " ,__FUNCTION__);
2551 if(NULL == pWdaParams)
2552 {
2553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2554 "%s: pWdaParams received NULL", __FUNCTION__);
2555 VOS_ASSERT(0) ;
2556 return ;
2557 }
2558 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2559 pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2560
2561#ifdef WLAN_FEATURE_VOWIFI
2562 pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower;
2563#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002564 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2565 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002566 pSwitchChanParams->status =
2567 CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002568 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002569 return ;
2570}
Jeff Johnson295189b2012-06-20 16:38:30 -07002571/*
2572 * FUNCTION: WDA_ProcessChannelSwitchReq
2573 * Request to WDI to switch channel REQ params.
2574 */
2575VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA,
2576 tSwitchChannelParams *pSwitchChanParams)
2577{
2578 WDI_Status status = WDI_STATUS_SUCCESS ;
2579 WDI_SwitchChReqParamsType *wdiSwitchChanParam =
2580 (WDI_SwitchChReqParamsType *)vos_mem_malloc(
2581 sizeof(WDI_SwitchChReqParamsType)) ;
2582 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002583 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2584 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002585 if(NULL == wdiSwitchChanParam)
2586 {
2587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2588 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2589 VOS_ASSERT(0);
2590 return VOS_STATUS_E_NOMEM;
2591 }
2592 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2593 if(NULL == pWdaParams)
2594 {
2595 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2596 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2597 VOS_ASSERT(0);
2598 vos_mem_free(wdiSwitchChanParam);
2599 return VOS_STATUS_E_NOMEM;
2600 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002601 wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
2602#ifndef WLAN_FEATURE_VOWIFI
2603 wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint =
2604 pSwitchChanParams->localPowerConstraint;
2605#endif
2606 wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset =
2607 pSwitchChanParams->secondaryChannelOffset;
2608 wdiSwitchChanParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002609 /* Store req pointer, as this will be used for response */
2610 /* store Params pass it to WDI */
2611 pWdaParams->pWdaContext = pWDA;
2612 pWdaParams->wdaMsgParam = pSwitchChanParams;
2613 pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002614#ifdef WLAN_FEATURE_VOWIFI
2615 wdiSwitchChanParam->wdiChInfo.cMaxTxPower
2616 = pSwitchChanParams->maxTxPower;
2617 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr,
2618 pSwitchChanParams ->selfStaMacAddr,
2619 sizeof(tSirMacAddr));
2620#endif
2621 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId,
2622 pSwitchChanParams->bssId,
2623 sizeof(tSirMacAddr));
2624
2625 status = WDI_SwitchChReq(wdiSwitchChanParam,
2626 (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002627 if(IS_WDI_STATUS_FAILURE(status))
2628 {
2629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2630 "Failure in process channel switch Req WDI API, free all the memory " );
2631 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2632 vos_mem_free(pWdaParams) ;
2633 pSwitchChanParams->status = eSIR_FAILURE ;
2634 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
2635 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002636 return CONVERT_WDI2VOS_STATUS(status) ;
2637}
Jeff Johnson295189b2012-06-20 16:38:30 -07002638/*
2639 * FUNCTION: WDA_ConfigBssReqCallback
2640 * config BSS Req Callback, called by WDI
2641 */
2642void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp
2643 ,void* pUserData)
2644{
2645 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2646 tWDA_CbContext *pWDA;
2647 tAddBssParams *configBssReqParam;
2648 tAddStaParams *staConfigBssParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002649 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2650 "<------ %s " ,__FUNCTION__);
2651 if(NULL == pWdaParams)
2652 {
2653 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2654 "%s: pWdaParams received NULL", __FUNCTION__);
2655 VOS_ASSERT(0) ;
2656 return ;
2657 }
2658 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2659 configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
2660 staConfigBssParam = &configBssReqParam->staContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002661 configBssReqParam->status =
2662 CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07002663 if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
2664 {
2665 vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID,
2666 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002667 configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2668 configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
2669 configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
2670
2671 if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA)
2672 {
2673 if(configBssReqParam->bssType == eSIR_IBSS_MODE)
2674 {
2675 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE;
2676 staConfigBssParam->staType = STA_ENTRY_BSSID;
2677 }
2678 else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) &&
2679 (staConfigBssParam->staType == STA_ENTRY_SELF))
2680 {
2681 /* This is the 1st add BSS Req for the BTAMP STA */
2682 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2683 staConfigBssParam->staType = STA_ENTRY_BSSID;
2684 }
2685 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2686 (staConfigBssParam->staType == STA_ENTRY_PEER))
2687 {
2688 /* This is the 2nd ADD BSS Request that is sent
2689 * on the BTAMP STA side. The Sta type is
2690 * set to STA_ENTRY_PEER here.*/
2691 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2692 }
2693 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2694 (staConfigBssParam->staType == STA_ENTRY_SELF))
2695 {
2696 /* statype is already set by PE.
2697 * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/
2698 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE;
2699 staConfigBssParam->staType = STA_ENTRY_BSSID;
2700 }
2701 else
2702 {
2703 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE;
2704 staConfigBssParam->staType = STA_ENTRY_PEER;
2705 }
2706 }
2707 else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP)
2708 {
2709 pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE;
2710 staConfigBssParam->staType = STA_ENTRY_SELF;
2711 }
2712 else
2713 {
2714 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2715 "Invalid operation mode specified");
2716 VOS_ASSERT(0);
2717 }
2718
2719 staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002720 staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002721 staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002722 staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002723 vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
2724 sizeof(tSirMacAddr));
2725 staConfigBssParam->txChannelWidthSet =
2726 configBssReqParam->txChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -07002727 if(staConfigBssParam->staType == STA_ENTRY_PEER &&
2728 staConfigBssParam->htCapable)
2729 {
2730 pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx =
2731 wdiConfigBssRsp->ucBSSIdx;
2732 pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex =
2733 WDA_VALID_STA_INDEX ;
2734 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002735 if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
2736 wdiConfigBssRsp->ucBSSIdx,
2737 wdiConfigBssRsp->ucSTAIdx))
2738 {
2739 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2740 "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
2741 VOS_ASSERT(0) ;
2742 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002743 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
2744 {
2745 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2746 "%s: add BSS into mempool fail", __FUNCTION__);
2747 VOS_ASSERT(0) ;
2748 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002749#ifdef WLAN_FEATURE_VOWIFI
2750 configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
2751#endif
2752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002753 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2754 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002755 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002756 return ;
2757}
Jeff Johnson295189b2012-06-20 16:38:30 -07002758/*
2759 * FUNCTION: WDA_UpdateEdcaParamsForAC
2760 * Update WDI EDCA params with PE edca params
2761 */
2762void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA,
2763 WDI_EdcaParamRecord *wdiEdcaParam,
2764 tSirMacEdcaParamRecord *macEdcaParam)
2765{
2766 wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn;
2767 wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm;
2768 wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci;
2769 wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min;
2770 wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
2771 wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
2772}
Jeff Johnson295189b2012-06-20 16:38:30 -07002773/*
2774 * FUNCTION: WDA_ProcessConfigBssReq
2775 * Configure BSS before starting Assoc with AP
2776 */
2777VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA,
2778 tAddBssParams* configBssReqParam)
2779{
2780 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002781 WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
2782 (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
2783 sizeof(WDI_ConfigBSSReqParamsType)) ;
2784 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002785 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2786 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002787 if(NULL == wdiConfigBssReqParam)
2788 {
2789 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2790 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2791 VOS_ASSERT(0);
2792 return VOS_STATUS_E_NOMEM;
2793 }
2794 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2795 if(NULL == pWdaParams)
2796 {
2797 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2798 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2799 VOS_ASSERT(0);
2800 vos_mem_free(wdiConfigBssReqParam);
2801 return VOS_STATUS_E_NOMEM;
2802 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002803 vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002804 WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo,
2805 configBssReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002806 /* Store Init Req pointer, as this will be used for response */
2807 /* store Params pass it to WDI */
2808 pWdaParams->pWdaContext = pWDA;
2809 pWdaParams->wdaMsgParam = configBssReqParam;
2810 pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002811 status = WDI_ConfigBSSReq(wdiConfigBssReqParam,
2812 (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002813 if(IS_WDI_STATUS_FAILURE(status))
2814 {
2815 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2816 "Failure in Config BSS WDI API, free all the memory " );
2817 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2818 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002819 configBssReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
2821 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002822 return CONVERT_WDI2VOS_STATUS(status) ;
2823}
Jeff Johnson295189b2012-06-20 16:38:30 -07002824#ifdef ENABLE_HAL_COMBINED_MESSAGES
2825/*
2826 * FUNCTION: WDA_PostAssocReqCallback
2827 * Post ASSOC req callback, send RSP back to PE
2828 */
2829void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp,
2830 void* pUserData)
2831{
2832 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
2833 tPostAssocParams *postAssocReqParam =
2834 (tPostAssocParams *)pWDA->wdaMsgParam ;
2835 /*STA context within the BSS Params*/
2836 tAddStaParams *staPostAssocParam =
2837 &postAssocReqParam->addBssParams.staContext ;
2838 /*STA Params for self STA*/
2839 tAddStaParams *selfStaPostAssocParam =
2840 &postAssocReqParam->addStaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002841 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2842 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002843 postAssocReqParam->status =
2844 CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002845 if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
2846 {
2847 staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
2848 vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA,
2849 sizeof(tSirMacAddr)) ;
2850 staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
2851 staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
2852 staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002853 selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
2854 }
2855 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2856 pWDA->wdaWdiApiMsgParam = NULL;
2857 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002858 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002859 return ;
2860}
Jeff Johnson295189b2012-06-20 16:38:30 -07002861/*
2862 * FUNCTION: WDA_ProcessPostAssocReq
2863 * Trigger POST ASSOC processing in WDI
2864 */
2865VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA,
2866 tPostAssocParams *postAssocReqParam)
2867{
Jeff Johnson295189b2012-06-20 16:38:30 -07002868 WDI_Status status = WDI_STATUS_SUCCESS ;
2869
2870 WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
2871 (WDI_PostAssocReqParamsType *)vos_mem_malloc(
2872 sizeof(WDI_PostAssocReqParamsType)) ;
2873 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2874 "------> %s " ,__FUNCTION__);
2875
Jeff Johnson295189b2012-06-20 16:38:30 -07002876 if(NULL == wdiPostAssocReqParam)
2877 {
2878 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2879 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2880 VOS_ASSERT(0);
2881 return VOS_STATUS_E_NOMEM;
2882 }
2883
2884 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
2885 {
2886 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2887 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
2888 VOS_ASSERT(0);
2889 return VOS_STATUS_E_FAILURE;
2890 }
2891
Jeff Johnson295189b2012-06-20 16:38:30 -07002892 /* update BSS params into WDI structure */
2893 WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams,
2894 &postAssocReqParam->addBssParams) ;
2895 /* update STA params into WDI structure */
2896 WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams,
2897 &postAssocReqParam->addStaParams) ;
2898
2899 wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid =
2900 postAssocReqParam->addBssParams.highPerformance;
2901 WDA_UpdateEdcaParamsForAC(pWDA,
2902 &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams,
2903 &postAssocReqParam->addBssParams.acbe);
2904 WDA_UpdateEdcaParamsForAC(pWDA,
2905 &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams,
2906 &postAssocReqParam->addBssParams.acbk);
2907 WDA_UpdateEdcaParamsForAC(pWDA,
2908 &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams,
2909 &postAssocReqParam->addBssParams.acvi);
2910 WDA_UpdateEdcaParamsForAC(pWDA,
2911 &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
2912 &postAssocReqParam->addBssParams.acvo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002913 /* Store Init Req pointer, as this will be used for response */
2914 pWDA->wdaMsgParam = (void *)postAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002915 /* store Params pass it to WDI */
2916 pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002917 status = WDI_PostAssocReq(wdiPostAssocReqParam,
2918 (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002919 if(IS_WDI_STATUS_FAILURE(status))
2920 {
2921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2922 "Failure in Post Assoc WDI API, free all the memory " );
2923 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2924 pWDA->wdaWdiApiMsgParam = NULL;
2925 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002926 postAssocReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002927 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
2928 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002929 return CONVERT_WDI2VOS_STATUS(status) ;
2930}
2931#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002932/*
2933 * FUNCTION: WDA_AddStaReqCallback
2934 * ADD STA req callback, send RSP back to PE
2935 */
2936void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp,
2937 void* pUserData)
2938{
2939 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2940 tWDA_CbContext *pWDA;
2941 tAddStaParams *addStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002942 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2943 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002944 if(NULL == pWdaParams)
2945 {
2946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
2947 VOS_ASSERT(0) ;
2948 return ;
2949 }
2950 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2951 addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002952 addStaReqParam->status =
2953 CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002954 if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
2955 {
2956 addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
2957 /*TODO: UMAC structure doesn't have these fields*/
2958 /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex;
2959 addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex;
2960 addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */
2961 addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig;
2962 addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig;
2963 /* update staIndex as valid index for BA if STA is HT capable*/
2964 if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable)
2965 {
2966 pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx =
2967 wdiConfigStaRsp->ucBssIdx;
2968 pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex =
2969 WDA_VALID_STA_INDEX ;
2970 }
2971 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx))
2972 {
2973 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2974 "%s: add STA into mempool fail", __FUNCTION__);
2975 VOS_ASSERT(0) ;
2976 return ;
2977 }
2978 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002979 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2980 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002981 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002982 return ;
2983}
Jeff Johnson295189b2012-06-20 16:38:30 -07002984/*
2985 * FUNCTION: WDA_ConfigStaReq
2986 * Trigger Config STA processing in WDI
2987 */
2988VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA,
2989 tAddStaParams *addStaReqParam)
2990{
Jeff Johnson295189b2012-06-20 16:38:30 -07002991 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002992 WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
2993 (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
2994 sizeof(WDI_ConfigSTAReqParamsType)) ;
2995 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002996 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2997 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002998 if(NULL == wdiConfigStaReqParam)
2999 {
3000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3001 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3002 VOS_ASSERT(0);
3003 return VOS_STATUS_E_NOMEM;
3004 }
3005 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3006 if(NULL == pWdaParams)
3007 {
3008 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3009 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3010 VOS_ASSERT(0);
3011 vos_mem_free(wdiConfigStaReqParam);
3012 return VOS_STATUS_E_NOMEM;
3013 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003014 vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003015 /* update STA params into WDI structure */
3016 WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo,
3017 addStaReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003018 /* Store Init Req pointer, as this will be used for response */
3019 /* store Params pass it to WDI */
3020 pWdaParams->pWdaContext = pWDA;
3021 pWdaParams->wdaMsgParam = addStaReqParam;
3022 pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003023 status = WDI_ConfigSTAReq(wdiConfigStaReqParam,
3024 (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003025 if(IS_WDI_STATUS_FAILURE(status))
3026 {
3027 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3028 "Failure in Config STA WDI API, free all the memory " );
3029 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3030 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003031 addStaReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003032 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3033 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003034 return CONVERT_WDI2VOS_STATUS(status) ;
3035}
Jeff Johnson295189b2012-06-20 16:38:30 -07003036/*
3037 * FUNCTION: WDA_DelBSSReqCallback
3038 * Dens DEL BSS RSP back to PE
3039 */
3040void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp,
3041 void* pUserData)
3042{
3043 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3044 tWDA_CbContext *pWDA;
3045 tDeleteBssParams *delBssReqParam;
3046 tANI_U8 staIdx,tid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003047 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3048 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003049 if(NULL == pWdaParams)
3050 {
3051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3052 "%s: pWdaParams received NULL", __FUNCTION__);
3053 VOS_ASSERT(0) ;
3054 return ;
3055 }
3056 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3057 delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003058 delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003059 if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
3060 {
3061 vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID,
3062 sizeof(tSirMacAddr)) ;
3063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003064 if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
3065 {
3066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3067 "%s: Get STA index from BSS index Fail", __FUNCTION__);
3068 VOS_ASSERT(0) ;
3069 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003070 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
3071 {
3072 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3073 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3074 VOS_ASSERT(0) ;
3075 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003076 if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
3077 {
3078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3079 "%s: Clear STA index form table Fail", __FUNCTION__);
3080 VOS_ASSERT(0) ;
3081 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003082 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3083 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003084 /* reset the the system role*/
3085 pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
3086
3087 /* Reset the BA related information */
3088 for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++)
3089 {
3090 if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx )
3091 {
3092 pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX;
3093 pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0;
3094 /* Reset framesTxed counters here */
3095 for(tid = 0; tid < STACFG_MAX_TC; tid++)
3096 {
3097 pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0;
3098 }
3099 }
3100 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003101 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003102 return ;
3103}
3104
Jeff Johnson295189b2012-06-20 16:38:30 -07003105/*
3106 * FUNCTION: WDA_ProcessDelBssReq
3107 * Init DEL BSS req with WDI
3108 */
3109VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA,
3110 tDeleteBssParams *delBssParam)
3111{
3112 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003113 WDI_DelBSSReqParamsType *wdiDelBssReqParam =
3114 (WDI_DelBSSReqParamsType *)vos_mem_malloc(
3115 sizeof(WDI_DelBSSReqParamsType)) ;
3116 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003117 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3118 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003119 if(NULL == wdiDelBssReqParam)
3120 {
3121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3122 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3123 VOS_ASSERT(0);
3124 return VOS_STATUS_E_NOMEM;
3125 }
3126 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3127 if(NULL == pWdaParams)
3128 {
3129 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3130 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3131 VOS_ASSERT(0);
3132 vos_mem_free(wdiDelBssReqParam);
3133 return VOS_STATUS_E_NOMEM;
3134 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003135 wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
3136 wdiDelBssReqParam->wdiReqStatusCB = NULL ;
3137
3138 /* Store Init Req pointer, as this will be used for response */
3139 /* store Params pass it to WDI */
3140 pWdaParams->pWdaContext = pWDA;
3141 pWdaParams->wdaMsgParam = delBssParam;
3142 pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003143 status = WDI_DelBSSReq(wdiDelBssReqParam,
3144 (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003145 if(IS_WDI_STATUS_FAILURE(status))
3146 {
3147 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3148 "Failure in Del BSS WDI API, free all the memory " );
3149 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3150 vos_mem_free(pWdaParams) ;
3151 delBssParam->status = eSIR_FAILURE ;
3152 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
3153 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003154 return CONVERT_WDI2VOS_STATUS(status) ;
3155}
Jeff Johnson295189b2012-06-20 16:38:30 -07003156/*
3157 * FUNCTION: WDA_DelSTAReqCallback
3158 * Dens DEL STA RSP back to PE
3159 */
3160void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp,
3161 void* pUserData)
3162{
3163 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3164 tWDA_CbContext *pWDA;
3165 tDeleteStaParams *delStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3167 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003168 if(NULL == pWdaParams)
3169 {
3170 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3171 "%s: pWdaParams received NULL", __FUNCTION__);
3172 VOS_ASSERT(0) ;
3173 return ;
3174 }
3175 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3176 delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003177 delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003178 if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
3179 {
3180 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
3181 {
3182 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3183 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3184 VOS_ASSERT(0) ;
3185 }
3186 delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ;
3187 }
3188 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3189 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003190 /*Reset the BA information corresponding to this STAIdx */
3191 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex =
3192 WDA_INVALID_STA_INDEX;
3193 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
3194
3195 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003196 return ;
3197}
Jeff Johnson295189b2012-06-20 16:38:30 -07003198/*
3199 * FUNCTION: WDA_ProcessDelStaReq
3200 * Init DEL STA req with WDI
3201 */
3202VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA,
3203 tDeleteStaParams *delStaParam)
3204{
3205 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003206 WDI_DelSTAReqParamsType *wdiDelStaReqParam =
3207 (WDI_DelSTAReqParamsType *)vos_mem_malloc(
3208 sizeof(WDI_DelSTAReqParamsType)) ;
3209 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003210 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3211 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003212 if(NULL == wdiDelStaReqParam)
3213 {
3214 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3215 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3216 VOS_ASSERT(0);
3217 return VOS_STATUS_E_NOMEM;
3218 }
3219 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3220 if(NULL == pWdaParams)
3221 {
3222 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3223 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3224 VOS_ASSERT(0);
3225 vos_mem_free(wdiDelStaReqParam);
3226 return VOS_STATUS_E_NOMEM;
3227 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003228 wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
3229 wdiDelStaReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003230 /* Store Init Req pointer, as this will be used for response */
3231 /* store Params pass it to WDI */
3232 pWdaParams->pWdaContext = pWDA;
3233 pWdaParams->wdaMsgParam = delStaParam;
3234 pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003235 status = WDI_DelSTAReq(wdiDelStaReqParam,
3236 (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003237 if(IS_WDI_STATUS_FAILURE(status))
3238 {
3239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3240 "Failure in Del STA WDI API, free all the memory status = %d",
3241 status );
3242 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3243 vos_mem_free(pWdaParams) ;
3244 delStaParam->status = eSIR_FAILURE ;
3245 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
3246 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003247 return CONVERT_WDI2VOS_STATUS(status) ;
3248}
Jeff Johnson295189b2012-06-20 16:38:30 -07003249void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
3250{
3251 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3252 tWDA_CbContext *pWDA;
3253 tAddStaSelfParams *pAddStaSelfRsp = NULL;
3254 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3255 "<------ %s " ,__FUNCTION__);
3256 if(NULL == pWdaParams)
3257 {
3258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3259 "%s: pWdaParams received NULL", __FUNCTION__);
3260 VOS_ASSERT(0) ;
3261 return ;
3262 }
3263 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3264 pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3266 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003267 pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
3268 vos_mem_copy(pAddStaSelfRsp->selfMacAddr,
3269 pwdiAddSTASelfRsp->macSelfSta,
3270 sizeof(pAddStaSelfRsp->selfMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003271 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003272 return ;
3273}
Jeff Johnson295189b2012-06-20 16:38:30 -07003274/*
3275 * FUNCTION: WDA_ProcessAddStaSelfReq
3276 *
3277 */
3278VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq)
3279{
3280 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003281 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003282 WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq =
3283 (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
3284 sizeof(WDI_AddSTASelfReqParamsType)) ;
3285 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3287 "------> %s " ,__FUNCTION__);
3288 if( NULL == wdiAddStaSelfReq )
3289 {
3290 VOS_ASSERT( 0 );
3291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3292 "%s: Unable to allocate memory " ,__FUNCTION__);
3293 return( VOS_STATUS_E_NOMEM );
3294 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003295 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003296 if( NULL == pWdaParams )
3297 {
3298 VOS_ASSERT( 0 );
3299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3300 "%s: Unable to allocate memory " ,__FUNCTION__);
3301 vos_mem_free(wdiAddStaSelfReq) ;
3302 return( VOS_STATUS_E_NOMEM );
3303 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003304 wdiAddStaSelfReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003305 vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
3306 /* Store Init Req pointer, as this will be used for response */
3307 /* store Params pass it to WDI */
3308 pWdaParams->pWdaContext = pWDA;
3309 pWdaParams->wdaMsgParam = pAddStaSelfReq;
3310 pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq;
Jeff Johnson43971f52012-07-17 12:26:56 -07003311 wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003312
Jeff Johnson43971f52012-07-17 12:26:56 -07003313 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003314 {
3315 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3316 "Failure in Add Self Sta Request API, free all the memory status = %d",
Jeff Johnson43971f52012-07-17 12:26:56 -07003317 wstatus );
3318 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003319 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3320 vos_mem_free(pWdaParams) ;
3321 pAddStaSelfReq->status = eSIR_FAILURE ;
3322 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
3323 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003324 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003325}
Jeff Johnson295189b2012-06-20 16:38:30 -07003326/*
3327 * FUNCTION: WDA_DelSTASelfRespCallback
3328 *
3329 */
3330void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType *
3331 wdiDelStaSelfRspParams , void* pUserData)
3332{
3333 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3334 tWDA_CbContext *pWDA;
3335 tDelStaSelfParams *delStaSelfParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003336 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3337 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003338 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 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003345 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3346 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003347 delStaSelfParams->status =
3348 CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
3349
3350 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3351 vos_mem_free(pWdaParams) ;
3352
3353 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003354 return ;
3355}
Jeff Johnson295189b2012-06-20 16:38:30 -07003356/*
3357 * FUNCTION: WDA_DelSTASelfReqCallback
3358 *
3359 */
3360void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus,
3361 void* pUserData)
3362{
3363 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3364 tWDA_CbContext *pWDA;
3365 tDelStaSelfParams *delStaSelfParams;
3366
3367 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3368 "<------ %s, wdiStatus: %d pWdaParams: 0x%x",
3369 __FUNCTION__, wdiStatus, pWdaParams);
3370
3371 if (NULL == pWdaParams)
3372 {
3373 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3374 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3375 VOS_ASSERT(0);
3376 return;
3377 }
3378
3379 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3380 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3381
3382 delStaSelfParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
3383
3384 if(IS_WDI_STATUS_FAILURE(wdiStatus))
3385 {
3386 VOS_ASSERT(0);
3387 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3388 vos_mem_free(pWdaParams) ;
3389 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3390 }
3391
3392 return ;
3393}
3394
3395/*
3396 * FUNCTION: WDA_DelSTASelfReq
3397 * Trigger Config STA processing in WDI
3398 */
3399VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA,
3400 tDelStaSelfParams* pDelStaSelfReqParam)
3401{
3402 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003403 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003404 tWDA_ReqParams *pWdaParams = NULL;
3405 WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq =
3406 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
3407 sizeof(WDI_DelSTASelfReqParamsType)) ;
3408
Jeff Johnson295189b2012-06-20 16:38:30 -07003409 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3410 "------> %s " ,__FUNCTION__);
3411 if( NULL == wdiDelStaSelfReq )
3412 {
3413 VOS_ASSERT( 0 );
3414 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3415 "%s: Unable to allocate memory " ,__FUNCTION__);
3416 return( VOS_STATUS_E_NOMEM );
3417 }
3418
3419 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3420 if( NULL == pWdaParams )
3421 {
3422 VOS_ASSERT( 0 );
3423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3424 "%s: Unable to allocate memory " ,__FUNCTION__);
3425 vos_mem_free(wdiDelStaSelfReq) ;
3426 return( VOS_STATUS_E_NOMEM );
3427 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003428 pWdaParams->pWdaContext = pWDA;
3429 /* Store param pointer as passed in by caller */
3430 pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
3431 /* store Params pass it to WDI */
3432 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr,
3434 pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
3435
3436 wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback;
3437 wdiDelStaSelfReq->pUserData = pWdaParams;
3438
Jeff Johnson43971f52012-07-17 12:26:56 -07003439 wstatus = WDI_DelSTASelfReq(wdiDelStaSelfReq,
Jeff Johnson295189b2012-06-20 16:38:30 -07003440 (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams);
3441
Jeff Johnson43971f52012-07-17 12:26:56 -07003442 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003443 {
3444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
3445 "Failure in Del Sta Self REQ WDI API, free all the memory " );
3446 VOS_ASSERT(0);
Jeff Johnson43971f52012-07-17 12:26:56 -07003447 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003448 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3449 vos_mem_free(pWdaParams) ;
3450 pDelStaSelfReqParam->status = eSIR_FAILURE ;
3451 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
3452 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003453 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003454}
3455
Jeff Johnson295189b2012-06-20 16:38:30 -07003456/*
3457 * FUNCTION: WDA_SendMsg
3458 * Send Message back to PE
3459 */
3460void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
3461 void *pBodyptr, tANI_U32 bodyVal)
3462{
3463 tSirMsgQ msg = {0} ;
3464 tANI_U32 status = VOS_STATUS_SUCCESS ;
3465 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003466 msg.type = msgType;
3467 msg.bodyval = bodyVal;
3468 msg.bodyptr = pBodyptr;
Jeff Johnson295189b2012-06-20 16:38:30 -07003469 status = limPostMsgApi(pMac, &msg);
Jeff Johnson295189b2012-06-20 16:38:30 -07003470 if (VOS_STATUS_SUCCESS != status)
3471 {
3472 if(NULL != pBodyptr)
3473 {
3474 vos_mem_free(pBodyptr);
3475 }
3476 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3477 "%s: limPostMsgApi is failed " ,__FUNCTION__);
3478 VOS_ASSERT(0) ;
3479 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003480 return ;
3481}
Jeff Johnson295189b2012-06-20 16:38:30 -07003482/*
3483 * FUNCTION: WDA_UpdateBSSParams
3484 * Translated WDA/PE BSS info into WDI BSS info..
3485 */
3486void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
3487 WDI_ConfigBSSReqInfoType *wdiBssParams,
3488 tAddBssParams *wdaBssParams)
3489{
3490 v_U8_t keyIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003491 /* copy bssReq Params to WDI structure */
3492 vos_mem_copy(wdiBssParams->macBSSID,
3493 wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
3494 vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr,
3495 sizeof(tSirMacAddr)) ;
3496 wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
3497 wdiBssParams->ucOperMode = wdaBssParams->operMode ;
3498 wdiBssParams->wdiNWType = wdaBssParams->nwType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003499 wdiBssParams->ucShortSlotTimeSupported =
3500 wdaBssParams->shortSlotTimeSupported ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003501 wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ;
3502 wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ;
3503 wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ;
3504 wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ;
3505 wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ;
3506
3507 wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
3508 wdiBssParams->ucTXOPProtectionFullSupport =
3509 wdaBssParams->fLsigTXOPProtectionFullSupport ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
3511 wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003512 wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003513 wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
3514 wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
3515 wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
3516 wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
3517
3518 /* copy SSID into WDI structure */
3519 wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
3520 vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
3521 wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003522 WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext,
3523 &wdaBssParams->staContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003524 wdiBssParams->wdiAction = wdaBssParams->updateBss;
Jeff Johnson295189b2012-06-20 16:38:30 -07003525#ifdef WLAN_FEATURE_VOWIFI
3526 wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
3527#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003528 wdiBssParams->ucPersona = wdaBssParams->halPersona;
Jeff Johnson295189b2012-06-20 16:38:30 -07003529 wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07003530#ifdef WLAN_FEATURE_VOWIFI_11R
3531 wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003532 if(wdiBssParams->bExtSetStaKeyParamValid)
3533 {
3534 /* copy set STA key params to WDI structure */
3535 wdiBssParams->wdiExtSetKeyParam.ucSTAIdx =
3536 wdaBssParams->extSetStaKeyParam.staIdx;
3537 wdiBssParams->wdiExtSetKeyParam.wdiEncType =
3538 wdaBssParams->extSetStaKeyParam.encType;
3539 wdiBssParams->wdiExtSetKeyParam.wdiWEPType =
3540 wdaBssParams->extSetStaKeyParam.wepType;
3541 wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx =
3542 wdaBssParams->extSetStaKeyParam.defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07003543 if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
3544 {
Jeff Johnson43971f52012-07-17 12:26:56 -07003545 if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07003546 (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) &&
3547 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
3548 {
3549 WDA_GetWepKeysFromCfg( pWDA,
3550 &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx,
3551 &wdiBssParams->wdiExtSetKeyParam.ucNumKeys,
3552 wdiBssParams->wdiExtSetKeyParam.wdiKey );
3553 }
3554 else
3555 {
3556#ifdef WLAN_SOFTAP_FEATURE
3557 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3558 keyIndex++)
3559 {
3560 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId =
3561 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId;
3562 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast =
3563 wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
3564 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
3565 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07003566 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
3567 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
3568 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
3569 wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole;
3570 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength =
3571 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength;
3572 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key,
3573 wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
3574 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003575 wdiBssParams->wdiExtSetKeyParam.ucNumKeys =
3576 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3577#else
3578 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyId =
3579 wdaBssParams->extSetStaKeyParam.key.keyId;
3580 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].unicast =
3581 wdaBssParams->extSetStaKeyParam.key.unicast;
3582 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyDirection =
3583 wdaBssParams->extSetStaKeyParam.key.keyDirection;
3584 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyRsc,
3585 wdaBssParams->extSetStaKeyParam.key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
3586 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].paeRole =
3587 wdaBssParams->extSetStaKeyParam.key.paeRole;
3588 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyLength =
3589 wdaBssParams->extSetStaKeyParam.key.keyLength;
3590 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].key,
3591 wdaBssParams->extSetStaKeyParam.key[keyIndex].key,
3592 SIR_MAC_MAX_KEY_LENGTH);
3593 wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 1;
3594#endif
3595 }
3596 }
3597 wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc;
3598 }
3599 else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */
3600 {
3601 vos_mem_zero( &wdaBssParams->extSetStaKeyParam,
3602 sizeof(wdaBssParams->extSetStaKeyParam) );
3603 }
3604#endif /*WLAN_FEATURE_VOWIFI_11R*/
Jeff Johnsone7245742012-09-05 17:12:55 -07003605#ifdef WLAN_FEATURE_11AC
3606 wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable;
3607 wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet;
3608#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003609
3610 return ;
3611}
Jeff Johnson295189b2012-06-20 16:38:30 -07003612/*
3613 * FUNCTION: WDA_UpdateSTAParams
3614 * Translated WDA/PE BSS info into WDI BSS info..
3615 */
3616void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
3617 WDI_ConfigStaReqInfoType *wdiStaParams,
3618 tAddStaParams *wdaStaParams)
3619{
3620 tANI_U8 i = 0;
3621 /* Update STA params */
3622 vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId,
3623 sizeof(tSirMacAddr)) ;
3624 wdiStaParams->usAssocId = wdaStaParams->assocId;
3625 wdiStaParams->wdiSTAType = wdaStaParams->staType;
3626
3627 wdiStaParams->ucShortPreambleSupported =
3628 wdaStaParams->shortPreambleSupported;
3629 vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac,
3630 sizeof(tSirMacAddr)) ;
3631 wdiStaParams->usListenInterval = wdaStaParams->listenInterval;
3632
3633 wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled;
3634
3635 wdiStaParams->ucHTCapable = wdaStaParams->htCapable;
3636 wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet;
3637 wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode;
3638 wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection;
3639 wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize;
3640 wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity;
3641 wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize;
3642
3643 wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
3644 wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
Jeff Johnson295189b2012-06-20 16:38:30 -07003645 wdiStaParams->wdiSupportedRates.opRateMode =
3646 wdaStaParams->supportedRates.opRateMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003647 for(i = 0;i < WDI_NUM_11B_RATES;i++)
3648 {
3649 wdiStaParams->wdiSupportedRates.llbRates[i] =
3650 wdaStaParams->supportedRates.llbRates[i];
3651 }
3652 for(i = 0;i < WDI_NUM_11A_RATES;i++)
3653 {
3654 wdiStaParams->wdiSupportedRates.llaRates[i] =
3655 wdaStaParams->supportedRates.llaRates[i];
3656 }
3657 for(i = 0;i < SIR_NUM_POLARIS_RATES;i++)
3658 {
3659 wdiStaParams->wdiSupportedRates.aLegacyRates[i] =
3660 wdaStaParams->supportedRates.aniLegacyRates[i];
3661 }
3662 wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap =
3663 wdaStaParams->supportedRates.aniEnhancedRateBitmap;
Jeff Johnsone7245742012-09-05 17:12:55 -07003664#ifdef WLAN_FEATURE_11AC
3665 wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap;
3666 wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate;
3667 wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap;
3668 wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate;
3669#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003670 for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
3671 {
3672 wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] =
3673 wdaStaParams->supportedRates.supportedMCSSet[i];
3674 }
3675 wdiStaParams->wdiSupportedRates.aRxHighestDataRate =
3676 wdaStaParams->supportedRates.rxHighestDataRate;
3677
3678 wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled;
3679
3680 wdiStaParams->wdiAction = wdaStaParams->updateSta;
3681
3682 wdiStaParams->ucAPSD = wdaStaParams->uAPSD;
3683 wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen;
3684 wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable;
3685
3686 wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport;
3687 wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration;
3688 wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz;
3689 wdiStaParams->ucEncryptType = wdaStaParams->encryptType;
3690#ifdef WLAN_FEATURE_P2P
3691 wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
3692#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07003693#ifdef WLAN_FEATURE_11AC
3694 wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable;
3695 wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet;
3696#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 return ;
3698}
Jeff Johnson295189b2012-06-20 16:38:30 -07003699/*
3700 * -------------------------------------------------------------------------
3701 * CFG update to WDI
3702 * -------------------------------------------------------------------------
3703 */
3704
3705 /*
3706 * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
3707 * Convert the WNI CFG ID to HAL CFG ID
3708 */
Jeff Johnsone7245742012-09-05 17:12:55 -07003709static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
Jeff Johnson295189b2012-06-20 16:38:30 -07003710{
3711 switch(wniCfgId)
3712 {
3713 case WNI_CFG_STA_ID:
3714 return QWLAN_HAL_CFG_STA_ID;
3715 case WNI_CFG_CURRENT_TX_ANTENNA:
3716 return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
3717 case WNI_CFG_CURRENT_RX_ANTENNA:
3718 return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
3719 case WNI_CFG_LOW_GAIN_OVERRIDE:
3720 return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
3721 case WNI_CFG_POWER_STATE_PER_CHAIN:
3722 return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
3723 case WNI_CFG_CAL_PERIOD:
3724 return QWLAN_HAL_CFG_CAL_PERIOD;
3725 case WNI_CFG_CAL_CONTROL:
3726 return QWLAN_HAL_CFG_CAL_CONTROL;
3727 case WNI_CFG_PROXIMITY:
3728 return QWLAN_HAL_CFG_PROXIMITY;
3729 case WNI_CFG_NETWORK_DENSITY:
3730 return QWLAN_HAL_CFG_NETWORK_DENSITY;
3731 case WNI_CFG_MAX_MEDIUM_TIME:
3732 return QWLAN_HAL_CFG_MAX_MEDIUM_TIME;
3733 case WNI_CFG_MAX_MPDUS_IN_AMPDU:
3734 return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU;
3735 case WNI_CFG_RTS_THRESHOLD:
3736 return QWLAN_HAL_CFG_RTS_THRESHOLD;
3737 case WNI_CFG_SHORT_RETRY_LIMIT:
3738 return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT;
3739 case WNI_CFG_LONG_RETRY_LIMIT:
3740 return QWLAN_HAL_CFG_LONG_RETRY_LIMIT;
3741 case WNI_CFG_FRAGMENTATION_THRESHOLD:
3742 return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD;
3743 case WNI_CFG_DYNAMIC_THRESHOLD_ZERO:
3744 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO;
3745 case WNI_CFG_DYNAMIC_THRESHOLD_ONE:
3746 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE;
3747 case WNI_CFG_DYNAMIC_THRESHOLD_TWO:
3748 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO;
3749 case WNI_CFG_FIXED_RATE:
3750 return QWLAN_HAL_CFG_FIXED_RATE;
3751 case WNI_CFG_RETRYRATE_POLICY:
3752 return QWLAN_HAL_CFG_RETRYRATE_POLICY;
3753 case WNI_CFG_RETRYRATE_SECONDARY:
3754 return QWLAN_HAL_CFG_RETRYRATE_SECONDARY;
3755 case WNI_CFG_RETRYRATE_TERTIARY:
3756 return QWLAN_HAL_CFG_RETRYRATE_TERTIARY;
3757 case WNI_CFG_FORCE_POLICY_PROTECTION:
3758 return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION;
3759 case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ:
3760 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ;
3761 case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ:
3762 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ;
3763 case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ:
3764 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ;
3765 case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ:
3766 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ;
3767 case WNI_CFG_MAX_BA_SESSIONS:
3768 return QWLAN_HAL_CFG_MAX_BA_SESSIONS;
3769 case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT:
3770 return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT;
3771 case WNI_CFG_PS_ENABLE_BCN_FILTER:
3772 return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER;
3773 case WNI_CFG_PS_ENABLE_RSSI_MONITOR:
3774 return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR;
3775 case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE:
3776 return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
3777 case WNI_CFG_STATS_PERIOD:
3778 return QWLAN_HAL_CFG_STATS_PERIOD;
3779 case WNI_CFG_CFP_MAX_DURATION:
3780 return QWLAN_HAL_CFG_CFP_MAX_DURATION;
3781#if 0 /*This is not part of CFG*/
3782 case WNI_CFG_FRAME_TRANS_ENABLED:
3783 return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED;
3784#endif
3785 case WNI_CFG_DTIM_PERIOD:
3786 return QWLAN_HAL_CFG_DTIM_PERIOD;
3787 case WNI_CFG_EDCA_WME_ACBK:
3788 return QWLAN_HAL_CFG_EDCA_WMM_ACBK;
3789 case WNI_CFG_EDCA_WME_ACBE:
3790 return QWLAN_HAL_CFG_EDCA_WMM_ACBE;
3791 case WNI_CFG_EDCA_WME_ACVI:
3792 return QWLAN_HAL_CFG_EDCA_WMM_ACVI;
3793 case WNI_CFG_EDCA_WME_ACVO:
3794 return QWLAN_HAL_CFG_EDCA_WMM_ACVO;
3795#if 0
3796 case WNI_CFG_TELE_BCN_WAKEUP_EN:
3797 return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN;
3798 case WNI_CFG_TELE_BCN_TRANS_LI:
3799 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI;
3800 case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS:
3801 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS;
3802 case WNI_CFG_TELE_BCN_MAX_LI:
3803 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI;
3804 case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS:
3805 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS;
3806#endif
3807 case WNI_CFG_ENABLE_CLOSE_LOOP:
3808 return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP;
3809 default:
3810 {
3811 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3812 "There is no HAL CFG Id corresponding to WNI CFG Id: %d\n",
3813 wniCfgId);
3814 return VOS_STATUS_E_INVAL;
3815 }
3816 }
3817}
Jeff Johnson295189b2012-06-20 16:38:30 -07003818/*
3819 * FUNCTION: WDA_UpdateCfgCallback
3820 *
3821 */
3822void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData)
3823{
3824 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
3825 WDI_UpdateCfgReqParamsType *wdiCfgParam =
3826 (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3828 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003829 /*
3830 * currently there is no response message is expected between PE and
3831 * WDA, Failure return from WDI is a ASSERT condition
3832 */
3833 if(WDI_STATUS_SUCCESS != wdiStatus)
3834 {
3835 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3836 "%s: CFG (%d) config failure \n", __FUNCTION__,
3837 ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
3838 }
3839
3840 vos_mem_free(wdiCfgParam->pConfigBuffer) ;
3841 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3842 pWDA->wdaWdiCfgApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003843 return ;
3844}
Jeff Johnson295189b2012-06-20 16:38:30 -07003845/*
3846 * FUNCTION: WDA_UpdateCfg
3847 *
3848 */
3849VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam)
3850{
3851
3852 WDI_Status status = WDI_STATUS_SUCCESS ;
3853 tANI_U32 val =0;
3854 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
3855 tHalCfg *configData;
3856 WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
3857 tANI_U8 *configDataValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003858 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3859 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003860 if (NULL == pMac )
3861 {
3862 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3863 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3864 return VOS_STATUS_E_FAILURE;
3865 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003866 if(WDA_START_STATE != pWDA->wdaState)
3867 {
3868 return VOS_STATUS_E_FAILURE;
3869 }
3870
3871 if(NULL != pWDA->wdaWdiCfgApiMsgParam)
3872 {
3873 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3874 "%s:wdaWdiCfgApiMsgParam is not NULL", __FUNCTION__);
3875 VOS_ASSERT(0);
3876 return VOS_STATUS_E_FAILURE;
3877 }
3878
3879 wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
3880 sizeof(WDI_UpdateCfgReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003881 if(NULL == wdiCfgReqParam)
3882 {
3883 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3884 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3885 VOS_ASSERT(0);
3886 return VOS_STATUS_E_NOMEM;
3887 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003888 wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) +
3889 sizeof(tANI_U32)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003890 if(NULL == wdiCfgReqParam->pConfigBuffer)
3891 {
3892 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3893 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
3894 vos_mem_free(wdiCfgReqParam);
3895 VOS_ASSERT(0);
3896 return VOS_STATUS_E_NOMEM;
3897 }
3898
3899 /*convert the WNI CFG Id to HAL CFG Id*/
3900 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
3901 WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
3902
3903 /*TODO: revisit this for handling string parameters */
3904 if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval,
3905 &val) != eSIR_SUCCESS)
3906 {
3907 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3908 "Failed to cfg get id %d\n", cfgParam->bodyval);
3909 vos_mem_free(wdiCfgReqParam->pConfigBuffer);
3910 vos_mem_free(wdiCfgReqParam);
3911 return eSIR_FAILURE;
3912 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003913 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
3914 configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
3915 configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
3916 vos_mem_copy( configDataValue, &val, sizeof(tANI_U32));
3917 wdiCfgReqParam->wdiReqStatusCB = NULL ;
3918
3919 /* store Params pass it to WDI */
3920 pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003921#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
3922 status = WDI_UpdateCfgReq(wdiCfgReqParam,
3923 (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 if(IS_WDI_STATUS_FAILURE(status))
3925 {
3926 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3927 "Failure in Update CFG WDI API, free all the memory " );
3928 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3929 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3930 pWDA->wdaWdiCfgApiMsgParam = NULL;
3931 /* Failure is not expected */
3932 VOS_ASSERT(0) ;
3933 }
3934#else
3935 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3936 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3937 pWDA->wdaWdiCfgApiMsgParam = NULL;
3938#endif
3939 return CONVERT_WDI2VOS_STATUS(status) ;
3940}
3941
Jeff Johnson295189b2012-06-20 16:38:30 -07003942VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
3943 v_U8_t *pDefaultKeyId,
3944 v_U8_t *pNumKeys,
3945 WDI_KeysType *pWdiKeys )
3946{
3947 v_U32_t i, j, defKeyId = 0;
3948 v_U32_t val = SIR_MAC_KEY_LENGTH;
3949 VOS_STATUS status = WDI_STATUS_SUCCESS;
3950 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003951 if (NULL == pMac )
3952 {
3953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3954 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3955 return VOS_STATUS_E_FAILURE;
3956 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003957 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
3958 &defKeyId ))
3959 {
3960 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3961 "Unable to retrieve defaultKeyId from CFG. Defaulting to 0...");
3962 }
3963
3964 *pDefaultKeyId = (v_U8_t)defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07003965 /* Need to extract ALL of the configured WEP Keys */
3966 for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
3967 {
3968 val = SIR_MAC_KEY_LENGTH;
3969 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3970 (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i),
3971 pWdiKeys[j].key,
3972 &val ))
3973 {
3974 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3975 "WEP Key index [%d] may not configured in CFG\n",i);
3976 }
3977 else
3978 {
3979 pWdiKeys[j].keyId = (tANI_U8) i;
3980 /*
3981 * Actually, a DC (Don't Care) because
3982 * this is determined (and set) by PE/MLME
3983 */
3984 pWdiKeys[j].unicast = 0;
3985 /*
3986 * Another DC (Don't Care)
3987 */
3988 pWdiKeys[j].keyDirection = eSIR_TX_RX;
3989 /* Another DC (Don't Care). Unused for WEP */
3990 pWdiKeys[j].paeRole = 0;
3991 /* Determined from wlan_cfgGetStr() above.*/
3992 pWdiKeys[j].keyLength = (tANI_U16) val;
Jeff Johnson295189b2012-06-20 16:38:30 -07003993 j++;
3994 *pNumKeys = (tANI_U8) j;
3995 }
3996 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003997 return status;
3998}
Jeff Johnson295189b2012-06-20 16:38:30 -07003999/*
4000 * FUNCTION: WDA_SetBssKeyReqCallback
4001 * send SET BSS key RSP back to PE
4002 */
4003void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData)
4004{
4005 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4006 tWDA_CbContext *pWDA;
4007 tSetBssKeyParams *setBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4009 "<------ %s " ,__FUNCTION__);
4010 if(NULL == pWdaParams)
4011 {
4012 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4013 "%s: pWdaParams received NULL", __FUNCTION__);
4014 VOS_ASSERT(0) ;
4015 return ;
4016 }
4017 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4018 setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004019 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4020 vos_mem_free(pWdaParams) ;
4021 setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004022 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004023 return ;
4024}
Jeff Johnson295189b2012-06-20 16:38:30 -07004025/*
4026 * FUNCTION: WDA_ProcessSetBssKeyReq
4027 * Request to WDI for programming the BSS key( key for
4028 * broadcast/multicast frames Encryption)
4029 */
4030VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA,
4031 tSetBssKeyParams *setBssKeyParams )
4032{
4033 WDI_Status status = WDI_STATUS_SUCCESS ;
4034 WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam =
4035 (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
4036 sizeof(WDI_SetBSSKeyReqParamsType)) ;
4037 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4040 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 if(NULL == wdiSetBssKeyParam)
4042 {
4043 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4044 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4045 VOS_ASSERT(0);
4046 return VOS_STATUS_E_NOMEM;
4047 }
4048 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4049 if(NULL == pWdaParams)
4050 {
4051 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4052 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4053 VOS_ASSERT(0);
4054 vos_mem_free(wdiSetBssKeyParam);
4055 return VOS_STATUS_E_NOMEM;
4056 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004057 vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004058 /* copy set BSS params to WDI structure */
4059 wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
4060 wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
4061 wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 if(setBssKeyParams->encType != eSIR_ED_NONE)
4063 {
4064 if( setBssKeyParams->numKeys == 0 &&
4065 (( setBssKeyParams->encType == eSIR_ED_WEP40)||
4066 setBssKeyParams->encType == eSIR_ED_WEP104))
4067 {
4068 tANI_U8 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004069 WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId,
4070 &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
4071 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
4072 }
4073 else
4074 {
4075 for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++)
4076 {
4077 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId =
4078 setBssKeyParams->key[keyIndex].keyId;
4079 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast =
4080 setBssKeyParams->key[keyIndex].unicast;
4081 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection =
4082 setBssKeyParams->key[keyIndex].keyDirection;
4083 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
4084 setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4085 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole =
4086 setBssKeyParams->key[keyIndex].paeRole;
4087 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength =
4088 setBssKeyParams->key[keyIndex].keyLength;
4089 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key,
4090 setBssKeyParams->key[keyIndex].key,
4091 SIR_MAC_MAX_KEY_LENGTH);
4092 }
4093 }
4094 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc =
4096 setBssKeyParams->singleTidRc;
4097 wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004098 /* Store set key pointer, as this will be used for response */
4099 /* store Params pass it to WDI */
4100 pWdaParams->pWdaContext = pWDA;
4101 pWdaParams->wdaMsgParam = setBssKeyParams;
4102 pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004103 status = WDI_SetBSSKeyReq(wdiSetBssKeyParam,
4104 (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
4105
4106 if(IS_WDI_STATUS_FAILURE(status))
4107 {
4108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4109 "Failure in Set BSS Key Req WDI API, free all the memory " );
4110 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4111 vos_mem_free(pWdaParams) ;
4112 setBssKeyParams->status = eSIR_FAILURE ;
4113 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
4114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004115 return CONVERT_WDI2VOS_STATUS(status) ;
4116}
Jeff Johnson295189b2012-06-20 16:38:30 -07004117/*
4118 * FUNCTION: WDA_RemoveBssKeyReqCallback
4119 * send SET BSS key RSP back to PE
4120 */
4121void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData)
4122{
4123 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4124 tWDA_CbContext *pWDA;
4125 tRemoveBssKeyParams *removeBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004126 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4127 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004128 if(NULL == pWdaParams)
4129 {
4130 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4131 "%s: pWdaParams received NULL", __FUNCTION__);
4132 VOS_ASSERT(0) ;
4133 return ;
4134 }
4135 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4136 removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004137 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4138 vos_mem_free(pWdaParams) ;
4139
4140 removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 return ;
4143}
Jeff Johnson295189b2012-06-20 16:38:30 -07004144/*
4145 * FUNCTION: WDA_ProcessRemoveBssKeyReq
4146 * Request to WDI to remove the BSS key( key for broadcast/multicast
4147 * frames Encryption)
4148 */
4149VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA,
4150 tRemoveBssKeyParams *removeBssKeyParams )
4151{
4152 WDI_Status status = WDI_STATUS_SUCCESS ;
4153 WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam =
4154 (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
4155 sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
4156 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4158 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004159 if(NULL == wdiRemoveBssKeyParam)
4160 {
4161 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4162 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4163 VOS_ASSERT(0);
4164 return VOS_STATUS_E_NOMEM;
4165 }
4166 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4167 if(NULL == pWdaParams)
4168 {
4169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4170 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4171 VOS_ASSERT(0);
4172 vos_mem_free(wdiRemoveBssKeyParam);
4173 return VOS_STATUS_E_NOMEM;
4174 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004175 /* copy Remove BSS key params to WDI structure*/
4176 wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
4177 wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
4178 wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
4179 wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
4180 wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 /* Store remove key pointer, as this will be used for response */
4182 /* store Params pass it to WDI */
4183 pWdaParams->pWdaContext = pWDA;
4184 pWdaParams->wdaMsgParam = removeBssKeyParams;
4185 pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004186 status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam,
4187 (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004188 if(IS_WDI_STATUS_FAILURE(status))
4189 {
4190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4191 "Failure in Remove BSS Key Req WDI API, free all the memory " );
4192 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4193 vos_mem_free(pWdaParams) ;
4194 removeBssKeyParams->status = eSIR_FAILURE ;
4195 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
4196 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004197 return CONVERT_WDI2VOS_STATUS(status) ;
4198}
Jeff Johnson295189b2012-06-20 16:38:30 -07004199/*
4200 * FUNCTION: WDA_SetBssKeyReqCallback
4201 * send SET BSS key RSP back to PE
4202 */
4203void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData)
4204{
4205 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4206 tWDA_CbContext *pWDA;
4207 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4209 "<------ %s " ,__FUNCTION__);
4210 if(NULL == pWdaParams)
4211 {
4212 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR
4213 ,"%s: pWdaParams received NULL", __FUNCTION__);
4214 VOS_ASSERT(0) ;
4215 return ;
4216 }
4217 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4218 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004219 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4220 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004221 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004222 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004223 return ;
4224}
Jeff Johnson295189b2012-06-20 16:38:30 -07004225/*
4226 * FUNCTION: WDA_ProcessSetStaKeyReq
4227 * Request to WDI for programming the STA key( key for Unicast frames
4228 * Encryption)
4229 */
4230VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA,
4231 tSetStaKeyParams *setStaKeyParams )
4232{
4233 WDI_Status status = WDI_STATUS_SUCCESS ;
4234 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4235 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4236 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4237 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004238 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4240 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 if(NULL == wdiSetStaKeyParam)
4242 {
4243 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4244 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4245 VOS_ASSERT(0);
4246 return VOS_STATUS_E_NOMEM;
4247 }
4248 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4249 if(NULL == pWdaParams)
4250 {
4251 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4252 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4253 VOS_ASSERT(0);
4254 vos_mem_free(wdiSetStaKeyParam);
4255 return VOS_STATUS_E_NOMEM;
4256 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004257 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004258 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004259 /* copy set STA key params to WDI structure */
4260 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4261 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4262 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4263 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004264 if(setStaKeyParams->encType != eSIR_ED_NONE)
4265 {
Jeff Johnson43971f52012-07-17 12:26:56 -07004266 if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004267 (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) &&
4268 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
4269 {
4270 WDA_GetWepKeysFromCfg( pWDA,
4271 &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx,
4272 &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys,
4273 wdiSetStaKeyParam->wdiKeyInfo.wdiKey );
4274 }
4275 else
4276 {
4277#ifdef WLAN_SOFTAP_FEATURE
4278 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4279 keyIndex++)
4280 {
4281 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4282 setStaKeyParams->key[keyIndex].keyId;
4283 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4284 setStaKeyParams->key[keyIndex].unicast;
4285 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4286 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004287 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4288 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4289 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4290 setStaKeyParams->key[keyIndex].paeRole;
4291 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4292 setStaKeyParams->key[keyIndex].keyLength;
4293 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4294 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4295 /* set default index to index which have key direction as WDI_TX_DEFAULT */
4296 if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection)
4297 {
4298 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
4299 }
4300 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004301 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4302 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4303#else
4304 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4305 setStaKeyParams->key.keyId;
4306 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4307 setStaKeyParams->key.unicast;
4308 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4309 setStaKeyParams->key.keyDirection;
4310 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4311 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4312 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4313 setStaKeyParams->key.paeRole;
4314 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4315 setStaKeyParams->key.keyLength;
4316 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4317 setStaKeyParams->key[keyIndex].key,
4318 SIR_MAC_MAX_KEY_LENGTH);
4319 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4320#endif
4321 }
4322 }
4323 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4324 wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004325 /* Store set key pointer, as this will be used for response */
4326 /* store Params pass it to WDI */
4327 pWdaParams->pWdaContext = pWDA;
4328 pWdaParams->wdaMsgParam = setStaKeyParams;
4329 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 status = WDI_SetSTAKeyReq(wdiSetStaKeyParam,
4331 (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004332 if(IS_WDI_STATUS_FAILURE(status))
4333 {
4334 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4335 "Failure in set STA Key Req WDI API, free all the memory " );
4336 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4337 vos_mem_free(pWdaParams) ;
4338 setStaKeyParams->status = eSIR_FAILURE ;
4339 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
4340 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004341 return CONVERT_WDI2VOS_STATUS(status) ;
4342}
Jeff Johnson295189b2012-06-20 16:38:30 -07004343/*
4344 * FUNCTION: WDA_SetBcastStaKeyReqCallback
4345 * send SET Bcast STA key RSP back to PE
4346 */
4347void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData)
4348{
4349 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4350 tWDA_CbContext *pWDA;
4351 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4353 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 if(NULL == pWdaParams)
4355 {
4356 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4357 "%s: pWdaParams received NULL", __FUNCTION__);
4358 VOS_ASSERT(0) ;
4359 return ;
4360 }
4361 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4362 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004363 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4364 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004365 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004366 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004367 return ;
4368}
4369
Jeff Johnson295189b2012-06-20 16:38:30 -07004370/*
4371 * FUNCTION: WDA_ProcessSetBcastStaKeyReq
4372 * Request to WDI for programming the Bcast STA key( key for Broadcast frames
4373 * Encryption)
4374 */
4375VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA,
4376 tSetStaKeyParams *setStaKeyParams )
4377{
4378 WDI_Status status = WDI_STATUS_SUCCESS ;
4379 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4380 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4381 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4382 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004383 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4385 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004386 if(NULL == wdiSetStaKeyParam)
4387 {
4388 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4389 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4390 VOS_ASSERT(0);
4391 return VOS_STATUS_E_NOMEM;
4392 }
4393 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4394 if(NULL == pWdaParams)
4395 {
4396 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4397 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4398 VOS_ASSERT(0);
4399 vos_mem_free(wdiSetStaKeyParam);
4400 return VOS_STATUS_E_NOMEM;
4401 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004402 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004403 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004404 /* copy set STA key params to WDI structure */
4405 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4406 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4407 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4408 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004409 if(setStaKeyParams->encType != eSIR_ED_NONE)
4410 {
4411#ifdef WLAN_SOFTAP_FEATURE
4412 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4413 keyIndex++)
4414 {
4415 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4416 setStaKeyParams->key[keyIndex].keyId;
4417 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4418 setStaKeyParams->key[keyIndex].unicast;
4419 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4420 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004421 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4422 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4423 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4424 setStaKeyParams->key[keyIndex].paeRole;
4425 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4426 setStaKeyParams->key[keyIndex].keyLength;
4427 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4428 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4431 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4432#else
4433 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4434 setStaKeyParams->key.keyId;
4435 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4436 setStaKeyParams->key.unicast;
4437 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4438 setStaKeyParams->key.keyDirection;
4439 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4440 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4441 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4442 setStaKeyParams->key.paeRole;
4443 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4444 setStaKeyParams->key.keyLength;
4445 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4446 setStaKeyParams->key[keyIndex].key,
4447 SIR_MAC_MAX_KEY_LENGTH);
4448 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4449#endif
4450 }
4451 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
Jeff Johnson295189b2012-06-20 16:38:30 -07004452 /* Store set key pointer, as this will be used for response */
4453 /* store Params pass it to WDI */
4454 pWdaParams->pWdaContext = pWDA;
4455 pWdaParams->wdaMsgParam = setStaKeyParams;
4456 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam,
4458 (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004459 if(IS_WDI_STATUS_FAILURE(status))
4460 {
4461 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4462 "Failure in set BCAST STA Key Req WDI API, free all the memory " );
4463 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4464 vos_mem_free(pWdaParams) ;
4465 setStaKeyParams->status = eSIR_FAILURE ;
4466 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
4467 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004468 return CONVERT_WDI2VOS_STATUS(status) ;
4469}
Jeff Johnson295189b2012-06-20 16:38:30 -07004470/*
4471 * FUNCTION: WDA_RemoveStaKeyReqCallback
4472 * send SET BSS key RSP back to PE
4473 */
4474void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData)
4475{
4476 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4477 tWDA_CbContext *pWDA;
4478 tRemoveStaKeyParams *removeStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004479 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4480 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004481 if(NULL == pWdaParams)
4482 {
4483 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4484 "%s: pWdaParams received NULL", __FUNCTION__);
4485 VOS_ASSERT(0) ;
4486 return ;
4487 }
4488 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4489 removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004490 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4491 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004492 removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004493 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004494 return ;
4495}
4496
Jeff Johnson295189b2012-06-20 16:38:30 -07004497/*
4498 * FUNCTION: WDA_ProcessRemoveStaKeyReq
4499 * Request to WDI to remove the STA key( key for Unicast frames Encryption)
4500 */
4501VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA,
4502 tRemoveStaKeyParams *removeStaKeyParams )
4503{
4504 WDI_Status status = WDI_STATUS_SUCCESS ;
4505 WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam =
4506 (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
4507 sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
4508 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4510 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004511 if(NULL == wdiRemoveStaKeyParam)
4512 {
4513 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4514 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4515 VOS_ASSERT(0);
4516 return VOS_STATUS_E_NOMEM;
4517 }
4518 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4519 if(NULL == pWdaParams)
4520 {
4521 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4522 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4523 VOS_ASSERT(0);
4524 vos_mem_free(wdiRemoveStaKeyParam);
4525 return VOS_STATUS_E_NOMEM;
4526 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 /* copy remove STA key params to WDI structure*/
4528 wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
4529 wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
4530 wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
4531 wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
4532 wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004533 /* Store remove key pointer, as this will be used for response */
4534 /* store Params pass it to WDI */
4535 pWdaParams->pWdaContext = pWDA;
4536 pWdaParams->wdaMsgParam = removeStaKeyParams;
4537 pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004538 status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam,
4539 (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004540 if(IS_WDI_STATUS_FAILURE(status))
4541 {
4542 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4543 "Failure in remove STA Key Req WDI API, free all the memory " );
4544 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4545 vos_mem_free(pWdaParams) ;
4546 removeStaKeyParams->status = eSIR_FAILURE ;
4547 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
4548 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004549 return CONVERT_WDI2VOS_STATUS(status) ;
4550}
Jeff Johnson295189b2012-06-20 16:38:30 -07004551/*
4552 * FUNCTION: WDA_IsHandleSetLinkStateReq
4553 * Update the WDA state and return the status to handle this message or not
4554 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004555WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
4556 tWDA_CbContext *pWDA,
4557 tLinkStateParams *linkStateParams)
4558{
4559 WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004560 switch(linkStateParams->state)
4561 {
4562 case eSIR_LINK_PREASSOC_STATE:
4563 case eSIR_LINK_BTAMP_PREASSOC_STATE:
4564 /*
4565 * set the WDA state to PRE ASSOC
4566 * copy the BSSID into pWDA to use it in join request and return,
4567 * No need to handle these messages.
4568 */
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004569 if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->bssid) )
4570 {
4571 vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid,
Jeff Johnson295189b2012-06-20 16:38:30 -07004572 sizeof(tSirMacAddr));
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004573 }
4574 else
4575 {
4576 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
4577 "%s: BSSID in set link state is NULL ", __FUNCTION__);
4578 VOS_ASSERT(0);
4579 }
4580
4581 if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->selfMacAddr) )
4582 {
4583 vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07004584 sizeof(tSirMacAddr));
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004585 }
4586 else
4587 {
4588 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
4589 "%s: self mac address in set link state is NULL ", __FUNCTION__);
4590 VOS_ASSERT(0);
4591 }
4592
Jeff Johnson295189b2012-06-20 16:38:30 -07004593 /* UMAC is issuing the setlink state with PREASSOC twice (before set
4594 *channel and after ) so reset the WDA state to ready when the second
4595 * time UMAC issue the link state with PREASSOC
4596 */
4597 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
4598 {
4599 /* RESET WDA state back to WDA_READY_STATE */
4600 pWDA->wdaState = WDA_READY_STATE;
4601 }
4602 else
4603 {
4604 pWDA->wdaState = WDA_PRE_ASSOC_STATE;
4605 }
4606 //populate linkState info in WDACbCtxt
4607 pWDA->linkState = linkStateParams->state;
4608 status = WDA_IGNORE_SET_LINK_STATE;
4609 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004610 default:
4611 if(pWDA->wdaState != WDA_READY_STATE)
4612 {
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004613 /*If WDA_SET_LINK_STATE is recieved with any other link state apart
4614 *from eSIR_LINK_PREASSOC_STATE and eSIR_LINK_BTAMP_PREASSOC_STATE when
4615 *pWDA->wdaState is in WDA_PRE_ASSOC_STATE(This can happen only in
4616 *error cases) so reset the WDA state to WDA_READY_STATE to avoid
4617 *the ASSERT in WDA_Stop during module unload.*/
4618 if (pWDA->wdaState == WDA_PRE_ASSOC_STATE)
4619 {
4620 pWDA->wdaState = WDA_READY_STATE;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004621 /* Don't ignore the set link in this case*/
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004622 }
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004623 else
4624 {
4625 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004626 "Set link state called when WDA is not in READY STATE " );
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004627 status = WDA_IGNORE_SET_LINK_STATE;
4628 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004629 }
4630 break;
4631 }
4632
4633 return status;
4634}
Jeff Johnson295189b2012-06-20 16:38:30 -07004635/*
4636 * FUNCTION: WDA_SetLinkStateCallback
4637 * call back function for set link state from WDI
4638 */
4639void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
4640{
4641 tWDA_CbContext *pWDA;
4642 tLinkStateParams *linkStateParams;
4643 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07004644 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4645 "<------ %s " ,__FUNCTION__);
4646 if(NULL == pWdaParams)
4647 {
4648 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4649 "%s: pWdaParams received NULL", __FUNCTION__);
4650 VOS_ASSERT(0) ;
4651 return ;
4652 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07004654 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004655 /*
4656 * In STA mode start the BA activity check timer after association
4657 * and in AP mode start BA activity check timer after BSS start */
4658 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
4659 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
4660 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
4661 {
4662 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004665 /*
4666 * No respone required for WDA_SET_LINK_STATE so free the request
4667 * param here
4668 */
4669 if( pWdaParams != NULL )
4670 {
4671 if( pWdaParams->wdaWdiApiMsgParam != NULL )
4672 {
4673 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4674 }
4675 vos_mem_free(pWdaParams);
4676 }
4677 return ;
4678}
Jeff Johnson295189b2012-06-20 16:38:30 -07004679/*
4680 * FUNCTION: WDA_ProcessSetLinkState
4681 * Request to WDI to set the link status.
4682 */
4683VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
4684 tLinkStateParams *linkStateParams)
4685{
4686 WDI_Status status = WDI_STATUS_SUCCESS ;
4687 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
4688 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
4689 sizeof(WDI_SetLinkReqParamsType)) ;
4690 tWDA_ReqParams *pWdaParams ;
4691 tpAniSirGlobal pMac;
4692 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
4693
4694 if(NULL == pMac)
4695 {
4696 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4697 "%s:pMac is NULL", __FUNCTION__);
4698 VOS_ASSERT(0);
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004699 vos_mem_free(wdiSetLinkStateParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004700 return VOS_STATUS_E_FAILURE;
4701 }
4702
4703 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4704 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004705 if(NULL == wdiSetLinkStateParam)
4706 {
4707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4708 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4709 VOS_ASSERT(0);
4710 return VOS_STATUS_E_NOMEM;
4711 }
4712 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4713 if(NULL == pWdaParams)
4714 {
4715 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4716 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4717 VOS_ASSERT(0);
4718 vos_mem_free(wdiSetLinkStateParam);
4719 return VOS_STATUS_E_NOMEM;
4720 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004721 if(WDA_IGNORE_SET_LINK_STATE ==
4722 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
4723 {
4724 status = WDI_STATUS_E_FAILURE;
4725 }
4726 else
4727 {
4728 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
4729 linkStateParams->bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004730 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
4731 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
4733 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004734 pWdaParams->pWdaContext = pWDA;
4735 /* Store remove key pointer, as this will be used for response */
4736 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004737 /* store Params pass it to WDI */
4738 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
4739 /* Stop Timer only other than GO role and concurrent session */
4740 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
4741 && !vos_concurrent_sessions_running() &&
4742 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
4743 {
4744 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4745 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004746 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
4747 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 if(IS_WDI_STATUS_FAILURE(status))
4749 {
4750 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4751 "Failure in set link state Req WDI API, free all the memory " );
4752 }
4753 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004754 if(IS_WDI_STATUS_FAILURE(status))
4755 {
4756 vos_mem_free(wdiSetLinkStateParam) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07004757 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004758 vos_mem_free(pWdaParams);
4759 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004760 return CONVERT_WDI2VOS_STATUS(status) ;
4761}
Jeff Johnson295189b2012-06-20 16:38:30 -07004762/*
4763 * FUNCTION: WDA_GetStatsReqParamsCallback
4764 * send the response to PE with Stats received from WDI
4765 */
4766void WDA_GetStatsReqParamsCallback(
4767 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
4768 void* pUserData)
4769{
4770 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4771 tAniGetPEStatsRsp *pGetPEStatsRspParams;
4772
4773 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4774 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004775 pGetPEStatsRspParams =
4776 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
4777 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
4778
4779 if(NULL == pGetPEStatsRspParams)
4780 {
4781 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4782 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4783 VOS_ASSERT(0);
4784 return;
4785 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004786 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
4787 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
4788 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
4789 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
4790 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
4791
4792 //Fill the Session Id Properly in PE
4793 pGetPEStatsRspParams->sessionId = 0;
4794 pGetPEStatsRspParams->rc =
4795 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
4796 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
4797 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004798 vos_mem_copy( pGetPEStatsRspParams + 1,
4799 wdiGetStatsRsp + 1,
4800 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004801 /* send response to UMAC*/
4802 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
4803
4804 return;
4805}
4806
Jeff Johnson295189b2012-06-20 16:38:30 -07004807/*
4808 * FUNCTION: WDA_ProcessGetStatsReq
4809 * Request to WDI to get the statistics
4810 */
4811VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
4812 tAniGetPEStatsReq *pGetStatsParams)
4813{
4814 WDI_Status status = WDI_STATUS_SUCCESS ;
4815 WDI_GetStatsReqParamsType wdiGetStatsParam;
4816 tAniGetPEStatsRsp *pGetPEStatsRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004817 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4818 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004819 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
4820 pGetStatsParams->staId;
4821 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
4822 pGetStatsParams->statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004823 wdiGetStatsParam.wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004824 status = WDI_GetStatsReq(&wdiGetStatsParam,
4825 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07004826 if(IS_WDI_STATUS_FAILURE(status))
4827 {
4828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4829 "Failure in Get Stats Req WDI API, free all the memory " );
4830 pGetPEStatsRspParams =
4831 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
4832 if(NULL == pGetPEStatsRspParams)
4833 {
4834 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4835 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4836 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004837 vos_mem_free(pGetStatsParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004838 return VOS_STATUS_E_NOMEM;
4839 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004840 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
4841 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
4842 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
4843 pGetPEStatsRspParams->rc = eSIR_FAILURE;
4844 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
4845 (void *)pGetPEStatsRspParams, 0) ;
4846 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004847 /* Free the request message */
4848 vos_mem_free(pGetStatsParams);
4849 return CONVERT_WDI2VOS_STATUS(status);
4850}
Jeff Johnson295189b2012-06-20 16:38:30 -07004851/*
4852 * FUNCTION: WDA_UpdateEDCAParamCallback
4853 * call back function for Update EDCA params from WDI
4854 */
4855void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
4856{
4857 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4858 tEdcaParams *pEdcaParams;
4859
4860 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4861 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004862 if(NULL == pWdaParams)
4863 {
4864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4865 "%s: pWdaParams received NULL", __FUNCTION__);
4866 VOS_ASSERT(0) ;
4867 return ;
4868 }
4869 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004870 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4871 vos_mem_free(pWdaParams);
4872 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004873 return ;
4874}
Jeff Johnson295189b2012-06-20 16:38:30 -07004875/*
4876 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
4877 * Request to WDI to Update the EDCA params.
4878 */
4879VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
4880 tEdcaParams *pEdcaParams)
4881{
4882 WDI_Status status = WDI_STATUS_SUCCESS ;
4883 WDI_UpdateEDCAParamsType *wdiEdcaParam =
4884 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
4885 sizeof(WDI_UpdateEDCAParamsType)) ;
4886 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004887 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4888 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004889 if(NULL == wdiEdcaParam)
4890 {
4891 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4892 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4893 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004894 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004895 return VOS_STATUS_E_NOMEM;
4896 }
4897 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4898 if(NULL == pWdaParams)
4899 {
4900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4901 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4902 VOS_ASSERT(0);
4903 vos_mem_free(wdiEdcaParam);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004904 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004905 return VOS_STATUS_E_NOMEM;
4906 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004907 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
4908 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
4909 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
4910 &pEdcaParams->acbe);
4911 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
4912 &pEdcaParams->acbk);
4913 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
4914 &pEdcaParams->acvi);
4915 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
4916 &pEdcaParams->acvo);
4917 wdiEdcaParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004918 pWdaParams->pWdaContext = pWDA;
4919 /* Store remove key pointer, as this will be used for response */
4920 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004921 /* store Params pass it to WDI */
4922 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004923 status = WDI_UpdateEDCAParams(wdiEdcaParam,
4924 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004925 if(IS_WDI_STATUS_FAILURE(status))
4926 {
4927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4928 "Failure in Update EDCA Params WDI API, free all the memory " );
4929 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4930 vos_mem_free(pWdaParams);
4931 vos_mem_free(pEdcaParams);
4932 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004933 return CONVERT_WDI2VOS_STATUS(status) ;
4934}
Jeff Johnson295189b2012-06-20 16:38:30 -07004935/*
4936 * FUNCTION: WDA_AddBAReqCallback
4937 * send ADD BA RSP back to PE
4938 */
4939void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
4940 void* pUserData)
4941{
4942 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4943 tWDA_CbContext *pWDA;
4944 tAddBAParams *pAddBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004945 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4946 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004947 if(NULL == pWdaParams)
4948 {
4949 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4950 "%s: pWdaParams received NULL", __FUNCTION__);
4951 VOS_ASSERT(0) ;
4952 return ;
4953 }
4954 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4955 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004956 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4957 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004958 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004959 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004960 return ;
4961}
4962
Jeff Johnson295189b2012-06-20 16:38:30 -07004963/*
4964 * FUNCTION: WDA_ProcessAddBAReq
4965 * Request to WDI to Update the ADDBA REQ params.
4966 */
4967VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
4968 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
4969{
Jeff Johnson43971f52012-07-17 12:26:56 -07004970 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07004971 WDI_AddBAReqParamsType *wdiAddBAReqParam =
4972 (WDI_AddBAReqParamsType *)vos_mem_malloc(
4973 sizeof(WDI_AddBAReqParamsType)) ;
4974 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4976 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004977 if(NULL == wdiAddBAReqParam)
4978 {
4979 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4980 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4981 VOS_ASSERT(0);
4982 return VOS_STATUS_E_NOMEM;
4983 }
4984 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4985 if(NULL == pWdaParams)
4986 {
4987 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4988 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4989 VOS_ASSERT(0);
4990 vos_mem_free(wdiAddBAReqParam);
4991 return VOS_STATUS_E_NOMEM;
4992 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004993 do
4994 {
4995 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004996 wdiAddBaInfo->ucSTAIdx = staIdx ;
4997 wdiAddBaInfo->ucBaSessionID = baSessionID ;
4998 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004999 } while(0) ;
5000 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005001 pWdaParams->pWdaContext = pWDA;
5002 /* store Params pass it to WDI */
5003 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
5004 pWdaParams->wdaMsgParam = pAddBAReqParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07005005 wstatus = WDI_AddBAReq(wdiAddBAReqParam,
5006 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005007
Jeff Johnson43971f52012-07-17 12:26:56 -07005008 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07005009 {
5010 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07005011 "Failure in ADD BA REQ Params WDI API, free all the memory" );
5012 status = CONVERT_WDI2VOS_STATUS(wstatus);
5013 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07005014 vos_mem_free(pWdaParams);
5015 pAddBAReqParams->status = eSIR_FAILURE;
5016 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5017 }
Jeff Johnson43971f52012-07-17 12:26:56 -07005018 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07005019}
Jeff Johnson295189b2012-06-20 16:38:30 -07005020/*
5021 * FUNCTION: WDA_AddBASessionReqCallback
5022 * send ADD BA SESSION RSP back to PE/(or TL)
5023 */
5024void WDA_AddBASessionReqCallback(
5025 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
5026{
5027 VOS_STATUS status = VOS_STATUS_SUCCESS ;
5028 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5029 tWDA_CbContext *pWDA;
5030 tAddBAParams *pAddBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005031 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5032 "<------ %s " ,__FUNCTION__);
5033 if(NULL == pWdaParams)
5034 {
5035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5036 "%s: pWdaParams received NULL", __FUNCTION__);
5037 VOS_ASSERT(0) ;
5038 return ;
5039 }
5040 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5041 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005042 if( NULL == pAddBAReqParams )
5043 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005044 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5045 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
5046 VOS_ASSERT( 0 );
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07005047 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5048 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005049 return ;
5050 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005051 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5052 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005053 /*
5054 * if WDA in update TL state, update TL with BA session parama and send
5055 * another request to HAL(/WDI) (ADD_BA_REQ)
5056 */
5057
5058 if((VOS_STATUS_SUCCESS ==
5059 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
5060 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
5061 {
5062 /* Update TL with BA info received from HAL/WDI */
5063 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
5064 wdiAddBaSession->usBaSessionID,
5065 wdiAddBaSession->ucSTAIdx,
5066 wdiAddBaSession->ucBaTID,
5067 wdiAddBaSession->ucBaBufferSize,
5068 wdiAddBaSession->ucWinSize,
5069 wdiAddBaSession->usBaSSN );
Jeff Johnson295189b2012-06-20 16:38:30 -07005070 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5071 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5072 }
5073 else
5074 {
5075 pAddBAReqParams->status =
5076 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5077
5078 /* Setting Flag to indicate that Set BA is success */
5079 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5080 {
5081 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5082 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5083 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5084 }
5085 pWDA->wdaMsgParam = NULL;
5086 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5087 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005088 /*Reset the WDA state to READY */
5089 pWDA->wdaState = WDA_READY_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005090 return ;
5091}
5092
Jeff Johnson295189b2012-06-20 16:38:30 -07005093/*
5094 * FUNCTION: WDA_ProcessAddBASessionReq
5095 * Request to WDI to Update the ADDBA REQ params.
5096 */
5097VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5098 tAddBAParams *pAddBAReqParams)
5099{
5100 WDI_Status status = WDI_STATUS_SUCCESS ;
5101 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5102 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5103 sizeof(WDI_AddBASessionReqParamsType)) ;
5104 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005105 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5106 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005107 if(NULL == wdiAddBASessionReqParam)
5108 {
5109 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5110 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5111 VOS_ASSERT(0);
5112 return VOS_STATUS_E_NOMEM;
5113 }
5114 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5115 if(NULL == pWdaParams)
5116 {
5117 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5118 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5119 VOS_ASSERT(0);
5120 vos_mem_free(wdiAddBASessionReqParam);
5121 return VOS_STATUS_E_NOMEM;
5122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005123 /*
5124 * Populate ADD BA parameters and pass these paarmeters to WDI.
5125 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5126 * the state to track if these is BA recipient case or BA initiator
5127 * case.
5128 */
5129 do
5130 {
5131 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5132 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5133 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5134 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5135 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5136 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5137 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005138 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
Jeff Johnson295189b2012-06-20 16:38:30 -07005139 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5140 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5141 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5142 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5143 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005144 /* check the BA direction and update state accordingly */
5145 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5146 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5147 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5148
5149 }while(0) ;
5150 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005151 pWdaParams->pWdaContext = pWDA;
5152 /* Store ADD BA pointer, as this will be used for response */
5153 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5154 /* store Params pass it to WDI */
5155 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005156 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5157 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005158 if(IS_WDI_STATUS_FAILURE(status))
5159 {
5160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5161 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5162 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5163 vos_mem_free(pWdaParams->wdaMsgParam);
5164 vos_mem_free(pWdaParams);
5165 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005166 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005167}
Jeff Johnson295189b2012-06-20 16:38:30 -07005168/*
5169 * FUNCTION: WDA_DelBANotifyTL
5170 * send DEL BA IND to TL
5171 */
5172void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5173 tDelBAParams *pDelBAReqParams)
5174{
5175 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5176 //tSirMsgQ msg;
5177 vos_msg_t vosMsg;
5178 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005179 if(NULL == pDelBAInd)
5180 {
5181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5183 VOS_ASSERT(0) ;
5184 return;
5185 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005186 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5187 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5188 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5189 pDelBAInd->mesgLen = sizeof( tDelBAInd );
Jeff Johnsone7245742012-09-05 17:12:55 -07005190
Jeff Johnson295189b2012-06-20 16:38:30 -07005191
5192 vosMsg.type = WDA_DELETEBA_IND;
5193 vosMsg.bodyptr = pDelBAInd;
5194 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5195 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5196 {
5197 vosStatus = VOS_STATUS_E_BADMSG;
5198 }
5199}
Jeff Johnson295189b2012-06-20 16:38:30 -07005200/*
5201 * FUNCTION: WDA_DelBAReqCallback
5202 * send DEL BA RSP back to PE
5203 */
5204void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5205{
5206 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5207 tWDA_CbContext *pWDA;
5208 tDelBAParams *pDelBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07005209 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5210 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005211 if(NULL == pWdaParams)
5212 {
5213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5214 "%s: pWdaParams received NULL", __FUNCTION__);
5215 VOS_ASSERT(0) ;
5216 return ;
5217 }
5218 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5219 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 /* Notify TL about DEL BA in case of recipinet */
5221 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5222 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5223 {
5224 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5225 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005226 /*
5227 * No respone required for WDA_DELBA_IND so just free the request
5228 * param here
5229 */
5230 vos_mem_free(pDelBAReqParams);
5231 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5232 vos_mem_free(pWdaParams);
5233 return ;
5234}
5235
Jeff Johnson295189b2012-06-20 16:38:30 -07005236/*
5237 * FUNCTION: WDA_ProcessDelBAReq
5238 * Request to WDI to Update the DELBA REQ params.
5239 */
5240VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5241 tDelBAParams *pDelBAReqParams)
5242{
5243 WDI_Status status = WDI_STATUS_SUCCESS ;
5244 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5245 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5246 sizeof(WDI_DelBAReqParamsType)) ;
5247 tWDA_ReqParams *pWdaParams ;
5248 tANI_U16 staIdx = 0;
5249 tANI_U8 tid = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5251 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005252 if(NULL == wdiDelBAReqParam)
5253 {
5254 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5255 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5256 VOS_ASSERT(0);
5257 return VOS_STATUS_E_NOMEM;
5258 }
5259 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5260 if(NULL == pWdaParams)
5261 {
5262 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5263 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5264 VOS_ASSERT(0);
5265 vos_mem_free(wdiDelBAReqParam);
5266 return VOS_STATUS_E_NOMEM;
5267 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005268 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5269 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5270 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5271 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005272 pWdaParams->pWdaContext = pWDA;
5273 /* Store DEL BA pointer, as this will be used for response */
5274 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005275 /* store Params pass it to WDI */
5276 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005277 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5278 * maintained in WDA, so that WDA can retry for another BA session
5279 */
5280 staIdx = pDelBAReqParams->staIdx;
5281 tid = pDelBAReqParams->baTID;
5282 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
Jeff Johnson295189b2012-06-20 16:38:30 -07005283 status = WDI_DelBAReq(wdiDelBAReqParam,
5284 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005285 if(IS_WDI_STATUS_FAILURE(status))
5286 {
5287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5288 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5289 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5290 vos_mem_free(pWdaParams->wdaMsgParam);
5291 vos_mem_free(pWdaParams);
5292 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005293 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005294}
Jeff Johnson295189b2012-06-20 16:38:30 -07005295/*
5296 * FUNCTION: WDA_AddTSReqCallback
5297 * send ADD TS RSP back to PE
5298 */
5299void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5300{
5301 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5302 tWDA_CbContext *pWDA;
5303 tAddTsParams *pAddTsReqParams;
5304
5305 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5306 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005307 if(NULL == pWdaParams)
5308 {
5309 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5310 "%s: pWdaParams received NULL", __FUNCTION__);
5311 VOS_ASSERT(0) ;
5312 return ;
5313 }
5314 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5315 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5316 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5317 vos_mem_free(pWdaParams);
5318
5319 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005320 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005321 return ;
5322}
5323
Jeff Johnson295189b2012-06-20 16:38:30 -07005324/*
5325 * FUNCTION: WDA_ProcessAddTSReq
5326 * Request to WDI to Update the ADD TS REQ params.
5327 */
5328VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5329 tAddTsParams *pAddTsReqParams)
5330{
5331 WDI_Status status = WDI_STATUS_SUCCESS ;
5332 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5333 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5334 sizeof(WDI_AddTSReqParamsType)) ;
5335 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005336 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5337 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005338 if(NULL == wdiAddTSReqParam)
5339 {
5340 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5341 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5342 VOS_ASSERT(0);
5343 return VOS_STATUS_E_NOMEM;
5344 }
5345 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5346 if(NULL == pWdaParams)
5347 {
5348 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5349 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5350 VOS_ASSERT(0);
5351 vos_mem_free(wdiAddTSReqParam);
5352 return VOS_STATUS_E_NOMEM;
5353 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005354 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5355 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005356 //TS IE
5357 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5358 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5359 pAddTsReqParams->tspec.length;
5360
5361 //TS IE : TS INFO : TRAFFIC
5362 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5363 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5364 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5365 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5366 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5367 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5368 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5369 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5370 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5371 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5372 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5373 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5374 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5375 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5376 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5377 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5378
5379 //TS IE : TS INFO : SCHEDULE
5380 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5381 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5382 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5383 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
Jeff Johnson295189b2012-06-20 16:38:30 -07005384 //TS IE
5385 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5386 pAddTsReqParams->tspec.nomMsduSz;
5387 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5388 pAddTsReqParams->tspec.maxMsduSz;
5389 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5390 pAddTsReqParams->tspec.minSvcInterval;
5391 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5392 pAddTsReqParams->tspec.maxSvcInterval;
5393 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5394 pAddTsReqParams->tspec.inactInterval;
5395 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5396 pAddTsReqParams->tspec.suspendInterval;
5397 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5398 pAddTsReqParams->tspec.svcStartTime;
5399 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5400 pAddTsReqParams->tspec.minDataRate;
5401 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5402 pAddTsReqParams->tspec.meanDataRate;
5403 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5404 pAddTsReqParams->tspec.peakDataRate;
5405 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5406 pAddTsReqParams->tspec.maxBurstSz;
5407 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5408 pAddTsReqParams->tspec.delayBound;
5409 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5410 pAddTsReqParams->tspec.minPhyRate;
5411 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5412 pAddTsReqParams->tspec.surplusBw;
5413 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5414 pAddTsReqParams->tspec.mediumTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07005415 /* TODO: tAddTsParams doesn't have the following fields */
5416#if 0
5417 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5418 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5419 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5420 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5421#endif
5422 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5423
5424 pWdaParams->pWdaContext = pWDA;
5425 /* Store ADD TS pointer, as this will be used for response */
5426 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005427 /* store Params pass it to WDI */
5428 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005429 status = WDI_AddTSReq(wdiAddTSReqParam,
5430 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005431 if(IS_WDI_STATUS_FAILURE(status))
5432 {
5433 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5434 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5435 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5436 vos_mem_free(pWdaParams);
5437 pAddTsReqParams->status = eSIR_FAILURE ;
5438 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5439 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005440 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005441}
5442
Jeff Johnson295189b2012-06-20 16:38:30 -07005443/*
5444 * FUNCTION: WDA_DelTSReqCallback
5445 * send DEL TS RSP back to PE
5446 */
5447void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5448{
5449 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5451 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005452 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5453 vos_mem_free(pWdaParams->wdaMsgParam) ;
5454 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005455 /*
5456 * No respone required for WDA_DEL_TS_REQ so just free the request
5457 * param here
5458 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005459 return ;
5460}
5461
Jeff Johnson295189b2012-06-20 16:38:30 -07005462/*
5463 * FUNCTION: WDA_ProcessDelTSReq
5464 * Request to WDI to Update the DELTS REQ params.
5465 */
5466VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5467 tDelTsParams *pDelTSReqParams)
5468{
5469 WDI_Status status = WDI_STATUS_SUCCESS ;
5470 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5471 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5472 sizeof(WDI_DelTSReqParamsType)) ;
5473 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005474 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5475 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005476 if(NULL == wdiDelTSReqParam)
5477 {
5478 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5479 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5480 VOS_ASSERT(0);
5481 return VOS_STATUS_E_NOMEM;
5482 }
5483 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5484 if(NULL == pWdaParams)
5485 {
5486 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5487 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5488 VOS_ASSERT(0);
5489 vos_mem_free(wdiDelTSReqParam);
5490 return VOS_STATUS_E_NOMEM;
5491 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005492 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
5493 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
5494 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
5495 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
5496 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005497 pWdaParams->pWdaContext = pWDA;
5498 /* Store DEL TS pointer, as this will be used for response */
5499 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005500 /* store Params pass it to WDI */
5501 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005502 status = WDI_DelTSReq(wdiDelTSReqParam,
5503 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005504 if(IS_WDI_STATUS_FAILURE(status))
5505 {
5506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5507 "Failure in DEL TS REQ Params WDI API, free all the memory " );
5508 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5509 vos_mem_free(pWdaParams->wdaMsgParam);
5510 vos_mem_free(pWdaParams);
5511 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005512 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005513}
Jeff Johnson295189b2012-06-20 16:38:30 -07005514/*
5515 * FUNCTION: WDA_UpdateBeaconParamsCallback
5516 * Free the memory. No need to send any response to PE in this case
5517 */
5518void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
5519{
5520 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005521 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5522 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005523 if(NULL == pWdaParams)
5524 {
5525 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5526 "%s: pWdaParams received NULL", __FUNCTION__);
5527 VOS_ASSERT(0) ;
5528 return ;
5529 }
5530 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5531 vos_mem_free(pWdaParams->wdaMsgParam) ;
5532 vos_mem_free(pWdaParams);
5533 /*
5534 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
5535 * param here
5536 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005537 return ;
5538}
Jeff Johnson295189b2012-06-20 16:38:30 -07005539/*
5540 * FUNCTION: WDA_ProcessUpdateBeaconParams
5541 * Request to WDI to send the beacon parameters to HAL to update the Hardware
5542 */
5543VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
5544 tUpdateBeaconParams *pUpdateBeaconParams)
5545{
5546 WDI_Status status = WDI_STATUS_SUCCESS ;
5547 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
5548 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
5549 sizeof(WDI_UpdateBeaconParamsType)) ;
5550 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005551 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5552 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005553 if(NULL == wdiUpdateBeaconParams)
5554 {
5555 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5556 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5557 VOS_ASSERT(0);
5558 return VOS_STATUS_E_NOMEM;
5559 }
5560 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5561 if(NULL == pWdaParams)
5562 {
5563 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5564 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5565 VOS_ASSERT(0);
5566 vos_mem_free(wdiUpdateBeaconParams);
5567 return VOS_STATUS_E_NOMEM;
5568 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005569 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
5570 pUpdateBeaconParams->bssIdx;
5571 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
5572 pUpdateBeaconParams->fShortPreamble;
5573 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
5574 pUpdateBeaconParams->fShortSlotTime;
5575 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
5576 pUpdateBeaconParams->beaconInterval;
5577 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
5578 pUpdateBeaconParams->llaCoexist;
5579 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
5580 pUpdateBeaconParams->llbCoexist;
5581 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
5582 pUpdateBeaconParams->llgCoexist;
5583 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
5584 pUpdateBeaconParams->ht20MhzCoexist;
5585 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
5586 pUpdateBeaconParams->llnNonGFCoexist;
5587 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
5588 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
5589 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
5590 pUpdateBeaconParams->fRIFSMode;
5591 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
5592 pUpdateBeaconParams->paramChangeBitmap;
5593 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
5594
5595 pWdaParams->pWdaContext = pWDA;
5596 /* Store UpdateBeacon Req pointer, as this will be used for response */
5597 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005598 /* store Params pass it to WDI */
5599 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005600 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
5601 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
5602 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005603 if(IS_WDI_STATUS_FAILURE(status))
5604 {
5605 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5606 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
5607 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5608 vos_mem_free(pWdaParams->wdaMsgParam);
5609 vos_mem_free(pWdaParams);
5610 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005611 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005612}
Jeff Johnson295189b2012-06-20 16:38:30 -07005613#ifdef FEATURE_WLAN_CCX
Jeff Johnson295189b2012-06-20 16:38:30 -07005614/*
5615 * FUNCTION: WDA_TSMStatsReqCallback
5616 * send TSM Stats RSP back to PE
5617 */
5618void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
5619{
5620 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5621 tWDA_CbContext *pWDA = NULL;
5622 tTSMStats *pTsmRspParams = NULL;
5623
5624 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5625 "<------ Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005626 if(NULL == pWdaParams)
5627 {
5628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5629 "%s: pWdaParams received NULL", __FUNCTION__);
5630 VOS_ASSERT(0) ;
5631 return ;
5632 }
5633 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5634 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005635 if( NULL == pTsmRspParams )
5636 {
5637 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5638 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
5639 VOS_ASSERT( 0 );
5640 return ;
5641 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005642 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5643 vos_mem_free(pWdaParams);
5644
5645 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
5646 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
5647 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
5648 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
5649 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
5650 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
5651 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
5652 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
5653 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
5654 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
Jeff Johnson295189b2012-06-20 16:38:30 -07005655 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005656 return ;
5657}
5658
5659
Jeff Johnson295189b2012-06-20 16:38:30 -07005660/*
5661 * FUNCTION: WDA_ProcessTsmStatsReq
5662 * Request to WDI to get the TSM Stats params.
5663 */
5664VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
5665 tTSMStats *pTsmStats)
5666{
5667 WDI_Status status = WDI_STATUS_SUCCESS ;
5668 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
5669 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005670 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5671 "------> Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005672 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5673 {
5674 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5675 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5676 VOS_ASSERT(0);
5677 return VOS_STATUS_E_FAILURE;
5678 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005679 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
5680 sizeof(WDI_TSMStatsReqParamsType));
5681 if(NULL == wdiTSMReqParam)
5682 {
5683 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5684 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5685 VOS_ASSERT(0);
5686 return VOS_STATUS_E_NOMEM;
5687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005688 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5689 if(NULL == pWdaParams)
5690 {
5691 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5692 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5693 VOS_ASSERT(0);
5694 vos_mem_free(wdiTSMReqParam);
5695 return VOS_STATUS_E_NOMEM;
5696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005697 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
5698 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
5699 pTsmStats->bssId,
5700 sizeof(wpt_macAddr));
5701 wdiTSMReqParam->wdiReqStatusCB = NULL ;
5702
5703 pWdaParams->pWdaContext = pWDA;
5704 /* Store TSM Stats pointer, as this will be used for response */
5705 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005706 /* store Params pass it to WDI */
5707 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005708 status = WDI_TSMStatsReq(wdiTSMReqParam,
5709 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005710 if(IS_WDI_STATUS_FAILURE(status))
5711 {
5712 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5713 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
5714 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5715 vos_mem_free(pWdaParams) ;
5716 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005717 return CONVERT_WDI2VOS_STATUS(status) ;
5718}
5719#endif
5720/*
5721 * FUNCTION: WDA_SendBeaconParamsCallback
5722 * No need to send any response to PE in this case
5723 */
5724void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
5725{
5726
Jeff Johnson295189b2012-06-20 16:38:30 -07005727 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5728 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005729 return ;
5730}
Jeff Johnson295189b2012-06-20 16:38:30 -07005731/*
5732 * FUNCTION: WDA_ProcessSendBeacon
5733 * Request to WDI to send the beacon template to HAL to update the TPE memory and
5734 * start beacon trasmission
5735 */
5736VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
5737 tSendbeaconParams *pSendbeaconParams)
5738{
5739 WDI_Status status = WDI_STATUS_SUCCESS ;
5740 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005741 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5742 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005743 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
5744 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
5745 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
5746 pSendbeaconParams->beaconLength;
5747#ifdef WLAN_SOFTAP_FEATURE
5748 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
5749 pSendbeaconParams->timIeOffset;
5750#endif
5751#ifdef WLAN_FEATURE_P2P
5752 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
5753 pSendbeaconParams->p2pIeOffset;
5754#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005755 /* Copy the beacon template to local buffer */
5756 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
5757 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
5758 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
5759
Jeff Johnson295189b2012-06-20 16:38:30 -07005760 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
5761 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005762 if(IS_WDI_STATUS_FAILURE(status))
5763 {
5764 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5765 "Failure in SEND BEACON REQ Params WDI API" );
5766 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005767 vos_mem_free(pSendbeaconParams);
5768 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005769}
Jeff Johnson295189b2012-06-20 16:38:30 -07005770/*
5771 * FUNCTION: WDA_UpdateProbeRspParamsCallback
5772 * No need to send any response to PE in this case
5773 */
5774void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
5775{
Jeff Johnson295189b2012-06-20 16:38:30 -07005776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5777 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005778 return ;
5779}
5780
Jeff Johnson295189b2012-06-20 16:38:30 -07005781/*
5782 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
5783 * Request to WDI to send the probe response template to HAL to update the TPE memory and
5784 * send probe response
5785 */
5786VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
5787 tSendProbeRespParams *pSendProbeRspParams)
5788{
5789 WDI_Status status = WDI_STATUS_SUCCESS ;
5790 WDI_UpdateProbeRspTemplateParamsType wdiSendProbeRspParam;
5791 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5792 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005793 /*Copy update probe response parameters*/
5794 vos_mem_copy(wdiSendProbeRspParam.wdiProbeRspTemplateInfo.macBSSID,
5795 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
5796 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
5797 pSendProbeRspParams->probeRespTemplateLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07005798 /* Copy the Probe Response template to local buffer */
5799 vos_mem_copy(
5800 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.pProbeRespTemplate,
5801 pSendProbeRspParams->pProbeRespTemplate,
5802 pSendProbeRspParams->probeRespTemplateLen);
5803 vos_mem_copy(
5804 wdiSendProbeRspParam.wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
5805 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
5806 WDI_PROBE_REQ_BITMAP_IE_LEN);
5807
5808 wdiSendProbeRspParam.wdiReqStatusCB = NULL ;
5809
Jeff Johnson295189b2012-06-20 16:38:30 -07005810 status = WDI_UpdateProbeRspTemplateReq(&wdiSendProbeRspParam,
5811 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005812 if(IS_WDI_STATUS_FAILURE(status))
5813 {
5814 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5815 "Failure in SEND Probe RSP Params WDI API" );
5816 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005817 vos_mem_free(pSendProbeRspParams);
5818 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005819}
Jeff Johnson295189b2012-06-20 16:38:30 -07005820#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
5821/*
5822 * FUNCTION: WDA_SetMaxTxPowerCallBack
5823 * send the response to PE with power value received from WDI
5824 */
5825void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
5826 void* pUserData)
5827{
5828 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5829 tWDA_CbContext *pWDA = NULL;
5830 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
5831
5832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5833 "<------ %s " ,__FUNCTION__);
5834 if(NULL == pWdaParams)
5835 {
5836 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5837 "%s: pWdaParams received NULL", __FUNCTION__);
5838 VOS_ASSERT(0) ;
5839 return ;
5840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005841 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5842 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005843 if( NULL == pMaxTxPowerParams )
5844 {
5845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5846 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07005847 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07005848 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5849 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 return ;
5851 }
Jeff Johnsone7245742012-09-05 17:12:55 -07005852
Jeff Johnson295189b2012-06-20 16:38:30 -07005853
5854 /*need to free memory for the pointers used in the
5855 WDA Process.Set Max Tx Power Req function*/
Jeff Johnson295189b2012-06-20 16:38:30 -07005856 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5857 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005858 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
Jeff Johnsone7245742012-09-05 17:12:55 -07005859
Jeff Johnson295189b2012-06-20 16:38:30 -07005860
5861 /* send response to UMAC*/
5862 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
5863
5864 return;
5865}
Jeff Johnson295189b2012-06-20 16:38:30 -07005866/*
5867 * FUNCTION: WDA_SetMaxTxPowerCallBack
5868 * Request to WDI to send set Max Tx Power Request
5869 */
5870 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
5871 tMaxTxPowerParams *MaxTxPowerParams)
5872{
5873 WDI_Status status = WDI_STATUS_SUCCESS;
5874 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
5875 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005876 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5877 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005878 if((NULL != pWDA->wdaMsgParam) ||(NULL != pWDA->wdaWdiApiMsgParam))
5879 {
5880 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5881 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5882 VOS_ASSERT(0);
5883 return VOS_STATUS_E_FAILURE;
5884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005885 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
5886 sizeof(WDI_SetMaxTxPowerParamsType));
5887 if(NULL == wdiSetMaxTxPowerParams)
5888 {
5889 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5890 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5891 VOS_ASSERT(0);
5892 return VOS_STATUS_E_NOMEM;
5893 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005894 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5895 if(NULL == pWdaParams)
5896 {
5897 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5898 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5899 vos_mem_free(wdiSetMaxTxPowerParams);
5900 VOS_ASSERT(0);
5901 return VOS_STATUS_E_NOMEM;
5902 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005903 /* Copy.Max.Tx.Power Params to WDI structure */
5904 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
5905 MaxTxPowerParams->bssId,
5906 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005907 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
5908 MaxTxPowerParams->selfStaMacAddr,
5909 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005910 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
5911 MaxTxPowerParams->power;
Jeff Johnson295189b2012-06-20 16:38:30 -07005912 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005913 pWdaParams->pWdaContext = pWDA;
5914 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005915 /* store Params pass it to WDI */
5916 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005917 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
5918 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005919 if(IS_WDI_STATUS_FAILURE(status))
5920 {
5921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5922 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
5923 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5924 vos_mem_free(pWdaParams);
5925 }
5926 return CONVERT_WDI2VOS_STATUS(status);
5927
5928}
Jeff Johnson295189b2012-06-20 16:38:30 -07005929#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005930#ifdef WLAN_FEATURE_P2P
Jeff Johnson295189b2012-06-20 16:38:30 -07005931/*
5932 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
5933 * Free the memory. No need to send any response to PE in this case
5934 */
5935void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
5936{
5937 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005938 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5939 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005940 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
5941 pWDA->wdaWdiApiMsgParam = NULL;
5942 vos_mem_free(pWDA->wdaMsgParam) ;
5943 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005944 /*
5945 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
5946 * so just free the request param here
5947 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005948 return ;
5949}
5950
Jeff Johnson295189b2012-06-20 16:38:30 -07005951/*
5952 * FUNCTION: WDA_ProcessSetP2PGONOAReq
5953 * Request to WDI to set the P2P Group Owner Notice of Absence Req
5954 */
5955VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
5956 tP2pPsParams *pP2pPsConfigParams)
5957{
5958 WDI_Status status = WDI_STATUS_SUCCESS ;
5959 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
5960 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
5961 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005962 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5963 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005964 if(NULL == wdiSetP2PGONOAReqParam)
5965 {
5966 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5967 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5968 VOS_ASSERT(0);
5969 return VOS_STATUS_E_NOMEM;
5970 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005971 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
5972 pP2pPsConfigParams->opp_ps;
5973 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
5974 pP2pPsConfigParams->ctWindow;
5975 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
5976 pP2pPsConfigParams->count;
5977 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
5978 pP2pPsConfigParams->duration;
5979 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
5980 pP2pPsConfigParams->interval;
5981 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
5982 pP2pPsConfigParams->single_noa_duration;
5983 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
5984 pP2pPsConfigParams->psSelection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005985 if((NULL != pWDA->wdaMsgParam) ||
5986 (NULL != pWDA->wdaWdiApiMsgParam))
5987 {
5988 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5989 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5990 VOS_ASSERT(0);
5991 vos_mem_free(wdiSetP2PGONOAReqParam);
5992 return VOS_STATUS_E_FAILURE;
5993 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005994 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
5995 /* Store msg pointer from PE, as this will be used for response */
5996 pWDA->wdaMsgParam = (void *)pP2pPsConfigParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005997 /* store Params pass it to WDI */
5998 pWDA->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005999 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
6000 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006001 if(IS_WDI_STATUS_FAILURE(status))
6002 {
6003 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6004 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
6005 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6006 vos_mem_free(pWDA->wdaMsgParam);
6007 pWDA->wdaWdiApiMsgParam = NULL;
6008 pWDA->wdaMsgParam = NULL;
6009 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006010 return CONVERT_WDI2VOS_STATUS(status);
6011
Jeff Johnson295189b2012-06-20 16:38:30 -07006012}
6013#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006014#ifdef WLAN_FEATURE_VOWIFI_11R
6015/*
6016 * FUNCTION: WDA_AggrAddTSReqCallback
6017 * send ADD AGGREGATED TS RSP back to PE
6018 */
6019void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
6020{
6021 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
6022 tAggrAddTsParams *pAggrAddTsReqParams =
6023 (tAggrAddTsParams *)pWDA->wdaMsgParam ;
6024 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6026 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006027 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6028 pWDA->wdaWdiApiMsgParam = NULL;
6029 pWDA->wdaMsgParam = NULL;
6030
6031 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
6032 {
6033 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
6034 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006035 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006036 return ;
6037}/* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07006038/*
6039 * FUNCTION: WDA_ProcessAddTSReq
6040 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
6041 */
6042VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
6043 tAggrAddTsParams *pAggrAddTsReqParams)
6044{
6045 WDI_Status status = WDI_STATUS_SUCCESS ;
6046 int i;
6047 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6049 "------> %s " ,__FUNCTION__);
6050 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
6051 {
6052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6053 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6054 VOS_ASSERT(0);
6055 return VOS_STATUS_E_FAILURE;
6056 }
6057
6058 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
6059 sizeof(WDI_AggrAddTSReqParamsType)) ;
6060 if(NULL == wdiAggrAddTSReqParam)
6061 {
6062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6063 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6064 VOS_ASSERT(0);
6065 return VOS_STATUS_E_NOMEM;
6066 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006067 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6068 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6069 pAggrAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006070 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6071 {
6072 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6073 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6074 pAggrAddTsReqParams->tspec[i].length;
Jeff Johnson295189b2012-06-20 16:38:30 -07006075 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6076 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6077 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6078 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6079 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6080 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6081 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6082 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6083 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6084 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6085 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6086 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6087 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6088 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6089 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6090 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
Jeff Johnson295189b2012-06-20 16:38:30 -07006091 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6092 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
Jeff Johnson295189b2012-06-20 16:38:30 -07006093 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6094 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6095 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6096 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6097 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6098 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6099 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6100 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6101 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6102 pAggrAddTsReqParams->tspec[i].inactInterval;
6103 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6104 pAggrAddTsReqParams->tspec[i].suspendInterval;
6105 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6106 pAggrAddTsReqParams->tspec[i].svcStartTime;
6107 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6108 pAggrAddTsReqParams->tspec[i].minDataRate;
6109 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6110 pAggrAddTsReqParams->tspec[i].meanDataRate;
6111 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6112 pAggrAddTsReqParams->tspec[i].peakDataRate;
6113 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6114 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6115 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6116 pAggrAddTsReqParams->tspec[i].delayBound;
6117 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6118 pAggrAddTsReqParams->tspec[i].minPhyRate;
6119 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6120 pAggrAddTsReqParams->tspec[i].surplusBw;
6121 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6122 pAggrAddTsReqParams->tspec[i].mediumTime;
6123 }
6124
6125 /* TODO: tAggrAddTsParams doesn't have the following fields */
6126#if 0
6127 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6128 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6129 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6130 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6131#endif
6132 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6133
6134 /* Store ADD TS pointer, as this will be used for response */
6135 pWDA->wdaMsgParam = (void *)pAggrAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006136 /* store Params pass it to WDI */
6137 pWDA->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006138 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
6139 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006140 if(IS_WDI_STATUS_FAILURE(status))
6141 {
6142 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6143 "Failure in ADD TS REQ Params WDI API, free all the memory " );
6144 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6145 vos_mem_free(pWDA->wdaMsgParam);
6146 pWDA->wdaWdiApiMsgParam = NULL;
6147 pWDA->wdaMsgParam = NULL;
6148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006149 return CONVERT_WDI2VOS_STATUS(status) ;
6150}
6151#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006152/*
6153 * FUNCTION: WDA_EnterImpsReqCallback
6154 * send Enter IMPS RSP back to PE
6155 */
6156void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6157{
6158 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006159 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6160 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006161 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006162 return ;
6163}
Jeff Johnson295189b2012-06-20 16:38:30 -07006164/*
6165 * FUNCTION: WDA_ProcessEnterImpsReq
6166 * Request to WDI to Enter IMPS power state.
6167 */
6168VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6169{
6170 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006171 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6172 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006173 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006174 if(IS_WDI_STATUS_FAILURE(status))
6175 {
6176 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6177 "Failure in Enter IMPS REQ WDI API, free all the memory " );
6178 pWDA->wdaWdiApiMsgParam = NULL;
6179 pWDA->wdaMsgParam = NULL;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006180 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006181 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006182 return CONVERT_WDI2VOS_STATUS(status) ;
6183}
Jeff Johnson295189b2012-06-20 16:38:30 -07006184/*
6185 * FUNCTION: WDA_ExitImpsReqCallback
6186 * send Exit IMPS RSP back to PE
6187 */
6188void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6189{
6190 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006191 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6192 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006193 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006194 return ;
6195}
Jeff Johnson295189b2012-06-20 16:38:30 -07006196/*
6197 * FUNCTION: WDA_ProcessExitImpsReq
6198 * Request to WDI to Exit IMPS power state.
6199 */
6200VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6201{
6202 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006203 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6204 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006205 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006206 if(IS_WDI_STATUS_FAILURE(status))
6207 {
6208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6209 "Failure in Exit IMPS REQ WDI API, free all the memory " );
6210 pWDA->wdaWdiApiMsgParam = NULL;
6211 pWDA->wdaMsgParam = NULL;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006212 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006214 return CONVERT_WDI2VOS_STATUS(status) ;
6215}
Jeff Johnson295189b2012-06-20 16:38:30 -07006216/*
6217 * FUNCTION: WDA_EnterBmpsReqCallback
6218 * send Enter BMPS RSP back to PE
6219 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006220void WDA_EnterBmpsReqCallback(WDI_EnterBmpsRspParamsType *pwdiEnterBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006221{
6222 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6223 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006224 tEnterBmpsParams *pEnterBmpsRspParams;
6225
Jeff Johnson295189b2012-06-20 16:38:30 -07006226 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6227 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006228 if(NULL == pWdaParams)
6229 {
6230 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6231 "%s: pWdaParams received NULL", __FUNCTION__);
6232 VOS_ASSERT(0) ;
6233 return ;
6234 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006235
6236 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6237 pEnterBmpsRspParams = (tEnterBmpsParams *)pWdaParams->wdaMsgParam;
6238
6239 pEnterBmpsRspParams->bssIdx = pwdiEnterBmpsRsp->bssIdx;
6240 pEnterBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterBmpsRsp->wdiStatus);
6241
6242 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006243 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006244 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, (void *)pEnterBmpsRspParams , 0);
6245
Jeff Johnson295189b2012-06-20 16:38:30 -07006246 return ;
6247}
Jeff Johnson295189b2012-06-20 16:38:30 -07006248/*
6249 * FUNCTION: WDA_ProcessEnterBmpsReq
6250 * Request to WDI to Enter BMPS power state.
6251 */
6252VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6253 tEnterBmpsParams *pEnterBmpsReqParams)
6254{
6255 WDI_Status status = WDI_STATUS_SUCCESS;
6256 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6257 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6259 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006260 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6261 {
6262 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6263 "%s: invalid param", __FUNCTION__);
6264 VOS_ASSERT(0);
6265 return VOS_STATUS_E_FAILURE;
6266 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006267 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6268 if (NULL == wdiEnterBmpsReqParams)
6269 {
6270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6271 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6272 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006273 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6274 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006275 return VOS_STATUS_E_NOMEM;
6276 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006277 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6278 if (NULL == pWdaParams)
6279 {
6280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6281 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6282 VOS_ASSERT(0);
6283 vos_mem_free(wdiEnterBmpsReqParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006284 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6285 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006286 return VOS_STATUS_E_NOMEM;
6287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006288 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6289 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6290 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6291 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
Jeff Johnson295189b2012-06-20 16:38:30 -07006292 // For CCX and 11R Roaming
6293 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6294 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6295 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6296 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006297
Jeff Johnson295189b2012-06-20 16:38:30 -07006298 /* Store param pointer as passed in by caller */
6299 /* store Params pass it to WDI */
6300 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006301 pWdaParams->wdaMsgParam = pEnterBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006302 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006303 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6304 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006305 if (IS_WDI_STATUS_FAILURE(status))
6306 {
6307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6308 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6309 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6310 vos_mem_free(pWdaParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006311 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006312 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006313 return CONVERT_WDI2VOS_STATUS(status);
6314}
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006315
6316
6317static void WDA_SendExitBmpsRsp(tWDA_CbContext *pWDA,
6318 WDI_Status wdiStatus,
6319 tExitBmpsParams *pExitBmpsReqParams)
6320{
6321 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
6322
6323 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
6324}
6325
6326
Jeff Johnson295189b2012-06-20 16:38:30 -07006327/*
6328 * FUNCTION: WDA_ExitBmpsReqCallback
6329 * send Exit BMPS RSP back to PE
6330 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006331void WDA_ExitBmpsReqCallback(WDI_ExitBmpsRspParamsType *pwdiExitBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006332{
6333 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6334 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006335 tExitBmpsParams *pExitBmpsRspParams;
6336
Jeff Johnson295189b2012-06-20 16:38:30 -07006337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6338 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006339 if(NULL == pWdaParams)
6340 {
6341 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6342 "%s: pWdaParams received NULL", __FUNCTION__);
6343 VOS_ASSERT(0) ;
6344 return ;
6345 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006346
6347 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6348 pExitBmpsRspParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam;
6349
6350 pExitBmpsRspParams->bssIdx = pwdiExitBmpsRsp->bssIdx;
6351 pExitBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitBmpsRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006352
Jeff Johnson295189b2012-06-20 16:38:30 -07006353 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6354 vos_mem_free(pWdaParams) ;
6355
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006356 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006357 return ;
6358}
Jeff Johnson295189b2012-06-20 16:38:30 -07006359/*
6360 * FUNCTION: WDA_ProcessExitBmpsReq
6361 * Request to WDI to Exit BMPS power state.
6362 */
6363VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
6364 tExitBmpsParams *pExitBmpsReqParams)
6365{
6366 WDI_Status status = WDI_STATUS_SUCCESS ;
6367 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
6368 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
6369 sizeof(WDI_ExitBmpsReqParamsType)) ;
6370 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006371 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6372 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006373 if(NULL == wdiExitBmpsReqParams)
6374 {
6375 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6376 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6377 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006378 WDA_SendExitBmpsRsp(pWDA, WDI_STATUS_MEM_FAILURE, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006379 return VOS_STATUS_E_NOMEM;
6380 }
6381 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6382 if(NULL == pWdaParams)
6383 {
6384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6385 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6386 VOS_ASSERT(0);
6387 vos_mem_free(wdiExitBmpsReqParams);
6388 return VOS_STATUS_E_NOMEM;
6389 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006390 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
Jeff Johnsone7245742012-09-05 17:12:55 -07006391
6392 wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
6393
Jeff Johnson295189b2012-06-20 16:38:30 -07006394 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
6395
6396 /* Store param pointer as passed in by caller */
6397 /* store Params pass it to WDI */
6398 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
6399 pWdaParams->pWdaContext = pWDA;
6400 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006401 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
6402 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006403 if(IS_WDI_STATUS_FAILURE(status))
6404 {
6405 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6406 "Failure in Exit BMPS REQ WDI API, free all the memory " );
6407 vos_mem_free(pWdaParams->wdaMsgParam) ;
6408 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6409 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006410 WDA_SendExitBmpsRsp(pWDA, status, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006411 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006412 return CONVERT_WDI2VOS_STATUS(status) ;
6413}
Jeff Johnson295189b2012-06-20 16:38:30 -07006414/*
6415 * FUNCTION: WDA_EnterUapsdReqCallback
6416 * send Enter UAPSD RSP back to PE
6417 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006418void WDA_EnterUapsdReqCallback( WDI_EnterUapsdRspParamsType *pwdiEnterUapsdRspParams, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006419{
6420 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6421 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006422 tUapsdParams *pEnterUapsdRsqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6424 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006425 if(NULL == pWdaParams)
6426 {
6427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6428 "%s: pWdaParams received NULL", __FUNCTION__);
6429 VOS_ASSERT(0) ;
6430 return ;
6431 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006432
6433 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6434 pEnterUapsdRsqParams = (tUapsdParams *)pWdaParams->wdaMsgParam;
6435
6436 pEnterUapsdRsqParams->bssIdx = pwdiEnterUapsdRspParams->bssIdx;
6437 pEnterUapsdRsqParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterUapsdRspParams->wdiStatus);
6438
Jeff Johnson295189b2012-06-20 16:38:30 -07006439 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6440 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006441 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdRsqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006442 return ;
6443}
Jeff Johnson295189b2012-06-20 16:38:30 -07006444/*
6445 * FUNCTION: WDA_ProcessEnterUapsdReq
6446 * Request to WDI to Enter UAPSD power state.
6447 */
6448VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
6449 tUapsdParams *pEnterUapsdReqParams)
6450{
6451 WDI_Status status = WDI_STATUS_SUCCESS ;
6452 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
6453 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
6454 sizeof(WDI_EnterUapsdReqParamsType)) ;
6455 tWDA_ReqParams *pWdaParams ;
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 == wdiEnterUapsdReqParams)
6459 {
6460 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6461 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6462 VOS_ASSERT(0);
6463 return VOS_STATUS_E_NOMEM;
6464 }
6465 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6466 if(NULL == pWdaParams)
6467 {
6468 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6469 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6470 VOS_ASSERT(0);
6471 vos_mem_free(wdiEnterUapsdReqParams);
6472 return VOS_STATUS_E_NOMEM;
6473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006474 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
6475 pEnterUapsdReqParams->beDeliveryEnabled;
6476 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
6477 pEnterUapsdReqParams->beTriggerEnabled;
6478 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
6479 pEnterUapsdReqParams->bkDeliveryEnabled;
6480 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
6481 pEnterUapsdReqParams->bkTriggerEnabled;
6482 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
6483 pEnterUapsdReqParams->viDeliveryEnabled;
6484 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
6485 pEnterUapsdReqParams->viTriggerEnabled;
6486 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
6487 pEnterUapsdReqParams->voDeliveryEnabled;
6488 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
6489 pEnterUapsdReqParams->voTriggerEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07006490 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006491
6492 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
6493
Jeff Johnson295189b2012-06-20 16:38:30 -07006494 /* Store param pointer as passed in by caller */
6495 /* store Params pass it to WDI */
6496 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
6497 pWdaParams->pWdaContext = pWDA;
6498 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006499 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
6500 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006501 if(IS_WDI_STATUS_FAILURE(status))
6502 {
6503 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6504 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
6505 vos_mem_free(pWdaParams->wdaMsgParam) ;
6506 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6507 vos_mem_free(pWdaParams) ;
6508 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006509 return CONVERT_WDI2VOS_STATUS(status) ;
6510}
Jeff Johnson295189b2012-06-20 16:38:30 -07006511/*
6512 * FUNCTION: WDA_ExitUapsdReqCallback
6513 * send Exit UAPSD RSP back to PE
6514 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006515void WDA_ExitUapsdReqCallback(WDI_ExitUapsdRspParamsType *pwdiExitRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006516{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006517
6518 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6519 tWDA_CbContext *pWDA;
6520 tExitUapsdParams *pExitUapsdRspParams;
6521
Jeff Johnson295189b2012-06-20 16:38:30 -07006522 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6523 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006524 if(NULL == pWdaParams)
6525 {
6526 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6527 "%s: pWdaParams received NULL", __FUNCTION__);
6528 VOS_ASSERT(0);
6529 return;
6530 }
6531
6532 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6533 pExitUapsdRspParams = (tExitUapsdParams *)pWdaParams->wdaMsgParam;
6534
6535 pExitUapsdRspParams->bssIdx = pwdiExitRspParam->bssIdx;
6536 pExitUapsdRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitRspParam->wdiStatus);
6537
6538 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6539 vos_mem_free(pWdaParams) ;
6540
6541 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, (void *)pExitUapsdRspParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006542 return ;
6543}
Jeff Johnson295189b2012-06-20 16:38:30 -07006544/*
6545 * FUNCTION: WDA_ProcessExitUapsdReq
6546 * Request to WDI to Exit UAPSD power state.
6547 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006548VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA,
6549 tExitUapsdParams *pExitUapsdParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07006550{
6551 WDI_Status status = WDI_STATUS_SUCCESS ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006552 tWDA_ReqParams *pWdaParams ;
6553 WDI_ExitUapsdReqParamsType *wdiExitUapsdReqParams =
6554 (WDI_ExitUapsdReqParamsType *)vos_mem_malloc(
6555 sizeof(WDI_ExitUapsdReqParamsType)) ;
6556
Jeff Johnson295189b2012-06-20 16:38:30 -07006557 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6558 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006559
6560 if(NULL == wdiExitUapsdReqParams)
6561 {
6562 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6563 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6564 VOS_ASSERT(0);
6565 return VOS_STATUS_E_NOMEM;
6566 }
6567 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6568 if(NULL == pWdaParams)
6569 {
6570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6571 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6572 VOS_ASSERT(0);
6573 vos_mem_free(wdiExitUapsdReqParams);
6574 return VOS_STATUS_E_NOMEM;
6575 }
6576
6577 wdiExitUapsdReqParams->wdiExitUapsdInfo.bssIdx = pExitUapsdParams->bssIdx;
6578 wdiExitUapsdReqParams->wdiReqStatusCB = NULL;
6579
6580 /* Store param pointer as passed in by caller */
6581 /* store Params pass it to WDI */
6582 pWdaParams->wdaWdiApiMsgParam = wdiExitUapsdReqParams;
6583 pWdaParams->pWdaContext = pWDA;
6584 pWdaParams->wdaMsgParam = pExitUapsdParams;
6585
6586 status = WDI_ExitUapsdReq(wdiExitUapsdReqParams, (WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006587 if(IS_WDI_STATUS_FAILURE(status))
6588 {
6589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6590 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006591 vos_mem_free(pWdaParams->wdaMsgParam) ;
6592 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6593 vos_mem_free(pWdaParams) ;
6594
Jeff Johnson295189b2012-06-20 16:38:30 -07006595 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006596 return CONVERT_WDI2VOS_STATUS(status) ;
6597}
6598
Jeff Johnson295189b2012-06-20 16:38:30 -07006599/*
6600 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
6601 *
6602 */
6603void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
6604{
6605 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006606 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6607 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006608 if(NULL == pWdaParams)
6609 {
6610 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6611 "%s: pWdaParams received NULL", __FUNCTION__);
6612 VOS_ASSERT(0) ;
6613 return ;
6614 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006615 if( pWdaParams != NULL )
6616 {
6617 if( pWdaParams->wdaWdiApiMsgParam != NULL )
6618 {
6619 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6620 }
6621 if( pWdaParams->wdaMsgParam != NULL )
6622 {
6623 vos_mem_free(pWdaParams->wdaMsgParam) ;
6624 }
6625 vos_mem_free(pWdaParams) ;
6626 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006627 return ;
6628}
Jeff Johnson295189b2012-06-20 16:38:30 -07006629/*
6630 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
6631 * Request to WDI to set the power save params at start.
6632 */
6633VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
6634 tSirPowerSaveCfg *pPowerSaveCfg)
6635{
6636 WDI_Status status = WDI_STATUS_SUCCESS ;
6637 tHalCfg *tlvStruct = NULL ;
6638 tANI_U8 *tlvStructStart = NULL ;
6639 v_PVOID_t *configParam;
6640 tANI_U32 configParamSize;
6641 tANI_U32 *configDataValue;
6642 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
6643 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006644 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6645 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006646 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
6647 {
6648 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6649 "%s: invalid param", __FUNCTION__);
6650 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006651 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006652 return VOS_STATUS_E_FAILURE;
6653 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006654 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
6655 if (NULL == wdiPowerSaveCfg)
6656 {
6657 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6658 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6659 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006660 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006661 return VOS_STATUS_E_NOMEM;
6662 }
6663 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6664 if(NULL == pWdaParams)
6665 {
6666 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6667 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6668 VOS_ASSERT(0);
6669 vos_mem_free(wdiPowerSaveCfg);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006670 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006671 return VOS_STATUS_E_NOMEM;
6672 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006673 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
6674 configParam = vos_mem_malloc(configParamSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07006675 if(NULL == configParam)
6676 {
6677 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6678 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006679 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006680 vos_mem_free(pWdaParams);
6681 vos_mem_free(wdiPowerSaveCfg);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006682 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006683 return VOS_STATUS_E_NOMEM;
6684 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006685 vos_mem_set(configParam, configParamSize, 0);
6686 wdiPowerSaveCfg->pConfigBuffer = configParam;
6687 tlvStruct = (tHalCfg *)configParam;
6688 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006689 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
6690 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
6691 tlvStruct->length = sizeof(tANI_U32);
6692 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6693 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006694 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6695 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006696 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
6697 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
6698 tlvStruct->length = sizeof(tANI_U32);
6699 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6700 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07006701 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6702 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006703 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
6704 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
6705 tlvStruct->length = sizeof(tANI_U32);
6706 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6707 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
Jeff Johnson295189b2012-06-20 16:38:30 -07006708 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6709 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006710 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
6711 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
6712 tlvStruct->length = sizeof(tANI_U32);
6713 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6714 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07006715 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6716 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006717 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
6718 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
6719 tlvStruct->length = sizeof(tANI_U32);
6720 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6721 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
Jeff Johnson295189b2012-06-20 16:38:30 -07006722 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6723 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006724 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
6725 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
6726 tlvStruct->length = sizeof(tANI_U32);
6727 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6728 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07006729 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6730 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006731 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
6732 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
6733 tlvStruct->length = sizeof(tANI_U32);
6734 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6735 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006736 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6737 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006738 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
6739 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
6740 tlvStruct->length = sizeof(tANI_U32);
6741 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6742 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
6743 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6744 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006745 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
6746 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
6747 tlvStruct->length = sizeof(tANI_U32);
6748 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6749 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
6750 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6751 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006752 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
6753 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
6754 tlvStruct->length = sizeof(tANI_U32);
6755 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6756 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
Jeff Johnson295189b2012-06-20 16:38:30 -07006757 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6758 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006759 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
6760 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
6761 tlvStruct->length = sizeof(tANI_U32);
6762 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6763 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -07006764 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6765 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006766 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006767 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006768 /* store Params pass it to WDI */
6769 pWdaParams->wdaMsgParam = configParam;
6770 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
6771 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006772 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
6773 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006774 if(IS_WDI_STATUS_FAILURE(status))
6775 {
6776 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6777 "Failure in Set Pwr Save CFG REQ WDI API, free all the memory " );
6778 vos_mem_free(pWdaParams->wdaMsgParam);
6779 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6780 vos_mem_free(pWdaParams);
6781 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006782 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006783 return CONVERT_WDI2VOS_STATUS(status);
6784}
Jeff Johnson295189b2012-06-20 16:38:30 -07006785/*
6786 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
6787 *
6788 */
6789void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
6790{
6791 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006792 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6793 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006794 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6795 vos_mem_free(pWdaParams);
6796
Jeff Johnson295189b2012-06-20 16:38:30 -07006797 return ;
6798}
Jeff Johnson295189b2012-06-20 16:38:30 -07006799/*
6800 * FUNCTION: WDA_SetUapsdAcParamsReq
6801 * Request to WDI to set the UAPSD params for an ac (sta mode).
6802 */
6803VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
6804 tUapsdInfo *pUapsdInfo)
6805{
6806 WDI_Status status = WDI_STATUS_SUCCESS;
6807 tWDA_CbContext *pWDA = NULL ;
6808 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
6809 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
6810 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
6811 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6813 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006814 if(NULL == wdiUapsdParams)
6815 {
6816 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6817 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6818 VOS_ASSERT(0);
6819 return VOS_STATUS_E_NOMEM;
6820 }
6821 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6822 if(NULL == pWdaParams)
6823 {
6824 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6825 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6826 VOS_ASSERT(0);
6827 vos_mem_free(wdiUapsdParams);
6828 return VOS_STATUS_E_NOMEM;
6829 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006830 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
6831 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
6832 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
6833 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
6834 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
6835 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
Jeff Johnson295189b2012-06-20 16:38:30 -07006836 wdiUapsdParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006837 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07006838 pWdaParams->pWdaContext = pWDA;
6839 /* Store param pointer as passed in by caller */
6840 pWdaParams->wdaMsgParam = pUapsdInfo;
6841 /* store Params pass it to WDI */
6842 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006843 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
6844 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
6845 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006846 if(IS_WDI_STATUS_FAILURE(status))
6847 {
6848 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6849 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
6850 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6851 vos_mem_free(pWdaParams);
6852 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006853 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
6854 return VOS_STATUS_SUCCESS;
6855 else
6856 return VOS_STATUS_E_FAILURE;
6857
Jeff Johnson295189b2012-06-20 16:38:30 -07006858}
6859/*
6860 * FUNCTION: WDA_ClearUapsdAcParamsReq
6861 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
6862 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
6863 * and again enter the UPASD with the modified params. Hence the disable
6864 * function was kept empty.
6865 *
6866 */
6867VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
6868{
6869 /* do nothing */
6870 return VOS_STATUS_SUCCESS;
6871}
Jeff Johnson295189b2012-06-20 16:38:30 -07006872/*
6873 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
6874 *
6875 */
6876void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
6877{
6878 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006879 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6880 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006881 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6882 pWDA->wdaWdiApiMsgParam = NULL;
6883 pWDA->wdaMsgParam = NULL;
6884
Jeff Johnson295189b2012-06-20 16:38:30 -07006885 //print a msg, nothing else to do
6886 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6887 "WDA_UpdateUapsdParamsReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006888 return ;
6889}
Jeff Johnson295189b2012-06-20 16:38:30 -07006890/*
6891 * FUNCTION: WDA_UpdateUapsdParamsReq
6892 * Request to WDI to update UAPSD params (in softAP mode) for a station.
6893 */
6894VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
6895 tUpdateUapsdParams* pUpdateUapsdInfo)
6896{
6897 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006898 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006899 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
6900 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
6901 sizeof(WDI_UpdateUapsdReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006902 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6903 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006904 if(NULL == wdiUpdateUapsdParams)
6905 {
6906 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6907 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6908 VOS_ASSERT(0);
6909 return VOS_STATUS_E_NOMEM;
6910 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006911 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
6912 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
6913 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07006914 if((NULL != pWDA->wdaMsgParam) ||
6915 (NULL != pWDA->wdaWdiApiMsgParam))
6916 {
6917 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6918 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
6919 vos_mem_free(wdiUpdateUapsdParams);
6920 VOS_ASSERT(0);
6921 return VOS_STATUS_E_FAILURE;
6922 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006923 /* Store param pointer as passed in by caller */
6924 pWDA->wdaMsgParam = pUpdateUapsdInfo;
6925 /* store Params pass it to WDI */
6926 pWDA->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07006927 wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
6928 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006929
Jeff Johnson43971f52012-07-17 12:26:56 -07006930 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07006931 {
6932 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6933 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07006934 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006935 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
6936 vos_mem_free(pWDA->wdaMsgParam);
6937 pWDA->wdaWdiApiMsgParam = NULL;
6938 pWDA->wdaMsgParam = NULL;
6939 }
Jeff Johnson43971f52012-07-17 12:26:56 -07006940 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006941}
Jeff Johnson295189b2012-06-20 16:38:30 -07006942/*
6943 * FUNCTION: WDA_ConfigureRxpFilterCallback
6944 *
6945 */
6946void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
6947{
6948 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006949 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6950 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006951 if(WDI_STATUS_SUCCESS != wdiStatus)
6952 {
6953 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6954 "%s: RXP config filter failure \n", __FUNCTION__ );
6955 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006956 if(NULL == pWdaParams)
6957 {
6958 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6959 "%s: pWdaParams received NULL", __FUNCTION__);
6960 VOS_ASSERT(0) ;
6961 return ;
6962 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006963 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6964 vos_mem_free(pWdaParams->wdaMsgParam);
6965 vos_mem_free(pWdaParams);
6966 return ;
6967}
Jeff Johnson295189b2012-06-20 16:38:30 -07006968/*
6969 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
6970 *
6971 */
6972VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
6973 tSirWlanSetRxpFilters *pWlanSuspendParam)
6974{
Jeff Johnson295189b2012-06-20 16:38:30 -07006975 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006976 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006977 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
6978 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
6979 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
6980 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006981 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6982 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006983 if(NULL == wdiRxpFilterParams)
6984 {
6985 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6986 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6987 VOS_ASSERT(0);
6988 vos_mem_free(pWlanSuspendParam);
6989 return VOS_STATUS_E_NOMEM;
6990 }
6991 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6992 if(NULL == pWdaParams)
6993 {
6994 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6995 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6996 VOS_ASSERT(0);
6997 vos_mem_free(wdiRxpFilterParams);
6998 vos_mem_free(pWlanSuspendParam);
6999 return VOS_STATUS_E_NOMEM;
7000 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007001 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
7002 pWlanSuspendParam->setMcstBcstFilter;
7003 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
7004 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7005
7006 wdiRxpFilterParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007007 pWdaParams->pWdaContext = pWDA;
7008 pWdaParams->wdaMsgParam = pWlanSuspendParam;
7009 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007010 wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07007011 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
7012 pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007013 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007014 {
7015 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7016 "Failure in configure RXP filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007017 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007018 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7019 vos_mem_free(pWdaParams->wdaMsgParam);
7020 vos_mem_free(pWdaParams);
7021 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007022 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007023}
Jeff Johnson295189b2012-06-20 16:38:30 -07007024/*
7025 * FUNCTION: WDA_WdiIndicationCallback
7026 *
7027 */
7028void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
7029 void* pUserData)
7030{
7031 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7032 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007033}
Jeff Johnson295189b2012-06-20 16:38:30 -07007034/*
7035 * FUNCTION: WDA_ProcessWlanSuspendInd
7036 *
7037 */
7038VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
7039 tSirWlanSuspendParam *pWlanSuspendParam)
7040{
7041 WDI_Status wdiStatus;
7042 WDI_SuspendParamsType wdiSuspendParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007043 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7044 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007045 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
7046 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7047 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
7048 wdiSuspendParams.pUserData = pWDA;
7049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
Jeff Johnson295189b2012-06-20 16:38:30 -07007050 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
7051 if(WDI_STATUS_PENDING == wdiStatus)
7052 {
7053 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7054 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -07007055 }
7056 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
7057 {
7058 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7059 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
7060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007061 vos_mem_free(pWlanSuspendParam);
7062 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7063}
7064
Jeff Johnson295189b2012-06-20 16:38:30 -07007065/*
7066 * FUNCTION: WDA_ProcessWlanResumeCallback
7067 *
7068 */
7069void WDA_ProcessWlanResumeCallback(
7070 WDI_SuspendResumeRspParamsType *resumeRspParams,
7071 void* pUserData)
7072{
7073 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7075 "<------ %s " ,__FUNCTION__);
7076 if(NULL == pWdaParams)
7077 {
7078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7079 "%s: pWdaParams received NULL", __FUNCTION__);
7080 VOS_ASSERT(0) ;
7081 return ;
7082 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007083 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
7084 {
7085 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7086 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
7087 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007088 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7089 vos_mem_free(pWdaParams->wdaMsgParam);
7090 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007091 return ;
7092}
Jeff Johnson295189b2012-06-20 16:38:30 -07007093/*
7094 * FUNCTION: WDA_ProcessWlanResumeReq
7095 *
7096 */
7097VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
7098 tSirWlanResumeParam *pWlanResumeParam)
7099{
7100 WDI_Status wdiStatus;
7101 WDI_ResumeParamsType *wdiResumeParams =
7102 (WDI_ResumeParamsType *)vos_mem_malloc(
7103 sizeof(WDI_ResumeParamsType) ) ;
7104 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007105 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7106 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007107 if(NULL == wdiResumeParams)
7108 {
7109 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7110 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7111 VOS_ASSERT(0);
7112 return VOS_STATUS_E_NOMEM;
7113 }
7114 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7115 if(NULL == pWdaParams)
7116 {
7117 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7118 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7119 VOS_ASSERT(0);
7120 vos_mem_free(wdiResumeParams);
7121 return VOS_STATUS_E_NOMEM;
7122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007123 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
7124 pWlanResumeParam->configuredMcstBcstFilterSetting;
Jeff Johnson295189b2012-06-20 16:38:30 -07007125 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
7126 wdiResumeParams->wdiReqStatusCB = NULL;
7127 pWdaParams->wdaMsgParam = pWlanResumeParam;
7128 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
7129 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07007130 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
7131 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
7132 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007133 if(IS_WDI_STATUS_FAILURE(wdiStatus))
7134 {
7135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7136 "Failure in Host Resume REQ WDI API, free all the memory " );
7137 VOS_ASSERT(0);
7138 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7139 vos_mem_free(pWdaParams->wdaMsgParam);
7140 vos_mem_free(pWdaParams);
7141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007142 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7143}
7144
Jeff Johnson295189b2012-06-20 16:38:30 -07007145/*
7146 * FUNCTION: WDA_SetBeaconFilterReqCallback
7147 *
7148 */
7149void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7150{
7151 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7153 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007154 if(NULL == pWdaParams)
7155 {
7156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7157 "%s: pWdaParams received NULL", __FUNCTION__);
7158 VOS_ASSERT(0) ;
7159 return ;
7160 }
7161
7162 vos_mem_free(pWdaParams->wdaMsgParam) ;
7163 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7164 vos_mem_free(pWdaParams) ;
7165 /*
7166 * No respone required for SetBeaconFilter req so just free the request
7167 * param here
7168 */
7169
Jeff Johnson295189b2012-06-20 16:38:30 -07007170 return ;
7171}
Jeff Johnson295189b2012-06-20 16:38:30 -07007172/*
7173 * FUNCTION: WDA_SetBeaconFilterReq
7174 * Request to WDI to send the beacon filtering related information.
7175 */
7176VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7177 tBeaconFilterMsg* pBeaconFilterInfo)
7178{
7179 WDI_Status status = WDI_STATUS_SUCCESS;
7180 tANI_U8 *dstPtr, *srcPtr;
7181 tANI_U8 filterLength;
7182 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7183 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7184 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7185 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7187 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007188 if(NULL == wdiBeaconFilterInfo)
7189 {
7190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7191 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7192 VOS_ASSERT(0);
7193 return VOS_STATUS_E_NOMEM;
7194 }
7195 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7196 if(NULL == pWdaParams)
7197 {
7198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7199 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7200 VOS_ASSERT(0);
7201 vos_mem_free(wdiBeaconFilterInfo);
7202 return VOS_STATUS_E_NOMEM;
7203 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007204 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7205 pBeaconFilterInfo->beaconInterval;
7206 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7207 pBeaconFilterInfo->capabilityInfo;
7208 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7209 pBeaconFilterInfo->capabilityMask;
7210 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -07007211
7212 //Fill the BssIdx
7213 wdiBeaconFilterInfo->wdiBeaconFilterInfo.bssIdx = pBeaconFilterInfo->bssIdx;
7214
Jeff Johnson295189b2012-06-20 16:38:30 -07007215 //Fill structure with info contained in the beaconFilterTable
7216 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7217 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7218 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7219 if(WDI_BEACON_FILTER_LEN < filterLength)
7220 {
7221 filterLength = WDI_BEACON_FILTER_LEN;
7222 }
7223 vos_mem_copy(dstPtr, srcPtr, filterLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07007224 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7225 /* Store param pointer as passed in by caller */
7226 /* store Params pass it to WDI */
7227 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7228 pWdaParams->pWdaContext = pWDA;
7229 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7230
Jeff Johnson295189b2012-06-20 16:38:30 -07007231 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7232 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007233 if(IS_WDI_STATUS_FAILURE(status))
7234 {
7235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7236 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7237 vos_mem_free(pWdaParams->wdaMsgParam) ;
7238 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7239 vos_mem_free(pWdaParams) ;
7240 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007241 return CONVERT_WDI2VOS_STATUS(status) ;
7242}
Jeff Johnson295189b2012-06-20 16:38:30 -07007243/*
7244 * FUNCTION: WDA_RemBeaconFilterReqCallback
7245 *
7246 */
7247void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7248{
7249 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7251 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007252 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7253 pWDA->wdaWdiApiMsgParam = NULL;
7254 pWDA->wdaMsgParam = NULL;
7255
Jeff Johnson295189b2012-06-20 16:38:30 -07007256 //print a msg, nothing else to do
7257 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7258 "WDA_RemBeaconFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007259 return ;
7260}
Jeff Johnson295189b2012-06-20 16:38:30 -07007261 // TODO: PE does not have this feature for now implemented,
7262 // but the support for removing beacon filter exists between
7263 // HAL and FW. This function can be called whenever PE defines
7264 // a new message for beacon filter removal
Jeff Johnson295189b2012-06-20 16:38:30 -07007265/*
7266 * FUNCTION: WDA_RemBeaconFilterReq
7267 * Request to WDI to send the removal of beacon filtering related information.
7268 */
7269VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
7270 tRemBeaconFilterMsg* pBeaconFilterInfo)
7271{
7272 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007273 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007274 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
7275 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
7276 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7278 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007279 if(NULL == wdiBeaconFilterInfo)
7280 {
7281 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7282 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7283 VOS_ASSERT(0);
7284 return VOS_STATUS_E_NOMEM;
7285 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007286 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
7287 pBeaconFilterInfo->ucIeCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07007288 //Fill structure with info contained in the ucRemIeId
7289 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
7290 pBeaconFilterInfo->ucRemIeId,
7291 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
7292 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007293 if((NULL != pWDA->wdaMsgParam) ||
7294 (NULL != pWDA->wdaWdiApiMsgParam))
7295 {
7296 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7297 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7298 vos_mem_free(wdiBeaconFilterInfo);
7299 VOS_ASSERT(0);
7300 return VOS_STATUS_E_FAILURE;
7301 }
7302
7303 /* Store param pointer as passed in by caller */
7304 pWDA->wdaMsgParam = pBeaconFilterInfo;
7305 /* store Params pass it to WDI */
7306 pWDA->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
Jeff Johnson43971f52012-07-17 12:26:56 -07007307 wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007308 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007309 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007310 {
7311 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7312 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007313 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007314 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7315 vos_mem_free(pWDA->wdaMsgParam);
7316 pWDA->wdaWdiApiMsgParam = NULL;
7317 pWDA->wdaMsgParam = NULL;
7318 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007319 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007320}
Jeff Johnson295189b2012-06-20 16:38:30 -07007321/*
7322 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
7323 *
7324 */
7325void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
7326{
7327 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007328 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7329 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007330 if(NULL == pWdaParams)
7331 {
7332 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7333 "%s: pWdaParams received NULL", __FUNCTION__);
7334 VOS_ASSERT(0) ;
7335 return ;
7336 }
7337
7338 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7339 vos_mem_free(pWdaParams) ;
7340
Jeff Johnson295189b2012-06-20 16:38:30 -07007341 return ;
7342}
Jeff Johnson295189b2012-06-20 16:38:30 -07007343/*
7344 * FUNCTION: WDA_SetRSSIThresholdsReq
7345 * Request to WDI to set the RSSI thresholds (sta mode).
7346 */
7347VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
7348{
7349 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007350 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007351 tWDA_CbContext *pWDA = NULL ;
7352 v_PVOID_t pVosContext = NULL;
7353 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
7354 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
7355 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
7356 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007357 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7358 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007359 if(NULL == wdiRSSIThresholdsInfo)
7360 {
7361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7362 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7363 VOS_ASSERT(0);
7364 return VOS_STATUS_E_NOMEM;
7365 }
7366 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7367 if(NULL == pWdaParams)
7368 {
7369 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7370 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7371 VOS_ASSERT(0);
7372 vos_mem_free(wdiRSSIThresholdsInfo);
7373 return VOS_STATUS_E_NOMEM;
7374 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007375 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
Jeff Johnson295189b2012-06-20 16:38:30 -07007376 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
7377 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
7378 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
Jeff Johnson295189b2012-06-20 16:38:30 -07007379 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
7380 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
7381 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007382 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
7383 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
7384 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007385 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007386 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
7387 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7388
Jeff Johnson295189b2012-06-20 16:38:30 -07007389 /* Store param pointer as passed in by caller */
7390 /* store Params pass it to WDI */
7391 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
7392 pWdaParams->pWdaContext = pWDA;
7393 pWdaParams->wdaMsgParam = pBmpsThresholds;
Jeff Johnson43971f52012-07-17 12:26:56 -07007394 wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007395 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007396 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007397 {
7398 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7399 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007400 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007401 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7402 vos_mem_free(pWdaParams) ;
7403 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007404 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007405
7406}/*WDA_SetRSSIThresholdsReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007407/*
7408 * FUNCTION: WDA_HostOffloadReqCallback
7409 *
7410 */
7411void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
7412{
7413 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7414
7415 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7416 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007417 if(NULL == pWdaParams)
7418 {
7419 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7420 "%s: pWdaParams received NULL", __FUNCTION__);
7421 VOS_ASSERT(0) ;
7422 return ;
7423 }
7424
7425 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7426 vos_mem_free(pWdaParams->wdaMsgParam);
7427 vos_mem_free(pWdaParams) ;
7428
7429 //print a msg, nothing else to do
7430 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7431 "WDA_HostOffloadReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007432 return ;
7433}
Jeff Johnson295189b2012-06-20 16:38:30 -07007434/*
7435 * FUNCTION: WDA_ProcessHostOffloadReq
7436 * Request to WDI to set the filter to minimize unnecessary host wakeup due
7437 * to broadcast traffic (sta mode).
7438 */
7439VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
7440 tSirHostOffloadReq *pHostOffloadParams)
7441{
7442 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007443 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007444 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
7445 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
7446 sizeof(WDI_HostOffloadReqParamsType)) ;
7447 tWDA_ReqParams *pWdaParams ;
7448
7449 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7450 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
7451
7452 if(NULL == wdiHostOffloadInfo)
7453 {
7454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7455 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7456 VOS_ASSERT(0);
7457 return VOS_STATUS_E_NOMEM;
7458 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007459 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7460 if(NULL == pWdaParams)
7461 {
7462 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7463 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7464 VOS_ASSERT(0);
7465 vos_mem_free(wdiHostOffloadInfo);
7466 return VOS_STATUS_E_NOMEM;
7467 }
7468
7469 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
7470 pHostOffloadParams->offloadType;
7471 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
7472 pHostOffloadParams->enableOrDisable;
7473
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007474 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.bssId,
7475 pHostOffloadParams->bssId, sizeof(wpt_macAddr));
7476
Jeff Johnson295189b2012-06-20 16:38:30 -07007477 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
7478 {
7479 case SIR_IPV4_ARP_REPLY_OFFLOAD:
7480 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
7481 pHostOffloadParams->params.hostIpv4Addr,
7482 4);
7483 break;
7484 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7485 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7486 pHostOffloadParams->params.hostIpv6Addr,
7487 16);
7488 break;
7489 case SIR_IPV6_NS_OFFLOAD:
7490 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7491 pHostOffloadParams->params.hostIpv6Addr,
7492 16);
7493
7494#ifdef WLAN_NS_OFFLOAD
7495 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
7496 {
7497 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
7498 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
7499 16);
7500 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
7501 }
7502 else
7503 {
7504 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
7505 }
7506
7507 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
7508 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
7509 16);
7510 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
7511 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
7512 6);
7513
7514 //Only two are supported so let's go through them without a loop
7515 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
7516 {
7517 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
7518 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
7519 16);
7520 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
7521 }
7522 else
7523 {
7524 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
7525 }
7526
7527 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
7528 {
7529 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
7530 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
7531 16);
7532 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
7533 }
7534 else
7535 {
7536 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
7537 }
7538 break;
7539#endif //WLAN_NS_OFFLOAD
7540 default:
7541 {
7542 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7543 "No Handling for Offload Type %x in WDA "
7544 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
7545 //WDA_VOS_ASSERT(0) ;
7546 }
7547 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007548 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007549 if((NULL != pWDA->wdaMsgParam) ||
7550 (NULL != pWDA->wdaWdiApiMsgParam))
7551 {
7552 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7553 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7554 VOS_ASSERT(0);
7555 vos_mem_free(wdiHostOffloadInfo);
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07007556 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007557 return VOS_STATUS_E_FAILURE;
7558 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007559 /* Store param pointer as passed in by caller */
7560 /* store Params pass it to WDI */
7561 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7562 pWdaParams->pWdaContext = pWDA;
7563 pWdaParams->wdaMsgParam = pHostOffloadParams;
7564
Jeff Johnson43971f52012-07-17 12:26:56 -07007565 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007566 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7567
Jeff Johnson43971f52012-07-17 12:26:56 -07007568 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007569 {
7570 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7571 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007572 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007573 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7574 vos_mem_free(pWdaParams->wdaMsgParam);
7575 vos_mem_free(pWdaParams) ;
7576 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007577 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007578
7579}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007580/*
7581 * FUNCTION: WDA_KeepAliveReqCallback
7582 *
7583 */
7584void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7585{
7586 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7588 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007589 vos_mem_free(pWDA->wdaWdiApiMsgParam);
7590 vos_mem_free(pWDA->wdaMsgParam);
7591 pWDA->wdaWdiApiMsgParam = NULL;
7592 pWDA->wdaMsgParam = NULL;
7593
Jeff Johnson295189b2012-06-20 16:38:30 -07007594 //print a msg, nothing else to do
7595 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7596 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007597 return ;
7598}
Jeff Johnson295189b2012-06-20 16:38:30 -07007599/*
7600 * FUNCTION: WDA_ProcessKeepAliveReq
7601 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7602 * wakeup due to broadcast traffic (sta mode).
7603 */
7604VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7605 tSirKeepAliveReq *pKeepAliveParams)
7606{
7607 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007608 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007609 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7610 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7611 sizeof(WDI_KeepAliveReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007612 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7613 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007614 if(NULL == wdiKeepAliveInfo)
7615 {
7616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7617 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7618 VOS_ASSERT(0);
7619 return VOS_STATUS_E_NOMEM;
7620 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007621 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7622 pKeepAliveParams->packetType;
7623 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7624 pKeepAliveParams->timePeriod;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007625
7626 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.bssId,
7627 pKeepAliveParams->bssId,
7628 sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007629
7630 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7631 {
7632 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7633 pKeepAliveParams->hostIpv4Addr,
7634 SIR_IPV4_ADDR_LEN);
7635 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7636 pKeepAliveParams->destIpv4Addr,
7637 SIR_IPV4_ADDR_LEN);
7638 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7639 pKeepAliveParams->destMacAddr,
7640 SIR_MAC_ADDR_LEN);
7641 }
7642 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7643 {
7644 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7645 SIR_IPV4_ADDR_LEN,
7646 0);
7647 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7648 SIR_IPV4_ADDR_LEN,
7649 0);
7650 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7651 SIR_MAC_ADDR_LEN,
7652 0);
7653 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007654 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007655 if((NULL != pWDA->wdaMsgParam) ||
7656 (NULL != pWDA->wdaWdiApiMsgParam))
7657 {
7658 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7659 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7660 VOS_ASSERT(0);
7661 vos_mem_free(wdiKeepAliveInfo);
7662 return VOS_STATUS_E_FAILURE;
7663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007664 /* Store param pointer as passed in by caller */
7665 pWDA->wdaMsgParam = pKeepAliveParams;
7666 /* store Params pass it to WDI */
7667 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007668 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7669 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7670 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7671 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7672 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7673 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7674 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7675 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7676 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7677 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7679 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7680 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7681 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7682 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7683 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7684 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7685 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7686 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7687 "TimePeriod %d PacketType %d",
7688 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7689 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007690 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007691 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007692 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007693 {
7694 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7695 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007696 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007697 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7698 vos_mem_free(pWDA->wdaMsgParam);
7699 pWDA->wdaWdiApiMsgParam = NULL;
7700 pWDA->wdaMsgParam = NULL;
7701 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007702 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007703
7704}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007705/*
7706 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7707 *
7708 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007709void WDA_WowlAddBcPtrnReqCallback(
7710 WDI_WowlAddBcPtrnRspParamsType *pWdiWowlAddBcstPtrRsp,
7711 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007712{
7713 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007714 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7715 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007716 if(NULL == pWdaParams)
7717 {
7718 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7719 "%s: pWdaParams received NULL", __FUNCTION__);
7720 VOS_ASSERT(0) ;
7721 return ;
7722 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007723 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7724 vos_mem_free(pWdaParams->wdaMsgParam);
7725 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007726 return ;
7727}
Jeff Johnson295189b2012-06-20 16:38:30 -07007728/*
7729 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7730 * Request to WDI to add WOWL Bcast pattern
7731 */
7732VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7733 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7734{
7735 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007736 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007737 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7738 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7739 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7740 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007741 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7742 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007743 if(NULL == wdiWowlAddBcPtrnInfo)
7744 {
7745 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7746 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7747 VOS_ASSERT(0);
7748 return VOS_STATUS_E_NOMEM;
7749 }
7750 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7751 if(NULL == pWdaParams)
7752 {
7753 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7754 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7755 VOS_ASSERT(0);
7756 vos_mem_free(wdiWowlAddBcPtrnInfo);
7757 return VOS_STATUS_E_NOMEM;
7758 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007759 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7760 pWowlAddBcPtrnParams->ucPatternId;
7761 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7762 pWowlAddBcPtrnParams->ucPatternByteOffset;
7763 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7764 pWowlAddBcPtrnParams->ucPatternMaskSize;
7765 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7766 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007767 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7768 {
7769 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7770 pWowlAddBcPtrnParams->ucPattern,
7771 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7772 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7773 pWowlAddBcPtrnParams->ucPatternMask,
7774 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7775 }
7776 else
7777 {
7778 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7779 pWowlAddBcPtrnParams->ucPattern,
7780 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7781 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7782 pWowlAddBcPtrnParams->ucPatternMask,
7783 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7784
7785 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7786 pWowlAddBcPtrnParams->ucPatternExt,
7787 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7788 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7789 pWowlAddBcPtrnParams->ucPatternMaskExt,
7790 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7791 }
7792
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007793 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.bssId,
7794 pWowlAddBcPtrnParams->bssId, sizeof(wpt_macAddr));
7795
Jeff Johnson295189b2012-06-20 16:38:30 -07007796 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007797 /* Store param pointer as passed in by caller */
7798 /* store Params pass it to WDI */
7799 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7800 pWdaParams->pWdaContext = pWDA;
7801 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007802 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007803 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007804 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007805 {
7806 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7807 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007808 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007809 vos_mem_free(pWdaParams->wdaMsgParam) ;
7810 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7811 vos_mem_free(pWdaParams) ;
7812 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007813 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007814
7815}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007816/*
7817 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7818 *
7819 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007820void WDA_WowlDelBcPtrnReqCallback(
7821 WDI_WowlDelBcPtrnRspParamsType *pWdiWowlDelBcstPtrRsp,
7822 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007823{
7824 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007825 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7826 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007827 if(NULL == pWdaParams)
7828 {
7829 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7830 "%s: pWdaParams received NULL", __FUNCTION__);
7831 VOS_ASSERT(0) ;
7832 return ;
7833 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007834 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7835 vos_mem_free(pWdaParams->wdaMsgParam);
7836 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007837 return ;
7838}
Jeff Johnson295189b2012-06-20 16:38:30 -07007839/*
7840 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7841 * Request to WDI to delete WOWL Bcast pattern
7842 */
7843VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7844 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7845{
7846 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007847 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007848 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7849 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7850 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7851 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007852 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7853 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007854 if(NULL == wdiWowlDelBcPtrnInfo)
7855 {
7856 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7857 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7858 VOS_ASSERT(0);
7859 return VOS_STATUS_E_NOMEM;
7860 }
7861 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7862 if(NULL == pWdaParams)
7863 {
7864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7865 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7866 VOS_ASSERT(0);
7867 vos_mem_free(wdiWowlDelBcPtrnInfo);
7868 return VOS_STATUS_E_NOMEM;
7869 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007870 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7871 pWowlDelBcPtrnParams->ucPatternId;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007872
7873 vos_mem_copy(wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.bssId,
7874 pWowlDelBcPtrnParams->bssId, sizeof(wpt_macAddr));
7875
Jeff Johnson295189b2012-06-20 16:38:30 -07007876 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007877 /* Store param pointer as passed in by caller */
7878 /* store Params pass it to WDI */
7879 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7880 pWdaParams->pWdaContext = pWDA;
7881 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007882 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007883 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007884 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007885 {
7886 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7887 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007888 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007889 vos_mem_free(pWdaParams->wdaMsgParam) ;
7890 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7891 vos_mem_free(pWdaParams) ;
7892 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007893 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007894
7895}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007896/*
7897 * FUNCTION: WDA_WowlEnterReqCallback
7898 *
7899 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007900void WDA_WowlEnterReqCallback(WDI_WowlEnterRspParamsType *pwdiWowlEnterRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007901{
7902 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7903 tWDA_CbContext *pWDA;
7904 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007905 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7906 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007907 if(NULL == pWdaParams)
7908 {
7909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7910 "%s: pWdaParams received NULL", __FUNCTION__);
7911 VOS_ASSERT(0) ;
7912 return ;
7913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007914 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7915 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
7916
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007917 pWowlEnterParams->bssIdx = pwdiWowlEnterRspParam->bssIdx;
7918
Jeff Johnson295189b2012-06-20 16:38:30 -07007919 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7920 vos_mem_free(pWdaParams) ;
7921
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007922 pWowlEnterParams->status =
7923 CONVERT_WDI2SIR_STATUS(pwdiWowlEnterRspParam->status);
Jeff Johnson295189b2012-06-20 16:38:30 -07007924 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007925 return ;
7926}
Jeff Johnson295189b2012-06-20 16:38:30 -07007927/*
7928 * FUNCTION: WDA_ProcessWowlEnterReq
7929 * Request to WDI to enter WOWL
7930 */
7931VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
7932 tSirHalWowlEnterParams *pWowlEnterParams)
7933{
7934 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007935 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007936 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
7937 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
7938 sizeof(WDI_WowlEnterReqParamsType)) ;
7939 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7941 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007942 if(NULL == wdiWowlEnterInfo)
7943 {
7944 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7945 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7946 VOS_ASSERT(0);
7947 return VOS_STATUS_E_NOMEM;
7948 }
7949 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7950 if(NULL == pWdaParams)
7951 {
7952 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7953 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7954 VOS_ASSERT(0);
7955 vos_mem_free(wdiWowlEnterInfo);
7956 return VOS_STATUS_E_NOMEM;
7957 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007958 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
7959 pWowlEnterParams->magicPtrn,
7960 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007961 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
7962 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007963 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
7964 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007965 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
7966 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007967 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
7968 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007969 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
7970 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007971 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
7972 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007973 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
7974 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07007975 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
7976 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07007977#ifdef WLAN_WAKEUP_EVENTS
7978 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
7979 pWowlEnterParams->ucWoWEAPIDRequestEnable;
7980
7981 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
7982 pWowlEnterParams->ucWoWEAPOL4WayEnable;
7983
7984 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
7985 pWowlEnterParams->ucWowNetScanOffloadMatch;
7986
7987 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
7988 pWowlEnterParams->ucWowGTKRekeyError;
7989
7990 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
7991 pWowlEnterParams->ucWoWBSSConnLoss;
7992#endif // WLAN_WAKEUP_EVENTS
7993
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007994 wdiWowlEnterInfo->wdiWowlEnterInfo.bssIdx =
7995 pWowlEnterParams->bssIdx;
7996
Jeff Johnson295189b2012-06-20 16:38:30 -07007997 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007998 /* Store param pointer as passed in by caller */
7999 /* store Params pass it to WDI */
8000 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
8001 pWdaParams->pWdaContext = pWDA;
8002 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008003 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07008004 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008005 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008006 {
8007 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8008 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008009 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008010 vos_mem_free(pWdaParams->wdaMsgParam) ;
8011 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8012 vos_mem_free(pWdaParams) ;
8013 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008014 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008015
8016}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008017/*
8018 * FUNCTION: WDA_WowlExitReqCallback
8019 *
8020 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008021void WDA_WowlExitReqCallback( WDI_WowlExitRspParamsType *pwdiWowlExitRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008022{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008023 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8024 tWDA_CbContext *pWDA;
8025 tSirHalWowlExitParams *pWowlExitParams;
8026 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8027 "<------ %s " ,__FUNCTION__);
8028 if(NULL == pWdaParams)
8029 {
8030 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8031 "%s: pWdaParams received NULL", __FUNCTION__);
8032 VOS_ASSERT(0) ;
8033 return ;
8034 }
8035 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8036 pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam ;
8037
8038 pWowlExitParams->bssIdx = pwdiWowlExitRsp->bssIdx;
8039 pWowlExitParams->status = CONVERT_WDI2SIR_STATUS(pwdiWowlExitRsp->status);
8040
8041 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8042 vos_mem_free(pWdaParams) ;
8043
Jeff Johnson295189b2012-06-20 16:38:30 -07008044 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8045 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008046 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008047 return ;
8048}
Jeff Johnson295189b2012-06-20 16:38:30 -07008049/*
8050 * FUNCTION: WDA_ProcessWowlExitReq
8051 * Request to WDI to add WOWL Bcast pattern
8052 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008053VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA,
8054 tSirHalWowlExitParams *pWowlExitParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07008055{
8056 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008057 WDI_Status wstatus;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008058 WDI_WowlExitReqParamsType *wdiWowlExitInfo =
8059 (WDI_WowlExitReqParamsType *)vos_mem_malloc(
8060 sizeof(WDI_WowlExitReqParamsType)) ;
8061 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8063 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008064 if(NULL == wdiWowlExitInfo)
8065 {
8066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8067 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8068 VOS_ASSERT(0);
8069 return VOS_STATUS_E_NOMEM;
8070 }
8071 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8072 if(NULL == pWdaParams)
8073 {
8074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8075 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8076 VOS_ASSERT(0);
8077 vos_mem_free(wdiWowlExitInfo);
8078 return VOS_STATUS_E_NOMEM;
8079 }
8080
8081 wdiWowlExitInfo->wdiWowlExitInfo.bssIdx =
8082 pWowlExitParams->bssIdx;
8083
8084 wdiWowlExitInfo->wdiReqStatusCB = NULL;
8085
8086 /* Store param pointer as passed in by caller */
8087 /* store Params pass it to WDI */
8088 pWdaParams->wdaWdiApiMsgParam = wdiWowlExitInfo;
8089 pWdaParams->pWdaContext = pWDA;
8090 pWdaParams->wdaMsgParam = pWowlExitParams;
8091
8092 wstatus = WDI_WowlExitReq(wdiWowlExitInfo,
8093 (WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008094
Jeff Johnson43971f52012-07-17 12:26:56 -07008095 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008096 {
8097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8098 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008099 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008100 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8101 vos_mem_free(pWdaParams->wdaMsgParam);
8102 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008103 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008104 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008105}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008106/*
8107 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
8108 * Request to WDI to determine whether a given station is capable of
8109 * using HW-based frame translation
8110 */
8111v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
8112 tANI_U8 staIdx)
8113{
8114 return WDI_IsHwFrameTxTranslationCapable(staIdx);
8115}
Jeff Johnson295189b2012-06-20 16:38:30 -07008116/*
8117 * FUNCTION: WDA_NvDownloadReqCallback
8118 * send NV Download RSP back to PE
8119 */
8120void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
8121 void* pUserData)
8122{
Jeff Johnson295189b2012-06-20 16:38:30 -07008123 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008124 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8125 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008126 /*Cleaning */
8127 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8128 pWDA->wdaWdiApiMsgParam = NULL;
8129 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008130 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008131 return ;
8132}
Jeff Johnson295189b2012-06-20 16:38:30 -07008133/*
8134 * FUNCTION: WDA_ProcessNvDownloadReq
8135 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
8136 */
8137VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
8138{
8139 /* Initialize the local Variables*/
8140 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8141 v_VOID_t *pNvBuffer=NULL;
8142 v_SIZE_t bufferSize = 0;
8143 WDI_Status status = WDI_STATUS_E_FAILURE;
8144 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8146 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008147 if(NULL == pWDA)
8148 {
8149 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8150 "%s:pWDA is NULL", __FUNCTION__);
8151 return VOS_STATUS_E_FAILURE;
8152 }
8153 if(NULL != pWDA->wdaWdiApiMsgParam)
8154 {
8155 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8156 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8157 return VOS_STATUS_E_FAILURE;
8158 }
8159
8160 /* Get the NV structure base address and size from VOS */
8161 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07008162 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
8163 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008164 if(NULL == wdiNvDownloadReqParam)
8165 {
8166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8167 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8168 VOS_ASSERT(0);
8169 return VOS_STATUS_E_NOMEM;
8170 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008171 /* Copy Params to wdiNvDownloadReqParam*/
8172 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
8173 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07008174 /* store Params pass it to WDI */
8175 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008176 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008177 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
8178 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008179 if(IS_WDI_STATUS_FAILURE(status))
8180 {
8181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8182 "Failure in NV Download REQ Params WDI API, free all the memory " );
8183 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8184 pWDA->wdaWdiApiMsgParam = NULL;
8185 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008186 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008187}
8188/*
8189 * FUNCTION: WDA_FlushAcReqCallback
8190 * send Flush AC RSP back to TL
8191 */
8192void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
8193{
8194 vos_msg_t wdaMsg = {0} ;
8195 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8196 tFlushACReq *pFlushACReqParams;
8197 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07008198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8199 "<------ %s " ,__FUNCTION__);
8200 if(NULL == pWdaParams)
8201 {
8202 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8203 "%s: pWdaParams received NULL", __FUNCTION__);
8204 VOS_ASSERT(0) ;
8205 return ;
8206 }
8207
8208 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
8209 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
8210 if(NULL == pFlushACRspParams)
8211 {
8212 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8213 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8214 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07008215 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008216 return ;
8217 }
8218 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
8219 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
8220 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
8221 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
8222 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
8223 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008224 vos_mem_free(pWdaParams->wdaMsgParam) ;
8225 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8226 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008227 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8228 wdaMsg.bodyptr = (void *)pFlushACRspParams;
8229 // POST message to TL
8230 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
8231
Jeff Johnson295189b2012-06-20 16:38:30 -07008232 return ;
8233}
Jeff Johnson295189b2012-06-20 16:38:30 -07008234/*
8235 * FUNCTION: WDA_ProcessFlushAcReq
8236 * Request to WDI to Update the DELBA REQ params.
8237 */
8238VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8239 tFlushACReq *pFlushAcReqParams)
8240{
8241 WDI_Status status = WDI_STATUS_SUCCESS ;
8242 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8243 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8244 sizeof(WDI_FlushAcReqParamsType)) ;
8245 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008246 if(NULL == wdiFlushAcReqParam)
8247 {
8248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8249 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8250 VOS_ASSERT(0);
8251 return VOS_STATUS_E_NOMEM;
8252 }
8253 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8254 if(NULL == pWdaParams)
8255 {
8256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8257 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8258 VOS_ASSERT(0);
8259 vos_mem_free(wdiFlushAcReqParam);
8260 return VOS_STATUS_E_NOMEM;
8261 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008262 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8263 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008264 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8265 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8266 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8267 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008268 /* Store Flush AC pointer, as this will be used for response */
8269 /* store Params pass it to WDI */
8270 pWdaParams->pWdaContext = pWDA;
8271 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8272 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008273 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8274 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008275 if(IS_WDI_STATUS_FAILURE(status))
8276 {
8277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8278 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8279 vos_mem_free(pWdaParams->wdaMsgParam) ;
8280 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8281 vos_mem_free(pWdaParams) ;
8282 //TODO: respond to TL with failure
8283 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008284 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008285}
Jeff Johnson295189b2012-06-20 16:38:30 -07008286/*
8287 * FUNCTION: WDA_BtAmpEventReqCallback
8288 *
8289 */
8290void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8291{
8292 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8293 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008294 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008295
8296 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8297 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008298 if(NULL == pWdaParams)
8299 {
8300 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8301 "%s: pWdaParams received NULL", __FUNCTION__);
8302 VOS_ASSERT(0) ;
8303 return ;
8304 }
8305 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8306 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8307 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8308 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8309 {
8310 pWDA->wdaAmpSessionOn = VOS_FALSE;
8311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008312 vos_mem_free(pWdaParams->wdaMsgParam) ;
8313 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8314 vos_mem_free(pWdaParams) ;
8315 /*
8316 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8317 * param here
8318 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008319 return ;
8320}
8321
Jeff Johnson295189b2012-06-20 16:38:30 -07008322/*
8323 * FUNCTION: WDA_ProcessBtAmpEventReq
8324 * Request to WDI to Update with BT AMP events.
8325 */
8326VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8327 tSmeBtAmpEvent *pBtAmpEventParams)
8328{
8329 WDI_Status status = WDI_STATUS_SUCCESS ;
8330 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8331 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8332 sizeof(WDI_BtAmpEventParamsType)) ;
8333 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008334 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8335 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008336 if(NULL == wdiBtAmpEventParam)
8337 {
8338 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8339 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8340 VOS_ASSERT(0);
8341 return VOS_STATUS_E_NOMEM;
8342 }
8343 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8344 if(NULL == pWdaParams)
8345 {
8346 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8347 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8348 VOS_ASSERT(0);
8349 vos_mem_free(wdiBtAmpEventParam);
8350 return VOS_STATUS_E_NOMEM;
8351 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008352 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8353 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008354 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008355 /* Store BT AMP event pointer, as this will be used for response */
8356 /* store Params pass it to WDI */
8357 pWdaParams->pWdaContext = pWDA;
8358 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8359 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008360 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8361 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008362 if(IS_WDI_STATUS_FAILURE(status))
8363 {
8364 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8365 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8366 vos_mem_free(pWdaParams->wdaMsgParam) ;
8367 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8368 vos_mem_free(pWdaParams) ;
8369 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008370 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8371 {
8372 pWDA->wdaAmpSessionOn = VOS_TRUE;
8373 }
8374 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008375}
8376
Jeff Johnson295189b2012-06-20 16:38:30 -07008377#ifdef ANI_MANF_DIAG
8378/*
8379 * FUNCTION: WDA_FTMCommandReqCallback
8380 * Handle FTM CMD response came from HAL
8381 * Route responce to HDD FTM
8382 */
8383void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8384 void *usrData)
8385{
8386 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008387 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8388 {
8389 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8390 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8391 return;
8392 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008393 /* Release Current FTM Command Request */
8394 vos_mem_free(pWDA->wdaFTMCmdReq);
8395 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008396#ifndef WLAN_FTM_STUB
8397 /* Post FTM Responce to HDD FTM */
8398 wlan_sys_ftm(ftmCmdRspData);
8399#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008400 return;
8401}
Jeff Johnson295189b2012-06-20 16:38:30 -07008402/*
8403 * FUNCTION: WDA_ProcessFTMCommand
8404 * Send FTM command to WDI
8405 */
8406VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8407 tPttMsgbuffer *pPTTFtmCmd)
8408{
8409 WDI_Status status = WDI_STATUS_SUCCESS;
8410 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008411 ftmCMDReq = (WDI_FTMCommandReqType *)
8412 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8413 if(NULL == ftmCMDReq)
8414 {
8415 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8416 "WDA FTM Command buffer alloc fail");
8417 return VOS_STATUS_E_NOMEM;
8418 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008419 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8420 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008421 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008422 /* Send command to WDI */
8423 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008424 return status;
8425}
8426#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008427#ifdef FEATURE_OEM_DATA_SUPPORT
8428/*
8429 * FUNCTION: WDA_StartOemDataReqCallback
8430 *
8431 */
8432void WDA_StartOemDataReqCallback(
8433 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8434 void* pUserData)
8435{
8436 VOS_STATUS status = VOS_STATUS_E_FAILURE;
8437 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8438 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008439
Jeff Johnsone7245742012-09-05 17:12:55 -07008440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8441 "<------ %s " ,__FUNCTION__);
8442 if(NULL == pWDA)
8443 {
8444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8445 "%s:pWDA is NULL", __FUNCTION__);
8446 VOS_ASSERT(0);
8447 return ;
8448 }
8449
8450 /*
8451 * Allocate memory for response params sent to PE
8452 */
8453 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8454
8455 // Check if memory is allocated for OemdataMeasRsp Params.
8456 if(NULL == pOemDataRspParams)
8457 {
8458 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8459 "OEM DATA WDA callback alloc fail");
8460 VOS_ASSERT(0) ;
8461 return;
8462 }
8463 // Free the memory allocated during request.
8464 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8465 vos_mem_free(pWDA->wdaMsgParam) ;
8466 pWDA->wdaWdiApiMsgParam = NULL;
8467 pWDA->wdaMsgParam = NULL;
8468 /*
8469 * Now go ahead and copy other stuff for PE in incase of sucess only
8470 * Also, here success always means that we have atleast one BSSID.
8471 */
8472 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8473
8474 //enable Tx
8475 status = WDA_ResumeDataTx(pWDA);
8476 if(status != VOS_STATUS_SUCCESS)
8477 {
8478 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8479 }
8480 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8481 return ;
8482}
8483/*
8484 * FUNCTION: WDA_ProcessStartOemDataReq
8485 * Send Start Oem Data Req to WDI
8486 */
8487VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8488 tStartOemDataReq *pOemDataReqParams)
8489{
8490 WDI_Status status = WDI_STATUS_SUCCESS;
8491 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
8492
8493 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8494
8495 if(NULL == wdiOemDataReqParams)
8496 {
8497 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8498 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8499 VOS_ASSERT(0);
8500 return VOS_STATUS_E_NOMEM;
8501 }
8502
8503 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8504 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
8505
8506 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8507
8508 if((NULL != pWDA->wdaMsgParam) ||
8509 (NULL != pWDA->wdaWdiApiMsgParam))
8510 {
8511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8512 "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__);
8513 VOS_ASSERT(0);
8514 vos_mem_free(wdiOemDataReqParams);
8515 return VOS_STATUS_E_FAILURE;
8516 }
8517 pWDA->wdaMsgParam = (void *)pOemDataReqParams;
8518 pWDA->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8519
8520 status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
8521
8522 if(IS_WDI_STATUS_FAILURE(status))
8523 {
8524 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8525 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
8526 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8527 vos_mem_free(pWDA->wdaMsgParam);
8528 pWDA->wdaWdiApiMsgParam = NULL;
8529 pWDA->wdaMsgParam = NULL;
8530 }
8531 return CONVERT_WDI2VOS_STATUS(status) ;
8532}
8533#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008534/*
8535 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8536 *
8537 */
8538void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8539{
8540 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008541 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8542 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008543 if(NULL == pWdaParams)
8544 {
8545 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8546 "%s: pWdaParams received NULL", __FUNCTION__);
8547 VOS_ASSERT(0) ;
8548 return ;
8549 }
8550
8551 if(NULL != pWdaParams->wdaMsgParam)
8552 {
8553 vos_mem_free(pWdaParams->wdaMsgParam);
8554 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008555 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8556 {
8557 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8558 }
8559
8560 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008561 return ;
8562}
Jeff Johnson295189b2012-06-20 16:38:30 -07008563#ifdef WLAN_FEATURE_GTK_OFFLOAD
8564/*
8565 * FUNCTION: WDA_HostOffloadReqCallback
8566 *
8567 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008568void WDA_GTKOffloadReqCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparams,
8569 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008570{
8571 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8572
8573 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8574 "<------ %s " ,__FUNCTION__);
8575
8576 VOS_ASSERT(NULL != pWdaParams);
8577
8578 vos_mem_free(pWdaParams->wdaMsgParam) ;
8579 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8580 vos_mem_free(pWdaParams) ;
8581
8582 //print a msg, nothing else to do
8583 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8584 "WDA_GTKOffloadReqCallback invoked " );
8585
8586 return ;
8587}
8588
8589/*
8590 * FUNCTION: WDA_ProcessGTKOffloadReq
8591 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8592 * to broadcast traffic (sta mode).
8593 */
8594VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8595 tpSirGtkOffloadParams pGtkOffloadParams)
8596{
8597 VOS_STATUS status = VOS_STATUS_SUCCESS;
8598 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8599 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8600 sizeof(WDI_GtkOffloadReqMsg)) ;
8601 tWDA_ReqParams *pWdaParams ;
8602
8603 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8604 "------> %s " ,__FUNCTION__);
8605
8606 if(NULL == wdiGtkOffloadReqMsg)
8607 {
8608 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8609 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8610 VOS_ASSERT(0);
8611 return VOS_STATUS_E_NOMEM;
8612 }
8613
8614 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8615 if(NULL == pWdaParams)
8616 {
8617 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8618 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8619 VOS_ASSERT(0);
8620 vos_mem_free(wdiGtkOffloadReqMsg);
8621 return VOS_STATUS_E_NOMEM;
8622 }
8623
8624 //
8625 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8626 //
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008627
8628 vos_mem_copy(wdiGtkOffloadReqMsg->gtkOffloadReqParams.bssId,
8629 pGtkOffloadParams->bssId, sizeof(wpt_macAddr))
8630
Jeff Johnson295189b2012-06-20 16:38:30 -07008631 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8632 // Copy KCK
8633 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8634 // Copy KEK
8635 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8636 // Copy KeyReplayCounter
8637 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8638 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8639
8640 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8641
8642 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8643 (NULL == pWDA->wdaWdiApiMsgParam));
8644
8645 /* Store Params pass it to WDI */
8646 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8647 pWdaParams->pWdaContext = pWDA;
8648 /* Store param pointer as passed in by caller */
8649 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8650
8651 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8652
8653 if(IS_WDI_STATUS_FAILURE(status))
8654 {
8655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8656 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8657 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8658 vos_mem_free(pWdaParams->wdaMsgParam);
8659 vos_mem_free(pWdaParams);
8660 }
8661
8662 return CONVERT_WDI2VOS_STATUS(status) ;
8663}
8664
8665/*
8666 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8667 *
8668 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008669void WDA_GtkOffloadGetInfoCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkOffloadGetInfoRsparams,
8670 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008671{
8672 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8673 tWDA_CbContext *pWDA;
8674 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8675 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8676 tANI_U8 i;
8677 vos_msg_t vosMsg;
8678
8679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8680 "<------ %s " ,__FUNCTION__);
8681
8682 VOS_ASSERT(NULL != pWdaParams);
8683
8684 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8685 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8686
8687 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8688 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8689
8690 /* Message Header */
8691 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8692 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8693
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008694 pGtkOffloadGetInfoRsp->ulStatus = pwdiGtkOffloadGetInfoRsparams->ulStatus;
8695 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pwdiGtkOffloadGetInfoRsparams->ullKeyReplayCounter;
8696 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulTotalRekeyCount;
8697 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulGTKRekeyCount;
8698 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulIGTKRekeyCount;
8699 pGtkOffloadGetInfoRsp->bssIdx = pwdiGtkOffloadGetInfoRsparams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07008700
8701 /* VOS message wrapper */
8702 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8703 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8704 vosMsg.bodyval = 0;
8705
8706 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8707 {
8708 /* free the mem and return */
8709 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8710 }
8711
8712 vos_mem_free(pWdaParams->wdaMsgParam) ;
8713 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8714 vos_mem_free(pWdaParams) ;
8715}
8716#endif
8717
8718/*
8719 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8720 * Request to WDI to set Tx Per Tracking configurations
8721 */
8722VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8723{
8724 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008725 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008726 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8727 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8728 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8729 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008730 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8731 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008732 if(NULL == pwdiSetTxPerTrackingReqParams)
8733 {
8734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8735 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8736 vos_mem_free(pTxPerTrackingParams);
8737 VOS_ASSERT(0);
8738 return VOS_STATUS_E_NOMEM;
8739 }
8740 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8741 if(NULL == pWdaParams)
8742 {
8743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8744 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8745 vos_mem_free(pwdiSetTxPerTrackingReqParams);
8746 vos_mem_free(pTxPerTrackingParams);
8747 VOS_ASSERT(0);
8748 return VOS_STATUS_E_NOMEM;
8749 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008750 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8751 pTxPerTrackingParams->ucTxPerTrackingEnable;
8752 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8753 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8754 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8755 pTxPerTrackingParams->ucTxPerTrackingRatio;
8756 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8757 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008758 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008759 /* Store param pointer as passed in by caller */
8760 /* store Params pass it to WDI
8761 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8762 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8763 pWdaParams->pWdaContext = pWDA;
8764 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008765 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008766 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008767 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008768 {
8769 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8770 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008771 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008772 vos_mem_free(pWdaParams->wdaMsgParam) ;
8773 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8774 vos_mem_free(pWdaParams) ;
8775 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008776 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008777
8778}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008779/*
8780 * FUNCTION: WDA_HALDumpCmdCallback
8781 * Send the VOS complete .
8782 */
8783void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8784 void* pUserData)
8785{
8786 tANI_U8 *buffer = NULL;
8787 tWDA_CbContext *pWDA = NULL;
8788 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008789 if(NULL == pWdaParams)
8790 {
8791 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8792 "%s: pWdaParams received NULL", __FUNCTION__);
8793 VOS_ASSERT(0) ;
8794 return ;
8795 }
8796
8797 pWDA = pWdaParams->pWdaContext;
8798 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008799 if(wdiRspParams->usBufferLen > 0)
8800 {
8801 /*Copy the Resp data to UMAC supplied buffer*/
8802 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8803 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008804 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8805 vos_mem_free(pWdaParams);
8806
8807 /* Indicate VOSS about the start complete */
8808 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008809 return ;
8810}
8811
Jeff Johnson295189b2012-06-20 16:38:30 -07008812/*
8813 * FUNCTION: WDA_ProcessHALDumpCmdReq
8814 * Send Dump command to WDI
8815 */
8816VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8817 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8818 tANI_U32 arg4, tANI_U8 *pBuffer)
8819{
8820 WDI_Status status = WDI_STATUS_SUCCESS;
8821 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8822 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8823 tWDA_ReqParams *pWdaParams ;
8824 pVosContextType pVosContext = NULL;
8825 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008826 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8827 (void *)pMac);
8828
8829 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8830 if(NULL == pWdaParams)
8831 {
8832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8833 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8834 return VOS_STATUS_E_NOMEM;
8835 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008836 /* Allocate memory WDI request structure*/
8837 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8838 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8839 if(NULL == wdiHALDumpCmdReqParam)
8840 {
8841 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8842 "WDA HAL DUMP Command buffer alloc fail");
8843 vos_mem_free(pWdaParams);
8844 return WDI_STATUS_E_FAILURE;
8845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008846 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008847 /* Extract the arguments */
8848 wdiHalDumpCmdInfo->command = cmd;
8849 wdiHalDumpCmdInfo->argument1 = arg1;
8850 wdiHalDumpCmdInfo->argument2 = arg2;
8851 wdiHalDumpCmdInfo->argument3 = arg3;
8852 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07008853 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008854 pWdaParams->pWdaContext = pVosContext->pWDAContext;
8855
8856 /* Response message will be passed through the buffer */
8857 pWdaParams->wdaMsgParam = (void *)pBuffer;
8858
8859 /* store Params pass it to WDI */
8860 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008861 /* Send command to WDI */
8862 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008863 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07008864 if ( vStatus != VOS_STATUS_SUCCESS )
8865 {
8866 if ( vStatus == VOS_STATUS_E_TIMEOUT )
8867 {
8868 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8869 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
8870 }
8871 else
8872 {
8873 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8874 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
8875 }
8876 VOS_ASSERT(0);
8877 }
8878 return status;
8879}
Jeff Johnson295189b2012-06-20 16:38:30 -07008880#ifdef WLAN_FEATURE_GTK_OFFLOAD
8881/*
8882 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
8883 * Request to WDI to get GTK Offload Information
8884 */
8885VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
8886 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
8887{
8888 VOS_STATUS status = VOS_STATUS_SUCCESS;
8889 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
8890 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
8891 tWDA_ReqParams *pWdaParams ;
8892
8893 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
8894 {
8895 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8896 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8897 VOS_ASSERT(0);
8898 return VOS_STATUS_E_NOMEM;
8899 }
8900
8901 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8902 if(NULL == pWdaParams)
8903 {
8904 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8905 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8906 VOS_ASSERT(0);
8907 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
8908 return VOS_STATUS_E_NOMEM;
8909 }
8910
8911 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
8912
8913 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8914 (NULL == pWDA->wdaWdiApiMsgParam));
8915
8916 /* Store Params pass it to WDI */
8917 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
8918 pWdaParams->pWdaContext = pWDA;
8919 /* Store param pointer as passed in by caller */
8920 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
8921
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008922 vos_mem_copy(pwdiGtkOffloadGetInfoReqMsg->WDI_GtkOffloadGetInfoReqParams.bssId,
8923 pGtkOffloadGetInfoRsp->bssId, sizeof(wpt_macAddr))
8924
Jeff Johnson295189b2012-06-20 16:38:30 -07008925 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
8926
8927 if(IS_WDI_STATUS_FAILURE(status))
8928 {
8929 /* failure returned by WDI API */
8930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8931 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
8932 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8933 vos_mem_free(pWdaParams) ;
8934 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
8935 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
8936 }
8937
8938 return CONVERT_WDI2VOS_STATUS(status) ;
8939}
8940#endif // WLAN_FEATURE_GTK_OFFLOAD
8941
8942/*
8943 * -------------------------------------------------------------------------
8944 * DATA interface with WDI for Mgmt Frames
8945 * -------------------------------------------------------------------------
8946 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008947/*
8948 * FUNCTION: WDA_TxComplete
8949 * Callback function for the WDA_TxPacket
8950 */
8951VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
8952 VOS_STATUS status )
8953{
8954
8955 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8956 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
8957
8958 if(NULL == wdaContext)
8959 {
8960 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8961 "%s:pWDA is NULL",
8962 __FUNCTION__);
8963 VOS_ASSERT(0);
8964 return VOS_STATUS_E_FAILURE;
8965 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008966 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
8967 if( NULL!=wdaContext->pTxCbFunc)
8968 {
8969 /*check if packet is freed already*/
8970 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
8971 {
8972 wdaContext->pTxCbFunc(pMac, pData);
8973 }
8974 else
8975 {
8976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
8977 "%s:packet (0x%X) is already freed",
8978 __FUNCTION__, pData);
8979 //Return from here since we reaching here because the packet already timeout
8980 return status;
8981 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008982 }
8983
8984 /*
8985 * Trigger the event to bring the HAL TL Tx complete function to come
8986 * out of wait
8987 * Let the coe above to complete the packet first. When this event is set,
8988 * the thread waiting for the event may run and set Vospacket_freed causing the original
8989 * packet not being freed.
8990 */
8991 status = vos_event_set(&wdaContext->txFrameEvent);
8992 if(!VOS_IS_STATUS_SUCCESS(status))
8993 {
8994 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8995 "NEW VOS Event Set failed - status = %d \n", status);
8996 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008997 return status;
8998}
Jeff Johnson295189b2012-06-20 16:38:30 -07008999/*
9000 * FUNCTION: WDA_TxPacket
9001 * Forward TX management frame to WDI
9002 */
9003VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
9004 void *pFrmBuf,
9005 tANI_U16 frmLen,
9006 eFrameType frmType,
9007 eFrameTxDir txDir,
9008 tANI_U8 tid,
9009 pWDATxRxCompFunc pCompFunc,
9010 void *pData,
9011 pWDAAckFnTxComp pAckTxComp,
9012 tANI_U8 txFlag)
9013{
9014 VOS_STATUS status = VOS_STATUS_SUCCESS ;
9015 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
9016 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
9017 tANI_U8 eventIdx = 0;
9018 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
9019 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009020 if((NULL == pWDA)||(NULL == pFrmBuf))
9021 {
9022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9023 "%s:pWDA %x or pFrmBuf %x is NULL",
9024 __FUNCTION__,pWDA,pFrmBuf);
9025 VOS_ASSERT(0);
9026 return VOS_STATUS_E_FAILURE;
9027 }
9028
9029 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9030 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07009031 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
9032 if(NULL == pMac)
9033 {
9034 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9035 "%s:pMac is NULL", __FUNCTION__);
9036 VOS_ASSERT(0);
9037 return VOS_STATUS_E_FAILURE;
9038 }
9039
9040
9041
9042 /* store the call back function in WDA context */
9043 pWDA->pTxCbFunc = pCompFunc;
9044 /* store the call back for the function of ackTxComplete */
9045 if( pAckTxComp )
9046 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009047 if( NULL != pWDA->pAckTxCbFunc )
9048 {
9049 /* Already TxComp is active no need to active again */
9050 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9051 "There is already one request pending for tx complete\n");
9052 pWDA->pAckTxCbFunc( pMac, 0);
9053 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07009054
Jeff Johnsone7245742012-09-05 17:12:55 -07009055 if( VOS_STATUS_SUCCESS !=
9056 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9057 {
9058 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9059 "Tx Complete timeout Timer Stop Failed ");
9060 }
9061 else
9062 {
9063 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9064 "Tx Complete timeout Timer Stop Sucess ");
9065 }
9066 }
9067
9068 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
9069 pWDA->pAckTxCbFunc = pAckTxComp;
9070 if( VOS_STATUS_SUCCESS !=
9071 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
9072 {
9073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9074 "Tx Complete Timer Start Failed ");
9075 pWDA->pAckTxCbFunc = NULL;
9076 return eHAL_STATUS_FAILURE;
9077 }
9078 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009079 /* Reset the event to be not signalled */
9080 status = vos_event_reset(&pWDA->txFrameEvent);
9081 if(!VOS_IS_STATUS_SUCCESS(status))
9082 {
9083 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9084 "VOS Event reset failed - status = %d\n",status);
9085 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9086 if( pAckTxComp )
9087 {
9088 pWDA->pAckTxCbFunc = NULL;
9089 if( VOS_STATUS_SUCCESS !=
9090 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9091 {
9092 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9093 "Tx Complete timeout Timer Stop Failed ");
9094 }
9095 }
9096 return VOS_STATUS_E_FAILURE;
9097 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009098 /* Get system role, use the self station if in unknown role or STA role */
9099 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07009100 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
9101 (( eSYSTEM_STA_ROLE == systemRole )
9102#ifdef FEATURE_WLAN_CCX
9103 && frmType == HAL_TXRX_FRM_802_11_MGMT
9104#endif
9105 ))
9106 {
9107 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9108 }
9109
Jeff Johnsone7245742012-09-05 17:12:55 -07009110 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
9111 disassoc frame reaches the HW, HAL has already deleted the peer station */
9112 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07009113 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009114 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
9115 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9116 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
9117 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07009118 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009119 /*Send Probe request frames on self sta idx*/
9120 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07009121 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009122 /* Since we donot want probe responses to be retried, send probe responses
9123 through the NO_ACK queues */
9124 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
9125 {
9126 //probe response is sent out using self station and no retries options.
9127 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
9128 }
9129 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
9130 {
9131 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
9132 }
9133 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009134 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
9135
9136 /*Set frame tag to 0
9137 We will use the WDA user data in order to tag a frame as expired*/
9138 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9139 (v_PVOID_t)0);
9140
9141
9142 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
9143 frmLen, ucTypeSubType, tid,
9144 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
9145 {
9146 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9147 "Sending Mgmt Frame failed - status = %d\n", status);
9148 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9149 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
9150 if( pAckTxComp )
9151 {
9152 pWDA->pAckTxCbFunc = NULL;
9153 if( VOS_STATUS_SUCCESS !=
9154 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9155 {
9156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9157 "Tx Complete timeout Timer Stop Failed ");
9158 }
9159 }
9160 return VOS_STATUS_E_FAILURE;
9161 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009162 /*
9163 * Wait for the event to be set by the TL, to get the response of TX
9164 * complete, this event should be set by the Callback function called by TL
9165 */
9166 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
9167 &eventIdx);
9168 if(!VOS_IS_STATUS_SUCCESS(status))
9169 {
9170 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9171 "%s: Status %d when waiting for TX Frame Event",
9172 __FUNCTION__, status);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07009173 WDA_TransportChannelDebug(1, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009174 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
9175 after the packet gets completed(packet freed once)*/
9176
9177 /* check whether the packet was freed already,so need not free again when
9178 * TL calls the WDA_Txcomplete routine
9179 */
9180 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
9181 {
9182 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9183 }
9184 if( pAckTxComp )
9185 {
9186 pWDA->pAckTxCbFunc = NULL;
9187 if( VOS_STATUS_SUCCESS !=
9188 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9189 {
9190 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9191 "Tx Complete timeout Timer Stop Failed ");
9192 }
9193 }
9194 status = VOS_STATUS_E_FAILURE;
9195 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009196 return status;
9197}
Jeff Johnson295189b2012-06-20 16:38:30 -07009198/*
9199 * FUNCTION: WDA_McProcessMsg
9200 * Trigger DAL-AL to start CFG download
9201 */
9202VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
9203{
9204 VOS_STATUS status = VOS_STATUS_SUCCESS;
9205 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009206 if(NULL == pMsg)
9207 {
9208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9209 "%s:pMsg is NULL", __FUNCTION__);
9210 VOS_ASSERT(0);
9211 return VOS_STATUS_E_FAILURE;
9212 }
9213
9214 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
9215 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
9216
9217 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
9218 if(NULL == pWDA )
9219 {
9220 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9221 "%s:pWDA is NULL", __FUNCTION__);
9222 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07009223 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009224 return VOS_STATUS_E_FAILURE;
9225 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009226 /* Process all the WDA messages.. */
9227 switch( pMsg->type )
9228 {
9229 case WNI_CFG_DNLD_REQ:
9230 {
9231 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07009232 /* call WDA complete event if config download success */
9233 if( VOS_IS_STATUS_SUCCESS(status) )
9234 {
9235 vos_WDAComplete_cback(pVosContext);
9236 }
9237 else
9238 {
9239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9240 "WDA Config Download failure" );
9241 }
9242 break ;
9243 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009244 /*
9245 * Init SCAN request from PE, convert it into DAL format
9246 * and send it to DAL
9247 */
9248 case WDA_INIT_SCAN_REQ:
9249 {
9250 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9251 break ;
9252 }
9253 /* start SCAN request from PE */
9254 case WDA_START_SCAN_REQ:
9255 {
9256 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9257 break ;
9258 }
9259 /* end SCAN request from PE */
9260 case WDA_END_SCAN_REQ:
9261 {
9262 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9263 break ;
9264 }
9265 /* end SCAN request from PE */
9266 case WDA_FINISH_SCAN_REQ:
9267 {
9268 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9269 break ;
9270 }
9271 /* join request from PE */
9272 case WDA_CHNL_SWITCH_REQ:
9273 {
9274 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9275 {
9276 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9277 }
9278 else
9279 {
9280 WDA_ProcessChannelSwitchReq(pWDA,
9281 (tSwitchChannelParams*)pMsg->bodyptr) ;
9282 }
9283 break ;
9284 }
9285 /* ADD BSS request from PE */
9286 case WDA_ADD_BSS_REQ:
9287 {
9288 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9289 break ;
9290 }
9291 case WDA_ADD_STA_REQ:
9292 {
9293 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9294 break ;
9295 }
9296 case WDA_DELETE_BSS_REQ:
9297 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009298 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9299 break ;
9300 }
9301 case WDA_DELETE_STA_REQ:
9302 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009303 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9304 break ;
9305 }
9306 case WDA_CONFIG_PARAM_UPDATE_REQ:
9307 {
9308 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9309 break ;
9310 }
9311 case WDA_SET_BSSKEY_REQ:
9312 {
9313 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9314 break ;
9315 }
9316 case WDA_SET_STAKEY_REQ:
9317 {
9318 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9319 break ;
9320 }
9321 case WDA_SET_STA_BCASTKEY_REQ:
9322 {
9323 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9324 break ;
9325 }
9326 case WDA_REMOVE_BSSKEY_REQ:
9327 {
9328 WDA_ProcessRemoveBssKeyReq(pWDA,
9329 (tRemoveBssKeyParams *)pMsg->bodyptr);
9330 break ;
9331 }
9332 case WDA_REMOVE_STAKEY_REQ:
9333 {
9334 WDA_ProcessRemoveStaKeyReq(pWDA,
9335 (tRemoveStaKeyParams *)pMsg->bodyptr);
9336 break ;
9337 }
9338 case WDA_REMOVE_STA_BCASTKEY_REQ:
9339 {
9340 /* TODO: currently UMAC is not sending this request, Add the code for
9341 handling this request when UMAC supports */
9342 break;
9343 }
9344#ifdef FEATURE_WLAN_CCX
9345 case WDA_TSM_STATS_REQ:
9346 {
9347 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9348 break;
9349 }
9350#endif
9351 case WDA_UPDATE_EDCA_PROFILE_IND:
9352 {
9353 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9354 break;
9355 }
9356 case WDA_ADD_TS_REQ:
9357 {
9358 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9359 break;
9360 }
9361 case WDA_DEL_TS_REQ:
9362 {
9363 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9364 break;
9365 }
9366 case WDA_ADDBA_REQ:
9367 {
9368 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9369 break;
9370 }
9371 case WDA_DELBA_IND:
9372 {
9373 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9374 break;
9375 }
9376 case WDA_SET_LINK_STATE:
9377 {
9378 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9379 break;
9380 }
9381 case WDA_GET_STATISTICS_REQ:
9382 {
9383 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9384 break;
9385 }
9386 case WDA_PWR_SAVE_CFG:
9387 {
9388 if(pWDA->wdaState == WDA_READY_STATE)
9389 {
9390 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9391 }
9392 else
9393 {
9394 if(NULL != pMsg->bodyptr)
9395 {
9396 vos_mem_free(pMsg->bodyptr);
9397 }
9398 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9399 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9400 }
9401 break;
9402 }
9403 case WDA_ENTER_IMPS_REQ:
9404 {
9405 if(pWDA->wdaState == WDA_READY_STATE)
9406 {
9407 WDA_ProcessEnterImpsReq(pWDA);
9408 }
9409 else
9410 {
9411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9412 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9413 }
9414 break;
9415 }
9416 case WDA_EXIT_IMPS_REQ:
9417 {
9418 if(pWDA->wdaState == WDA_READY_STATE)
9419 {
9420 WDA_ProcessExitImpsReq(pWDA);
9421 }
9422 else
9423 {
9424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9425 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9426 }
9427 break;
9428 }
9429 case WDA_ENTER_BMPS_REQ:
9430 {
9431 if(pWDA->wdaState == WDA_READY_STATE)
9432 {
9433 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9434 }
9435 else
9436 {
9437 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9438 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9439 }
9440 break;
9441 }
9442 case WDA_EXIT_BMPS_REQ:
9443 {
9444 if(pWDA->wdaState == WDA_READY_STATE)
9445 {
9446 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9447 }
9448 else
9449 {
9450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9451 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9452 }
9453 break;
9454 }
9455 case WDA_ENTER_UAPSD_REQ:
9456 {
9457 if(pWDA->wdaState == WDA_READY_STATE)
9458 {
9459 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9460 }
9461 else
9462 {
9463 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9464 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9465 }
9466 break;
9467 }
9468 case WDA_EXIT_UAPSD_REQ:
9469 {
9470 if(pWDA->wdaState == WDA_READY_STATE)
9471 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009472 WDA_ProcessExitUapsdReq(pWDA, (tExitUapsdParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009473 }
9474 else
9475 {
9476 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9477 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9478 }
9479 break;
9480 }
9481 case WDA_UPDATE_UAPSD_IND:
9482 {
9483 if(pWDA->wdaState == WDA_READY_STATE)
9484 {
9485 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9486 }
9487 else
9488 {
9489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9490 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9491 }
9492 break;
9493 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009494 case WDA_REGISTER_PE_CALLBACK :
9495 {
9496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9497 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9498 /*TODO: store the PE callback */
9499 /* Do Nothing? MSG Body should be freed at here */
9500 if(NULL != pMsg->bodyptr)
9501 {
9502 vos_mem_free(pMsg->bodyptr);
9503 }
9504 break;
9505 }
9506 case WDA_SYS_READY_IND :
9507 {
9508 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9509 "Handling msg type WDA_SYS_READY_IND " );
9510 pWDA->wdaState = WDA_READY_STATE;
9511 if(NULL != pMsg->bodyptr)
9512 {
9513 vos_mem_free(pMsg->bodyptr);
9514 }
9515 break;
9516 }
9517 case WDA_BEACON_FILTER_IND :
9518 {
9519 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9520 break;
9521 }
9522 case WDA_BTC_SET_CFG:
9523 {
9524 /*TODO: handle this while dealing with BTC */
9525 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9526 "Handling msg type WDA_BTC_SET_CFG " );
9527 /* Do Nothing? MSG Body should be freed at here */
9528 if(NULL != pMsg->bodyptr)
9529 {
9530 vos_mem_free(pMsg->bodyptr);
9531 }
9532 break;
9533 }
9534 case WDA_SIGNAL_BT_EVENT:
9535 {
9536 /*TODO: handle this while dealing with BTC */
9537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9538 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9539 /* Do Nothing? MSG Body should be freed at here */
9540 if(NULL != pMsg->bodyptr)
9541 {
9542 vos_mem_free(pMsg->bodyptr);
9543 }
9544 break;
9545 }
9546 case WDA_CFG_RXP_FILTER_REQ:
9547 {
9548 WDA_ProcessConfigureRxpFilterReq(pWDA,
9549 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9550 break;
9551 }
9552 case WDA_SET_HOST_OFFLOAD:
9553 {
9554 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9555 break;
9556 }
9557 case WDA_SET_KEEP_ALIVE:
9558 {
9559 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9560 break;
9561 }
9562#ifdef WLAN_NS_OFFLOAD
9563 case WDA_SET_NS_OFFLOAD:
9564 {
9565 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9566 break;
9567 }
9568#endif //WLAN_NS_OFFLOAD
9569 case WDA_ADD_STA_SELF_REQ:
9570 {
9571 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9572 break;
9573 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009574 case WDA_DEL_STA_SELF_REQ:
9575 {
9576 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9577 break;
9578 }
9579 case WDA_WOWL_ADD_BCAST_PTRN:
9580 {
9581 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9582 break;
9583 }
9584 case WDA_WOWL_DEL_BCAST_PTRN:
9585 {
9586 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9587 break;
9588 }
9589 case WDA_WOWL_ENTER_REQ:
9590 {
9591 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9592 break;
9593 }
9594 case WDA_WOWL_EXIT_REQ:
9595 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009596 WDA_ProcessWowlExitReq(pWDA, (tSirHalWowlExitParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009597 break;
9598 }
9599 case WDA_TL_FLUSH_AC_REQ:
9600 {
9601 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9602 break;
9603 }
9604 case WDA_SIGNAL_BTAMP_EVENT:
9605 {
9606 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9607 break;
9608 }
9609#ifdef WDA_UT
9610 case WDA_WDI_EVENT_MSG:
9611 {
9612 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9613 break ;
9614 }
9615#endif
9616 case WDA_UPDATE_BEACON_IND:
9617 {
9618 WDA_ProcessUpdateBeaconParams(pWDA,
9619 (tUpdateBeaconParams *)pMsg->bodyptr);
9620 break;
9621 }
9622 case WDA_SEND_BEACON_REQ:
9623 {
9624 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9625 break;
9626 }
9627 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9628 {
9629 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9630 (tSendProbeRespParams *)pMsg->bodyptr);
9631 break;
9632 }
9633#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9634 case WDA_SET_MAX_TX_POWER_REQ:
9635 {
9636 WDA_ProcessSetMaxTxPowerReq(pWDA,
9637 (tMaxTxPowerParams *)pMsg->bodyptr);
9638 break;
9639 }
9640#endif
9641#ifdef WLAN_FEATURE_P2P
9642 case WDA_SET_P2P_GO_NOA_REQ:
9643 {
9644 WDA_ProcessSetP2PGONOAReq(pWDA,
9645 (tP2pPsParams *)pMsg->bodyptr);
9646 break;
9647 }
9648#endif
9649 /* timer related messages */
9650 case WDA_TIMER_BA_ACTIVITY_REQ:
9651 {
9652 WDA_BaCheckActivity(pWDA) ;
9653 break ;
9654 }
9655#ifdef WLAN_FEATURE_VOWIFI_11R
9656 case WDA_AGGR_QOS_REQ:
9657 {
9658 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9659 break;
9660 }
9661#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009662#ifdef ANI_MANF_DIAG
9663 case WDA_FTM_CMD_REQ:
9664 {
9665 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9666 break ;
9667 }
9668#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009669#ifdef FEATURE_OEM_DATA_SUPPORT
9670 case WDA_START_OEM_DATA_REQ:
9671 {
9672 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9673 break;
9674 }
9675#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009676 /* Tx Complete Time out Indication */
9677 case WDA_TX_COMPLETE_TIMEOUT_IND:
9678 {
9679 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9680 break;
9681 }
9682 case WDA_WLAN_SUSPEND_IND:
9683 {
9684 WDA_ProcessWlanSuspendInd(pWDA,
9685 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9686 break;
9687 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009688 case WDA_WLAN_RESUME_REQ:
9689 {
9690 WDA_ProcessWlanResumeReq(pWDA,
9691 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9692 break;
9693 }
9694
9695 case WDA_UPDATE_CF_IND:
9696 {
9697 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9698 pMsg->bodyptr = NULL;
9699 break;
9700 }
9701#ifdef FEATURE_WLAN_SCAN_PNO
9702 case WDA_SET_PNO_REQ:
9703 {
9704 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9705 break;
9706 }
9707 case WDA_UPDATE_SCAN_PARAMS_REQ:
9708 {
9709 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9710 break;
9711 }
9712 case WDA_SET_RSSI_FILTER_REQ:
9713 {
9714 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9715 break;
9716 }
9717#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009718 case WDA_SET_TX_PER_TRACKING_REQ:
9719 {
9720 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9721 break;
9722 }
9723
9724#ifdef WLAN_FEATURE_PACKET_FILTERING
9725 case WDA_8023_MULTICAST_LIST_REQ:
9726 {
9727 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9728 break;
9729 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009730 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9731 {
9732 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9733 break;
9734 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009735 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9736 {
9737 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9738 break;
9739 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009740 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9741 {
9742 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9743 break;
9744 }
9745#endif // WLAN_FEATURE_PACKET_FILTERING
9746
9747
9748 case WDA_TRANSMISSION_CONTROL_IND:
9749 {
9750 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9751 break;
9752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009753 case WDA_SET_POWER_PARAMS_REQ:
9754 {
9755 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9756 break;
9757 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009758#ifdef WLAN_FEATURE_GTK_OFFLOAD
9759 case WDA_GTK_OFFLOAD_REQ:
9760 {
9761 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9762 break;
9763 }
9764
9765 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9766 {
9767 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9768 break;
9769 }
9770#endif //WLAN_FEATURE_GTK_OFFLOAD
9771
9772 case WDA_SET_TM_LEVEL_REQ:
9773 {
9774 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9775 break;
9776 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009777#ifdef WLAN_FEATURE_11AC
9778 case WDA_UPDATE_OP_MODE:
9779 {
9780 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9781 {
9782 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9783 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9784 else
9785 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9786 " VHT OpMode Feature is Not Supported \n");
9787 }
9788 else
9789 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9790 " 11AC Feature is Not Supported \n");
9791 break;
9792 }
9793#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009794 default:
9795 {
9796 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9797 "No Handling for msg type %x in WDA "
9798 ,pMsg->type);
9799 /* Do Nothing? MSG Body should be freed at here */
9800 if(NULL != pMsg->bodyptr)
9801 {
9802 vos_mem_free(pMsg->bodyptr);
9803 }
9804 //WDA_VOS_ASSERT(0) ;
9805 }
9806 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009807 return status ;
9808}
9809
Jeff Johnson295189b2012-06-20 16:38:30 -07009810/*
9811 * FUNCTION: WDA_LowLevelIndCallback
9812 * IND API callback from WDI, send Ind to PE
9813 */
9814void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9815 void* pUserData )
9816{
9817 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9818#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9819 tSirRSSINotification rssiNotification;
9820#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009821 if(NULL == pWDA)
9822 {
9823 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9824 "%s:pWDA is NULL", __FUNCTION__);
9825 VOS_ASSERT(0);
9826 return ;
9827 }
9828
9829 switch(wdiLowLevelInd->wdiIndicationType)
9830 {
9831 case WDI_RSSI_NOTIFICATION_IND:
9832 {
9833 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9834 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009835#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9836 rssiNotification.bReserved =
9837 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
9838 rssiNotification.bRssiThres1NegCross =
9839 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
9840 rssiNotification.bRssiThres1PosCross =
9841 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
9842 rssiNotification.bRssiThres2NegCross =
9843 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
9844 rssiNotification.bRssiThres2PosCross =
9845 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
9846 rssiNotification.bRssiThres3NegCross =
9847 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
9848 rssiNotification.bRssiThres3PosCross =
9849 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -07009850 WLANTL_BMPSRSSIRegionChangedNotification(
9851 pWDA->pVosContext,
9852 &rssiNotification);
9853#endif
9854 break ;
9855 }
9856 case WDI_MISSED_BEACON_IND:
9857 {
9858 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9859 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009860 /* send IND to PE */
9861 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
9862 break ;
9863 }
9864 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
9865 {
9866 /* TODO: Decode Ind and send Ind to PE */
9867 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9868 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
9869 break ;
9870 }
9871
9872 case WDI_MIC_FAILURE_IND:
9873 {
9874 tpSirSmeMicFailureInd pMicInd =
9875 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
9876
9877 if(NULL == pMicInd)
9878 {
9879 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9880 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9881 break;
9882 }
9883 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9884 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009885 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
9886 pMicInd->length = sizeof(tSirSmeMicFailureInd);
9887 vos_mem_copy(pMicInd->bssId,
9888 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
9889 sizeof(tSirMacAddr));
9890 vos_mem_copy(pMicInd->info.srcMacAddr,
9891 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
9892 sizeof(tSirMacAddr));
9893 vos_mem_copy(pMicInd->info.taMacAddr,
9894 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
9895 sizeof(tSirMacAddr));
9896 vos_mem_copy(pMicInd->info.dstMacAddr,
9897 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
9898 sizeof(tSirMacAddr));
9899 vos_mem_copy(pMicInd->info.rxMacAddr,
9900 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
9901 sizeof(tSirMacAddr));
9902 pMicInd->info.multicast =
9903 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
9904 pMicInd->info.keyId=
9905 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
9906 pMicInd->info.IV1=
9907 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
9908 vos_mem_copy(pMicInd->info.TSC,
9909 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009910 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
9911 (void *)pMicInd , 0) ;
9912 break ;
9913 }
9914 case WDI_FATAL_ERROR_IND:
9915 {
Madan Mohan Koyyalamudia2fc6412012-10-21 12:06:12 -07009916 pWDA->wdiFailed = true;
Jeff Johnson295189b2012-06-20 16:38:30 -07009917 /* TODO: Decode Ind and send Ind to PE */
9918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9919 "Received WDI_FATAL_ERROR_IND from WDI ");
9920 break ;
9921 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009922 case WDI_DEL_STA_IND:
9923 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009924 tpDeleteStaContext pDelSTACtx =
9925 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
9926
9927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9928 "Received WDI_DEL_STA_IND from WDI ");
9929 if(NULL == pDelSTACtx)
9930 {
9931 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9932 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9933 break;
9934 }
9935 vos_mem_copy(pDelSTACtx->addr2,
9936 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
9937 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009938 vos_mem_copy(pDelSTACtx->bssId,
9939 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
9940 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009941 pDelSTACtx->assocId =
9942 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
9943 pDelSTACtx->reasonCode =
9944 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
9945 pDelSTACtx->staId =
9946 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009947 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
9948 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009949 break ;
9950 }
9951 case WDI_COEX_IND:
9952 {
9953 tANI_U32 index;
9954 vos_msg_t vosMsg;
9955 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
9956 if(NULL == pSmeCoexInd)
9957 {
9958 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9959 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
9960 break;
9961 }
9962 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9963 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009964 /* Message Header */
9965 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
9966 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -07009967 /* Info from WDI Indication */
9968 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
9969 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
9970 {
9971 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
9972 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009973 /* VOS message wrapper */
9974 vosMsg.type = eWNI_SME_COEX_IND;
9975 vosMsg.bodyptr = (void *)pSmeCoexInd;
9976 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009977 /* Send message to SME */
9978 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9979 {
9980 /* free the mem and return */
9981 vos_mem_free((v_VOID_t *)pSmeCoexInd);
9982 }
9983 else
9984 {
9985 /* DEBUG */
9986 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9987 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
9988 pSmeCoexInd->coexIndType,
9989 pSmeCoexInd->coexIndData[0],
9990 pSmeCoexInd->coexIndData[1],
9991 pSmeCoexInd->coexIndData[2],
9992 pSmeCoexInd->coexIndData[3]);
9993 }
9994 break;
9995 }
9996 case WDI_TX_COMPLETE_IND:
9997 {
9998 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
9999 /* Calling TxCompleteAck Indication from wda context*/
10000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10001 "Complete Indication received from HAL");
10002 if( pWDA->pAckTxCbFunc )
10003 {
10004 if( VOS_STATUS_SUCCESS !=
10005 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
10006 {
10007 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10008 "Tx Complete timeout Timer Stop Failed ");
10009 }
10010 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
10011 pWDA->pAckTxCbFunc = NULL;
10012 }
10013 else
10014 {
10015 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10016 "Tx Complete Indication is received after timeout ");
10017 }
10018 break;
10019 }
10020#ifdef WLAN_FEATURE_P2P
10021 case WDI_P2P_NOA_ATTR_IND :
10022 {
10023 tSirP2PNoaAttr *pP2pNoaAttr =
10024 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10026 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010027 if (NULL == pP2pNoaAttr)
10028 {
10029 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10030 "Memory allocation failure, "
10031 "WDI_P2P_NOA_ATTR_IND not forwarded");
10032 break;
10033 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010034 pP2pNoaAttr->index =
10035 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
10036 pP2pNoaAttr->oppPsFlag =
10037 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
10038 pP2pNoaAttr->ctWin =
10039 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
10040
10041 pP2pNoaAttr->uNoa1IntervalCnt =
10042 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
10043 pP2pNoaAttr->uNoa1Duration =
10044 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
10045 pP2pNoaAttr->uNoa1Interval =
10046 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
10047 pP2pNoaAttr->uNoa1StartTime =
10048 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010049 pP2pNoaAttr->uNoa2IntervalCnt =
10050 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
10051 pP2pNoaAttr->uNoa2Duration =
10052 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
10053 pP2pNoaAttr->uNoa2Interval =
10054 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
10055 pP2pNoaAttr->uNoa2StartTime =
10056 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010057 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
10058 (void *)pP2pNoaAttr , 0) ;
10059 break;
10060 }
10061#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070010062#ifdef FEATURE_WLAN_SCAN_PNO
10063 case WDI_PREF_NETWORK_FOUND_IND:
10064 {
10065 vos_msg_t vosMsg;
10066 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -070010067 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10068 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010069 if (NULL == pPrefNetworkFoundInd)
10070 {
10071 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10072 "Memory allocation failure, "
10073 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
10074 break;
10075 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010076 /* Message Header */
10077 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
10078 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
10079
10080 /* Info from WDI Indication */
10081 pPrefNetworkFoundInd->ssId.length =
10082 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070010083 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070010084 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
10085 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
10086 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -070010087 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -070010088 /* VOS message wrapper */
10089 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
10090 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
10091 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010092 /* Send message to SME */
10093 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10094 {
10095 /* free the mem and return */
10096 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
10097 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010098 break;
10099 }
10100#endif // FEATURE_WLAN_SCAN_PNO
10101
10102#ifdef WLAN_WAKEUP_EVENTS
10103 case WDI_WAKE_REASON_IND:
10104 {
10105 vos_msg_t vosMsg;
10106 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
10107 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
10108 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
10109
10110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10111 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
10112 wdiLowLevelInd->wdiIndicationType,
10113 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
10114 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
10115 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10116
10117 if (NULL == pWakeReasonInd)
10118 {
10119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10120 "Memory allocation failure, "
10121 "WDI_WAKE_REASON_IND not forwarded");
10122 break;
10123 }
10124
10125 vos_mem_zero(pWakeReasonInd, allocSize);
10126
10127 /* Message Header */
10128 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
10129 pWakeReasonInd->mesgLen = allocSize;
10130
10131 /* Info from WDI Indication */
10132 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
10133 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
10134 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
10135 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
10136 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
10137 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
10138 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
10139 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10140
10141 /* VOS message wrapper */
10142 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
10143 vosMsg.bodyptr = (void *) pWakeReasonInd;
10144 vosMsg.bodyval = 0;
10145
10146 /* Send message to SME */
10147 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10148 {
10149 /* free the mem and return */
10150 vos_mem_free((v_VOID_t *) pWakeReasonInd);
10151 }
10152
10153 break;
10154 }
10155#endif // WLAN_WAKEUP_EVENTS
10156
10157 case WDI_TX_PER_HIT_IND:
10158 {
10159 vos_msg_t vosMsg;
10160 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
10161 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
10162 /* VOS message wrapper */
10163 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
10164 vosMsg.bodyptr = NULL;
10165 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010166 /* Send message to SME */
10167 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10168 {
10169 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
10170 }
10171 break;
10172 }
10173
10174 default:
10175 {
10176 /* TODO error */
10177 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10178 "Received UNKNOWN Indication from WDI ");
10179 }
10180 }
10181 return ;
10182}
10183
Jeff Johnson295189b2012-06-20 16:38:30 -070010184/*
10185 * BA related processing in WDA.
10186 */
Jeff Johnson295189b2012-06-20 16:38:30 -070010187void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
10188 void* pUserData)
10189{
10190 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10191 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -070010192 if(NULL == pWdaParams)
10193 {
10194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10195 "%s: pWdaParams received NULL", __FUNCTION__);
10196 VOS_ASSERT(0) ;
10197 return ;
10198 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010199 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070010200 vos_mem_free(pWdaParams->wdaMsgParam) ;
10201 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10202 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010203 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10204 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010205 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
10206 {
10207 tANI_U8 i = 0 ;
10208 tBaActivityInd *baActivityInd = NULL ;
10209 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
10210 tANI_U8 allocSize = sizeof(tBaActivityInd)
10211 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
10212 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
10213 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010214 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010215 if(NULL == baActivityInd)
10216 {
10217 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10218 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10219 VOS_ASSERT(0) ;
10220 return;
10221 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010222 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
10223 sizeof(tSirMacAddr)) ;
10224 baActivityInd->baCandidateCnt = baCandidateCount ;
10225
10226 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
10227 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
10228
10229 for(i = 0 ; i < baCandidateCount ; i++)
10230 {
10231 tANI_U8 tid = 0 ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010232 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
10233 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010234 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
10235 {
10236 baCandidate->baInfo[tid].fBaEnable =
10237 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
10238 baCandidate->baInfo[tid].startingSeqNum =
10239 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
10240 }
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070010241 wdiBaCandidate++ ;
10242 baCandidate++ ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010243 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010244 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
10245 }
10246 else
10247 {
10248 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10249 "BA Trigger RSP with Failure received ");
10250 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010251 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010252}
Jeff Johnson295189b2012-06-20 16:38:30 -070010253/*
10254 * BA Activity check timer handler
10255 */
10256void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10257{
10258 tANI_U8 curSta = 0 ;
10259 tANI_U8 tid = 0 ;
10260 tANI_U8 size = 0 ;
10261 tANI_U8 baCandidateCount = 0 ;
10262 tANI_U8 newBaCandidate = 0 ;
10263 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10264
10265 if(NULL == pWDA)
10266 {
10267 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10268 "%s:pWDA is NULL", __FUNCTION__);
10269 VOS_ASSERT(0);
10270 return ;
10271 }
10272 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10273 {
10274 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10275 "Inconsistent STA entries in WDA");
10276 VOS_ASSERT(0) ;
10277 }
10278 /* walk through all STA entries and find out TX packet count */
10279 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10280 {
10281 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10282 {
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010283 WLANTL_STAStateType tlSTAState ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010284 tANI_U32 txPktCount = 0 ;
10285 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010286 if((WDA_VALID_STA_INDEX == validStaIndex) &&
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010287 (VOS_STATUS_SUCCESS == WDA_TL_GET_STA_STATE( pWDA->pVosContext,
10288 curSta, &tlSTAState)) &&
Jeff Johnson295189b2012-06-20 16:38:30 -070010289 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10290 curSta, tid, &txPktCount)))
10291 {
10292#if 0
10293 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10294 "************* %d:%d, %d ",curSta, txPktCount,
10295 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10296#endif
10297 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010298 && (WLANTL_STA_AUTHENTICATED == tlSTAState)
Jeff Johnson295189b2012-06-20 16:38:30 -070010299 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10300 curSta, tid)))
10301 {
10302 /* get prepare for sending message to HAL */
10303 //baCandidate[baCandidateCount].staIdx = curSta ;
10304 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10305 newBaCandidate = WDA_ENABLE_BA ;
10306 }
10307 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10308 }
10309 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010310 /* fill the entry for all the sta with given TID's */
10311 if(WDA_ENABLE_BA == newBaCandidate)
10312 {
10313 /* move to next BA candidate */
10314 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10315 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10316 baCandidateCount++ ;
10317 newBaCandidate = WDA_DISABLE_BA ;
10318 }
10319 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010320 /* prepare and send message to hal */
10321 if( 0 < baCandidateCount)
10322 {
10323 WDI_Status status = WDI_STATUS_SUCCESS ;
10324 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10325 tWDA_ReqParams *pWdaParams =
10326 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010327 if(NULL == pWdaParams)
10328 {
10329 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10330 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10331 VOS_ASSERT(0) ;
10332 return;
10333 }
10334 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10335 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10336 if(NULL == wdiTriggerBaReq)
10337 {
10338 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10339 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10340 VOS_ASSERT(0) ;
10341 vos_mem_free(pWdaParams);
10342 return;
10343 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010344 do
10345 {
10346 WDI_TriggerBAReqinfoType *triggerBaInfo =
10347 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10348 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10349 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10350 * for each request */
10351 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10352 triggerBaInfo->ucBASessionID = 0;
10353 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10354 } while(0) ;
10355 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10356 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10357 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010358 pWdaParams->pWdaContext = pWDA;
10359 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10360 pWdaParams->wdaMsgParam = NULL;
10361 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10362 WDA_TriggerBaReqCallback, pWdaParams) ;
10363 if(IS_WDI_STATUS_FAILURE(status))
10364 {
10365 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10366 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10367 vos_mem_free(pWdaParams->wdaMsgParam) ;
10368 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10369 vos_mem_free(pWdaParams) ;
10370 }
10371 }
10372 else
10373 {
10374 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10375 "There is no TID for initiating BA");
10376 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010377 if( VOS_STATUS_SUCCESS !=
10378 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10379 {
10380 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10381 "BA Activity Timer Stop Failed ");
10382 return ;
10383 }
10384 if( VOS_STATUS_SUCCESS !=
10385 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10386 {
10387 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10388 "BA Activity Timer Start Failed ");
10389 return;
10390 }
10391 return ;
10392}
Jeff Johnson295189b2012-06-20 16:38:30 -070010393/*
10394 * WDA common routine to create timer used by WDA.
10395 */
10396static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10397{
Jeff Johnson295189b2012-06-20 16:38:30 -070010398 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10399 tANI_U32 val = 0 ;
10400 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10401
10402 if(NULL == pMac)
10403 {
10404 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10405 "%s:MAC context is NULL", __FUNCTION__);
10406 VOS_ASSERT(0);
10407 return VOS_STATUS_E_FAILURE;
10408 }
10409 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10410 != eSIR_SUCCESS)
10411 {
10412 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10413 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10414 return VOS_STATUS_E_FAILURE;
10415 }
10416 val = SYS_MS_TO_TICKS(val) ;
10417
10418 /* BA activity check timer */
10419 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10420 "BA Activity Check timer", WDA_TimerHandler,
10421 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10422 if(status != TX_SUCCESS)
10423 {
10424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10425 "Unable to create BA activity timer");
10426 return eSIR_FAILURE ;
10427 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010428 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010429 /* Tx Complete Timeout timer */
10430 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10431 "Tx Complete Check timer", WDA_TimerHandler,
10432 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010433 if(status != TX_SUCCESS)
10434 {
10435 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10436 "Unable to create Tx Complete Timeout timer");
10437 /* Destroy timer of BA activity check timer */
10438 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10439 if(status != TX_SUCCESS)
10440 {
10441 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10442 "Unable to Destroy BA activity timer");
10443 return eSIR_FAILURE ;
10444 }
10445 return eSIR_FAILURE ;
10446 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010447 return eSIR_SUCCESS ;
10448}
Jeff Johnson295189b2012-06-20 16:38:30 -070010449/*
10450 * WDA common routine to destroy timer used by WDA.
10451 */
10452static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10453{
10454 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010455 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10456 if(status != TX_SUCCESS)
10457 {
10458 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10459 "Unable to Destroy Tx Complete Timeout timer");
10460 return eSIR_FAILURE ;
10461 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010462 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10463 if(status != TX_SUCCESS)
10464 {
10465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10466 "Unable to Destroy BA activity timer");
10467 return eSIR_FAILURE ;
10468 }
10469
10470 return eSIR_SUCCESS ;
10471}
Jeff Johnson295189b2012-06-20 16:38:30 -070010472/*
10473 * WDA timer handler.
10474 */
10475void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10476{
10477 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10478 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010479 /*
10480 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10481 */
10482 wdaMsg.type = timerInfo ;
10483 wdaMsg.bodyptr = NULL;
10484 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010485 /* post the message.. */
10486 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10487 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10488 {
10489 vosStatus = VOS_STATUS_E_BADMSG;
10490 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010491}
Jeff Johnson295189b2012-06-20 16:38:30 -070010492/*
10493 * WDA Tx Complete timeout Indication.
10494 */
10495void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10496{
10497 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010498 if( pWDA->pAckTxCbFunc )
10499 {
10500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10501 "TxComplete timer expired\n");
10502 pWDA->pAckTxCbFunc( pMac, 0);
10503 pWDA->pAckTxCbFunc = NULL;
10504 }
10505 else
10506 {
10507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10508 "There is no request pending for TxComplete and wait timer expired\n");
10509 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010510}
Jeff Johnson295189b2012-06-20 16:38:30 -070010511/*
10512 * WDA Set REG Domain to VOS NV
10513 */
10514eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10515{
10516 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10517 {
10518 return eHAL_STATUS_INVALID_PARAMETER;
10519 }
10520 return eHAL_STATUS_SUCCESS;
10521}
10522#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10523
Jeff Johnson295189b2012-06-20 16:38:30 -070010524#ifdef FEATURE_WLAN_SCAN_PNO
10525/*
10526 * FUNCTION: WDA_PNOScanReqCallback
10527 *
10528 */
10529void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10530{
10531 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10533 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010534 if(NULL == pWdaParams)
10535 {
10536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10537 "%s: pWdaParams received NULL", __FUNCTION__);
10538 VOS_ASSERT(0) ;
10539 return ;
10540 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010541 if( pWdaParams != NULL )
10542 {
10543 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10544 {
10545 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10546 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010547 if( pWdaParams->wdaMsgParam != NULL)
10548 {
10549 vos_mem_free(pWdaParams->wdaMsgParam);
10550 }
10551
10552 vos_mem_free(pWdaParams) ;
10553 }
10554
10555 return ;
10556}
Jeff Johnson295189b2012-06-20 16:38:30 -070010557/*
10558 * FUNCTION: WDA_UpdateScanParamsCallback
10559 *
10560 */
10561void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10562{
10563 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010564 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10565 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010566 if(NULL == pWdaParams)
10567 {
10568 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10569 "%s: pWdaParams received NULL", __FUNCTION__);
10570 VOS_ASSERT(0) ;
10571 return ;
10572 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010573 if( pWdaParams != NULL )
10574 {
10575 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10576 {
10577 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10578 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010579 if( pWdaParams->wdaMsgParam != NULL)
10580 {
10581 vos_mem_free(pWdaParams->wdaMsgParam);
10582 }
10583 vos_mem_free(pWdaParams) ;
10584 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010585 return ;
10586}
Jeff Johnson295189b2012-06-20 16:38:30 -070010587/*
10588 * FUNCTION: WDA_SetPowerParamsCallback
10589 *
10590 */
10591void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10592{
Jeff Johnsone7245742012-09-05 17:12:55 -070010593 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010594
10595 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10596 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010597 if(NULL == pWdaParams)
10598 {
10599 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10600 "%s: pWdaParams received NULL", __FUNCTION__);
10601 VOS_ASSERT(0) ;
10602 return ;
10603 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010604 if( pWdaParams != NULL )
10605 {
10606 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10607 {
10608 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10609 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010610 if( pWdaParams->wdaMsgParam != NULL)
10611 {
10612 vos_mem_free(pWdaParams->wdaMsgParam);
10613 }
10614 vos_mem_free(pWdaParams) ;
10615 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010616 return ;
10617}
Jeff Johnson295189b2012-06-20 16:38:30 -070010618/*
10619 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10620 * Request to WDI to set Preferred Network List.Offload
10621 */
10622VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10623 tSirPNOScanReq *pPNOScanReqParams)
10624{
Jeff Johnson43971f52012-07-17 12:26:56 -070010625 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010626 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10627 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10628 tWDA_ReqParams *pWdaParams ;
10629 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010630 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10631 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010632 if(NULL == pwdiPNOScanReqInfo)
10633 {
10634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10636 VOS_ASSERT(0);
10637 return VOS_STATUS_E_NOMEM;
10638 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010639 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10640 if(NULL == pWdaParams)
10641 {
10642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10643 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10644 VOS_ASSERT(0);
10645 vos_mem_free(pwdiPNOScanReqInfo);
10646 return VOS_STATUS_E_NOMEM;
10647 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010648 //
10649 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10650 //
10651 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10652 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010653 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10654 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10655 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010656 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10657 {
10658 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10659 &pPNOScanReqParams->aNetworks[i],
10660 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10661 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010662 /*Scan timer intervals*/
10663 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10664 &pPNOScanReqParams->scanTimers,
10665 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010666 /*Probe template for 2.4GHz band*/
10667 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10668 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10669 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010670 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10671 pPNOScanReqParams->p24GProbeTemplate,
10672 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010673 /*Probe template for 5GHz band*/
10674 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10675 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10676 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010677 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10678 pPNOScanReqParams->p5GProbeTemplate,
10679 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010680 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010681 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10682 {
10683 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10684 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10685 VOS_ASSERT(0);
10686 vos_mem_free(pwdiPNOScanReqInfo) ;
10687 vos_mem_free(pWdaParams);
10688 return VOS_STATUS_E_FAILURE;
10689 }
10690
10691 /* Store Params pass it to WDI */
10692 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10693 pWdaParams->pWdaContext = pWDA;
10694 /* Store param pointer as passed in by caller */
10695 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010696 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10697 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010698 if(IS_WDI_STATUS_FAILURE(status))
10699 {
10700 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10701 "Failure in Set PNO REQ WDI API, free all the memory " );
10702 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10703 vos_mem_free(pWdaParams->wdaMsgParam);
10704 pWdaParams->wdaWdiApiMsgParam = NULL;
10705 pWdaParams->wdaMsgParam = NULL;
10706 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010707 return CONVERT_WDI2VOS_STATUS(status) ;
10708}
Jeff Johnson295189b2012-06-20 16:38:30 -070010709/*
10710 * FUNCTION: WDA_RssiFilterCallback
10711 *
10712 */
10713void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10714{
10715 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10716
10717 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10718 "<------ %s " ,__FUNCTION__);
10719
10720 VOS_ASSERT(NULL != pWdaParams);
10721
10722 vos_mem_free(pWdaParams->wdaMsgParam) ;
10723 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10724 vos_mem_free(pWdaParams) ;
10725
10726 return ;
10727}
10728/*
10729 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10730 * Request to WDI to set Preferred Network List.Offload
10731 */
10732VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10733 tSirSetRSSIFilterReq* pRssiFilterParams)
10734{
Jeff Johnson43971f52012-07-17 12:26:56 -070010735 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010736 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10737 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10738 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010739 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10740 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010741 if(NULL == pwdiSetRssiFilterReqInfo)
10742 {
10743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10744 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10745 VOS_ASSERT(0);
10746 return VOS_STATUS_E_NOMEM;
10747 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010748 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10749 if(NULL == pWdaParams)
10750 {
10751 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10752 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10753 VOS_ASSERT(0);
10754 vos_mem_free(pwdiSetRssiFilterReqInfo);
10755 return VOS_STATUS_E_NOMEM;
10756 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010757 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10758 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010759 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10760 {
10761 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10762 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10763 VOS_ASSERT(0);
10764 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
10765 vos_mem_free(pWdaParams);
10766 return VOS_STATUS_E_FAILURE;
10767 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010768 /* Store Params pass it to WDI */
10769 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10770 pWdaParams->pWdaContext = pWDA;
10771 /* Store param pointer as passed in by caller */
10772 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010773 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10774 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10775 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010776 if(IS_WDI_STATUS_FAILURE(status))
10777 {
10778 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10779 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10780 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10781 vos_mem_free(pWdaParams->wdaMsgParam);
10782 pWdaParams->wdaWdiApiMsgParam = NULL;
10783 pWdaParams->wdaMsgParam = NULL;
10784 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010785 return CONVERT_WDI2VOS_STATUS(status) ;
10786}
10787
Jeff Johnson295189b2012-06-20 16:38:30 -070010788/*
10789 * FUNCTION: WDA_ProcessUpdateScanParams
10790 * Request to WDI to update Scan Parameters
10791 */
10792VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10793 tSirUpdateScanParams *pUpdateScanParams)
10794{
Jeff Johnson43971f52012-07-17 12:26:56 -070010795 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010796 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10797 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10798 sizeof(WDI_UpdateScanParamsInfoType)) ;
10799 tWDA_ReqParams *pWdaParams ;
10800 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010801 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10802 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010803 if(NULL == wdiUpdateScanParamsInfoType)
10804 {
10805 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10806 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10807 VOS_ASSERT(0);
10808 return VOS_STATUS_E_NOMEM;
10809 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010810 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10811 if ( NULL == pWdaParams )
10812 {
10813 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10814 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10815 VOS_ASSERT(0);
10816 vos_mem_free(wdiUpdateScanParamsInfoType);
10817 return VOS_STATUS_E_NOMEM;
10818 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010819 //
10820 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10821 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010822 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10823 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10824 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10825 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10826 "sir struct %d wdi struct %d",
10827 pUpdateScanParams->b11dEnabled,
10828 pUpdateScanParams->b11dResolved,
10829 pUpdateScanParams->ucChannelCount,
10830 pUpdateScanParams->usPassiveMinChTime,
10831 pUpdateScanParams->usPassiveMaxChTime,
10832 pUpdateScanParams->usActiveMinChTime,
10833 pUpdateScanParams->usActiveMaxChTime,
10834 sizeof(tSirUpdateScanParams),
10835 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10836
Jeff Johnson295189b2012-06-20 16:38:30 -070010837 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
10838 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070010839 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
10840 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070010841 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
10842 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070010843 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
10844 pUpdateScanParams->usActiveMaxChTime;
10845 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
10846 pUpdateScanParams->usActiveMinChTime;
10847 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
10848 pUpdateScanParams->usPassiveMaxChTime;
10849 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
10850 pUpdateScanParams->usPassiveMinChTime;
10851
Jeff Johnson295189b2012-06-20 16:38:30 -070010852 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
10853 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
10854 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
10855
Jeff Johnson295189b2012-06-20 16:38:30 -070010856 for ( i = 0; i <
10857 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
10858 i++)
10859 {
10860 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10861 "Update Scan Parameters channel: %d",
10862 pUpdateScanParams->aChannels[i]);
10863
10864 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
10865 pUpdateScanParams->aChannels[i];
10866 }
10867
Jeff Johnson295189b2012-06-20 16:38:30 -070010868 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010869 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10870 {
10871 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10872 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10873 VOS_ASSERT(0);
10874 vos_mem_free(pWdaParams);
10875 vos_mem_free(wdiUpdateScanParamsInfoType);
10876 return VOS_STATUS_E_FAILURE;
10877 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010878 /* Store Params pass it to WDI */
10879 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
10880 pWdaParams->pWdaContext = pWDA;
10881 /* Store param pointer as passed in by caller */
10882 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070010883
Jeff Johnson295189b2012-06-20 16:38:30 -070010884
10885
10886 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
10887 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
10888 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010889 if(IS_WDI_STATUS_FAILURE(status))
10890 {
10891 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10892 "Failure in Update Scan Params EQ WDI API, free all the memory " );
10893 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10894 vos_mem_free(pWdaParams->wdaMsgParam);
10895 vos_mem_free(pWdaParams);
10896 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010897 return CONVERT_WDI2VOS_STATUS(status) ;
10898}
10899#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070010900#ifdef WLAN_FEATURE_PACKET_FILTERING
10901/*
10902 * FUNCTION: WDA_8023MulticastListReqCallback
10903 *
10904 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070010905void WDA_8023MulticastListReqCallback(
10906 WDI_RcvFltPktSetMcListRspParamsType *pwdiRcvFltPktSetMcListRspInfo,
10907 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070010908{
10909 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010910 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10911 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010912 if(NULL == pWdaParams)
10913 {
10914 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10915 "%s: pWdaParams received NULL", __FUNCTION__);
10916 VOS_ASSERT(0) ;
10917 return ;
10918 }
10919
10920 vos_mem_free(pWdaParams->wdaMsgParam) ;
10921 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10922 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010923 //print a msg, nothing else to do
10924 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10925 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010926 return ;
10927}
Jeff Johnson295189b2012-06-20 16:38:30 -070010928/*
10929 * FUNCTION: WDA_Process8023MulticastListReq
10930 * Request to WDI to add 8023 Multicast List
10931 */
10932VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
10933 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
10934{
Jeff Johnson43971f52012-07-17 12:26:56 -070010935 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010936 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
10937 tWDA_ReqParams *pWdaParams ;
10938 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10940 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010941 pwdiFltPktSetMcListReqParamsType =
10942 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
10943 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
10944 ) ;
10945 if(NULL == pwdiFltPktSetMcListReqParamsType)
10946 {
10947 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10948 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10949 return VOS_STATUS_E_NOMEM;
10950 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010951 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10952 if(NULL == pWdaParams)
10953 {
10954 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10955 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10956 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10957 return VOS_STATUS_E_NOMEM;
10958 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010959 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10960 {
10961 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10962 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
10963 __FUNCTION__);
10964 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10965 vos_mem_free(pWdaParams);
10966 return VOS_STATUS_E_FAILURE;
10967 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010968 //
10969 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
10970 //
10971 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070010972 pRcvFltMcAddrList->ulMulticastAddrCnt;
10973
10974 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
10975 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
10976 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
10977 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
10978
Jeff Johnson295189b2012-06-20 16:38:30 -070010979 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
10980 {
10981 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
10982 &(pRcvFltMcAddrList->multicastAddr[i]),
10983 sizeof(tSirMacAddr));
10984 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010985 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010986 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
10987 (NULL == pWDA->wdaWdiApiMsgParam)); */
Jeff Johnson295189b2012-06-20 16:38:30 -070010988 /* Store Params pass it to WDI */
10989 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
10990 pWdaParams->pWdaContext = pWDA;
10991 /* Store param pointer as passed in by caller */
10992 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070010993 status = WDI_8023MulticastListReq(
10994 pwdiFltPktSetMcListReqParamsType,
10995 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
10996 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010997 if(IS_WDI_STATUS_FAILURE(status))
10998 {
10999 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11000 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
11001 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11002 vos_mem_free(pWdaParams->wdaMsgParam);
11003 vos_mem_free(pWdaParams);
11004 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011005 return CONVERT_WDI2VOS_STATUS(status) ;
11006}
Jeff Johnson295189b2012-06-20 16:38:30 -070011007/*
11008 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11009 *
11010 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011011void WDA_ReceiveFilterSetFilterReqCallback(
11012 WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo,
11013 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011014{
11015 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011016 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11017 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011019 if(NULL == pWdaParams)
11020 {
11021 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11022 "%s: pWdaParams received NULL", __FUNCTION__);
11023 VOS_ASSERT(0) ;
11024 return ;
11025 }
11026
11027 vos_mem_free(pWdaParams->wdaMsgParam) ;
11028 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11029 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011030 //print a msg, nothing else to do
11031 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11032 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011033 return ;
11034}
Jeff Johnson295189b2012-06-20 16:38:30 -070011035/*
11036 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
11037 * Request to WDI to set Receive Filters
11038 */
11039VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
11040 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
11041{
Jeff Johnson43971f52012-07-17 12:26:56 -070011042 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011043 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
11044 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
11045 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
11046 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
11047 tWDA_ReqParams *pWdaParams ;
11048 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070011049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11050 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011051 if(NULL == pwdiSetRcvPktFilterReqParamsType)
11052 {
11053 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11054 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11055 VOS_ASSERT(0);
11056 return VOS_STATUS_E_NOMEM;
11057 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011058 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11059 if(NULL == pWdaParams)
11060 {
11061 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11062 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11063 VOS_ASSERT(0);
11064 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
11065 return VOS_STATUS_E_NOMEM;
11066 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011067 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
11068 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
11069 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
11070 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070011071 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
11072 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
11073
11074 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
11075 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011076
11077 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11078 "FID %d FT %d NParams %d CT %d",
11079 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
11080 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
11081 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
11082 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070011083 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
11084 {
11085 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
11086 &pRcvPktFilterCfg->paramsData[i],
11087 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070011088 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11089 "Proto %d Comp Flag %d \n",
11090 pwdiSetRcvPktFilterReqParamsType->
11091 wdiPktFilterCfg.paramsData[i].protocolLayer,
11092 pwdiSetRcvPktFilterReqParamsType->
11093 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070011094 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11095 "Data Offset %d Data Len %d\n",
11096 pwdiSetRcvPktFilterReqParamsType->
11097 wdiPktFilterCfg.paramsData[i].dataOffset,
11098 pwdiSetRcvPktFilterReqParamsType->
11099 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070011100 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11101 "CData: %d:%d:%d:%d:%d:%d\n",
11102 pwdiSetRcvPktFilterReqParamsType->
11103 wdiPktFilterCfg.paramsData[i].compareData[0],
11104 pwdiSetRcvPktFilterReqParamsType->
11105 wdiPktFilterCfg.paramsData[i].compareData[1],
11106 pwdiSetRcvPktFilterReqParamsType->
11107 wdiPktFilterCfg.paramsData[i].compareData[2],
11108 pwdiSetRcvPktFilterReqParamsType->
11109 wdiPktFilterCfg.paramsData[i].compareData[3],
11110 pwdiSetRcvPktFilterReqParamsType->
11111 wdiPktFilterCfg.paramsData[i].compareData[4],
11112 pwdiSetRcvPktFilterReqParamsType->
11113 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011114 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11115 "MData: %d:%d:%d:%d:%d:%d\n",
11116 pwdiSetRcvPktFilterReqParamsType->
11117 wdiPktFilterCfg.paramsData[i].dataMask[0],
11118 pwdiSetRcvPktFilterReqParamsType->
11119 wdiPktFilterCfg.paramsData[i].dataMask[1],
11120 pwdiSetRcvPktFilterReqParamsType->
11121 wdiPktFilterCfg.paramsData[i].dataMask[2],
11122 pwdiSetRcvPktFilterReqParamsType->
11123 wdiPktFilterCfg.paramsData[i].dataMask[3],
11124 pwdiSetRcvPktFilterReqParamsType->
11125 wdiPktFilterCfg.paramsData[i].dataMask[4],
11126 pwdiSetRcvPktFilterReqParamsType->
11127 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011128 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011129 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011130 /* Store Params pass it to WDI */
11131 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
11132 pWdaParams->pWdaContext = pWDA;
11133 /* Store param pointer as passed in by caller */
11134 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011135 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
11136 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
11137 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011138 if(IS_WDI_STATUS_FAILURE(status))
11139 {
11140 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11141 "Failure in SetFilter(),free all the memory,status %d ",status);
11142 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11143 vos_mem_free(pWdaParams->wdaMsgParam);
11144 vos_mem_free(pWdaParams);
11145 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011146 return CONVERT_WDI2VOS_STATUS(status) ;
11147}
Jeff Johnson295189b2012-06-20 16:38:30 -070011148/*
11149 * FUNCTION: WDA_FilterMatchCountReqCallback
11150 *
11151 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011152void WDA_FilterMatchCountReqCallback(
11153 WDI_RcvFltPktMatchCntRspParamsType *pwdiRcvFltPktMatchRspParams,
11154 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011155{
11156 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11157 tWDA_CbContext *pWDA;
11158 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
11159 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
11160 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
11161 tANI_U8 i;
11162 vos_msg_t vosMsg;
11163
11164 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11165 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011166 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
11167
Jeff Johnsone7245742012-09-05 17:12:55 -070011168 if(NULL == pRcvFltPktMatchCntRsp)
11169 {
11170 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11171 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
11172 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011173 vos_mem_free(pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -070011174 return ;
11175 }
11176
Jeff Johnson295189b2012-06-20 16:38:30 -070011177 if(NULL == pWdaParams)
11178 {
11179 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11180 "%s: pWdaParams received NULL", __FUNCTION__);
11181 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011182 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070011183 return ;
11184 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011185 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
11186 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011187 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
11188 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
11189
11190 /* Message Header */
11191 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11192 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
11193
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011194 pRcvFltPktMatchCntRsp->status = pwdiRcvFltPktMatchRspParams->wdiStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -070011195
11196 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
11197 {
11198 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
11199 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
11200 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011201 /* VOS message wrapper */
11202 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11203 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
11204 vosMsg.bodyval = 0;
11205 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
11206 {
11207 /* free the mem and return */
11208 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
11209 }
11210
11211 vos_mem_free(pWdaParams->wdaMsgParam) ;
11212 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11213 vos_mem_free(pWdaParams) ;
11214}
Jeff Johnson295189b2012-06-20 16:38:30 -070011215/*
11216 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
11217 * Request to WDI to get PC Filter Match Count
11218 */
11219VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
11220{
Jeff Johnson43971f52012-07-17 12:26:56 -070011221 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011222 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
11223 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
11224 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011225 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11226 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011227 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
11228 {
11229 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11230 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11231 VOS_ASSERT(0);
11232 return VOS_STATUS_E_NOMEM;
11233 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011234 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11235 if(NULL == pWdaParams)
11236 {
11237 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11238 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11239 VOS_ASSERT(0);
11240 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11241 return VOS_STATUS_E_NOMEM;
11242 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011243 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11244 {
11245 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11246 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11247 VOS_ASSERT(0);
11248 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11249 vos_mem_free(pWdaParams);
11250 return VOS_STATUS_E_FAILURE;
11251 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011252 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
11253
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011254 vos_mem_copy( pwdiRcvFltPktMatchCntReqParamsType->bssId,
11255 pRcvFltPktMatchRsp->bssId,
11256 sizeof(wpt_macAddr));
11257
Jeff Johnson295189b2012-06-20 16:38:30 -070011258 /* Store Params pass it to WDI */
11259 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
11260 pWdaParams->pWdaContext = pWDA;
11261 /* Store param pointer as passed in by caller */
11262 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011263 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11264 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11265 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011266 if(IS_WDI_STATUS_FAILURE(status))
11267 {
11268 /* failure returned by WDI API */
11269 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11270 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11271 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11272 vos_mem_free(pWdaParams) ;
11273 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11274 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11275 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011276 return CONVERT_WDI2VOS_STATUS(status) ;
11277}
Jeff Johnson295189b2012-06-20 16:38:30 -070011278/*
11279 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11280 *
11281 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011282void WDA_ReceiveFilterClearFilterReqCallback(
11283 WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType,
11284 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011285{
11286 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011287 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11288 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011289/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11290 if(NULL == pWdaParams)
11291 {
11292 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11293 "%s: pWdaParams received NULL", __FUNCTION__);
11294 VOS_ASSERT(0) ;
11295 return ;
11296 }
11297
11298 vos_mem_free(pWdaParams->wdaMsgParam) ;
11299 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11300 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011301 //print a msg, nothing else to do
11302 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11303 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011304 return ;
11305}
Jeff Johnson295189b2012-06-20 16:38:30 -070011306/*
11307 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11308 * Request to WDI to clear Receive Filters
11309 */
11310VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11311 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11312{
Jeff Johnson43971f52012-07-17 12:26:56 -070011313 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011314 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11315 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11316 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011317 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11318 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011319 if(NULL == pwdiRcvFltPktClearReqParamsType)
11320 {
11321 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11322 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11323 VOS_ASSERT(0);
11324 return VOS_STATUS_E_NOMEM;
11325 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011326 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11327 if(NULL == pWdaParams)
11328 {
11329 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11330 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11331 VOS_ASSERT(0);
11332 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11333 return VOS_STATUS_E_NOMEM;
11334 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011335 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11336 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011337 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11338 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11339 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11340 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011341
11342 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011343 /* Store Params pass it to WDI */
11344 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11345 pWdaParams->pWdaContext = pWDA;
11346 /* Store param pointer as passed in by caller */
11347 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011348 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11349 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11350 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011351 if(IS_WDI_STATUS_FAILURE(status))
11352 {
11353 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11354 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11355 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11356 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011357 return CONVERT_WDI2VOS_STATUS(status) ;
11358}
11359#endif // WLAN_FEATURE_PACKET_FILTERING
11360
Jeff Johnson295189b2012-06-20 16:38:30 -070011361/*
11362 * FUNCTION: WDA_ProcessSetPowerParamsReq
11363 * Request to WDI to set power params
11364 */
11365VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11366 tSirSetPowerParamsReq *pPowerParams)
11367{
Jeff Johnson43971f52012-07-17 12:26:56 -070011368 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011369 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11370 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011371 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011372 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11373 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011374 if(NULL == pwdiSetPowerParamsReqInfo)
11375 {
11376 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11377 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11378 VOS_ASSERT(0);
11379 return VOS_STATUS_E_NOMEM;
11380 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011381 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11382 if(NULL == pWdaParams)
11383 {
11384 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11385 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11386 VOS_ASSERT(0);
11387 vos_mem_free(pwdiSetPowerParamsReqInfo);
11388 return VOS_STATUS_E_NOMEM;
11389 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011390
Jeff Johnson295189b2012-06-20 16:38:30 -070011391
11392 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11393 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011394 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11395 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011396 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11397 pPowerParams->uListenInterval;
11398 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11399 pPowerParams->uBcastMcastFilter;
11400 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11401 pPowerParams->uEnableBET;
11402 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11403 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011404 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011405 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11406 {
11407 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11408 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11409 VOS_ASSERT(0);
11410 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
11411 vos_mem_free(pWdaParams);
11412 return VOS_STATUS_E_FAILURE;
11413 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011414 /* Store Params pass it to WDI */
11415 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11416 pWdaParams->pWdaContext = pWDA;
11417 /* Store param pointer as passed in by caller */
11418 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011419 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11420 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11421 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011422 if(IS_WDI_STATUS_FAILURE(status))
11423 {
11424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11425 "Failure in Set power params REQ WDI API, free all the memory " );
11426 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11427 vos_mem_free(pWdaParams->wdaMsgParam);
11428 pWdaParams->wdaWdiApiMsgParam = NULL;
11429 pWdaParams->wdaMsgParam = NULL;
11430 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011431 return CONVERT_WDI2VOS_STATUS(status) ;
11432}
11433
11434/*
11435 * FUNCTION: WDA_SetTmLevelRspCallback
11436 * Set TM Level response
11437 */
11438void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11439{
11440 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11441
11442 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11443 "<------ %s " ,__FUNCTION__);
11444
11445 if(NULL == pWdaParams)
11446 {
11447 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11448 "%s: pWdaParams received NULL", __FUNCTION__);
11449 VOS_ASSERT(0) ;
11450 return ;
11451 }
11452
11453 /* Dose not need to send notification to upper layer
11454 * Just free allocated resources */
11455 if( pWdaParams != NULL )
11456 {
11457 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11458 {
11459 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11460 }
11461 vos_mem_free(pWdaParams->wdaMsgParam) ;
11462 vos_mem_free(pWdaParams) ;
11463 }
11464}
11465
11466/*
11467 * FUNCTION: WDA_ProcessSetTmLevelReq
11468 * Set TM Level request
11469 */
11470VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11471 tAniSetTmLevelReq *setTmLevelReq)
11472{
11473 WDI_Status status = WDI_STATUS_SUCCESS ;
11474 tWDA_ReqParams *pWdaParams ;
11475 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11476 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11477 sizeof(WDI_SetTmLevelReqType)) ;
11478 if(NULL == wdiSetTmLevelReq)
11479 {
11480 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11481 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11482 VOS_ASSERT(0);
11483 return VOS_STATUS_E_NOMEM;
11484 }
11485
11486 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11487 if(NULL == pWdaParams)
11488 {
11489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11490 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11491 VOS_ASSERT(0);
11492 vos_mem_free(wdiSetTmLevelReq);
11493 return VOS_STATUS_E_NOMEM;
11494 }
11495
11496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11497 "------> %s " ,__FUNCTION__);
11498
11499 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11500 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11501
11502 pWdaParams->pWdaContext = pWDA;
11503 pWdaParams->wdaMsgParam = setTmLevelReq;
11504 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11505
11506 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11507 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11508
11509 if(IS_WDI_STATUS_FAILURE(status))
11510 {
11511 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11512 "Failure set thernal mitigation level free all the memory " );
11513 vos_mem_free(pWdaParams->wdaMsgParam) ;
11514 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11515 vos_mem_free(pWdaParams) ;
11516 }
11517
11518 return CONVERT_WDI2VOS_STATUS(status) ;
11519}
11520
11521VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11522 tpTxControlParams pTxCtrlParam)
11523{
11524 VOS_STATUS wdaStatus;
11525
11526 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11527 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011528 if( pTxCtrlParam == NULL )
11529 {
11530 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11531 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11532 return VOS_STATUS_E_FAILURE;
11533 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011534 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11535 {
11536 wdaStatus = WDA_SuspendDataTx(pWDA);
11537 }
11538 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11539 {
11540 wdaStatus = WDA_ResumeDataTx(pWDA);
11541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011542 return wdaStatus;
11543}
11544
11545 /* FUNCTION WDA_featureCapsExchange
11546 * WDA API to invoke capability exchange between host and FW.
11547 */
11548void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11549{
11550 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11551 "%s:enter", __FUNCTION__ );
11552 WDI_featureCapsExchangeReq( NULL, pVosContext);
11553}
11554
11555 /* FUNCTION WDA_getHostWlanFeatCaps
11556 * Wrapper for WDI API, that will return if the feature (enum value).passed
11557 * to this API is supported or not in Host
11558 * return value
11559 * 0 - implies feature is NOT Supported
11560 * any non zero value - implies feature is SUPPORTED
11561 */
11562tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11563{
11564 return WDI_getHostWlanFeatCaps(featEnumValue);
11565}
11566
11567 /* FUNCTION WDA_getFwWlanFeatCaps
11568 * Wrapper for WDI API, that will return if the feature (enum value).passed
11569 * to this API is supported or not in FW
11570 * return value
11571 * 0 - implies feature is NOT Supported
11572 * any non zero value - implies feature is SUPPORTED
11573 */
11574tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11575{
11576 return WDI_getFwWlanFeatCaps(featEnumValue);
11577}
11578
11579/*
11580 * FUNCTION: WDA_shutdown
11581 * Shutdown WDA/WDI without handshaking with Riva.
11582 * Synchronous function.
11583 */
11584VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11585{
11586 WDI_Status wdiStatus;
11587 //tANI_U8 eventIdx = 0;
11588 VOS_STATUS status = VOS_STATUS_SUCCESS;
11589 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011590 if (NULL == pWDA)
11591 {
11592 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11593 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11594 VOS_ASSERT(0);
11595 return VOS_STATUS_E_FAILURE;
11596 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011597 /* FTM mode stay START_STATE */
11598 if( (WDA_READY_STATE != pWDA->wdaState) &&
11599 (WDA_INIT_STATE != pWDA->wdaState) &&
11600 (WDA_START_STATE != pWDA->wdaState) )
11601 {
11602 VOS_ASSERT(0);
11603 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011604 if(NULL != pWDA->wdaWdiApiMsgParam)
11605 {
11606 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11607 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11608 VOS_ASSERT(0);
11609 /* the last request was not freed, probably a SSR
11610 * initiated by WLAN driver (WDI timeout) */
11611 vos_mem_free(pWDA->wdaWdiApiMsgParam);
11612 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011613 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11614 {
11615 wdaDestroyTimers(pWDA);
11616 }
11617 pWDA->wdaWdiApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011618 /* call WDI shutdown */
11619 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011620 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11621 {
11622 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11623 "error in WDA Stop" );
11624 status = VOS_STATUS_E_FAILURE;
11625 }
11626 /* WDI stop is synchrnous, shutdown is complete when it returns */
11627 pWDA->wdaState = WDA_STOP_STATE;
11628
Jeff Johnson295189b2012-06-20 16:38:30 -070011629 /* shutdown should perform the stop & close actions. */
11630 /* Destroy the event */
11631 status = vos_event_destroy(&pWDA->txFrameEvent);
11632 if(!VOS_IS_STATUS_SUCCESS(status))
11633 {
11634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11635 "VOS Event destroy failed - status = %d\n", status);
11636 status = VOS_STATUS_E_FAILURE;
11637 }
11638 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11639 if(!VOS_IS_STATUS_SUCCESS(status))
11640 {
11641 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11642 "VOS Event destroy failed - status = %d\n", status);
11643 status = VOS_STATUS_E_FAILURE;
11644 }
11645 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11646 if(!VOS_IS_STATUS_SUCCESS(status))
11647 {
11648 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11649 "VOS Event destroy failed - status = %d\n", status);
11650 status = VOS_STATUS_E_FAILURE;
11651 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011652 /* free WDA context */
11653 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11654 if ( !VOS_IS_STATUS_SUCCESS(status) )
11655 {
11656 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11657 "error in WDA close " );
11658 status = VOS_STATUS_E_FAILURE;
11659 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011660 return status;
11661}
Jeff Johnsone7245742012-09-05 17:12:55 -070011662/*
11663 * FUNCTION: WDA_stopFailed
11664 * WDA stop failed
11665 */
11666
11667void WDA_stopFailed(v_PVOID_t pVosContext)
11668{
11669 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -070011670 if(pWDA == NULL)
11671 {
11672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11673 "Could not get the WDA Context pointer" );
11674 return;
11675 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011676 pWDA->needShutdown = TRUE;
11677}
11678/*
11679 * FUNCTION: WDA_needShutdown
11680 * WDA needs a shutdown
11681 */
11682
11683v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11684{
11685 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -070011686 if(pWDA == NULL)
11687 {
11688 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11689 "Could not get the WDA Context pointer" );
11690 return 0;
11691 }
11692 return pWDA->needShutdown;
Jeff Johnsone7245742012-09-05 17:12:55 -070011693}
11694
Mohit Khanna4a70d262012-09-11 16:30:12 -070011695#ifdef WLAN_FEATURE_11AC
11696/*
11697 * FUNCTION: WDA_SetBeaconFilterReqCallback
11698 *
11699 */
11700void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11701{
11702 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11703 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11704 "<------ %s " ,__FUNCTION__);
11705 if(NULL == pWdaParams)
11706 {
11707 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11708 "%s: pWdaParams received NULL", __FUNCTION__);
11709 VOS_ASSERT(0) ;
11710 return ;
11711 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011712
Mohit Khanna4a70d262012-09-11 16:30:12 -070011713 vos_mem_free(pWdaParams->wdaMsgParam) ;
11714 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11715 vos_mem_free(pWdaParams) ;
11716 /*
11717 * No respone required for SetBeaconFilter req so just free the request
11718 * param here
11719 */
11720
11721 return ;
11722}
11723
11724VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11725 tUpdateVHTOpMode *pData)
11726{
11727 WDI_Status status = WDI_STATUS_SUCCESS ;
11728 tWDA_ReqParams *pWdaParams ;
11729 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11730 sizeof(WDI_UpdateVHTOpMode)) ;
11731 if(NULL == wdiTemp)
11732 {
11733 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11734 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11735 VOS_ASSERT(0);
11736 return VOS_STATUS_E_NOMEM;
11737 }
11738 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11739 if(NULL == pWdaParams)
11740 {
11741 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11742 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11743 VOS_ASSERT(0);
11744 vos_mem_free(wdiTemp);
11745 return VOS_STATUS_E_NOMEM;
11746 }
11747
11748 wdiTemp->opMode = pData->opMode;
11749 wdiTemp->staId = pData->staId;
11750
11751 pWdaParams->pWdaContext = pWDA;
11752 /* Store Req pointer, as this will be used for response */
11753 pWdaParams->wdaMsgParam = (void *)pData;
11754 /* store Params pass it to WDI */
11755 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11756
11757 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11758
11759 if(IS_WDI_STATUS_FAILURE(status))
11760 {
11761 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11762 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11763 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11764 vos_mem_free(pWdaParams->wdaMsgParam);
11765 vos_mem_free(pWdaParams);
11766 }
11767 return CONVERT_WDI2VOS_STATUS(status) ;
11768}
11769#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011770
11771/*==========================================================================
11772 FUNCTION WDA_TransportChannelDebug
11773
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -070011774 DESCRIPTION
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011775 Display Transport Channel debugging information
11776 User may request to display DXE channel snapshot
11777 Or if host driver detects any abnormal stcuk may display
11778
11779 PARAMETERS
11780 displaySnapshot : Dispaly DXE snapshot option
11781 enableStallDetect : Enable stall detect feature
11782 This feature will take effect to data performance
11783 Not integrate till fully verification
11784
11785 RETURN VALUE
11786 NONE
11787
11788===========================================================================*/
11789void WDA_TransportChannelDebug
11790(
11791 v_BOOL_t displaySnapshot,
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011792 v_BOOL_t toggleStallDetect
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011793)
11794{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011795 WDI_TransportChannelDebug(displaySnapshot, toggleStallDetect);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011796 return;
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070011797}