blob: 2979735b242fccfe7209983f16a7f78ce5e2bf9d [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);
7556 return VOS_STATUS_E_FAILURE;
7557 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007558 /* Store param pointer as passed in by caller */
7559 /* store Params pass it to WDI */
7560 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7561 pWdaParams->pWdaContext = pWDA;
7562 pWdaParams->wdaMsgParam = pHostOffloadParams;
7563
Jeff Johnson43971f52012-07-17 12:26:56 -07007564 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007565 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7566
Jeff Johnson43971f52012-07-17 12:26:56 -07007567 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007568 {
7569 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7570 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007571 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007572 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7573 vos_mem_free(pWdaParams->wdaMsgParam);
7574 vos_mem_free(pWdaParams) ;
7575 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007576 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007577
7578}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007579/*
7580 * FUNCTION: WDA_KeepAliveReqCallback
7581 *
7582 */
7583void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7584{
7585 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007586 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7587 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007588 vos_mem_free(pWDA->wdaWdiApiMsgParam);
7589 vos_mem_free(pWDA->wdaMsgParam);
7590 pWDA->wdaWdiApiMsgParam = NULL;
7591 pWDA->wdaMsgParam = NULL;
7592
Jeff Johnson295189b2012-06-20 16:38:30 -07007593 //print a msg, nothing else to do
7594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7595 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007596 return ;
7597}
Jeff Johnson295189b2012-06-20 16:38:30 -07007598/*
7599 * FUNCTION: WDA_ProcessKeepAliveReq
7600 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7601 * wakeup due to broadcast traffic (sta mode).
7602 */
7603VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7604 tSirKeepAliveReq *pKeepAliveParams)
7605{
7606 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007607 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007608 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7609 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7610 sizeof(WDI_KeepAliveReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007611 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7612 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007613 if(NULL == wdiKeepAliveInfo)
7614 {
7615 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7616 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7617 VOS_ASSERT(0);
7618 return VOS_STATUS_E_NOMEM;
7619 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007620 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7621 pKeepAliveParams->packetType;
7622 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7623 pKeepAliveParams->timePeriod;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007624
7625 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.bssId,
7626 pKeepAliveParams->bssId,
7627 sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007628
7629 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7630 {
7631 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7632 pKeepAliveParams->hostIpv4Addr,
7633 SIR_IPV4_ADDR_LEN);
7634 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7635 pKeepAliveParams->destIpv4Addr,
7636 SIR_IPV4_ADDR_LEN);
7637 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7638 pKeepAliveParams->destMacAddr,
7639 SIR_MAC_ADDR_LEN);
7640 }
7641 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7642 {
7643 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7644 SIR_IPV4_ADDR_LEN,
7645 0);
7646 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7647 SIR_IPV4_ADDR_LEN,
7648 0);
7649 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7650 SIR_MAC_ADDR_LEN,
7651 0);
7652 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007653 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007654 if((NULL != pWDA->wdaMsgParam) ||
7655 (NULL != pWDA->wdaWdiApiMsgParam))
7656 {
7657 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7658 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
7659 VOS_ASSERT(0);
7660 vos_mem_free(wdiKeepAliveInfo);
7661 return VOS_STATUS_E_FAILURE;
7662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007663 /* Store param pointer as passed in by caller */
7664 pWDA->wdaMsgParam = pKeepAliveParams;
7665 /* store Params pass it to WDI */
7666 pWDA->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007667 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7668 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7669 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7670 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7671 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7672 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7673 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7674 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7675 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7676 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7677 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7678 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7679 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7680 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7681 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7682 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7683 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7684 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7686 "TimePeriod %d PacketType %d",
7687 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7688 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007689 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007690 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWDA);
Jeff Johnson43971f52012-07-17 12:26:56 -07007691 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007692 {
7693 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7694 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007695 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007696 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
7697 vos_mem_free(pWDA->wdaMsgParam);
7698 pWDA->wdaWdiApiMsgParam = NULL;
7699 pWDA->wdaMsgParam = NULL;
7700 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007701 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007702
7703}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007704/*
7705 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7706 *
7707 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007708void WDA_WowlAddBcPtrnReqCallback(
7709 WDI_WowlAddBcPtrnRspParamsType *pWdiWowlAddBcstPtrRsp,
7710 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007711{
7712 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007713 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7714 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007715 if(NULL == pWdaParams)
7716 {
7717 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7718 "%s: pWdaParams received NULL", __FUNCTION__);
7719 VOS_ASSERT(0) ;
7720 return ;
7721 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007722 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7723 vos_mem_free(pWdaParams->wdaMsgParam);
7724 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007725 return ;
7726}
Jeff Johnson295189b2012-06-20 16:38:30 -07007727/*
7728 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7729 * Request to WDI to add WOWL Bcast pattern
7730 */
7731VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7732 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7733{
7734 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007735 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007736 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7737 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7738 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7739 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007740 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7741 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007742 if(NULL == wdiWowlAddBcPtrnInfo)
7743 {
7744 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7745 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7746 VOS_ASSERT(0);
7747 return VOS_STATUS_E_NOMEM;
7748 }
7749 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7750 if(NULL == pWdaParams)
7751 {
7752 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7753 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7754 VOS_ASSERT(0);
7755 vos_mem_free(wdiWowlAddBcPtrnInfo);
7756 return VOS_STATUS_E_NOMEM;
7757 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007758 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7759 pWowlAddBcPtrnParams->ucPatternId;
7760 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7761 pWowlAddBcPtrnParams->ucPatternByteOffset;
7762 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7763 pWowlAddBcPtrnParams->ucPatternMaskSize;
7764 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7765 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007766 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7767 {
7768 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7769 pWowlAddBcPtrnParams->ucPattern,
7770 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7771 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7772 pWowlAddBcPtrnParams->ucPatternMask,
7773 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7774 }
7775 else
7776 {
7777 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7778 pWowlAddBcPtrnParams->ucPattern,
7779 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7780 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7781 pWowlAddBcPtrnParams->ucPatternMask,
7782 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7783
7784 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7785 pWowlAddBcPtrnParams->ucPatternExt,
7786 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7787 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7788 pWowlAddBcPtrnParams->ucPatternMaskExt,
7789 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7790 }
7791
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007792 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.bssId,
7793 pWowlAddBcPtrnParams->bssId, sizeof(wpt_macAddr));
7794
Jeff Johnson295189b2012-06-20 16:38:30 -07007795 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007796 /* Store param pointer as passed in by caller */
7797 /* store Params pass it to WDI */
7798 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7799 pWdaParams->pWdaContext = pWDA;
7800 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007801 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007802 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007803 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007804 {
7805 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7806 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007807 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007808 vos_mem_free(pWdaParams->wdaMsgParam) ;
7809 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7810 vos_mem_free(pWdaParams) ;
7811 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007812 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007813
7814}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007815/*
7816 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7817 *
7818 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007819void WDA_WowlDelBcPtrnReqCallback(
7820 WDI_WowlDelBcPtrnRspParamsType *pWdiWowlDelBcstPtrRsp,
7821 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007822{
7823 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007824 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7825 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007826 if(NULL == pWdaParams)
7827 {
7828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7829 "%s: pWdaParams received NULL", __FUNCTION__);
7830 VOS_ASSERT(0) ;
7831 return ;
7832 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007833 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7834 vos_mem_free(pWdaParams->wdaMsgParam);
7835 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007836 return ;
7837}
Jeff Johnson295189b2012-06-20 16:38:30 -07007838/*
7839 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7840 * Request to WDI to delete WOWL Bcast pattern
7841 */
7842VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7843 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7844{
7845 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007846 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007847 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7848 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7849 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7850 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007851 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7852 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007853 if(NULL == wdiWowlDelBcPtrnInfo)
7854 {
7855 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7856 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7857 VOS_ASSERT(0);
7858 return VOS_STATUS_E_NOMEM;
7859 }
7860 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7861 if(NULL == pWdaParams)
7862 {
7863 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7864 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7865 VOS_ASSERT(0);
7866 vos_mem_free(wdiWowlDelBcPtrnInfo);
7867 return VOS_STATUS_E_NOMEM;
7868 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007869 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7870 pWowlDelBcPtrnParams->ucPatternId;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007871
7872 vos_mem_copy(wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.bssId,
7873 pWowlDelBcPtrnParams->bssId, sizeof(wpt_macAddr));
7874
Jeff Johnson295189b2012-06-20 16:38:30 -07007875 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007876 /* Store param pointer as passed in by caller */
7877 /* store Params pass it to WDI */
7878 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7879 pWdaParams->pWdaContext = pWDA;
7880 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007881 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007882 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007883 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007884 {
7885 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7886 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007887 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007888 vos_mem_free(pWdaParams->wdaMsgParam) ;
7889 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7890 vos_mem_free(pWdaParams) ;
7891 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007892 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007893
7894}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007895/*
7896 * FUNCTION: WDA_WowlEnterReqCallback
7897 *
7898 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007899void WDA_WowlEnterReqCallback(WDI_WowlEnterRspParamsType *pwdiWowlEnterRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007900{
7901 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
7902 tWDA_CbContext *pWDA;
7903 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007904 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7905 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007906 if(NULL == pWdaParams)
7907 {
7908 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7909 "%s: pWdaParams received NULL", __FUNCTION__);
7910 VOS_ASSERT(0) ;
7911 return ;
7912 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007913 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
7914 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
7915
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007916 pWowlEnterParams->bssIdx = pwdiWowlEnterRspParam->bssIdx;
7917
Jeff Johnson295189b2012-06-20 16:38:30 -07007918 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7919 vos_mem_free(pWdaParams) ;
7920
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007921 pWowlEnterParams->status =
7922 CONVERT_WDI2SIR_STATUS(pwdiWowlEnterRspParam->status);
Jeff Johnson295189b2012-06-20 16:38:30 -07007923 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007924 return ;
7925}
Jeff Johnson295189b2012-06-20 16:38:30 -07007926/*
7927 * FUNCTION: WDA_ProcessWowlEnterReq
7928 * Request to WDI to enter WOWL
7929 */
7930VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
7931 tSirHalWowlEnterParams *pWowlEnterParams)
7932{
7933 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007934 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007935 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
7936 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
7937 sizeof(WDI_WowlEnterReqParamsType)) ;
7938 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7940 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007941 if(NULL == wdiWowlEnterInfo)
7942 {
7943 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7944 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7945 VOS_ASSERT(0);
7946 return VOS_STATUS_E_NOMEM;
7947 }
7948 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7949 if(NULL == pWdaParams)
7950 {
7951 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7952 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7953 VOS_ASSERT(0);
7954 vos_mem_free(wdiWowlEnterInfo);
7955 return VOS_STATUS_E_NOMEM;
7956 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007957 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
7958 pWowlEnterParams->magicPtrn,
7959 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007960 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
7961 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007962 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
7963 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007964 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
7965 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07007966 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
7967 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007968 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
7969 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007970 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
7971 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07007972 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
7973 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07007974 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
7975 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07007976#ifdef WLAN_WAKEUP_EVENTS
7977 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
7978 pWowlEnterParams->ucWoWEAPIDRequestEnable;
7979
7980 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
7981 pWowlEnterParams->ucWoWEAPOL4WayEnable;
7982
7983 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
7984 pWowlEnterParams->ucWowNetScanOffloadMatch;
7985
7986 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
7987 pWowlEnterParams->ucWowGTKRekeyError;
7988
7989 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
7990 pWowlEnterParams->ucWoWBSSConnLoss;
7991#endif // WLAN_WAKEUP_EVENTS
7992
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007993 wdiWowlEnterInfo->wdiWowlEnterInfo.bssIdx =
7994 pWowlEnterParams->bssIdx;
7995
Jeff Johnson295189b2012-06-20 16:38:30 -07007996 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007997 /* Store param pointer as passed in by caller */
7998 /* store Params pass it to WDI */
7999 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
8000 pWdaParams->pWdaContext = pWDA;
8001 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008002 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07008003 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008004 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008005 {
8006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8007 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008008 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008009 vos_mem_free(pWdaParams->wdaMsgParam) ;
8010 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8011 vos_mem_free(pWdaParams) ;
8012 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008013 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008014
8015}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008016/*
8017 * FUNCTION: WDA_WowlExitReqCallback
8018 *
8019 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008020void WDA_WowlExitReqCallback( WDI_WowlExitRspParamsType *pwdiWowlExitRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008021{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008022 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8023 tWDA_CbContext *pWDA;
8024 tSirHalWowlExitParams *pWowlExitParams;
8025 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8026 "<------ %s " ,__FUNCTION__);
8027 if(NULL == pWdaParams)
8028 {
8029 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8030 "%s: pWdaParams received NULL", __FUNCTION__);
8031 VOS_ASSERT(0) ;
8032 return ;
8033 }
8034 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8035 pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam ;
8036
8037 pWowlExitParams->bssIdx = pwdiWowlExitRsp->bssIdx;
8038 pWowlExitParams->status = CONVERT_WDI2SIR_STATUS(pwdiWowlExitRsp->status);
8039
8040 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8041 vos_mem_free(pWdaParams) ;
8042
Jeff Johnson295189b2012-06-20 16:38:30 -07008043 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8044 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008045 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008046 return ;
8047}
Jeff Johnson295189b2012-06-20 16:38:30 -07008048/*
8049 * FUNCTION: WDA_ProcessWowlExitReq
8050 * Request to WDI to add WOWL Bcast pattern
8051 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008052VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA,
8053 tSirHalWowlExitParams *pWowlExitParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07008054{
8055 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008056 WDI_Status wstatus;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008057 WDI_WowlExitReqParamsType *wdiWowlExitInfo =
8058 (WDI_WowlExitReqParamsType *)vos_mem_malloc(
8059 sizeof(WDI_WowlExitReqParamsType)) ;
8060 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008061 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8062 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008063 if(NULL == wdiWowlExitInfo)
8064 {
8065 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8066 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8067 VOS_ASSERT(0);
8068 return VOS_STATUS_E_NOMEM;
8069 }
8070 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8071 if(NULL == pWdaParams)
8072 {
8073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8074 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8075 VOS_ASSERT(0);
8076 vos_mem_free(wdiWowlExitInfo);
8077 return VOS_STATUS_E_NOMEM;
8078 }
8079
8080 wdiWowlExitInfo->wdiWowlExitInfo.bssIdx =
8081 pWowlExitParams->bssIdx;
8082
8083 wdiWowlExitInfo->wdiReqStatusCB = NULL;
8084
8085 /* Store param pointer as passed in by caller */
8086 /* store Params pass it to WDI */
8087 pWdaParams->wdaWdiApiMsgParam = wdiWowlExitInfo;
8088 pWdaParams->pWdaContext = pWDA;
8089 pWdaParams->wdaMsgParam = pWowlExitParams;
8090
8091 wstatus = WDI_WowlExitReq(wdiWowlExitInfo,
8092 (WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008093
Jeff Johnson43971f52012-07-17 12:26:56 -07008094 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008095 {
8096 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8097 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008098 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008099 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8100 vos_mem_free(pWdaParams->wdaMsgParam);
8101 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008102 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008103 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008104}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008105/*
8106 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
8107 * Request to WDI to determine whether a given station is capable of
8108 * using HW-based frame translation
8109 */
8110v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
8111 tANI_U8 staIdx)
8112{
8113 return WDI_IsHwFrameTxTranslationCapable(staIdx);
8114}
Jeff Johnson295189b2012-06-20 16:38:30 -07008115/*
8116 * FUNCTION: WDA_NvDownloadReqCallback
8117 * send NV Download RSP back to PE
8118 */
8119void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
8120 void* pUserData)
8121{
Jeff Johnson295189b2012-06-20 16:38:30 -07008122 tWDA_CbContext *pWDA= ( tWDA_CbContext *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008123 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8124 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008125 /*Cleaning */
8126 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8127 pWDA->wdaWdiApiMsgParam = NULL;
8128 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008129 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008130 return ;
8131}
Jeff Johnson295189b2012-06-20 16:38:30 -07008132/*
8133 * FUNCTION: WDA_ProcessNvDownloadReq
8134 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
8135 */
8136VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
8137{
8138 /* Initialize the local Variables*/
8139 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8140 v_VOID_t *pNvBuffer=NULL;
8141 v_SIZE_t bufferSize = 0;
8142 WDI_Status status = WDI_STATUS_E_FAILURE;
8143 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8145 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008146 if(NULL == pWDA)
8147 {
8148 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8149 "%s:pWDA is NULL", __FUNCTION__);
8150 return VOS_STATUS_E_FAILURE;
8151 }
8152 if(NULL != pWDA->wdaWdiApiMsgParam)
8153 {
8154 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8155 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
8156 return VOS_STATUS_E_FAILURE;
8157 }
8158
8159 /* Get the NV structure base address and size from VOS */
8160 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07008161 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
8162 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008163 if(NULL == wdiNvDownloadReqParam)
8164 {
8165 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8166 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8167 VOS_ASSERT(0);
8168 return VOS_STATUS_E_NOMEM;
8169 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008170 /* Copy Params to wdiNvDownloadReqParam*/
8171 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
8172 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07008173 /* store Params pass it to WDI */
8174 pWDA->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008175 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008176 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
8177 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008178 if(IS_WDI_STATUS_FAILURE(status))
8179 {
8180 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8181 "Failure in NV Download REQ Params WDI API, free all the memory " );
8182 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8183 pWDA->wdaWdiApiMsgParam = NULL;
8184 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008185 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008186}
8187/*
8188 * FUNCTION: WDA_FlushAcReqCallback
8189 * send Flush AC RSP back to TL
8190 */
8191void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
8192{
8193 vos_msg_t wdaMsg = {0} ;
8194 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8195 tFlushACReq *pFlushACReqParams;
8196 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07008197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8198 "<------ %s " ,__FUNCTION__);
8199 if(NULL == pWdaParams)
8200 {
8201 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8202 "%s: pWdaParams received NULL", __FUNCTION__);
8203 VOS_ASSERT(0) ;
8204 return ;
8205 }
8206
8207 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
8208 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
8209 if(NULL == pFlushACRspParams)
8210 {
8211 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8212 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8213 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07008214 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008215 return ;
8216 }
8217 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
8218 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
8219 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
8220 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
8221 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
8222 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008223 vos_mem_free(pWdaParams->wdaMsgParam) ;
8224 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8225 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008226 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8227 wdaMsg.bodyptr = (void *)pFlushACRspParams;
8228 // POST message to TL
8229 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
8230
Jeff Johnson295189b2012-06-20 16:38:30 -07008231 return ;
8232}
Jeff Johnson295189b2012-06-20 16:38:30 -07008233/*
8234 * FUNCTION: WDA_ProcessFlushAcReq
8235 * Request to WDI to Update the DELBA REQ params.
8236 */
8237VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8238 tFlushACReq *pFlushAcReqParams)
8239{
8240 WDI_Status status = WDI_STATUS_SUCCESS ;
8241 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8242 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8243 sizeof(WDI_FlushAcReqParamsType)) ;
8244 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008245 if(NULL == wdiFlushAcReqParam)
8246 {
8247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8248 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8249 VOS_ASSERT(0);
8250 return VOS_STATUS_E_NOMEM;
8251 }
8252 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8253 if(NULL == pWdaParams)
8254 {
8255 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8256 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8257 VOS_ASSERT(0);
8258 vos_mem_free(wdiFlushAcReqParam);
8259 return VOS_STATUS_E_NOMEM;
8260 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008261 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8262 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008263 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8264 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8265 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8266 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008267 /* Store Flush AC pointer, as this will be used for response */
8268 /* store Params pass it to WDI */
8269 pWdaParams->pWdaContext = pWDA;
8270 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8271 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008272 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8273 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008274 if(IS_WDI_STATUS_FAILURE(status))
8275 {
8276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8277 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8278 vos_mem_free(pWdaParams->wdaMsgParam) ;
8279 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8280 vos_mem_free(pWdaParams) ;
8281 //TODO: respond to TL with failure
8282 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008283 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008284}
Jeff Johnson295189b2012-06-20 16:38:30 -07008285/*
8286 * FUNCTION: WDA_BtAmpEventReqCallback
8287 *
8288 */
8289void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8290{
8291 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8292 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008293 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008294
8295 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8296 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008297 if(NULL == pWdaParams)
8298 {
8299 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8300 "%s: pWdaParams received NULL", __FUNCTION__);
8301 VOS_ASSERT(0) ;
8302 return ;
8303 }
8304 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8305 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8306 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8307 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8308 {
8309 pWDA->wdaAmpSessionOn = VOS_FALSE;
8310 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008311 vos_mem_free(pWdaParams->wdaMsgParam) ;
8312 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8313 vos_mem_free(pWdaParams) ;
8314 /*
8315 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8316 * param here
8317 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008318 return ;
8319}
8320
Jeff Johnson295189b2012-06-20 16:38:30 -07008321/*
8322 * FUNCTION: WDA_ProcessBtAmpEventReq
8323 * Request to WDI to Update with BT AMP events.
8324 */
8325VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8326 tSmeBtAmpEvent *pBtAmpEventParams)
8327{
8328 WDI_Status status = WDI_STATUS_SUCCESS ;
8329 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8330 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8331 sizeof(WDI_BtAmpEventParamsType)) ;
8332 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008333 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8334 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008335 if(NULL == wdiBtAmpEventParam)
8336 {
8337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8338 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8339 VOS_ASSERT(0);
8340 return VOS_STATUS_E_NOMEM;
8341 }
8342 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8343 if(NULL == pWdaParams)
8344 {
8345 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8346 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8347 VOS_ASSERT(0);
8348 vos_mem_free(wdiBtAmpEventParam);
8349 return VOS_STATUS_E_NOMEM;
8350 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008351 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8352 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008353 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008354 /* Store BT AMP event pointer, as this will be used for response */
8355 /* store Params pass it to WDI */
8356 pWdaParams->pWdaContext = pWDA;
8357 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8358 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008359 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8360 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008361 if(IS_WDI_STATUS_FAILURE(status))
8362 {
8363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8364 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8365 vos_mem_free(pWdaParams->wdaMsgParam) ;
8366 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8367 vos_mem_free(pWdaParams) ;
8368 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008369 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8370 {
8371 pWDA->wdaAmpSessionOn = VOS_TRUE;
8372 }
8373 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008374}
8375
Jeff Johnson295189b2012-06-20 16:38:30 -07008376#ifdef ANI_MANF_DIAG
8377/*
8378 * FUNCTION: WDA_FTMCommandReqCallback
8379 * Handle FTM CMD response came from HAL
8380 * Route responce to HDD FTM
8381 */
8382void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8383 void *usrData)
8384{
8385 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008386 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8387 {
8388 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8389 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8390 return;
8391 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008392 /* Release Current FTM Command Request */
8393 vos_mem_free(pWDA->wdaFTMCmdReq);
8394 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008395#ifndef WLAN_FTM_STUB
8396 /* Post FTM Responce to HDD FTM */
8397 wlan_sys_ftm(ftmCmdRspData);
8398#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008399 return;
8400}
Jeff Johnson295189b2012-06-20 16:38:30 -07008401/*
8402 * FUNCTION: WDA_ProcessFTMCommand
8403 * Send FTM command to WDI
8404 */
8405VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8406 tPttMsgbuffer *pPTTFtmCmd)
8407{
8408 WDI_Status status = WDI_STATUS_SUCCESS;
8409 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008410 ftmCMDReq = (WDI_FTMCommandReqType *)
8411 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8412 if(NULL == ftmCMDReq)
8413 {
8414 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8415 "WDA FTM Command buffer alloc fail");
8416 return VOS_STATUS_E_NOMEM;
8417 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008418 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8419 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008420 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008421 /* Send command to WDI */
8422 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008423 return status;
8424}
8425#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008426#ifdef FEATURE_OEM_DATA_SUPPORT
8427/*
8428 * FUNCTION: WDA_StartOemDataReqCallback
8429 *
8430 */
8431void WDA_StartOemDataReqCallback(
8432 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8433 void* pUserData)
8434{
8435 VOS_STATUS status = VOS_STATUS_E_FAILURE;
8436 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
8437 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008438
Jeff Johnsone7245742012-09-05 17:12:55 -07008439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8440 "<------ %s " ,__FUNCTION__);
8441 if(NULL == pWDA)
8442 {
8443 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8444 "%s:pWDA is NULL", __FUNCTION__);
8445 VOS_ASSERT(0);
8446 return ;
8447 }
8448
8449 /*
8450 * Allocate memory for response params sent to PE
8451 */
8452 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8453
8454 // Check if memory is allocated for OemdataMeasRsp Params.
8455 if(NULL == pOemDataRspParams)
8456 {
8457 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8458 "OEM DATA WDA callback alloc fail");
8459 VOS_ASSERT(0) ;
8460 return;
8461 }
8462 // Free the memory allocated during request.
8463 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8464 vos_mem_free(pWDA->wdaMsgParam) ;
8465 pWDA->wdaWdiApiMsgParam = NULL;
8466 pWDA->wdaMsgParam = NULL;
8467 /*
8468 * Now go ahead and copy other stuff for PE in incase of sucess only
8469 * Also, here success always means that we have atleast one BSSID.
8470 */
8471 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8472
8473 //enable Tx
8474 status = WDA_ResumeDataTx(pWDA);
8475 if(status != VOS_STATUS_SUCCESS)
8476 {
8477 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8478 }
8479 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8480 return ;
8481}
8482/*
8483 * FUNCTION: WDA_ProcessStartOemDataReq
8484 * Send Start Oem Data Req to WDI
8485 */
8486VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8487 tStartOemDataReq *pOemDataReqParams)
8488{
8489 WDI_Status status = WDI_STATUS_SUCCESS;
8490 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
8491
8492 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8493
8494 if(NULL == wdiOemDataReqParams)
8495 {
8496 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8497 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8498 VOS_ASSERT(0);
8499 return VOS_STATUS_E_NOMEM;
8500 }
8501
8502 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr, pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8503 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq, pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
8504
8505 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8506
8507 if((NULL != pWDA->wdaMsgParam) ||
8508 (NULL != pWDA->wdaWdiApiMsgParam))
8509 {
8510 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8511 "%s:wdaWdiApiMsgParam is Not NULL", __FUNCTION__);
8512 VOS_ASSERT(0);
8513 vos_mem_free(wdiOemDataReqParams);
8514 return VOS_STATUS_E_FAILURE;
8515 }
8516 pWDA->wdaMsgParam = (void *)pOemDataReqParams;
8517 pWDA->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8518
8519 status = WDI_StartOemDataReq(wdiOemDataReqParams, (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWDA);
8520
8521 if(IS_WDI_STATUS_FAILURE(status))
8522 {
8523 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8524 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
8525 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
8526 vos_mem_free(pWDA->wdaMsgParam);
8527 pWDA->wdaWdiApiMsgParam = NULL;
8528 pWDA->wdaMsgParam = NULL;
8529 }
8530 return CONVERT_WDI2VOS_STATUS(status) ;
8531}
8532#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008533/*
8534 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8535 *
8536 */
8537void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8538{
8539 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008540 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8541 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008542 if(NULL == pWdaParams)
8543 {
8544 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8545 "%s: pWdaParams received NULL", __FUNCTION__);
8546 VOS_ASSERT(0) ;
8547 return ;
8548 }
8549
8550 if(NULL != pWdaParams->wdaMsgParam)
8551 {
8552 vos_mem_free(pWdaParams->wdaMsgParam);
8553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008554 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8555 {
8556 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8557 }
8558
8559 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008560 return ;
8561}
Jeff Johnson295189b2012-06-20 16:38:30 -07008562#ifdef WLAN_FEATURE_GTK_OFFLOAD
8563/*
8564 * FUNCTION: WDA_HostOffloadReqCallback
8565 *
8566 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008567void WDA_GTKOffloadReqCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparams,
8568 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008569{
8570 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8571
8572 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8573 "<------ %s " ,__FUNCTION__);
8574
8575 VOS_ASSERT(NULL != pWdaParams);
8576
8577 vos_mem_free(pWdaParams->wdaMsgParam) ;
8578 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8579 vos_mem_free(pWdaParams) ;
8580
8581 //print a msg, nothing else to do
8582 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8583 "WDA_GTKOffloadReqCallback invoked " );
8584
8585 return ;
8586}
8587
8588/*
8589 * FUNCTION: WDA_ProcessGTKOffloadReq
8590 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8591 * to broadcast traffic (sta mode).
8592 */
8593VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8594 tpSirGtkOffloadParams pGtkOffloadParams)
8595{
8596 VOS_STATUS status = VOS_STATUS_SUCCESS;
8597 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8598 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8599 sizeof(WDI_GtkOffloadReqMsg)) ;
8600 tWDA_ReqParams *pWdaParams ;
8601
8602 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8603 "------> %s " ,__FUNCTION__);
8604
8605 if(NULL == wdiGtkOffloadReqMsg)
8606 {
8607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8608 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8609 VOS_ASSERT(0);
8610 return VOS_STATUS_E_NOMEM;
8611 }
8612
8613 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8614 if(NULL == pWdaParams)
8615 {
8616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8617 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8618 VOS_ASSERT(0);
8619 vos_mem_free(wdiGtkOffloadReqMsg);
8620 return VOS_STATUS_E_NOMEM;
8621 }
8622
8623 //
8624 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8625 //
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008626
8627 vos_mem_copy(wdiGtkOffloadReqMsg->gtkOffloadReqParams.bssId,
8628 pGtkOffloadParams->bssId, sizeof(wpt_macAddr))
8629
Jeff Johnson295189b2012-06-20 16:38:30 -07008630 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8631 // Copy KCK
8632 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8633 // Copy KEK
8634 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8635 // Copy KeyReplayCounter
8636 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8637 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8638
8639 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8640
8641 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8642 (NULL == pWDA->wdaWdiApiMsgParam));
8643
8644 /* Store Params pass it to WDI */
8645 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8646 pWdaParams->pWdaContext = pWDA;
8647 /* Store param pointer as passed in by caller */
8648 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8649
8650 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8651
8652 if(IS_WDI_STATUS_FAILURE(status))
8653 {
8654 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8655 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8656 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8657 vos_mem_free(pWdaParams->wdaMsgParam);
8658 vos_mem_free(pWdaParams);
8659 }
8660
8661 return CONVERT_WDI2VOS_STATUS(status) ;
8662}
8663
8664/*
8665 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8666 *
8667 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008668void WDA_GtkOffloadGetInfoCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkOffloadGetInfoRsparams,
8669 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008670{
8671 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8672 tWDA_CbContext *pWDA;
8673 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8674 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8675 tANI_U8 i;
8676 vos_msg_t vosMsg;
8677
8678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8679 "<------ %s " ,__FUNCTION__);
8680
8681 VOS_ASSERT(NULL != pWdaParams);
8682
8683 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8684 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8685
8686 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8687 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8688
8689 /* Message Header */
8690 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8691 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8692
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008693 pGtkOffloadGetInfoRsp->ulStatus = pwdiGtkOffloadGetInfoRsparams->ulStatus;
8694 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pwdiGtkOffloadGetInfoRsparams->ullKeyReplayCounter;
8695 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulTotalRekeyCount;
8696 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulGTKRekeyCount;
8697 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulIGTKRekeyCount;
8698 pGtkOffloadGetInfoRsp->bssIdx = pwdiGtkOffloadGetInfoRsparams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07008699
8700 /* VOS message wrapper */
8701 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8702 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8703 vosMsg.bodyval = 0;
8704
8705 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8706 {
8707 /* free the mem and return */
8708 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8709 }
8710
8711 vos_mem_free(pWdaParams->wdaMsgParam) ;
8712 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8713 vos_mem_free(pWdaParams) ;
8714}
8715#endif
8716
8717/*
8718 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8719 * Request to WDI to set Tx Per Tracking configurations
8720 */
8721VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8722{
8723 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008724 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008725 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8726 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8727 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8728 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008729 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8730 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008731 if(NULL == pwdiSetTxPerTrackingReqParams)
8732 {
8733 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8734 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8735 vos_mem_free(pTxPerTrackingParams);
8736 VOS_ASSERT(0);
8737 return VOS_STATUS_E_NOMEM;
8738 }
8739 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8740 if(NULL == pWdaParams)
8741 {
8742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8743 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8744 vos_mem_free(pwdiSetTxPerTrackingReqParams);
8745 vos_mem_free(pTxPerTrackingParams);
8746 VOS_ASSERT(0);
8747 return VOS_STATUS_E_NOMEM;
8748 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008749 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8750 pTxPerTrackingParams->ucTxPerTrackingEnable;
8751 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8752 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8753 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8754 pTxPerTrackingParams->ucTxPerTrackingRatio;
8755 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8756 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008757 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008758 /* Store param pointer as passed in by caller */
8759 /* store Params pass it to WDI
8760 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8761 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8762 pWdaParams->pWdaContext = pWDA;
8763 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008764 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008765 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008766 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008767 {
8768 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8769 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008770 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008771 vos_mem_free(pWdaParams->wdaMsgParam) ;
8772 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8773 vos_mem_free(pWdaParams) ;
8774 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008775 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008776
8777}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008778/*
8779 * FUNCTION: WDA_HALDumpCmdCallback
8780 * Send the VOS complete .
8781 */
8782void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8783 void* pUserData)
8784{
8785 tANI_U8 *buffer = NULL;
8786 tWDA_CbContext *pWDA = NULL;
8787 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008788 if(NULL == pWdaParams)
8789 {
8790 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8791 "%s: pWdaParams received NULL", __FUNCTION__);
8792 VOS_ASSERT(0) ;
8793 return ;
8794 }
8795
8796 pWDA = pWdaParams->pWdaContext;
8797 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008798 if(wdiRspParams->usBufferLen > 0)
8799 {
8800 /*Copy the Resp data to UMAC supplied buffer*/
8801 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8802 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008803 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8804 vos_mem_free(pWdaParams);
8805
8806 /* Indicate VOSS about the start complete */
8807 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008808 return ;
8809}
8810
Jeff Johnson295189b2012-06-20 16:38:30 -07008811/*
8812 * FUNCTION: WDA_ProcessHALDumpCmdReq
8813 * Send Dump command to WDI
8814 */
8815VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8816 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8817 tANI_U32 arg4, tANI_U8 *pBuffer)
8818{
8819 WDI_Status status = WDI_STATUS_SUCCESS;
8820 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8821 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8822 tWDA_ReqParams *pWdaParams ;
8823 pVosContextType pVosContext = NULL;
8824 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008825 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8826 (void *)pMac);
8827
8828 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8829 if(NULL == pWdaParams)
8830 {
8831 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8832 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8833 return VOS_STATUS_E_NOMEM;
8834 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008835 /* Allocate memory WDI request structure*/
8836 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8837 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8838 if(NULL == wdiHALDumpCmdReqParam)
8839 {
8840 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8841 "WDA HAL DUMP Command buffer alloc fail");
8842 vos_mem_free(pWdaParams);
8843 return WDI_STATUS_E_FAILURE;
8844 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008845 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008846 /* Extract the arguments */
8847 wdiHalDumpCmdInfo->command = cmd;
8848 wdiHalDumpCmdInfo->argument1 = arg1;
8849 wdiHalDumpCmdInfo->argument2 = arg2;
8850 wdiHalDumpCmdInfo->argument3 = arg3;
8851 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07008852 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008853 pWdaParams->pWdaContext = pVosContext->pWDAContext;
8854
8855 /* Response message will be passed through the buffer */
8856 pWdaParams->wdaMsgParam = (void *)pBuffer;
8857
8858 /* store Params pass it to WDI */
8859 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008860 /* Send command to WDI */
8861 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008862 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07008863 if ( vStatus != VOS_STATUS_SUCCESS )
8864 {
8865 if ( vStatus == VOS_STATUS_E_TIMEOUT )
8866 {
8867 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8868 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
8869 }
8870 else
8871 {
8872 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
8873 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
8874 }
8875 VOS_ASSERT(0);
8876 }
8877 return status;
8878}
Jeff Johnson295189b2012-06-20 16:38:30 -07008879#ifdef WLAN_FEATURE_GTK_OFFLOAD
8880/*
8881 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
8882 * Request to WDI to get GTK Offload Information
8883 */
8884VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
8885 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
8886{
8887 VOS_STATUS status = VOS_STATUS_SUCCESS;
8888 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
8889 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
8890 tWDA_ReqParams *pWdaParams ;
8891
8892 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
8893 {
8894 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8895 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8896 VOS_ASSERT(0);
8897 return VOS_STATUS_E_NOMEM;
8898 }
8899
8900 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8901 if(NULL == pWdaParams)
8902 {
8903 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8904 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8905 VOS_ASSERT(0);
8906 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
8907 return VOS_STATUS_E_NOMEM;
8908 }
8909
8910 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
8911
8912 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8913 (NULL == pWDA->wdaWdiApiMsgParam));
8914
8915 /* Store Params pass it to WDI */
8916 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
8917 pWdaParams->pWdaContext = pWDA;
8918 /* Store param pointer as passed in by caller */
8919 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
8920
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008921 vos_mem_copy(pwdiGtkOffloadGetInfoReqMsg->WDI_GtkOffloadGetInfoReqParams.bssId,
8922 pGtkOffloadGetInfoRsp->bssId, sizeof(wpt_macAddr))
8923
Jeff Johnson295189b2012-06-20 16:38:30 -07008924 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
8925
8926 if(IS_WDI_STATUS_FAILURE(status))
8927 {
8928 /* failure returned by WDI API */
8929 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8930 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
8931 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8932 vos_mem_free(pWdaParams) ;
8933 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
8934 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
8935 }
8936
8937 return CONVERT_WDI2VOS_STATUS(status) ;
8938}
8939#endif // WLAN_FEATURE_GTK_OFFLOAD
8940
8941/*
8942 * -------------------------------------------------------------------------
8943 * DATA interface with WDI for Mgmt Frames
8944 * -------------------------------------------------------------------------
8945 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008946/*
8947 * FUNCTION: WDA_TxComplete
8948 * Callback function for the WDA_TxPacket
8949 */
8950VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
8951 VOS_STATUS status )
8952{
8953
8954 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8955 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
8956
8957 if(NULL == wdaContext)
8958 {
8959 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8960 "%s:pWDA is NULL",
8961 __FUNCTION__);
8962 VOS_ASSERT(0);
8963 return VOS_STATUS_E_FAILURE;
8964 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008965 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
8966 if( NULL!=wdaContext->pTxCbFunc)
8967 {
8968 /*check if packet is freed already*/
8969 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
8970 {
8971 wdaContext->pTxCbFunc(pMac, pData);
8972 }
8973 else
8974 {
8975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
8976 "%s:packet (0x%X) is already freed",
8977 __FUNCTION__, pData);
8978 //Return from here since we reaching here because the packet already timeout
8979 return status;
8980 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008981 }
8982
8983 /*
8984 * Trigger the event to bring the HAL TL Tx complete function to come
8985 * out of wait
8986 * Let the coe above to complete the packet first. When this event is set,
8987 * the thread waiting for the event may run and set Vospacket_freed causing the original
8988 * packet not being freed.
8989 */
8990 status = vos_event_set(&wdaContext->txFrameEvent);
8991 if(!VOS_IS_STATUS_SUCCESS(status))
8992 {
8993 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8994 "NEW VOS Event Set failed - status = %d \n", status);
8995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008996 return status;
8997}
Jeff Johnson295189b2012-06-20 16:38:30 -07008998/*
8999 * FUNCTION: WDA_TxPacket
9000 * Forward TX management frame to WDI
9001 */
9002VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
9003 void *pFrmBuf,
9004 tANI_U16 frmLen,
9005 eFrameType frmType,
9006 eFrameTxDir txDir,
9007 tANI_U8 tid,
9008 pWDATxRxCompFunc pCompFunc,
9009 void *pData,
9010 pWDAAckFnTxComp pAckTxComp,
9011 tANI_U8 txFlag)
9012{
9013 VOS_STATUS status = VOS_STATUS_SUCCESS ;
9014 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
9015 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
9016 tANI_U8 eventIdx = 0;
9017 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
9018 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009019 if((NULL == pWDA)||(NULL == pFrmBuf))
9020 {
9021 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9022 "%s:pWDA %x or pFrmBuf %x is NULL",
9023 __FUNCTION__,pWDA,pFrmBuf);
9024 VOS_ASSERT(0);
9025 return VOS_STATUS_E_FAILURE;
9026 }
9027
9028 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9029 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07009030 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
9031 if(NULL == pMac)
9032 {
9033 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9034 "%s:pMac is NULL", __FUNCTION__);
9035 VOS_ASSERT(0);
9036 return VOS_STATUS_E_FAILURE;
9037 }
9038
9039
9040
9041 /* store the call back function in WDA context */
9042 pWDA->pTxCbFunc = pCompFunc;
9043 /* store the call back for the function of ackTxComplete */
9044 if( pAckTxComp )
9045 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009046 if( NULL != pWDA->pAckTxCbFunc )
9047 {
9048 /* Already TxComp is active no need to active again */
9049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9050 "There is already one request pending for tx complete\n");
9051 pWDA->pAckTxCbFunc( pMac, 0);
9052 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07009053
Jeff Johnsone7245742012-09-05 17:12:55 -07009054 if( VOS_STATUS_SUCCESS !=
9055 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9056 {
9057 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9058 "Tx Complete timeout Timer Stop Failed ");
9059 }
9060 else
9061 {
9062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9063 "Tx Complete timeout Timer Stop Sucess ");
9064 }
9065 }
9066
9067 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
9068 pWDA->pAckTxCbFunc = pAckTxComp;
9069 if( VOS_STATUS_SUCCESS !=
9070 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
9071 {
9072 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9073 "Tx Complete Timer Start Failed ");
9074 pWDA->pAckTxCbFunc = NULL;
9075 return eHAL_STATUS_FAILURE;
9076 }
9077 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009078 /* Reset the event to be not signalled */
9079 status = vos_event_reset(&pWDA->txFrameEvent);
9080 if(!VOS_IS_STATUS_SUCCESS(status))
9081 {
9082 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9083 "VOS Event reset failed - status = %d\n",status);
9084 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9085 if( pAckTxComp )
9086 {
9087 pWDA->pAckTxCbFunc = NULL;
9088 if( VOS_STATUS_SUCCESS !=
9089 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9090 {
9091 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9092 "Tx Complete timeout Timer Stop Failed ");
9093 }
9094 }
9095 return VOS_STATUS_E_FAILURE;
9096 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009097 /* Get system role, use the self station if in unknown role or STA role */
9098 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07009099 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
9100 (( eSYSTEM_STA_ROLE == systemRole )
9101#ifdef FEATURE_WLAN_CCX
9102 && frmType == HAL_TXRX_FRM_802_11_MGMT
9103#endif
9104 ))
9105 {
9106 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9107 }
9108
Jeff Johnsone7245742012-09-05 17:12:55 -07009109 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
9110 disassoc frame reaches the HW, HAL has already deleted the peer station */
9111 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07009112 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009113 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
9114 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9115 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
9116 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07009117 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009118 /*Send Probe request frames on self sta idx*/
9119 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07009120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009121 /* Since we donot want probe responses to be retried, send probe responses
9122 through the NO_ACK queues */
9123 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
9124 {
9125 //probe response is sent out using self station and no retries options.
9126 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
9127 }
9128 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
9129 {
9130 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
9131 }
9132 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009133 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
9134
9135 /*Set frame tag to 0
9136 We will use the WDA user data in order to tag a frame as expired*/
9137 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9138 (v_PVOID_t)0);
9139
9140
9141 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
9142 frmLen, ucTypeSubType, tid,
9143 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
9144 {
9145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9146 "Sending Mgmt Frame failed - status = %d\n", status);
9147 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9148 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
9149 if( pAckTxComp )
9150 {
9151 pWDA->pAckTxCbFunc = NULL;
9152 if( VOS_STATUS_SUCCESS !=
9153 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9154 {
9155 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9156 "Tx Complete timeout Timer Stop Failed ");
9157 }
9158 }
9159 return VOS_STATUS_E_FAILURE;
9160 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009161 /*
9162 * Wait for the event to be set by the TL, to get the response of TX
9163 * complete, this event should be set by the Callback function called by TL
9164 */
9165 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
9166 &eventIdx);
9167 if(!VOS_IS_STATUS_SUCCESS(status))
9168 {
9169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9170 "%s: Status %d when waiting for TX Frame Event",
9171 __FUNCTION__, status);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07009172 WDA_TransportChannelDebug(1, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009173 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
9174 after the packet gets completed(packet freed once)*/
9175
9176 /* check whether the packet was freed already,so need not free again when
9177 * TL calls the WDA_Txcomplete routine
9178 */
9179 if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
9180 {
9181 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9182 }
9183 if( pAckTxComp )
9184 {
9185 pWDA->pAckTxCbFunc = NULL;
9186 if( VOS_STATUS_SUCCESS !=
9187 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9188 {
9189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9190 "Tx Complete timeout Timer Stop Failed ");
9191 }
9192 }
9193 status = VOS_STATUS_E_FAILURE;
9194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009195 return status;
9196}
Jeff Johnson295189b2012-06-20 16:38:30 -07009197/*
9198 * FUNCTION: WDA_McProcessMsg
9199 * Trigger DAL-AL to start CFG download
9200 */
9201VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
9202{
9203 VOS_STATUS status = VOS_STATUS_SUCCESS;
9204 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009205 if(NULL == pMsg)
9206 {
9207 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9208 "%s:pMsg is NULL", __FUNCTION__);
9209 VOS_ASSERT(0);
9210 return VOS_STATUS_E_FAILURE;
9211 }
9212
9213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
9214 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
9215
9216 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
9217 if(NULL == pWDA )
9218 {
9219 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9220 "%s:pWDA is NULL", __FUNCTION__);
9221 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07009222 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009223 return VOS_STATUS_E_FAILURE;
9224 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009225 /* Process all the WDA messages.. */
9226 switch( pMsg->type )
9227 {
9228 case WNI_CFG_DNLD_REQ:
9229 {
9230 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07009231 /* call WDA complete event if config download success */
9232 if( VOS_IS_STATUS_SUCCESS(status) )
9233 {
9234 vos_WDAComplete_cback(pVosContext);
9235 }
9236 else
9237 {
9238 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9239 "WDA Config Download failure" );
9240 }
9241 break ;
9242 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009243 /*
9244 * Init SCAN request from PE, convert it into DAL format
9245 * and send it to DAL
9246 */
9247 case WDA_INIT_SCAN_REQ:
9248 {
9249 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9250 break ;
9251 }
9252 /* start SCAN request from PE */
9253 case WDA_START_SCAN_REQ:
9254 {
9255 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9256 break ;
9257 }
9258 /* end SCAN request from PE */
9259 case WDA_END_SCAN_REQ:
9260 {
9261 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9262 break ;
9263 }
9264 /* end SCAN request from PE */
9265 case WDA_FINISH_SCAN_REQ:
9266 {
9267 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9268 break ;
9269 }
9270 /* join request from PE */
9271 case WDA_CHNL_SWITCH_REQ:
9272 {
9273 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9274 {
9275 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9276 }
9277 else
9278 {
9279 WDA_ProcessChannelSwitchReq(pWDA,
9280 (tSwitchChannelParams*)pMsg->bodyptr) ;
9281 }
9282 break ;
9283 }
9284 /* ADD BSS request from PE */
9285 case WDA_ADD_BSS_REQ:
9286 {
9287 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9288 break ;
9289 }
9290 case WDA_ADD_STA_REQ:
9291 {
9292 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9293 break ;
9294 }
9295 case WDA_DELETE_BSS_REQ:
9296 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009297 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9298 break ;
9299 }
9300 case WDA_DELETE_STA_REQ:
9301 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009302 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9303 break ;
9304 }
9305 case WDA_CONFIG_PARAM_UPDATE_REQ:
9306 {
9307 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9308 break ;
9309 }
9310 case WDA_SET_BSSKEY_REQ:
9311 {
9312 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9313 break ;
9314 }
9315 case WDA_SET_STAKEY_REQ:
9316 {
9317 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9318 break ;
9319 }
9320 case WDA_SET_STA_BCASTKEY_REQ:
9321 {
9322 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9323 break ;
9324 }
9325 case WDA_REMOVE_BSSKEY_REQ:
9326 {
9327 WDA_ProcessRemoveBssKeyReq(pWDA,
9328 (tRemoveBssKeyParams *)pMsg->bodyptr);
9329 break ;
9330 }
9331 case WDA_REMOVE_STAKEY_REQ:
9332 {
9333 WDA_ProcessRemoveStaKeyReq(pWDA,
9334 (tRemoveStaKeyParams *)pMsg->bodyptr);
9335 break ;
9336 }
9337 case WDA_REMOVE_STA_BCASTKEY_REQ:
9338 {
9339 /* TODO: currently UMAC is not sending this request, Add the code for
9340 handling this request when UMAC supports */
9341 break;
9342 }
9343#ifdef FEATURE_WLAN_CCX
9344 case WDA_TSM_STATS_REQ:
9345 {
9346 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9347 break;
9348 }
9349#endif
9350 case WDA_UPDATE_EDCA_PROFILE_IND:
9351 {
9352 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9353 break;
9354 }
9355 case WDA_ADD_TS_REQ:
9356 {
9357 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9358 break;
9359 }
9360 case WDA_DEL_TS_REQ:
9361 {
9362 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9363 break;
9364 }
9365 case WDA_ADDBA_REQ:
9366 {
9367 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9368 break;
9369 }
9370 case WDA_DELBA_IND:
9371 {
9372 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9373 break;
9374 }
9375 case WDA_SET_LINK_STATE:
9376 {
9377 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9378 break;
9379 }
9380 case WDA_GET_STATISTICS_REQ:
9381 {
9382 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9383 break;
9384 }
9385 case WDA_PWR_SAVE_CFG:
9386 {
9387 if(pWDA->wdaState == WDA_READY_STATE)
9388 {
9389 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9390 }
9391 else
9392 {
9393 if(NULL != pMsg->bodyptr)
9394 {
9395 vos_mem_free(pMsg->bodyptr);
9396 }
9397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9398 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9399 }
9400 break;
9401 }
9402 case WDA_ENTER_IMPS_REQ:
9403 {
9404 if(pWDA->wdaState == WDA_READY_STATE)
9405 {
9406 WDA_ProcessEnterImpsReq(pWDA);
9407 }
9408 else
9409 {
9410 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9411 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9412 }
9413 break;
9414 }
9415 case WDA_EXIT_IMPS_REQ:
9416 {
9417 if(pWDA->wdaState == WDA_READY_STATE)
9418 {
9419 WDA_ProcessExitImpsReq(pWDA);
9420 }
9421 else
9422 {
9423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9424 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9425 }
9426 break;
9427 }
9428 case WDA_ENTER_BMPS_REQ:
9429 {
9430 if(pWDA->wdaState == WDA_READY_STATE)
9431 {
9432 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9433 }
9434 else
9435 {
9436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9437 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9438 }
9439 break;
9440 }
9441 case WDA_EXIT_BMPS_REQ:
9442 {
9443 if(pWDA->wdaState == WDA_READY_STATE)
9444 {
9445 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9446 }
9447 else
9448 {
9449 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9450 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9451 }
9452 break;
9453 }
9454 case WDA_ENTER_UAPSD_REQ:
9455 {
9456 if(pWDA->wdaState == WDA_READY_STATE)
9457 {
9458 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9459 }
9460 else
9461 {
9462 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9463 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9464 }
9465 break;
9466 }
9467 case WDA_EXIT_UAPSD_REQ:
9468 {
9469 if(pWDA->wdaState == WDA_READY_STATE)
9470 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009471 WDA_ProcessExitUapsdReq(pWDA, (tExitUapsdParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009472 }
9473 else
9474 {
9475 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9476 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9477 }
9478 break;
9479 }
9480 case WDA_UPDATE_UAPSD_IND:
9481 {
9482 if(pWDA->wdaState == WDA_READY_STATE)
9483 {
9484 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9485 }
9486 else
9487 {
9488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9489 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9490 }
9491 break;
9492 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009493 case WDA_REGISTER_PE_CALLBACK :
9494 {
9495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9496 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9497 /*TODO: store the PE callback */
9498 /* Do Nothing? MSG Body should be freed at here */
9499 if(NULL != pMsg->bodyptr)
9500 {
9501 vos_mem_free(pMsg->bodyptr);
9502 }
9503 break;
9504 }
9505 case WDA_SYS_READY_IND :
9506 {
9507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9508 "Handling msg type WDA_SYS_READY_IND " );
9509 pWDA->wdaState = WDA_READY_STATE;
9510 if(NULL != pMsg->bodyptr)
9511 {
9512 vos_mem_free(pMsg->bodyptr);
9513 }
9514 break;
9515 }
9516 case WDA_BEACON_FILTER_IND :
9517 {
9518 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9519 break;
9520 }
9521 case WDA_BTC_SET_CFG:
9522 {
9523 /*TODO: handle this while dealing with BTC */
9524 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9525 "Handling msg type WDA_BTC_SET_CFG " );
9526 /* Do Nothing? MSG Body should be freed at here */
9527 if(NULL != pMsg->bodyptr)
9528 {
9529 vos_mem_free(pMsg->bodyptr);
9530 }
9531 break;
9532 }
9533 case WDA_SIGNAL_BT_EVENT:
9534 {
9535 /*TODO: handle this while dealing with BTC */
9536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9537 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9538 /* Do Nothing? MSG Body should be freed at here */
9539 if(NULL != pMsg->bodyptr)
9540 {
9541 vos_mem_free(pMsg->bodyptr);
9542 }
9543 break;
9544 }
9545 case WDA_CFG_RXP_FILTER_REQ:
9546 {
9547 WDA_ProcessConfigureRxpFilterReq(pWDA,
9548 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9549 break;
9550 }
9551 case WDA_SET_HOST_OFFLOAD:
9552 {
9553 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9554 break;
9555 }
9556 case WDA_SET_KEEP_ALIVE:
9557 {
9558 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9559 break;
9560 }
9561#ifdef WLAN_NS_OFFLOAD
9562 case WDA_SET_NS_OFFLOAD:
9563 {
9564 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9565 break;
9566 }
9567#endif //WLAN_NS_OFFLOAD
9568 case WDA_ADD_STA_SELF_REQ:
9569 {
9570 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9571 break;
9572 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009573 case WDA_DEL_STA_SELF_REQ:
9574 {
9575 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9576 break;
9577 }
9578 case WDA_WOWL_ADD_BCAST_PTRN:
9579 {
9580 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9581 break;
9582 }
9583 case WDA_WOWL_DEL_BCAST_PTRN:
9584 {
9585 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9586 break;
9587 }
9588 case WDA_WOWL_ENTER_REQ:
9589 {
9590 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9591 break;
9592 }
9593 case WDA_WOWL_EXIT_REQ:
9594 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009595 WDA_ProcessWowlExitReq(pWDA, (tSirHalWowlExitParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009596 break;
9597 }
9598 case WDA_TL_FLUSH_AC_REQ:
9599 {
9600 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9601 break;
9602 }
9603 case WDA_SIGNAL_BTAMP_EVENT:
9604 {
9605 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9606 break;
9607 }
9608#ifdef WDA_UT
9609 case WDA_WDI_EVENT_MSG:
9610 {
9611 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9612 break ;
9613 }
9614#endif
9615 case WDA_UPDATE_BEACON_IND:
9616 {
9617 WDA_ProcessUpdateBeaconParams(pWDA,
9618 (tUpdateBeaconParams *)pMsg->bodyptr);
9619 break;
9620 }
9621 case WDA_SEND_BEACON_REQ:
9622 {
9623 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9624 break;
9625 }
9626 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9627 {
9628 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9629 (tSendProbeRespParams *)pMsg->bodyptr);
9630 break;
9631 }
9632#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9633 case WDA_SET_MAX_TX_POWER_REQ:
9634 {
9635 WDA_ProcessSetMaxTxPowerReq(pWDA,
9636 (tMaxTxPowerParams *)pMsg->bodyptr);
9637 break;
9638 }
9639#endif
9640#ifdef WLAN_FEATURE_P2P
9641 case WDA_SET_P2P_GO_NOA_REQ:
9642 {
9643 WDA_ProcessSetP2PGONOAReq(pWDA,
9644 (tP2pPsParams *)pMsg->bodyptr);
9645 break;
9646 }
9647#endif
9648 /* timer related messages */
9649 case WDA_TIMER_BA_ACTIVITY_REQ:
9650 {
9651 WDA_BaCheckActivity(pWDA) ;
9652 break ;
9653 }
9654#ifdef WLAN_FEATURE_VOWIFI_11R
9655 case WDA_AGGR_QOS_REQ:
9656 {
9657 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9658 break;
9659 }
9660#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009661#ifdef ANI_MANF_DIAG
9662 case WDA_FTM_CMD_REQ:
9663 {
9664 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9665 break ;
9666 }
9667#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009668#ifdef FEATURE_OEM_DATA_SUPPORT
9669 case WDA_START_OEM_DATA_REQ:
9670 {
9671 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9672 break;
9673 }
9674#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009675 /* Tx Complete Time out Indication */
9676 case WDA_TX_COMPLETE_TIMEOUT_IND:
9677 {
9678 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9679 break;
9680 }
9681 case WDA_WLAN_SUSPEND_IND:
9682 {
9683 WDA_ProcessWlanSuspendInd(pWDA,
9684 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9685 break;
9686 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009687 case WDA_WLAN_RESUME_REQ:
9688 {
9689 WDA_ProcessWlanResumeReq(pWDA,
9690 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9691 break;
9692 }
9693
9694 case WDA_UPDATE_CF_IND:
9695 {
9696 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9697 pMsg->bodyptr = NULL;
9698 break;
9699 }
9700#ifdef FEATURE_WLAN_SCAN_PNO
9701 case WDA_SET_PNO_REQ:
9702 {
9703 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9704 break;
9705 }
9706 case WDA_UPDATE_SCAN_PARAMS_REQ:
9707 {
9708 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9709 break;
9710 }
9711 case WDA_SET_RSSI_FILTER_REQ:
9712 {
9713 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9714 break;
9715 }
9716#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009717 case WDA_SET_TX_PER_TRACKING_REQ:
9718 {
9719 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9720 break;
9721 }
9722
9723#ifdef WLAN_FEATURE_PACKET_FILTERING
9724 case WDA_8023_MULTICAST_LIST_REQ:
9725 {
9726 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9727 break;
9728 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009729 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9730 {
9731 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9732 break;
9733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009734 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9735 {
9736 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9737 break;
9738 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009739 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9740 {
9741 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9742 break;
9743 }
9744#endif // WLAN_FEATURE_PACKET_FILTERING
9745
9746
9747 case WDA_TRANSMISSION_CONTROL_IND:
9748 {
9749 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9750 break;
9751 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009752 case WDA_SET_POWER_PARAMS_REQ:
9753 {
9754 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9755 break;
9756 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009757#ifdef WLAN_FEATURE_GTK_OFFLOAD
9758 case WDA_GTK_OFFLOAD_REQ:
9759 {
9760 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9761 break;
9762 }
9763
9764 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9765 {
9766 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9767 break;
9768 }
9769#endif //WLAN_FEATURE_GTK_OFFLOAD
9770
9771 case WDA_SET_TM_LEVEL_REQ:
9772 {
9773 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9774 break;
9775 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009776#ifdef WLAN_FEATURE_11AC
9777 case WDA_UPDATE_OP_MODE:
9778 {
9779 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9780 {
9781 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9782 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9783 else
9784 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9785 " VHT OpMode Feature is Not Supported \n");
9786 }
9787 else
9788 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9789 " 11AC Feature is Not Supported \n");
9790 break;
9791 }
9792#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009793 default:
9794 {
9795 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9796 "No Handling for msg type %x in WDA "
9797 ,pMsg->type);
9798 /* Do Nothing? MSG Body should be freed at here */
9799 if(NULL != pMsg->bodyptr)
9800 {
9801 vos_mem_free(pMsg->bodyptr);
9802 }
9803 //WDA_VOS_ASSERT(0) ;
9804 }
9805 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009806 return status ;
9807}
9808
Jeff Johnson295189b2012-06-20 16:38:30 -07009809/*
9810 * FUNCTION: WDA_LowLevelIndCallback
9811 * IND API callback from WDI, send Ind to PE
9812 */
9813void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9814 void* pUserData )
9815{
9816 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9817#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9818 tSirRSSINotification rssiNotification;
9819#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009820 if(NULL == pWDA)
9821 {
9822 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9823 "%s:pWDA is NULL", __FUNCTION__);
9824 VOS_ASSERT(0);
9825 return ;
9826 }
9827
9828 switch(wdiLowLevelInd->wdiIndicationType)
9829 {
9830 case WDI_RSSI_NOTIFICATION_IND:
9831 {
9832 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9833 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009834#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9835 rssiNotification.bReserved =
9836 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
9837 rssiNotification.bRssiThres1NegCross =
9838 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
9839 rssiNotification.bRssiThres1PosCross =
9840 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
9841 rssiNotification.bRssiThres2NegCross =
9842 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
9843 rssiNotification.bRssiThres2PosCross =
9844 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
9845 rssiNotification.bRssiThres3NegCross =
9846 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
9847 rssiNotification.bRssiThres3PosCross =
9848 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -07009849 WLANTL_BMPSRSSIRegionChangedNotification(
9850 pWDA->pVosContext,
9851 &rssiNotification);
9852#endif
9853 break ;
9854 }
9855 case WDI_MISSED_BEACON_IND:
9856 {
9857 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9858 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009859 /* send IND to PE */
9860 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
9861 break ;
9862 }
9863 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
9864 {
9865 /* TODO: Decode Ind and send Ind to PE */
9866 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9867 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
9868 break ;
9869 }
9870
9871 case WDI_MIC_FAILURE_IND:
9872 {
9873 tpSirSmeMicFailureInd pMicInd =
9874 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
9875
9876 if(NULL == pMicInd)
9877 {
9878 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9879 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9880 break;
9881 }
9882 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9883 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009884 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
9885 pMicInd->length = sizeof(tSirSmeMicFailureInd);
9886 vos_mem_copy(pMicInd->bssId,
9887 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
9888 sizeof(tSirMacAddr));
9889 vos_mem_copy(pMicInd->info.srcMacAddr,
9890 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
9891 sizeof(tSirMacAddr));
9892 vos_mem_copy(pMicInd->info.taMacAddr,
9893 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
9894 sizeof(tSirMacAddr));
9895 vos_mem_copy(pMicInd->info.dstMacAddr,
9896 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
9897 sizeof(tSirMacAddr));
9898 vos_mem_copy(pMicInd->info.rxMacAddr,
9899 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
9900 sizeof(tSirMacAddr));
9901 pMicInd->info.multicast =
9902 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
9903 pMicInd->info.keyId=
9904 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
9905 pMicInd->info.IV1=
9906 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
9907 vos_mem_copy(pMicInd->info.TSC,
9908 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07009909 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
9910 (void *)pMicInd , 0) ;
9911 break ;
9912 }
9913 case WDI_FATAL_ERROR_IND:
9914 {
Madan Mohan Koyyalamudia2fc6412012-10-21 12:06:12 -07009915 pWDA->wdiFailed = true;
Jeff Johnson295189b2012-06-20 16:38:30 -07009916 /* TODO: Decode Ind and send Ind to PE */
9917 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9918 "Received WDI_FATAL_ERROR_IND from WDI ");
9919 break ;
9920 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009921 case WDI_DEL_STA_IND:
9922 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009923 tpDeleteStaContext pDelSTACtx =
9924 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
9925
9926 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9927 "Received WDI_DEL_STA_IND from WDI ");
9928 if(NULL == pDelSTACtx)
9929 {
9930 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9931 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9932 break;
9933 }
9934 vos_mem_copy(pDelSTACtx->addr2,
9935 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
9936 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009937 vos_mem_copy(pDelSTACtx->bssId,
9938 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
9939 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07009940 pDelSTACtx->assocId =
9941 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
9942 pDelSTACtx->reasonCode =
9943 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
9944 pDelSTACtx->staId =
9945 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009946 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
9947 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009948 break ;
9949 }
9950 case WDI_COEX_IND:
9951 {
9952 tANI_U32 index;
9953 vos_msg_t vosMsg;
9954 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
9955 if(NULL == pSmeCoexInd)
9956 {
9957 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9958 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
9959 break;
9960 }
9961 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9962 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -07009963 /* Message Header */
9964 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
9965 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -07009966 /* Info from WDI Indication */
9967 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
9968 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
9969 {
9970 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
9971 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009972 /* VOS message wrapper */
9973 vosMsg.type = eWNI_SME_COEX_IND;
9974 vosMsg.bodyptr = (void *)pSmeCoexInd;
9975 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009976 /* Send message to SME */
9977 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
9978 {
9979 /* free the mem and return */
9980 vos_mem_free((v_VOID_t *)pSmeCoexInd);
9981 }
9982 else
9983 {
9984 /* DEBUG */
9985 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9986 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
9987 pSmeCoexInd->coexIndType,
9988 pSmeCoexInd->coexIndData[0],
9989 pSmeCoexInd->coexIndData[1],
9990 pSmeCoexInd->coexIndData[2],
9991 pSmeCoexInd->coexIndData[3]);
9992 }
9993 break;
9994 }
9995 case WDI_TX_COMPLETE_IND:
9996 {
9997 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
9998 /* Calling TxCompleteAck Indication from wda context*/
9999 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10000 "Complete Indication received from HAL");
10001 if( pWDA->pAckTxCbFunc )
10002 {
10003 if( VOS_STATUS_SUCCESS !=
10004 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
10005 {
10006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10007 "Tx Complete timeout Timer Stop Failed ");
10008 }
10009 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
10010 pWDA->pAckTxCbFunc = NULL;
10011 }
10012 else
10013 {
10014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10015 "Tx Complete Indication is received after timeout ");
10016 }
10017 break;
10018 }
10019#ifdef WLAN_FEATURE_P2P
10020 case WDI_P2P_NOA_ATTR_IND :
10021 {
10022 tSirP2PNoaAttr *pP2pNoaAttr =
10023 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010024 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10025 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010026 if (NULL == pP2pNoaAttr)
10027 {
10028 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10029 "Memory allocation failure, "
10030 "WDI_P2P_NOA_ATTR_IND not forwarded");
10031 break;
10032 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010033 pP2pNoaAttr->index =
10034 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
10035 pP2pNoaAttr->oppPsFlag =
10036 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
10037 pP2pNoaAttr->ctWin =
10038 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
10039
10040 pP2pNoaAttr->uNoa1IntervalCnt =
10041 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
10042 pP2pNoaAttr->uNoa1Duration =
10043 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
10044 pP2pNoaAttr->uNoa1Interval =
10045 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
10046 pP2pNoaAttr->uNoa1StartTime =
10047 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010048 pP2pNoaAttr->uNoa2IntervalCnt =
10049 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
10050 pP2pNoaAttr->uNoa2Duration =
10051 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
10052 pP2pNoaAttr->uNoa2Interval =
10053 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
10054 pP2pNoaAttr->uNoa2StartTime =
10055 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010056 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
10057 (void *)pP2pNoaAttr , 0) ;
10058 break;
10059 }
10060#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070010061#ifdef FEATURE_WLAN_SCAN_PNO
10062 case WDI_PREF_NETWORK_FOUND_IND:
10063 {
10064 vos_msg_t vosMsg;
10065 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -070010066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10067 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010068 if (NULL == pPrefNetworkFoundInd)
10069 {
10070 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10071 "Memory allocation failure, "
10072 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
10073 break;
10074 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010075 /* Message Header */
10076 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
10077 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
10078
10079 /* Info from WDI Indication */
10080 pPrefNetworkFoundInd->ssId.length =
10081 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070010082 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070010083 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
10084 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
10085 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -070010086 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -070010087 /* VOS message wrapper */
10088 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
10089 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
10090 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010091 /* Send message to SME */
10092 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10093 {
10094 /* free the mem and return */
10095 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
10096 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010097 break;
10098 }
10099#endif // FEATURE_WLAN_SCAN_PNO
10100
10101#ifdef WLAN_WAKEUP_EVENTS
10102 case WDI_WAKE_REASON_IND:
10103 {
10104 vos_msg_t vosMsg;
10105 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
10106 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
10107 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
10108
10109 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10110 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
10111 wdiLowLevelInd->wdiIndicationType,
10112 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
10113 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
10114 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10115
10116 if (NULL == pWakeReasonInd)
10117 {
10118 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10119 "Memory allocation failure, "
10120 "WDI_WAKE_REASON_IND not forwarded");
10121 break;
10122 }
10123
10124 vos_mem_zero(pWakeReasonInd, allocSize);
10125
10126 /* Message Header */
10127 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
10128 pWakeReasonInd->mesgLen = allocSize;
10129
10130 /* Info from WDI Indication */
10131 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
10132 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
10133 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
10134 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
10135 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
10136 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
10137 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
10138 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10139
10140 /* VOS message wrapper */
10141 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
10142 vosMsg.bodyptr = (void *) pWakeReasonInd;
10143 vosMsg.bodyval = 0;
10144
10145 /* Send message to SME */
10146 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10147 {
10148 /* free the mem and return */
10149 vos_mem_free((v_VOID_t *) pWakeReasonInd);
10150 }
10151
10152 break;
10153 }
10154#endif // WLAN_WAKEUP_EVENTS
10155
10156 case WDI_TX_PER_HIT_IND:
10157 {
10158 vos_msg_t vosMsg;
10159 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
10160 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
10161 /* VOS message wrapper */
10162 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
10163 vosMsg.bodyptr = NULL;
10164 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010165 /* Send message to SME */
10166 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10167 {
10168 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
10169 }
10170 break;
10171 }
10172
10173 default:
10174 {
10175 /* TODO error */
10176 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10177 "Received UNKNOWN Indication from WDI ");
10178 }
10179 }
10180 return ;
10181}
10182
Jeff Johnson295189b2012-06-20 16:38:30 -070010183/*
10184 * BA related processing in WDA.
10185 */
Jeff Johnson295189b2012-06-20 16:38:30 -070010186void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
10187 void* pUserData)
10188{
10189 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10190 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -070010191 if(NULL == pWdaParams)
10192 {
10193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10194 "%s: pWdaParams received NULL", __FUNCTION__);
10195 VOS_ASSERT(0) ;
10196 return ;
10197 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010198 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070010199 vos_mem_free(pWdaParams->wdaMsgParam) ;
10200 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10201 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010202 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10203 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010204 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
10205 {
10206 tANI_U8 i = 0 ;
10207 tBaActivityInd *baActivityInd = NULL ;
10208 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
10209 tANI_U8 allocSize = sizeof(tBaActivityInd)
10210 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
10211 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
10212 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010213 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010214 if(NULL == baActivityInd)
10215 {
10216 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10217 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10218 VOS_ASSERT(0) ;
10219 return;
10220 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010221 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
10222 sizeof(tSirMacAddr)) ;
10223 baActivityInd->baCandidateCnt = baCandidateCount ;
10224
10225 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
10226 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
10227
10228 for(i = 0 ; i < baCandidateCount ; i++)
10229 {
10230 tANI_U8 tid = 0 ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010231 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
10232 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010233 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
10234 {
10235 baCandidate->baInfo[tid].fBaEnable =
10236 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
10237 baCandidate->baInfo[tid].startingSeqNum =
10238 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
10239 }
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070010240 wdiBaCandidate++ ;
10241 baCandidate++ ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010242 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010243 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
10244 }
10245 else
10246 {
10247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10248 "BA Trigger RSP with Failure received ");
10249 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010250 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010251}
Jeff Johnson295189b2012-06-20 16:38:30 -070010252/*
10253 * BA Activity check timer handler
10254 */
10255void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10256{
10257 tANI_U8 curSta = 0 ;
10258 tANI_U8 tid = 0 ;
10259 tANI_U8 size = 0 ;
10260 tANI_U8 baCandidateCount = 0 ;
10261 tANI_U8 newBaCandidate = 0 ;
10262 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10263
10264 if(NULL == pWDA)
10265 {
10266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10267 "%s:pWDA is NULL", __FUNCTION__);
10268 VOS_ASSERT(0);
10269 return ;
10270 }
10271 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10272 {
10273 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10274 "Inconsistent STA entries in WDA");
10275 VOS_ASSERT(0) ;
10276 }
10277 /* walk through all STA entries and find out TX packet count */
10278 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10279 {
10280 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10281 {
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010282 WLANTL_STAStateType tlSTAState ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010283 tANI_U32 txPktCount = 0 ;
10284 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010285 if((WDA_VALID_STA_INDEX == validStaIndex) &&
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010286 (VOS_STATUS_SUCCESS == WDA_TL_GET_STA_STATE( pWDA->pVosContext,
10287 curSta, &tlSTAState)) &&
Jeff Johnson295189b2012-06-20 16:38:30 -070010288 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10289 curSta, tid, &txPktCount)))
10290 {
10291#if 0
10292 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10293 "************* %d:%d, %d ",curSta, txPktCount,
10294 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10295#endif
10296 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010297 && (WLANTL_STA_AUTHENTICATED == tlSTAState)
Jeff Johnson295189b2012-06-20 16:38:30 -070010298 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10299 curSta, tid)))
10300 {
10301 /* get prepare for sending message to HAL */
10302 //baCandidate[baCandidateCount].staIdx = curSta ;
10303 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10304 newBaCandidate = WDA_ENABLE_BA ;
10305 }
10306 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10307 }
10308 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010309 /* fill the entry for all the sta with given TID's */
10310 if(WDA_ENABLE_BA == newBaCandidate)
10311 {
10312 /* move to next BA candidate */
10313 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10314 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10315 baCandidateCount++ ;
10316 newBaCandidate = WDA_DISABLE_BA ;
10317 }
10318 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010319 /* prepare and send message to hal */
10320 if( 0 < baCandidateCount)
10321 {
10322 WDI_Status status = WDI_STATUS_SUCCESS ;
10323 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10324 tWDA_ReqParams *pWdaParams =
10325 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010326 if(NULL == pWdaParams)
10327 {
10328 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10329 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10330 VOS_ASSERT(0) ;
10331 return;
10332 }
10333 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10334 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10335 if(NULL == wdiTriggerBaReq)
10336 {
10337 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10338 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10339 VOS_ASSERT(0) ;
10340 vos_mem_free(pWdaParams);
10341 return;
10342 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010343 do
10344 {
10345 WDI_TriggerBAReqinfoType *triggerBaInfo =
10346 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10347 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10348 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10349 * for each request */
10350 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10351 triggerBaInfo->ucBASessionID = 0;
10352 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10353 } while(0) ;
10354 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10356 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010357 pWdaParams->pWdaContext = pWDA;
10358 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10359 pWdaParams->wdaMsgParam = NULL;
10360 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10361 WDA_TriggerBaReqCallback, pWdaParams) ;
10362 if(IS_WDI_STATUS_FAILURE(status))
10363 {
10364 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10365 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10366 vos_mem_free(pWdaParams->wdaMsgParam) ;
10367 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10368 vos_mem_free(pWdaParams) ;
10369 }
10370 }
10371 else
10372 {
10373 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10374 "There is no TID for initiating BA");
10375 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010376 if( VOS_STATUS_SUCCESS !=
10377 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10378 {
10379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10380 "BA Activity Timer Stop Failed ");
10381 return ;
10382 }
10383 if( VOS_STATUS_SUCCESS !=
10384 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10385 {
10386 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10387 "BA Activity Timer Start Failed ");
10388 return;
10389 }
10390 return ;
10391}
Jeff Johnson295189b2012-06-20 16:38:30 -070010392/*
10393 * WDA common routine to create timer used by WDA.
10394 */
10395static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10396{
Jeff Johnson295189b2012-06-20 16:38:30 -070010397 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10398 tANI_U32 val = 0 ;
10399 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10400
10401 if(NULL == pMac)
10402 {
10403 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10404 "%s:MAC context is NULL", __FUNCTION__);
10405 VOS_ASSERT(0);
10406 return VOS_STATUS_E_FAILURE;
10407 }
10408 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10409 != eSIR_SUCCESS)
10410 {
10411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10412 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10413 return VOS_STATUS_E_FAILURE;
10414 }
10415 val = SYS_MS_TO_TICKS(val) ;
10416
10417 /* BA activity check timer */
10418 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10419 "BA Activity Check timer", WDA_TimerHandler,
10420 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10421 if(status != TX_SUCCESS)
10422 {
10423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10424 "Unable to create BA activity timer");
10425 return eSIR_FAILURE ;
10426 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010427 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010428 /* Tx Complete Timeout timer */
10429 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10430 "Tx Complete Check timer", WDA_TimerHandler,
10431 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010432 if(status != TX_SUCCESS)
10433 {
10434 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10435 "Unable to create Tx Complete Timeout timer");
10436 /* Destroy timer of BA activity check timer */
10437 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10438 if(status != TX_SUCCESS)
10439 {
10440 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10441 "Unable to Destroy BA activity timer");
10442 return eSIR_FAILURE ;
10443 }
10444 return eSIR_FAILURE ;
10445 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010446 return eSIR_SUCCESS ;
10447}
Jeff Johnson295189b2012-06-20 16:38:30 -070010448/*
10449 * WDA common routine to destroy timer used by WDA.
10450 */
10451static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10452{
10453 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010454 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10455 if(status != TX_SUCCESS)
10456 {
10457 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10458 "Unable to Destroy Tx Complete Timeout timer");
10459 return eSIR_FAILURE ;
10460 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010461 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10462 if(status != TX_SUCCESS)
10463 {
10464 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10465 "Unable to Destroy BA activity timer");
10466 return eSIR_FAILURE ;
10467 }
10468
10469 return eSIR_SUCCESS ;
10470}
Jeff Johnson295189b2012-06-20 16:38:30 -070010471/*
10472 * WDA timer handler.
10473 */
10474void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10475{
10476 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10477 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010478 /*
10479 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10480 */
10481 wdaMsg.type = timerInfo ;
10482 wdaMsg.bodyptr = NULL;
10483 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010484 /* post the message.. */
10485 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10486 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10487 {
10488 vosStatus = VOS_STATUS_E_BADMSG;
10489 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010490}
Jeff Johnson295189b2012-06-20 16:38:30 -070010491/*
10492 * WDA Tx Complete timeout Indication.
10493 */
10494void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10495{
10496 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010497 if( pWDA->pAckTxCbFunc )
10498 {
10499 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10500 "TxComplete timer expired\n");
10501 pWDA->pAckTxCbFunc( pMac, 0);
10502 pWDA->pAckTxCbFunc = NULL;
10503 }
10504 else
10505 {
10506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10507 "There is no request pending for TxComplete and wait timer expired\n");
10508 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010509}
Jeff Johnson295189b2012-06-20 16:38:30 -070010510/*
10511 * WDA Set REG Domain to VOS NV
10512 */
10513eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10514{
10515 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10516 {
10517 return eHAL_STATUS_INVALID_PARAMETER;
10518 }
10519 return eHAL_STATUS_SUCCESS;
10520}
10521#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10522
Jeff Johnson295189b2012-06-20 16:38:30 -070010523#ifdef FEATURE_WLAN_SCAN_PNO
10524/*
10525 * FUNCTION: WDA_PNOScanReqCallback
10526 *
10527 */
10528void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10529{
10530 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010531 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10532 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010533 if(NULL == pWdaParams)
10534 {
10535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10536 "%s: pWdaParams received NULL", __FUNCTION__);
10537 VOS_ASSERT(0) ;
10538 return ;
10539 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010540 if( pWdaParams != NULL )
10541 {
10542 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10543 {
10544 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10545 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010546 if( pWdaParams->wdaMsgParam != NULL)
10547 {
10548 vos_mem_free(pWdaParams->wdaMsgParam);
10549 }
10550
10551 vos_mem_free(pWdaParams) ;
10552 }
10553
10554 return ;
10555}
Jeff Johnson295189b2012-06-20 16:38:30 -070010556/*
10557 * FUNCTION: WDA_UpdateScanParamsCallback
10558 *
10559 */
10560void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10561{
10562 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010563 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10564 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010565 if(NULL == pWdaParams)
10566 {
10567 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10568 "%s: pWdaParams received NULL", __FUNCTION__);
10569 VOS_ASSERT(0) ;
10570 return ;
10571 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010572 if( pWdaParams != NULL )
10573 {
10574 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10575 {
10576 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10577 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010578 if( pWdaParams->wdaMsgParam != NULL)
10579 {
10580 vos_mem_free(pWdaParams->wdaMsgParam);
10581 }
10582 vos_mem_free(pWdaParams) ;
10583 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010584 return ;
10585}
Jeff Johnson295189b2012-06-20 16:38:30 -070010586/*
10587 * FUNCTION: WDA_SetPowerParamsCallback
10588 *
10589 */
10590void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10591{
Jeff Johnsone7245742012-09-05 17:12:55 -070010592 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010593
10594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10595 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010596 if(NULL == pWdaParams)
10597 {
10598 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10599 "%s: pWdaParams received NULL", __FUNCTION__);
10600 VOS_ASSERT(0) ;
10601 return ;
10602 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010603 if( pWdaParams != NULL )
10604 {
10605 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10606 {
10607 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10608 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010609 if( pWdaParams->wdaMsgParam != NULL)
10610 {
10611 vos_mem_free(pWdaParams->wdaMsgParam);
10612 }
10613 vos_mem_free(pWdaParams) ;
10614 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010615 return ;
10616}
Jeff Johnson295189b2012-06-20 16:38:30 -070010617/*
10618 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10619 * Request to WDI to set Preferred Network List.Offload
10620 */
10621VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10622 tSirPNOScanReq *pPNOScanReqParams)
10623{
Jeff Johnson43971f52012-07-17 12:26:56 -070010624 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010625 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10626 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10627 tWDA_ReqParams *pWdaParams ;
10628 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10630 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010631 if(NULL == pwdiPNOScanReqInfo)
10632 {
10633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10634 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10635 VOS_ASSERT(0);
10636 return VOS_STATUS_E_NOMEM;
10637 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010638 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10639 if(NULL == pWdaParams)
10640 {
10641 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10642 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10643 VOS_ASSERT(0);
10644 vos_mem_free(pwdiPNOScanReqInfo);
10645 return VOS_STATUS_E_NOMEM;
10646 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010647 //
10648 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10649 //
10650 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10651 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010652 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10653 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10654 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010655 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10656 {
10657 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10658 &pPNOScanReqParams->aNetworks[i],
10659 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10660 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010661 /*Scan timer intervals*/
10662 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10663 &pPNOScanReqParams->scanTimers,
10664 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010665 /*Probe template for 2.4GHz band*/
10666 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10667 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10668 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010669 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10670 pPNOScanReqParams->p24GProbeTemplate,
10671 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010672 /*Probe template for 5GHz band*/
10673 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10674 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10675 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010676 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10677 pPNOScanReqParams->p5GProbeTemplate,
10678 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010679 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010680 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10681 {
10682 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10683 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10684 VOS_ASSERT(0);
10685 vos_mem_free(pwdiPNOScanReqInfo) ;
10686 vos_mem_free(pWdaParams);
10687 return VOS_STATUS_E_FAILURE;
10688 }
10689
10690 /* Store Params pass it to WDI */
10691 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10692 pWdaParams->pWdaContext = pWDA;
10693 /* Store param pointer as passed in by caller */
10694 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010695 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10696 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010697 if(IS_WDI_STATUS_FAILURE(status))
10698 {
10699 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10700 "Failure in Set PNO REQ WDI API, free all the memory " );
10701 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10702 vos_mem_free(pWdaParams->wdaMsgParam);
10703 pWdaParams->wdaWdiApiMsgParam = NULL;
10704 pWdaParams->wdaMsgParam = NULL;
10705 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010706 return CONVERT_WDI2VOS_STATUS(status) ;
10707}
Jeff Johnson295189b2012-06-20 16:38:30 -070010708/*
10709 * FUNCTION: WDA_RssiFilterCallback
10710 *
10711 */
10712void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10713{
10714 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10715
10716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10717 "<------ %s " ,__FUNCTION__);
10718
10719 VOS_ASSERT(NULL != pWdaParams);
10720
10721 vos_mem_free(pWdaParams->wdaMsgParam) ;
10722 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10723 vos_mem_free(pWdaParams) ;
10724
10725 return ;
10726}
10727/*
10728 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10729 * Request to WDI to set Preferred Network List.Offload
10730 */
10731VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10732 tSirSetRSSIFilterReq* pRssiFilterParams)
10733{
Jeff Johnson43971f52012-07-17 12:26:56 -070010734 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010735 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10736 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10737 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10739 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010740 if(NULL == pwdiSetRssiFilterReqInfo)
10741 {
10742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10743 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10744 VOS_ASSERT(0);
10745 return VOS_STATUS_E_NOMEM;
10746 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010747 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10748 if(NULL == pWdaParams)
10749 {
10750 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10751 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10752 VOS_ASSERT(0);
10753 vos_mem_free(pwdiSetRssiFilterReqInfo);
10754 return VOS_STATUS_E_NOMEM;
10755 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010756 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10757 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010758 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10759 {
10760 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10761 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10762 VOS_ASSERT(0);
10763 vos_mem_free(pwdiSetRssiFilterReqInfo) ;
10764 vos_mem_free(pWdaParams);
10765 return VOS_STATUS_E_FAILURE;
10766 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010767 /* Store Params pass it to WDI */
10768 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10769 pWdaParams->pWdaContext = pWDA;
10770 /* Store param pointer as passed in by caller */
10771 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010772 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10773 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10774 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010775 if(IS_WDI_STATUS_FAILURE(status))
10776 {
10777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10778 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10779 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10780 vos_mem_free(pWdaParams->wdaMsgParam);
10781 pWdaParams->wdaWdiApiMsgParam = NULL;
10782 pWdaParams->wdaMsgParam = NULL;
10783 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010784 return CONVERT_WDI2VOS_STATUS(status) ;
10785}
10786
Jeff Johnson295189b2012-06-20 16:38:30 -070010787/*
10788 * FUNCTION: WDA_ProcessUpdateScanParams
10789 * Request to WDI to update Scan Parameters
10790 */
10791VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10792 tSirUpdateScanParams *pUpdateScanParams)
10793{
Jeff Johnson43971f52012-07-17 12:26:56 -070010794 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010795 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10796 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10797 sizeof(WDI_UpdateScanParamsInfoType)) ;
10798 tWDA_ReqParams *pWdaParams ;
10799 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10801 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010802 if(NULL == wdiUpdateScanParamsInfoType)
10803 {
10804 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10805 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10806 VOS_ASSERT(0);
10807 return VOS_STATUS_E_NOMEM;
10808 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010809 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10810 if ( NULL == pWdaParams )
10811 {
10812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10813 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10814 VOS_ASSERT(0);
10815 vos_mem_free(wdiUpdateScanParamsInfoType);
10816 return VOS_STATUS_E_NOMEM;
10817 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010818 //
10819 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10820 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10822 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10823 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10824 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10825 "sir struct %d wdi struct %d",
10826 pUpdateScanParams->b11dEnabled,
10827 pUpdateScanParams->b11dResolved,
10828 pUpdateScanParams->ucChannelCount,
10829 pUpdateScanParams->usPassiveMinChTime,
10830 pUpdateScanParams->usPassiveMaxChTime,
10831 pUpdateScanParams->usActiveMinChTime,
10832 pUpdateScanParams->usActiveMaxChTime,
10833 sizeof(tSirUpdateScanParams),
10834 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10835
Jeff Johnson295189b2012-06-20 16:38:30 -070010836 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
10837 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070010838 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
10839 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070010840 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
10841 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070010842 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
10843 pUpdateScanParams->usActiveMaxChTime;
10844 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
10845 pUpdateScanParams->usActiveMinChTime;
10846 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
10847 pUpdateScanParams->usPassiveMaxChTime;
10848 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
10849 pUpdateScanParams->usPassiveMinChTime;
10850
Jeff Johnson295189b2012-06-20 16:38:30 -070010851 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
10852 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
10853 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
10854
Jeff Johnson295189b2012-06-20 16:38:30 -070010855 for ( i = 0; i <
10856 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
10857 i++)
10858 {
10859 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10860 "Update Scan Parameters channel: %d",
10861 pUpdateScanParams->aChannels[i]);
10862
10863 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
10864 pUpdateScanParams->aChannels[i];
10865 }
10866
Jeff Johnson295189b2012-06-20 16:38:30 -070010867 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010868 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10869 {
10870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10871 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
10872 VOS_ASSERT(0);
10873 vos_mem_free(pWdaParams);
10874 vos_mem_free(wdiUpdateScanParamsInfoType);
10875 return VOS_STATUS_E_FAILURE;
10876 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010877 /* Store Params pass it to WDI */
10878 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
10879 pWdaParams->pWdaContext = pWDA;
10880 /* Store param pointer as passed in by caller */
10881 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070010882
Jeff Johnson295189b2012-06-20 16:38:30 -070010883
10884
10885 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
10886 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
10887 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010888 if(IS_WDI_STATUS_FAILURE(status))
10889 {
10890 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10891 "Failure in Update Scan Params EQ WDI API, free all the memory " );
10892 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10893 vos_mem_free(pWdaParams->wdaMsgParam);
10894 vos_mem_free(pWdaParams);
10895 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010896 return CONVERT_WDI2VOS_STATUS(status) ;
10897}
10898#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070010899#ifdef WLAN_FEATURE_PACKET_FILTERING
10900/*
10901 * FUNCTION: WDA_8023MulticastListReqCallback
10902 *
10903 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070010904void WDA_8023MulticastListReqCallback(
10905 WDI_RcvFltPktSetMcListRspParamsType *pwdiRcvFltPktSetMcListRspInfo,
10906 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070010907{
10908 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10910 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010911 if(NULL == pWdaParams)
10912 {
10913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10914 "%s: pWdaParams received NULL", __FUNCTION__);
10915 VOS_ASSERT(0) ;
10916 return ;
10917 }
10918
10919 vos_mem_free(pWdaParams->wdaMsgParam) ;
10920 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10921 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010922 //print a msg, nothing else to do
10923 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10924 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070010925 return ;
10926}
Jeff Johnson295189b2012-06-20 16:38:30 -070010927/*
10928 * FUNCTION: WDA_Process8023MulticastListReq
10929 * Request to WDI to add 8023 Multicast List
10930 */
10931VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
10932 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
10933{
Jeff Johnson43971f52012-07-17 12:26:56 -070010934 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010935 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
10936 tWDA_ReqParams *pWdaParams ;
10937 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010938 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10939 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010940 pwdiFltPktSetMcListReqParamsType =
10941 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
10942 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
10943 ) ;
10944 if(NULL == pwdiFltPktSetMcListReqParamsType)
10945 {
10946 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10947 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10948 return VOS_STATUS_E_NOMEM;
10949 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010950 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10951 if(NULL == pWdaParams)
10952 {
10953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10954 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10955 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10956 return VOS_STATUS_E_NOMEM;
10957 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010958 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
10959 {
10960 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10961 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL",
10962 __FUNCTION__);
10963 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
10964 vos_mem_free(pWdaParams);
10965 return VOS_STATUS_E_FAILURE;
10966 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010967 //
10968 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
10969 //
10970 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070010971 pRcvFltMcAddrList->ulMulticastAddrCnt;
10972
10973 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
10974 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
10975 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
10976 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
10977
Jeff Johnson295189b2012-06-20 16:38:30 -070010978 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
10979 {
10980 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
10981 &(pRcvFltMcAddrList->multicastAddr[i]),
10982 sizeof(tSirMacAddr));
10983 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010984 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070010985 /* WDA_VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
10986 (NULL == pWDA->wdaWdiApiMsgParam)); */
Jeff Johnson295189b2012-06-20 16:38:30 -070010987 /* Store Params pass it to WDI */
10988 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
10989 pWdaParams->pWdaContext = pWDA;
10990 /* Store param pointer as passed in by caller */
10991 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070010992 status = WDI_8023MulticastListReq(
10993 pwdiFltPktSetMcListReqParamsType,
10994 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
10995 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010996 if(IS_WDI_STATUS_FAILURE(status))
10997 {
10998 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10999 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
11000 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11001 vos_mem_free(pWdaParams->wdaMsgParam);
11002 vos_mem_free(pWdaParams);
11003 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011004 return CONVERT_WDI2VOS_STATUS(status) ;
11005}
Jeff Johnson295189b2012-06-20 16:38:30 -070011006/*
11007 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11008 *
11009 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011010void WDA_ReceiveFilterSetFilterReqCallback(
11011 WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo,
11012 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011013{
11014 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011015 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11016 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011017 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 if(NULL == pWdaParams)
11019 {
11020 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11021 "%s: pWdaParams received NULL", __FUNCTION__);
11022 VOS_ASSERT(0) ;
11023 return ;
11024 }
11025
11026 vos_mem_free(pWdaParams->wdaMsgParam) ;
11027 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11028 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011029 //print a msg, nothing else to do
11030 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11031 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011032 return ;
11033}
Jeff Johnson295189b2012-06-20 16:38:30 -070011034/*
11035 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
11036 * Request to WDI to set Receive Filters
11037 */
11038VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
11039 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
11040{
Jeff Johnson43971f52012-07-17 12:26:56 -070011041 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011042 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
11043 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
11044 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
11045 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
11046 tWDA_ReqParams *pWdaParams ;
11047 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070011048 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11049 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011050 if(NULL == pwdiSetRcvPktFilterReqParamsType)
11051 {
11052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11053 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11054 VOS_ASSERT(0);
11055 return VOS_STATUS_E_NOMEM;
11056 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011057 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11058 if(NULL == pWdaParams)
11059 {
11060 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11061 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11062 VOS_ASSERT(0);
11063 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
11064 return VOS_STATUS_E_NOMEM;
11065 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011066 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
11067 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
11068 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
11069 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070011070 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
11071 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
11072
11073 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
11074 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011075
11076 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11077 "FID %d FT %d NParams %d CT %d",
11078 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
11079 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
11080 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
11081 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070011082 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
11083 {
11084 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
11085 &pRcvPktFilterCfg->paramsData[i],
11086 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070011087 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11088 "Proto %d Comp Flag %d \n",
11089 pwdiSetRcvPktFilterReqParamsType->
11090 wdiPktFilterCfg.paramsData[i].protocolLayer,
11091 pwdiSetRcvPktFilterReqParamsType->
11092 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070011093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11094 "Data Offset %d Data Len %d\n",
11095 pwdiSetRcvPktFilterReqParamsType->
11096 wdiPktFilterCfg.paramsData[i].dataOffset,
11097 pwdiSetRcvPktFilterReqParamsType->
11098 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070011099 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11100 "CData: %d:%d:%d:%d:%d:%d\n",
11101 pwdiSetRcvPktFilterReqParamsType->
11102 wdiPktFilterCfg.paramsData[i].compareData[0],
11103 pwdiSetRcvPktFilterReqParamsType->
11104 wdiPktFilterCfg.paramsData[i].compareData[1],
11105 pwdiSetRcvPktFilterReqParamsType->
11106 wdiPktFilterCfg.paramsData[i].compareData[2],
11107 pwdiSetRcvPktFilterReqParamsType->
11108 wdiPktFilterCfg.paramsData[i].compareData[3],
11109 pwdiSetRcvPktFilterReqParamsType->
11110 wdiPktFilterCfg.paramsData[i].compareData[4],
11111 pwdiSetRcvPktFilterReqParamsType->
11112 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011113 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11114 "MData: %d:%d:%d:%d:%d:%d\n",
11115 pwdiSetRcvPktFilterReqParamsType->
11116 wdiPktFilterCfg.paramsData[i].dataMask[0],
11117 pwdiSetRcvPktFilterReqParamsType->
11118 wdiPktFilterCfg.paramsData[i].dataMask[1],
11119 pwdiSetRcvPktFilterReqParamsType->
11120 wdiPktFilterCfg.paramsData[i].dataMask[2],
11121 pwdiSetRcvPktFilterReqParamsType->
11122 wdiPktFilterCfg.paramsData[i].dataMask[3],
11123 pwdiSetRcvPktFilterReqParamsType->
11124 wdiPktFilterCfg.paramsData[i].dataMask[4],
11125 pwdiSetRcvPktFilterReqParamsType->
11126 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011127 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011128 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011129 /* Store Params pass it to WDI */
11130 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
11131 pWdaParams->pWdaContext = pWDA;
11132 /* Store param pointer as passed in by caller */
11133 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011134 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
11135 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
11136 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011137 if(IS_WDI_STATUS_FAILURE(status))
11138 {
11139 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11140 "Failure in SetFilter(),free all the memory,status %d ",status);
11141 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11142 vos_mem_free(pWdaParams->wdaMsgParam);
11143 vos_mem_free(pWdaParams);
11144 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011145 return CONVERT_WDI2VOS_STATUS(status) ;
11146}
Jeff Johnson295189b2012-06-20 16:38:30 -070011147/*
11148 * FUNCTION: WDA_FilterMatchCountReqCallback
11149 *
11150 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011151void WDA_FilterMatchCountReqCallback(
11152 WDI_RcvFltPktMatchCntRspParamsType *pwdiRcvFltPktMatchRspParams,
11153 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011154{
11155 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11156 tWDA_CbContext *pWDA;
11157 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
11158 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
11159 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
11160 tANI_U8 i;
11161 vos_msg_t vosMsg;
11162
11163 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11164 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011165 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
11166
Jeff Johnsone7245742012-09-05 17:12:55 -070011167 if(NULL == pRcvFltPktMatchCntRsp)
11168 {
11169 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11170 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
11171 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011172 vos_mem_free(pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -070011173 return ;
11174 }
11175
Jeff Johnson295189b2012-06-20 16:38:30 -070011176 if(NULL == pWdaParams)
11177 {
11178 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11179 "%s: pWdaParams received NULL", __FUNCTION__);
11180 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011181 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070011182 return ;
11183 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011184 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
11185 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011186 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
11187 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
11188
11189 /* Message Header */
11190 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11191 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
11192
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011193 pRcvFltPktMatchCntRsp->status = pwdiRcvFltPktMatchRspParams->wdiStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -070011194
11195 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
11196 {
11197 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
11198 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
11199 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011200 /* VOS message wrapper */
11201 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11202 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
11203 vosMsg.bodyval = 0;
11204 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
11205 {
11206 /* free the mem and return */
11207 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
11208 }
11209
11210 vos_mem_free(pWdaParams->wdaMsgParam) ;
11211 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11212 vos_mem_free(pWdaParams) ;
11213}
Jeff Johnson295189b2012-06-20 16:38:30 -070011214/*
11215 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
11216 * Request to WDI to get PC Filter Match Count
11217 */
11218VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
11219{
Jeff Johnson43971f52012-07-17 12:26:56 -070011220 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011221 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
11222 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
11223 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011224 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11225 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011226 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
11227 {
11228 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11229 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11230 VOS_ASSERT(0);
11231 return VOS_STATUS_E_NOMEM;
11232 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011233 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11234 if(NULL == pWdaParams)
11235 {
11236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11237 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11238 VOS_ASSERT(0);
11239 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11240 return VOS_STATUS_E_NOMEM;
11241 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011242 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11243 {
11244 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11245 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11246 VOS_ASSERT(0);
11247 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11248 vos_mem_free(pWdaParams);
11249 return VOS_STATUS_E_FAILURE;
11250 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011251 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
11252
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011253 vos_mem_copy( pwdiRcvFltPktMatchCntReqParamsType->bssId,
11254 pRcvFltPktMatchRsp->bssId,
11255 sizeof(wpt_macAddr));
11256
Jeff Johnson295189b2012-06-20 16:38:30 -070011257 /* Store Params pass it to WDI */
11258 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
11259 pWdaParams->pWdaContext = pWDA;
11260 /* Store param pointer as passed in by caller */
11261 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011262 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11263 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11264 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011265 if(IS_WDI_STATUS_FAILURE(status))
11266 {
11267 /* failure returned by WDI API */
11268 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11269 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11270 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11271 vos_mem_free(pWdaParams) ;
11272 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11273 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11274 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011275 return CONVERT_WDI2VOS_STATUS(status) ;
11276}
Jeff Johnson295189b2012-06-20 16:38:30 -070011277/*
11278 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11279 *
11280 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011281void WDA_ReceiveFilterClearFilterReqCallback(
11282 WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType,
11283 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011284{
11285 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11287 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011288/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11289 if(NULL == pWdaParams)
11290 {
11291 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11292 "%s: pWdaParams received NULL", __FUNCTION__);
11293 VOS_ASSERT(0) ;
11294 return ;
11295 }
11296
11297 vos_mem_free(pWdaParams->wdaMsgParam) ;
11298 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11299 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011300 //print a msg, nothing else to do
11301 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11302 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011303 return ;
11304}
Jeff Johnson295189b2012-06-20 16:38:30 -070011305/*
11306 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11307 * Request to WDI to clear Receive Filters
11308 */
11309VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11310 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11311{
Jeff Johnson43971f52012-07-17 12:26:56 -070011312 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011313 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11314 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11315 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011316 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11317 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011318 if(NULL == pwdiRcvFltPktClearReqParamsType)
11319 {
11320 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11321 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11322 VOS_ASSERT(0);
11323 return VOS_STATUS_E_NOMEM;
11324 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011325 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11326 if(NULL == pWdaParams)
11327 {
11328 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11329 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11330 VOS_ASSERT(0);
11331 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11332 return VOS_STATUS_E_NOMEM;
11333 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011334 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11335 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011336 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11337 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11338 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11339 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011340
11341 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011342 /* Store Params pass it to WDI */
11343 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11344 pWdaParams->pWdaContext = pWDA;
11345 /* Store param pointer as passed in by caller */
11346 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011347 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11348 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11349 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011350 if(IS_WDI_STATUS_FAILURE(status))
11351 {
11352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11353 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11354 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11355 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011356 return CONVERT_WDI2VOS_STATUS(status) ;
11357}
11358#endif // WLAN_FEATURE_PACKET_FILTERING
11359
Jeff Johnson295189b2012-06-20 16:38:30 -070011360/*
11361 * FUNCTION: WDA_ProcessSetPowerParamsReq
11362 * Request to WDI to set power params
11363 */
11364VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11365 tSirSetPowerParamsReq *pPowerParams)
11366{
Jeff Johnson43971f52012-07-17 12:26:56 -070011367 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011368 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11369 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011370 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011371 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11372 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011373 if(NULL == pwdiSetPowerParamsReqInfo)
11374 {
11375 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11376 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11377 VOS_ASSERT(0);
11378 return VOS_STATUS_E_NOMEM;
11379 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011380 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11381 if(NULL == pWdaParams)
11382 {
11383 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11384 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11385 VOS_ASSERT(0);
11386 vos_mem_free(pwdiSetPowerParamsReqInfo);
11387 return VOS_STATUS_E_NOMEM;
11388 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011389
Jeff Johnson295189b2012-06-20 16:38:30 -070011390
11391 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11392 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011393 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11394 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011395 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11396 pPowerParams->uListenInterval;
11397 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11398 pPowerParams->uBcastMcastFilter;
11399 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11400 pPowerParams->uEnableBET;
11401 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11402 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011403 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011404 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
11405 {
11406 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11407 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11408 VOS_ASSERT(0);
11409 vos_mem_free(pwdiSetPowerParamsReqInfo) ;
11410 vos_mem_free(pWdaParams);
11411 return VOS_STATUS_E_FAILURE;
11412 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011413 /* Store Params pass it to WDI */
11414 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11415 pWdaParams->pWdaContext = pWDA;
11416 /* Store param pointer as passed in by caller */
11417 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011418 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11419 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11420 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011421 if(IS_WDI_STATUS_FAILURE(status))
11422 {
11423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11424 "Failure in Set power params REQ WDI API, free all the memory " );
11425 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11426 vos_mem_free(pWdaParams->wdaMsgParam);
11427 pWdaParams->wdaWdiApiMsgParam = NULL;
11428 pWdaParams->wdaMsgParam = NULL;
11429 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011430 return CONVERT_WDI2VOS_STATUS(status) ;
11431}
11432
11433/*
11434 * FUNCTION: WDA_SetTmLevelRspCallback
11435 * Set TM Level response
11436 */
11437void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11438{
11439 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11440
11441 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11442 "<------ %s " ,__FUNCTION__);
11443
11444 if(NULL == pWdaParams)
11445 {
11446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11447 "%s: pWdaParams received NULL", __FUNCTION__);
11448 VOS_ASSERT(0) ;
11449 return ;
11450 }
11451
11452 /* Dose not need to send notification to upper layer
11453 * Just free allocated resources */
11454 if( pWdaParams != NULL )
11455 {
11456 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11457 {
11458 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11459 }
11460 vos_mem_free(pWdaParams->wdaMsgParam) ;
11461 vos_mem_free(pWdaParams) ;
11462 }
11463}
11464
11465/*
11466 * FUNCTION: WDA_ProcessSetTmLevelReq
11467 * Set TM Level request
11468 */
11469VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11470 tAniSetTmLevelReq *setTmLevelReq)
11471{
11472 WDI_Status status = WDI_STATUS_SUCCESS ;
11473 tWDA_ReqParams *pWdaParams ;
11474 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11475 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11476 sizeof(WDI_SetTmLevelReqType)) ;
11477 if(NULL == wdiSetTmLevelReq)
11478 {
11479 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11480 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11481 VOS_ASSERT(0);
11482 return VOS_STATUS_E_NOMEM;
11483 }
11484
11485 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11486 if(NULL == pWdaParams)
11487 {
11488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11489 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11490 VOS_ASSERT(0);
11491 vos_mem_free(wdiSetTmLevelReq);
11492 return VOS_STATUS_E_NOMEM;
11493 }
11494
11495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11496 "------> %s " ,__FUNCTION__);
11497
11498 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11499 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11500
11501 pWdaParams->pWdaContext = pWDA;
11502 pWdaParams->wdaMsgParam = setTmLevelReq;
11503 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11504
11505 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11506 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11507
11508 if(IS_WDI_STATUS_FAILURE(status))
11509 {
11510 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11511 "Failure set thernal mitigation level free all the memory " );
11512 vos_mem_free(pWdaParams->wdaMsgParam) ;
11513 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11514 vos_mem_free(pWdaParams) ;
11515 }
11516
11517 return CONVERT_WDI2VOS_STATUS(status) ;
11518}
11519
11520VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11521 tpTxControlParams pTxCtrlParam)
11522{
11523 VOS_STATUS wdaStatus;
11524
11525 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11526 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011527 if( pTxCtrlParam == NULL )
11528 {
11529 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11530 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11531 return VOS_STATUS_E_FAILURE;
11532 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011533 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11534 {
11535 wdaStatus = WDA_SuspendDataTx(pWDA);
11536 }
11537 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11538 {
11539 wdaStatus = WDA_ResumeDataTx(pWDA);
11540 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011541 return wdaStatus;
11542}
11543
11544 /* FUNCTION WDA_featureCapsExchange
11545 * WDA API to invoke capability exchange between host and FW.
11546 */
11547void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11548{
11549 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11550 "%s:enter", __FUNCTION__ );
11551 WDI_featureCapsExchangeReq( NULL, pVosContext);
11552}
11553
11554 /* FUNCTION WDA_getHostWlanFeatCaps
11555 * Wrapper for WDI API, that will return if the feature (enum value).passed
11556 * to this API is supported or not in Host
11557 * return value
11558 * 0 - implies feature is NOT Supported
11559 * any non zero value - implies feature is SUPPORTED
11560 */
11561tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11562{
11563 return WDI_getHostWlanFeatCaps(featEnumValue);
11564}
11565
11566 /* FUNCTION WDA_getFwWlanFeatCaps
11567 * Wrapper for WDI API, that will return if the feature (enum value).passed
11568 * to this API is supported or not in FW
11569 * return value
11570 * 0 - implies feature is NOT Supported
11571 * any non zero value - implies feature is SUPPORTED
11572 */
11573tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11574{
11575 return WDI_getFwWlanFeatCaps(featEnumValue);
11576}
11577
11578/*
11579 * FUNCTION: WDA_shutdown
11580 * Shutdown WDA/WDI without handshaking with Riva.
11581 * Synchronous function.
11582 */
11583VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11584{
11585 WDI_Status wdiStatus;
11586 //tANI_U8 eventIdx = 0;
11587 VOS_STATUS status = VOS_STATUS_SUCCESS;
11588 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011589 if (NULL == pWDA)
11590 {
11591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11592 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11593 VOS_ASSERT(0);
11594 return VOS_STATUS_E_FAILURE;
11595 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011596 /* FTM mode stay START_STATE */
11597 if( (WDA_READY_STATE != pWDA->wdaState) &&
11598 (WDA_INIT_STATE != pWDA->wdaState) &&
11599 (WDA_START_STATE != pWDA->wdaState) )
11600 {
11601 VOS_ASSERT(0);
11602 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011603 if(NULL != pWDA->wdaWdiApiMsgParam)
11604 {
11605 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11606 "%s:wdaWdiApiMsgParam is not NULL", __FUNCTION__);
11607 VOS_ASSERT(0);
11608 /* the last request was not freed, probably a SSR
11609 * initiated by WLAN driver (WDI timeout) */
11610 vos_mem_free(pWDA->wdaWdiApiMsgParam);
11611 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011612 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11613 {
11614 wdaDestroyTimers(pWDA);
11615 }
11616 pWDA->wdaWdiApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011617 /* call WDI shutdown */
11618 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011619 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11620 {
11621 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11622 "error in WDA Stop" );
11623 status = VOS_STATUS_E_FAILURE;
11624 }
11625 /* WDI stop is synchrnous, shutdown is complete when it returns */
11626 pWDA->wdaState = WDA_STOP_STATE;
11627
Jeff Johnson295189b2012-06-20 16:38:30 -070011628 /* shutdown should perform the stop & close actions. */
11629 /* Destroy the event */
11630 status = vos_event_destroy(&pWDA->txFrameEvent);
11631 if(!VOS_IS_STATUS_SUCCESS(status))
11632 {
11633 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11634 "VOS Event destroy failed - status = %d\n", status);
11635 status = VOS_STATUS_E_FAILURE;
11636 }
11637 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11638 if(!VOS_IS_STATUS_SUCCESS(status))
11639 {
11640 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11641 "VOS Event destroy failed - status = %d\n", status);
11642 status = VOS_STATUS_E_FAILURE;
11643 }
11644 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11645 if(!VOS_IS_STATUS_SUCCESS(status))
11646 {
11647 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11648 "VOS Event destroy failed - status = %d\n", status);
11649 status = VOS_STATUS_E_FAILURE;
11650 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011651 /* free WDA context */
11652 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11653 if ( !VOS_IS_STATUS_SUCCESS(status) )
11654 {
11655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11656 "error in WDA close " );
11657 status = VOS_STATUS_E_FAILURE;
11658 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011659 return status;
11660}
Jeff Johnsone7245742012-09-05 17:12:55 -070011661/*
11662 * FUNCTION: WDA_stopFailed
11663 * WDA stop failed
11664 */
11665
11666void WDA_stopFailed(v_PVOID_t pVosContext)
11667{
11668 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11669 pWDA->needShutdown = TRUE;
11670}
11671/*
11672 * FUNCTION: WDA_needShutdown
11673 * WDA needs a shutdown
11674 */
11675
11676v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11677{
11678 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
11679 return pWDA->needShutdown;
11680}
11681
Mohit Khanna4a70d262012-09-11 16:30:12 -070011682#ifdef WLAN_FEATURE_11AC
11683/*
11684 * FUNCTION: WDA_SetBeaconFilterReqCallback
11685 *
11686 */
11687void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11688{
11689 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11690 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11691 "<------ %s " ,__FUNCTION__);
11692 if(NULL == pWdaParams)
11693 {
11694 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11695 "%s: pWdaParams received NULL", __FUNCTION__);
11696 VOS_ASSERT(0) ;
11697 return ;
11698 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011699
Mohit Khanna4a70d262012-09-11 16:30:12 -070011700 vos_mem_free(pWdaParams->wdaMsgParam) ;
11701 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11702 vos_mem_free(pWdaParams) ;
11703 /*
11704 * No respone required for SetBeaconFilter req so just free the request
11705 * param here
11706 */
11707
11708 return ;
11709}
11710
11711VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11712 tUpdateVHTOpMode *pData)
11713{
11714 WDI_Status status = WDI_STATUS_SUCCESS ;
11715 tWDA_ReqParams *pWdaParams ;
11716 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11717 sizeof(WDI_UpdateVHTOpMode)) ;
11718 if(NULL == wdiTemp)
11719 {
11720 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11721 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11722 VOS_ASSERT(0);
11723 return VOS_STATUS_E_NOMEM;
11724 }
11725 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11726 if(NULL == pWdaParams)
11727 {
11728 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11729 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11730 VOS_ASSERT(0);
11731 vos_mem_free(wdiTemp);
11732 return VOS_STATUS_E_NOMEM;
11733 }
11734
11735 wdiTemp->opMode = pData->opMode;
11736 wdiTemp->staId = pData->staId;
11737
11738 pWdaParams->pWdaContext = pWDA;
11739 /* Store Req pointer, as this will be used for response */
11740 pWdaParams->wdaMsgParam = (void *)pData;
11741 /* store Params pass it to WDI */
11742 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11743
11744 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11745
11746 if(IS_WDI_STATUS_FAILURE(status))
11747 {
11748 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11749 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11750 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11751 vos_mem_free(pWdaParams->wdaMsgParam);
11752 vos_mem_free(pWdaParams);
11753 }
11754 return CONVERT_WDI2VOS_STATUS(status) ;
11755}
11756#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011757
11758/*==========================================================================
11759 FUNCTION WDA_TransportChannelDebug
11760
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -070011761 DESCRIPTION
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011762 Display Transport Channel debugging information
11763 User may request to display DXE channel snapshot
11764 Or if host driver detects any abnormal stcuk may display
11765
11766 PARAMETERS
11767 displaySnapshot : Dispaly DXE snapshot option
11768 enableStallDetect : Enable stall detect feature
11769 This feature will take effect to data performance
11770 Not integrate till fully verification
11771
11772 RETURN VALUE
11773 NONE
11774
11775===========================================================================*/
11776void WDA_TransportChannelDebug
11777(
11778 v_BOOL_t displaySnapshot,
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011779 v_BOOL_t toggleStallDetect
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011780)
11781{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011782 WDI_TransportChannelDebug(displaySnapshot, toggleStallDetect);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011783 return;
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070011784}