blob: caeb5d43478d3c75e3bc4bfca1b92c91be9908bb [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 */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001422void WDA_stopCallback(WDI_Status status, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07001423{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001424 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
1425 tWDA_CbContext *wdaContext;
1426
1427 if(NULL == pWdaParams)
1428 {
1429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1430 "%s: pWdaParams received NULL", __FUNCTION__);
1431 VOS_ASSERT(0) ;
1432 return ;
1433 }
1434
1435 wdaContext = (tWDA_CbContext *)pWdaParams->pWdaContext;
1436
Jeff Johnson295189b2012-06-20 16:38:30 -07001437 if (NULL == wdaContext)
1438 {
1439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1440 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1441 return ;
1442 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001443
Jeff Johnson295189b2012-06-20 16:38:30 -07001444 /* free the config structure */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001445 if(pWdaParams->wdaWdiApiMsgParam != NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07001446 {
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001447 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07001448 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001449 vos_mem_free(pWdaParams);
1450
Jeff Johnson295189b2012-06-20 16:38:30 -07001451 if(WDI_STATUS_SUCCESS != status)
1452 {
1453 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1454 "WDI stop callback returned failure" );
1455 VOS_ASSERT(0) ;
1456 }
1457 else
1458 {
1459 wdaContext->wdaState = WDA_STOP_STATE;
1460 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001461
Jeff Johnson295189b2012-06-20 16:38:30 -07001462 /* Indicate VOSS about the start complete */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001463 vos_WDAComplete_cback(wdaContext->pVosContext);
1464
Jeff Johnson295189b2012-06-20 16:38:30 -07001465 return ;
1466}
Jeff Johnson295189b2012-06-20 16:38:30 -07001467/*
1468 * FUNCTION: WDA_stop
1469 * call WDI_stop
1470 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001471VOS_STATUS WDA_stop(v_PVOID_t pVosContext, tANI_U8 reason)
1472{
1473 WDI_Status wdiStatus;
1474 VOS_STATUS status = VOS_STATUS_SUCCESS;
1475 WDI_StopReqParamsType *wdiStopReq;
1476 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001477 tWDA_ReqParams *pWdaParams ;
1478
Jeff Johnson295189b2012-06-20 16:38:30 -07001479 if (NULL == pWDA)
1480 {
1481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1482 "%s: Invoked with invalid pWDA", __FUNCTION__ );
1483 VOS_ASSERT(0);
1484 return VOS_STATUS_E_FAILURE;
1485 }
Madan Mohan Koyyalamudia2fc6412012-10-21 12:06:12 -07001486 if (pWDA->wdiFailed == true)
1487 {
1488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
1489 "%s: WDI in failed state", __FUNCTION__ );
1490 return VOS_STATUS_E_ALREADY;
1491 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001492
Jeff Johnson295189b2012-06-20 16:38:30 -07001493 /* FTM mode stay START_STATE */
1494 if( (WDA_READY_STATE != pWDA->wdaState) &&
1495 (WDA_INIT_STATE != pWDA->wdaState) &&
1496 (WDA_START_STATE != pWDA->wdaState) )
1497 {
1498 VOS_ASSERT(0);
1499 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001500 wdiStopReq = (WDI_StopReqParamsType *)
1501 vos_mem_malloc(sizeof(WDI_StopReqParamsType));
1502 if(NULL == wdiStopReq)
1503 {
1504 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1505 "%s: VOS MEM Alloc Failure", __FUNCTION__);
1506 VOS_ASSERT(0);
1507 return VOS_STATUS_E_NOMEM;
1508 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001509
Jeff Johnson295189b2012-06-20 16:38:30 -07001510 wdiStopReq->wdiStopReason = reason;
1511 wdiStopReq->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001512
1513 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
1514 if(NULL == pWdaParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07001515 {
1516 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001517 "%s: VOS MEM Alloc Failure", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001518 VOS_ASSERT(0);
1519 vos_mem_free(wdiStopReq);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001520 return VOS_STATUS_E_NOMEM;
Jeff Johnson295189b2012-06-20 16:38:30 -07001521 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001522
Jeff Johnson295189b2012-06-20 16:38:30 -07001523 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
1524 {
1525 wdaDestroyTimers(pWDA);
1526 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001527 pWdaParams->wdaWdiApiMsgParam = (v_PVOID_t *)wdiStopReq;
1528 pWdaParams->wdaMsgParam = NULL;
1529 pWdaParams->pWdaContext = pWDA;
1530
Jeff Johnson295189b2012-06-20 16:38:30 -07001531 /* call WDI stop */
1532 wdiStatus = WDI_Stop(wdiStopReq,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001533 (WDI_StopRspCb)WDA_stopCallback, pWdaParams);
1534
Jeff Johnson295189b2012-06-20 16:38:30 -07001535 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
1536 {
1537 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1538 "error in WDA Stop" );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07001539 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
1540 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001541 status = VOS_STATUS_E_FAILURE;
1542 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001543 return status;
1544}
Jeff Johnson295189b2012-06-20 16:38:30 -07001545/*
1546 * FUNCTION: WDA_close
1547 * call WDI_close and free the WDA context
1548 */
1549VOS_STATUS WDA_close(v_PVOID_t pVosContext)
1550{
Jeff Johnson43971f52012-07-17 12:26:56 -07001551 VOS_STATUS status = VOS_STATUS_SUCCESS;
1552 WDI_Status wstatus;
1553 VOS_STATUS vstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07001554 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001555 if (NULL == wdaContext)
1556 {
1557 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1558 "%s: Invoked with invalid wdaContext", __FUNCTION__ );
1559 return VOS_STATUS_E_FAILURE;
1560 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001561 if((WDA_INIT_STATE != wdaContext->wdaState) &&
1562 (WDA_STOP_STATE != wdaContext->wdaState))
1563 {
1564 VOS_ASSERT(0);
1565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001566 /*call WDI close*/
Jeff Johnson43971f52012-07-17 12:26:56 -07001567 wstatus = WDI_Close();
1568 if ( wstatus != WDI_STATUS_SUCCESS )
Jeff Johnson295189b2012-06-20 16:38:30 -07001569 {
1570 status = VOS_STATUS_E_FAILURE;
1571 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001572 wdaContext->wdaState = WDA_CLOSE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001573 /* Destroy the events */
Jeff Johnson43971f52012-07-17 12:26:56 -07001574 vstatus = vos_event_destroy(&wdaContext->wdaWdiEvent);
1575 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001576 {
1577 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1578 "WDI Sync Event destroy failed - status = %d\n", status);
1579 status = VOS_STATUS_E_FAILURE;
1580 }
1581
Jeff Johnson43971f52012-07-17 12:26:56 -07001582 vstatus = vos_event_destroy(&wdaContext->txFrameEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001583 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001584 {
1585 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1586 "VOS Event destroy failed - status = %d\n", status);
1587 status = VOS_STATUS_E_FAILURE;
1588 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001589 vstatus = vos_event_destroy(&wdaContext->suspendDataTxEvent);
Jeff Johnsone7245742012-09-05 17:12:55 -07001590 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001591 {
1592 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1593 "VOS Event destroy failed - status = %d\n", status);
1594 status = VOS_STATUS_E_FAILURE;
1595 }
Jeff Johnson43971f52012-07-17 12:26:56 -07001596 vstatus = vos_event_destroy(&wdaContext->waitOnWdiIndicationCallBack);
Jeff Johnsone7245742012-09-05 17:12:55 -07001597 if(!VOS_IS_STATUS_SUCCESS(vstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07001598 {
1599 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1600 "VOS Event destroy failed - status = %d\n", status);
1601 status = VOS_STATUS_E_FAILURE;
1602 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001603 /* free WDA context */
Jeff Johnson43971f52012-07-17 12:26:56 -07001604 vstatus = vos_free_context(pVosContext, VOS_MODULE_ID_WDA, wdaContext);
Jeff Johnsone7245742012-09-05 17:12:55 -07001605 if ( !VOS_IS_STATUS_SUCCESS(vstatus) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001606 {
1607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1608 "error in WDA close " );
1609 status = VOS_STATUS_E_FAILURE;
1610 }
1611 return status;
1612}
Jeff Johnson295189b2012-06-20 16:38:30 -07001613/*
1614 * FUNCTION: WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual
1615 * returns 1 if the compiled version is greater than or equal to the input version
1616 */
1617
1618uint8 WDA_IsWcnssWlanCompiledVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1619{
1620 VOS_STATUS status = VOS_STATUS_SUCCESS;
1621 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1622 tSirVersionType compiledVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001623 status = WDA_GetWcnssWlanCompiledVersion(vosContext, &compiledVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001624 if ((compiledVersion.major > major) || ((compiledVersion.major == major)&& (compiledVersion.minor > minor)) ||
1625 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version > version)) ||
1626 ((compiledVersion.major == major)&& (compiledVersion.minor == minor) &&(compiledVersion.version == version) &&
1627 (compiledVersion.revision >= revision)))
1628 return 1;
1629 else
1630 return 0;
1631}
Jeff Johnson295189b2012-06-20 16:38:30 -07001632/*
1633 * FUNCTION: WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual
1634 * returns 1 if the compiled version is greater than or equal to the input version
1635 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001636uint8 WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual(uint8 major, uint8 minor, uint8 version, uint8 revision)
1637{
1638 VOS_STATUS status = VOS_STATUS_SUCCESS;
1639 v_CONTEXT_t vosContext = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
1640 tSirVersionType reportedVersion;
Jeff Johnson295189b2012-06-20 16:38:30 -07001641 status = WDA_GetWcnssWlanReportedVersion(vosContext, &reportedVersion);
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 if ((reportedVersion.major > major) || ((reportedVersion.major == major)&& (reportedVersion.minor > minor)) ||
1643 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version > version)) ||
1644 ((reportedVersion.major == major)&& (reportedVersion.minor == minor) &&(reportedVersion.version == version) &&
1645 (reportedVersion.revision >= revision)))
1646 return 1;
1647 else
1648 return 0;
1649}
Jeff Johnson295189b2012-06-20 16:38:30 -07001650/*
1651 * FUNCTION: WDA_GetWcnssWlanCompiledVersion
1652 * Returns the version of the WCNSS WLAN API with which the HOST
1653 * device driver was compiled
1654 */
1655VOS_STATUS WDA_GetWcnssWlanCompiledVersion(v_PVOID_t pvosGCtx,
1656 tSirVersionType *pVersion)
1657{
1658 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07001659 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001660 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001661 if ((NULL == pvosGCtx) || (NULL == pVersion))
1662 {
1663 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1664 "%s: Invoked with invalid parameter", __FUNCTION__);
1665 VOS_ASSERT(0);
1666 return VOS_STATUS_E_FAILURE;
1667 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001668 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1669 if (NULL == pWDA )
1670 {
1671 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1672 "%s: Invalid WDA context", __FUNCTION__);
1673 VOS_ASSERT(0);
1674 return VOS_STATUS_E_FAILURE;
1675 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001676 *pVersion = pWDA->wcnssWlanCompiledVersion;
1677 return VOS_STATUS_SUCCESS;
1678}
Jeff Johnson295189b2012-06-20 16:38:30 -07001679/*
1680 * FUNCTION: WDA_GetWcnssWlanReportedVersion
1681 * Returns the version of the WCNSS WLAN API with which the WCNSS
1682 * device driver was compiled
1683 */
1684VOS_STATUS WDA_GetWcnssWlanReportedVersion(v_PVOID_t pvosGCtx,
1685 tSirVersionType *pVersion)
1686{
1687 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07001688 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
Jeff Johnson295189b2012-06-20 16:38:30 -07001689 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 if ((NULL == pvosGCtx) || (NULL == pVersion))
1691 {
1692 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1693 "%s: Invoked with invalid parameter", __FUNCTION__);
1694 VOS_ASSERT(0);
1695 return VOS_STATUS_E_FAILURE;
1696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001697 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1698 if (NULL == pWDA )
1699 {
1700 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1701 "%s: Invalid WDA context", __FUNCTION__);
1702 VOS_ASSERT(0);
1703 return VOS_STATUS_E_FAILURE;
1704 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001705 *pVersion = pWDA->wcnssWlanReportedVersion;
1706 return VOS_STATUS_SUCCESS;
1707}
Jeff Johnson295189b2012-06-20 16:38:30 -07001708/*
1709 * FUNCTION: WDA_GetWcnssSoftwareVersion
1710 * Returns the WCNSS Software version string
1711 */
1712VOS_STATUS WDA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx,
1713 tANI_U8 *pVersion,
1714 tANI_U32 versionBufferSize)
1715{
1716 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001717 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1718 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001719 if ((NULL == pvosGCtx) || (NULL == pVersion))
1720 {
1721 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1722 "%s: Invoked with invalid parameter", __FUNCTION__);
1723 VOS_ASSERT(0);
1724 return VOS_STATUS_E_FAILURE;
1725 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001726 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1727 if (NULL == pWDA )
1728 {
1729 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1730 "%s: Invalid WDA context", __FUNCTION__);
1731 VOS_ASSERT(0);
1732 return VOS_STATUS_E_FAILURE;
1733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 wpalMemoryCopy(pVersion, pWDA->wcnssSoftwareVersionString, versionBufferSize);
1735 return VOS_STATUS_SUCCESS;
1736}
Jeff Johnson295189b2012-06-20 16:38:30 -07001737/*
1738 * FUNCTION: WDA_GetWcnssHardwareVersion
1739 * Returns the WCNSS Hardware version string
1740 */
1741VOS_STATUS WDA_GetWcnssHardwareVersion(v_PVOID_t pvosGCtx,
1742 tANI_U8 *pVersion,
1743 tANI_U32 versionBufferSize)
1744{
1745 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07001746 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1747 "%s: Entered", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001748 if ((NULL == pvosGCtx) || (NULL == pVersion))
1749 {
1750 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1751 "%s: Invoked with invalid parameter", __FUNCTION__);
1752 VOS_ASSERT(0);
1753 return VOS_STATUS_E_FAILURE;
1754 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001755 pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
1756 if (NULL == pWDA )
1757 {
1758 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1759 "%s: Invalid WDA context", __FUNCTION__);
1760 VOS_ASSERT(0);
1761 return VOS_STATUS_E_FAILURE;
1762 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001763 wpalMemoryCopy(pVersion, pWDA->wcnssHardwareVersionString, versionBufferSize);
1764 return VOS_STATUS_SUCCESS;
1765}
Jeff Johnson295189b2012-06-20 16:38:30 -07001766/*
1767 * FUNCTION: WDA_WniCfgDnld
1768 * Trigger CFG Download
1769 */
1770VOS_STATUS WDA_WniCfgDnld(tWDA_CbContext *pWDA)
1771{
1772 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07001773 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001774 v_VOID_t *pFileImage = NULL;
1775 v_SIZE_t cbFileImageSize = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001776 v_VOID_t *pCfgBinary = NULL;
1777 v_SIZE_t cbCfgBinarySize = 0;
1778
1779 v_BOOL_t bStatus = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001780 if (NULL == pMac )
1781 {
1782 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1783 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
1784 VOS_ASSERT(0);
1785 return VOS_STATUS_E_FAILURE;
1786 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001787 /* get the number of bytes in the CFG Binary... */
1788 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, NULL,
1789 &cbFileImageSize );
1790 if ( VOS_STATUS_E_NOMEM != vosStatus )
1791 {
1792 VOS_TRACE( VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR,
1793 "Error obtaining binary size" );
1794 goto fail;
1795 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001796 // malloc a buffer to read in the Configuration binary file.
1797 pFileImage = vos_mem_malloc( cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001798 if ( NULL == pFileImage )
1799 {
1800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1801 "Unable to allocate memory for the CFG binary [size= %d bytes]",
1802 cbFileImageSize );
Jeff Johnson295189b2012-06-20 16:38:30 -07001803 vosStatus = VOS_STATUS_E_NOMEM;
1804 goto fail;
1805 }
1806
1807 /* Get the entire CFG file image... */
1808 vosStatus = vos_get_binary_blob( VOS_BINARY_ID_CONFIG, pFileImage,
1809 &cbFileImageSize );
1810 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
1811 {
1812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1813 "Error: Cannot retrieve CFG file image from vOSS. [size= %d bytes]",
1814 cbFileImageSize );
1815 goto fail;
1816 }
1817
1818 /*
1819 * Validate the binary image. This function will return a pointer
1820 * and length where the CFG binary is located within the binary image file.
1821 */
1822 bStatus = sys_validateStaConfig( pFileImage, cbFileImageSize,
1823 &pCfgBinary, &cbCfgBinarySize );
1824 if ( VOS_FALSE == bStatus )
1825 {
1826 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1827 "Error: Cannot find STA CFG in binary image file" );
1828 vosStatus = VOS_STATUS_E_FAILURE;
1829 goto fail;
1830 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001831 /*
1832 * TODO: call the config download function
1833 * for now calling the existing cfg download API
1834 */
1835 processCfgDownloadReq(pMac,cbCfgBinarySize,pCfgBinary);
Jeff Johnson295189b2012-06-20 16:38:30 -07001836 if( pFileImage != NULL )
1837 {
1838 vos_mem_free( pFileImage );
1839 }
1840 return vosStatus;
1841
1842fail:
1843 if(pCfgBinary != NULL)
1844 vos_mem_free( pFileImage );
1845
1846 return vosStatus;
1847}
Jeff Johnson295189b2012-06-20 16:38:30 -07001848/* -----------------------------------------------------------------
1849 * WDI interface
1850 * -----------------------------------------------------------------
1851 */
Jeff Johnson295189b2012-06-20 16:38:30 -07001852/*
1853 * FUNCTION: WDA_suspendDataTxCallback
1854 * call back function called from TL after suspend Transmission
1855 */
1856VOS_STATUS WDA_SuspendDataTxCallback( v_PVOID_t pvosGCtx,
1857 v_U8_t* ucSTAId,
1858 VOS_STATUS vosStatus)
1859{
1860 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pvosGCtx);
Jeff Johnson295189b2012-06-20 16:38:30 -07001861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1862 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001863 if (NULL == pWDA )
1864 {
1865 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1866 "%s: Invoked with invalid WDA context ", __FUNCTION__ );
1867 VOS_ASSERT(0);
1868 return VOS_STATUS_E_FAILURE;
1869 }
1870 if(VOS_IS_STATUS_SUCCESS(vosStatus))
1871 {
1872 pWDA->txStatus = WDA_TL_TX_SUSPEND_SUCCESS;
1873 }
1874 else
1875 {
1876 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
1877 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001878 /* Trigger the event to bring the WDA TL suspend function to come
1879 * out of wait*/
1880 vosStatus = vos_event_set(&pWDA->suspendDataTxEvent);
1881 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1882 {
1883 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1884 "NEW VOS Event Set failed - status = %d \n", vosStatus);
1885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001886 /* If TL suspended had timedout before this callback was called, resume back
1887 * TL.*/
1888 if (pWDA->txSuspendTimedOut)
1889 {
1890 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1891 "Late TLSuspendCallback, resuming TL back again\n");
1892 WDA_ResumeDataTx(pWDA);
1893 pWDA->txSuspendTimedOut = FALSE;
1894 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001895 return VOS_STATUS_SUCCESS;
1896}
Jeff Johnson295189b2012-06-20 16:38:30 -07001897/*
1898 * FUNCTION: WDA_suspendDataTx
1899 * Update TL to suspend the data Transmission
1900 */
1901VOS_STATUS WDA_SuspendDataTx(tWDA_CbContext *pWDA)
1902{
1903 VOS_STATUS status = VOS_STATUS_E_FAILURE;
1904 tANI_U8 eventIdx = 0;
1905 tANI_U8 ucSTAId = 0;
1906
1907 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1908 "%s: Entered " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001909 pWDA->txStatus = WDA_TL_TX_SUSPEND_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07001910 if (pWDA->txSuspendTimedOut)
1911 {
1912 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1913 "TL suspend timedout previously, CB not called yet\n");
1914 return status;
1915 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001916 /* Reset the event to be not signalled */
1917 status = vos_event_reset(&pWDA->suspendDataTxEvent);
1918 if(!VOS_IS_STATUS_SUCCESS(status))
1919 {
1920 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1921 "VOS Event reset failed - status = %d\n",status);
1922 return VOS_STATUS_E_FAILURE;
1923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001924 /*Indicate TL to suspend transmission for all Sta Id */
1925 ucSTAId = WLAN_ALL_STA;
1926 status = WLANTL_SuspendDataTx(pWDA->pVosContext, &ucSTAId,
1927 WDA_SuspendDataTxCallback);
1928 if(status != VOS_STATUS_SUCCESS)
1929 {
1930 return status;
1931 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001932 /* Wait for the event to be set by the TL, to get the response of
1933 * suspending the TX queues, this event should be set by the Callback
1934 * function called by TL*/
1935 status = vos_wait_events(&pWDA->suspendDataTxEvent, 1,
1936 WDA_TL_SUSPEND_TIMEOUT, &eventIdx);
1937 if(!VOS_IS_STATUS_SUCCESS(status))
1938 {
1939 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1940 "%s: Status %d when waiting for Suspend Data TX Event",
1941 __FUNCTION__, status);
1942 /* Set this flag to true when TL suspend times out, so that when TL
1943 * suspend eventually happens and calls the callback, TL can be resumed
1944 * right away by looking at this flag when true.*/
1945 pWDA->txSuspendTimedOut = TRUE;
1946 }
1947 else
1948 {
1949 pWDA->txSuspendTimedOut = FALSE;
1950 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001951 if(WDA_TL_TX_SUSPEND_SUCCESS == pWDA->txStatus)
1952 {
1953 status = VOS_STATUS_SUCCESS;
1954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001955 return status;
1956}
Jeff Johnson295189b2012-06-20 16:38:30 -07001957/*
1958 * FUNCTION: WDA_resumeDataTx
1959 * Update TL to resume the data Transmission
1960 */
1961VOS_STATUS WDA_ResumeDataTx(tWDA_CbContext *pWDA)
1962{
1963 VOS_STATUS status = VOS_STATUS_SUCCESS;
1964 tANI_U8 ucSTAId = 0;
1965
1966 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1967 "%s: Entered " ,__FUNCTION__);
1968 ucSTAId = WLAN_ALL_STA;
1969 status = WLANTL_ResumeDataTx(pWDA->pVosContext, &ucSTAId);
1970 return status;
1971}
Jeff Johnson295189b2012-06-20 16:38:30 -07001972/*
1973 * FUNCTION: WDA_InitScanReqCallback
1974 * Trigger Init SCAN callback
1975 */
1976void WDA_InitScanReqCallback(WDI_Status wdiStatus, void* pUserData)
1977{
1978 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
1979 tWDA_CbContext *pWDA;
1980 tInitScanParams *pWDA_ScanParam ;
1981 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07001982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
1983 "<------ %s " ,__FUNCTION__);
1984 if(NULL == pWdaParams)
1985 {
1986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1987 "%s: pWdaParams received NULL", __FUNCTION__);
1988 VOS_ASSERT(0) ;
1989 return ;
1990 }
1991 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
1992 pWDA_ScanParam = (tInitScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07001993 if(NULL == pWDA_ScanParam)
1994 {
1995 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1996 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07001997 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07001998 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
1999 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002000 return ;
2001 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002002 if(WDI_STATUS_SUCCESS != wdiStatus)
2003 {
2004 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002005 if(VOS_STATUS_SUCCESS != status)
2006 {
2007 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2008 "%s error in Resume Tx ", __FUNCTION__ );
2009 }
2010 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002011 /* free WDI command buffer */
2012 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07002013 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002014
Jeff Johnson295189b2012-06-20 16:38:30 -07002015
2016 /* assign status to scan params */
2017 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002018 /* send SCAN RSP message back to PE */
2019 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002020 return ;
2021}
2022
2023/*
2024 * FUNCTION: WDA_ProcessInitScanReq
2025 * Trigger Init SCAN in DAL
2026 */
2027VOS_STATUS WDA_ProcessInitScanReq(tWDA_CbContext *pWDA,
2028 tInitScanParams *initScanParams)
2029{
2030 WDI_Status status = WDI_STATUS_SUCCESS ;
2031 WDI_InitScanReqParamsType *wdiInitScanParam =
2032 (WDI_InitScanReqParamsType *)vos_mem_malloc(
2033 sizeof(WDI_InitScanReqParamsType)) ;
2034 tWDA_ReqParams *pWdaParams;
2035 tANI_U8 i = 0;
2036
2037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2038 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002039 if(NULL == wdiInitScanParam)
2040 {
2041 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2042 "%s:VOS MEM Alloc Failure", __FUNCTION__);
2043 VOS_ASSERT(0);
2044 return VOS_STATUS_E_NOMEM;
2045 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002046 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2047 if(NULL == pWdaParams)
2048 {
2049 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2050 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2051 VOS_ASSERT(0);
2052 vos_mem_free(wdiInitScanParam);
2053 return VOS_STATUS_E_NOMEM;
2054 }
2055
2056 /* Copy init Scan params to WDI structure */
2057 wdiInitScanParam->wdiReqInfo.wdiScanMode = initScanParams->scanMode ;
2058 vos_mem_copy(wdiInitScanParam->wdiReqInfo.macBSSID, initScanParams->bssid,
2059 sizeof(tSirMacAddr)) ;
2060 wdiInitScanParam->wdiReqInfo.bNotifyBSS = initScanParams->notifyBss ;
2061 wdiInitScanParam->wdiReqInfo.ucFrameType = initScanParams->frameType ;
2062 wdiInitScanParam->wdiReqInfo.ucFrameLength = initScanParams->frameLength ;
2063#ifdef WLAN_FEATURE_P2P
2064 wdiInitScanParam->wdiReqInfo.bUseNOA = initScanParams->useNoA;
2065 wdiInitScanParam->wdiReqInfo.scanDuration = initScanParams->scanDuration;
2066#else
2067 wdiInitScanParam->wdiReqInfo.bUseNOA = 0;
2068 wdiInitScanParam->wdiReqInfo.scanDuration = 0;
2069#endif
2070 wdiInitScanParam->wdiReqInfo.wdiScanEntry.activeBSScnt =
2071 initScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002072 for (i=0; i < initScanParams->scanEntry.activeBSScnt; i++)
2073 {
2074 wdiInitScanParam->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2075 initScanParams->scanEntry.bssIdx[i] ;
2076 }
2077
2078 /* if Frame length, copy macMgmtHdr or WDI structure */
2079 if(0 != wdiInitScanParam->wdiReqInfo.ucFrameLength)
2080 {
2081 vos_mem_copy(&wdiInitScanParam->wdiReqInfo.wdiMACMgmtHdr,
2082 &initScanParams->macMgmtHdr, sizeof(tSirMacMgmtHdr)) ;
2083 }
2084 wdiInitScanParam->wdiReqStatusCB = NULL ;
2085
Jeff Johnson295189b2012-06-20 16:38:30 -07002086 /* Store Init Req pointer, as this will be used for response */
2087 pWdaParams->pWdaContext = pWDA;
2088 pWdaParams->wdaMsgParam = initScanParams;
2089 pWdaParams->wdaWdiApiMsgParam = wdiInitScanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002090 /* first try to suspend TX */
2091 status = WDA_SuspendDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002092 if(WDI_STATUS_SUCCESS != status)
2093 {
2094 goto handleWdiFailure;
2095 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002096 /* call DAL API to pass init scan request to DAL */
2097 status = WDI_InitScanReq(wdiInitScanParam,
2098 WDA_InitScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 if(IS_WDI_STATUS_FAILURE(status))
2100 {
2101 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2102 "error in WDA Init Scan, Resume Tx " );
2103 status = WDA_ResumeDataTx(pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002104 VOS_ASSERT(0) ;
2105
2106 goto handleWdiFailure;
2107 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002109handleWdiFailure:
2110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2111 "Failure in WDI Api, free all the memory " );
2112 /* free WDI command buffer */
2113 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2114 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002115 /* send Failure to PE */
2116 initScanParams->status = eSIR_FAILURE ;
2117 WDA_SendMsg(pWDA, WDA_INIT_SCAN_RSP, (void *)initScanParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002118 return CONVERT_WDI2VOS_STATUS(status) ;
2119}
2120
Jeff Johnson295189b2012-06-20 16:38:30 -07002121/*
2122 * FUNCTION: WDA_StartScanReqCallback
2123 * send Start SCAN RSP back to PE
2124 */
2125void WDA_StartScanReqCallback(WDI_StartScanRspParamsType *pScanRsp,
2126 void* pUserData)
2127{
2128 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2129 tWDA_CbContext *pWDA;
2130 tStartScanParams *pWDA_ScanParam;
2131 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2132 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002133 if(NULL == pWdaParams)
2134 {
2135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2136 "%s: pWdaParams received NULL", __FUNCTION__);
2137 VOS_ASSERT(0) ;
2138 return ;
2139 }
2140 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2141 pWDA_ScanParam = (tStartScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002142 if(NULL == pWDA_ScanParam)
2143 {
2144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2145 "%s: pWDA_ScanParam received NULL", __FUNCTION__);
2146 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002147 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002148 return ;
2149 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002150 if(NULL == pWdaParams->wdaWdiApiMsgParam)
2151 {
2152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2153 "%s: wdaWdiApiMsgParam is NULL", __FUNCTION__);
2154 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002155 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002156 return ;
2157 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002158 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2159 vos_mem_free(pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002160
Jeff Johnson295189b2012-06-20 16:38:30 -07002161
2162 /* assign status to scan params */
2163 pWDA_ScanParam->status = CONVERT_WDI2SIR_STATUS(pScanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002164 /* send SCAN RSP message back to PE */
2165 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)pWDA_ScanParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002166 return ;
2167}
2168
Jeff Johnson295189b2012-06-20 16:38:30 -07002169/*
2170 * FUNCTION: WDA_ProcessStartScanReq
2171 * Trigger start SCAN in WDI
2172 */
2173VOS_STATUS WDA_ProcessStartScanReq(tWDA_CbContext *pWDA,
2174 tStartScanParams *startScanParams)
2175{
2176 WDI_Status status = WDI_STATUS_SUCCESS;
2177 WDI_StartScanReqParamsType *wdiStartScanParams =
2178 (WDI_StartScanReqParamsType *)vos_mem_malloc(
2179 sizeof(WDI_StartScanReqParamsType)) ;
2180 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2182 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002183 if(NULL == wdiStartScanParams)
2184 {
2185 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2186 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2187 VOS_ASSERT(0);
2188 return VOS_STATUS_E_NOMEM;
2189 }
2190 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2191 if(NULL == pWdaParams)
2192 {
2193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2194 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2195 VOS_ASSERT(0);
2196 vos_mem_free(wdiStartScanParams);
2197 return VOS_STATUS_E_NOMEM;
2198 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002199 /* Copy init Scan params to WDI structure */
2200 wdiStartScanParams->ucChannel = startScanParams->scanChannel ;
2201 wdiStartScanParams->wdiReqStatusCB = NULL ;
2202
Jeff Johnson295189b2012-06-20 16:38:30 -07002203 /* Store Init Req pointer, as this will be used for response */
2204 /* store Params pass it to WDI */
2205 pWdaParams->pWdaContext = pWDA;
2206 pWdaParams->wdaMsgParam = startScanParams;
2207 pWdaParams->wdaWdiApiMsgParam = wdiStartScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002208 /* call DAL API to pass init scan request to DAL */
2209 status = WDI_StartScanReq(wdiStartScanParams,
2210 WDA_StartScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002211 /* failure returned by WDI API */
2212 if(IS_WDI_STATUS_FAILURE(status))
2213 {
2214 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2215 "Failure in Start Scan WDI API, free all the memory "
2216 "It should be due to previous abort scan." );
2217 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2218 vos_mem_free(pWdaParams) ;
2219 startScanParams->status = eSIR_FAILURE ;
2220 WDA_SendMsg(pWDA, WDA_START_SCAN_RSP, (void *)startScanParams, 0) ;
2221 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002222 return CONVERT_WDI2VOS_STATUS(status) ;
2223}
Jeff Johnson295189b2012-06-20 16:38:30 -07002224/*
2225 * FUNCTION: WDA_EndScanReqCallback
2226 * END SCAN callback
2227 */
2228void WDA_EndScanReqCallback(WDI_Status status, void* pUserData)
2229{
2230 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2231 tWDA_CbContext *pWDA;
2232 tEndScanParams *endScanParam;
2233 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2234 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002235 if(NULL == pWdaParams)
2236 {
2237 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2238 "%s: pWdaParams received NULL", __FUNCTION__);
2239 VOS_ASSERT(0) ;
2240 return ;
2241 }
2242 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2243 endScanParam = (tEndScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002244 if(NULL == endScanParam)
2245 {
2246 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2247 "%s: endScanParam received NULL", __FUNCTION__);
2248 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002249 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2250 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002251 return ;
2252 }
2253
2254 /* Free WDI command buffer */
2255 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2256 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002257 /* assign status to scan params */
2258 endScanParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002259 /* send response back to PE */
2260 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParam, 0) ;
2261 return ;
2262}
2263
Jeff Johnson295189b2012-06-20 16:38:30 -07002264/*
2265 * FUNCTION: WDA_ProcessEndScanReq
2266 * Trigger END SCAN in WDI
2267 */
2268VOS_STATUS WDA_ProcessEndScanReq(tWDA_CbContext *pWDA,
2269 tEndScanParams *endScanParams)
2270{
2271 WDI_Status status = WDI_STATUS_SUCCESS;
2272 WDI_EndScanReqParamsType *wdiEndScanParams =
2273 (WDI_EndScanReqParamsType *)vos_mem_malloc(
2274 sizeof(WDI_EndScanReqParamsType)) ;
2275 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2277 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002278 if(NULL == wdiEndScanParams)
2279 {
2280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2281 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2282 VOS_ASSERT(0);
2283 return VOS_STATUS_E_NOMEM;
2284 }
2285 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2286 if(NULL == pWdaParams)
2287 {
2288 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2289 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2290 VOS_ASSERT(0);
2291 vos_mem_free(wdiEndScanParams);
2292 return VOS_STATUS_E_NOMEM;
2293 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002294 /* Copy init Scan params to WDI structure */
2295 wdiEndScanParams->ucChannel = endScanParams->scanChannel ;
2296 wdiEndScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002297 /* Store Init Req pointer, as this will be used for response */
2298 /* store Params pass it to WDI */
2299 pWdaParams->pWdaContext = pWDA;
2300 pWdaParams->wdaMsgParam = endScanParams;
2301 pWdaParams->wdaWdiApiMsgParam = wdiEndScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002302 /* call DAL API to pass init scan request to DAL */
2303 status = WDI_EndScanReq(wdiEndScanParams,
2304 WDA_EndScanReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002305 if(IS_WDI_STATUS_FAILURE(status))
2306 {
2307 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2308 "Failure in End Scan WDI API, free all the memory "
2309 "It should be due to previous abort scan." );
2310 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2311 vos_mem_free(pWdaParams) ;
2312 endScanParams->status = eSIR_FAILURE ;
2313 WDA_SendMsg(pWDA, WDA_END_SCAN_RSP, (void *)endScanParams, 0) ;
2314 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002315 return CONVERT_WDI2VOS_STATUS(status) ;
2316}
Jeff Johnson295189b2012-06-20 16:38:30 -07002317/*
2318 * FUNCTION: WDA_FinishScanReqCallback
2319 * Trigger Finish SCAN callback
2320 */
2321void WDA_FinishScanReqCallback(WDI_Status wdiStatus, void* pUserData)
2322{
2323 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2324 tWDA_CbContext *pWDA;
2325 tFinishScanParams *finishScanParam;
2326 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -07002327 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2328 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002329 if(NULL == pWdaParams)
2330 {
2331 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2332 "%s: pWdaParams received NULL", __FUNCTION__);
2333 VOS_ASSERT(0) ;
2334 return ;
2335 }
2336
2337 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2338 finishScanParam = (tFinishScanParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002339 if(NULL == finishScanParam)
2340 {
2341 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2342 "%s: finishScanParam is NULL", __FUNCTION__);
2343 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07002344 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2345 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002346 return ;
2347 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002348 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2349 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002350 /*
2351 * Now Resume TX, if we reached here means, TX is already suspended, we
2352 * have to resume it unconditionaly
2353 */
2354 status = WDA_ResumeDataTx(pWDA) ;
2355
2356 if(VOS_STATUS_SUCCESS != status)
2357 {
2358 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2359 "%s error in Resume Tx ", __FUNCTION__ );
2360 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002361 finishScanParam->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParam, 0) ;
2363 return ;
2364}
Jeff Johnson295189b2012-06-20 16:38:30 -07002365/*
2366 * FUNCTION: WDA_ProcessFinshScanReq
2367 * Trigger Finish SCAN in WDI
2368 */
2369VOS_STATUS WDA_ProcessFinishScanReq(tWDA_CbContext *pWDA,
2370 tFinishScanParams *finishScanParams)
2371{
2372 WDI_Status status = WDI_STATUS_SUCCESS;
2373 WDI_FinishScanReqParamsType *wdiFinishScanParams =
2374 (WDI_FinishScanReqParamsType *)vos_mem_malloc(
2375 sizeof(WDI_FinishScanReqParamsType)) ;
2376 tWDA_ReqParams *pWdaParams ;
2377 tANI_U8 i = 0;
2378 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2379 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002380 if(NULL == wdiFinishScanParams)
2381 {
2382 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2383 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2384 VOS_ASSERT(0);
2385 return VOS_STATUS_E_NOMEM;
2386 }
2387 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2388 if(NULL == pWdaParams)
2389 {
2390 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2391 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2392 VOS_ASSERT(0);
2393 vos_mem_free(wdiFinishScanParams);
2394 return VOS_STATUS_E_NOMEM;
2395 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002396 /* Copy init Scan params to WDI structure */
2397 wdiFinishScanParams->wdiReqInfo.wdiScanMode = finishScanParams->scanMode ;
2398 vos_mem_copy(wdiFinishScanParams->wdiReqInfo.macBSSID,
2399 finishScanParams->bssid, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002400 wdiFinishScanParams->wdiReqInfo.bNotifyBSS = finishScanParams->notifyBss ;
2401 wdiFinishScanParams->wdiReqInfo.ucFrameType = finishScanParams->frameType ;
2402 wdiFinishScanParams->wdiReqInfo.ucFrameLength =
2403 finishScanParams->frameLength ;
2404 wdiFinishScanParams->wdiReqInfo.ucCurrentOperatingChannel =
2405 finishScanParams->currentOperChannel ;
2406 wdiFinishScanParams->wdiReqInfo.wdiCBState = finishScanParams->cbState ;
2407 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.activeBSScnt =
2408 finishScanParams->scanEntry.activeBSScnt ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002409 for (i = 0; i < finishScanParams->scanEntry.activeBSScnt; i++)
2410 {
2411 wdiFinishScanParams->wdiReqInfo.wdiScanEntry.bssIdx[i] =
2412 finishScanParams->scanEntry.bssIdx[i] ;
2413 }
2414
2415
Jeff Johnson295189b2012-06-20 16:38:30 -07002416 /* if Frame length, copy macMgmtHdr ro WDI structure */
2417 if(0 != wdiFinishScanParams->wdiReqInfo.ucFrameLength)
2418 {
2419 vos_mem_copy(&wdiFinishScanParams->wdiReqInfo.wdiMACMgmtHdr,
2420 &finishScanParams->macMgmtHdr,
2421 sizeof(WDI_MacMgmtHdr)) ;
2422 }
2423 wdiFinishScanParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002424 /* Store Init Req pointer, as this will be used for response */
2425 /* store Params pass it to WDI */
2426 pWdaParams->pWdaContext = pWDA;
2427 pWdaParams->wdaMsgParam = finishScanParams;
2428 pWdaParams->wdaWdiApiMsgParam = wdiFinishScanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002429 /* call DAL API to pass init scan request to DAL */
2430 status = WDI_FinishScanReq(wdiFinishScanParams,
2431 WDA_FinishScanReqCallback, pWdaParams) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07002432
Jeff Johnson295189b2012-06-20 16:38:30 -07002433
2434 /*
2435 * WDI API returns failure..
2436 */
2437 if(IS_WDI_STATUS_FAILURE( status))
2438 {
2439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2440 "Failure in Finish Scan WDI API, free all the memory " );
2441 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2442 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002443 finishScanParams->status = eSIR_FAILURE ;
2444 WDA_SendMsg(pWDA, WDA_FINISH_SCAN_RSP, (void *)finishScanParams, 0) ;
2445 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002446 return CONVERT_WDI2VOS_STATUS(status) ;
2447}
Jeff Johnson295189b2012-06-20 16:38:30 -07002448/*---------------------------------------------------------------------
2449 * ASSOC API's
2450 *---------------------------------------------------------------------
2451 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002452/*
2453 * FUNCTION: WDA_JoinReqCallback
2454 * Trigger Init SCAN callback
2455 */
2456void WDA_JoinReqCallback(WDI_Status status, void* pUserData)
2457{
2458 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2459 tWDA_CbContext *pWDA;
2460 tSwitchChannelParams *joinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002461 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2462 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 if(NULL == pWdaParams)
2464 {
2465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2466 "%s: pWdaParams received NULL", __FUNCTION__);
2467 VOS_ASSERT(0) ;
2468 return ;
2469 }
2470 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2471 joinReqParam = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002472 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
2473 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002474 /* reset macBSSID */
2475 vos_mem_set(pWDA->macBSSID, sizeof(pWDA->macBSSID),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002476 /* reset macSTASelf */
2477 vos_mem_set(pWDA->macSTASelf, sizeof(pWDA->macSTASelf),0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07002478 joinReqParam->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002479 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002480 return ;
2481}
Jeff Johnson295189b2012-06-20 16:38:30 -07002482/*
2483 * FUNCTION: WDA_ProcessJoinReq
2484 * Trigger Join REQ in WDI
2485 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002486VOS_STATUS WDA_ProcessJoinReq(tWDA_CbContext *pWDA,
2487 tSwitchChannelParams* joinReqParam)
2488{
2489 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002490 WDI_JoinReqParamsType *wdiJoinReqParam =
2491 (WDI_JoinReqParamsType *)vos_mem_malloc(
2492 sizeof(WDI_JoinReqParamsType)) ;
2493 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002494 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2495 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002496 if(NULL == wdiJoinReqParam)
2497 {
2498 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2499 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2500 VOS_ASSERT(0);
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002501 vos_mem_free(joinReqParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07002502 return VOS_STATUS_E_NOMEM;
2503 }
2504 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2505 if(NULL == pWdaParams)
2506 {
2507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2508 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2509 VOS_ASSERT(0);
2510 vos_mem_free(wdiJoinReqParam);
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002511 vos_mem_free(joinReqParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07002512 return VOS_STATUS_E_NOMEM;
2513 }
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07002514
2515 /*if the BSSID or self STA in pWDA is NULL, join request can't be processed*/
2516 if(WDA_IS_NULL_MAC_ADDRESS(pWDA->macBSSID) ||
2517 WDA_IS_NULL_MAC_ADDRESS(pWDA->macSTASelf))
2518 {
2519 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
2520 "%s: received join request when BSSID or self-STA is NULL "
2521 " BSSID:" WDA_MAC_ADDRESS_STR "Self-STA:" WDA_MAC_ADDRESS_STR,
2522 __FUNCTION__, WDA_MAC_ADDR_ARRAY(pWDA->macBSSID),
2523 WDA_MAC_ADDR_ARRAY(pWDA->macSTASelf));
2524 VOS_ASSERT(0);
2525 vos_mem_free(wdiJoinReqParam);
2526 vos_mem_free(pWdaParams);
2527 joinReqParam->status = eSIR_FAILURE ;
2528 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2529 return VOS_STATUS_E_INVAL;
2530 }
2531
Jeff Johnson295189b2012-06-20 16:38:30 -07002532 /* copy the BSSID for pWDA */
2533 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macBSSID, pWDA->macBSSID,
2534 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002535 vos_mem_copy(wdiJoinReqParam->wdiReqInfo.macSTASelf,
2536 pWDA->macSTASelf, sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002537 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucChannel =
2538 joinReqParam->channelNumber ;
2539#ifndef WLAN_FEATURE_VOWIFI
2540 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.ucLocalPowerConstraint =
2541 joinReqParam->localPowerConstraint ;
2542#endif
2543 wdiJoinReqParam->wdiReqInfo.wdiChannelInfo.wdiSecondaryChannelOffset =
2544 joinReqParam->secondaryChannelOffset ;
2545 wdiJoinReqParam->wdiReqInfo.linkState = pWDA->linkState;
2546
2547 wdiJoinReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002548 /* Store Init Req pointer, as this will be used for response */
2549 /* store Params pass it to WDI */
2550 pWdaParams->pWdaContext = pWDA;
2551 pWdaParams->wdaMsgParam = joinReqParam;
2552 pWdaParams->wdaWdiApiMsgParam = wdiJoinReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002553 status = WDI_JoinReq(wdiJoinReqParam,
2554 (WDI_JoinRspCb )WDA_JoinReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002555 if(IS_WDI_STATUS_FAILURE(status))
2556 {
2557 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2558 "Failure in Join WDI API, free all the memory " );
2559 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2560 vos_mem_free(pWdaParams) ;
2561 joinReqParam->status = eSIR_FAILURE ;
2562 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)joinReqParam, 0) ;
2563 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002564 return CONVERT_WDI2VOS_STATUS(status) ;
2565}
Jeff Johnson295189b2012-06-20 16:38:30 -07002566/*
2567 * FUNCTION: WDA_SwitchChannelReqCallback
2568 * send Switch channel RSP back to PE
2569 */
2570void WDA_SwitchChannelReqCallback(
2571 WDI_SwitchCHRspParamsType *wdiSwitchChanRsp, void* pUserData)
2572{
2573 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
2574 tWDA_CbContext *pWDA;
2575 tSwitchChannelParams *pSwitchChanParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07002576 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2577 "<------ %s " ,__FUNCTION__);
2578 if(NULL == pWdaParams)
2579 {
2580 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2581 "%s: pWdaParams received NULL", __FUNCTION__);
2582 VOS_ASSERT(0) ;
2583 return ;
2584 }
2585 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2586 pSwitchChanParams = (tSwitchChannelParams *)pWdaParams->wdaMsgParam;
2587
2588#ifdef WLAN_FEATURE_VOWIFI
2589 pSwitchChanParams->txMgmtPower = wdiSwitchChanRsp->ucTxMgmtPower;
2590#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002591 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2592 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002593 pSwitchChanParams->status =
2594 CONVERT_WDI2SIR_STATUS(wdiSwitchChanRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002595 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002596 return ;
2597}
Jeff Johnson295189b2012-06-20 16:38:30 -07002598/*
2599 * FUNCTION: WDA_ProcessChannelSwitchReq
2600 * Request to WDI to switch channel REQ params.
2601 */
2602VOS_STATUS WDA_ProcessChannelSwitchReq(tWDA_CbContext *pWDA,
2603 tSwitchChannelParams *pSwitchChanParams)
2604{
2605 WDI_Status status = WDI_STATUS_SUCCESS ;
2606 WDI_SwitchChReqParamsType *wdiSwitchChanParam =
2607 (WDI_SwitchChReqParamsType *)vos_mem_malloc(
2608 sizeof(WDI_SwitchChReqParamsType)) ;
2609 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002610 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2611 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002612 if(NULL == wdiSwitchChanParam)
2613 {
2614 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2615 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2616 VOS_ASSERT(0);
2617 return VOS_STATUS_E_NOMEM;
2618 }
2619 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2620 if(NULL == pWdaParams)
2621 {
2622 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2623 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2624 VOS_ASSERT(0);
2625 vos_mem_free(wdiSwitchChanParam);
2626 return VOS_STATUS_E_NOMEM;
2627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002628 wdiSwitchChanParam->wdiChInfo.ucChannel = pSwitchChanParams->channelNumber;
2629#ifndef WLAN_FEATURE_VOWIFI
2630 wdiSwitchChanParam->wdiChInfo.ucLocalPowerConstraint =
2631 pSwitchChanParams->localPowerConstraint;
2632#endif
2633 wdiSwitchChanParam->wdiChInfo.wdiSecondaryChannelOffset =
2634 pSwitchChanParams->secondaryChannelOffset;
2635 wdiSwitchChanParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002636 /* Store req pointer, as this will be used for response */
2637 /* store Params pass it to WDI */
2638 pWdaParams->pWdaContext = pWDA;
2639 pWdaParams->wdaMsgParam = pSwitchChanParams;
2640 pWdaParams->wdaWdiApiMsgParam = wdiSwitchChanParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002641#ifdef WLAN_FEATURE_VOWIFI
2642 wdiSwitchChanParam->wdiChInfo.cMaxTxPower
2643 = pSwitchChanParams->maxTxPower;
2644 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macSelfStaMacAddr,
2645 pSwitchChanParams ->selfStaMacAddr,
2646 sizeof(tSirMacAddr));
2647#endif
2648 vos_mem_copy(wdiSwitchChanParam->wdiChInfo.macBSSId,
2649 pSwitchChanParams->bssId,
2650 sizeof(tSirMacAddr));
2651
2652 status = WDI_SwitchChReq(wdiSwitchChanParam,
2653 (WDI_SwitchChRspCb)WDA_SwitchChannelReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002654 if(IS_WDI_STATUS_FAILURE(status))
2655 {
2656 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2657 "Failure in process channel switch Req WDI API, free all the memory " );
2658 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2659 vos_mem_free(pWdaParams) ;
2660 pSwitchChanParams->status = eSIR_FAILURE ;
2661 WDA_SendMsg(pWDA, WDA_SWITCH_CHANNEL_RSP, (void *)pSwitchChanParams, 0) ;
2662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002663 return CONVERT_WDI2VOS_STATUS(status) ;
2664}
Jeff Johnson295189b2012-06-20 16:38:30 -07002665/*
2666 * FUNCTION: WDA_ConfigBssReqCallback
2667 * config BSS Req Callback, called by WDI
2668 */
2669void WDA_ConfigBssReqCallback(WDI_ConfigBSSRspParamsType *wdiConfigBssRsp
2670 ,void* pUserData)
2671{
2672 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2673 tWDA_CbContext *pWDA;
2674 tAddBssParams *configBssReqParam;
2675 tAddStaParams *staConfigBssParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002676 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2677 "<------ %s " ,__FUNCTION__);
2678 if(NULL == pWdaParams)
2679 {
2680 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2681 "%s: pWdaParams received NULL", __FUNCTION__);
2682 VOS_ASSERT(0) ;
2683 return ;
2684 }
2685 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2686 configBssReqParam = (tAddBssParams *)pWdaParams->wdaMsgParam;
2687 staConfigBssParam = &configBssReqParam->staContext ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002688 configBssReqParam->status =
2689 CONVERT_WDI2SIR_STATUS(wdiConfigBssRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07002690 if(WDI_STATUS_SUCCESS == wdiConfigBssRsp->wdiStatus)
2691 {
2692 vos_mem_copy(configBssReqParam->bssId, wdiConfigBssRsp->macBSSID,
2693 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002694 configBssReqParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
2695 configBssReqParam->bcastDpuSignature = wdiConfigBssRsp->ucBcastSig;
2696 configBssReqParam->mgmtDpuSignature = wdiConfigBssRsp->ucUcastSig;
2697
2698 if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_STA)
2699 {
2700 if(configBssReqParam->bssType == eSIR_IBSS_MODE)
2701 {
2702 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_IN_IBSS_ROLE;
2703 staConfigBssParam->staType = STA_ENTRY_BSSID;
2704 }
2705 else if ((configBssReqParam->bssType == eSIR_BTAMP_STA_MODE) &&
2706 (staConfigBssParam->staType == STA_ENTRY_SELF))
2707 {
2708 /* This is the 1st add BSS Req for the BTAMP STA */
2709 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2710 staConfigBssParam->staType = STA_ENTRY_BSSID;
2711 }
2712 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2713 (staConfigBssParam->staType == STA_ENTRY_PEER))
2714 {
2715 /* This is the 2nd ADD BSS Request that is sent
2716 * on the BTAMP STA side. The Sta type is
2717 * set to STA_ENTRY_PEER here.*/
2718 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_STA_ROLE;
2719 }
2720 else if ((configBssReqParam->bssType == eSIR_BTAMP_AP_MODE) &&
2721 (staConfigBssParam->staType == STA_ENTRY_SELF))
2722 {
2723 /* statype is already set by PE.
2724 * Only 1 ADD BSS Req is sent on the BTAMP AP side.*/
2725 pWDA->wdaGlobalSystemRole = eSYSTEM_BTAMP_AP_ROLE;
2726 staConfigBssParam->staType = STA_ENTRY_BSSID;
2727 }
2728 else
2729 {
2730 pWDA->wdaGlobalSystemRole = eSYSTEM_STA_ROLE;
2731 staConfigBssParam->staType = STA_ENTRY_PEER;
2732 }
2733 }
2734 else if (configBssReqParam->operMode == BSS_OPERATIONAL_MODE_AP)
2735 {
2736 pWDA->wdaGlobalSystemRole = eSYSTEM_AP_ROLE;
2737 staConfigBssParam->staType = STA_ENTRY_SELF;
2738 }
2739 else
2740 {
2741 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2742 "Invalid operation mode specified");
2743 VOS_ASSERT(0);
2744 }
2745
2746 staConfigBssParam->staIdx = wdiConfigBssRsp->ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002747 staConfigBssParam->bssIdx = wdiConfigBssRsp->ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002748 staConfigBssParam->ucUcastSig = wdiConfigBssRsp->ucUcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002749 staConfigBssParam->ucBcastSig = wdiConfigBssRsp->ucBcastSig;
Jeff Johnson295189b2012-06-20 16:38:30 -07002750 vos_mem_copy(staConfigBssParam->staMac, wdiConfigBssRsp->macSTA,
2751 sizeof(tSirMacAddr));
2752 staConfigBssParam->txChannelWidthSet =
2753 configBssReqParam->txChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -07002754 if(staConfigBssParam->staType == STA_ENTRY_PEER &&
2755 staConfigBssParam->htCapable)
2756 {
2757 pWDA->wdaStaInfo[staConfigBssParam->staIdx].bssIdx =
2758 wdiConfigBssRsp->ucBSSIdx;
2759 pWDA->wdaStaInfo[staConfigBssParam->staIdx].ucValidStaIndex =
2760 WDA_VALID_STA_INDEX ;
2761 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002762 if(WDI_DS_SetStaIdxPerBssIdx(pWDA->pWdiContext,
2763 wdiConfigBssRsp->ucBSSIdx,
2764 wdiConfigBssRsp->ucSTAIdx))
2765 {
2766 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2767 "%s: fail to set STA idx associated with BSS index", __FUNCTION__);
2768 VOS_ASSERT(0) ;
2769 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigBssRsp->ucSTAIdx))
2771 {
2772 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2773 "%s: add BSS into mempool fail", __FUNCTION__);
2774 VOS_ASSERT(0) ;
2775 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002776#ifdef WLAN_FEATURE_VOWIFI
2777 configBssReqParam->txMgmtPower = wdiConfigBssRsp->ucTxMgmtPower;
2778#endif
2779 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002780 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2781 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002782 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002783 return ;
2784}
Jeff Johnson295189b2012-06-20 16:38:30 -07002785/*
2786 * FUNCTION: WDA_UpdateEdcaParamsForAC
2787 * Update WDI EDCA params with PE edca params
2788 */
2789void WDA_UpdateEdcaParamsForAC(tWDA_CbContext *pWDA,
2790 WDI_EdcaParamRecord *wdiEdcaParam,
2791 tSirMacEdcaParamRecord *macEdcaParam)
2792{
2793 wdiEdcaParam->wdiACI.aifsn = macEdcaParam->aci.aifsn;
2794 wdiEdcaParam->wdiACI.acm= macEdcaParam->aci.acm;
2795 wdiEdcaParam->wdiACI.aci = macEdcaParam->aci.aci;
2796 wdiEdcaParam->wdiCW.min = macEdcaParam->cw.min;
2797 wdiEdcaParam->wdiCW.max = macEdcaParam->cw.max;
2798 wdiEdcaParam->usTXOPLimit = macEdcaParam->txoplimit;
2799}
Jeff Johnson295189b2012-06-20 16:38:30 -07002800/*
2801 * FUNCTION: WDA_ProcessConfigBssReq
2802 * Configure BSS before starting Assoc with AP
2803 */
2804VOS_STATUS WDA_ProcessConfigBssReq(tWDA_CbContext *pWDA,
2805 tAddBssParams* configBssReqParam)
2806{
2807 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 WDI_ConfigBSSReqParamsType *wdiConfigBssReqParam =
2809 (WDI_ConfigBSSReqParamsType *)vos_mem_malloc(
2810 sizeof(WDI_ConfigBSSReqParamsType)) ;
2811 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002812 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2813 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002814 if(NULL == wdiConfigBssReqParam)
2815 {
2816 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2817 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2818 VOS_ASSERT(0);
2819 return VOS_STATUS_E_NOMEM;
2820 }
2821 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
2822 if(NULL == pWdaParams)
2823 {
2824 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2825 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2826 VOS_ASSERT(0);
2827 vos_mem_free(wdiConfigBssReqParam);
2828 return VOS_STATUS_E_NOMEM;
2829 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002830 vos_mem_set(wdiConfigBssReqParam, sizeof(WDI_ConfigBSSReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002831 WDA_UpdateBSSParams(pWDA, &wdiConfigBssReqParam->wdiReqInfo,
2832 configBssReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002833 /* Store Init Req pointer, as this will be used for response */
2834 /* store Params pass it to WDI */
2835 pWdaParams->pWdaContext = pWDA;
2836 pWdaParams->wdaMsgParam = configBssReqParam;
2837 pWdaParams->wdaWdiApiMsgParam = wdiConfigBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002838 status = WDI_ConfigBSSReq(wdiConfigBssReqParam,
2839 (WDI_ConfigBSSRspCb )WDA_ConfigBssReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002840 if(IS_WDI_STATUS_FAILURE(status))
2841 {
2842 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2843 "Failure in Config BSS WDI API, free all the memory " );
2844 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
2845 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002846 configBssReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002847 WDA_SendMsg(pWDA, WDA_ADD_BSS_RSP, (void *)configBssReqParam, 0) ;
2848 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002849 return CONVERT_WDI2VOS_STATUS(status) ;
2850}
Jeff Johnson295189b2012-06-20 16:38:30 -07002851#ifdef ENABLE_HAL_COMBINED_MESSAGES
2852/*
2853 * FUNCTION: WDA_PostAssocReqCallback
2854 * Post ASSOC req callback, send RSP back to PE
2855 */
2856void WDA_PostAssocReqCallback(WDI_PostAssocRspParamsType *wdiPostAssocRsp,
2857 void* pUserData)
2858{
2859 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
2860 tPostAssocParams *postAssocReqParam =
2861 (tPostAssocParams *)pWDA->wdaMsgParam ;
2862 /*STA context within the BSS Params*/
2863 tAddStaParams *staPostAssocParam =
2864 &postAssocReqParam->addBssParams.staContext ;
2865 /*STA Params for self STA*/
2866 tAddStaParams *selfStaPostAssocParam =
2867 &postAssocReqParam->addStaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002868 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2869 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002870 postAssocReqParam->status =
2871 CONVERT_WDI2SIR_STATUS(wdiPostAssocRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002872 if(WDI_STATUS_SUCCESS == wdiPostAssocRsp->wdiStatus)
2873 {
2874 staPostAssocParam->staIdx = wdiPostAssocRsp->bssParams.ucSTAIdx ;
2875 vos_mem_copy(staPostAssocParam->staMac, wdiPostAssocRsp->bssParams.macSTA,
2876 sizeof(tSirMacAddr)) ;
2877 staPostAssocParam->ucUcastSig = wdiPostAssocRsp->bssParams.ucUcastSig ;
2878 staPostAssocParam->ucBcastSig = wdiPostAssocRsp->bssParams.ucBcastSig ;
2879 staPostAssocParam->bssIdx = wdiPostAssocRsp->bssParams.ucBSSIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07002880 selfStaPostAssocParam->staIdx = wdiPostAssocRsp->staParams.ucSTAIdx;
2881 }
2882 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2883 pWDA->wdaWdiApiMsgParam = NULL;
2884 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002885 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002886 return ;
2887}
Jeff Johnson295189b2012-06-20 16:38:30 -07002888/*
2889 * FUNCTION: WDA_ProcessPostAssocReq
2890 * Trigger POST ASSOC processing in WDI
2891 */
2892VOS_STATUS WDA_ProcessPostAssocReq(tWDA_CbContext *pWDA,
2893 tPostAssocParams *postAssocReqParam)
2894{
Jeff Johnson295189b2012-06-20 16:38:30 -07002895 WDI_Status status = WDI_STATUS_SUCCESS ;
2896
2897 WDI_PostAssocReqParamsType *wdiPostAssocReqParam =
2898 (WDI_PostAssocReqParamsType *)vos_mem_malloc(
2899 sizeof(WDI_PostAssocReqParamsType)) ;
2900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2901 "------> %s " ,__FUNCTION__);
2902
Jeff Johnson295189b2012-06-20 16:38:30 -07002903 if(NULL == wdiPostAssocReqParam)
2904 {
2905 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2906 "%s: VOS MEM Alloc Failure", __FUNCTION__);
2907 VOS_ASSERT(0);
2908 return VOS_STATUS_E_NOMEM;
2909 }
2910
2911 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
2912 {
2913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2914 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
2915 VOS_ASSERT(0);
2916 return VOS_STATUS_E_FAILURE;
2917 }
2918
Jeff Johnson295189b2012-06-20 16:38:30 -07002919 /* update BSS params into WDI structure */
2920 WDA_UpdateBSSParams(pWDA, &wdiPostAssocReqParam->wdiBSSParams,
2921 &postAssocReqParam->addBssParams) ;
2922 /* update STA params into WDI structure */
2923 WDA_UpdateSTAParams(pWDA, &wdiPostAssocReqParam->wdiSTAParams,
2924 &postAssocReqParam->addStaParams) ;
2925
2926 wdiPostAssocReqParam->wdiBSSParams.ucEDCAParamsValid =
2927 postAssocReqParam->addBssParams.highPerformance;
2928 WDA_UpdateEdcaParamsForAC(pWDA,
2929 &wdiPostAssocReqParam->wdiBSSParams.wdiBEEDCAParams,
2930 &postAssocReqParam->addBssParams.acbe);
2931 WDA_UpdateEdcaParamsForAC(pWDA,
2932 &wdiPostAssocReqParam->wdiBSSParams.wdiBKEDCAParams,
2933 &postAssocReqParam->addBssParams.acbk);
2934 WDA_UpdateEdcaParamsForAC(pWDA,
2935 &wdiPostAssocReqParam->wdiBSSParams.wdiVIEDCAParams,
2936 &postAssocReqParam->addBssParams.acvi);
2937 WDA_UpdateEdcaParamsForAC(pWDA,
2938 &wdiPostAssocReqParam->wdiBSSParams.wdiVOEDCAParams,
2939 &postAssocReqParam->addBssParams.acvo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002940 /* Store Init Req pointer, as this will be used for response */
2941 pWDA->wdaMsgParam = (void *)postAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002942 /* store Params pass it to WDI */
2943 pWDA->wdaWdiApiMsgParam = (void *)wdiPostAssocReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002944 status = WDI_PostAssocReq(wdiPostAssocReqParam,
2945 (WDI_PostAssocRspCb )WDA_PostAssocReqCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002946 if(IS_WDI_STATUS_FAILURE(status))
2947 {
2948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
2949 "Failure in Post Assoc WDI API, free all the memory " );
2950 vos_mem_free(pWDA->wdaWdiApiMsgParam) ;
2951 pWDA->wdaWdiApiMsgParam = NULL;
2952 pWDA->wdaMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002953 postAssocReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002954 WDA_SendMsg(pWDA, WDA_POST_ASSOC_RSP, (void *)postAssocReqParam, 0) ;
2955 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002956 return CONVERT_WDI2VOS_STATUS(status) ;
2957}
2958#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002959/*
2960 * FUNCTION: WDA_AddStaReqCallback
2961 * ADD STA req callback, send RSP back to PE
2962 */
2963void WDA_AddStaReqCallback(WDI_ConfigSTARspParamsType *wdiConfigStaRsp,
2964 void* pUserData)
2965{
2966 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
2967 tWDA_CbContext *pWDA;
2968 tAddStaParams *addStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002969 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
2970 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002971 if(NULL == pWdaParams)
2972 {
2973 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,"%s: pWdaParams is NULL", __FUNCTION__);
2974 VOS_ASSERT(0) ;
2975 return ;
2976 }
2977 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
2978 addStaReqParam = (tAddStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07002979 addStaReqParam->status =
2980 CONVERT_WDI2SIR_STATUS(wdiConfigStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07002981 if(WDI_STATUS_SUCCESS == wdiConfigStaRsp->wdiStatus)
2982 {
2983 addStaReqParam->staIdx = wdiConfigStaRsp->ucSTAIdx;
2984 /*TODO: UMAC structure doesn't have these fields*/
2985 /*addStaReqParam-> = wdiConfigStaRsp->ucDpuIndex;
2986 addStaReqParam-> = wdiConfigStaRsp->ucBcastDpuIndex;
2987 addStaReqParam-> = wdiConfigStaRsp->ucBcastMgmtDpuIdx; */
2988 addStaReqParam->ucUcastSig = wdiConfigStaRsp->ucUcastSig;
2989 addStaReqParam->ucBcastSig = wdiConfigStaRsp->ucBcastSig;
2990 /* update staIndex as valid index for BA if STA is HT capable*/
2991 if(addStaReqParam->staType == STA_ENTRY_PEER && addStaReqParam->htCapable)
2992 {
2993 pWDA->wdaStaInfo[addStaReqParam->staIdx].bssIdx =
2994 wdiConfigStaRsp->ucBssIdx;
2995 pWDA->wdaStaInfo[addStaReqParam->staIdx].ucValidStaIndex =
2996 WDA_VALID_STA_INDEX ;
2997 }
2998 if(WDI_DS_AddSTAMemPool(pWDA->pWdiContext, wdiConfigStaRsp->ucSTAIdx))
2999 {
3000 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3001 "%s: add STA into mempool fail", __FUNCTION__);
3002 VOS_ASSERT(0) ;
3003 return ;
3004 }
3005 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003006 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
3007 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003008 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003009 return ;
3010}
Jeff Johnson295189b2012-06-20 16:38:30 -07003011/*
3012 * FUNCTION: WDA_ConfigStaReq
3013 * Trigger Config STA processing in WDI
3014 */
3015VOS_STATUS WDA_ProcessAddStaReq(tWDA_CbContext *pWDA,
3016 tAddStaParams *addStaReqParam)
3017{
Jeff Johnson295189b2012-06-20 16:38:30 -07003018 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003019 WDI_ConfigSTAReqParamsType *wdiConfigStaReqParam =
3020 (WDI_ConfigSTAReqParamsType *)vos_mem_malloc(
3021 sizeof(WDI_ConfigSTAReqParamsType)) ;
3022 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003023 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3024 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003025 if(NULL == wdiConfigStaReqParam)
3026 {
3027 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3028 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3029 VOS_ASSERT(0);
3030 return VOS_STATUS_E_NOMEM;
3031 }
3032 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3033 if(NULL == pWdaParams)
3034 {
3035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3036 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3037 VOS_ASSERT(0);
3038 vos_mem_free(wdiConfigStaReqParam);
3039 return VOS_STATUS_E_NOMEM;
3040 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003041 vos_mem_set(wdiConfigStaReqParam, sizeof(WDI_ConfigSTAReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07003042 /* update STA params into WDI structure */
3043 WDA_UpdateSTAParams(pWDA, &wdiConfigStaReqParam->wdiReqInfo,
3044 addStaReqParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003045 /* Store Init Req pointer, as this will be used for response */
3046 /* store Params pass it to WDI */
3047 pWdaParams->pWdaContext = pWDA;
3048 pWdaParams->wdaMsgParam = addStaReqParam;
3049 pWdaParams->wdaWdiApiMsgParam = wdiConfigStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003050 status = WDI_ConfigSTAReq(wdiConfigStaReqParam,
3051 (WDI_ConfigSTARspCb )WDA_AddStaReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003052 if(IS_WDI_STATUS_FAILURE(status))
3053 {
3054 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3055 "Failure in Config STA WDI API, free all the memory " );
3056 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3057 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003058 addStaReqParam->status = eSIR_FAILURE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003059 WDA_SendMsg(pWDA, WDA_ADD_STA_RSP, (void *)addStaReqParam, 0) ;
3060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003061 return CONVERT_WDI2VOS_STATUS(status) ;
3062}
Jeff Johnson295189b2012-06-20 16:38:30 -07003063/*
3064 * FUNCTION: WDA_DelBSSReqCallback
3065 * Dens DEL BSS RSP back to PE
3066 */
3067void WDA_DelBSSReqCallback(WDI_DelBSSRspParamsType *wdiDelBssRsp,
3068 void* pUserData)
3069{
3070 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3071 tWDA_CbContext *pWDA;
3072 tDeleteBssParams *delBssReqParam;
3073 tANI_U8 staIdx,tid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3075 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003076 if(NULL == pWdaParams)
3077 {
3078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3079 "%s: pWdaParams received NULL", __FUNCTION__);
3080 VOS_ASSERT(0) ;
3081 return ;
3082 }
3083 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3084 delBssReqParam = (tDeleteBssParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003085 delBssReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelBssRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003086 if(WDI_STATUS_SUCCESS == wdiDelBssRsp->wdiStatus)
3087 {
3088 vos_mem_copy(delBssReqParam->bssid, wdiDelBssRsp->macBSSID,
3089 sizeof(tSirMacAddr)) ;
3090 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003091 if(WDI_DS_GetStaIdxFromBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, &staIdx))
3092 {
3093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3094 "%s: Get STA index from BSS index Fail", __FUNCTION__);
3095 VOS_ASSERT(0) ;
3096 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003097 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, staIdx))
3098 {
3099 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3100 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3101 VOS_ASSERT(0) ;
3102 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003103 if(WDI_DS_ClearStaIdxPerBssIdx(pWDA->pWdiContext, delBssReqParam->bssIdx, staIdx))
3104 {
3105 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3106 "%s: Clear STA index form table Fail", __FUNCTION__);
3107 VOS_ASSERT(0) ;
3108 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003109 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3110 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003111 /* reset the the system role*/
3112 pWDA->wdaGlobalSystemRole = eSYSTEM_UNKNOWN_ROLE;
3113
3114 /* Reset the BA related information */
3115 for(staIdx=0; staIdx < WDA_MAX_STA; staIdx++)
3116 {
3117 if( pWDA->wdaStaInfo[staIdx].bssIdx == wdiDelBssRsp->ucBssIdx )
3118 {
3119 pWDA->wdaStaInfo[staIdx].ucValidStaIndex = WDA_INVALID_STA_INDEX;
3120 pWDA->wdaStaInfo[staIdx].ucUseBaBitmap = 0;
3121 /* Reset framesTxed counters here */
3122 for(tid = 0; tid < STACFG_MAX_TC; tid++)
3123 {
3124 pWDA->wdaStaInfo[staIdx].framesTxed[tid] = 0;
3125 }
3126 }
3127 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003128 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003129 return ;
3130}
3131
Jeff Johnson295189b2012-06-20 16:38:30 -07003132/*
3133 * FUNCTION: WDA_ProcessDelBssReq
3134 * Init DEL BSS req with WDI
3135 */
3136VOS_STATUS WDA_ProcessDelBssReq(tWDA_CbContext *pWDA,
3137 tDeleteBssParams *delBssParam)
3138{
3139 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003140 WDI_DelBSSReqParamsType *wdiDelBssReqParam =
3141 (WDI_DelBSSReqParamsType *)vos_mem_malloc(
3142 sizeof(WDI_DelBSSReqParamsType)) ;
3143 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3145 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003146 if(NULL == wdiDelBssReqParam)
3147 {
3148 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3149 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3150 VOS_ASSERT(0);
3151 return VOS_STATUS_E_NOMEM;
3152 }
3153 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3154 if(NULL == pWdaParams)
3155 {
3156 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3157 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3158 VOS_ASSERT(0);
3159 vos_mem_free(wdiDelBssReqParam);
3160 return VOS_STATUS_E_NOMEM;
3161 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003162 wdiDelBssReqParam->ucBssIdx = delBssParam->bssIdx;
3163 wdiDelBssReqParam->wdiReqStatusCB = NULL ;
3164
3165 /* Store Init Req pointer, as this will be used for response */
3166 /* store Params pass it to WDI */
3167 pWdaParams->pWdaContext = pWDA;
3168 pWdaParams->wdaMsgParam = delBssParam;
3169 pWdaParams->wdaWdiApiMsgParam = wdiDelBssReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003170 status = WDI_DelBSSReq(wdiDelBssReqParam,
3171 (WDI_DelBSSRspCb )WDA_DelBSSReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003172 if(IS_WDI_STATUS_FAILURE(status))
3173 {
3174 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3175 "Failure in Del BSS WDI API, free all the memory " );
3176 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3177 vos_mem_free(pWdaParams) ;
3178 delBssParam->status = eSIR_FAILURE ;
3179 WDA_SendMsg(pWDA, WDA_DELETE_BSS_RSP, (void *)delBssParam, 0) ;
3180 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003181 return CONVERT_WDI2VOS_STATUS(status) ;
3182}
Jeff Johnson295189b2012-06-20 16:38:30 -07003183/*
3184 * FUNCTION: WDA_DelSTAReqCallback
3185 * Dens DEL STA RSP back to PE
3186 */
3187void WDA_DelSTAReqCallback(WDI_DelSTARspParamsType *wdiDelStaRsp,
3188 void* pUserData)
3189{
3190 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3191 tWDA_CbContext *pWDA;
3192 tDeleteStaParams *delStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3194 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003195 if(NULL == pWdaParams)
3196 {
3197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3198 "%s: pWdaParams received NULL", __FUNCTION__);
3199 VOS_ASSERT(0) ;
3200 return ;
3201 }
3202 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3203 delStaReqParam = (tDeleteStaParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003204 delStaReqParam->status = CONVERT_WDI2SIR_STATUS(wdiDelStaRsp->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003205 if(WDI_STATUS_SUCCESS == wdiDelStaRsp->wdiStatus)
3206 {
3207 if(WDI_DS_DelSTAMemPool(pWDA->pWdiContext, wdiDelStaRsp->ucSTAIdx))
3208 {
3209 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3210 "%s: DEL STA from MemPool Fail", __FUNCTION__);
3211 VOS_ASSERT(0) ;
3212 }
3213 delStaReqParam->staIdx = wdiDelStaRsp->ucSTAIdx ;
3214 }
3215 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3216 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003217 /*Reset the BA information corresponding to this STAIdx */
3218 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucValidStaIndex =
3219 WDA_INVALID_STA_INDEX;
3220 pWDA->wdaStaInfo[wdiDelStaRsp->ucSTAIdx].ucUseBaBitmap = 0;
3221
3222 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaReqParam , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003223 return ;
3224}
Jeff Johnson295189b2012-06-20 16:38:30 -07003225/*
3226 * FUNCTION: WDA_ProcessDelStaReq
3227 * Init DEL STA req with WDI
3228 */
3229VOS_STATUS WDA_ProcessDelStaReq(tWDA_CbContext *pWDA,
3230 tDeleteStaParams *delStaParam)
3231{
3232 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003233 WDI_DelSTAReqParamsType *wdiDelStaReqParam =
3234 (WDI_DelSTAReqParamsType *)vos_mem_malloc(
3235 sizeof(WDI_DelSTAReqParamsType)) ;
3236 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003237 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3238 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003239 if(NULL == wdiDelStaReqParam)
3240 {
3241 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3242 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3243 VOS_ASSERT(0);
3244 return VOS_STATUS_E_NOMEM;
3245 }
3246 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3247 if(NULL == pWdaParams)
3248 {
3249 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3250 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3251 VOS_ASSERT(0);
3252 vos_mem_free(wdiDelStaReqParam);
3253 return VOS_STATUS_E_NOMEM;
3254 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003255 wdiDelStaReqParam->ucSTAIdx = delStaParam->staIdx ;
3256 wdiDelStaReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003257 /* Store Init Req pointer, as this will be used for response */
3258 /* store Params pass it to WDI */
3259 pWdaParams->pWdaContext = pWDA;
3260 pWdaParams->wdaMsgParam = delStaParam;
3261 pWdaParams->wdaWdiApiMsgParam = wdiDelStaReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003262 status = WDI_DelSTAReq(wdiDelStaReqParam,
3263 (WDI_DelSTARspCb )WDA_DelSTAReqCallback, pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003264 if(IS_WDI_STATUS_FAILURE(status))
3265 {
3266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3267 "Failure in Del STA WDI API, free all the memory status = %d",
3268 status );
3269 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3270 vos_mem_free(pWdaParams) ;
3271 delStaParam->status = eSIR_FAILURE ;
3272 WDA_SendMsg(pWDA, WDA_DELETE_STA_RSP, (void *)delStaParam, 0) ;
3273 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003274 return CONVERT_WDI2VOS_STATUS(status) ;
3275}
Jeff Johnson295189b2012-06-20 16:38:30 -07003276void WDA_ProcessAddStaSelfRsp(WDI_AddSTASelfRspParamsType* pwdiAddSTASelfRsp, void* pUserData)
3277{
3278 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3279 tWDA_CbContext *pWDA;
3280 tAddStaSelfParams *pAddStaSelfRsp = NULL;
3281 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3282 "<------ %s " ,__FUNCTION__);
3283 if(NULL == pWdaParams)
3284 {
3285 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3286 "%s: pWdaParams received NULL", __FUNCTION__);
3287 VOS_ASSERT(0) ;
3288 return ;
3289 }
3290 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3291 pAddStaSelfRsp = (tAddStaSelfParams*)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003292 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3293 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003294 pAddStaSelfRsp->status = CONVERT_WDI2SIR_STATUS(pwdiAddSTASelfRsp->wdiStatus);
3295 vos_mem_copy(pAddStaSelfRsp->selfMacAddr,
3296 pwdiAddSTASelfRsp->macSelfSta,
3297 sizeof(pAddStaSelfRsp->selfMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003298 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfRsp, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003299 return ;
3300}
Jeff Johnson295189b2012-06-20 16:38:30 -07003301/*
3302 * FUNCTION: WDA_ProcessAddStaSelfReq
3303 *
3304 */
3305VOS_STATUS WDA_ProcessAddStaSelfReq( tWDA_CbContext *pWDA, tpAddStaSelfParams pAddStaSelfReq)
3306{
3307 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003308 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003309 WDI_AddSTASelfReqParamsType *wdiAddStaSelfReq =
3310 (WDI_AddSTASelfReqParamsType *)vos_mem_malloc(
3311 sizeof(WDI_AddSTASelfReqParamsType)) ;
3312 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003313 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3314 "------> %s " ,__FUNCTION__);
3315 if( NULL == wdiAddStaSelfReq )
3316 {
3317 VOS_ASSERT( 0 );
3318 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3319 "%s: Unable to allocate memory " ,__FUNCTION__);
3320 return( VOS_STATUS_E_NOMEM );
3321 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003322 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003323 if( NULL == pWdaParams )
3324 {
3325 VOS_ASSERT( 0 );
3326 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3327 "%s: Unable to allocate memory " ,__FUNCTION__);
3328 vos_mem_free(wdiAddStaSelfReq) ;
3329 return( VOS_STATUS_E_NOMEM );
3330 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003331 wdiAddStaSelfReq->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003332 vos_mem_copy( wdiAddStaSelfReq->wdiAddSTASelfInfo.selfMacAddr, pAddStaSelfReq->selfMacAddr, 6);
3333 /* Store Init Req pointer, as this will be used for response */
3334 /* store Params pass it to WDI */
3335 pWdaParams->pWdaContext = pWDA;
3336 pWdaParams->wdaMsgParam = pAddStaSelfReq;
3337 pWdaParams->wdaWdiApiMsgParam = wdiAddStaSelfReq;
Jeff Johnson43971f52012-07-17 12:26:56 -07003338 wstatus = WDI_AddSTASelfReq( wdiAddStaSelfReq, WDA_ProcessAddStaSelfRsp, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07003339
Jeff Johnson43971f52012-07-17 12:26:56 -07003340 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003341 {
3342 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3343 "Failure in Add Self Sta Request API, free all the memory status = %d",
Jeff Johnson43971f52012-07-17 12:26:56 -07003344 wstatus );
3345 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003346 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3347 vos_mem_free(pWdaParams) ;
3348 pAddStaSelfReq->status = eSIR_FAILURE ;
3349 WDA_SendMsg( pWDA, WDA_ADD_STA_SELF_RSP, (void *)pAddStaSelfReq, 0) ;
3350 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003351 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003352}
Jeff Johnson295189b2012-06-20 16:38:30 -07003353/*
3354 * FUNCTION: WDA_DelSTASelfRespCallback
3355 *
3356 */
3357void WDA_DelSTASelfRespCallback(WDI_DelSTASelfRspParamsType *
3358 wdiDelStaSelfRspParams , void* pUserData)
3359{
3360 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3361 tWDA_CbContext *pWDA;
3362 tDelStaSelfParams *delStaSelfParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07003363 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3364 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003365 if (NULL == pWdaParams)
3366 {
3367 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3368 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3369 VOS_ASSERT(0);
3370 return;
3371 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003372 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3373 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 delStaSelfParams->status =
3375 CONVERT_WDI2SIR_STATUS(wdiDelStaSelfRspParams->wdiStatus) ;
3376
3377 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3378 vos_mem_free(pWdaParams) ;
3379
3380 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003381 return ;
3382}
Jeff Johnson295189b2012-06-20 16:38:30 -07003383/*
3384 * FUNCTION: WDA_DelSTASelfReqCallback
3385 *
3386 */
3387void WDA_DelSTASelfReqCallback(WDI_Status wdiStatus,
3388 void* pUserData)
3389{
3390 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
3391 tWDA_CbContext *pWDA;
3392 tDelStaSelfParams *delStaSelfParams;
3393
3394 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3395 "<------ %s, wdiStatus: %d pWdaParams: 0x%x",
3396 __FUNCTION__, wdiStatus, pWdaParams);
3397
3398 if (NULL == pWdaParams)
3399 {
3400 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3401 "%s: Invalid pWdaParams pointer", __FUNCTION__);
3402 VOS_ASSERT(0);
3403 return;
3404 }
3405
3406 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
3407 delStaSelfParams = (tDelStaSelfParams *)pWdaParams->wdaMsgParam;
3408
3409 delStaSelfParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
3410
3411 if(IS_WDI_STATUS_FAILURE(wdiStatus))
3412 {
3413 VOS_ASSERT(0);
3414 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3415 vos_mem_free(pWdaParams) ;
3416 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)delStaSelfParams , 0) ;
3417 }
3418
3419 return ;
3420}
3421
3422/*
3423 * FUNCTION: WDA_DelSTASelfReq
3424 * Trigger Config STA processing in WDI
3425 */
3426VOS_STATUS WDA_ProcessDelSTASelfReq(tWDA_CbContext *pWDA,
3427 tDelStaSelfParams* pDelStaSelfReqParam)
3428{
3429 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07003430 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07003431 tWDA_ReqParams *pWdaParams = NULL;
3432 WDI_DelSTASelfReqParamsType *wdiDelStaSelfReq =
3433 (WDI_DelSTASelfReqParamsType *)vos_mem_malloc(
3434 sizeof(WDI_DelSTASelfReqParamsType)) ;
3435
Jeff Johnson295189b2012-06-20 16:38:30 -07003436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3437 "------> %s " ,__FUNCTION__);
3438 if( NULL == wdiDelStaSelfReq )
3439 {
3440 VOS_ASSERT( 0 );
3441 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3442 "%s: Unable to allocate memory " ,__FUNCTION__);
3443 return( VOS_STATUS_E_NOMEM );
3444 }
3445
3446 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
3447 if( NULL == pWdaParams )
3448 {
3449 VOS_ASSERT( 0 );
3450 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3451 "%s: Unable to allocate memory " ,__FUNCTION__);
3452 vos_mem_free(wdiDelStaSelfReq) ;
3453 return( VOS_STATUS_E_NOMEM );
3454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003455 pWdaParams->pWdaContext = pWDA;
3456 /* Store param pointer as passed in by caller */
3457 pWdaParams->wdaMsgParam = pDelStaSelfReqParam;
3458 /* store Params pass it to WDI */
3459 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelStaSelfReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003460 vos_mem_copy( wdiDelStaSelfReq->wdiDelStaSelfInfo.selfMacAddr,
3461 pDelStaSelfReqParam->selfMacAddr, sizeof(tSirMacAddr));
3462
3463 wdiDelStaSelfReq->wdiReqStatusCB = WDA_DelSTASelfReqCallback;
3464 wdiDelStaSelfReq->pUserData = pWdaParams;
3465
Jeff Johnson43971f52012-07-17 12:26:56 -07003466 wstatus = WDI_DelSTASelfReq(wdiDelStaSelfReq,
Jeff Johnson295189b2012-06-20 16:38:30 -07003467 (WDI_DelSTASelfRspCb)WDA_DelSTASelfRespCallback, pWdaParams);
3468
Jeff Johnson43971f52012-07-17 12:26:56 -07003469 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07003470 {
3471 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
3472 "Failure in Del Sta Self REQ WDI API, free all the memory " );
3473 VOS_ASSERT(0);
Jeff Johnson43971f52012-07-17 12:26:56 -07003474 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07003475 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
3476 vos_mem_free(pWdaParams) ;
3477 pDelStaSelfReqParam->status = eSIR_FAILURE ;
3478 WDA_SendMsg(pWDA, WDA_DEL_STA_SELF_RSP, (void *)pDelStaSelfReqParam, 0) ;
3479 }
Jeff Johnson43971f52012-07-17 12:26:56 -07003480 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07003481}
3482
Jeff Johnson295189b2012-06-20 16:38:30 -07003483/*
3484 * FUNCTION: WDA_SendMsg
3485 * Send Message back to PE
3486 */
3487void WDA_SendMsg(tWDA_CbContext *pWDA, tANI_U16 msgType,
3488 void *pBodyptr, tANI_U32 bodyVal)
3489{
3490 tSirMsgQ msg = {0} ;
3491 tANI_U32 status = VOS_STATUS_SUCCESS ;
3492 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07003493 msg.type = msgType;
3494 msg.bodyval = bodyVal;
3495 msg.bodyptr = pBodyptr;
Jeff Johnson295189b2012-06-20 16:38:30 -07003496 status = limPostMsgApi(pMac, &msg);
Jeff Johnson295189b2012-06-20 16:38:30 -07003497 if (VOS_STATUS_SUCCESS != status)
3498 {
3499 if(NULL != pBodyptr)
3500 {
3501 vos_mem_free(pBodyptr);
3502 }
3503 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3504 "%s: limPostMsgApi is failed " ,__FUNCTION__);
3505 VOS_ASSERT(0) ;
3506 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003507 return ;
3508}
Jeff Johnson295189b2012-06-20 16:38:30 -07003509/*
3510 * FUNCTION: WDA_UpdateBSSParams
3511 * Translated WDA/PE BSS info into WDI BSS info..
3512 */
3513void WDA_UpdateBSSParams(tWDA_CbContext *pWDA,
3514 WDI_ConfigBSSReqInfoType *wdiBssParams,
3515 tAddBssParams *wdaBssParams)
3516{
3517 v_U8_t keyIndex = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003518 /* copy bssReq Params to WDI structure */
3519 vos_mem_copy(wdiBssParams->macBSSID,
3520 wdaBssParams->bssId, sizeof(tSirMacAddr)) ;
3521 vos_mem_copy(wdiBssParams->macSelfAddr, wdaBssParams->selfMacAddr,
3522 sizeof(tSirMacAddr)) ;
3523 wdiBssParams->wdiBSSType = wdaBssParams->bssType ;
3524 wdiBssParams->ucOperMode = wdaBssParams->operMode ;
3525 wdiBssParams->wdiNWType = wdaBssParams->nwType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003526 wdiBssParams->ucShortSlotTimeSupported =
3527 wdaBssParams->shortSlotTimeSupported ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003528 wdiBssParams->ucllaCoexist = wdaBssParams->llaCoexist ;
3529 wdiBssParams->ucllbCoexist = wdaBssParams->llbCoexist ;
3530 wdiBssParams->ucllgCoexist = wdaBssParams->llgCoexist ;
3531 wdiBssParams->ucHT20Coexist = wdaBssParams->ht20Coexist ;
3532 wdiBssParams->ucObssProtEnabled = wdaBssParams->obssProtEnabled ;
3533
3534 wdiBssParams->ucllnNonGFCoexist = wdaBssParams->llnNonGFCoexist ;
3535 wdiBssParams->ucTXOPProtectionFullSupport =
3536 wdaBssParams->fLsigTXOPProtectionFullSupport ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003537 wdiBssParams->ucRIFSMode = wdaBssParams->fRIFSMode ;
3538 wdiBssParams->usBeaconInterval = wdaBssParams->beaconInterval ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003539 wdiBssParams->ucDTIMPeriod = wdaBssParams->dtimPeriod ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003540 wdiBssParams->ucTXChannelWidthSet = wdaBssParams->txChannelWidthSet ;
3541 wdiBssParams->ucCurrentOperChannel = wdaBssParams->currentOperChannel ;
3542 wdiBssParams->ucCurrentExtChannel = wdaBssParams->currentExtChannel ;
3543 wdiBssParams->bHiddenSSIDEn = wdaBssParams->bHiddenSSIDEn ;
3544
3545 /* copy SSID into WDI structure */
3546 wdiBssParams->wdiSSID.ucLength = wdaBssParams->ssId.length ;
3547 vos_mem_copy(wdiBssParams->wdiSSID.sSSID,
3548 wdaBssParams->ssId.ssId, wdaBssParams->ssId.length) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003549 WDA_UpdateSTAParams(pWDA, &wdiBssParams->wdiSTAContext,
3550 &wdaBssParams->staContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003551 wdiBssParams->wdiAction = wdaBssParams->updateBss;
Jeff Johnson295189b2012-06-20 16:38:30 -07003552#ifdef WLAN_FEATURE_VOWIFI
3553 wdiBssParams->cMaxTxPower = wdaBssParams->maxTxPower;
3554#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003555 wdiBssParams->ucPersona = wdaBssParams->halPersona;
Jeff Johnson295189b2012-06-20 16:38:30 -07003556 wdiBssParams->bSpectrumMgtEn = wdaBssParams->bSpectrumMgtEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07003557#ifdef WLAN_FEATURE_VOWIFI_11R
3558 wdiBssParams->bExtSetStaKeyParamValid = wdaBssParams->extSetStaKeyParamValid;
Jeff Johnson295189b2012-06-20 16:38:30 -07003559 if(wdiBssParams->bExtSetStaKeyParamValid)
3560 {
3561 /* copy set STA key params to WDI structure */
3562 wdiBssParams->wdiExtSetKeyParam.ucSTAIdx =
3563 wdaBssParams->extSetStaKeyParam.staIdx;
3564 wdiBssParams->wdiExtSetKeyParam.wdiEncType =
3565 wdaBssParams->extSetStaKeyParam.encType;
3566 wdiBssParams->wdiExtSetKeyParam.wdiWEPType =
3567 wdaBssParams->extSetStaKeyParam.wepType;
3568 wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx =
3569 wdaBssParams->extSetStaKeyParam.defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07003570 if(wdaBssParams->extSetStaKeyParam.encType != eSIR_ED_NONE)
3571 {
Jeff Johnson43971f52012-07-17 12:26:56 -07003572 if( (wdiBssParams->wdiExtSetKeyParam.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07003573 (WDA_INVALID_KEY_INDEX == wdaBssParams->extSetStaKeyParam.defWEPIdx) &&
3574 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
3575 {
3576 WDA_GetWepKeysFromCfg( pWDA,
3577 &wdiBssParams->wdiExtSetKeyParam.ucDefWEPIdx,
3578 &wdiBssParams->wdiExtSetKeyParam.ucNumKeys,
3579 wdiBssParams->wdiExtSetKeyParam.wdiKey );
3580 }
3581 else
3582 {
3583#ifdef WLAN_SOFTAP_FEATURE
3584 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3585 keyIndex++)
3586 {
3587 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyId =
3588 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyId;
3589 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].unicast =
3590 wdaBssParams->extSetStaKeyParam.key[keyIndex].unicast;
3591 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyDirection =
3592 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyRsc,
3594 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
3595 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].paeRole =
3596 wdaBssParams->extSetStaKeyParam.key[keyIndex].paeRole;
3597 wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].keyLength =
3598 wdaBssParams->extSetStaKeyParam.key[keyIndex].keyLength;
3599 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[keyIndex].key,
3600 wdaBssParams->extSetStaKeyParam.key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
3601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003602 wdiBssParams->wdiExtSetKeyParam.ucNumKeys =
3603 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
3604#else
3605 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyId =
3606 wdaBssParams->extSetStaKeyParam.key.keyId;
3607 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].unicast =
3608 wdaBssParams->extSetStaKeyParam.key.unicast;
3609 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyDirection =
3610 wdaBssParams->extSetStaKeyParam.key.keyDirection;
3611 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyRsc,
3612 wdaBssParams->extSetStaKeyParam.key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
3613 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].paeRole =
3614 wdaBssParams->extSetStaKeyParam.key.paeRole;
3615 wdiBssParams->wdiExtSetKeyParam.wdiKey[0].keyLength =
3616 wdaBssParams->extSetStaKeyParam.key.keyLength;
3617 vos_mem_copy(wdiBssParams->wdiExtSetKeyParam.wdiKey[0].key,
3618 wdaBssParams->extSetStaKeyParam.key[keyIndex].key,
3619 SIR_MAC_MAX_KEY_LENGTH);
3620 wdiBssParams->wdiExtSetKeyParam.ucNumKeys = 1;
3621#endif
3622 }
3623 }
3624 wdiBssParams->wdiExtSetKeyParam.ucSingleTidRc = wdaBssParams->extSetStaKeyParam.singleTidRc;
3625 }
3626 else /* wdaBssParams->bExtSetStaKeyParamValid is not valid */
3627 {
3628 vos_mem_zero( &wdaBssParams->extSetStaKeyParam,
3629 sizeof(wdaBssParams->extSetStaKeyParam) );
3630 }
3631#endif /*WLAN_FEATURE_VOWIFI_11R*/
Jeff Johnsone7245742012-09-05 17:12:55 -07003632#ifdef WLAN_FEATURE_11AC
3633 wdiBssParams->ucVhtCapableSta = wdaBssParams->vhtCapable;
3634 wdiBssParams->ucVhtTxChannelWidthSet = wdaBssParams->vhtTxChannelWidthSet;
3635#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003636
3637 return ;
3638}
Jeff Johnson295189b2012-06-20 16:38:30 -07003639/*
3640 * FUNCTION: WDA_UpdateSTAParams
3641 * Translated WDA/PE BSS info into WDI BSS info..
3642 */
3643void WDA_UpdateSTAParams(tWDA_CbContext *pWDA,
3644 WDI_ConfigStaReqInfoType *wdiStaParams,
3645 tAddStaParams *wdaStaParams)
3646{
3647 tANI_U8 i = 0;
3648 /* Update STA params */
3649 vos_mem_copy(wdiStaParams->macBSSID, wdaStaParams->bssId,
3650 sizeof(tSirMacAddr)) ;
3651 wdiStaParams->usAssocId = wdaStaParams->assocId;
3652 wdiStaParams->wdiSTAType = wdaStaParams->staType;
3653
3654 wdiStaParams->ucShortPreambleSupported =
3655 wdaStaParams->shortPreambleSupported;
3656 vos_mem_copy(wdiStaParams->macSTA, wdaStaParams->staMac,
3657 sizeof(tSirMacAddr)) ;
3658 wdiStaParams->usListenInterval = wdaStaParams->listenInterval;
3659
3660 wdiStaParams->ucWMMEnabled = wdaStaParams->wmmEnabled;
3661
3662 wdiStaParams->ucHTCapable = wdaStaParams->htCapable;
3663 wdiStaParams->ucTXChannelWidthSet = wdaStaParams->txChannelWidthSet;
3664 wdiStaParams->ucRIFSMode = wdaStaParams->rifsMode;
3665 wdiStaParams->ucLSIGTxopProtection = wdaStaParams->lsigTxopProtection;
3666 wdiStaParams->ucMaxAmpduSize = wdaStaParams->maxAmpduSize;
3667 wdiStaParams->ucMaxAmpduDensity = wdaStaParams->maxAmpduDensity;
3668 wdiStaParams->ucMaxAmsduSize = wdaStaParams->maxAmsduSize;
3669
3670 wdiStaParams->ucShortGI40Mhz = wdaStaParams->fShortGI40Mhz;
3671 wdiStaParams->ucShortGI20Mhz = wdaStaParams->fShortGI20Mhz;
Jeff Johnson295189b2012-06-20 16:38:30 -07003672 wdiStaParams->wdiSupportedRates.opRateMode =
3673 wdaStaParams->supportedRates.opRateMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003674 for(i = 0;i < WDI_NUM_11B_RATES;i++)
3675 {
3676 wdiStaParams->wdiSupportedRates.llbRates[i] =
3677 wdaStaParams->supportedRates.llbRates[i];
3678 }
3679 for(i = 0;i < WDI_NUM_11A_RATES;i++)
3680 {
3681 wdiStaParams->wdiSupportedRates.llaRates[i] =
3682 wdaStaParams->supportedRates.llaRates[i];
3683 }
3684 for(i = 0;i < SIR_NUM_POLARIS_RATES;i++)
3685 {
3686 wdiStaParams->wdiSupportedRates.aLegacyRates[i] =
3687 wdaStaParams->supportedRates.aniLegacyRates[i];
3688 }
3689 wdiStaParams->wdiSupportedRates.uEnhancedRateBitmap =
3690 wdaStaParams->supportedRates.aniEnhancedRateBitmap;
Jeff Johnsone7245742012-09-05 17:12:55 -07003691#ifdef WLAN_FEATURE_11AC
3692 wdiStaParams->wdiSupportedRates.vhtRxMCSMap = wdaStaParams->supportedRates.vhtRxMCSMap;
3693 wdiStaParams->wdiSupportedRates.vhtRxHighestDataRate = wdaStaParams->supportedRates.vhtRxHighestDataRate;
3694 wdiStaParams->wdiSupportedRates.vhtTxMCSMap = wdaStaParams->supportedRates.vhtTxMCSMap;
3695 wdiStaParams->wdiSupportedRates.vhtTxHighestDataRate = wdaStaParams->supportedRates.vhtTxHighestDataRate;
3696#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 for(i = 0;i <SIR_MAC_MAX_SUPPORTED_MCS_SET;i++)
3698 {
3699 wdiStaParams->wdiSupportedRates.aSupportedMCSSet[i] =
3700 wdaStaParams->supportedRates.supportedMCSSet[i];
3701 }
3702 wdiStaParams->wdiSupportedRates.aRxHighestDataRate =
3703 wdaStaParams->supportedRates.rxHighestDataRate;
3704
3705 wdiStaParams->ucRMFEnabled = wdaStaParams->rmfEnabled;
3706
3707 wdiStaParams->wdiAction = wdaStaParams->updateSta;
3708
3709 wdiStaParams->ucAPSD = wdaStaParams->uAPSD;
3710 wdiStaParams->ucMaxSPLen = wdaStaParams->maxSPLen;
3711 wdiStaParams->ucGreenFieldCapable = wdaStaParams->greenFieldCapable;
3712
3713 wdiStaParams->ucDelayedBASupport = wdaStaParams->delBASupport;
3714 wdiStaParams->us32MaxAmpduDuratio = wdaStaParams->us32MaxAmpduDuration;
3715 wdiStaParams->ucDsssCckMode40Mhz = wdaStaParams->fDsssCckMode40Mhz;
3716 wdiStaParams->ucEncryptType = wdaStaParams->encryptType;
3717#ifdef WLAN_FEATURE_P2P
3718 wdiStaParams->ucP2pCapableSta = wdaStaParams->p2pCapableSta;
3719#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07003720#ifdef WLAN_FEATURE_11AC
3721 wdiStaParams->ucVhtCapableSta = wdaStaParams->vhtCapable;
3722 wdiStaParams->ucVhtTxChannelWidthSet = wdaStaParams->vhtTxChannelWidthSet;
3723#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003724 return ;
3725}
Jeff Johnson295189b2012-06-20 16:38:30 -07003726/*
3727 * -------------------------------------------------------------------------
3728 * CFG update to WDI
3729 * -------------------------------------------------------------------------
3730 */
3731
3732 /*
3733 * FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
3734 * Convert the WNI CFG ID to HAL CFG ID
3735 */
Jeff Johnsone7245742012-09-05 17:12:55 -07003736static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
Jeff Johnson295189b2012-06-20 16:38:30 -07003737{
3738 switch(wniCfgId)
3739 {
3740 case WNI_CFG_STA_ID:
3741 return QWLAN_HAL_CFG_STA_ID;
3742 case WNI_CFG_CURRENT_TX_ANTENNA:
3743 return QWLAN_HAL_CFG_CURRENT_TX_ANTENNA;
3744 case WNI_CFG_CURRENT_RX_ANTENNA:
3745 return QWLAN_HAL_CFG_CURRENT_RX_ANTENNA;
3746 case WNI_CFG_LOW_GAIN_OVERRIDE:
3747 return QWLAN_HAL_CFG_LOW_GAIN_OVERRIDE;
3748 case WNI_CFG_POWER_STATE_PER_CHAIN:
3749 return QWLAN_HAL_CFG_POWER_STATE_PER_CHAIN;
3750 case WNI_CFG_CAL_PERIOD:
3751 return QWLAN_HAL_CFG_CAL_PERIOD;
3752 case WNI_CFG_CAL_CONTROL:
3753 return QWLAN_HAL_CFG_CAL_CONTROL;
3754 case WNI_CFG_PROXIMITY:
3755 return QWLAN_HAL_CFG_PROXIMITY;
3756 case WNI_CFG_NETWORK_DENSITY:
3757 return QWLAN_HAL_CFG_NETWORK_DENSITY;
3758 case WNI_CFG_MAX_MEDIUM_TIME:
3759 return QWLAN_HAL_CFG_MAX_MEDIUM_TIME;
3760 case WNI_CFG_MAX_MPDUS_IN_AMPDU:
3761 return QWLAN_HAL_CFG_MAX_MPDUS_IN_AMPDU;
3762 case WNI_CFG_RTS_THRESHOLD:
3763 return QWLAN_HAL_CFG_RTS_THRESHOLD;
3764 case WNI_CFG_SHORT_RETRY_LIMIT:
3765 return QWLAN_HAL_CFG_SHORT_RETRY_LIMIT;
3766 case WNI_CFG_LONG_RETRY_LIMIT:
3767 return QWLAN_HAL_CFG_LONG_RETRY_LIMIT;
3768 case WNI_CFG_FRAGMENTATION_THRESHOLD:
3769 return QWLAN_HAL_CFG_FRAGMENTATION_THRESHOLD;
3770 case WNI_CFG_DYNAMIC_THRESHOLD_ZERO:
3771 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ZERO;
3772 case WNI_CFG_DYNAMIC_THRESHOLD_ONE:
3773 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_ONE;
3774 case WNI_CFG_DYNAMIC_THRESHOLD_TWO:
3775 return QWLAN_HAL_CFG_DYNAMIC_THRESHOLD_TWO;
3776 case WNI_CFG_FIXED_RATE:
3777 return QWLAN_HAL_CFG_FIXED_RATE;
3778 case WNI_CFG_RETRYRATE_POLICY:
3779 return QWLAN_HAL_CFG_RETRYRATE_POLICY;
3780 case WNI_CFG_RETRYRATE_SECONDARY:
3781 return QWLAN_HAL_CFG_RETRYRATE_SECONDARY;
3782 case WNI_CFG_RETRYRATE_TERTIARY:
3783 return QWLAN_HAL_CFG_RETRYRATE_TERTIARY;
3784 case WNI_CFG_FORCE_POLICY_PROTECTION:
3785 return QWLAN_HAL_CFG_FORCE_POLICY_PROTECTION;
3786 case WNI_CFG_FIXED_RATE_MULTICAST_24GHZ:
3787 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_24GHZ;
3788 case WNI_CFG_FIXED_RATE_MULTICAST_5GHZ:
3789 return QWLAN_HAL_CFG_FIXED_RATE_MULTICAST_5GHZ;
3790 case WNI_CFG_DEFAULT_RATE_INDEX_24GHZ:
3791 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_24GHZ;
3792 case WNI_CFG_DEFAULT_RATE_INDEX_5GHZ:
3793 return QWLAN_HAL_CFG_DEFAULT_RATE_INDEX_5GHZ;
3794 case WNI_CFG_MAX_BA_SESSIONS:
3795 return QWLAN_HAL_CFG_MAX_BA_SESSIONS;
3796 case WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT:
3797 return QWLAN_HAL_CFG_PS_DATA_INACTIVITY_TIMEOUT;
3798 case WNI_CFG_PS_ENABLE_BCN_FILTER:
3799 return QWLAN_HAL_CFG_PS_ENABLE_BCN_FILTER;
3800 case WNI_CFG_PS_ENABLE_RSSI_MONITOR:
3801 return QWLAN_HAL_CFG_PS_ENABLE_RSSI_MONITOR;
3802 case WNI_CFG_NUM_BEACON_PER_RSSI_AVERAGE:
3803 return QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
3804 case WNI_CFG_STATS_PERIOD:
3805 return QWLAN_HAL_CFG_STATS_PERIOD;
3806 case WNI_CFG_CFP_MAX_DURATION:
3807 return QWLAN_HAL_CFG_CFP_MAX_DURATION;
3808#if 0 /*This is not part of CFG*/
3809 case WNI_CFG_FRAME_TRANS_ENABLED:
3810 return QWLAN_HAL_CFG_FRAME_TRANS_ENABLED;
3811#endif
3812 case WNI_CFG_DTIM_PERIOD:
3813 return QWLAN_HAL_CFG_DTIM_PERIOD;
3814 case WNI_CFG_EDCA_WME_ACBK:
3815 return QWLAN_HAL_CFG_EDCA_WMM_ACBK;
3816 case WNI_CFG_EDCA_WME_ACBE:
3817 return QWLAN_HAL_CFG_EDCA_WMM_ACBE;
3818 case WNI_CFG_EDCA_WME_ACVI:
3819 return QWLAN_HAL_CFG_EDCA_WMM_ACVI;
3820 case WNI_CFG_EDCA_WME_ACVO:
3821 return QWLAN_HAL_CFG_EDCA_WMM_ACVO;
3822#if 0
3823 case WNI_CFG_TELE_BCN_WAKEUP_EN:
3824 return QWLAN_HAL_CFG_TELE_BCN_WAKEUP_EN;
3825 case WNI_CFG_TELE_BCN_TRANS_LI:
3826 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI;
3827 case WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS:
3828 return QWLAN_HAL_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS;
3829 case WNI_CFG_TELE_BCN_MAX_LI:
3830 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI;
3831 case WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS:
3832 return QWLAN_HAL_CFG_TELE_BCN_MAX_LI_IDLE_BCNS;
3833#endif
3834 case WNI_CFG_ENABLE_CLOSE_LOOP:
3835 return QWLAN_HAL_CFG_ENABLE_CLOSE_LOOP;
3836 default:
3837 {
3838 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3839 "There is no HAL CFG Id corresponding to WNI CFG Id: %d\n",
3840 wniCfgId);
3841 return VOS_STATUS_E_INVAL;
3842 }
3843 }
3844}
Jeff Johnson295189b2012-06-20 16:38:30 -07003845/*
3846 * FUNCTION: WDA_UpdateCfgCallback
3847 *
3848 */
3849void WDA_UpdateCfgCallback(WDI_Status wdiStatus, void* pUserData)
3850{
3851 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
3852 WDI_UpdateCfgReqParamsType *wdiCfgParam =
3853 (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgApiMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003854 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3855 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003856 /*
3857 * currently there is no response message is expected between PE and
3858 * WDA, Failure return from WDI is a ASSERT condition
3859 */
3860 if(WDI_STATUS_SUCCESS != wdiStatus)
3861 {
3862 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3863 "%s: CFG (%d) config failure \n", __FUNCTION__,
3864 ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
3865 }
3866
3867 vos_mem_free(wdiCfgParam->pConfigBuffer) ;
3868 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3869 pWDA->wdaWdiCfgApiMsgParam = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07003870 return ;
3871}
Jeff Johnson295189b2012-06-20 16:38:30 -07003872/*
3873 * FUNCTION: WDA_UpdateCfg
3874 *
3875 */
3876VOS_STATUS WDA_UpdateCfg(tWDA_CbContext *pWDA, tSirMsgQ *cfgParam)
3877{
3878
3879 WDI_Status status = WDI_STATUS_SUCCESS ;
3880 tANI_U32 val =0;
3881 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
3882 tHalCfg *configData;
3883 WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
3884 tANI_U8 *configDataValue;
Jeff Johnson295189b2012-06-20 16:38:30 -07003885 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
3886 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07003887 if (NULL == pMac )
3888 {
3889 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3890 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3891 return VOS_STATUS_E_FAILURE;
3892 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 if(WDA_START_STATE != pWDA->wdaState)
3894 {
3895 return VOS_STATUS_E_FAILURE;
3896 }
3897
3898 if(NULL != pWDA->wdaWdiCfgApiMsgParam)
3899 {
3900 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3901 "%s:wdaWdiCfgApiMsgParam is not NULL", __FUNCTION__);
3902 VOS_ASSERT(0);
3903 return VOS_STATUS_E_FAILURE;
3904 }
3905
3906 wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
3907 sizeof(WDI_UpdateCfgReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003908 if(NULL == wdiCfgReqParam)
3909 {
3910 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3911 "%s: VOS MEM Alloc Failure", __FUNCTION__);
3912 VOS_ASSERT(0);
3913 return VOS_STATUS_E_NOMEM;
3914 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003915 wdiCfgReqParam->pConfigBuffer = vos_mem_malloc(sizeof(tHalCfg) +
3916 sizeof(tANI_U32)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003917 if(NULL == wdiCfgReqParam->pConfigBuffer)
3918 {
3919 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3920 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
3921 vos_mem_free(wdiCfgReqParam);
3922 VOS_ASSERT(0);
3923 return VOS_STATUS_E_NOMEM;
3924 }
3925
3926 /*convert the WNI CFG Id to HAL CFG Id*/
3927 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
3928 WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
3929
3930 /*TODO: revisit this for handling string parameters */
3931 if (wlan_cfgGetInt(pMac, (tANI_U16) cfgParam->bodyval,
3932 &val) != eSIR_SUCCESS)
3933 {
3934 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3935 "Failed to cfg get id %d\n", cfgParam->bodyval);
3936 vos_mem_free(wdiCfgReqParam->pConfigBuffer);
3937 vos_mem_free(wdiCfgReqParam);
3938 return eSIR_FAILURE;
3939 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003940 ((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->length = sizeof(tANI_U32);
3941 configData =((tHalCfg *)wdiCfgReqParam->pConfigBuffer) ;
3942 configDataValue = ((tANI_U8 *)configData + sizeof(tHalCfg));
3943 vos_mem_copy( configDataValue, &val, sizeof(tANI_U32));
3944 wdiCfgReqParam->wdiReqStatusCB = NULL ;
3945
3946 /* store Params pass it to WDI */
3947 pWDA->wdaWdiCfgApiMsgParam = (void *)wdiCfgReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003948#ifdef FEATURE_HAL_SUPPORT_DYNAMIC_UPDATE_CFG
3949 status = WDI_UpdateCfgReq(wdiCfgReqParam,
3950 (WDI_UpdateCfgRspCb )WDA_UpdateCfgCallback, pWDA) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003951 if(IS_WDI_STATUS_FAILURE(status))
3952 {
3953 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3954 "Failure in Update CFG WDI API, free all the memory " );
3955 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3956 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3957 pWDA->wdaWdiCfgApiMsgParam = NULL;
3958 /* Failure is not expected */
3959 VOS_ASSERT(0) ;
3960 }
3961#else
3962 vos_mem_free(wdiCfgReqParam->pConfigBuffer) ;
3963 vos_mem_free(pWDA->wdaWdiCfgApiMsgParam) ;
3964 pWDA->wdaWdiCfgApiMsgParam = NULL;
3965#endif
3966 return CONVERT_WDI2VOS_STATUS(status) ;
3967}
3968
Jeff Johnson295189b2012-06-20 16:38:30 -07003969VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
3970 v_U8_t *pDefaultKeyId,
3971 v_U8_t *pNumKeys,
3972 WDI_KeysType *pWdiKeys )
3973{
3974 v_U32_t i, j, defKeyId = 0;
3975 v_U32_t val = SIR_MAC_KEY_LENGTH;
3976 VOS_STATUS status = WDI_STATUS_SUCCESS;
3977 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07003978 if (NULL == pMac )
3979 {
3980 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3981 "%s: Invoked with invalid MAC context ", __FUNCTION__ );
3982 return VOS_STATUS_E_FAILURE;
3983 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_WEP_DEFAULT_KEYID,
3985 &defKeyId ))
3986 {
3987 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
3988 "Unable to retrieve defaultKeyId from CFG. Defaulting to 0...");
3989 }
3990
3991 *pDefaultKeyId = (v_U8_t)defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 /* Need to extract ALL of the configured WEP Keys */
3993 for( i = 0, j = 0; i < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS; i++ )
3994 {
3995 val = SIR_MAC_KEY_LENGTH;
3996 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3997 (v_U16_t) (WNI_CFG_WEP_DEFAULT_KEY_1 + i),
3998 pWdiKeys[j].key,
3999 &val ))
4000 {
4001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4002 "WEP Key index [%d] may not configured in CFG\n",i);
4003 }
4004 else
4005 {
4006 pWdiKeys[j].keyId = (tANI_U8) i;
4007 /*
4008 * Actually, a DC (Don't Care) because
4009 * this is determined (and set) by PE/MLME
4010 */
4011 pWdiKeys[j].unicast = 0;
4012 /*
4013 * Another DC (Don't Care)
4014 */
4015 pWdiKeys[j].keyDirection = eSIR_TX_RX;
4016 /* Another DC (Don't Care). Unused for WEP */
4017 pWdiKeys[j].paeRole = 0;
4018 /* Determined from wlan_cfgGetStr() above.*/
4019 pWdiKeys[j].keyLength = (tANI_U16) val;
Jeff Johnson295189b2012-06-20 16:38:30 -07004020 j++;
4021 *pNumKeys = (tANI_U8) j;
4022 }
4023 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 return status;
4025}
Jeff Johnson295189b2012-06-20 16:38:30 -07004026/*
4027 * FUNCTION: WDA_SetBssKeyReqCallback
4028 * send SET BSS key RSP back to PE
4029 */
4030void WDA_SetBssKeyReqCallback(WDI_Status status, void* pUserData)
4031{
4032 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4033 tWDA_CbContext *pWDA;
4034 tSetBssKeyParams *setBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004035 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4036 "<------ %s " ,__FUNCTION__);
4037 if(NULL == pWdaParams)
4038 {
4039 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4040 "%s: pWdaParams received NULL", __FUNCTION__);
4041 VOS_ASSERT(0) ;
4042 return ;
4043 }
4044 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4045 setBssKeyParams = (tSetBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004046 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4047 vos_mem_free(pWdaParams) ;
4048 setBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004049 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004050 return ;
4051}
Jeff Johnson295189b2012-06-20 16:38:30 -07004052/*
4053 * FUNCTION: WDA_ProcessSetBssKeyReq
4054 * Request to WDI for programming the BSS key( key for
4055 * broadcast/multicast frames Encryption)
4056 */
4057VOS_STATUS WDA_ProcessSetBssKeyReq(tWDA_CbContext *pWDA,
4058 tSetBssKeyParams *setBssKeyParams )
4059{
4060 WDI_Status status = WDI_STATUS_SUCCESS ;
4061 WDI_SetBSSKeyReqParamsType *wdiSetBssKeyParam =
4062 (WDI_SetBSSKeyReqParamsType *)vos_mem_malloc(
4063 sizeof(WDI_SetBSSKeyReqParamsType)) ;
4064 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004065 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4067 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004068 if(NULL == wdiSetBssKeyParam)
4069 {
4070 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4071 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4072 VOS_ASSERT(0);
4073 return VOS_STATUS_E_NOMEM;
4074 }
4075 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4076 if(NULL == pWdaParams)
4077 {
4078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4079 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4080 VOS_ASSERT(0);
4081 vos_mem_free(wdiSetBssKeyParam);
4082 return VOS_STATUS_E_NOMEM;
4083 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004084 vos_mem_zero(wdiSetBssKeyParam, sizeof(WDI_SetBSSKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004085 /* copy set BSS params to WDI structure */
4086 wdiSetBssKeyParam->wdiBSSKeyInfo.ucBssIdx = setBssKeyParams->bssIdx;
4087 wdiSetBssKeyParam->wdiBSSKeyInfo.wdiEncType = setBssKeyParams->encType;
4088 wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys = setBssKeyParams->numKeys;
Jeff Johnson295189b2012-06-20 16:38:30 -07004089 if(setBssKeyParams->encType != eSIR_ED_NONE)
4090 {
4091 if( setBssKeyParams->numKeys == 0 &&
4092 (( setBssKeyParams->encType == eSIR_ED_WEP40)||
4093 setBssKeyParams->encType == eSIR_ED_WEP104))
4094 {
4095 tANI_U8 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004096 WDA_GetWepKeysFromCfg( pWDA, &defaultKeyId,
4097 &wdiSetBssKeyParam->wdiBSSKeyInfo.ucNumKeys,
4098 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys );
4099 }
4100 else
4101 {
4102 for( keyIndex=0; keyIndex < setBssKeyParams->numKeys; keyIndex++)
4103 {
4104 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyId =
4105 setBssKeyParams->key[keyIndex].keyId;
4106 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].unicast =
4107 setBssKeyParams->key[keyIndex].unicast;
4108 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyDirection =
4109 setBssKeyParams->key[keyIndex].keyDirection;
4110 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyRsc,
4111 setBssKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4112 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].paeRole =
4113 setBssKeyParams->key[keyIndex].paeRole;
4114 wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].keyLength =
4115 setBssKeyParams->key[keyIndex].keyLength;
4116 vos_mem_copy(wdiSetBssKeyParam->wdiBSSKeyInfo.aKeys[keyIndex].key,
4117 setBssKeyParams->key[keyIndex].key,
4118 SIR_MAC_MAX_KEY_LENGTH);
4119 }
4120 }
4121 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004122 wdiSetBssKeyParam->wdiBSSKeyInfo.ucSingleTidRc =
4123 setBssKeyParams->singleTidRc;
4124 wdiSetBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004125 /* Store set key pointer, as this will be used for response */
4126 /* store Params pass it to WDI */
4127 pWdaParams->pWdaContext = pWDA;
4128 pWdaParams->wdaMsgParam = setBssKeyParams;
4129 pWdaParams->wdaWdiApiMsgParam = wdiSetBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004130 status = WDI_SetBSSKeyReq(wdiSetBssKeyParam,
4131 (WDI_SetBSSKeyRspCb)WDA_SetBssKeyReqCallback ,pWdaParams);
4132
4133 if(IS_WDI_STATUS_FAILURE(status))
4134 {
4135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4136 "Failure in Set BSS Key Req WDI API, free all the memory " );
4137 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4138 vos_mem_free(pWdaParams) ;
4139 setBssKeyParams->status = eSIR_FAILURE ;
4140 WDA_SendMsg(pWDA, WDA_SET_BSSKEY_RSP, (void *)setBssKeyParams, 0) ;
4141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004142 return CONVERT_WDI2VOS_STATUS(status) ;
4143}
Jeff Johnson295189b2012-06-20 16:38:30 -07004144/*
4145 * FUNCTION: WDA_RemoveBssKeyReqCallback
4146 * send SET BSS key RSP back to PE
4147 */
4148void WDA_RemoveBssKeyReqCallback(WDI_Status status, void* pUserData)
4149{
4150 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4151 tWDA_CbContext *pWDA;
4152 tRemoveBssKeyParams *removeBssKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004153 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4154 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004155 if(NULL == pWdaParams)
4156 {
4157 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4158 "%s: pWdaParams received NULL", __FUNCTION__);
4159 VOS_ASSERT(0) ;
4160 return ;
4161 }
4162 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4163 removeBssKeyParams = (tRemoveBssKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004164 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4165 vos_mem_free(pWdaParams) ;
4166
4167 removeBssKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004168 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004169 return ;
4170}
Jeff Johnson295189b2012-06-20 16:38:30 -07004171/*
4172 * FUNCTION: WDA_ProcessRemoveBssKeyReq
4173 * Request to WDI to remove the BSS key( key for broadcast/multicast
4174 * frames Encryption)
4175 */
4176VOS_STATUS WDA_ProcessRemoveBssKeyReq(tWDA_CbContext *pWDA,
4177 tRemoveBssKeyParams *removeBssKeyParams )
4178{
4179 WDI_Status status = WDI_STATUS_SUCCESS ;
4180 WDI_RemoveBSSKeyReqParamsType *wdiRemoveBssKeyParam =
4181 (WDI_RemoveBSSKeyReqParamsType *)vos_mem_malloc(
4182 sizeof(WDI_RemoveBSSKeyReqParamsType)) ;
4183 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004184 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4185 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004186 if(NULL == wdiRemoveBssKeyParam)
4187 {
4188 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4189 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4190 VOS_ASSERT(0);
4191 return VOS_STATUS_E_NOMEM;
4192 }
4193 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4194 if(NULL == pWdaParams)
4195 {
4196 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4197 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4198 VOS_ASSERT(0);
4199 vos_mem_free(wdiRemoveBssKeyParam);
4200 return VOS_STATUS_E_NOMEM;
4201 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004202 /* copy Remove BSS key params to WDI structure*/
4203 wdiRemoveBssKeyParam->wdiKeyInfo.ucBssIdx = removeBssKeyParams->bssIdx;
4204 wdiRemoveBssKeyParam->wdiKeyInfo.wdiEncType = removeBssKeyParams->encType;
4205 wdiRemoveBssKeyParam->wdiKeyInfo.ucKeyId = removeBssKeyParams->keyId;
4206 wdiRemoveBssKeyParam->wdiKeyInfo.wdiWEPType = removeBssKeyParams->wepType;
4207 wdiRemoveBssKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 /* Store remove key pointer, as this will be used for response */
4209 /* store Params pass it to WDI */
4210 pWdaParams->pWdaContext = pWDA;
4211 pWdaParams->wdaMsgParam = removeBssKeyParams;
4212 pWdaParams->wdaWdiApiMsgParam = wdiRemoveBssKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 status = WDI_RemoveBSSKeyReq(wdiRemoveBssKeyParam,
4214 (WDI_RemoveBSSKeyRspCb)WDA_RemoveBssKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004215 if(IS_WDI_STATUS_FAILURE(status))
4216 {
4217 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4218 "Failure in Remove BSS Key Req WDI API, free all the memory " );
4219 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4220 vos_mem_free(pWdaParams) ;
4221 removeBssKeyParams->status = eSIR_FAILURE ;
4222 WDA_SendMsg(pWDA, WDA_REMOVE_BSSKEY_RSP, (void *)removeBssKeyParams, 0) ;
4223 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004224 return CONVERT_WDI2VOS_STATUS(status) ;
4225}
Jeff Johnson295189b2012-06-20 16:38:30 -07004226/*
4227 * FUNCTION: WDA_SetBssKeyReqCallback
4228 * send SET BSS key RSP back to PE
4229 */
4230void WDA_SetStaKeyReqCallback(WDI_Status status, void* pUserData)
4231{
4232 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4233 tWDA_CbContext *pWDA;
4234 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4236 "<------ %s " ,__FUNCTION__);
4237 if(NULL == pWdaParams)
4238 {
4239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR
4240 ,"%s: pWdaParams received NULL", __FUNCTION__);
4241 VOS_ASSERT(0) ;
4242 return ;
4243 }
4244 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4245 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4247 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004248 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004249 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 return ;
4251}
Jeff Johnson295189b2012-06-20 16:38:30 -07004252/*
4253 * FUNCTION: WDA_ProcessSetStaKeyReq
4254 * Request to WDI for programming the STA key( key for Unicast frames
4255 * Encryption)
4256 */
4257VOS_STATUS WDA_ProcessSetStaKeyReq(tWDA_CbContext *pWDA,
4258 tSetStaKeyParams *setStaKeyParams )
4259{
4260 WDI_Status status = WDI_STATUS_SUCCESS ;
4261 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4262 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4263 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4264 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4267 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004268 if(NULL == wdiSetStaKeyParam)
4269 {
4270 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4271 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4272 VOS_ASSERT(0);
4273 return VOS_STATUS_E_NOMEM;
4274 }
4275 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4276 if(NULL == pWdaParams)
4277 {
4278 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4279 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4280 VOS_ASSERT(0);
4281 vos_mem_free(wdiSetStaKeyParam);
4282 return VOS_STATUS_E_NOMEM;
4283 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004284 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004285 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004286 /* copy set STA key params to WDI structure */
4287 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4288 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4289 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4290 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004291 if(setStaKeyParams->encType != eSIR_ED_NONE)
4292 {
Jeff Johnson43971f52012-07-17 12:26:56 -07004293 if( (wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType == WDI_WEP_STATIC) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004294 (WDA_INVALID_KEY_INDEX == setStaKeyParams->defWEPIdx) &&
4295 (eSYSTEM_AP_ROLE != pWDA->wdaGlobalSystemRole))
4296 {
4297 WDA_GetWepKeysFromCfg( pWDA,
4298 &wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx,
4299 &wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys,
4300 wdiSetStaKeyParam->wdiKeyInfo.wdiKey );
4301 }
4302 else
4303 {
4304#ifdef WLAN_SOFTAP_FEATURE
4305 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4306 keyIndex++)
4307 {
4308 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4309 setStaKeyParams->key[keyIndex].keyId;
4310 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4311 setStaKeyParams->key[keyIndex].unicast;
4312 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4313 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004314 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4315 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4316 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4317 setStaKeyParams->key[keyIndex].paeRole;
4318 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4319 setStaKeyParams->key[keyIndex].keyLength;
4320 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4321 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4322 /* set default index to index which have key direction as WDI_TX_DEFAULT */
4323 if (WDI_TX_DEFAULT == wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection)
4324 {
4325 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = keyIndex;
4326 }
4327 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004328 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4329 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4330#else
4331 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4332 setStaKeyParams->key.keyId;
4333 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4334 setStaKeyParams->key.unicast;
4335 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4336 setStaKeyParams->key.keyDirection;
4337 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4338 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4339 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4340 setStaKeyParams->key.paeRole;
4341 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4342 setStaKeyParams->key.keyLength;
4343 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4344 setStaKeyParams->key[keyIndex].key,
4345 SIR_MAC_MAX_KEY_LENGTH);
4346 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4347#endif
4348 }
4349 }
4350 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
4351 wdiSetStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004352 /* Store set key pointer, as this will be used for response */
4353 /* store Params pass it to WDI */
4354 pWdaParams->pWdaContext = pWDA;
4355 pWdaParams->wdaMsgParam = setStaKeyParams;
4356 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004357 status = WDI_SetSTAKeyReq(wdiSetStaKeyParam,
4358 (WDI_SetSTAKeyRspCb)WDA_SetStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004359 if(IS_WDI_STATUS_FAILURE(status))
4360 {
4361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4362 "Failure in set STA Key Req WDI API, free all the memory " );
4363 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4364 vos_mem_free(pWdaParams) ;
4365 setStaKeyParams->status = eSIR_FAILURE ;
4366 WDA_SendMsg(pWDA, WDA_SET_STAKEY_RSP, (void *)setStaKeyParams, 0) ;
4367 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004368 return CONVERT_WDI2VOS_STATUS(status) ;
4369}
Jeff Johnson295189b2012-06-20 16:38:30 -07004370/*
4371 * FUNCTION: WDA_SetBcastStaKeyReqCallback
4372 * send SET Bcast STA key RSP back to PE
4373 */
4374void WDA_SetBcastStaKeyReqCallback(WDI_Status status, void* pUserData)
4375{
4376 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4377 tWDA_CbContext *pWDA;
4378 tSetStaKeyParams *setStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4380 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004381 if(NULL == pWdaParams)
4382 {
4383 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4384 "%s: pWdaParams received NULL", __FUNCTION__);
4385 VOS_ASSERT(0) ;
4386 return ;
4387 }
4388 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4389 setStaKeyParams = (tSetStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004390 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4391 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004392 setStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004393 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004394 return ;
4395}
4396
Jeff Johnson295189b2012-06-20 16:38:30 -07004397/*
4398 * FUNCTION: WDA_ProcessSetBcastStaKeyReq
4399 * Request to WDI for programming the Bcast STA key( key for Broadcast frames
4400 * Encryption)
4401 */
4402VOS_STATUS WDA_ProcessSetBcastStaKeyReq(tWDA_CbContext *pWDA,
4403 tSetStaKeyParams *setStaKeyParams )
4404{
4405 WDI_Status status = WDI_STATUS_SUCCESS ;
4406 WDI_SetSTAKeyReqParamsType *wdiSetStaKeyParam =
4407 (WDI_SetSTAKeyReqParamsType *)vos_mem_malloc(
4408 sizeof(WDI_SetSTAKeyReqParamsType)) ;
4409 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004410 v_U8_t keyIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07004411 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4412 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004413 if(NULL == wdiSetStaKeyParam)
4414 {
4415 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4416 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4417 VOS_ASSERT(0);
4418 return VOS_STATUS_E_NOMEM;
4419 }
4420 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4421 if(NULL == pWdaParams)
4422 {
4423 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4424 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4425 VOS_ASSERT(0);
4426 vos_mem_free(wdiSetStaKeyParam);
4427 return VOS_STATUS_E_NOMEM;
4428 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004429 vos_mem_set(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 vos_mem_zero(wdiSetStaKeyParam, sizeof(WDI_SetSTAKeyReqParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004431 /* copy set STA key params to WDI structure */
4432 wdiSetStaKeyParam->wdiKeyInfo.ucSTAIdx = setStaKeyParams->staIdx;
4433 wdiSetStaKeyParam->wdiKeyInfo.wdiEncType = setStaKeyParams->encType;
4434 wdiSetStaKeyParam->wdiKeyInfo.wdiWEPType = setStaKeyParams->wepType;
4435 wdiSetStaKeyParam->wdiKeyInfo.ucDefWEPIdx = setStaKeyParams->defWEPIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 if(setStaKeyParams->encType != eSIR_ED_NONE)
4437 {
4438#ifdef WLAN_SOFTAP_FEATURE
4439 for( keyIndex=0; keyIndex < SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4440 keyIndex++)
4441 {
4442 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyId =
4443 setStaKeyParams->key[keyIndex].keyId;
4444 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].unicast =
4445 setStaKeyParams->key[keyIndex].unicast;
4446 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyDirection =
4447 setStaKeyParams->key[keyIndex].keyDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07004448 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyRsc,
4449 setStaKeyParams->key[keyIndex].keyRsc, WLAN_MAX_KEY_RSC_LEN);
4450 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].paeRole =
4451 setStaKeyParams->key[keyIndex].paeRole;
4452 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].keyLength =
4453 setStaKeyParams->key[keyIndex].keyLength;
4454 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[keyIndex].key,
4455 setStaKeyParams->key[keyIndex].key, SIR_MAC_MAX_KEY_LENGTH);
4456 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys =
4458 SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
4459#else
4460 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyId =
4461 setStaKeyParams->key.keyId;
4462 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].unicast =
4463 setStaKeyParams->key.unicast;
4464 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyDirection =
4465 setStaKeyParams->key.keyDirection;
4466 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyRsc,
4467 setStaKeyParams->key.keyRsc, WLAN_MAX_KEY_RSC_LEN);
4468 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].paeRole =
4469 setStaKeyParams->key.paeRole;
4470 wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].keyLength =
4471 setStaKeyParams->key.keyLength;
4472 vos_mem_copy(wdiSetStaKeyParam->wdiKeyInfo.wdiKey[0].key,
4473 setStaKeyParams->key[keyIndex].key,
4474 SIR_MAC_MAX_KEY_LENGTH);
4475 wdiSetStaKeyParam->wdiKeyInfo.ucNumKeys = 1;
4476#endif
4477 }
4478 wdiSetStaKeyParam->wdiKeyInfo.ucSingleTidRc = setStaKeyParams->singleTidRc;
Jeff Johnson295189b2012-06-20 16:38:30 -07004479 /* Store set key pointer, as this will be used for response */
4480 /* store Params pass it to WDI */
4481 pWdaParams->pWdaContext = pWDA;
4482 pWdaParams->wdaMsgParam = setStaKeyParams;
4483 pWdaParams->wdaWdiApiMsgParam = wdiSetStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004484 status = WDI_SetSTABcastKeyReq(wdiSetStaKeyParam,
4485 (WDI_SetSTAKeyRspCb)WDA_SetBcastStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004486 if(IS_WDI_STATUS_FAILURE(status))
4487 {
4488 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4489 "Failure in set BCAST STA Key Req WDI API, free all the memory " );
4490 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4491 vos_mem_free(pWdaParams) ;
4492 setStaKeyParams->status = eSIR_FAILURE ;
4493 WDA_SendMsg(pWDA, WDA_SET_STA_BCASTKEY_RSP, (void *)setStaKeyParams, 0) ;
4494 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 return CONVERT_WDI2VOS_STATUS(status) ;
4496}
Jeff Johnson295189b2012-06-20 16:38:30 -07004497/*
4498 * FUNCTION: WDA_RemoveStaKeyReqCallback
4499 * send SET BSS key RSP back to PE
4500 */
4501void WDA_RemoveStaKeyReqCallback(WDI_Status status, void* pUserData)
4502{
4503 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4504 tWDA_CbContext *pWDA;
4505 tRemoveStaKeyParams *removeStaKeyParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004506 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4507 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004508 if(NULL == pWdaParams)
4509 {
4510 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4511 "%s: pWdaParams received NULL", __FUNCTION__);
4512 VOS_ASSERT(0) ;
4513 return ;
4514 }
4515 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4516 removeStaKeyParams = (tRemoveStaKeyParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004517 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4518 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 removeStaKeyParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004520 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 return ;
4522}
4523
Jeff Johnson295189b2012-06-20 16:38:30 -07004524/*
4525 * FUNCTION: WDA_ProcessRemoveStaKeyReq
4526 * Request to WDI to remove the STA key( key for Unicast frames Encryption)
4527 */
4528VOS_STATUS WDA_ProcessRemoveStaKeyReq(tWDA_CbContext *pWDA,
4529 tRemoveStaKeyParams *removeStaKeyParams )
4530{
4531 WDI_Status status = WDI_STATUS_SUCCESS ;
4532 WDI_RemoveSTAKeyReqParamsType *wdiRemoveStaKeyParam =
4533 (WDI_RemoveSTAKeyReqParamsType *)vos_mem_malloc(
4534 sizeof(WDI_RemoveSTAKeyReqParamsType)) ;
4535 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004536 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4537 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004538 if(NULL == wdiRemoveStaKeyParam)
4539 {
4540 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4541 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4542 VOS_ASSERT(0);
4543 return VOS_STATUS_E_NOMEM;
4544 }
4545 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4546 if(NULL == pWdaParams)
4547 {
4548 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4549 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4550 VOS_ASSERT(0);
4551 vos_mem_free(wdiRemoveStaKeyParam);
4552 return VOS_STATUS_E_NOMEM;
4553 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 /* copy remove STA key params to WDI structure*/
4555 wdiRemoveStaKeyParam->wdiKeyInfo.ucSTAIdx = removeStaKeyParams->staIdx;
4556 wdiRemoveStaKeyParam->wdiKeyInfo.wdiEncType = removeStaKeyParams->encType;
4557 wdiRemoveStaKeyParam->wdiKeyInfo.ucKeyId = removeStaKeyParams->keyId;
4558 wdiRemoveStaKeyParam->wdiKeyInfo.ucUnicast = removeStaKeyParams->unicast;
4559 wdiRemoveStaKeyParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004560 /* Store remove key pointer, as this will be used for response */
4561 /* store Params pass it to WDI */
4562 pWdaParams->pWdaContext = pWDA;
4563 pWdaParams->wdaMsgParam = removeStaKeyParams;
4564 pWdaParams->wdaWdiApiMsgParam = wdiRemoveStaKeyParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004565 status = WDI_RemoveSTAKeyReq(wdiRemoveStaKeyParam,
4566 (WDI_RemoveSTAKeyRspCb)WDA_RemoveStaKeyReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004567 if(IS_WDI_STATUS_FAILURE(status))
4568 {
4569 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4570 "Failure in remove STA Key Req WDI API, free all the memory " );
4571 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
4572 vos_mem_free(pWdaParams) ;
4573 removeStaKeyParams->status = eSIR_FAILURE ;
4574 WDA_SendMsg(pWDA, WDA_REMOVE_STAKEY_RSP, (void *)removeStaKeyParams, 0) ;
4575 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004576 return CONVERT_WDI2VOS_STATUS(status) ;
4577}
Jeff Johnson295189b2012-06-20 16:38:30 -07004578/*
4579 * FUNCTION: WDA_IsHandleSetLinkStateReq
4580 * Update the WDA state and return the status to handle this message or not
4581 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004582WDA_processSetLinkStateStatus WDA_IsHandleSetLinkStateReq(
4583 tWDA_CbContext *pWDA,
4584 tLinkStateParams *linkStateParams)
4585{
4586 WDA_processSetLinkStateStatus status = WDA_PROCESS_SET_LINK_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004587 switch(linkStateParams->state)
4588 {
4589 case eSIR_LINK_PREASSOC_STATE:
4590 case eSIR_LINK_BTAMP_PREASSOC_STATE:
4591 /*
4592 * set the WDA state to PRE ASSOC
4593 * copy the BSSID into pWDA to use it in join request and return,
4594 * No need to handle these messages.
4595 */
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004596 if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->bssid) )
4597 {
4598 vos_mem_copy(pWDA->macBSSID,linkStateParams->bssid,
Jeff Johnson295189b2012-06-20 16:38:30 -07004599 sizeof(tSirMacAddr));
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004600 }
4601 else
4602 {
4603 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
4604 "%s: BSSID in set link state is NULL ", __FUNCTION__);
4605 VOS_ASSERT(0);
4606 }
4607
4608 if( !WDA_IS_NULL_MAC_ADDRESS(linkStateParams->selfMacAddr) )
4609 {
4610 vos_mem_copy(pWDA->macSTASelf,linkStateParams->selfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07004611 sizeof(tSirMacAddr));
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004612 }
4613 else
4614 {
4615 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL,
4616 "%s: self mac address in set link state is NULL ", __FUNCTION__);
4617 VOS_ASSERT(0);
4618 }
4619
Jeff Johnson295189b2012-06-20 16:38:30 -07004620 /* UMAC is issuing the setlink state with PREASSOC twice (before set
4621 *channel and after ) so reset the WDA state to ready when the second
4622 * time UMAC issue the link state with PREASSOC
4623 */
4624 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
4625 {
4626 /* RESET WDA state back to WDA_READY_STATE */
4627 pWDA->wdaState = WDA_READY_STATE;
4628 }
4629 else
4630 {
4631 pWDA->wdaState = WDA_PRE_ASSOC_STATE;
4632 }
4633 //populate linkState info in WDACbCtxt
4634 pWDA->linkState = linkStateParams->state;
4635 status = WDA_IGNORE_SET_LINK_STATE;
4636 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004637 default:
4638 if(pWDA->wdaState != WDA_READY_STATE)
4639 {
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004640 /*If WDA_SET_LINK_STATE is recieved with any other link state apart
4641 *from eSIR_LINK_PREASSOC_STATE and eSIR_LINK_BTAMP_PREASSOC_STATE when
4642 *pWDA->wdaState is in WDA_PRE_ASSOC_STATE(This can happen only in
4643 *error cases) so reset the WDA state to WDA_READY_STATE to avoid
4644 *the ASSERT in WDA_Stop during module unload.*/
4645 if (pWDA->wdaState == WDA_PRE_ASSOC_STATE)
4646 {
4647 pWDA->wdaState = WDA_READY_STATE;
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004648 /* Don't ignore the set link in this case*/
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004649 }
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004650 else
4651 {
4652 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004653 "Set link state called when WDA is not in READY STATE " );
Madan Mohan Koyyalamudi35287862012-10-22 14:52:46 -07004654 status = WDA_IGNORE_SET_LINK_STATE;
4655 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004656 }
4657 break;
4658 }
4659
4660 return status;
4661}
Jeff Johnson295189b2012-06-20 16:38:30 -07004662/*
4663 * FUNCTION: WDA_SetLinkStateCallback
4664 * call back function for set link state from WDI
4665 */
4666void WDA_SetLinkStateCallback(WDI_Status status, void* pUserData)
4667{
4668 tWDA_CbContext *pWDA;
4669 tLinkStateParams *linkStateParams;
4670 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07004671 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4672 "<------ %s " ,__FUNCTION__);
4673 if(NULL == pWdaParams)
4674 {
4675 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4676 "%s: pWdaParams received NULL", __FUNCTION__);
4677 VOS_ASSERT(0) ;
4678 return ;
4679 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004680 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -07004681 linkStateParams = (tLinkStateParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004682 /*
4683 * In STA mode start the BA activity check timer after association
4684 * and in AP mode start BA activity check timer after BSS start */
4685 if( ((linkStateParams->state == eSIR_LINK_POSTASSOC_STATE) &&
4686 status == WDI_STATUS_SUCCESS) || ((status == WDI_STATUS_SUCCESS) &&
4687 (linkStateParams->state == eSIR_LINK_AP_STATE)) )
4688 {
4689 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4690 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004691 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 /*
4693 * No respone required for WDA_SET_LINK_STATE so free the request
4694 * param here
4695 */
4696 if( pWdaParams != NULL )
4697 {
4698 if( pWdaParams->wdaWdiApiMsgParam != NULL )
4699 {
4700 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4701 }
4702 vos_mem_free(pWdaParams);
4703 }
4704 return ;
4705}
Jeff Johnson295189b2012-06-20 16:38:30 -07004706/*
4707 * FUNCTION: WDA_ProcessSetLinkState
4708 * Request to WDI to set the link status.
4709 */
4710VOS_STATUS WDA_ProcessSetLinkState(tWDA_CbContext *pWDA,
4711 tLinkStateParams *linkStateParams)
4712{
4713 WDI_Status status = WDI_STATUS_SUCCESS ;
4714 WDI_SetLinkReqParamsType *wdiSetLinkStateParam =
4715 (WDI_SetLinkReqParamsType *)vos_mem_malloc(
4716 sizeof(WDI_SetLinkReqParamsType)) ;
4717 tWDA_ReqParams *pWdaParams ;
4718 tpAniSirGlobal pMac;
4719 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
4720
4721 if(NULL == pMac)
4722 {
4723 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4724 "%s:pMac is NULL", __FUNCTION__);
4725 VOS_ASSERT(0);
Madan Mohan Koyyalamudi68f53542012-09-24 14:19:32 -07004726 vos_mem_free(wdiSetLinkStateParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07004727 return VOS_STATUS_E_FAILURE;
4728 }
4729
4730 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4731 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004732 if(NULL == wdiSetLinkStateParam)
4733 {
4734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4735 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4736 VOS_ASSERT(0);
4737 return VOS_STATUS_E_NOMEM;
4738 }
4739 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4740 if(NULL == pWdaParams)
4741 {
4742 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4743 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4744 VOS_ASSERT(0);
4745 vos_mem_free(wdiSetLinkStateParam);
4746 return VOS_STATUS_E_NOMEM;
4747 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 if(WDA_IGNORE_SET_LINK_STATE ==
4749 WDA_IsHandleSetLinkStateReq(pWDA,linkStateParams))
4750 {
4751 status = WDI_STATUS_E_FAILURE;
4752 }
4753 else
4754 {
4755 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macBSSID,
4756 linkStateParams->bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004757 vos_mem_copy(wdiSetLinkStateParam->wdiLinkInfo.macSelfStaMacAddr,
4758 linkStateParams->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004759 wdiSetLinkStateParam->wdiLinkInfo.wdiLinkState = linkStateParams->state;
4760 wdiSetLinkStateParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 pWdaParams->pWdaContext = pWDA;
4762 /* Store remove key pointer, as this will be used for response */
4763 pWdaParams->wdaMsgParam = (void *)linkStateParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004764 /* store Params pass it to WDI */
4765 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetLinkStateParam ;
4766 /* Stop Timer only other than GO role and concurrent session */
4767 if( (linkStateParams->state == eSIR_LINK_IDLE_STATE)
4768 && !vos_concurrent_sessions_running() &&
4769 (wdaGetGlobalSystemRole(pMac) != eSYSTEM_AP_ROLE) )
4770 {
4771 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
4772 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004773 status = WDI_SetLinkStateReq(wdiSetLinkStateParam,
4774 (WDI_SetLinkStateRspCb)WDA_SetLinkStateCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004775 if(IS_WDI_STATUS_FAILURE(status))
4776 {
4777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4778 "Failure in set link state Req WDI API, free all the memory " );
4779 }
4780 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004781 if(IS_WDI_STATUS_FAILURE(status))
4782 {
4783 vos_mem_free(wdiSetLinkStateParam) ;
Jeff Johnsone7245742012-09-05 17:12:55 -07004784 WDA_SendMsg(pWDA, WDA_SET_LINK_STATE_RSP, (void *)linkStateParams, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004785 vos_mem_free(pWdaParams);
4786 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004787 return CONVERT_WDI2VOS_STATUS(status) ;
4788}
Jeff Johnson295189b2012-06-20 16:38:30 -07004789/*
4790 * FUNCTION: WDA_GetStatsReqParamsCallback
4791 * send the response to PE with Stats received from WDI
4792 */
4793void WDA_GetStatsReqParamsCallback(
4794 WDI_GetStatsRspParamsType *wdiGetStatsRsp,
4795 void* pUserData)
4796{
4797 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
4798 tAniGetPEStatsRsp *pGetPEStatsRspParams;
4799
4800 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4801 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004802 pGetPEStatsRspParams =
4803 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp) +
4804 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType)));
4805
4806 if(NULL == pGetPEStatsRspParams)
4807 {
4808 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4809 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4810 VOS_ASSERT(0);
4811 return;
4812 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004813 vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
4814 pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
4815 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
4816 (wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
4817 pGetPEStatsRspParams->msgLen = wdiGetStatsRsp->usMsgLen + sizeof(tANI_U8);
4818
4819 //Fill the Session Id Properly in PE
4820 pGetPEStatsRspParams->sessionId = 0;
4821 pGetPEStatsRspParams->rc =
4822 CONVERT_WDI2VOS_STATUS(wdiGetStatsRsp->wdiStatus);
4823 pGetPEStatsRspParams->staId = wdiGetStatsRsp->ucSTAIdx;
4824 pGetPEStatsRspParams->statsMask = wdiGetStatsRsp->uStatsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004825 vos_mem_copy( pGetPEStatsRspParams + 1,
4826 wdiGetStatsRsp + 1,
4827 wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07004828 /* send response to UMAC*/
4829 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
4830
4831 return;
4832}
4833
Jeff Johnson295189b2012-06-20 16:38:30 -07004834/*
4835 * FUNCTION: WDA_ProcessGetStatsReq
4836 * Request to WDI to get the statistics
4837 */
4838VOS_STATUS WDA_ProcessGetStatsReq(tWDA_CbContext *pWDA,
4839 tAniGetPEStatsReq *pGetStatsParams)
4840{
4841 WDI_Status status = WDI_STATUS_SUCCESS ;
4842 WDI_GetStatsReqParamsType wdiGetStatsParam;
4843 tAniGetPEStatsRsp *pGetPEStatsRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004844 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4845 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004846 wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
4847 pGetStatsParams->staId;
4848 wdiGetStatsParam.wdiGetStatsParamsInfo.uStatsMask =
4849 pGetStatsParams->statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004850 wdiGetStatsParam.wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004851 status = WDI_GetStatsReq(&wdiGetStatsParam,
4852 (WDI_GetStatsRspCb)WDA_GetStatsReqParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07004853 if(IS_WDI_STATUS_FAILURE(status))
4854 {
4855 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4856 "Failure in Get Stats Req WDI API, free all the memory " );
4857 pGetPEStatsRspParams =
4858 (tAniGetPEStatsRsp *)vos_mem_malloc(sizeof(tAniGetPEStatsRsp));
4859 if(NULL == pGetPEStatsRspParams)
4860 {
4861 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4862 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4863 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004864 vos_mem_free(pGetStatsParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004865 return VOS_STATUS_E_NOMEM;
4866 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004867 pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
4868 pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
4869 pGetPEStatsRspParams->staId = pGetStatsParams->staId;
4870 pGetPEStatsRspParams->rc = eSIR_FAILURE;
4871 WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
4872 (void *)pGetPEStatsRspParams, 0) ;
4873 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004874 /* Free the request message */
4875 vos_mem_free(pGetStatsParams);
4876 return CONVERT_WDI2VOS_STATUS(status);
4877}
Jeff Johnson295189b2012-06-20 16:38:30 -07004878/*
4879 * FUNCTION: WDA_UpdateEDCAParamCallback
4880 * call back function for Update EDCA params from WDI
4881 */
4882void WDA_UpdateEDCAParamCallback(WDI_Status status, void* pUserData)
4883{
4884 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4885 tEdcaParams *pEdcaParams;
4886
4887 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4888 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004889 if(NULL == pWdaParams)
4890 {
4891 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4892 "%s: pWdaParams received NULL", __FUNCTION__);
4893 VOS_ASSERT(0) ;
4894 return ;
4895 }
4896 pEdcaParams = (tEdcaParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004897 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4898 vos_mem_free(pWdaParams);
4899 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004900 return ;
4901}
Jeff Johnson295189b2012-06-20 16:38:30 -07004902/*
4903 * FUNCTION: WDA_ProcessUpdateEDCAParamReq
4904 * Request to WDI to Update the EDCA params.
4905 */
4906VOS_STATUS WDA_ProcessUpdateEDCAParamReq(tWDA_CbContext *pWDA,
4907 tEdcaParams *pEdcaParams)
4908{
4909 WDI_Status status = WDI_STATUS_SUCCESS ;
4910 WDI_UpdateEDCAParamsType *wdiEdcaParam =
4911 (WDI_UpdateEDCAParamsType *)vos_mem_malloc(
4912 sizeof(WDI_UpdateEDCAParamsType)) ;
4913 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004914 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4915 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004916 if(NULL == wdiEdcaParam)
4917 {
4918 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4919 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4920 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004921 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004922 return VOS_STATUS_E_NOMEM;
4923 }
4924 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
4925 if(NULL == pWdaParams)
4926 {
4927 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4928 "%s: VOS MEM Alloc Failure", __FUNCTION__);
4929 VOS_ASSERT(0);
4930 vos_mem_free(wdiEdcaParam);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07004931 vos_mem_free(pEdcaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004932 return VOS_STATUS_E_NOMEM;
4933 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004934 wdiEdcaParam->wdiEDCAInfo.ucBssIdx = pEdcaParams->bssIdx;
4935 wdiEdcaParam->wdiEDCAInfo.ucEDCAParamsValid = pEdcaParams->highPerformance;
4936 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBEInfo,
4937 &pEdcaParams->acbe);
4938 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaBKInfo,
4939 &pEdcaParams->acbk);
4940 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVIInfo,
4941 &pEdcaParams->acvi);
4942 WDA_UpdateEdcaParamsForAC(pWDA, &wdiEdcaParam->wdiEDCAInfo.wdiEdcaVOInfo,
4943 &pEdcaParams->acvo);
4944 wdiEdcaParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004945 pWdaParams->pWdaContext = pWDA;
4946 /* Store remove key pointer, as this will be used for response */
4947 pWdaParams->wdaMsgParam = (void *)pEdcaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004948 /* store Params pass it to WDI */
4949 pWdaParams->wdaWdiApiMsgParam = (void *)wdiEdcaParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004950 status = WDI_UpdateEDCAParams(wdiEdcaParam,
4951 (WDI_UpdateEDCAParamsRspCb)WDA_UpdateEDCAParamCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 if(IS_WDI_STATUS_FAILURE(status))
4953 {
4954 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4955 "Failure in Update EDCA Params WDI API, free all the memory " );
4956 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4957 vos_mem_free(pWdaParams);
4958 vos_mem_free(pEdcaParams);
4959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004960 return CONVERT_WDI2VOS_STATUS(status) ;
4961}
Jeff Johnson295189b2012-06-20 16:38:30 -07004962/*
4963 * FUNCTION: WDA_AddBAReqCallback
4964 * send ADD BA RSP back to PE
4965 */
4966void WDA_AddBAReqCallback(WDI_AddBARspinfoType *pAddBARspParams,
4967 void* pUserData)
4968{
4969 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
4970 tWDA_CbContext *pWDA;
4971 tAddBAParams *pAddBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07004972 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
4973 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07004974 if(NULL == pWdaParams)
4975 {
4976 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
4977 "%s: pWdaParams received NULL", __FUNCTION__);
4978 VOS_ASSERT(0) ;
4979 return ;
4980 }
4981 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
4982 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07004983 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
4984 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07004985 pAddBAReqParams->status = CONVERT_WDI2SIR_STATUS(pAddBARspParams->wdiStatus) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004986 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07004987 return ;
4988}
4989
Jeff Johnson295189b2012-06-20 16:38:30 -07004990/*
4991 * FUNCTION: WDA_ProcessAddBAReq
4992 * Request to WDI to Update the ADDBA REQ params.
4993 */
4994VOS_STATUS WDA_ProcessAddBAReq(tWDA_CbContext *pWDA, VOS_STATUS status,
4995 tANI_U16 baSessionID, tANI_U8 staIdx, tAddBAParams *pAddBAReqParams)
4996{
Jeff Johnson43971f52012-07-17 12:26:56 -07004997 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07004998 WDI_AddBAReqParamsType *wdiAddBAReqParam =
4999 (WDI_AddBAReqParamsType *)vos_mem_malloc(
5000 sizeof(WDI_AddBAReqParamsType)) ;
5001 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005002 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5003 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 if(NULL == wdiAddBAReqParam)
5005 {
5006 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5007 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5008 VOS_ASSERT(0);
5009 return VOS_STATUS_E_NOMEM;
5010 }
5011 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5012 if(NULL == pWdaParams)
5013 {
5014 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5015 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5016 VOS_ASSERT(0);
5017 vos_mem_free(wdiAddBAReqParam);
5018 return VOS_STATUS_E_NOMEM;
5019 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 do
5021 {
5022 WDI_AddBAReqinfoType *wdiAddBaInfo = &wdiAddBAReqParam->wdiBAInfoType ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005023 wdiAddBaInfo->ucSTAIdx = staIdx ;
5024 wdiAddBaInfo->ucBaSessionID = baSessionID ;
5025 wdiAddBaInfo->ucWinSize = WDA_BA_MAX_WINSIZE ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005026 } while(0) ;
5027 wdiAddBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005028 pWdaParams->pWdaContext = pWDA;
5029 /* store Params pass it to WDI */
5030 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBAReqParam ;
5031 pWdaParams->wdaMsgParam = pAddBAReqParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07005032 wstatus = WDI_AddBAReq(wdiAddBAReqParam,
5033 (WDI_AddBARspCb)WDA_AddBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005034
Jeff Johnson43971f52012-07-17 12:26:56 -07005035 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07005036 {
5037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson43971f52012-07-17 12:26:56 -07005038 "Failure in ADD BA REQ Params WDI API, free all the memory" );
5039 status = CONVERT_WDI2VOS_STATUS(wstatus);
5040 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07005041 vos_mem_free(pWdaParams);
5042 pAddBAReqParams->status = eSIR_FAILURE;
5043 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5044 }
Jeff Johnson43971f52012-07-17 12:26:56 -07005045 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07005046}
Jeff Johnson295189b2012-06-20 16:38:30 -07005047/*
5048 * FUNCTION: WDA_AddBASessionReqCallback
5049 * send ADD BA SESSION RSP back to PE/(or TL)
5050 */
5051void WDA_AddBASessionReqCallback(
5052 WDI_AddBASessionRspParamsType *wdiAddBaSession, void* pUserData)
5053{
5054 VOS_STATUS status = VOS_STATUS_SUCCESS ;
5055 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5056 tWDA_CbContext *pWDA;
5057 tAddBAParams *pAddBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005058 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5059 "<------ %s " ,__FUNCTION__);
5060 if(NULL == pWdaParams)
5061 {
5062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5063 "%s: pWdaParams received NULL", __FUNCTION__);
5064 VOS_ASSERT(0) ;
5065 return ;
5066 }
5067 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5068 pAddBAReqParams = (tAddBAParams *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005069 if( NULL == pAddBAReqParams )
5070 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005071 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5072 "%s: pAddBAReqParams received NULL " ,__FUNCTION__);
5073 VOS_ASSERT( 0 );
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07005074 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5075 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005076 return ;
5077 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5079 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005080 /*
5081 * if WDA in update TL state, update TL with BA session parama and send
5082 * another request to HAL(/WDI) (ADD_BA_REQ)
5083 */
5084
5085 if((VOS_STATUS_SUCCESS ==
5086 CONVERT_WDI2VOS_STATUS(wdiAddBaSession->wdiStatus)) &&
5087 (WDA_BA_UPDATE_TL_STATE == pWDA->wdaState))
5088 {
5089 /* Update TL with BA info received from HAL/WDI */
5090 status = WDA_TL_BA_SESSION_ADD(pWDA->pVosContext,
5091 wdiAddBaSession->usBaSessionID,
5092 wdiAddBaSession->ucSTAIdx,
5093 wdiAddBaSession->ucBaTID,
5094 wdiAddBaSession->ucBaBufferSize,
5095 wdiAddBaSession->ucWinSize,
5096 wdiAddBaSession->usBaSSN );
Jeff Johnson295189b2012-06-20 16:38:30 -07005097 WDA_ProcessAddBAReq(pWDA, status, wdiAddBaSession->usBaSessionID,
5098 wdiAddBaSession->ucSTAIdx, pAddBAReqParams) ;
5099 }
5100 else
5101 {
5102 pAddBAReqParams->status =
5103 CONVERT_WDI2SIR_STATUS(wdiAddBaSession->wdiStatus) ;
5104
5105 /* Setting Flag to indicate that Set BA is success */
5106 if(WDI_STATUS_SUCCESS == wdiAddBaSession->wdiStatus)
5107 {
5108 tANI_U16 curSta = wdiAddBaSession->ucSTAIdx;
5109 tANI_U8 tid = wdiAddBaSession->ucBaTID;
5110 WDA_SET_BA_TXFLAG(pWDA, curSta, tid) ;
5111 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005112 WDA_SendMsg(pWDA, WDA_ADDBA_RSP, (void *)pAddBAReqParams , 0) ;
5113 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005114 /*Reset the WDA state to READY */
5115 pWDA->wdaState = WDA_READY_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 return ;
5117}
5118
Jeff Johnson295189b2012-06-20 16:38:30 -07005119/*
5120 * FUNCTION: WDA_ProcessAddBASessionReq
5121 * Request to WDI to Update the ADDBA REQ params.
5122 */
5123VOS_STATUS WDA_ProcessAddBASessionReq(tWDA_CbContext *pWDA,
5124 tAddBAParams *pAddBAReqParams)
5125{
5126 WDI_Status status = WDI_STATUS_SUCCESS ;
5127 WDI_AddBASessionReqParamsType *wdiAddBASessionReqParam =
5128 (WDI_AddBASessionReqParamsType *)vos_mem_malloc(
5129 sizeof(WDI_AddBASessionReqParamsType)) ;
5130 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005131 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5132 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005133 if(NULL == wdiAddBASessionReqParam)
5134 {
5135 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5136 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5137 VOS_ASSERT(0);
5138 return VOS_STATUS_E_NOMEM;
5139 }
5140 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5141 if(NULL == pWdaParams)
5142 {
5143 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5144 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5145 VOS_ASSERT(0);
5146 vos_mem_free(wdiAddBASessionReqParam);
5147 return VOS_STATUS_E_NOMEM;
5148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005149 /*
5150 * Populate ADD BA parameters and pass these paarmeters to WDI.
5151 * ADD BA SESSION REQ will update HAL with BA params, WDA, will changes
5152 * the state to track if these is BA recipient case or BA initiator
5153 * case.
5154 */
5155 do
5156 {
5157 WDI_AddBASessionReqinfoType *wdiBAInfoType =
5158 &wdiAddBASessionReqParam->wdiBASessionInfoType ;
5159 /* vos_mem_copy(wdiBAInfoType->macBSSID,
5160 pAddBAReqParams->bssId, sizeof(tSirMacAddr));*/
5161 wdiBAInfoType->ucSTAIdx = pAddBAReqParams->staIdx;
5162 vos_mem_copy(wdiBAInfoType->macPeerAddr,
5163 pAddBAReqParams->peerMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005164 wdiBAInfoType->ucBaTID = pAddBAReqParams->baTID;
Jeff Johnson295189b2012-06-20 16:38:30 -07005165 wdiBAInfoType->ucBaPolicy = pAddBAReqParams->baPolicy;
5166 wdiBAInfoType->usBaBufferSize = pAddBAReqParams->baBufferSize;
5167 wdiBAInfoType->usBaTimeout = pAddBAReqParams->baTimeout;
5168 wdiBAInfoType->usBaSSN = pAddBAReqParams->baSSN;
5169 wdiBAInfoType->ucBaDirection = pAddBAReqParams->baDirection;
Jeff Johnson295189b2012-06-20 16:38:30 -07005170 /* check the BA direction and update state accordingly */
5171 (eBA_RECIPIENT == wdiBAInfoType->ucBaDirection)
5172 ? (pWDA->wdaState = WDA_BA_UPDATE_TL_STATE)
5173 : (pWDA->wdaState = WDA_BA_UPDATE_LIM_STATE);
5174
5175 }while(0) ;
5176 wdiAddBASessionReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005177 pWdaParams->pWdaContext = pWDA;
5178 /* Store ADD BA pointer, as this will be used for response */
5179 pWdaParams->wdaMsgParam = (void *)pAddBAReqParams ;
5180 /* store Params pass it to WDI */
5181 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddBASessionReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005182 status = WDI_AddBASessionReq(wdiAddBASessionReqParam,
5183 (WDI_AddBASessionRspCb)WDA_AddBASessionReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005184 if(IS_WDI_STATUS_FAILURE(status))
5185 {
5186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5187 "Failure in ADD BA Session REQ Params WDI API, free all the memory " );
5188 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5189 vos_mem_free(pWdaParams->wdaMsgParam);
5190 vos_mem_free(pWdaParams);
5191 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005192 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005193}
Jeff Johnson295189b2012-06-20 16:38:30 -07005194/*
5195 * FUNCTION: WDA_DelBANotifyTL
5196 * send DEL BA IND to TL
5197 */
5198void WDA_DelBANotifyTL(tWDA_CbContext *pWDA,
5199 tDelBAParams *pDelBAReqParams)
5200{
5201 tpDelBAInd pDelBAInd = (tpDelBAInd)vos_mem_malloc(sizeof( tDelBAInd ));
5202 //tSirMsgQ msg;
5203 vos_msg_t vosMsg;
5204 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005205 if(NULL == pDelBAInd)
5206 {
5207 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5208 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5209 VOS_ASSERT(0) ;
5210 return;
5211 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005212 pDelBAInd->mesgType = WDA_DELETEBA_IND;
5213 pDelBAInd->staIdx = (tANI_U8) pDelBAReqParams->staIdx;
5214 pDelBAInd->baTID = (tANI_U8) pDelBAReqParams->baTID;
5215 pDelBAInd->mesgLen = sizeof( tDelBAInd );
Jeff Johnsone7245742012-09-05 17:12:55 -07005216
Jeff Johnson295189b2012-06-20 16:38:30 -07005217
5218 vosMsg.type = WDA_DELETEBA_IND;
5219 vosMsg.bodyptr = pDelBAInd;
5220 vosStatus = vos_mq_post_message(VOS_MQ_ID_TL, &vosMsg);
5221 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
5222 {
5223 vosStatus = VOS_STATUS_E_BADMSG;
5224 }
5225}
Jeff Johnson295189b2012-06-20 16:38:30 -07005226/*
5227 * FUNCTION: WDA_DelBAReqCallback
5228 * send DEL BA RSP back to PE
5229 */
5230void WDA_DelBAReqCallback(WDI_Status status, void* pUserData)
5231{
5232 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5233 tWDA_CbContext *pWDA;
5234 tDelBAParams *pDelBAReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07005235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5236 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005237 if(NULL == pWdaParams)
5238 {
5239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5240 "%s: pWdaParams received NULL", __FUNCTION__);
5241 VOS_ASSERT(0) ;
5242 return ;
5243 }
5244 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
5245 pDelBAReqParams = (tDelBAParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005246 /* Notify TL about DEL BA in case of recipinet */
5247 if((VOS_STATUS_SUCCESS == CONVERT_WDI2VOS_STATUS(status)) &&
5248 (eBA_RECIPIENT == pDelBAReqParams->baDirection))
5249 {
5250 WDA_DelBANotifyTL(pWDA, pDelBAReqParams);
5251 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005252 /*
5253 * No respone required for WDA_DELBA_IND so just free the request
5254 * param here
5255 */
5256 vos_mem_free(pDelBAReqParams);
5257 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5258 vos_mem_free(pWdaParams);
5259 return ;
5260}
5261
Jeff Johnson295189b2012-06-20 16:38:30 -07005262/*
5263 * FUNCTION: WDA_ProcessDelBAReq
5264 * Request to WDI to Update the DELBA REQ params.
5265 */
5266VOS_STATUS WDA_ProcessDelBAReq(tWDA_CbContext *pWDA,
5267 tDelBAParams *pDelBAReqParams)
5268{
5269 WDI_Status status = WDI_STATUS_SUCCESS ;
5270 WDI_DelBAReqParamsType *wdiDelBAReqParam =
5271 (WDI_DelBAReqParamsType *)vos_mem_malloc(
5272 sizeof(WDI_DelBAReqParamsType)) ;
5273 tWDA_ReqParams *pWdaParams ;
5274 tANI_U16 staIdx = 0;
5275 tANI_U8 tid = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5277 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005278 if(NULL == wdiDelBAReqParam)
5279 {
5280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5281 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5282 VOS_ASSERT(0);
5283 return VOS_STATUS_E_NOMEM;
5284 }
5285 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5286 if(NULL == pWdaParams)
5287 {
5288 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5289 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5290 VOS_ASSERT(0);
5291 vos_mem_free(wdiDelBAReqParam);
5292 return VOS_STATUS_E_NOMEM;
5293 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005294 wdiDelBAReqParam->wdiBAInfo.ucSTAIdx = pDelBAReqParams->staIdx;
5295 wdiDelBAReqParam->wdiBAInfo.ucBaTID = pDelBAReqParams->baTID;
5296 wdiDelBAReqParam->wdiBAInfo.ucBaDirection = pDelBAReqParams->baDirection;
5297 wdiDelBAReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005298 pWdaParams->pWdaContext = pWDA;
5299 /* Store DEL BA pointer, as this will be used for response */
5300 pWdaParams->wdaMsgParam = (void *)pDelBAReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005301 /* store Params pass it to WDI */
5302 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelBAReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005303 /* if BA exchange over the air is failed, clear this tid in BaBitmap
5304 * maintained in WDA, so that WDA can retry for another BA session
5305 */
5306 staIdx = pDelBAReqParams->staIdx;
5307 tid = pDelBAReqParams->baTID;
5308 WDA_CLEAR_BA_TXFLAG(pWDA, staIdx, tid);
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 status = WDI_DelBAReq(wdiDelBAReqParam,
5310 (WDI_DelBARspCb)WDA_DelBAReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005311 if(IS_WDI_STATUS_FAILURE(status))
5312 {
5313 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5314 "Failure in DEL BA REQ Params WDI API, free all the memory " );
5315 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5316 vos_mem_free(pWdaParams->wdaMsgParam);
5317 vos_mem_free(pWdaParams);
5318 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005319 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005320}
Jeff Johnson295189b2012-06-20 16:38:30 -07005321/*
5322 * FUNCTION: WDA_AddTSReqCallback
5323 * send ADD TS RSP back to PE
5324 */
5325void WDA_AddTSReqCallback(WDI_Status status, void* pUserData)
5326{
5327 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5328 tWDA_CbContext *pWDA;
5329 tAddTsParams *pAddTsReqParams;
5330
5331 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5332 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005333 if(NULL == pWdaParams)
5334 {
5335 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5336 "%s: pWdaParams received NULL", __FUNCTION__);
5337 VOS_ASSERT(0) ;
5338 return ;
5339 }
5340 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5341 pAddTsReqParams = (tAddTsParams *)pWdaParams->wdaMsgParam ;
5342 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5343 vos_mem_free(pWdaParams);
5344
5345 pAddTsReqParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005346 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005347 return ;
5348}
5349
Jeff Johnson295189b2012-06-20 16:38:30 -07005350/*
5351 * FUNCTION: WDA_ProcessAddTSReq
5352 * Request to WDI to Update the ADD TS REQ params.
5353 */
5354VOS_STATUS WDA_ProcessAddTSReq(tWDA_CbContext *pWDA,
5355 tAddTsParams *pAddTsReqParams)
5356{
5357 WDI_Status status = WDI_STATUS_SUCCESS ;
5358 WDI_AddTSReqParamsType *wdiAddTSReqParam =
5359 (WDI_AddTSReqParamsType *)vos_mem_malloc(
5360 sizeof(WDI_AddTSReqParamsType)) ;
5361 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005362 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5363 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005364 if(NULL == wdiAddTSReqParam)
5365 {
5366 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5367 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5368 VOS_ASSERT(0);
5369 return VOS_STATUS_E_NOMEM;
5370 }
5371 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5372 if(NULL == pWdaParams)
5373 {
5374 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5375 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5376 VOS_ASSERT(0);
5377 vos_mem_free(wdiAddTSReqParam);
5378 return VOS_STATUS_E_NOMEM;
5379 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005380 wdiAddTSReqParam->wdiTsInfo.ucSTAIdx = pAddTsReqParams->staIdx;
5381 wdiAddTSReqParam->wdiTsInfo.ucTspecIdx = pAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07005382 //TS IE
5383 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucType = pAddTsReqParams->tspec.type;
5384 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.ucLength =
5385 pAddTsReqParams->tspec.length;
5386
5387 //TS IE : TS INFO : TRAFFIC
5388 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.ackPolicy =
5389 pAddTsReqParams->tspec.tsinfo.traffic.ackPolicy;
5390 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.userPrio =
5391 pAddTsReqParams->tspec.tsinfo.traffic.userPrio;
5392 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.psb =
5393 pAddTsReqParams->tspec.tsinfo.traffic.psb;
5394 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.aggregation =
5395 pAddTsReqParams->tspec.tsinfo.traffic.aggregation;
5396 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.accessPolicy =
5397 pAddTsReqParams->tspec.tsinfo.traffic.accessPolicy;
5398 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.direction =
5399 pAddTsReqParams->tspec.tsinfo.traffic.direction;
5400 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.tsid =
5401 pAddTsReqParams->tspec.tsinfo.traffic.tsid;
5402 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiTraffic.trafficType =
5403 pAddTsReqParams->tspec.tsinfo.traffic.trafficType;
5404
5405 //TS IE : TS INFO : SCHEDULE
5406 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.schedule =
5407 pAddTsReqParams->tspec.tsinfo.schedule.schedule;
5408 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.wdiTSinfo.wdiSchedule.rsvd =
5409 pAddTsReqParams->tspec.tsinfo.schedule.rsvd;
Jeff Johnson295189b2012-06-20 16:38:30 -07005410 //TS IE
5411 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usNomMsduSz =
5412 pAddTsReqParams->tspec.nomMsduSz;
5413 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMaxMsduSz =
5414 pAddTsReqParams->tspec.maxMsduSz;
5415 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinSvcInterval =
5416 pAddTsReqParams->tspec.minSvcInterval;
5417 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxSvcInterval =
5418 pAddTsReqParams->tspec.maxSvcInterval;
5419 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uInactInterval =
5420 pAddTsReqParams->tspec.inactInterval;
5421 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSuspendInterval =
5422 pAddTsReqParams->tspec.suspendInterval;
5423 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uSvcStartTime =
5424 pAddTsReqParams->tspec.svcStartTime;
5425 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinDataRate =
5426 pAddTsReqParams->tspec.minDataRate;
5427 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMeanDataRate =
5428 pAddTsReqParams->tspec.meanDataRate;
5429 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uPeakDataRate =
5430 pAddTsReqParams->tspec.peakDataRate;
5431 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMaxBurstSz =
5432 pAddTsReqParams->tspec.maxBurstSz;
5433 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uDelayBound =
5434 pAddTsReqParams->tspec.delayBound;
5435 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.uMinPhyRate =
5436 pAddTsReqParams->tspec.minPhyRate;
5437 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usSurplusBw =
5438 pAddTsReqParams->tspec.surplusBw;
5439 wdiAddTSReqParam->wdiTsInfo.wdiTspecIE.usMediumTime =
5440 pAddTsReqParams->tspec.mediumTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 /* TODO: tAddTsParams doesn't have the following fields */
5442#if 0
5443 wdiAddTSReqParam->wdiTsInfo.ucUapsdFlags =
5444 wdiAddTSReqParam->wdiTsInfo.ucServiceInterval =
5445 wdiAddTSReqParam->wdiTsInfo.ucSuspendInterval =
5446 wdiAddTSReqParam->wdiTsInfo.ucDelayedInterval =
5447#endif
5448 wdiAddTSReqParam->wdiReqStatusCB = NULL ;
5449
5450 pWdaParams->pWdaContext = pWDA;
5451 /* Store ADD TS pointer, as this will be used for response */
5452 pWdaParams->wdaMsgParam = (void *)pAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005453 /* store Params pass it to WDI */
5454 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAddTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005455 status = WDI_AddTSReq(wdiAddTSReqParam,
5456 (WDI_AddTsRspCb)WDA_AddTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005457 if(IS_WDI_STATUS_FAILURE(status))
5458 {
5459 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5460 "Failure in ADD TS REQ Params WDI API, free all the memory " );
5461 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5462 vos_mem_free(pWdaParams);
5463 pAddTsReqParams->status = eSIR_FAILURE ;
5464 WDA_SendMsg(pWDA, WDA_ADD_TS_RSP, (void *)pAddTsReqParams , 0) ;
5465 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005467}
5468
Jeff Johnson295189b2012-06-20 16:38:30 -07005469/*
5470 * FUNCTION: WDA_DelTSReqCallback
5471 * send DEL TS RSP back to PE
5472 */
5473void WDA_DelTSReqCallback(WDI_Status status, void* pUserData)
5474{
5475 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005476 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5477 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005478 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5479 vos_mem_free(pWdaParams->wdaMsgParam) ;
5480 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005481 /*
5482 * No respone required for WDA_DEL_TS_REQ so just free the request
5483 * param here
5484 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005485 return ;
5486}
5487
Jeff Johnson295189b2012-06-20 16:38:30 -07005488/*
5489 * FUNCTION: WDA_ProcessDelTSReq
5490 * Request to WDI to Update the DELTS REQ params.
5491 */
5492VOS_STATUS WDA_ProcessDelTSReq(tWDA_CbContext *pWDA,
5493 tDelTsParams *pDelTSReqParams)
5494{
5495 WDI_Status status = WDI_STATUS_SUCCESS ;
5496 WDI_DelTSReqParamsType *wdiDelTSReqParam =
5497 (WDI_DelTSReqParamsType *)vos_mem_malloc(
5498 sizeof(WDI_DelTSReqParamsType)) ;
5499 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005500 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5501 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005502 if(NULL == wdiDelTSReqParam)
5503 {
5504 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5505 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5506 VOS_ASSERT(0);
5507 return VOS_STATUS_E_NOMEM;
5508 }
5509 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5510 if(NULL == pWdaParams)
5511 {
5512 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5513 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5514 VOS_ASSERT(0);
5515 vos_mem_free(wdiDelTSReqParam);
5516 return VOS_STATUS_E_NOMEM;
5517 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005518 vos_mem_copy(wdiDelTSReqParam->wdiDelTSInfo.macBSSID,
5519 pDelTSReqParams->bssId, sizeof(tSirMacAddr));
5520 wdiDelTSReqParam->wdiDelTSInfo.ucSTAIdx = pDelTSReqParams->staIdx;
5521 wdiDelTSReqParam->wdiDelTSInfo.ucTspecIdx = pDelTSReqParams->tspecIdx;
5522 wdiDelTSReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005523 pWdaParams->pWdaContext = pWDA;
5524 /* Store DEL TS pointer, as this will be used for response */
5525 pWdaParams->wdaMsgParam = (void *)pDelTSReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005526 /* store Params pass it to WDI */
5527 pWdaParams->wdaWdiApiMsgParam = (void *)wdiDelTSReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005528 status = WDI_DelTSReq(wdiDelTSReqParam,
5529 (WDI_DelTsRspCb)WDA_DelTSReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005530 if(IS_WDI_STATUS_FAILURE(status))
5531 {
5532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5533 "Failure in DEL TS REQ Params WDI API, free all the memory " );
5534 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5535 vos_mem_free(pWdaParams->wdaMsgParam);
5536 vos_mem_free(pWdaParams);
5537 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005538 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005539}
Jeff Johnson295189b2012-06-20 16:38:30 -07005540/*
5541 * FUNCTION: WDA_UpdateBeaconParamsCallback
5542 * Free the memory. No need to send any response to PE in this case
5543 */
5544void WDA_UpdateBeaconParamsCallback(WDI_Status status, void* pUserData)
5545{
5546 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07005547 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5548 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005549 if(NULL == pWdaParams)
5550 {
5551 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5552 "%s: pWdaParams received NULL", __FUNCTION__);
5553 VOS_ASSERT(0) ;
5554 return ;
5555 }
5556 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5557 vos_mem_free(pWdaParams->wdaMsgParam) ;
5558 vos_mem_free(pWdaParams);
5559 /*
5560 * No respone required for WDA_UPDATE_BEACON_IND so just free the request
5561 * param here
5562 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005563 return ;
5564}
Jeff Johnson295189b2012-06-20 16:38:30 -07005565/*
5566 * FUNCTION: WDA_ProcessUpdateBeaconParams
5567 * Request to WDI to send the beacon parameters to HAL to update the Hardware
5568 */
5569VOS_STATUS WDA_ProcessUpdateBeaconParams(tWDA_CbContext *pWDA,
5570 tUpdateBeaconParams *pUpdateBeaconParams)
5571{
5572 WDI_Status status = WDI_STATUS_SUCCESS ;
5573 WDI_UpdateBeaconParamsType *wdiUpdateBeaconParams =
5574 (WDI_UpdateBeaconParamsType *)vos_mem_malloc(
5575 sizeof(WDI_UpdateBeaconParamsType)) ;
5576 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005577 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5578 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005579 if(NULL == wdiUpdateBeaconParams)
5580 {
5581 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5582 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5583 VOS_ASSERT(0);
5584 return VOS_STATUS_E_NOMEM;
5585 }
5586 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5587 if(NULL == pWdaParams)
5588 {
5589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5590 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5591 VOS_ASSERT(0);
5592 vos_mem_free(wdiUpdateBeaconParams);
5593 return VOS_STATUS_E_NOMEM;
5594 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005595 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucBssIdx =
5596 pUpdateBeaconParams->bssIdx;
5597 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortPreamble =
5598 pUpdateBeaconParams->fShortPreamble;
5599 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfShortSlotTime =
5600 pUpdateBeaconParams->fShortSlotTime;
5601 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usBeaconInterval =
5602 pUpdateBeaconParams->beaconInterval;
5603 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllaCoexist =
5604 pUpdateBeaconParams->llaCoexist;
5605 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllbCoexist =
5606 pUpdateBeaconParams->llbCoexist;
5607 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllgCoexist =
5608 pUpdateBeaconParams->llgCoexist;
5609 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucHt20MhzCoexist=
5610 pUpdateBeaconParams->ht20MhzCoexist;
5611 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucllnNonGFCoexist =
5612 pUpdateBeaconParams->llnNonGFCoexist;
5613 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfLsigTXOPProtectionFullSupport =
5614 pUpdateBeaconParams->fLsigTXOPProtectionFullSupport;
5615 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.ucfRIFSMode =
5616 pUpdateBeaconParams->fRIFSMode;
5617 wdiUpdateBeaconParams->wdiUpdateBeaconParamsInfo.usChangeBitmap =
5618 pUpdateBeaconParams->paramChangeBitmap;
5619 wdiUpdateBeaconParams->wdiReqStatusCB = NULL ;
5620
5621 pWdaParams->pWdaContext = pWDA;
5622 /* Store UpdateBeacon Req pointer, as this will be used for response */
5623 pWdaParams->wdaMsgParam = (void *)pUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005624 /* store Params pass it to WDI */
5625 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateBeaconParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005626 status = WDI_UpdateBeaconParamsReq(wdiUpdateBeaconParams,
5627 (WDI_UpdateBeaconParamsRspCb)WDA_UpdateBeaconParamsCallback,
5628 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005629 if(IS_WDI_STATUS_FAILURE(status))
5630 {
5631 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5632 "Failure in UPDATE BEACON REQ Params WDI API, free all the memory " );
5633 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5634 vos_mem_free(pWdaParams->wdaMsgParam);
5635 vos_mem_free(pWdaParams);
5636 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005637 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005638}
Jeff Johnson295189b2012-06-20 16:38:30 -07005639#ifdef FEATURE_WLAN_CCX
Jeff Johnson295189b2012-06-20 16:38:30 -07005640/*
5641 * FUNCTION: WDA_TSMStatsReqCallback
5642 * send TSM Stats RSP back to PE
5643 */
5644void WDA_TSMStatsReqCallback(WDI_TSMStatsRspParamsType *pwdiTSMStatsRspParams, void* pUserData)
5645{
5646 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5647 tWDA_CbContext *pWDA = NULL;
5648 tTSMStats *pTsmRspParams = NULL;
5649
5650 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5651 "<------ Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005652 if(NULL == pWdaParams)
5653 {
5654 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5655 "%s: pWdaParams received NULL", __FUNCTION__);
5656 VOS_ASSERT(0) ;
5657 return ;
5658 }
5659 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5660 pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005661 if( NULL == pTsmRspParams )
5662 {
5663 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5664 "%s: pTsmRspParams received NULL " ,__FUNCTION__);
5665 VOS_ASSERT( 0 );
5666 return ;
5667 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005668 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5669 vos_mem_free(pWdaParams);
5670
5671 pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
5672 vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
5673 pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
5674 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist)/
5675 sizeof(pwdiTSMStatsRspParams->UplinkPktQueueDlyHist[0]));
5676 pTsmRspParams->tsmMetrics.UplinkPktTxDly = pwdiTSMStatsRspParams->UplinkPktTxDly;
5677 pTsmRspParams->tsmMetrics.UplinkPktLoss = pwdiTSMStatsRspParams->UplinkPktLoss;
5678 pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
5679 pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
5680 pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
Jeff Johnson295189b2012-06-20 16:38:30 -07005681 WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005682 return ;
5683}
5684
5685
Jeff Johnson295189b2012-06-20 16:38:30 -07005686/*
5687 * FUNCTION: WDA_ProcessTsmStatsReq
5688 * Request to WDI to get the TSM Stats params.
5689 */
5690VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
5691 tTSMStats *pTsmStats)
5692{
5693 WDI_Status status = WDI_STATUS_SUCCESS ;
5694 WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
5695 tWDA_ReqParams *pWdaParams = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07005696 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5697 "------> Entering: %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005698 if((NULL != pWDA->wdaMsgParam) || (NULL != pWDA->wdaWdiApiMsgParam))
5699 {
5700 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5701 "%s: wdaMsgParam or wdaWdiApiMsgParam is not NULL", __FUNCTION__);
5702 VOS_ASSERT(0);
5703 return VOS_STATUS_E_FAILURE;
5704 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005705 wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
5706 sizeof(WDI_TSMStatsReqParamsType));
5707 if(NULL == wdiTSMReqParam)
5708 {
5709 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5710 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5711 VOS_ASSERT(0);
5712 return VOS_STATUS_E_NOMEM;
5713 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005714 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5715 if(NULL == pWdaParams)
5716 {
5717 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5718 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5719 VOS_ASSERT(0);
5720 vos_mem_free(wdiTSMReqParam);
5721 return VOS_STATUS_E_NOMEM;
5722 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005723 wdiTSMReqParam->wdiTsmStatsParamsInfo.ucTid = pTsmStats->tid;
5724 vos_mem_copy(wdiTSMReqParam->wdiTsmStatsParamsInfo.bssid,
5725 pTsmStats->bssId,
5726 sizeof(wpt_macAddr));
5727 wdiTSMReqParam->wdiReqStatusCB = NULL ;
5728
5729 pWdaParams->pWdaContext = pWDA;
5730 /* Store TSM Stats pointer, as this will be used for response */
5731 pWdaParams->wdaMsgParam = (void *)pTsmStats ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005732 /* store Params pass it to WDI */
5733 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005734 status = WDI_TSMStatsReq(wdiTSMReqParam,
5735 (WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005736 if(IS_WDI_STATUS_FAILURE(status))
5737 {
5738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5739 "Failure in TSM STATS REQ Params WDI API, free all the memory " );
5740 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5741 vos_mem_free(pWdaParams) ;
5742 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005743 return CONVERT_WDI2VOS_STATUS(status) ;
5744}
5745#endif
5746/*
5747 * FUNCTION: WDA_SendBeaconParamsCallback
5748 * No need to send any response to PE in this case
5749 */
5750void WDA_SendBeaconParamsCallback(WDI_Status status, void* pUserData)
5751{
5752
Jeff Johnson295189b2012-06-20 16:38:30 -07005753 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5754 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005755 return ;
5756}
Jeff Johnson295189b2012-06-20 16:38:30 -07005757/*
5758 * FUNCTION: WDA_ProcessSendBeacon
5759 * Request to WDI to send the beacon template to HAL to update the TPE memory and
5760 * start beacon trasmission
5761 */
5762VOS_STATUS WDA_ProcessSendBeacon(tWDA_CbContext *pWDA,
5763 tSendbeaconParams *pSendbeaconParams)
5764{
5765 WDI_Status status = WDI_STATUS_SUCCESS ;
5766 WDI_SendBeaconParamsType wdiSendBeaconReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07005767 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5768 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005769 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.macBSSID,
5770 pSendbeaconParams->bssId, sizeof(tSirMacAddr));
5771 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beaconLength =
5772 pSendbeaconParams->beaconLength;
5773#ifdef WLAN_SOFTAP_FEATURE
5774 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.timIeOffset =
5775 pSendbeaconParams->timIeOffset;
5776#endif
5777#ifdef WLAN_FEATURE_P2P
5778 wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.usP2PIeOffset =
5779 pSendbeaconParams->p2pIeOffset;
5780#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005781 /* Copy the beacon template to local buffer */
5782 vos_mem_copy(wdiSendBeaconReqParam.wdiSendBeaconParamsInfo.beacon,
5783 pSendbeaconParams->beacon, pSendbeaconParams->beaconLength);
5784 wdiSendBeaconReqParam.wdiReqStatusCB = NULL ;
5785
Jeff Johnson295189b2012-06-20 16:38:30 -07005786 status = WDI_SendBeaconParamsReq(&wdiSendBeaconReqParam,
5787 (WDI_SendBeaconParamsRspCb)WDA_SendBeaconParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005788 if(IS_WDI_STATUS_FAILURE(status))
5789 {
5790 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5791 "Failure in SEND BEACON REQ Params WDI API" );
5792 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005793 vos_mem_free(pSendbeaconParams);
5794 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005795}
Jeff Johnson295189b2012-06-20 16:38:30 -07005796/*
5797 * FUNCTION: WDA_UpdateProbeRspParamsCallback
5798 * No need to send any response to PE in this case
5799 */
5800void WDA_UpdateProbeRspParamsCallback(WDI_Status status, void* pUserData)
5801{
Jeff Johnson295189b2012-06-20 16:38:30 -07005802 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5803 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07005804 return ;
5805}
5806
Jeff Johnson295189b2012-06-20 16:38:30 -07005807/*
5808 * FUNCTION: WDA_ProcessUpdateProbeRspTemplate
5809 * Request to WDI to send the probe response template to HAL to update the TPE memory and
5810 * send probe response
5811 */
5812VOS_STATUS WDA_ProcessUpdateProbeRspTemplate(tWDA_CbContext *pWDA,
5813 tSendProbeRespParams *pSendProbeRspParams)
5814{
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005815 WDI_Status status = WDI_STATUS_SUCCESS;
5816 WDI_UpdateProbeRspTemplateParamsType *wdiSendProbeRspParam =
5817 vos_mem_malloc(sizeof(WDI_UpdateProbeRspTemplateParamsType));
Jeff Johnson295189b2012-06-20 16:38:30 -07005818 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5819 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005820
5821 if (!wdiSendProbeRspParam)
5822 return CONVERT_WDI2VOS_STATUS(WDI_STATUS_MEM_FAILURE);
5823
Jeff Johnson295189b2012-06-20 16:38:30 -07005824 /*Copy update probe response parameters*/
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005825 vos_mem_copy(wdiSendProbeRspParam->wdiProbeRspTemplateInfo.macBSSID,
Jeff Johnson295189b2012-06-20 16:38:30 -07005826 pSendProbeRspParams->bssId, sizeof(tSirMacAddr));
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005827 wdiSendProbeRspParam->wdiProbeRspTemplateInfo.uProbeRespTemplateLen =
Jeff Johnson295189b2012-06-20 16:38:30 -07005828 pSendProbeRspParams->probeRespTemplateLen;
Jeff Johnson295189b2012-06-20 16:38:30 -07005829 /* Copy the Probe Response template to local buffer */
5830 vos_mem_copy(
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005831 wdiSendProbeRspParam->wdiProbeRspTemplateInfo.pProbeRespTemplate,
Jeff Johnson295189b2012-06-20 16:38:30 -07005832 pSendProbeRspParams->pProbeRespTemplate,
5833 pSendProbeRspParams->probeRespTemplateLen);
5834 vos_mem_copy(
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005835 wdiSendProbeRspParam->wdiProbeRspTemplateInfo.uaProxyProbeReqValidIEBmap,
Jeff Johnson295189b2012-06-20 16:38:30 -07005836 pSendProbeRspParams->ucProxyProbeReqValidIEBmap,
5837 WDI_PROBE_REQ_BITMAP_IE_LEN);
5838
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005839 wdiSendProbeRspParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005840
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005841 status = WDI_UpdateProbeRspTemplateReq(wdiSendProbeRspParam,
Jeff Johnson295189b2012-06-20 16:38:30 -07005842 (WDI_UpdateProbeRspTemplateRspCb)WDA_UpdateProbeRspParamsCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07005843 if(IS_WDI_STATUS_FAILURE(status))
5844 {
5845 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5846 "Failure in SEND Probe RSP Params WDI API" );
5847 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005848 vos_mem_free(pSendProbeRspParams);
Madan Mohan Koyyalamudi8f207c12012-10-30 18:18:38 -07005849 vos_mem_free(wdiSendProbeRspParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 return CONVERT_WDI2VOS_STATUS(status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005851}
Jeff Johnson295189b2012-06-20 16:38:30 -07005852#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
5853/*
5854 * FUNCTION: WDA_SetMaxTxPowerCallBack
5855 * send the response to PE with power value received from WDI
5856 */
5857void WDA_SetMaxTxPowerCallBack(WDI_SetMaxTxPowerRspMsg * pwdiSetMaxTxPowerRsp,
5858 void* pUserData)
5859{
5860 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
5861 tWDA_CbContext *pWDA = NULL;
5862 tMaxTxPowerParams *pMaxTxPowerParams = NULL;
5863
5864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5865 "<------ %s " ,__FUNCTION__);
5866 if(NULL == pWdaParams)
5867 {
5868 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5869 "%s: pWdaParams received NULL", __FUNCTION__);
5870 VOS_ASSERT(0) ;
5871 return ;
5872 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005873 pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
5874 pMaxTxPowerParams = (tMaxTxPowerParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005875 if( NULL == pMaxTxPowerParams )
5876 {
5877 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5878 "%s: pMaxTxPowerParams received NULL " ,__FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07005879 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07005880 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
5881 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005882 return ;
5883 }
Jeff Johnsone7245742012-09-05 17:12:55 -07005884
Jeff Johnson295189b2012-06-20 16:38:30 -07005885
5886 /*need to free memory for the pointers used in the
5887 WDA Process.Set Max Tx Power Req function*/
Jeff Johnson295189b2012-06-20 16:38:30 -07005888 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5889 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005890 pMaxTxPowerParams->power = pwdiSetMaxTxPowerRsp->ucPower;
Jeff Johnsone7245742012-09-05 17:12:55 -07005891
Jeff Johnson295189b2012-06-20 16:38:30 -07005892
5893 /* send response to UMAC*/
5894 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, pMaxTxPowerParams , 0) ;
5895
5896 return;
5897}
Jeff Johnson295189b2012-06-20 16:38:30 -07005898/*
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005899 * FUNCTION: WDA_ProcessSetMaxTxPowerReq
Jeff Johnson295189b2012-06-20 16:38:30 -07005900 * Request to WDI to send set Max Tx Power Request
5901 */
5902 VOS_STATUS WDA_ProcessSetMaxTxPowerReq(tWDA_CbContext *pWDA,
5903 tMaxTxPowerParams *MaxTxPowerParams)
5904{
5905 WDI_Status status = WDI_STATUS_SUCCESS;
5906 WDI_SetMaxTxPowerParamsType *wdiSetMaxTxPowerParams = NULL;
5907 tWDA_ReqParams *pWdaParams = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005908
Jeff Johnson295189b2012-06-20 16:38:30 -07005909 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5910 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005911
Jeff Johnson295189b2012-06-20 16:38:30 -07005912 wdiSetMaxTxPowerParams = (WDI_SetMaxTxPowerParamsType *)vos_mem_malloc(
5913 sizeof(WDI_SetMaxTxPowerParamsType));
5914 if(NULL == wdiSetMaxTxPowerParams)
5915 {
5916 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5917 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5918 VOS_ASSERT(0);
5919 return VOS_STATUS_E_NOMEM;
5920 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005921 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
5922 if(NULL == pWdaParams)
5923 {
5924 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5925 "%s: VOS MEM Alloc Failure", __FUNCTION__);
5926 vos_mem_free(wdiSetMaxTxPowerParams);
5927 VOS_ASSERT(0);
5928 return VOS_STATUS_E_NOMEM;
5929 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005930 /* Copy.Max.Tx.Power Params to WDI structure */
5931 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macBSSId,
5932 MaxTxPowerParams->bssId,
5933 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005934 vos_mem_copy(wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.macSelfStaMacAddr,
5935 MaxTxPowerParams->selfStaMacAddr,
5936 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005937 wdiSetMaxTxPowerParams->wdiMaxTxPowerInfo.ucPower =
5938 MaxTxPowerParams->power;
Jeff Johnson295189b2012-06-20 16:38:30 -07005939 wdiSetMaxTxPowerParams->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005940 pWdaParams->pWdaContext = pWDA;
5941 pWdaParams->wdaMsgParam = (void *)MaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005942 /* store Params pass it to WDI */
5943 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetMaxTxPowerParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005944 status = WDI_SetMaxTxPowerReq(wdiSetMaxTxPowerParams,
5945 (WDA_SetMaxTxPowerRspCb)WDA_SetMaxTxPowerCallBack, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07005946 if(IS_WDI_STATUS_FAILURE(status))
5947 {
5948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5949 "Failure in SET MAX TX Power REQ Params WDI API, free all the memory " );
5950 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5951 vos_mem_free(pWdaParams);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005952 /* send response to UMAC*/
5953 WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_RSP, MaxTxPowerParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07005954 }
5955 return CONVERT_WDI2VOS_STATUS(status);
5956
5957}
Jeff Johnson295189b2012-06-20 16:38:30 -07005958#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005959#ifdef WLAN_FEATURE_P2P
Jeff Johnson295189b2012-06-20 16:38:30 -07005960/*
5961 * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
5962 * Free the memory. No need to send any response to PE in this case
5963 */
5964void WDA_SetP2PGONOAReqParamsCallback(WDI_Status status, void* pUserData)
5965{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005966 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
5967
Jeff Johnson295189b2012-06-20 16:38:30 -07005968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
5969 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07005970
5971 if(NULL == pWdaParams)
5972 {
5973 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
5974 "%s: pWdaParams received NULL", __FUNCTION__);
5975 VOS_ASSERT(0) ;
5976 return ;
5977 }
5978
5979 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
5980 vos_mem_free(pWdaParams->wdaMsgParam) ;
5981 vos_mem_free(pWdaParams);
5982
Jeff Johnson295189b2012-06-20 16:38:30 -07005983 /*
5984 * No respone required for SIR_HAL_SET_P2P_GO_NOA_REQ
5985 * so just free the request param here
5986 */
Jeff Johnson295189b2012-06-20 16:38:30 -07005987 return ;
5988}
5989
Jeff Johnson295189b2012-06-20 16:38:30 -07005990/*
5991 * FUNCTION: WDA_ProcessSetP2PGONOAReq
5992 * Request to WDI to set the P2P Group Owner Notice of Absence Req
5993 */
5994VOS_STATUS WDA_ProcessSetP2PGONOAReq(tWDA_CbContext *pWDA,
5995 tP2pPsParams *pP2pPsConfigParams)
5996{
5997 WDI_Status status = WDI_STATUS_SUCCESS ;
5998 WDI_SetP2PGONOAReqParamsType *wdiSetP2PGONOAReqParam =
5999 (WDI_SetP2PGONOAReqParamsType *)vos_mem_malloc(
6000 sizeof(WDI_SetP2PGONOAReqParamsType)) ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006001 tWDA_ReqParams *pWdaParams = NULL;
6002
Jeff Johnson295189b2012-06-20 16:38:30 -07006003 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6004 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006005 if(NULL == wdiSetP2PGONOAReqParam)
6006 {
6007 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6008 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6009 VOS_ASSERT(0);
6010 return VOS_STATUS_E_NOMEM;
6011 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006012
6013 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6014 if(NULL == pWdaParams)
6015 {
6016 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6017 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6018 vos_mem_free(pP2pPsConfigParams);
Madan Mohan Koyyalamudi683acf12012-10-30 18:10:18 -07006019 vos_mem_free(wdiSetP2PGONOAReqParam);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006020 VOS_ASSERT(0);
6021 return VOS_STATUS_E_NOMEM;
6022 }
6023
Jeff Johnson295189b2012-06-20 16:38:30 -07006024 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucOpp_ps =
6025 pP2pPsConfigParams->opp_ps;
6026 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uCtWindow =
6027 pP2pPsConfigParams->ctWindow;
6028 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucCount =
6029 pP2pPsConfigParams->count;
6030 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uDuration =
6031 pP2pPsConfigParams->duration;
6032 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uInterval =
6033 pP2pPsConfigParams->interval;
6034 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.uSingle_noa_duration =
6035 pP2pPsConfigParams->single_noa_duration;
6036 wdiSetP2PGONOAReqParam->wdiP2PGONOAInfo.ucPsSelection =
6037 pP2pPsConfigParams->psSelection;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006038
Jeff Johnson295189b2012-06-20 16:38:30 -07006039 wdiSetP2PGONOAReqParam->wdiReqStatusCB = NULL ;
6040 /* Store msg pointer from PE, as this will be used for response */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006041 pWdaParams->wdaMsgParam = (void *)pP2pPsConfigParams ;
6042
Jeff Johnson295189b2012-06-20 16:38:30 -07006043 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006044 pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetP2PGONOAReqParam ;
6045 pWdaParams->pWdaContext = pWDA;
6046
Jeff Johnson295189b2012-06-20 16:38:30 -07006047 status = WDI_SetP2PGONOAReq(wdiSetP2PGONOAReqParam,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006048 (WDI_SetP2PGONOAReqParamsRspCb)WDA_SetP2PGONOAReqParamsCallback, pWdaParams);
6049
Jeff Johnson295189b2012-06-20 16:38:30 -07006050 if(IS_WDI_STATUS_FAILURE(status))
6051 {
6052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6053 "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006054 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6055 vos_mem_free(pWdaParams->wdaMsgParam);
6056 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006057 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006058 return CONVERT_WDI2VOS_STATUS(status);
6059
Jeff Johnson295189b2012-06-20 16:38:30 -07006060}
6061#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006062#ifdef WLAN_FEATURE_VOWIFI_11R
6063/*
6064 * FUNCTION: WDA_AggrAddTSReqCallback
6065 * send ADD AGGREGATED TS RSP back to PE
6066 */
6067void WDA_AggrAddTSReqCallback(WDI_Status status, void* pUserData)
6068{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006069 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
6070 tWDA_CbContext *pWDA;
6071 tAggrAddTsParams *pAggrAddTsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006072 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6074 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006075 if(NULL == pWdaParams)
6076 {
6077 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6078 "%s: pWdaParams received NULL", __FUNCTION__);
6079 VOS_ASSERT(0) ;
6080 return ;
6081 }
6082
6083 pWDA = pWdaParams->pWdaContext;
6084 pAggrAddTsReqParams = (tAggrAddTsParams *)pWdaParams->wdaMsgParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006085
6086 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
6087 {
6088 pAggrAddTsReqParams->status[i] = CONVERT_WDI2SIR_STATUS(status) ;
6089 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006090 WDA_SendMsg(pWDA, WDA_AGGR_QOS_RSP, (void *)pAggrAddTsReqParams , 0) ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006091
6092 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6093 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006094 return ;
6095}/* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07006096/*
6097 * FUNCTION: WDA_ProcessAddTSReq
6098 * Request to WDI to send an update with AGGREGATED ADD TS REQ params.
6099 */
6100VOS_STATUS WDA_ProcessAggrAddTSReq(tWDA_CbContext *pWDA,
6101 tAggrAddTsParams *pAggrAddTsReqParams)
6102{
6103 WDI_Status status = WDI_STATUS_SUCCESS ;
6104 int i;
6105 WDI_AggrAddTSReqParamsType *wdiAggrAddTSReqParam;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006106 tWDA_ReqParams *pWdaParams = NULL;
6107
6108
Jeff Johnson295189b2012-06-20 16:38:30 -07006109 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6110 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006111 wdiAggrAddTSReqParam = (WDI_AggrAddTSReqParamsType *)vos_mem_malloc(
6112 sizeof(WDI_AggrAddTSReqParamsType)) ;
6113 if(NULL == wdiAggrAddTSReqParam)
6114 {
6115 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6116 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6117 VOS_ASSERT(0);
6118 return VOS_STATUS_E_NOMEM;
6119 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006120
6121
6122 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6123 if(NULL == pWdaParams)
6124 {
6125 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6126 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6127 vos_mem_free(pAggrAddTsReqParams);
Madan Mohan Koyyalamudi683acf12012-10-30 18:10:18 -07006128 vos_mem_free(wdiAggrAddTSReqParam);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006129 VOS_ASSERT(0);
6130 return VOS_STATUS_E_NOMEM;
6131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006132 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucSTAIdx = pAggrAddTsReqParams->staIdx;
6133 wdiAggrAddTSReqParam->wdiAggrTsInfo.ucTspecIdx =
6134 pAggrAddTsReqParams->tspecIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006135 for( i = 0; i < WDI_MAX_NO_AC; i++ )
6136 {
6137 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucType = pAggrAddTsReqParams->tspec[i].type;
6138 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].ucLength =
6139 pAggrAddTsReqParams->tspec[i].length;
Jeff Johnson295189b2012-06-20 16:38:30 -07006140 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.ackPolicy =
6141 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.ackPolicy;
6142 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.userPrio =
6143 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.userPrio;
6144 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.psb =
6145 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.psb;
6146 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.aggregation =
6147 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.aggregation;
6148 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.accessPolicy =
6149 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.accessPolicy;
6150 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.direction =
6151 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.direction;
6152 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.tsid =
6153 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.tsid;
6154 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiTraffic.trafficType =
6155 pAggrAddTsReqParams->tspec[i].tsinfo.traffic.trafficType;
Jeff Johnson295189b2012-06-20 16:38:30 -07006156 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].wdiTSinfo.wdiSchedule.schedule =
6157 pAggrAddTsReqParams->tspec[i].tsinfo.schedule.schedule;
Jeff Johnson295189b2012-06-20 16:38:30 -07006158 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usNomMsduSz =
6159 pAggrAddTsReqParams->tspec[i].nomMsduSz;
6160 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMaxMsduSz =
6161 pAggrAddTsReqParams->tspec[i].maxMsduSz;
6162 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinSvcInterval =
6163 pAggrAddTsReqParams->tspec[i].minSvcInterval;
6164 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxSvcInterval =
6165 pAggrAddTsReqParams->tspec[i].maxSvcInterval;
6166 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uInactInterval =
6167 pAggrAddTsReqParams->tspec[i].inactInterval;
6168 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSuspendInterval =
6169 pAggrAddTsReqParams->tspec[i].suspendInterval;
6170 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uSvcStartTime =
6171 pAggrAddTsReqParams->tspec[i].svcStartTime;
6172 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinDataRate =
6173 pAggrAddTsReqParams->tspec[i].minDataRate;
6174 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMeanDataRate =
6175 pAggrAddTsReqParams->tspec[i].meanDataRate;
6176 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uPeakDataRate =
6177 pAggrAddTsReqParams->tspec[i].peakDataRate;
6178 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMaxBurstSz =
6179 pAggrAddTsReqParams->tspec[i].maxBurstSz;
6180 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uDelayBound =
6181 pAggrAddTsReqParams->tspec[i].delayBound;
6182 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].uMinPhyRate =
6183 pAggrAddTsReqParams->tspec[i].minPhyRate;
6184 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usSurplusBw =
6185 pAggrAddTsReqParams->tspec[i].surplusBw;
6186 wdiAggrAddTSReqParam->wdiAggrTsInfo.wdiTspecIE[i].usMediumTime =
6187 pAggrAddTsReqParams->tspec[i].mediumTime;
6188 }
6189
6190 /* TODO: tAggrAddTsParams doesn't have the following fields */
6191#if 0
6192 wdiAggrAddTSReqParam->wdiTsInfo.ucUapsdFlags =
6193 wdiAggrAddTSReqParam->wdiTsInfo.ucServiceInterval =
6194 wdiAggrAddTSReqParam->wdiTsInfo.ucSuspendInterval =
6195 wdiAggrAddTSReqParam->wdiTsInfo.ucDelayedInterval =
6196#endif
6197 wdiAggrAddTSReqParam->wdiReqStatusCB = NULL ;
6198
6199 /* Store ADD TS pointer, as this will be used for response */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006200 pWdaParams->wdaMsgParam = (void *)pAggrAddTsReqParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006201 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006202 pWdaParams->wdaWdiApiMsgParam = (void *)wdiAggrAddTSReqParam ;
6203
6204 pWdaParams->pWdaContext = pWDA;
6205
Jeff Johnson295189b2012-06-20 16:38:30 -07006206 status = WDI_AggrAddTSReq(wdiAggrAddTSReqParam,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006207 (WDI_AggrAddTsRspCb)WDA_AggrAddTSReqCallback, pWdaParams);
6208
Jeff Johnson295189b2012-06-20 16:38:30 -07006209 if(IS_WDI_STATUS_FAILURE(status))
6210 {
6211 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6212 "Failure in ADD TS REQ Params WDI API, free all the memory " );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006213 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6214 vos_mem_free(pWdaParams);
6215
6216 /* send the failure response back to PE*/
6217 for( i = 0; i < HAL_QOS_NUM_AC_MAX; i++ )
6218 {
6219 pAggrAddTsReqParams->status[i] = eHAL_STATUS_FAILURE ;
6220 }
6221
6222 WDA_SendMsg(pWdaParams->pWdaContext, WDA_AGGR_QOS_RSP,
6223 (void *)pAggrAddTsReqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006224 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006225 return CONVERT_WDI2VOS_STATUS(status) ;
6226}
6227#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006228/*
6229 * FUNCTION: WDA_EnterImpsReqCallback
6230 * send Enter IMPS RSP back to PE
6231 */
6232void WDA_EnterImpsReqCallback(WDI_Status status, void* pUserData)
6233{
6234 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006235 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6236 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006237 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006238 return ;
6239}
Jeff Johnson295189b2012-06-20 16:38:30 -07006240/*
6241 * FUNCTION: WDA_ProcessEnterImpsReq
6242 * Request to WDI to Enter IMPS power state.
6243 */
6244VOS_STATUS WDA_ProcessEnterImpsReq(tWDA_CbContext *pWDA)
6245{
6246 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6248 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006249 status = WDI_EnterImpsReq((WDI_EnterImpsRspCb)WDA_EnterImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006250 if(IS_WDI_STATUS_FAILURE(status))
6251 {
6252 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6253 "Failure in Enter IMPS REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006254 WDA_SendMsg(pWDA, WDA_ENTER_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006255 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006256 return CONVERT_WDI2VOS_STATUS(status) ;
6257}
Jeff Johnson295189b2012-06-20 16:38:30 -07006258/*
6259 * FUNCTION: WDA_ExitImpsReqCallback
6260 * send Exit IMPS RSP back to PE
6261 */
6262void WDA_ExitImpsReqCallback(WDI_Status status, void* pUserData)
6263{
6264 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006265 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6266 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006267 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006268 return ;
6269}
Jeff Johnson295189b2012-06-20 16:38:30 -07006270/*
6271 * FUNCTION: WDA_ProcessExitImpsReq
6272 * Request to WDI to Exit IMPS power state.
6273 */
6274VOS_STATUS WDA_ProcessExitImpsReq(tWDA_CbContext *pWDA)
6275{
6276 WDI_Status status = WDI_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006277 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6278 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006279 status = WDI_ExitImpsReq((WDI_ExitImpsRspCb)WDA_ExitImpsReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07006280 if(IS_WDI_STATUS_FAILURE(status))
6281 {
6282 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6283 "Failure in Exit IMPS REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006284 WDA_SendMsg(pWDA, WDA_EXIT_IMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006285 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006286 return CONVERT_WDI2VOS_STATUS(status) ;
6287}
Jeff Johnson295189b2012-06-20 16:38:30 -07006288/*
6289 * FUNCTION: WDA_EnterBmpsReqCallback
6290 * send Enter BMPS RSP back to PE
6291 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006292void WDA_EnterBmpsReqCallback(WDI_EnterBmpsRspParamsType *pwdiEnterBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006293{
6294 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6295 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006296 tEnterBmpsParams *pEnterBmpsRspParams;
6297
Jeff Johnson295189b2012-06-20 16:38:30 -07006298 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6299 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006300 if(NULL == pWdaParams)
6301 {
6302 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6303 "%s: pWdaParams received NULL", __FUNCTION__);
6304 VOS_ASSERT(0) ;
6305 return ;
6306 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006307
6308 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6309 pEnterBmpsRspParams = (tEnterBmpsParams *)pWdaParams->wdaMsgParam;
6310
6311 pEnterBmpsRspParams->bssIdx = pwdiEnterBmpsRsp->bssIdx;
6312 pEnterBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterBmpsRsp->wdiStatus);
6313
6314 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006315 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006316 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, (void *)pEnterBmpsRspParams , 0);
6317
Jeff Johnson295189b2012-06-20 16:38:30 -07006318 return ;
6319}
Jeff Johnson295189b2012-06-20 16:38:30 -07006320/*
6321 * FUNCTION: WDA_ProcessEnterBmpsReq
6322 * Request to WDI to Enter BMPS power state.
6323 */
6324VOS_STATUS WDA_ProcessEnterBmpsReq(tWDA_CbContext *pWDA,
6325 tEnterBmpsParams *pEnterBmpsReqParams)
6326{
6327 WDI_Status status = WDI_STATUS_SUCCESS;
6328 WDI_EnterBmpsReqParamsType *wdiEnterBmpsReqParams;
6329 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006330 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6331 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006332 if ((NULL == pWDA) || (NULL == pEnterBmpsReqParams))
6333 {
6334 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6335 "%s: invalid param", __FUNCTION__);
6336 VOS_ASSERT(0);
6337 return VOS_STATUS_E_FAILURE;
6338 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006339 wdiEnterBmpsReqParams = vos_mem_malloc(sizeof(WDI_EnterBmpsReqParamsType));
6340 if (NULL == wdiEnterBmpsReqParams)
6341 {
6342 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6343 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6344 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006345 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6346 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006347 return VOS_STATUS_E_NOMEM;
6348 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006349 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams));
6350 if (NULL == pWdaParams)
6351 {
6352 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6353 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6354 VOS_ASSERT(0);
6355 vos_mem_free(wdiEnterBmpsReqParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006356 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL ,
6357 CONVERT_WDI2SIR_STATUS(WDI_STATUS_MEM_FAILURE)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006358 return VOS_STATUS_E_NOMEM;
6359 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006360 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucBssIdx = pEnterBmpsReqParams->bssIdx;
6361 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimCount = pEnterBmpsReqParams->dtimCount;
6362 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.ucDtimPeriod = pEnterBmpsReqParams->dtimPeriod;
6363 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.uTbtt = pEnterBmpsReqParams->tbtt;
Jeff Johnson295189b2012-06-20 16:38:30 -07006364 // For CCX and 11R Roaming
6365 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.rssiFilterPeriod = (wpt_uint32)pEnterBmpsReqParams->rssiFilterPeriod;
6366 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.numBeaconPerRssiAverage = (wpt_uint32)pEnterBmpsReqParams->numBeaconPerRssiAverage;
6367 wdiEnterBmpsReqParams->wdiEnterBmpsInfo.bRssiFilterEnable = (wpt_uint8)pEnterBmpsReqParams->bRssiFilterEnable;
6368 wdiEnterBmpsReqParams->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006369
Jeff Johnson295189b2012-06-20 16:38:30 -07006370 /* Store param pointer as passed in by caller */
6371 /* store Params pass it to WDI */
6372 pWdaParams->wdaWdiApiMsgParam = wdiEnterBmpsReqParams;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006373 pWdaParams->wdaMsgParam = pEnterBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006374 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006375 status = WDI_EnterBmpsReq(wdiEnterBmpsReqParams,
6376 (WDI_EnterBmpsRspCb)WDA_EnterBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006377 if (IS_WDI_STATUS_FAILURE(status))
6378 {
6379 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6380 "Failure in Enter BMPS REQ WDI API, free all the memory" );
6381 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006382 vos_mem_free(pWdaParams->wdaMsgParam);
Jeff Johnson295189b2012-06-20 16:38:30 -07006383 vos_mem_free(pWdaParams);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006384 WDA_SendMsg(pWDA, WDA_ENTER_BMPS_RSP, NULL , CONVERT_WDI2SIR_STATUS(status)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006386 return CONVERT_WDI2VOS_STATUS(status);
6387}
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006388
6389
6390static void WDA_SendExitBmpsRsp(tWDA_CbContext *pWDA,
6391 WDI_Status wdiStatus,
6392 tExitBmpsParams *pExitBmpsReqParams)
6393{
6394 pExitBmpsReqParams->status = CONVERT_WDI2SIR_STATUS(wdiStatus) ;
6395
6396 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsReqParams , 0) ;
6397}
6398
6399
Jeff Johnson295189b2012-06-20 16:38:30 -07006400/*
6401 * FUNCTION: WDA_ExitBmpsReqCallback
6402 * send Exit BMPS RSP back to PE
6403 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006404void WDA_ExitBmpsReqCallback(WDI_ExitBmpsRspParamsType *pwdiExitBmpsRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006405{
6406 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6407 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006408 tExitBmpsParams *pExitBmpsRspParams;
6409
Jeff Johnson295189b2012-06-20 16:38:30 -07006410 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6411 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006412 if(NULL == pWdaParams)
6413 {
6414 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6415 "%s: pWdaParams received NULL", __FUNCTION__);
6416 VOS_ASSERT(0) ;
6417 return ;
6418 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006419
6420 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6421 pExitBmpsRspParams = (tExitBmpsParams *)pWdaParams->wdaMsgParam;
6422
6423 pExitBmpsRspParams->bssIdx = pwdiExitBmpsRsp->bssIdx;
6424 pExitBmpsRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitBmpsRsp->wdiStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07006425
Jeff Johnson295189b2012-06-20 16:38:30 -07006426 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6427 vos_mem_free(pWdaParams) ;
6428
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006429 WDA_SendMsg(pWDA, WDA_EXIT_BMPS_RSP, (void *)pExitBmpsRspParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006430 return ;
6431}
Jeff Johnson295189b2012-06-20 16:38:30 -07006432/*
6433 * FUNCTION: WDA_ProcessExitBmpsReq
6434 * Request to WDI to Exit BMPS power state.
6435 */
6436VOS_STATUS WDA_ProcessExitBmpsReq(tWDA_CbContext *pWDA,
6437 tExitBmpsParams *pExitBmpsReqParams)
6438{
6439 WDI_Status status = WDI_STATUS_SUCCESS ;
6440 WDI_ExitBmpsReqParamsType *wdiExitBmpsReqParams =
6441 (WDI_ExitBmpsReqParamsType *)vos_mem_malloc(
6442 sizeof(WDI_ExitBmpsReqParamsType)) ;
6443 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006444 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6445 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006446 if(NULL == wdiExitBmpsReqParams)
6447 {
6448 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6449 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6450 VOS_ASSERT(0);
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006451 WDA_SendExitBmpsRsp(pWDA, WDI_STATUS_MEM_FAILURE, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006452 return VOS_STATUS_E_NOMEM;
6453 }
6454 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6455 if(NULL == pWdaParams)
6456 {
6457 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6458 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6459 VOS_ASSERT(0);
6460 vos_mem_free(wdiExitBmpsReqParams);
6461 return VOS_STATUS_E_NOMEM;
6462 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006463 wdiExitBmpsReqParams->wdiExitBmpsInfo.ucSendDataNull = pExitBmpsReqParams->sendDataNull;
Jeff Johnsone7245742012-09-05 17:12:55 -07006464
6465 wdiExitBmpsReqParams->wdiExitBmpsInfo.bssIdx = pExitBmpsReqParams->bssIdx;
6466
Jeff Johnson295189b2012-06-20 16:38:30 -07006467 wdiExitBmpsReqParams->wdiReqStatusCB = NULL;
6468
6469 /* Store param pointer as passed in by caller */
6470 /* store Params pass it to WDI */
6471 pWdaParams->wdaWdiApiMsgParam = wdiExitBmpsReqParams;
6472 pWdaParams->pWdaContext = pWDA;
6473 pWdaParams->wdaMsgParam = pExitBmpsReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006474 status = WDI_ExitBmpsReq(wdiExitBmpsReqParams,
6475 (WDI_ExitBmpsRspCb)WDA_ExitBmpsReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006476 if(IS_WDI_STATUS_FAILURE(status))
6477 {
6478 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6479 "Failure in Exit BMPS REQ WDI API, free all the memory " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006480 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6481 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -07006482 WDA_SendExitBmpsRsp(pWDA, status, pExitBmpsReqParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006483 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006484 return CONVERT_WDI2VOS_STATUS(status) ;
6485}
Jeff Johnson295189b2012-06-20 16:38:30 -07006486/*
6487 * FUNCTION: WDA_EnterUapsdReqCallback
6488 * send Enter UAPSD RSP back to PE
6489 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006490void WDA_EnterUapsdReqCallback( WDI_EnterUapsdRspParamsType *pwdiEnterUapsdRspParams, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006491{
6492 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6493 tWDA_CbContext *pWDA;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006494 tUapsdParams *pEnterUapsdRsqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006495 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6496 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006497 if(NULL == pWdaParams)
6498 {
6499 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6500 "%s: pWdaParams received NULL", __FUNCTION__);
6501 VOS_ASSERT(0) ;
6502 return ;
6503 }
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006504
6505 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6506 pEnterUapsdRsqParams = (tUapsdParams *)pWdaParams->wdaMsgParam;
6507
6508 pEnterUapsdRsqParams->bssIdx = pwdiEnterUapsdRspParams->bssIdx;
6509 pEnterUapsdRsqParams->status = CONVERT_WDI2SIR_STATUS(pwdiEnterUapsdRspParams->wdiStatus);
6510
Jeff Johnson295189b2012-06-20 16:38:30 -07006511 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6512 vos_mem_free(pWdaParams) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006513 WDA_SendMsg(pWDA, WDA_ENTER_UAPSD_RSP, (void *)pEnterUapsdRsqParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006514 return ;
6515}
Jeff Johnson295189b2012-06-20 16:38:30 -07006516/*
6517 * FUNCTION: WDA_ProcessEnterUapsdReq
6518 * Request to WDI to Enter UAPSD power state.
6519 */
6520VOS_STATUS WDA_ProcessEnterUapsdReq(tWDA_CbContext *pWDA,
6521 tUapsdParams *pEnterUapsdReqParams)
6522{
6523 WDI_Status status = WDI_STATUS_SUCCESS ;
6524 WDI_EnterUapsdReqParamsType *wdiEnterUapsdReqParams =
6525 (WDI_EnterUapsdReqParamsType *)vos_mem_malloc(
6526 sizeof(WDI_EnterUapsdReqParamsType)) ;
6527 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006528 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6529 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006530 if(NULL == wdiEnterUapsdReqParams)
6531 {
6532 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6533 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6534 VOS_ASSERT(0);
6535 return VOS_STATUS_E_NOMEM;
6536 }
6537 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6538 if(NULL == pWdaParams)
6539 {
6540 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6541 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6542 VOS_ASSERT(0);
6543 vos_mem_free(wdiEnterUapsdReqParams);
6544 return VOS_STATUS_E_NOMEM;
6545 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006546 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeDeliveryEnabled =
6547 pEnterUapsdReqParams->beDeliveryEnabled;
6548 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBeTriggerEnabled =
6549 pEnterUapsdReqParams->beTriggerEnabled;
6550 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkDeliveryEnabled =
6551 pEnterUapsdReqParams->bkDeliveryEnabled;
6552 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucBkTriggerEnabled =
6553 pEnterUapsdReqParams->bkTriggerEnabled;
6554 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViDeliveryEnabled =
6555 pEnterUapsdReqParams->viDeliveryEnabled;
6556 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucViTriggerEnabled =
6557 pEnterUapsdReqParams->viTriggerEnabled;
6558 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoDeliveryEnabled =
6559 pEnterUapsdReqParams->voDeliveryEnabled;
6560 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.ucVoTriggerEnabled =
6561 pEnterUapsdReqParams->voTriggerEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07006562 wdiEnterUapsdReqParams->wdiEnterUapsdInfo.bssIdx = pEnterUapsdReqParams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07006563
6564 wdiEnterUapsdReqParams->wdiReqStatusCB = NULL;
6565
Jeff Johnson295189b2012-06-20 16:38:30 -07006566 /* Store param pointer as passed in by caller */
6567 /* store Params pass it to WDI */
6568 pWdaParams->wdaWdiApiMsgParam = wdiEnterUapsdReqParams;
6569 pWdaParams->pWdaContext = pWDA;
6570 pWdaParams->wdaMsgParam = pEnterUapsdReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006571 status = WDI_EnterUapsdReq(wdiEnterUapsdReqParams,
6572 (WDI_EnterUapsdRspCb)WDA_EnterUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006573 if(IS_WDI_STATUS_FAILURE(status))
6574 {
6575 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6576 "Failure in Enter UAPSD REQ WDI API, free all the memory " );
6577 vos_mem_free(pWdaParams->wdaMsgParam) ;
6578 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6579 vos_mem_free(pWdaParams) ;
6580 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006581 return CONVERT_WDI2VOS_STATUS(status) ;
6582}
Jeff Johnson295189b2012-06-20 16:38:30 -07006583/*
6584 * FUNCTION: WDA_ExitUapsdReqCallback
6585 * send Exit UAPSD RSP back to PE
6586 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006587void WDA_ExitUapsdReqCallback(WDI_ExitUapsdRspParamsType *pwdiExitRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07006588{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006589
6590 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
6591 tWDA_CbContext *pWDA;
6592 tExitUapsdParams *pExitUapsdRspParams;
6593
Jeff Johnson295189b2012-06-20 16:38:30 -07006594 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6595 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006596 if(NULL == pWdaParams)
6597 {
6598 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6599 "%s: pWdaParams received NULL", __FUNCTION__);
6600 VOS_ASSERT(0);
6601 return;
6602 }
6603
6604 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
6605 pExitUapsdRspParams = (tExitUapsdParams *)pWdaParams->wdaMsgParam;
6606
6607 pExitUapsdRspParams->bssIdx = pwdiExitRspParam->bssIdx;
6608 pExitUapsdRspParams->status = CONVERT_WDI2SIR_STATUS(pwdiExitRspParam->wdiStatus);
6609
6610 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6611 vos_mem_free(pWdaParams) ;
6612
6613 WDA_SendMsg(pWDA, WDA_EXIT_UAPSD_RSP, (void *)pExitUapsdRspParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006614 return ;
6615}
Jeff Johnson295189b2012-06-20 16:38:30 -07006616/*
6617 * FUNCTION: WDA_ProcessExitUapsdReq
6618 * Request to WDI to Exit UAPSD power state.
6619 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006620VOS_STATUS WDA_ProcessExitUapsdReq(tWDA_CbContext *pWDA,
6621 tExitUapsdParams *pExitUapsdParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07006622{
6623 WDI_Status status = WDI_STATUS_SUCCESS ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006624 tWDA_ReqParams *pWdaParams ;
6625 WDI_ExitUapsdReqParamsType *wdiExitUapsdReqParams =
6626 (WDI_ExitUapsdReqParamsType *)vos_mem_malloc(
6627 sizeof(WDI_ExitUapsdReqParamsType)) ;
6628
Jeff Johnson295189b2012-06-20 16:38:30 -07006629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6630 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006631
6632 if(NULL == wdiExitUapsdReqParams)
6633 {
6634 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6635 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6636 VOS_ASSERT(0);
6637 return VOS_STATUS_E_NOMEM;
6638 }
6639 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6640 if(NULL == pWdaParams)
6641 {
6642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6643 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6644 VOS_ASSERT(0);
6645 vos_mem_free(wdiExitUapsdReqParams);
6646 return VOS_STATUS_E_NOMEM;
6647 }
6648
6649 wdiExitUapsdReqParams->wdiExitUapsdInfo.bssIdx = pExitUapsdParams->bssIdx;
6650 wdiExitUapsdReqParams->wdiReqStatusCB = NULL;
6651
6652 /* Store param pointer as passed in by caller */
6653 /* store Params pass it to WDI */
6654 pWdaParams->wdaWdiApiMsgParam = wdiExitUapsdReqParams;
6655 pWdaParams->pWdaContext = pWDA;
6656 pWdaParams->wdaMsgParam = pExitUapsdParams;
6657
6658 status = WDI_ExitUapsdReq(wdiExitUapsdReqParams, (WDI_ExitUapsdRspCb)WDA_ExitUapsdReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006659 if(IS_WDI_STATUS_FAILURE(status))
6660 {
6661 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6662 "Failure in Exit UAPSD REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07006663 vos_mem_free(pWdaParams->wdaMsgParam) ;
6664 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6665 vos_mem_free(pWdaParams) ;
6666
Jeff Johnson295189b2012-06-20 16:38:30 -07006667 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006668 return CONVERT_WDI2VOS_STATUS(status) ;
6669}
6670
Jeff Johnson295189b2012-06-20 16:38:30 -07006671/*
6672 * FUNCTION: WDA_SetPwrSaveCfgReqCallback
6673 *
6674 */
6675void WDA_SetPwrSaveCfgReqCallback(WDI_Status status, void* pUserData)
6676{
6677 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07006678 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6679 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006680 if(NULL == pWdaParams)
6681 {
6682 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6683 "%s: pWdaParams received NULL", __FUNCTION__);
6684 VOS_ASSERT(0) ;
6685 return ;
6686 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006687 if( pWdaParams != NULL )
6688 {
6689 if( pWdaParams->wdaWdiApiMsgParam != NULL )
6690 {
6691 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6692 }
6693 if( pWdaParams->wdaMsgParam != NULL )
6694 {
6695 vos_mem_free(pWdaParams->wdaMsgParam) ;
6696 }
6697 vos_mem_free(pWdaParams) ;
6698 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006699 return ;
6700}
Jeff Johnson295189b2012-06-20 16:38:30 -07006701/*
6702 * FUNCTION: WDA_ProcessSetPwrSaveCfgReq
6703 * Request to WDI to set the power save params at start.
6704 */
6705VOS_STATUS WDA_ProcessSetPwrSaveCfgReq(tWDA_CbContext *pWDA,
6706 tSirPowerSaveCfg *pPowerSaveCfg)
6707{
6708 WDI_Status status = WDI_STATUS_SUCCESS ;
6709 tHalCfg *tlvStruct = NULL ;
6710 tANI_U8 *tlvStructStart = NULL ;
6711 v_PVOID_t *configParam;
6712 tANI_U32 configParamSize;
6713 tANI_U32 *configDataValue;
6714 WDI_UpdateCfgReqParamsType *wdiPowerSaveCfg;
6715 tWDA_ReqParams *pWdaParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6717 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006718 if ((NULL == pWDA) || (NULL == pPowerSaveCfg))
6719 {
6720 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6721 "%s: invalid param", __FUNCTION__);
6722 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006723 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006724 return VOS_STATUS_E_FAILURE;
6725 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006726 wdiPowerSaveCfg = vos_mem_malloc(sizeof(WDI_UpdateCfgReqParamsType));
6727 if (NULL == wdiPowerSaveCfg)
6728 {
6729 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6730 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6731 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006732 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006733 return VOS_STATUS_E_NOMEM;
6734 }
6735 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6736 if(NULL == pWdaParams)
6737 {
6738 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6739 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6740 VOS_ASSERT(0);
6741 vos_mem_free(wdiPowerSaveCfg);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006742 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006743 return VOS_STATUS_E_NOMEM;
6744 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006745 configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * WDA_NUM_PWR_SAVE_CFG;
6746 configParam = vos_mem_malloc(configParamSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07006747 if(NULL == configParam)
6748 {
6749 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6750 "%s: VOS MEM Alloc Failure \n", __FUNCTION__);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006751 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07006752 vos_mem_free(pWdaParams);
6753 vos_mem_free(wdiPowerSaveCfg);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07006754 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006755 return VOS_STATUS_E_NOMEM;
6756 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006757 vos_mem_set(configParam, configParamSize, 0);
6758 wdiPowerSaveCfg->pConfigBuffer = configParam;
6759 tlvStruct = (tHalCfg *)configParam;
6760 tlvStructStart = (tANI_U8 *)configParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07006761 /* QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE */
6762 tlvStruct->type = QWLAN_HAL_CFG_PS_BROADCAST_FRAME_FILTER_ENABLE;
6763 tlvStruct->length = sizeof(tANI_U32);
6764 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6765 *configDataValue = (tANI_U32)pPowerSaveCfg->broadcastFrameFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006766 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6767 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006768 /* QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD */
6769 tlvStruct->type = QWLAN_HAL_CFG_PS_HEART_BEAT_THRESHOLD;
6770 tlvStruct->length = sizeof(tANI_U32);
6771 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6772 *configDataValue = (tANI_U32)pPowerSaveCfg->HeartBeatCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07006773 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6774 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006775 /* QWLAN_HAL_CFG_PS_IGNORE_DTIM */
6776 tlvStruct->type = QWLAN_HAL_CFG_PS_IGNORE_DTIM;
6777 tlvStruct->length = sizeof(tANI_U32);
6778 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6779 *configDataValue = (tANI_U32)pPowerSaveCfg->ignoreDtim;
Jeff Johnson295189b2012-06-20 16:38:30 -07006780 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6781 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006782 /* QWLAN_HAL_CFG_PS_LISTEN_INTERVAL */
6783 tlvStruct->type = QWLAN_HAL_CFG_PS_LISTEN_INTERVAL;
6784 tlvStruct->length = sizeof(tANI_U32);
6785 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6786 *configDataValue = (tANI_U32)pPowerSaveCfg->listenInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07006787 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6788 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006789 /* QWLAN_HAL_CFG_PS_MAX_PS_POLL */
6790 tlvStruct->type = QWLAN_HAL_CFG_PS_MAX_PS_POLL;
6791 tlvStruct->length = sizeof(tANI_U32);
6792 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6793 *configDataValue = (tANI_U32)pPowerSaveCfg->maxPsPoll;
Jeff Johnson295189b2012-06-20 16:38:30 -07006794 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6795 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006796 /* QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD */
6797 tlvStruct->type = QWLAN_HAL_CFG_PS_MIN_RSSI_THRESHOLD;
6798 tlvStruct->length = sizeof(tANI_U32);
6799 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6800 *configDataValue = (tANI_U32)pPowerSaveCfg->minRssiThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07006801 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6802 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006803 /* QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER */
6804 tlvStruct->type = QWLAN_HAL_CFG_PS_NTH_BEACON_FILTER;
6805 tlvStruct->length = sizeof(tANI_U32);
6806 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6807 *configDataValue = (tANI_U32)pPowerSaveCfg->nthBeaconFilter;
Jeff Johnson295189b2012-06-20 16:38:30 -07006808 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6809 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006810 /* QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM */
6811 tlvStruct->type = QWLAN_HAL_CFG_PS_ENABLE_BCN_EARLY_TERM;
6812 tlvStruct->length = sizeof(tANI_U32);
6813 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6814 *configDataValue = (tANI_U32)pPowerSaveCfg->fEnableBeaconEarlyTermination;
6815 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6816 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006817 /* QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL */
6818 tlvStruct->type = QWLAN_HAL_CFG_BCN_EARLY_TERM_WAKEUP_INTERVAL;
6819 tlvStruct->length = sizeof(tANI_U32);
6820 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6821 *configDataValue = (tANI_U32)pPowerSaveCfg->bcnEarlyTermWakeInterval;
6822 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6823 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006824 /* QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE */
6825 tlvStruct->type = QWLAN_HAL_CFG_NUM_BEACON_PER_RSSI_AVERAGE;
6826 tlvStruct->length = sizeof(tANI_U32);
6827 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6828 *configDataValue = (tANI_U32)pPowerSaveCfg->numBeaconPerRssiAverage;
Jeff Johnson295189b2012-06-20 16:38:30 -07006829 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6830 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006831 /* QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD */
6832 tlvStruct->type = QWLAN_HAL_CFG_PS_RSSI_FILTER_PERIOD;
6833 tlvStruct->length = sizeof(tANI_U32);
6834 configDataValue = (tANI_U32 *)(tlvStruct + 1);
6835 *configDataValue = (tANI_U32)pPowerSaveCfg->rssiFilterPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -07006836 tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
6837 + sizeof(tHalCfg) + tlvStruct->length)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006838 wdiPowerSaveCfg->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006839 wdiPowerSaveCfg->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006840 /* store Params pass it to WDI */
6841 pWdaParams->wdaMsgParam = configParam;
6842 pWdaParams->wdaWdiApiMsgParam = wdiPowerSaveCfg;
6843 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07006844 status = WDI_SetPwrSaveCfgReq(wdiPowerSaveCfg,
6845 (WDI_SetPwrSaveCfgCb)WDA_SetPwrSaveCfgReqCallback, 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 Pwr Save CFG REQ WDI API, free all the memory " );
6850 vos_mem_free(pWdaParams->wdaMsgParam);
6851 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
6852 vos_mem_free(pWdaParams);
6853 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006854 vos_mem_free(pPowerSaveCfg);
Jeff Johnson295189b2012-06-20 16:38:30 -07006855 return CONVERT_WDI2VOS_STATUS(status);
6856}
Jeff Johnson295189b2012-06-20 16:38:30 -07006857/*
6858 * FUNCTION: WDA_SetUapsdAcParamsReqCallback
6859 *
6860 */
6861void WDA_SetUapsdAcParamsReqCallback(WDI_Status status, void* pUserData)
6862{
6863 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006864 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6865 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006866 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6867 vos_mem_free(pWdaParams);
6868
Jeff Johnson295189b2012-06-20 16:38:30 -07006869 return ;
6870}
Jeff Johnson295189b2012-06-20 16:38:30 -07006871/*
6872 * FUNCTION: WDA_SetUapsdAcParamsReq
6873 * Request to WDI to set the UAPSD params for an ac (sta mode).
6874 */
6875VOS_STATUS WDA_SetUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx,
6876 tUapsdInfo *pUapsdInfo)
6877{
6878 WDI_Status status = WDI_STATUS_SUCCESS;
6879 tWDA_CbContext *pWDA = NULL ;
6880 WDI_SetUapsdAcParamsReqParamsType *wdiUapsdParams =
6881 (WDI_SetUapsdAcParamsReqParamsType *)vos_mem_malloc(
6882 sizeof(WDI_SetUapsdAcParamsReqParamsType)) ;
6883 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07006884 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6885 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006886 if(NULL == wdiUapsdParams)
6887 {
6888 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6889 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6890 VOS_ASSERT(0);
6891 return VOS_STATUS_E_NOMEM;
6892 }
6893 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
6894 if(NULL == pWdaParams)
6895 {
6896 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6897 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6898 VOS_ASSERT(0);
6899 vos_mem_free(wdiUapsdParams);
6900 return VOS_STATUS_E_NOMEM;
6901 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006902 wdiUapsdParams->wdiUapsdInfo.ucAc = pUapsdInfo->ac;
6903 wdiUapsdParams->wdiUapsdInfo.uDelayInterval = pUapsdInfo->delayInterval;
6904 wdiUapsdParams->wdiUapsdInfo.uSrvInterval = pUapsdInfo->srvInterval;
6905 wdiUapsdParams->wdiUapsdInfo.ucSTAIdx = pUapsdInfo->staidx;
6906 wdiUapsdParams->wdiUapsdInfo.uSusInterval = pUapsdInfo->susInterval;
6907 wdiUapsdParams->wdiUapsdInfo.ucUp = pUapsdInfo->up;
Jeff Johnson295189b2012-06-20 16:38:30 -07006908 wdiUapsdParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006909 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
Jeff Johnson295189b2012-06-20 16:38:30 -07006910 pWdaParams->pWdaContext = pWDA;
6911 /* Store param pointer as passed in by caller */
6912 pWdaParams->wdaMsgParam = pUapsdInfo;
6913 /* store Params pass it to WDI */
6914 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUapsdParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07006915 status = WDI_SetUapsdAcParamsReq(wdiUapsdParams,
6916 (WDI_SetUapsdAcParamsCb)WDA_SetUapsdAcParamsReqCallback,
6917 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006918 if(IS_WDI_STATUS_FAILURE(status))
6919 {
6920 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6921 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
6922 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6923 vos_mem_free(pWdaParams);
6924 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006925 if((WDI_STATUS_SUCCESS == status) || (WDI_STATUS_PENDING == status))
6926 return VOS_STATUS_SUCCESS;
6927 else
6928 return VOS_STATUS_E_FAILURE;
6929
Jeff Johnson295189b2012-06-20 16:38:30 -07006930}
6931/*
6932 * FUNCTION: WDA_ClearUapsdAcParamsReq
6933 * Currently the WDA API is a NOP. It has been added for symmetry & Also it was
6934 * decided that the if the UPASD parameters change, FW would get a exit UAPSD
6935 * and again enter the UPASD with the modified params. Hence the disable
6936 * function was kept empty.
6937 *
6938 */
6939VOS_STATUS WDA_ClearUapsdAcParamsReq(v_PVOID_t pVosContext, v_U8_t staIdx, wpt_uint8 ac)
6940{
6941 /* do nothing */
6942 return VOS_STATUS_SUCCESS;
6943}
Jeff Johnson295189b2012-06-20 16:38:30 -07006944/*
6945 * FUNCTION: WDA_UpdateUapsdParamsReqCallback
6946 *
6947 */
6948void WDA_UpdateUapsdParamsReqCallback(WDI_Status status, void* pUserData)
6949{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006950 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
6951
Jeff Johnson295189b2012-06-20 16:38:30 -07006952 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6953 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006954
6955 if(NULL == pWdaParams)
6956 {
6957 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6958 "%s: pWdaParams received NULL", __FUNCTION__);
6959 VOS_ASSERT(0) ;
6960 return ;
6961 }
6962
6963 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
6964 vos_mem_free(pWdaParams->wdaMsgParam);
6965 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07006966
Jeff Johnson295189b2012-06-20 16:38:30 -07006967 //print a msg, nothing else to do
6968 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6969 "WDA_UpdateUapsdParamsReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07006970 return ;
6971}
Jeff Johnson295189b2012-06-20 16:38:30 -07006972/*
6973 * FUNCTION: WDA_UpdateUapsdParamsReq
6974 * Request to WDI to update UAPSD params (in softAP mode) for a station.
6975 */
6976VOS_STATUS WDA_UpdateUapsdParamsReq(tWDA_CbContext *pWDA,
6977 tUpdateUapsdParams* pUpdateUapsdInfo)
6978{
6979 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07006980 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07006981 WDI_UpdateUapsdReqParamsType *wdiUpdateUapsdParams =
6982 (WDI_UpdateUapsdReqParamsType *)vos_mem_malloc(
6983 sizeof(WDI_UpdateUapsdReqParamsType)) ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006984 tWDA_ReqParams *pWdaParams = NULL;
6985
Jeff Johnson295189b2012-06-20 16:38:30 -07006986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
6987 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07006988 if(NULL == wdiUpdateUapsdParams)
6989 {
6990 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
6991 "%s: VOS MEM Alloc Failure", __FUNCTION__);
6992 VOS_ASSERT(0);
6993 return VOS_STATUS_E_NOMEM;
6994 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006995 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.uMaxSpLen = pUpdateUapsdInfo->maxSpLen;
6996 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucSTAIdx = pUpdateUapsdInfo->staIdx;
6997 wdiUpdateUapsdParams->wdiUpdateUapsdInfo.ucUapsdACMask = pUpdateUapsdInfo->uapsdACMask;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07006998
6999 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7000 if(NULL == pWdaParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07007001 {
7002 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007003 "%s: VOS MEM Alloc Failure", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007004 VOS_ASSERT(0);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007005 vos_mem_free(pUpdateUapsdInfo);
7006 vos_mem_free(wdiUpdateUapsdParams);
7007 return VOS_STATUS_E_NOMEM;
Jeff Johnson295189b2012-06-20 16:38:30 -07007008 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007009 /* Store param pointer as passed in by caller */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007010 pWdaParams->wdaMsgParam = pUpdateUapsdInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007011 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007012 pWdaParams->wdaWdiApiMsgParam = (void *)wdiUpdateUapsdParams;
7013 pWdaParams->pWdaContext = pWDA;
7014
Jeff Johnson43971f52012-07-17 12:26:56 -07007015 wstatus = WDI_UpdateUapsdParamsReq(wdiUpdateUapsdParams,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007016 (WDI_UpdateUapsdParamsCb)WDA_UpdateUapsdParamsReqCallback,
7017 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007018
Jeff Johnson43971f52012-07-17 12:26:56 -07007019 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007020 {
7021 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7022 "Failure in Set UAPSD params REQ WDI API, free all the memory " );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007023 status = CONVERT_WDI2VOS_STATUS(wstatus) ;
7024 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7025 vos_mem_free(pWdaParams->wdaMsgParam);
Madan Mohan Koyyalamudi683acf12012-10-30 18:10:18 -07007026 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007027 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007028 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007029}
Jeff Johnson295189b2012-06-20 16:38:30 -07007030/*
7031 * FUNCTION: WDA_ConfigureRxpFilterCallback
7032 *
7033 */
7034void WDA_ConfigureRxpFilterCallback(WDI_Status wdiStatus, void* pUserData)
7035{
7036 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7038 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007039 if(WDI_STATUS_SUCCESS != wdiStatus)
7040 {
7041 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7042 "%s: RXP config filter failure \n", __FUNCTION__ );
7043 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007044 if(NULL == pWdaParams)
7045 {
7046 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7047 "%s: pWdaParams received NULL", __FUNCTION__);
7048 VOS_ASSERT(0) ;
7049 return ;
7050 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007051 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7052 vos_mem_free(pWdaParams->wdaMsgParam);
7053 vos_mem_free(pWdaParams);
7054 return ;
7055}
Jeff Johnson295189b2012-06-20 16:38:30 -07007056/*
7057 * FUNCTION: WDA_ProcessConfigureRxpFilterReq
7058 *
7059 */
7060VOS_STATUS WDA_ProcessConfigureRxpFilterReq(tWDA_CbContext *pWDA,
7061 tSirWlanSetRxpFilters *pWlanSuspendParam)
7062{
Jeff Johnson295189b2012-06-20 16:38:30 -07007063 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007064 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007065 WDI_ConfigureRxpFilterReqParamsType *wdiRxpFilterParams =
7066 (WDI_ConfigureRxpFilterReqParamsType *)vos_mem_malloc(
7067 sizeof(WDI_ConfigureRxpFilterReqParamsType)) ;
7068 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007069 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7070 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007071 if(NULL == wdiRxpFilterParams)
7072 {
7073 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7074 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7075 VOS_ASSERT(0);
7076 vos_mem_free(pWlanSuspendParam);
7077 return VOS_STATUS_E_NOMEM;
7078 }
7079 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7080 if(NULL == pWdaParams)
7081 {
7082 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7083 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7084 VOS_ASSERT(0);
7085 vos_mem_free(wdiRxpFilterParams);
7086 vos_mem_free(pWlanSuspendParam);
7087 return VOS_STATUS_E_NOMEM;
7088 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007089 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilter =
7090 pWlanSuspendParam->setMcstBcstFilter;
7091 wdiRxpFilterParams->wdiRxpFilterParam.ucSetMcstBcstFilterSetting =
7092 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7093
7094 wdiRxpFilterParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007095 pWdaParams->pWdaContext = pWDA;
7096 pWdaParams->wdaMsgParam = pWlanSuspendParam;
7097 pWdaParams->wdaWdiApiMsgParam = (void *)wdiRxpFilterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007098 wstatus = WDI_ConfigureRxpFilterReq(wdiRxpFilterParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07007099 (WDI_ConfigureRxpFilterCb)WDA_ConfigureRxpFilterCallback,
7100 pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007101 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007102 {
7103 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7104 "Failure in configure RXP filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007105 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007106 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7107 vos_mem_free(pWdaParams->wdaMsgParam);
7108 vos_mem_free(pWdaParams);
7109 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007110 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007111}
Jeff Johnson295189b2012-06-20 16:38:30 -07007112/*
7113 * FUNCTION: WDA_WdiIndicationCallback
7114 *
7115 */
7116void WDA_WdiIndicationCallback( WDI_Status wdiStatus,
7117 void* pUserData)
7118{
7119 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7120 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007121}
Jeff Johnson295189b2012-06-20 16:38:30 -07007122/*
7123 * FUNCTION: WDA_ProcessWlanSuspendInd
7124 *
7125 */
7126VOS_STATUS WDA_ProcessWlanSuspendInd(tWDA_CbContext *pWDA,
7127 tSirWlanSuspendParam *pWlanSuspendParam)
7128{
7129 WDI_Status wdiStatus;
7130 WDI_SuspendParamsType wdiSuspendParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007131 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7132 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007133 wdiSuspendParams.wdiSuspendParams.ucConfiguredMcstBcstFilterSetting =
7134 pWlanSuspendParam->configuredMcstBcstFilterSetting;
7135 wdiSuspendParams.wdiReqStatusCB = WDA_WdiIndicationCallback;
7136 wdiSuspendParams.pUserData = pWDA;
7137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanSuspendParam->configuredMcstBcstFilterSetting);
Jeff Johnson295189b2012-06-20 16:38:30 -07007138 wdiStatus = WDI_HostSuspendInd(&wdiSuspendParams);
7139 if(WDI_STATUS_PENDING == wdiStatus)
7140 {
7141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7142 "Pending received for %s:%d ",__FUNCTION__,__LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -07007143 }
7144 else if( WDI_STATUS_SUCCESS_SYNC != wdiStatus )
7145 {
7146 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7147 "Failure in %s:%d ",__FUNCTION__,__LINE__ );
7148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007149 vos_mem_free(pWlanSuspendParam);
7150 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7151}
7152
Jeff Johnson295189b2012-06-20 16:38:30 -07007153/*
7154 * FUNCTION: WDA_ProcessWlanResumeCallback
7155 *
7156 */
7157void WDA_ProcessWlanResumeCallback(
7158 WDI_SuspendResumeRspParamsType *resumeRspParams,
7159 void* pUserData)
7160{
7161 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007162 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7163 "<------ %s " ,__FUNCTION__);
7164 if(NULL == pWdaParams)
7165 {
7166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7167 "%s: pWdaParams received NULL", __FUNCTION__);
7168 VOS_ASSERT(0) ;
7169 return ;
7170 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007171 if(WDI_STATUS_SUCCESS != resumeRspParams->wdiStatus)
7172 {
7173 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7174 "%s: Process Wlan Resume failure \n", __FUNCTION__ );
7175 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007176 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7177 vos_mem_free(pWdaParams->wdaMsgParam);
7178 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007179 return ;
7180}
Jeff Johnson295189b2012-06-20 16:38:30 -07007181/*
7182 * FUNCTION: WDA_ProcessWlanResumeReq
7183 *
7184 */
7185VOS_STATUS WDA_ProcessWlanResumeReq(tWDA_CbContext *pWDA,
7186 tSirWlanResumeParam *pWlanResumeParam)
7187{
7188 WDI_Status wdiStatus;
7189 WDI_ResumeParamsType *wdiResumeParams =
7190 (WDI_ResumeParamsType *)vos_mem_malloc(
7191 sizeof(WDI_ResumeParamsType) ) ;
7192 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007193 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7194 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007195 if(NULL == wdiResumeParams)
7196 {
7197 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7198 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7199 VOS_ASSERT(0);
7200 return VOS_STATUS_E_NOMEM;
7201 }
7202 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7203 if(NULL == pWdaParams)
7204 {
7205 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7206 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7207 VOS_ASSERT(0);
7208 vos_mem_free(wdiResumeParams);
7209 return VOS_STATUS_E_NOMEM;
7210 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007211 wdiResumeParams->wdiResumeParams.ucConfiguredMcstBcstFilterSetting =
7212 pWlanResumeParam->configuredMcstBcstFilterSetting;
Jeff Johnson295189b2012-06-20 16:38:30 -07007213 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "%s: %d" ,__FUNCTION__, pWlanResumeParam->configuredMcstBcstFilterSetting);
7214 wdiResumeParams->wdiReqStatusCB = NULL;
7215 pWdaParams->wdaMsgParam = pWlanResumeParam;
7216 pWdaParams->wdaWdiApiMsgParam = wdiResumeParams;
7217 pWdaParams->pWdaContext = pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -07007218 wdiStatus = WDI_HostResumeReq(wdiResumeParams,
7219 (WDI_HostResumeEventRspCb)WDA_ProcessWlanResumeCallback,
7220 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007221 if(IS_WDI_STATUS_FAILURE(wdiStatus))
7222 {
7223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7224 "Failure in Host Resume REQ WDI API, free all the memory " );
7225 VOS_ASSERT(0);
7226 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7227 vos_mem_free(pWdaParams->wdaMsgParam);
7228 vos_mem_free(pWdaParams);
7229 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007230 return CONVERT_WDI2VOS_STATUS(wdiStatus) ;
7231}
7232
Jeff Johnson295189b2012-06-20 16:38:30 -07007233/*
7234 * FUNCTION: WDA_SetBeaconFilterReqCallback
7235 *
7236 */
7237void WDA_SetBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7238{
7239 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007240 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7241 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007242 if(NULL == pWdaParams)
7243 {
7244 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7245 "%s: pWdaParams received NULL", __FUNCTION__);
7246 VOS_ASSERT(0) ;
7247 return ;
7248 }
7249
7250 vos_mem_free(pWdaParams->wdaMsgParam) ;
7251 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7252 vos_mem_free(pWdaParams) ;
7253 /*
7254 * No respone required for SetBeaconFilter req so just free the request
7255 * param here
7256 */
7257
Jeff Johnson295189b2012-06-20 16:38:30 -07007258 return ;
7259}
Jeff Johnson295189b2012-06-20 16:38:30 -07007260/*
7261 * FUNCTION: WDA_SetBeaconFilterReq
7262 * Request to WDI to send the beacon filtering related information.
7263 */
7264VOS_STATUS WDA_SetBeaconFilterReq(tWDA_CbContext *pWDA,
7265 tBeaconFilterMsg* pBeaconFilterInfo)
7266{
7267 WDI_Status status = WDI_STATUS_SUCCESS;
7268 tANI_U8 *dstPtr, *srcPtr;
7269 tANI_U8 filterLength;
7270 WDI_BeaconFilterReqParamsType *wdiBeaconFilterInfo =
7271 (WDI_BeaconFilterReqParamsType *)vos_mem_malloc(
7272 sizeof(WDI_BeaconFilterReqParamsType) ) ;
7273 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007274 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7275 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007276 if(NULL == wdiBeaconFilterInfo)
7277 {
7278 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7279 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7280 VOS_ASSERT(0);
7281 return VOS_STATUS_E_NOMEM;
7282 }
7283 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7284 if(NULL == pWdaParams)
7285 {
7286 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7287 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7288 VOS_ASSERT(0);
7289 vos_mem_free(wdiBeaconFilterInfo);
7290 return VOS_STATUS_E_NOMEM;
7291 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007292 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usBeaconInterval =
7293 pBeaconFilterInfo->beaconInterval;
7294 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityInfo =
7295 pBeaconFilterInfo->capabilityInfo;
7296 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usCapabilityMask =
7297 pBeaconFilterInfo->capabilityMask;
7298 wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum = pBeaconFilterInfo->ieNum;
Madan Mohan Koyyalamudia84edda2012-10-15 14:58:25 -07007299
7300 //Fill the BssIdx
7301 wdiBeaconFilterInfo->wdiBeaconFilterInfo.bssIdx = pBeaconFilterInfo->bssIdx;
7302
Jeff Johnson295189b2012-06-20 16:38:30 -07007303 //Fill structure with info contained in the beaconFilterTable
7304 dstPtr = (tANI_U8 *)wdiBeaconFilterInfo + sizeof(WDI_BeaconFilterInfoType);
7305 srcPtr = (tANI_U8 *)pBeaconFilterInfo + sizeof(tBeaconFilterMsg);
7306 filterLength = wdiBeaconFilterInfo->wdiBeaconFilterInfo.usIeNum * sizeof(tBeaconFilterIe);
7307 if(WDI_BEACON_FILTER_LEN < filterLength)
7308 {
7309 filterLength = WDI_BEACON_FILTER_LEN;
7310 }
7311 vos_mem_copy(dstPtr, srcPtr, filterLength);
Jeff Johnson295189b2012-06-20 16:38:30 -07007312 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
7313 /* Store param pointer as passed in by caller */
7314 /* store Params pass it to WDI */
7315 pWdaParams->wdaWdiApiMsgParam = wdiBeaconFilterInfo;
7316 pWdaParams->pWdaContext = pWDA;
7317 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
7318
Jeff Johnson295189b2012-06-20 16:38:30 -07007319 status = WDI_SetBeaconFilterReq(wdiBeaconFilterInfo,
7320 (WDI_SetBeaconFilterCb)WDA_SetBeaconFilterReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007321 if(IS_WDI_STATUS_FAILURE(status))
7322 {
7323 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7324 "Failure in Set Beacon Filter REQ WDI API, free all the memory " );
7325 vos_mem_free(pWdaParams->wdaMsgParam) ;
7326 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7327 vos_mem_free(pWdaParams) ;
7328 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007329 return CONVERT_WDI2VOS_STATUS(status) ;
7330}
Jeff Johnson295189b2012-06-20 16:38:30 -07007331/*
7332 * FUNCTION: WDA_RemBeaconFilterReqCallback
7333 *
7334 */
7335void WDA_RemBeaconFilterReqCallback(WDI_Status status, void* pUserData)
7336{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007337 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7338
Jeff Johnson295189b2012-06-20 16:38:30 -07007339 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7340 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007341
7342 if(NULL == pWdaParams)
7343 {
7344 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7345 "%s: pWdaParams received NULL", __FUNCTION__);
7346 VOS_ASSERT(0) ;
7347 return ;
7348 }
7349
7350 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7351 vos_mem_free(pWdaParams->wdaMsgParam);
7352 vos_mem_free(pWdaParams);
7353
Jeff Johnson295189b2012-06-20 16:38:30 -07007354 //print a msg, nothing else to do
7355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7356 "WDA_RemBeaconFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007357 return ;
7358}
Jeff Johnson295189b2012-06-20 16:38:30 -07007359 // TODO: PE does not have this feature for now implemented,
7360 // but the support for removing beacon filter exists between
7361 // HAL and FW. This function can be called whenever PE defines
7362 // a new message for beacon filter removal
Jeff Johnson295189b2012-06-20 16:38:30 -07007363/*
7364 * FUNCTION: WDA_RemBeaconFilterReq
7365 * Request to WDI to send the removal of beacon filtering related information.
7366 */
7367VOS_STATUS WDA_RemBeaconFilterReq(tWDA_CbContext *pWDA,
7368 tRemBeaconFilterMsg* pBeaconFilterInfo)
7369{
7370 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007371 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007372 WDI_RemBeaconFilterReqParamsType *wdiBeaconFilterInfo =
7373 (WDI_RemBeaconFilterReqParamsType *)vos_mem_malloc(
7374 sizeof(WDI_RemBeaconFilterReqParamsType) + pBeaconFilterInfo->ucIeCount) ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007375 tWDA_ReqParams *pWdaParams ;
7376
Jeff Johnson295189b2012-06-20 16:38:30 -07007377 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7378 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007379 if(NULL == wdiBeaconFilterInfo)
7380 {
7381 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7382 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7383 VOS_ASSERT(0);
7384 return VOS_STATUS_E_NOMEM;
7385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007386 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount =
7387 pBeaconFilterInfo->ucIeCount;
Jeff Johnson295189b2012-06-20 16:38:30 -07007388 //Fill structure with info contained in the ucRemIeId
7389 vos_mem_copy(wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucRemIeId,
7390 pBeaconFilterInfo->ucRemIeId,
7391 wdiBeaconFilterInfo->wdiBeaconFilterInfo.ucIeCount);
7392 wdiBeaconFilterInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007393
7394 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7395 if(NULL == pWdaParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07007396 {
7397 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007398 "%s: VOS MEM Alloc Failure", __FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007399 VOS_ASSERT(0);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007400 vos_mem_free(wdiBeaconFilterInfo);
7401 vos_mem_free(pBeaconFilterInfo);
7402 return VOS_STATUS_E_NOMEM;
Jeff Johnson295189b2012-06-20 16:38:30 -07007403 }
7404
7405 /* Store param pointer as passed in by caller */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007406 pWdaParams->wdaMsgParam = pBeaconFilterInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007407 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007408 pWdaParams->wdaWdiApiMsgParam = (void *)wdiBeaconFilterInfo;
7409
7410 pWdaParams->pWdaContext = pWDA;
7411
Jeff Johnson43971f52012-07-17 12:26:56 -07007412 wstatus = WDI_RemBeaconFilterReq(wdiBeaconFilterInfo,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007413 (WDI_RemBeaconFilterCb)WDA_RemBeaconFilterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007414 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007415 {
7416 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7417 "Failure in Remove Beacon Filter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007418 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007419 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7420 vos_mem_free(pWdaParams->wdaMsgParam);
Madan Mohan Koyyalamudi683acf12012-10-30 18:10:18 -07007421 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007422 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007423 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007424}
Jeff Johnson295189b2012-06-20 16:38:30 -07007425/*
7426 * FUNCTION: WDA_SetRSSIThresholdsReqCallback
7427 *
7428 */
7429void WDA_SetRSSIThresholdsReqCallback(WDI_Status status, void* pUserData)
7430{
7431 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007432 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7433 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007434 if(NULL == pWdaParams)
7435 {
7436 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7437 "%s: pWdaParams received NULL", __FUNCTION__);
7438 VOS_ASSERT(0) ;
7439 return ;
7440 }
7441
7442 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7443 vos_mem_free(pWdaParams) ;
7444
Jeff Johnson295189b2012-06-20 16:38:30 -07007445 return ;
7446}
Jeff Johnson295189b2012-06-20 16:38:30 -07007447/*
7448 * FUNCTION: WDA_SetRSSIThresholdsReq
7449 * Request to WDI to set the RSSI thresholds (sta mode).
7450 */
7451VOS_STATUS WDA_SetRSSIThresholdsReq(tpAniSirGlobal pMac, tSirRSSIThresholds *pBmpsThresholds)
7452{
7453 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007454 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007455 tWDA_CbContext *pWDA = NULL ;
7456 v_PVOID_t pVosContext = NULL;
7457 WDI_SetRSSIThresholdsReqParamsType *wdiRSSIThresholdsInfo =
7458 (WDI_SetRSSIThresholdsReqParamsType *)vos_mem_malloc(
7459 sizeof(WDI_SetRSSIThresholdsReqParamsType)) ;
7460 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007461 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7462 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007463 if(NULL == wdiRSSIThresholdsInfo)
7464 {
7465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7466 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7467 VOS_ASSERT(0);
7468 return VOS_STATUS_E_NOMEM;
7469 }
7470 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7471 if(NULL == pWdaParams)
7472 {
7473 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7474 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7475 VOS_ASSERT(0);
7476 vos_mem_free(wdiRSSIThresholdsInfo);
7477 return VOS_STATUS_E_NOMEM;
7478 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007479 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bReserved10 = pBmpsThresholds->bReserved10;
Jeff Johnson295189b2012-06-20 16:38:30 -07007480 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold1 = pBmpsThresholds->ucRssiThreshold1;
7481 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold2 = pBmpsThresholds->ucRssiThreshold2;
7482 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.ucRssiThreshold3 = pBmpsThresholds->ucRssiThreshold3;
Jeff Johnson295189b2012-06-20 16:38:30 -07007483 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1NegNotify = pBmpsThresholds->bRssiThres1NegNotify;
7484 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2NegNotify = pBmpsThresholds->bRssiThres2NegNotify;
7485 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3NegNotify = pBmpsThresholds->bRssiThres3NegNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007486 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres1PosNotify = pBmpsThresholds->bRssiThres1PosNotify;
7487 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres2PosNotify = pBmpsThresholds->bRssiThres2PosNotify;
7488 wdiRSSIThresholdsInfo->wdiRSSIThresholdsInfo.bRssiThres3PosNotify = pBmpsThresholds->bRssiThres3PosNotify;
Jeff Johnson295189b2012-06-20 16:38:30 -07007489 wdiRSSIThresholdsInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007490 pVosContext = vos_get_global_context(VOS_MODULE_ID_PE, (void *)pMac);
7491 pWDA = vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
7492
Jeff Johnson295189b2012-06-20 16:38:30 -07007493 /* Store param pointer as passed in by caller */
7494 /* store Params pass it to WDI */
7495 pWdaParams->wdaWdiApiMsgParam = wdiRSSIThresholdsInfo;
7496 pWdaParams->pWdaContext = pWDA;
7497 pWdaParams->wdaMsgParam = pBmpsThresholds;
Jeff Johnson43971f52012-07-17 12:26:56 -07007498 wstatus = WDI_SetRSSIThresholdsReq(wdiRSSIThresholdsInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007499 (WDI_SetRSSIThresholdsCb)WDA_SetRSSIThresholdsReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007500 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007501 {
7502 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7503 "Failure in Set RSSI thresholds REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007504 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007505 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7506 vos_mem_free(pWdaParams) ;
7507 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007508 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007509
7510}/*WDA_SetRSSIThresholdsReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007511/*
7512 * FUNCTION: WDA_HostOffloadReqCallback
7513 *
7514 */
7515void WDA_HostOffloadReqCallback(WDI_Status status, void* pUserData)
7516{
7517 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7518
7519 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7520 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007521 if(NULL == pWdaParams)
7522 {
7523 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7524 "%s: pWdaParams received NULL", __FUNCTION__);
7525 VOS_ASSERT(0) ;
7526 return ;
7527 }
7528
7529 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7530 vos_mem_free(pWdaParams->wdaMsgParam);
7531 vos_mem_free(pWdaParams) ;
7532
7533 //print a msg, nothing else to do
7534 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7535 "WDA_HostOffloadReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007536 return ;
7537}
Jeff Johnson295189b2012-06-20 16:38:30 -07007538/*
7539 * FUNCTION: WDA_ProcessHostOffloadReq
7540 * Request to WDI to set the filter to minimize unnecessary host wakeup due
7541 * to broadcast traffic (sta mode).
7542 */
7543VOS_STATUS WDA_ProcessHostOffloadReq(tWDA_CbContext *pWDA,
7544 tSirHostOffloadReq *pHostOffloadParams)
7545{
7546 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007547 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007548 WDI_HostOffloadReqParamsType *wdiHostOffloadInfo =
7549 (WDI_HostOffloadReqParamsType *)vos_mem_malloc(
7550 sizeof(WDI_HostOffloadReqParamsType)) ;
7551 tWDA_ReqParams *pWdaParams ;
7552
7553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7554 "------> %s: offloadType=%x" ,__FUNCTION__, pHostOffloadParams->offloadType);
7555
7556 if(NULL == wdiHostOffloadInfo)
7557 {
7558 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7559 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7560 VOS_ASSERT(0);
7561 return VOS_STATUS_E_NOMEM;
7562 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007563 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7564 if(NULL == pWdaParams)
7565 {
7566 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7567 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7568 VOS_ASSERT(0);
7569 vos_mem_free(wdiHostOffloadInfo);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007570 vos_mem_free(pHostOffloadParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007571 return VOS_STATUS_E_NOMEM;
7572 }
7573
7574 wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType =
7575 pHostOffloadParams->offloadType;
7576 wdiHostOffloadInfo->wdiHostOffloadInfo.ucEnableOrDisable =
7577 pHostOffloadParams->enableOrDisable;
7578
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007579 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.bssId,
7580 pHostOffloadParams->bssId, sizeof(wpt_macAddr));
7581
Jeff Johnson295189b2012-06-20 16:38:30 -07007582 switch (wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType)
7583 {
7584 case SIR_IPV4_ARP_REPLY_OFFLOAD:
7585 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv4Addr,
7586 pHostOffloadParams->params.hostIpv4Addr,
7587 4);
7588 break;
7589 case SIR_IPV6_NEIGHBOR_DISCOVERY_OFFLOAD:
7590 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7591 pHostOffloadParams->params.hostIpv6Addr,
7592 16);
7593 break;
7594 case SIR_IPV6_NS_OFFLOAD:
7595 vos_mem_copy(wdiHostOffloadInfo->wdiHostOffloadInfo.params.aHostIpv6Addr,
7596 pHostOffloadParams->params.hostIpv6Addr,
7597 16);
7598
7599#ifdef WLAN_NS_OFFLOAD
7600 if(pHostOffloadParams->nsOffloadInfo.srcIPv6AddrValid)
7601 {
7602 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6Addr,
7603 pHostOffloadParams->nsOffloadInfo.srcIPv6Addr,
7604 16);
7605 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 1;
7606 }
7607 else
7608 {
7609 wdiHostOffloadInfo->wdiNsOffloadParams.srcIPv6AddrValid = 0;
7610 }
7611
7612 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfIPv6Addr,
7613 pHostOffloadParams->nsOffloadInfo.selfIPv6Addr,
7614 16);
7615 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.selfMacAddr,
7616 pHostOffloadParams->nsOffloadInfo.selfMacAddr,
7617 6);
7618
7619 //Only two are supported so let's go through them without a loop
7620 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[0])
7621 {
7622 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1,
7623 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[0],
7624 16);
7625 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 1;
7626 }
7627 else
7628 {
7629 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr1Valid = 0;
7630 }
7631
7632 if(pHostOffloadParams->nsOffloadInfo.targetIPv6AddrValid[1])
7633 {
7634 vos_mem_copy(wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2,
7635 pHostOffloadParams->nsOffloadInfo.targetIPv6Addr[1],
7636 16);
7637 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 1;
7638 }
7639 else
7640 {
7641 wdiHostOffloadInfo->wdiNsOffloadParams.targetIPv6Addr2Valid = 0;
7642 }
7643 break;
7644#endif //WLAN_NS_OFFLOAD
7645 default:
7646 {
7647 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7648 "No Handling for Offload Type %x in WDA "
7649 , wdiHostOffloadInfo->wdiHostOffloadInfo.ucOffloadType);
7650 //WDA_VOS_ASSERT(0) ;
7651 }
7652 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007653 wdiHostOffloadInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007654
Jeff Johnson295189b2012-06-20 16:38:30 -07007655 /* Store param pointer as passed in by caller */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007656 pWdaParams->wdaMsgParam = pHostOffloadParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007657 /* store Params pass it to WDI */
7658 pWdaParams->wdaWdiApiMsgParam = wdiHostOffloadInfo;
7659 pWdaParams->pWdaContext = pWDA;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007660
Jeff Johnson295189b2012-06-20 16:38:30 -07007661
Jeff Johnson43971f52012-07-17 12:26:56 -07007662 wstatus = WDI_HostOffloadReq(wdiHostOffloadInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007663 (WDI_HostOffloadCb)WDA_HostOffloadReqCallback, pWdaParams);
7664
Jeff Johnson43971f52012-07-17 12:26:56 -07007665 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007666 {
7667 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7668 "Failure in host offload REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007669 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007670 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7671 vos_mem_free(pWdaParams->wdaMsgParam);
7672 vos_mem_free(pWdaParams) ;
7673 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007674 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007675
7676}/*WDA_HostOffloadReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007677/*
7678 * FUNCTION: WDA_KeepAliveReqCallback
7679 *
7680 */
7681void WDA_KeepAliveReqCallback(WDI_Status status, void* pUserData)
7682{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007683 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData ;
7684
Jeff Johnson295189b2012-06-20 16:38:30 -07007685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7686 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007687
7688 if(NULL == pWdaParams)
7689 {
7690 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7691 "%s: pWdaParams received NULL", __FUNCTION__);
7692 VOS_ASSERT(0) ;
7693 return ;
7694 }
7695
7696 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7697 vos_mem_free(pWdaParams->wdaMsgParam);
7698 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007699
Jeff Johnson295189b2012-06-20 16:38:30 -07007700 //print a msg, nothing else to do
7701 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7702 "WDA_KeepAliveReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -07007703 return ;
7704}
Jeff Johnson295189b2012-06-20 16:38:30 -07007705/*
7706 * FUNCTION: WDA_ProcessKeepAliveReq
7707 * Request to WDI to send Keep Alive packets to minimize unnecessary host
7708 * wakeup due to broadcast traffic (sta mode).
7709 */
7710VOS_STATUS WDA_ProcessKeepAliveReq(tWDA_CbContext *pWDA,
7711 tSirKeepAliveReq *pKeepAliveParams)
7712{
7713 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007714 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007715 WDI_KeepAliveReqParamsType *wdiKeepAliveInfo =
7716 (WDI_KeepAliveReqParamsType *)vos_mem_malloc(
7717 sizeof(WDI_KeepAliveReqParamsType)) ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007718 tWDA_ReqParams *pWdaParams;
7719
Jeff Johnson295189b2012-06-20 16:38:30 -07007720 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7721 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007722 if(NULL == wdiKeepAliveInfo)
7723 {
7724 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7725 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7726 VOS_ASSERT(0);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007727 vos_mem_free(pKeepAliveParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007728 return VOS_STATUS_E_NOMEM;
7729 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007730
7731 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7732 if(NULL == pWdaParams)
7733 {
7734 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7735 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7736 VOS_ASSERT(0);
7737 vos_mem_free(wdiKeepAliveInfo);
7738 vos_mem_free(pKeepAliveParams);
7739 return VOS_STATUS_E_NOMEM;
7740 }
7741
Jeff Johnson295189b2012-06-20 16:38:30 -07007742 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType =
7743 pKeepAliveParams->packetType;
7744 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod =
7745 pKeepAliveParams->timePeriod;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007746
7747 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.bssId,
7748 pKeepAliveParams->bssId,
7749 sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07007750
7751 if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_UNSOLICIT_ARP_RSP)
7752 {
7753 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7754 pKeepAliveParams->hostIpv4Addr,
7755 SIR_IPV4_ADDR_LEN);
7756 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7757 pKeepAliveParams->destIpv4Addr,
7758 SIR_IPV4_ADDR_LEN);
7759 vos_mem_copy(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7760 pKeepAliveParams->destMacAddr,
7761 SIR_MAC_ADDR_LEN);
7762 }
7763 else if(pKeepAliveParams->packetType == SIR_KEEP_ALIVE_NULL_PKT)
7764 {
7765 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr,
7766 SIR_IPV4_ADDR_LEN,
7767 0);
7768 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr,
7769 SIR_IPV4_ADDR_LEN,
7770 0);
7771 vos_mem_set(&wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr,
7772 SIR_MAC_ADDR_LEN,
7773 0);
7774 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007775 wdiKeepAliveInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007776
Jeff Johnson295189b2012-06-20 16:38:30 -07007777 /* Store param pointer as passed in by caller */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007778 pWdaParams->wdaMsgParam = pKeepAliveParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07007779 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007780 pWdaParams->wdaWdiApiMsgParam = (void *)wdiKeepAliveInfo;
7781 pWdaParams->pWdaContext = pWDA;
7782
Jeff Johnson295189b2012-06-20 16:38:30 -07007783 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA HIP : %d.%d.%d.%d",
7784 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[0],
7785 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[1],
7786 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[2],
7787 wdiKeepAliveInfo->wdiKeepAliveInfo.aHostIpv4Addr[3]);
7788 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,"WDA DIP : %d.%d.%d.%d",
7789 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[0],
7790 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[1],
7791 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[2],
7792 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestIpv4Addr[3]);
7793 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7794 "WDA DMAC : %d:%d:%d:%d:%d:%d",
7795 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[0],
7796 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[1],
7797 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[2],
7798 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[3],
7799 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[4],
7800 wdiKeepAliveInfo->wdiKeepAliveInfo.aDestMacAddr[5]);
7801 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7802 "TimePeriod %d PacketType %d",
7803 wdiKeepAliveInfo->wdiKeepAliveInfo.ucTimePeriod,
7804 wdiKeepAliveInfo->wdiKeepAliveInfo.ucPacketType);
Jeff Johnson43971f52012-07-17 12:26:56 -07007805 wstatus = WDI_KeepAliveReq(wdiKeepAliveInfo,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007806 (WDI_KeepAliveCb)WDA_KeepAliveReqCallback, pWdaParams);
7807
Jeff Johnson43971f52012-07-17 12:26:56 -07007808 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007809 {
7810 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7811 "Failure in Keep Alive REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007812 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07007813 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
7814 vos_mem_free(pWdaParams->wdaMsgParam);
Madan Mohan Koyyalamudi683acf12012-10-30 18:10:18 -07007815 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07007816 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007817 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007818
7819}/*WDA_KeepAliveReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007820/*
7821 * FUNCTION: WDA_WowlAddBcPtrnReqCallback
7822 *
7823 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007824void WDA_WowlAddBcPtrnReqCallback(
7825 WDI_WowlAddBcPtrnRspParamsType *pWdiWowlAddBcstPtrRsp,
7826 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007827{
7828 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007829 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7830 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007831 if(NULL == pWdaParams)
7832 {
7833 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7834 "%s: pWdaParams received NULL", __FUNCTION__);
7835 VOS_ASSERT(0) ;
7836 return ;
7837 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007838 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7839 vos_mem_free(pWdaParams->wdaMsgParam);
7840 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007841 return ;
7842}
Jeff Johnson295189b2012-06-20 16:38:30 -07007843/*
7844 * FUNCTION: WDA_ProcessWowlAddBcPtrnReq
7845 * Request to WDI to add WOWL Bcast pattern
7846 */
7847VOS_STATUS WDA_ProcessWowlAddBcPtrnReq(tWDA_CbContext *pWDA,
7848 tSirWowlAddBcastPtrn *pWowlAddBcPtrnParams)
7849{
7850 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007851 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007852 WDI_WowlAddBcPtrnReqParamsType *wdiWowlAddBcPtrnInfo =
7853 (WDI_WowlAddBcPtrnReqParamsType *)vos_mem_malloc(
7854 sizeof(WDI_WowlAddBcPtrnReqParamsType)) ;
7855 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007856 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7857 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007858 if(NULL == wdiWowlAddBcPtrnInfo)
7859 {
7860 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7861 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7862 VOS_ASSERT(0);
7863 return VOS_STATUS_E_NOMEM;
7864 }
7865 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7866 if(NULL == pWdaParams)
7867 {
7868 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7869 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7870 VOS_ASSERT(0);
7871 vos_mem_free(wdiWowlAddBcPtrnInfo);
7872 return VOS_STATUS_E_NOMEM;
7873 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007874 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternId =
7875 pWowlAddBcPtrnParams->ucPatternId;
7876 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternByteOffset =
7877 pWowlAddBcPtrnParams->ucPatternByteOffset;
7878 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize =
7879 pWowlAddBcPtrnParams->ucPatternMaskSize;
7880 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize =
7881 pWowlAddBcPtrnParams->ucPatternSize;
Jeff Johnson295189b2012-06-20 16:38:30 -07007882 if (wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize <= WDI_WOWL_BCAST_PATTERN_MAX_SIZE)
7883 {
7884 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7885 pWowlAddBcPtrnParams->ucPattern,
7886 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize);
7887 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7888 pWowlAddBcPtrnParams->ucPatternMask,
7889 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize);
7890 }
7891 else
7892 {
7893 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPattern,
7894 pWowlAddBcPtrnParams->ucPattern,
7895 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7896 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMask,
7897 pWowlAddBcPtrnParams->ucPatternMask,
7898 WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7899
7900 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternExt,
7901 pWowlAddBcPtrnParams->ucPatternExt,
7902 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7903 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskExt,
7904 pWowlAddBcPtrnParams->ucPatternMaskExt,
7905 wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.ucPatternMaskSize - WDI_WOWL_BCAST_PATTERN_MAX_SIZE);
7906 }
7907
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007908 vos_mem_copy(wdiWowlAddBcPtrnInfo->wdiWowlAddBcPtrnInfo.bssId,
7909 pWowlAddBcPtrnParams->bssId, sizeof(wpt_macAddr));
7910
Jeff Johnson295189b2012-06-20 16:38:30 -07007911 wdiWowlAddBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007912 /* Store param pointer as passed in by caller */
7913 /* store Params pass it to WDI */
7914 pWdaParams->wdaWdiApiMsgParam = wdiWowlAddBcPtrnInfo;
7915 pWdaParams->pWdaContext = pWDA;
7916 pWdaParams->wdaMsgParam = pWowlAddBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007917 wstatus = WDI_WowlAddBcPtrnReq(wdiWowlAddBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007918 (WDI_WowlAddBcPtrnCb)WDA_WowlAddBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007919 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07007920 {
7921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7922 "Failure in Wowl add Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07007923 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07007924 vos_mem_free(pWdaParams->wdaMsgParam) ;
7925 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7926 vos_mem_free(pWdaParams) ;
7927 }
Jeff Johnson43971f52012-07-17 12:26:56 -07007928 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007929
7930}/*WDA_ProcessWowlAddBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07007931/*
7932 * FUNCTION: WDA_WowlDelBcPtrnReqCallback
7933 *
7934 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007935void WDA_WowlDelBcPtrnReqCallback(
7936 WDI_WowlDelBcPtrnRspParamsType *pWdiWowlDelBcstPtrRsp,
7937 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07007938{
7939 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07007940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7941 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007942 if(NULL == pWdaParams)
7943 {
7944 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7945 "%s: pWdaParams received NULL", __FUNCTION__);
7946 VOS_ASSERT(0) ;
7947 return ;
7948 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007949 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
7950 vos_mem_free(pWdaParams->wdaMsgParam);
7951 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007952 return ;
7953}
Jeff Johnson295189b2012-06-20 16:38:30 -07007954/*
7955 * FUNCTION: WDA_ProcessWowlDelBcPtrnReq
7956 * Request to WDI to delete WOWL Bcast pattern
7957 */
7958VOS_STATUS WDA_ProcessWowlDelBcPtrnReq(tWDA_CbContext *pWDA,
7959 tSirWowlDelBcastPtrn *pWowlDelBcPtrnParams)
7960{
7961 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07007962 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07007963 WDI_WowlDelBcPtrnReqParamsType *wdiWowlDelBcPtrnInfo =
7964 (WDI_WowlDelBcPtrnReqParamsType *)vos_mem_malloc(
7965 sizeof(WDI_WowlDelBcPtrnReqParamsType)) ;
7966 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07007967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
7968 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07007969 if(NULL == wdiWowlDelBcPtrnInfo)
7970 {
7971 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7972 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7973 VOS_ASSERT(0);
7974 return VOS_STATUS_E_NOMEM;
7975 }
7976 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
7977 if(NULL == pWdaParams)
7978 {
7979 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
7980 "%s: VOS MEM Alloc Failure", __FUNCTION__);
7981 VOS_ASSERT(0);
7982 vos_mem_free(wdiWowlDelBcPtrnInfo);
7983 return VOS_STATUS_E_NOMEM;
7984 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007985 wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.ucPatternId =
7986 pWowlDelBcPtrnParams->ucPatternId;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07007987
7988 vos_mem_copy(wdiWowlDelBcPtrnInfo->wdiWowlDelBcPtrnInfo.bssId,
7989 pWowlDelBcPtrnParams->bssId, sizeof(wpt_macAddr));
7990
Jeff Johnson295189b2012-06-20 16:38:30 -07007991 wdiWowlDelBcPtrnInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07007992 /* Store param pointer as passed in by caller */
7993 /* store Params pass it to WDI */
7994 pWdaParams->wdaWdiApiMsgParam = wdiWowlDelBcPtrnInfo;
7995 pWdaParams->pWdaContext = pWDA;
7996 pWdaParams->wdaMsgParam = pWowlDelBcPtrnParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07007997 wstatus = WDI_WowlDelBcPtrnReq(wdiWowlDelBcPtrnInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07007998 (WDI_WowlDelBcPtrnCb)WDA_WowlDelBcPtrnReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07007999 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008000 {
8001 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8002 "Failure in Wowl delete Bcast ptrn REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008003 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008004 vos_mem_free(pWdaParams->wdaMsgParam) ;
8005 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8006 vos_mem_free(pWdaParams) ;
8007 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008008 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008009
8010}/*WDA_ProcessWowlDelBcPtrnReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008011/*
8012 * FUNCTION: WDA_WowlEnterReqCallback
8013 *
8014 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008015void WDA_WowlEnterReqCallback(WDI_WowlEnterRspParamsType *pwdiWowlEnterRspParam, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008016{
8017 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8018 tWDA_CbContext *pWDA;
8019 tSirHalWowlEnterParams *pWowlEnterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07008020 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8021 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008022 if(NULL == pWdaParams)
8023 {
8024 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8025 "%s: pWdaParams received NULL", __FUNCTION__);
8026 VOS_ASSERT(0) ;
8027 return ;
8028 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008029 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8030 pWowlEnterParams = (tSirHalWowlEnterParams *)pWdaParams->wdaMsgParam ;
8031
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008032 pWowlEnterParams->bssIdx = pwdiWowlEnterRspParam->bssIdx;
8033
Jeff Johnson295189b2012-06-20 16:38:30 -07008034 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8035 vos_mem_free(pWdaParams) ;
8036
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008037 pWowlEnterParams->status =
8038 CONVERT_WDI2SIR_STATUS(pwdiWowlEnterRspParam->status);
Jeff Johnson295189b2012-06-20 16:38:30 -07008039 WDA_SendMsg(pWDA, WDA_WOWL_ENTER_RSP, (void *)pWowlEnterParams , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008040 return ;
8041}
Jeff Johnson295189b2012-06-20 16:38:30 -07008042/*
8043 * FUNCTION: WDA_ProcessWowlEnterReq
8044 * Request to WDI to enter WOWL
8045 */
8046VOS_STATUS WDA_ProcessWowlEnterReq(tWDA_CbContext *pWDA,
8047 tSirHalWowlEnterParams *pWowlEnterParams)
8048{
8049 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008050 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008051 WDI_WowlEnterReqParamsType *wdiWowlEnterInfo =
8052 (WDI_WowlEnterReqParamsType *)vos_mem_malloc(
8053 sizeof(WDI_WowlEnterReqParamsType)) ;
8054 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008055 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8056 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008057 if(NULL == wdiWowlEnterInfo)
8058 {
8059 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8060 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8061 VOS_ASSERT(0);
8062 return VOS_STATUS_E_NOMEM;
8063 }
8064 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8065 if(NULL == pWdaParams)
8066 {
8067 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8068 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8069 VOS_ASSERT(0);
8070 vos_mem_free(wdiWowlEnterInfo);
8071 return VOS_STATUS_E_NOMEM;
8072 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008073 vos_mem_copy(wdiWowlEnterInfo->wdiWowlEnterInfo.magicPtrn,
8074 pWowlEnterParams->magicPtrn,
8075 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07008076 wdiWowlEnterInfo->wdiWowlEnterInfo.ucMagicPktEnable =
8077 pWowlEnterParams->ucMagicPktEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07008078 wdiWowlEnterInfo->wdiWowlEnterInfo.ucPatternFilteringEnable =
8079 pWowlEnterParams->ucPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07008080 wdiWowlEnterInfo->wdiWowlEnterInfo.ucUcastPatternFilteringEnable =
8081 pWowlEnterParams->ucUcastPatternFilteringEnable;
Jeff Johnson295189b2012-06-20 16:38:30 -07008082 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowChnlSwitchRcv =
8083 pWowlEnterParams->ucWowChnlSwitchRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07008084 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDeauthRcv =
8085 pWowlEnterParams->ucWowDeauthRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07008086 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowDisassocRcv =
8087 pWowlEnterParams->ucWowDisassocRcv;
Jeff Johnson295189b2012-06-20 16:38:30 -07008088 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxMissedBeacons =
8089 pWowlEnterParams->ucWowMaxMissedBeacons;
Jeff Johnson295189b2012-06-20 16:38:30 -07008090 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowMaxSleepUsec =
8091 pWowlEnterParams->ucWowMaxSleepUsec;
Jeff Johnson295189b2012-06-20 16:38:30 -07008092#ifdef WLAN_WAKEUP_EVENTS
8093 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPIDRequestEnable =
8094 pWowlEnterParams->ucWoWEAPIDRequestEnable;
8095
8096 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWEAPOL4WayEnable =
8097 pWowlEnterParams->ucWoWEAPOL4WayEnable;
8098
8099 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowNetScanOffloadMatch =
8100 pWowlEnterParams->ucWowNetScanOffloadMatch;
8101
8102 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWowGTKRekeyError =
8103 pWowlEnterParams->ucWowGTKRekeyError;
8104
8105 wdiWowlEnterInfo->wdiWowlEnterInfo.ucWoWBSSConnLoss =
8106 pWowlEnterParams->ucWoWBSSConnLoss;
8107#endif // WLAN_WAKEUP_EVENTS
8108
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008109 wdiWowlEnterInfo->wdiWowlEnterInfo.bssIdx =
8110 pWowlEnterParams->bssIdx;
8111
Jeff Johnson295189b2012-06-20 16:38:30 -07008112 wdiWowlEnterInfo->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008113 /* Store param pointer as passed in by caller */
8114 /* store Params pass it to WDI */
8115 pWdaParams->wdaWdiApiMsgParam = wdiWowlEnterInfo;
8116 pWdaParams->pWdaContext = pWDA;
8117 pWdaParams->wdaMsgParam = pWowlEnterParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008118 wstatus = WDI_WowlEnterReq(wdiWowlEnterInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -07008119 (WDI_WowlEnterReqCb)WDA_WowlEnterReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008120 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008121 {
8122 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8123 "Failure in Wowl enter REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008124 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008125 vos_mem_free(pWdaParams->wdaMsgParam) ;
8126 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8127 vos_mem_free(pWdaParams) ;
8128 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008129 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008130
8131}/*WDA_ProcessWowlEnterReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008132/*
8133 * FUNCTION: WDA_WowlExitReqCallback
8134 *
8135 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008136void WDA_WowlExitReqCallback( WDI_WowlExitRspParamsType *pwdiWowlExitRsp, void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008137{
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008138 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8139 tWDA_CbContext *pWDA;
8140 tSirHalWowlExitParams *pWowlExitParams;
8141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8142 "<------ %s " ,__FUNCTION__);
8143 if(NULL == pWdaParams)
8144 {
8145 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8146 "%s: pWdaParams received NULL", __FUNCTION__);
8147 VOS_ASSERT(0) ;
8148 return ;
8149 }
8150 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8151 pWowlExitParams = (tSirHalWowlExitParams *)pWdaParams->wdaMsgParam ;
8152
8153 pWowlExitParams->bssIdx = pwdiWowlExitRsp->bssIdx;
8154 pWowlExitParams->status = CONVERT_WDI2SIR_STATUS(pwdiWowlExitRsp->status);
8155
8156 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8157 vos_mem_free(pWdaParams) ;
8158
Jeff Johnson295189b2012-06-20 16:38:30 -07008159 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8160 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008161 WDA_SendMsg(pWDA, WDA_WOWL_EXIT_RSP, (void *)pWowlExitParams, 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008162 return ;
8163}
Jeff Johnson295189b2012-06-20 16:38:30 -07008164/*
8165 * FUNCTION: WDA_ProcessWowlExitReq
8166 * Request to WDI to add WOWL Bcast pattern
8167 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008168VOS_STATUS WDA_ProcessWowlExitReq(tWDA_CbContext *pWDA,
8169 tSirHalWowlExitParams *pWowlExitParams)
Jeff Johnson295189b2012-06-20 16:38:30 -07008170{
8171 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008172 WDI_Status wstatus;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008173 WDI_WowlExitReqParamsType *wdiWowlExitInfo =
8174 (WDI_WowlExitReqParamsType *)vos_mem_malloc(
8175 sizeof(WDI_WowlExitReqParamsType)) ;
8176 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008177 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8178 "------> %s " ,__FUNCTION__);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008179 if(NULL == wdiWowlExitInfo)
8180 {
8181 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8182 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8183 VOS_ASSERT(0);
8184 return VOS_STATUS_E_NOMEM;
8185 }
8186 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8187 if(NULL == pWdaParams)
8188 {
8189 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8190 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8191 VOS_ASSERT(0);
8192 vos_mem_free(wdiWowlExitInfo);
8193 return VOS_STATUS_E_NOMEM;
8194 }
8195
8196 wdiWowlExitInfo->wdiWowlExitInfo.bssIdx =
8197 pWowlExitParams->bssIdx;
8198
8199 wdiWowlExitInfo->wdiReqStatusCB = NULL;
8200
8201 /* Store param pointer as passed in by caller */
8202 /* store Params pass it to WDI */
8203 pWdaParams->wdaWdiApiMsgParam = wdiWowlExitInfo;
8204 pWdaParams->pWdaContext = pWDA;
8205 pWdaParams->wdaMsgParam = pWowlExitParams;
8206
8207 wstatus = WDI_WowlExitReq(wdiWowlExitInfo,
8208 (WDI_WowlExitReqCb)WDA_WowlExitReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008209
Jeff Johnson43971f52012-07-17 12:26:56 -07008210 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008211 {
8212 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8213 "Failure in Wowl exit REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008214 status = CONVERT_WDI2VOS_STATUS(wstatus);
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008215 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8216 vos_mem_free(pWdaParams->wdaMsgParam);
8217 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008218 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008219 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008220}/*WDA_ProcessWowlExitReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008221/*
8222 * FUNCTION: WDA_IsHwFrameTxTranslationCapable
8223 * Request to WDI to determine whether a given station is capable of
8224 * using HW-based frame translation
8225 */
8226v_BOOL_t WDA_IsHwFrameTxTranslationCapable(v_PVOID_t pVosGCtx,
8227 tANI_U8 staIdx)
8228{
8229 return WDI_IsHwFrameTxTranslationCapable(staIdx);
8230}
Jeff Johnson295189b2012-06-20 16:38:30 -07008231/*
8232 * FUNCTION: WDA_NvDownloadReqCallback
8233 * send NV Download RSP back to PE
8234 */
8235void WDA_NvDownloadReqCallback(WDI_NvDownloadRspInfoType *pNvDownloadRspParams,
8236 void* pUserData)
8237{
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008238
8239 tWDA_ReqParams *pWdaParams= ( tWDA_ReqParams *)pUserData;
8240 tWDA_CbContext *pWDA;
8241
Jeff Johnson295189b2012-06-20 16:38:30 -07008242 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8243 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008244
8245 if(NULL == pWdaParams)
8246 {
8247 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8248 "%s: pWdaParams received NULL", __FUNCTION__);
8249 VOS_ASSERT(0) ;
8250 return ;
8251 }
8252
8253 pWDA = pWdaParams->pWdaContext;
8254
Jeff Johnson295189b2012-06-20 16:38:30 -07008255 /*Cleaning */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008256 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8257 vos_mem_free(pWdaParams);
8258
Jeff Johnson295189b2012-06-20 16:38:30 -07008259 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008260 return ;
8261}
Jeff Johnson295189b2012-06-20 16:38:30 -07008262/*
8263 * FUNCTION: WDA_ProcessNvDownloadReq
8264 * Read the NV blob to a buffer and send a request to WDI to download the blob to NV memory.
8265 */
8266VOS_STATUS WDA_NVDownload_Start(v_PVOID_t pVosContext)
8267{
8268 /* Initialize the local Variables*/
8269 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
8270 v_VOID_t *pNvBuffer=NULL;
8271 v_SIZE_t bufferSize = 0;
8272 WDI_Status status = WDI_STATUS_E_FAILURE;
8273 WDI_NvDownloadReqParamsType * wdiNvDownloadReqParam =NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008274 tWDA_ReqParams *pWdaParams ;
8275
Jeff Johnson295189b2012-06-20 16:38:30 -07008276 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8277 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008278 if(NULL == pWDA)
8279 {
8280 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8281 "%s:pWDA is NULL", __FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008282 VOS_ASSERT(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07008283 return VOS_STATUS_E_FAILURE;
8284 }
8285
8286 /* Get the NV structure base address and size from VOS */
8287 vos_nv_getNVBuffer(&pNvBuffer,&bufferSize);
Jeff Johnson295189b2012-06-20 16:38:30 -07008288 wdiNvDownloadReqParam = (WDI_NvDownloadReqParamsType *)vos_mem_malloc(
8289 sizeof(WDI_NvDownloadReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008290 if(NULL == wdiNvDownloadReqParam)
8291 {
8292 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8293 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8294 VOS_ASSERT(0);
8295 return VOS_STATUS_E_NOMEM;
8296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008297 /* Copy Params to wdiNvDownloadReqParam*/
8298 wdiNvDownloadReqParam->wdiBlobInfo.pBlobAddress = pNvBuffer;
8299 wdiNvDownloadReqParam->wdiBlobInfo.uBlobSize = bufferSize;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008300
8301 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8302 if(NULL == pWdaParams)
8303 {
8304 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8305 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8306 VOS_ASSERT(0);
8307 vos_mem_free(wdiNvDownloadReqParam);
8308 return VOS_STATUS_E_NOMEM;
8309 }
8310
Jeff Johnson295189b2012-06-20 16:38:30 -07008311 /* store Params pass it to WDI */
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008312 pWdaParams->wdaWdiApiMsgParam = (void *)wdiNvDownloadReqParam ;
8313 pWdaParams->wdaMsgParam = NULL;
8314 pWdaParams->pWdaContext = pWDA;
8315
8316
Jeff Johnson295189b2012-06-20 16:38:30 -07008317 wdiNvDownloadReqParam->wdiReqStatusCB = NULL ;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008318
Jeff Johnson295189b2012-06-20 16:38:30 -07008319 status = WDI_NvDownloadReq(wdiNvDownloadReqParam,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008320 (WDI_NvDownloadRspCb)WDA_NvDownloadReqCallback,(void *)pWdaParams);
8321
Jeff Johnson295189b2012-06-20 16:38:30 -07008322 if(IS_WDI_STATUS_FAILURE(status))
8323 {
8324 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8325 "Failure in NV Download REQ Params WDI API, free all the memory " );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008326 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8327 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008328 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008329 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008330}
8331/*
8332 * FUNCTION: WDA_FlushAcReqCallback
8333 * send Flush AC RSP back to TL
8334 */
8335void WDA_FlushAcReqCallback(WDI_Status status, void* pUserData)
8336{
8337 vos_msg_t wdaMsg = {0} ;
8338 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8339 tFlushACReq *pFlushACReqParams;
8340 tFlushACRsp *pFlushACRspParams;
Jeff Johnson295189b2012-06-20 16:38:30 -07008341 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8342 "<------ %s " ,__FUNCTION__);
8343 if(NULL == pWdaParams)
8344 {
8345 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8346 "%s: pWdaParams received NULL", __FUNCTION__);
8347 VOS_ASSERT(0) ;
8348 return ;
8349 }
8350
8351 pFlushACReqParams = (tFlushACReq *)pWdaParams->wdaMsgParam;
8352 pFlushACRspParams = vos_mem_malloc(sizeof(tFlushACRsp));
8353 if(NULL == pFlushACRspParams)
8354 {
8355 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8356 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8357 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07008358 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008359 return ;
8360 }
8361 vos_mem_zero(pFlushACRspParams,sizeof(tFlushACRsp));
8362 pFlushACRspParams->mesgLen = sizeof(tFlushACRsp);
8363 pFlushACRspParams->mesgType = WDA_TL_FLUSH_AC_RSP;
8364 pFlushACRspParams->ucSTAId = pFlushACReqParams->ucSTAId;
8365 pFlushACRspParams->ucTid = pFlushACReqParams->ucTid;
8366 pFlushACRspParams->status = CONVERT_WDI2SIR_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008367 vos_mem_free(pWdaParams->wdaMsgParam) ;
8368 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8369 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008370 wdaMsg.type = WDA_TL_FLUSH_AC_RSP ;
8371 wdaMsg.bodyptr = (void *)pFlushACRspParams;
8372 // POST message to TL
8373 vos_mq_post_message(VOS_MQ_ID_TL, (vos_msg_t *) &wdaMsg);
8374
Jeff Johnson295189b2012-06-20 16:38:30 -07008375 return ;
8376}
Jeff Johnson295189b2012-06-20 16:38:30 -07008377/*
8378 * FUNCTION: WDA_ProcessFlushAcReq
8379 * Request to WDI to Update the DELBA REQ params.
8380 */
8381VOS_STATUS WDA_ProcessFlushAcReq(tWDA_CbContext *pWDA,
8382 tFlushACReq *pFlushAcReqParams)
8383{
8384 WDI_Status status = WDI_STATUS_SUCCESS ;
8385 WDI_FlushAcReqParamsType *wdiFlushAcReqParam =
8386 (WDI_FlushAcReqParamsType *)vos_mem_malloc(
8387 sizeof(WDI_FlushAcReqParamsType)) ;
8388 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008389 if(NULL == wdiFlushAcReqParam)
8390 {
8391 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8392 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8393 VOS_ASSERT(0);
8394 return VOS_STATUS_E_NOMEM;
8395 }
8396 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8397 if(NULL == pWdaParams)
8398 {
8399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8400 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8401 VOS_ASSERT(0);
8402 vos_mem_free(wdiFlushAcReqParam);
8403 return VOS_STATUS_E_NOMEM;
8404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008405 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8406 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008407 wdiFlushAcReqParam->wdiFlushAcInfo.ucSTAId = pFlushAcReqParams->ucSTAId;
8408 wdiFlushAcReqParam->wdiFlushAcInfo.ucTid = pFlushAcReqParams->ucTid;
8409 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgLen = pFlushAcReqParams->mesgLen;
8410 wdiFlushAcReqParam->wdiFlushAcInfo.usMesgType = pFlushAcReqParams->mesgType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008411 /* Store Flush AC pointer, as this will be used for response */
8412 /* store Params pass it to WDI */
8413 pWdaParams->pWdaContext = pWDA;
8414 pWdaParams->wdaMsgParam = pFlushAcReqParams;
8415 pWdaParams->wdaWdiApiMsgParam = wdiFlushAcReqParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008416 status = WDI_FlushAcReq(wdiFlushAcReqParam,
8417 (WDI_FlushAcRspCb)WDA_FlushAcReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008418 if(IS_WDI_STATUS_FAILURE(status))
8419 {
8420 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8421 "Failure in Flush AC REQ Params WDI API, free all the memory " );
8422 vos_mem_free(pWdaParams->wdaMsgParam) ;
8423 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8424 vos_mem_free(pWdaParams) ;
8425 //TODO: respond to TL with failure
8426 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008427 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008428}
Jeff Johnson295189b2012-06-20 16:38:30 -07008429/*
8430 * FUNCTION: WDA_BtAmpEventReqCallback
8431 *
8432 */
8433void WDA_BtAmpEventReqCallback(WDI_Status status, void* pUserData)
8434{
8435 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8436 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008437 WDI_BtAmpEventParamsType *wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008438
8439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8440 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008441 if(NULL == pWdaParams)
8442 {
8443 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8444 "%s: pWdaParams received NULL", __FUNCTION__);
8445 VOS_ASSERT(0) ;
8446 return ;
8447 }
8448 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8449 wdiBtAmpEventParam = (WDI_BtAmpEventParamsType *)pWdaParams->wdaWdiApiMsgParam;
8450 if(BTAMP_EVENT_CONNECTION_TERMINATED ==
8451 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8452 {
8453 pWDA->wdaAmpSessionOn = VOS_FALSE;
8454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008455 vos_mem_free(pWdaParams->wdaMsgParam) ;
8456 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8457 vos_mem_free(pWdaParams) ;
8458 /*
8459 * No respone required for WDA_SIGNAL_BTAMP_EVENT so just free the request
8460 * param here
8461 */
Jeff Johnson295189b2012-06-20 16:38:30 -07008462 return ;
8463}
8464
Jeff Johnson295189b2012-06-20 16:38:30 -07008465/*
8466 * FUNCTION: WDA_ProcessBtAmpEventReq
8467 * Request to WDI to Update with BT AMP events.
8468 */
8469VOS_STATUS WDA_ProcessBtAmpEventReq(tWDA_CbContext *pWDA,
8470 tSmeBtAmpEvent *pBtAmpEventParams)
8471{
8472 WDI_Status status = WDI_STATUS_SUCCESS ;
8473 WDI_BtAmpEventParamsType *wdiBtAmpEventParam =
8474 (WDI_BtAmpEventParamsType *)vos_mem_malloc(
8475 sizeof(WDI_BtAmpEventParamsType)) ;
8476 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008477 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8478 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008479 if(NULL == wdiBtAmpEventParam)
8480 {
8481 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8482 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8483 VOS_ASSERT(0);
8484 return VOS_STATUS_E_NOMEM;
8485 }
8486 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8487 if(NULL == pWdaParams)
8488 {
8489 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8490 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8491 VOS_ASSERT(0);
8492 vos_mem_free(wdiBtAmpEventParam);
8493 return VOS_STATUS_E_NOMEM;
8494 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008495 wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType =
8496 pBtAmpEventParams->btAmpEventType;
Jeff Johnson295189b2012-06-20 16:38:30 -07008497 wdiBtAmpEventParam->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008498 /* Store BT AMP event pointer, as this will be used for response */
8499 /* store Params pass it to WDI */
8500 pWdaParams->pWdaContext = pWDA;
8501 pWdaParams->wdaMsgParam = pBtAmpEventParams;
8502 pWdaParams->wdaWdiApiMsgParam = wdiBtAmpEventParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008503 status = WDI_BtAmpEventReq(wdiBtAmpEventParam,
8504 (WDI_BtAmpEventRspCb)WDA_BtAmpEventReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008505 if(IS_WDI_STATUS_FAILURE(status))
8506 {
8507 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8508 "Failure in BT AMP event REQ Params WDI API, free all the memory " );
8509 vos_mem_free(pWdaParams->wdaMsgParam) ;
8510 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8511 vos_mem_free(pWdaParams) ;
8512 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008513 if(BTAMP_EVENT_CONNECTION_START == wdiBtAmpEventParam->wdiBtAmpEventInfo.ucBtAmpEventType)
8514 {
8515 pWDA->wdaAmpSessionOn = VOS_TRUE;
8516 }
8517 return CONVERT_WDI2VOS_STATUS(status) ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008518}
8519
Jeff Johnson295189b2012-06-20 16:38:30 -07008520#ifdef ANI_MANF_DIAG
8521/*
8522 * FUNCTION: WDA_FTMCommandReqCallback
8523 * Handle FTM CMD response came from HAL
8524 * Route responce to HDD FTM
8525 */
8526void WDA_FTMCommandReqCallback(void *ftmCmdRspData,
8527 void *usrData)
8528{
8529 tWDA_CbContext *pWDA = (tWDA_CbContext *)usrData ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008530 if((NULL == pWDA) || (NULL == ftmCmdRspData))
8531 {
8532 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8533 "%s, invalid input 0x%x, 0x%x",__FUNCTION__, pWDA, ftmCmdRspData);
8534 return;
8535 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008536 /* Release Current FTM Command Request */
8537 vos_mem_free(pWDA->wdaFTMCmdReq);
8538 pWDA->wdaFTMCmdReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008539#ifndef WLAN_FTM_STUB
8540 /* Post FTM Responce to HDD FTM */
8541 wlan_sys_ftm(ftmCmdRspData);
8542#endif /* WLAN_FTM_STUB */
Jeff Johnson295189b2012-06-20 16:38:30 -07008543 return;
8544}
Jeff Johnson295189b2012-06-20 16:38:30 -07008545/*
8546 * FUNCTION: WDA_ProcessFTMCommand
8547 * Send FTM command to WDI
8548 */
8549VOS_STATUS WDA_ProcessFTMCommand(tWDA_CbContext *pWDA,
8550 tPttMsgbuffer *pPTTFtmCmd)
8551{
8552 WDI_Status status = WDI_STATUS_SUCCESS;
8553 WDI_FTMCommandReqType *ftmCMDReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008554 ftmCMDReq = (WDI_FTMCommandReqType *)
8555 vos_mem_malloc(sizeof(WDI_FTMCommandReqType));
8556 if(NULL == ftmCMDReq)
8557 {
8558 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8559 "WDA FTM Command buffer alloc fail");
8560 return VOS_STATUS_E_NOMEM;
8561 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008562 ftmCMDReq->bodyLength = pPTTFtmCmd->msgBodyLength;
8563 ftmCMDReq->FTMCommandBody = (void *)pPTTFtmCmd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008564 pWDA->wdaFTMCmdReq = (void *)ftmCMDReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07008565 /* Send command to WDI */
8566 status = WDI_FTMCommandReq(ftmCMDReq, WDA_FTMCommandReqCallback, pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07008567 return status;
8568}
8569#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07008570#ifdef FEATURE_OEM_DATA_SUPPORT
8571/*
8572 * FUNCTION: WDA_StartOemDataReqCallback
8573 *
8574 */
8575void WDA_StartOemDataReqCallback(
8576 WDI_oemDataRspParamsType *wdiOemDataRspParams,
8577 void* pUserData)
8578{
8579 VOS_STATUS status = VOS_STATUS_E_FAILURE;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008580 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8581 tWDA_CbContext *pWDA;
Jeff Johnsone7245742012-09-05 17:12:55 -07008582 tStartOemDataRsp *pOemDataRspParams = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008583
Jeff Johnsone7245742012-09-05 17:12:55 -07008584 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8585 "<------ %s " ,__FUNCTION__);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008586
8587 if(NULL == pWdaParams)
8588 {
8589 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8590 "%s: pWdaParams received NULL", __FUNCTION__);
8591 VOS_ASSERT(0) ;
8592 return ;
8593 }
8594 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
8595
Jeff Johnsone7245742012-09-05 17:12:55 -07008596 if(NULL == pWDA)
8597 {
8598 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8599 "%s:pWDA is NULL", __FUNCTION__);
8600 VOS_ASSERT(0);
8601 return ;
8602 }
8603
8604 /*
8605 * Allocate memory for response params sent to PE
8606 */
8607 pOemDataRspParams = vos_mem_malloc(sizeof(tStartOemDataRsp));
8608
8609 // Check if memory is allocated for OemdataMeasRsp Params.
8610 if(NULL == pOemDataRspParams)
8611 {
8612 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8613 "OEM DATA WDA callback alloc fail");
8614 VOS_ASSERT(0) ;
8615 return;
8616 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008617
Jeff Johnsone7245742012-09-05 17:12:55 -07008618 // Free the memory allocated during request.
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008619 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8620 vos_mem_free(pWdaParams->wdaMsgParam);
8621 vos_mem_free(pWdaParams) ;
8622
Jeff Johnsone7245742012-09-05 17:12:55 -07008623 /*
8624 * Now go ahead and copy other stuff for PE in incase of sucess only
8625 * Also, here success always means that we have atleast one BSSID.
8626 */
8627 vos_mem_copy(pOemDataRspParams->oemDataRsp, wdiOemDataRspParams->oemDataRsp, OEM_DATA_RSP_SIZE);
8628
8629 //enable Tx
8630 status = WDA_ResumeDataTx(pWDA);
8631 if(status != VOS_STATUS_SUCCESS)
8632 {
8633 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_FATAL, "WDA Resume Data Tx fail");
8634 }
8635 WDA_SendMsg(pWDA, WDA_START_OEM_DATA_RSP, (void *)pOemDataRspParams, 0) ;
8636 return ;
8637}
8638/*
8639 * FUNCTION: WDA_ProcessStartOemDataReq
8640 * Send Start Oem Data Req to WDI
8641 */
8642VOS_STATUS WDA_ProcessStartOemDataReq(tWDA_CbContext *pWDA,
8643 tStartOemDataReq *pOemDataReqParams)
8644{
8645 WDI_Status status = WDI_STATUS_SUCCESS;
8646 WDI_oemDataReqParamsType *wdiOemDataReqParams = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008647 tWDA_ReqParams *pWdaParams ;
Jeff Johnsone7245742012-09-05 17:12:55 -07008648
8649 wdiOemDataReqParams = (WDI_oemDataReqParamsType*)vos_mem_malloc(sizeof(WDI_oemDataReqParamsType)) ;
8650
8651 if(NULL == wdiOemDataReqParams)
8652 {
8653 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8654 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8655 VOS_ASSERT(0);
8656 return VOS_STATUS_E_NOMEM;
8657 }
8658
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008659 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.selfMacAddr,
8660 pOemDataReqParams->selfMacAddr, sizeof(tSirMacAddr));
8661 vos_mem_copy(wdiOemDataReqParams->wdiOemDataReqInfo.oemDataReq,
8662 pOemDataReqParams->oemDataReq, OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07008663
8664 wdiOemDataReqParams->wdiReqStatusCB = NULL;
8665
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008666 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8667 if(NULL == pWdaParams)
Jeff Johnsone7245742012-09-05 17:12:55 -07008668 {
8669 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008670 "%s: VOS MEM Alloc Failure", __FUNCTION__);
Jeff Johnsone7245742012-09-05 17:12:55 -07008671 vos_mem_free(wdiOemDataReqParams);
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008672 vos_mem_free(pOemDataReqParams);
8673 VOS_ASSERT(0);
8674 return VOS_STATUS_E_NOMEM;
Jeff Johnsone7245742012-09-05 17:12:55 -07008675 }
Jeff Johnsone7245742012-09-05 17:12:55 -07008676
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008677 pWdaParams->wdaMsgParam = (void *)pOemDataReqParams;
8678 pWdaParams->wdaWdiApiMsgParam = (void *)wdiOemDataReqParams;
8679
8680 status = WDI_StartOemDataReq(wdiOemDataReqParams,
8681 (WDI_oemDataRspCb)WDA_StartOemDataReqCallback, pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -07008682
8683 if(IS_WDI_STATUS_FAILURE(status))
8684 {
8685 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8686 "Failure in Start OEM DATA REQ Params WDI API, free all the memory " );
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -07008687 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8688 vos_mem_free(pWdaParams->wdaMsgParam);
8689 vos_mem_free(pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -07008690 }
8691 return CONVERT_WDI2VOS_STATUS(status) ;
8692}
8693#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07008694/*
8695 * FUNCTION: WDA_SetTxPerTrackingReqCallback
8696 *
8697 */
8698void WDA_SetTxPerTrackingReqCallback(WDI_Status status, void* pUserData)
8699{
8700 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008701 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8702 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008703 if(NULL == pWdaParams)
8704 {
8705 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8706 "%s: pWdaParams received NULL", __FUNCTION__);
8707 VOS_ASSERT(0) ;
8708 return ;
8709 }
8710
8711 if(NULL != pWdaParams->wdaMsgParam)
8712 {
8713 vos_mem_free(pWdaParams->wdaMsgParam);
8714 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008715 if(NULL != pWdaParams->wdaWdiApiMsgParam)
8716 {
8717 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8718 }
8719
8720 vos_mem_free(pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07008721 return ;
8722}
Jeff Johnson295189b2012-06-20 16:38:30 -07008723#ifdef WLAN_FEATURE_GTK_OFFLOAD
8724/*
8725 * FUNCTION: WDA_HostOffloadReqCallback
8726 *
8727 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008728void WDA_GTKOffloadReqCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparams,
8729 void* pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008730{
8731 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8732
8733 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8734 "<------ %s " ,__FUNCTION__);
8735
8736 VOS_ASSERT(NULL != pWdaParams);
8737
8738 vos_mem_free(pWdaParams->wdaMsgParam) ;
8739 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8740 vos_mem_free(pWdaParams) ;
8741
8742 //print a msg, nothing else to do
8743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8744 "WDA_GTKOffloadReqCallback invoked " );
8745
8746 return ;
8747}
8748
8749/*
8750 * FUNCTION: WDA_ProcessGTKOffloadReq
8751 * Request to WDI to set the filter to minimize unnecessary host wakeup due
8752 * to broadcast traffic (sta mode).
8753 */
8754VOS_STATUS WDA_ProcessGTKOffloadReq(tWDA_CbContext *pWDA,
8755 tpSirGtkOffloadParams pGtkOffloadParams)
8756{
8757 VOS_STATUS status = VOS_STATUS_SUCCESS;
8758 WDI_GtkOffloadReqMsg *wdiGtkOffloadReqMsg =
8759 (WDI_GtkOffloadReqMsg *)vos_mem_malloc(
8760 sizeof(WDI_GtkOffloadReqMsg)) ;
8761 tWDA_ReqParams *pWdaParams ;
8762
8763 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8764 "------> %s " ,__FUNCTION__);
8765
8766 if(NULL == wdiGtkOffloadReqMsg)
8767 {
8768 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8769 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8770 VOS_ASSERT(0);
8771 return VOS_STATUS_E_NOMEM;
8772 }
8773
8774 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8775 if(NULL == pWdaParams)
8776 {
8777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8778 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8779 VOS_ASSERT(0);
8780 vos_mem_free(wdiGtkOffloadReqMsg);
8781 return VOS_STATUS_E_NOMEM;
8782 }
8783
8784 //
8785 // Fill wdiGtkOffloadInfo from pGtkOffloadParams
8786 //
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008787
8788 vos_mem_copy(wdiGtkOffloadReqMsg->gtkOffloadReqParams.bssId,
8789 pGtkOffloadParams->bssId, sizeof(wpt_macAddr))
8790
Jeff Johnson295189b2012-06-20 16:38:30 -07008791 wdiGtkOffloadReqMsg->gtkOffloadReqParams.ulFlags = pGtkOffloadParams->ulFlags;
8792 // Copy KCK
8793 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKCK[0]), &(pGtkOffloadParams->aKCK[0]), 16);
8794 // Copy KEK
8795 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.aKEK[0]), &(pGtkOffloadParams->aKEK[0]), 16);
8796 // Copy KeyReplayCounter
8797 vos_mem_copy(&(wdiGtkOffloadReqMsg->gtkOffloadReqParams.ullKeyReplayCounter),
8798 &(pGtkOffloadParams->ullKeyReplayCounter), sizeof(v_U64_t));
8799
8800 wdiGtkOffloadReqMsg->wdiReqStatusCB = NULL;
8801
8802 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
8803 (NULL == pWDA->wdaWdiApiMsgParam));
8804
8805 /* Store Params pass it to WDI */
8806 pWdaParams->wdaWdiApiMsgParam = (void *)wdiGtkOffloadReqMsg;
8807 pWdaParams->pWdaContext = pWDA;
8808 /* Store param pointer as passed in by caller */
8809 pWdaParams->wdaMsgParam = pGtkOffloadParams;
8810
8811 status = WDI_GTKOffloadReq(wdiGtkOffloadReqMsg, (WDI_GtkOffloadCb)WDA_GTKOffloadReqCallback, pWdaParams);
8812
8813 if(IS_WDI_STATUS_FAILURE(status))
8814 {
8815 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8816 "Failure in WDA_ProcessGTKOffloadReq(), free all the memory " );
8817 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
8818 vos_mem_free(pWdaParams->wdaMsgParam);
8819 vos_mem_free(pWdaParams);
8820 }
8821
8822 return CONVERT_WDI2VOS_STATUS(status) ;
8823}
8824
8825/*
8826 * FUNCTION: WDA_GtkOffloadGetInfoCallback
8827 *
8828 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008829void WDA_GtkOffloadGetInfoCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkOffloadGetInfoRsparams,
8830 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -07008831{
8832 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
8833 tWDA_CbContext *pWDA;
8834 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoReq;
8835 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp = vos_mem_malloc(sizeof(tpSirGtkOffloadGetInfoRspParams)) ;
8836 tANI_U8 i;
8837 vos_msg_t vosMsg;
8838
8839 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8840 "<------ %s " ,__FUNCTION__);
8841
8842 VOS_ASSERT(NULL != pWdaParams);
8843
8844 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
8845 pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam;
8846
8847 // Fill pGtkOffloadGetInfoRsp from tSirGtkOffloadGetInfoRspParams
8848 vos_mem_zero(pGtkOffloadGetInfoRsp, sizeof(tSirGtkOffloadGetInfoRspParams));
8849
8850 /* Message Header */
8851 pGtkOffloadGetInfoRsp->mesgType = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8852 pGtkOffloadGetInfoRsp->mesgLen = sizeof(tpSirGtkOffloadGetInfoRspParams);
8853
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07008854 pGtkOffloadGetInfoRsp->ulStatus = pwdiGtkOffloadGetInfoRsparams->ulStatus;
8855 pGtkOffloadGetInfoRsp->ullKeyReplayCounter = pwdiGtkOffloadGetInfoRsparams->ullKeyReplayCounter;
8856 pGtkOffloadGetInfoRsp->ulTotalRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulTotalRekeyCount;
8857 pGtkOffloadGetInfoRsp->ulGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulGTKRekeyCount;
8858 pGtkOffloadGetInfoRsp->ulIGTKRekeyCount = pwdiGtkOffloadGetInfoRsparams->ulIGTKRekeyCount;
8859 pGtkOffloadGetInfoRsp->bssIdx = pwdiGtkOffloadGetInfoRsparams->bssIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -07008860
8861 /* VOS message wrapper */
8862 vosMsg.type = eWNI_PMC_GTK_OFFLOAD_GETINFO_RSP;
8863 vosMsg.bodyptr = (void *)pGtkOffloadGetInfoRsp;
8864 vosMsg.bodyval = 0;
8865
8866 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
8867 {
8868 /* free the mem and return */
8869 vos_mem_free((v_VOID_t *) pGtkOffloadGetInfoRsp);
8870 }
8871
8872 vos_mem_free(pWdaParams->wdaMsgParam) ;
8873 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8874 vos_mem_free(pWdaParams) ;
8875}
8876#endif
8877
8878/*
8879 * FUNCTION: WDA_ProcessSetTxPerTrackingReq
8880 * Request to WDI to set Tx Per Tracking configurations
8881 */
8882VOS_STATUS WDA_ProcessSetTxPerTrackingReq(tWDA_CbContext *pWDA, tSirTxPerTrackingParam *pTxPerTrackingParams)
8883{
8884 VOS_STATUS status = VOS_STATUS_SUCCESS;
Jeff Johnson43971f52012-07-17 12:26:56 -07008885 WDI_Status wstatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008886 WDI_SetTxPerTrackingReqParamsType *pwdiSetTxPerTrackingReqParams =
8887 (WDI_SetTxPerTrackingReqParamsType *)vos_mem_malloc(
8888 sizeof(WDI_SetTxPerTrackingReqParamsType)) ;
8889 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -07008890 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
8891 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -07008892 if(NULL == pwdiSetTxPerTrackingReqParams)
8893 {
8894 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8895 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8896 vos_mem_free(pTxPerTrackingParams);
8897 VOS_ASSERT(0);
8898 return VOS_STATUS_E_NOMEM;
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_mem_free(pwdiSetTxPerTrackingReqParams);
8906 vos_mem_free(pTxPerTrackingParams);
8907 VOS_ASSERT(0);
8908 return VOS_STATUS_E_NOMEM;
8909 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008910 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingEnable =
8911 pTxPerTrackingParams->ucTxPerTrackingEnable;
8912 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingPeriod =
8913 pTxPerTrackingParams->ucTxPerTrackingPeriod;
8914 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.ucTxPerTrackingRatio =
8915 pTxPerTrackingParams->ucTxPerTrackingRatio;
8916 pwdiSetTxPerTrackingReqParams->wdiTxPerTrackingParam.uTxPerTrackingWatermark =
8917 pTxPerTrackingParams->uTxPerTrackingWatermark;
Jeff Johnson295189b2012-06-20 16:38:30 -07008918 pwdiSetTxPerTrackingReqParams->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07008919 /* Store param pointer as passed in by caller */
8920 /* store Params pass it to WDI
8921 Ideally, the memory allocated here will be free at WDA_SetTxPerTrackingReqCallback */
8922 pWdaParams->wdaWdiApiMsgParam = pwdiSetTxPerTrackingReqParams;
8923 pWdaParams->pWdaContext = pWDA;
8924 pWdaParams->wdaMsgParam = pTxPerTrackingParams;
Jeff Johnson43971f52012-07-17 12:26:56 -07008925 wstatus = WDI_SetTxPerTrackingReq(pwdiSetTxPerTrackingReqParams,
Jeff Johnson295189b2012-06-20 16:38:30 -07008926 (WDI_SetTxPerTrackingRspCb)WDA_SetTxPerTrackingReqCallback, pWdaParams);
Jeff Johnson43971f52012-07-17 12:26:56 -07008927 if(IS_WDI_STATUS_FAILURE(wstatus))
Jeff Johnson295189b2012-06-20 16:38:30 -07008928 {
8929 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8930 "Failure in Set Tx PER REQ WDI API, free all the memory " );
Jeff Johnson43971f52012-07-17 12:26:56 -07008931 status = CONVERT_WDI2VOS_STATUS(wstatus);
Jeff Johnson295189b2012-06-20 16:38:30 -07008932 vos_mem_free(pWdaParams->wdaMsgParam) ;
8933 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8934 vos_mem_free(pWdaParams) ;
8935 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008936 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -07008937
8938}/*WDA_ProcessSetTxPerTrackingReq*/
Jeff Johnson295189b2012-06-20 16:38:30 -07008939/*
8940 * FUNCTION: WDA_HALDumpCmdCallback
8941 * Send the VOS complete .
8942 */
8943void WDA_HALDumpCmdCallback(WDI_HALDumpCmdRspParamsType *wdiRspParams,
8944 void* pUserData)
8945{
8946 tANI_U8 *buffer = NULL;
8947 tWDA_CbContext *pWDA = NULL;
8948 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07008949 if(NULL == pWdaParams)
8950 {
8951 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8952 "%s: pWdaParams received NULL", __FUNCTION__);
8953 VOS_ASSERT(0) ;
8954 return ;
8955 }
8956
8957 pWDA = pWdaParams->pWdaContext;
8958 buffer = (tANI_U8 *)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -07008959 if(wdiRspParams->usBufferLen > 0)
8960 {
8961 /*Copy the Resp data to UMAC supplied buffer*/
8962 vos_mem_copy(buffer, wdiRspParams->pBuffer, wdiRspParams->usBufferLen);
8963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008964 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
8965 vos_mem_free(pWdaParams);
8966
8967 /* Indicate VOSS about the start complete */
8968 vos_WDAComplete_cback(pWDA->pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -07008969 return ;
8970}
8971
Jeff Johnson295189b2012-06-20 16:38:30 -07008972/*
8973 * FUNCTION: WDA_ProcessHALDumpCmdReq
8974 * Send Dump command to WDI
8975 */
8976VOS_STATUS WDA_HALDumpCmdReq(tpAniSirGlobal pMac, tANI_U32 cmd,
8977 tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3,
8978 tANI_U32 arg4, tANI_U8 *pBuffer)
8979{
8980 WDI_Status status = WDI_STATUS_SUCCESS;
8981 WDI_HALDumpCmdReqParamsType *wdiHALDumpCmdReqParam = NULL;
8982 WDI_HALDumpCmdReqInfoType *wdiHalDumpCmdInfo = NULL ;
8983 tWDA_ReqParams *pWdaParams ;
8984 pVosContextType pVosContext = NULL;
8985 VOS_STATUS vStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -07008986 pVosContext = (pVosContextType)vos_get_global_context(VOS_MODULE_ID_PE,
8987 (void *)pMac);
8988
8989 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
8990 if(NULL == pWdaParams)
8991 {
8992 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
8993 "%s: VOS MEM Alloc Failure", __FUNCTION__);
8994 return VOS_STATUS_E_NOMEM;
8995 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008996 /* Allocate memory WDI request structure*/
8997 wdiHALDumpCmdReqParam = (WDI_HALDumpCmdReqParamsType *)
8998 vos_mem_malloc(sizeof(WDI_HALDumpCmdReqParamsType));
8999 if(NULL == wdiHALDumpCmdReqParam)
9000 {
9001 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9002 "WDA HAL DUMP Command buffer alloc fail");
9003 vos_mem_free(pWdaParams);
9004 return WDI_STATUS_E_FAILURE;
9005 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009006 wdiHalDumpCmdInfo = &wdiHALDumpCmdReqParam->wdiHALDumpCmdInfoType;
Jeff Johnson295189b2012-06-20 16:38:30 -07009007 /* Extract the arguments */
9008 wdiHalDumpCmdInfo->command = cmd;
9009 wdiHalDumpCmdInfo->argument1 = arg1;
9010 wdiHalDumpCmdInfo->argument2 = arg2;
9011 wdiHalDumpCmdInfo->argument3 = arg3;
9012 wdiHalDumpCmdInfo->argument4 = arg4;
Jeff Johnson295189b2012-06-20 16:38:30 -07009013 wdiHALDumpCmdReqParam->wdiReqStatusCB = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009014 pWdaParams->pWdaContext = pVosContext->pWDAContext;
9015
9016 /* Response message will be passed through the buffer */
9017 pWdaParams->wdaMsgParam = (void *)pBuffer;
9018
9019 /* store Params pass it to WDI */
9020 pWdaParams->wdaWdiApiMsgParam = (void *)wdiHALDumpCmdReqParam ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009021 /* Send command to WDI */
9022 status = WDI_HALDumpCmdReq(wdiHALDumpCmdReqParam, WDA_HALDumpCmdCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07009023 vStatus = vos_wait_single_event( &(pVosContext->wdaCompleteEvent), 1000 );
Jeff Johnson295189b2012-06-20 16:38:30 -07009024 if ( vStatus != VOS_STATUS_SUCCESS )
9025 {
9026 if ( vStatus == VOS_STATUS_E_TIMEOUT )
9027 {
9028 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
9029 "%s: Timeout occured before WDA_HALDUMP complete\n",__FUNCTION__);
9030 }
9031 else
9032 {
9033 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
9034 "%s: WDA_HALDUMP reporting other error \n",__FUNCTION__);
9035 }
9036 VOS_ASSERT(0);
9037 }
9038 return status;
9039}
Jeff Johnson295189b2012-06-20 16:38:30 -07009040#ifdef WLAN_FEATURE_GTK_OFFLOAD
9041/*
9042 * FUNCTION: WDA_ProcessGTKOffloadgetInfoReq
9043 * Request to WDI to get GTK Offload Information
9044 */
9045VOS_STATUS WDA_ProcessGTKOffloadGetInfoReq(tWDA_CbContext *pWDA,
9046 tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)
9047{
9048 VOS_STATUS status = VOS_STATUS_SUCCESS;
9049 WDI_GtkOffloadGetInfoReqMsg *pwdiGtkOffloadGetInfoReqMsg =
9050 (WDI_GtkOffloadGetInfoReqMsg *)vos_mem_malloc(sizeof(WDI_GtkOffloadGetInfoReqMsg));
9051 tWDA_ReqParams *pWdaParams ;
9052
9053 if(NULL == pwdiGtkOffloadGetInfoReqMsg)
9054 {
9055 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9056 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9057 VOS_ASSERT(0);
9058 return VOS_STATUS_E_NOMEM;
9059 }
9060
9061 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
9062 if(NULL == pWdaParams)
9063 {
9064 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9065 "%s: VOS MEM Alloc Failure", __FUNCTION__);
9066 VOS_ASSERT(0);
9067 vos_mem_free(pwdiGtkOffloadGetInfoReqMsg);
9068 return VOS_STATUS_E_NOMEM;
9069 }
9070
9071 pwdiGtkOffloadGetInfoReqMsg->wdiReqStatusCB = NULL;
9072
9073 VOS_ASSERT((NULL == pWDA->wdaMsgParam) &&
9074 (NULL == pWDA->wdaWdiApiMsgParam));
9075
9076 /* Store Params pass it to WDI */
9077 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiGtkOffloadGetInfoReqMsg;
9078 pWdaParams->pWdaContext = pWDA;
9079 /* Store param pointer as passed in by caller */
9080 pWdaParams->wdaMsgParam = pGtkOffloadGetInfoRsp;
9081
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009082 vos_mem_copy(pwdiGtkOffloadGetInfoReqMsg->WDI_GtkOffloadGetInfoReqParams.bssId,
9083 pGtkOffloadGetInfoRsp->bssId, sizeof(wpt_macAddr))
9084
Jeff Johnson295189b2012-06-20 16:38:30 -07009085 status = WDI_GTKOffloadGetInfoReq(pwdiGtkOffloadGetInfoReqMsg, (WDI_GtkOffloadGetInfoCb)WDA_GtkOffloadGetInfoCallback, pWdaParams);
9086
9087 if(IS_WDI_STATUS_FAILURE(status))
9088 {
9089 /* failure returned by WDI API */
9090 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9091 "Failure in WDA_ProcessGTKOffloadGetInfoReq(), free all the memory " );
9092 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
9093 vos_mem_free(pWdaParams) ;
9094 pGtkOffloadGetInfoRsp->ulStatus = eSIR_FAILURE ;
9095 WDA_SendMsg(pWDA, WDA_GTK_OFFLOAD_GETINFO_RSP, (void *)pGtkOffloadGetInfoRsp, 0) ;
9096 }
9097
9098 return CONVERT_WDI2VOS_STATUS(status) ;
9099}
9100#endif // WLAN_FEATURE_GTK_OFFLOAD
9101
9102/*
9103 * -------------------------------------------------------------------------
9104 * DATA interface with WDI for Mgmt Frames
9105 * -------------------------------------------------------------------------
9106 */
Jeff Johnson295189b2012-06-20 16:38:30 -07009107/*
9108 * FUNCTION: WDA_TxComplete
9109 * Callback function for the WDA_TxPacket
9110 */
9111VOS_STATUS WDA_TxComplete( v_PVOID_t pVosContext, vos_pkt_t *pData,
9112 VOS_STATUS status )
9113{
9114
9115 tWDA_CbContext *wdaContext= (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
9116 tpAniSirGlobal pMac = (tpAniSirGlobal)VOS_GET_MAC_CTXT((void *)pVosContext) ;
Madan Mohan Koyyalamudi85cc1d72012-10-30 18:28:37 -07009117 tANI_U32 uUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -07009118
9119 if(NULL == wdaContext)
9120 {
9121 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9122 "%s:pWDA is NULL",
9123 __FUNCTION__);
9124 VOS_ASSERT(0);
9125 return VOS_STATUS_E_FAILURE;
9126 }
Madan Mohan Koyyalamudi85cc1d72012-10-30 18:28:37 -07009127
9128 /*Check if frame was timed out or not*/
9129 vos_pkt_get_user_data_ptr( pData, VOS_PKT_USER_DATA_ID_WDA,
9130 (v_PVOID_t)&uUserData);
9131
9132 if ( WDA_TL_TX_MGMT_TIMED_OUT == uUserData )
9133 {
9134 /*Discard frame - no further processing is needed*/
9135 vos_pkt_return_packet(pData);
9136 return VOS_STATUS_SUCCESS;
9137 }
9138
Jeff Johnson295189b2012-06-20 16:38:30 -07009139 /*check whether the callback is null or not,made null during WDA_TL_TX_FRAME_TIMEOUT timeout*/
9140 if( NULL!=wdaContext->pTxCbFunc)
9141 {
9142 /*check if packet is freed already*/
9143 if(vos_atomic_set_U32(&wdaContext->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pData)
9144 {
9145 wdaContext->pTxCbFunc(pMac, pData);
9146 }
9147 else
9148 {
9149 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN,
9150 "%s:packet (0x%X) is already freed",
9151 __FUNCTION__, pData);
9152 //Return from here since we reaching here because the packet already timeout
9153 return status;
9154 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009155 }
9156
9157 /*
9158 * Trigger the event to bring the HAL TL Tx complete function to come
9159 * out of wait
9160 * Let the coe above to complete the packet first. When this event is set,
9161 * the thread waiting for the event may run and set Vospacket_freed causing the original
9162 * packet not being freed.
9163 */
9164 status = vos_event_set(&wdaContext->txFrameEvent);
9165 if(!VOS_IS_STATUS_SUCCESS(status))
9166 {
9167 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9168 "NEW VOS Event Set failed - status = %d \n", status);
9169 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009170 return status;
9171}
Jeff Johnson295189b2012-06-20 16:38:30 -07009172/*
9173 * FUNCTION: WDA_TxPacket
9174 * Forward TX management frame to WDI
9175 */
9176VOS_STATUS WDA_TxPacket(tWDA_CbContext *pWDA,
9177 void *pFrmBuf,
9178 tANI_U16 frmLen,
9179 eFrameType frmType,
9180 eFrameTxDir txDir,
9181 tANI_U8 tid,
9182 pWDATxRxCompFunc pCompFunc,
9183 void *pData,
9184 pWDAAckFnTxComp pAckTxComp,
9185 tANI_U8 txFlag)
9186{
9187 VOS_STATUS status = VOS_STATUS_SUCCESS ;
9188 tpSirMacFrameCtl pFc = (tpSirMacFrameCtl ) pData;
9189 tANI_U8 ucTypeSubType = pFc->type <<4 | pFc->subType;
9190 tANI_U8 eventIdx = 0;
9191 tBssSystemRole systemRole = eSYSTEM_UNKNOWN_ROLE;
9192 tpAniSirGlobal pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009193 if((NULL == pWDA)||(NULL == pFrmBuf))
9194 {
9195 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9196 "%s:pWDA %x or pFrmBuf %x is NULL",
9197 __FUNCTION__,pWDA,pFrmBuf);
9198 VOS_ASSERT(0);
9199 return VOS_STATUS_E_FAILURE;
9200 }
9201
9202 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9203 "Tx Mgmt Frame Subtype: %d alloc(%x)\n", pFc->subType, pFrmBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07009204 pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
9205 if(NULL == pMac)
9206 {
9207 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9208 "%s:pMac is NULL", __FUNCTION__);
9209 VOS_ASSERT(0);
9210 return VOS_STATUS_E_FAILURE;
9211 }
9212
9213
9214
9215 /* store the call back function in WDA context */
9216 pWDA->pTxCbFunc = pCompFunc;
9217 /* store the call back for the function of ackTxComplete */
9218 if( pAckTxComp )
9219 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009220 if( NULL != pWDA->pAckTxCbFunc )
9221 {
9222 /* Already TxComp is active no need to active again */
9223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9224 "There is already one request pending for tx complete\n");
9225 pWDA->pAckTxCbFunc( pMac, 0);
9226 pWDA->pAckTxCbFunc = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07009227
Jeff Johnsone7245742012-09-05 17:12:55 -07009228 if( VOS_STATUS_SUCCESS !=
9229 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9230 {
9231 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9232 "Tx Complete timeout Timer Stop Failed ");
9233 }
9234 else
9235 {
9236 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9237 "Tx Complete timeout Timer Stop Sucess ");
9238 }
9239 }
9240
9241 txFlag |= HAL_TXCOMP_REQUESTED_MASK;
9242 pWDA->pAckTxCbFunc = pAckTxComp;
9243 if( VOS_STATUS_SUCCESS !=
9244 WDA_START_TIMER(&pWDA->wdaTimers.TxCompleteTimer) )
9245 {
9246 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9247 "Tx Complete Timer Start Failed ");
9248 pWDA->pAckTxCbFunc = NULL;
9249 return eHAL_STATUS_FAILURE;
9250 }
9251 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009252 /* Reset the event to be not signalled */
9253 status = vos_event_reset(&pWDA->txFrameEvent);
9254 if(!VOS_IS_STATUS_SUCCESS(status))
9255 {
9256 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9257 "VOS Event reset failed - status = %d\n",status);
9258 pCompFunc(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf);
9259 if( pAckTxComp )
9260 {
9261 pWDA->pAckTxCbFunc = NULL;
9262 if( VOS_STATUS_SUCCESS !=
9263 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9264 {
9265 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9266 "Tx Complete timeout Timer Stop Failed ");
9267 }
9268 }
9269 return VOS_STATUS_E_FAILURE;
9270 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009271 /* Get system role, use the self station if in unknown role or STA role */
9272 systemRole = wdaGetGlobalSystemRole(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07009273 if (( eSYSTEM_UNKNOWN_ROLE == systemRole ) ||
9274 (( eSYSTEM_STA_ROLE == systemRole )
9275#ifdef FEATURE_WLAN_CCX
9276 && frmType == HAL_TXRX_FRM_802_11_MGMT
9277#endif
9278 ))
9279 {
9280 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
9281 }
9282
Jeff Johnsone7245742012-09-05 17:12:55 -07009283 /* Divert Disassoc/Deauth frames thru self station, as by the time unicast
9284 disassoc frame reaches the HW, HAL has already deleted the peer station */
9285 if ((pFc->type == SIR_MAC_MGMT_FRAME))
Jeff Johnson295189b2012-06-20 16:38:30 -07009286 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009287 if ((pFc->subType == SIR_MAC_MGMT_DISASSOC) ||
9288 (pFc->subType == SIR_MAC_MGMT_DEAUTH) ||
9289 (pFc->subType == SIR_MAC_MGMT_REASSOC_RSP) ||
9290 (pFc->subType == SIR_MAC_MGMT_PROBE_REQ))
Jeff Johnson295189b2012-06-20 16:38:30 -07009291 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009292 /*Send Probe request frames on self sta idx*/
9293 txFlag |= HAL_USE_SELF_STA_REQUESTED_MASK;
Jeff Johnsone7245742012-09-05 17:12:55 -07009294 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009295 /* Since we donot want probe responses to be retried, send probe responses
9296 through the NO_ACK queues */
9297 if (pFc->subType == SIR_MAC_MGMT_PROBE_RSP)
9298 {
9299 //probe response is sent out using self station and no retries options.
9300 txFlag |= (HAL_USE_NO_ACK_REQUESTED_MASK | HAL_USE_SELF_STA_REQUESTED_MASK);
9301 }
9302 if(VOS_TRUE == pWDA->wdaAmpSessionOn)
9303 {
9304 txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
9305 }
9306 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009307 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)pFrmBuf);/*set VosPacket_freed to pFrmBuf*/
9308
9309 /*Set frame tag to 0
9310 We will use the WDA user data in order to tag a frame as expired*/
9311 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9312 (v_PVOID_t)0);
9313
9314
9315 if((status = WLANTL_TxMgmtFrm(pWDA->pVosContext, (vos_pkt_t *)pFrmBuf,
9316 frmLen, ucTypeSubType, tid,
9317 WDA_TxComplete, NULL, txFlag)) != VOS_STATUS_SUCCESS)
9318 {
9319 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9320 "Sending Mgmt Frame failed - status = %d\n", status);
9321 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
9322 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);/*reset the VosPacket_freed*/
9323 if( pAckTxComp )
9324 {
9325 pWDA->pAckTxCbFunc = NULL;
9326 if( VOS_STATUS_SUCCESS !=
9327 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9328 {
9329 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9330 "Tx Complete timeout Timer Stop Failed ");
9331 }
9332 }
9333 return VOS_STATUS_E_FAILURE;
9334 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009335 /*
9336 * Wait for the event to be set by the TL, to get the response of TX
9337 * complete, this event should be set by the Callback function called by TL
9338 */
9339 status = vos_wait_events(&pWDA->txFrameEvent, 1, WDA_TL_TX_FRAME_TIMEOUT,
9340 &eventIdx);
9341 if(!VOS_IS_STATUS_SUCCESS(status))
9342 {
9343 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9344 "%s: Status %d when waiting for TX Frame Event",
9345 __FUNCTION__, status);
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -07009346 WDA_TransportChannelDebug(1, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009347 pWDA->pTxCbFunc = NULL; /*To stop the limTxComplete being called again ,
9348 after the packet gets completed(packet freed once)*/
9349
Madan Mohan Koyyalamudi85cc1d72012-10-30 18:28:37 -07009350 /*Tag Frame as timed out for later deletion*/
9351 vos_pkt_set_user_data_ptr( (vos_pkt_t *)pFrmBuf, VOS_PKT_USER_DATA_ID_WDA,
9352 (v_PVOID_t)WDA_TL_TX_MGMT_TIMED_OUT);
9353
Jeff Johnson295189b2012-06-20 16:38:30 -07009354 /* check whether the packet was freed already,so need not free again when
9355 * TL calls the WDA_Txcomplete routine
9356 */
Madan Mohan Koyyalamudi85cc1d72012-10-30 18:28:37 -07009357 vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED);
9358 /*if(vos_atomic_set_U32(&pWDA->VosPacketToFree, (v_U32_t)WDA_TX_PACKET_FREED) == (v_U32_t)pFrmBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07009359 {
9360 pCompFunc(VOS_GET_MAC_CTXT(pWDA->pVosContext), (vos_pkt_t *)pFrmBuf);
Madan Mohan Koyyalamudi85cc1d72012-10-30 18:28:37 -07009361 } */
9362
Jeff Johnson295189b2012-06-20 16:38:30 -07009363 if( pAckTxComp )
9364 {
9365 pWDA->pAckTxCbFunc = NULL;
9366 if( VOS_STATUS_SUCCESS !=
9367 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
9368 {
9369 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9370 "Tx Complete timeout Timer Stop Failed ");
9371 }
9372 }
9373 status = VOS_STATUS_E_FAILURE;
9374 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009375 return status;
9376}
Jeff Johnson295189b2012-06-20 16:38:30 -07009377/*
9378 * FUNCTION: WDA_McProcessMsg
9379 * Trigger DAL-AL to start CFG download
9380 */
9381VOS_STATUS WDA_McProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg )
9382{
9383 VOS_STATUS status = VOS_STATUS_SUCCESS;
9384 tWDA_CbContext *pWDA = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -07009385 if(NULL == pMsg)
9386 {
9387 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9388 "%s:pMsg is NULL", __FUNCTION__);
9389 VOS_ASSERT(0);
9390 return VOS_STATUS_E_FAILURE;
9391 }
9392
9393 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
9394 "=========> %s msgType: %x " ,__FUNCTION__, pMsg->type);
9395
9396 pWDA = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pVosContext );
9397 if(NULL == pWDA )
9398 {
9399 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9400 "%s:pWDA is NULL", __FUNCTION__);
9401 VOS_ASSERT(0);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -07009402 vos_mem_free(pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009403 return VOS_STATUS_E_FAILURE;
9404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009405 /* Process all the WDA messages.. */
9406 switch( pMsg->type )
9407 {
9408 case WNI_CFG_DNLD_REQ:
9409 {
9410 status = WDA_WniCfgDnld(pWDA);
Jeff Johnson295189b2012-06-20 16:38:30 -07009411 /* call WDA complete event if config download success */
9412 if( VOS_IS_STATUS_SUCCESS(status) )
9413 {
9414 vos_WDAComplete_cback(pVosContext);
9415 }
9416 else
9417 {
9418 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9419 "WDA Config Download failure" );
9420 }
9421 break ;
9422 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009423 /*
9424 * Init SCAN request from PE, convert it into DAL format
9425 * and send it to DAL
9426 */
9427 case WDA_INIT_SCAN_REQ:
9428 {
9429 WDA_ProcessInitScanReq(pWDA, (tInitScanParams *)pMsg->bodyptr) ;
9430 break ;
9431 }
9432 /* start SCAN request from PE */
9433 case WDA_START_SCAN_REQ:
9434 {
9435 WDA_ProcessStartScanReq(pWDA, (tStartScanParams *)pMsg->bodyptr) ;
9436 break ;
9437 }
9438 /* end SCAN request from PE */
9439 case WDA_END_SCAN_REQ:
9440 {
9441 WDA_ProcessEndScanReq(pWDA, (tEndScanParams *)pMsg->bodyptr) ;
9442 break ;
9443 }
9444 /* end SCAN request from PE */
9445 case WDA_FINISH_SCAN_REQ:
9446 {
9447 WDA_ProcessFinishScanReq(pWDA, (tFinishScanParams *)pMsg->bodyptr) ;
9448 break ;
9449 }
9450 /* join request from PE */
9451 case WDA_CHNL_SWITCH_REQ:
9452 {
9453 if(WDA_PRE_ASSOC_STATE == pWDA->wdaState)
9454 {
9455 WDA_ProcessJoinReq(pWDA, (tSwitchChannelParams *)pMsg->bodyptr) ;
9456 }
9457 else
9458 {
9459 WDA_ProcessChannelSwitchReq(pWDA,
9460 (tSwitchChannelParams*)pMsg->bodyptr) ;
9461 }
9462 break ;
9463 }
9464 /* ADD BSS request from PE */
9465 case WDA_ADD_BSS_REQ:
9466 {
9467 WDA_ProcessConfigBssReq(pWDA, (tAddBssParams*)pMsg->bodyptr) ;
9468 break ;
9469 }
9470 case WDA_ADD_STA_REQ:
9471 {
9472 WDA_ProcessAddStaReq(pWDA, (tAddStaParams *)pMsg->bodyptr) ;
9473 break ;
9474 }
9475 case WDA_DELETE_BSS_REQ:
9476 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009477 WDA_ProcessDelBssReq(pWDA, (tDeleteBssParams *)pMsg->bodyptr) ;
9478 break ;
9479 }
9480 case WDA_DELETE_STA_REQ:
9481 {
Jeff Johnson295189b2012-06-20 16:38:30 -07009482 WDA_ProcessDelStaReq(pWDA, (tDeleteStaParams *)pMsg->bodyptr) ;
9483 break ;
9484 }
9485 case WDA_CONFIG_PARAM_UPDATE_REQ:
9486 {
9487 WDA_UpdateCfg(pWDA, (tSirMsgQ *)pMsg) ;
9488 break ;
9489 }
9490 case WDA_SET_BSSKEY_REQ:
9491 {
9492 WDA_ProcessSetBssKeyReq(pWDA, (tSetBssKeyParams *)pMsg->bodyptr);
9493 break ;
9494 }
9495 case WDA_SET_STAKEY_REQ:
9496 {
9497 WDA_ProcessSetStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9498 break ;
9499 }
9500 case WDA_SET_STA_BCASTKEY_REQ:
9501 {
9502 WDA_ProcessSetBcastStaKeyReq(pWDA, (tSetStaKeyParams *)pMsg->bodyptr);
9503 break ;
9504 }
9505 case WDA_REMOVE_BSSKEY_REQ:
9506 {
9507 WDA_ProcessRemoveBssKeyReq(pWDA,
9508 (tRemoveBssKeyParams *)pMsg->bodyptr);
9509 break ;
9510 }
9511 case WDA_REMOVE_STAKEY_REQ:
9512 {
9513 WDA_ProcessRemoveStaKeyReq(pWDA,
9514 (tRemoveStaKeyParams *)pMsg->bodyptr);
9515 break ;
9516 }
9517 case WDA_REMOVE_STA_BCASTKEY_REQ:
9518 {
9519 /* TODO: currently UMAC is not sending this request, Add the code for
9520 handling this request when UMAC supports */
9521 break;
9522 }
9523#ifdef FEATURE_WLAN_CCX
9524 case WDA_TSM_STATS_REQ:
9525 {
9526 WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
9527 break;
9528 }
9529#endif
9530 case WDA_UPDATE_EDCA_PROFILE_IND:
9531 {
9532 WDA_ProcessUpdateEDCAParamReq(pWDA, (tEdcaParams *)pMsg->bodyptr);
9533 break;
9534 }
9535 case WDA_ADD_TS_REQ:
9536 {
9537 WDA_ProcessAddTSReq(pWDA, (tAddTsParams *)pMsg->bodyptr);
9538 break;
9539 }
9540 case WDA_DEL_TS_REQ:
9541 {
9542 WDA_ProcessDelTSReq(pWDA, (tDelTsParams *)pMsg->bodyptr);
9543 break;
9544 }
9545 case WDA_ADDBA_REQ:
9546 {
9547 WDA_ProcessAddBASessionReq(pWDA, (tAddBAParams *)pMsg->bodyptr);
9548 break;
9549 }
9550 case WDA_DELBA_IND:
9551 {
9552 WDA_ProcessDelBAReq(pWDA, (tDelBAParams *)pMsg->bodyptr);
9553 break;
9554 }
9555 case WDA_SET_LINK_STATE:
9556 {
9557 WDA_ProcessSetLinkState(pWDA, (tLinkStateParams *)pMsg->bodyptr);
9558 break;
9559 }
9560 case WDA_GET_STATISTICS_REQ:
9561 {
9562 WDA_ProcessGetStatsReq(pWDA, (tAniGetPEStatsReq *)pMsg->bodyptr);
9563 break;
9564 }
9565 case WDA_PWR_SAVE_CFG:
9566 {
9567 if(pWDA->wdaState == WDA_READY_STATE)
9568 {
9569 WDA_ProcessSetPwrSaveCfgReq(pWDA, (tSirPowerSaveCfg *)pMsg->bodyptr);
9570 }
9571 else
9572 {
9573 if(NULL != pMsg->bodyptr)
9574 {
9575 vos_mem_free(pMsg->bodyptr);
9576 }
9577 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9578 "WDA_PWR_SAVE_CFG req in wrong state %d", pWDA->wdaState );
9579 }
9580 break;
9581 }
9582 case WDA_ENTER_IMPS_REQ:
9583 {
9584 if(pWDA->wdaState == WDA_READY_STATE)
9585 {
9586 WDA_ProcessEnterImpsReq(pWDA);
9587 }
9588 else
9589 {
9590 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9591 "WDA_ENTER_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9592 }
9593 break;
9594 }
9595 case WDA_EXIT_IMPS_REQ:
9596 {
9597 if(pWDA->wdaState == WDA_READY_STATE)
9598 {
9599 WDA_ProcessExitImpsReq(pWDA);
9600 }
9601 else
9602 {
9603 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9604 "WDA_EXIT_IMPS_REQ req in wrong state %d", pWDA->wdaState );
9605 }
9606 break;
9607 }
9608 case WDA_ENTER_BMPS_REQ:
9609 {
9610 if(pWDA->wdaState == WDA_READY_STATE)
9611 {
9612 WDA_ProcessEnterBmpsReq(pWDA, (tEnterBmpsParams *)pMsg->bodyptr);
9613 }
9614 else
9615 {
9616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9617 "WDA_ENTER_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9618 }
9619 break;
9620 }
9621 case WDA_EXIT_BMPS_REQ:
9622 {
9623 if(pWDA->wdaState == WDA_READY_STATE)
9624 {
9625 WDA_ProcessExitBmpsReq(pWDA, (tExitBmpsParams *)pMsg->bodyptr);
9626 }
9627 else
9628 {
9629 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9630 "WDA_EXIT_BMPS_REQ req in wrong state %d", pWDA->wdaState );
9631 }
9632 break;
9633 }
9634 case WDA_ENTER_UAPSD_REQ:
9635 {
9636 if(pWDA->wdaState == WDA_READY_STATE)
9637 {
9638 WDA_ProcessEnterUapsdReq(pWDA, (tUapsdParams *)pMsg->bodyptr);
9639 }
9640 else
9641 {
9642 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9643 "WDA_ENTER_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9644 }
9645 break;
9646 }
9647 case WDA_EXIT_UAPSD_REQ:
9648 {
9649 if(pWDA->wdaState == WDA_READY_STATE)
9650 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009651 WDA_ProcessExitUapsdReq(pWDA, (tExitUapsdParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009652 }
9653 else
9654 {
9655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9656 "WDA_EXIT_UAPSD_REQ req in wrong state %d", pWDA->wdaState );
9657 }
9658 break;
9659 }
9660 case WDA_UPDATE_UAPSD_IND:
9661 {
9662 if(pWDA->wdaState == WDA_READY_STATE)
9663 {
9664 WDA_UpdateUapsdParamsReq(pWDA, (tUpdateUapsdParams *)pMsg->bodyptr);
9665 }
9666 else
9667 {
9668 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
9669 "WDA_UPDATE_UAPSD_IND req in wrong state %d", pWDA->wdaState );
9670 }
9671 break;
9672 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009673 case WDA_REGISTER_PE_CALLBACK :
9674 {
9675 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9676 "Handling msg type WDA_REGISTER_PE_CALLBACK " );
9677 /*TODO: store the PE callback */
9678 /* Do Nothing? MSG Body should be freed at here */
9679 if(NULL != pMsg->bodyptr)
9680 {
9681 vos_mem_free(pMsg->bodyptr);
9682 }
9683 break;
9684 }
9685 case WDA_SYS_READY_IND :
9686 {
9687 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9688 "Handling msg type WDA_SYS_READY_IND " );
9689 pWDA->wdaState = WDA_READY_STATE;
9690 if(NULL != pMsg->bodyptr)
9691 {
9692 vos_mem_free(pMsg->bodyptr);
9693 }
9694 break;
9695 }
9696 case WDA_BEACON_FILTER_IND :
9697 {
9698 WDA_SetBeaconFilterReq(pWDA, (tBeaconFilterMsg *)pMsg->bodyptr);
9699 break;
9700 }
9701 case WDA_BTC_SET_CFG:
9702 {
9703 /*TODO: handle this while dealing with BTC */
9704 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9705 "Handling msg type WDA_BTC_SET_CFG " );
9706 /* Do Nothing? MSG Body should be freed at here */
9707 if(NULL != pMsg->bodyptr)
9708 {
9709 vos_mem_free(pMsg->bodyptr);
9710 }
9711 break;
9712 }
9713 case WDA_SIGNAL_BT_EVENT:
9714 {
9715 /*TODO: handle this while dealing with BTC */
9716 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_HIGH,
9717 "Handling msg type WDA_SIGNAL_BT_EVENT " );
9718 /* Do Nothing? MSG Body should be freed at here */
9719 if(NULL != pMsg->bodyptr)
9720 {
9721 vos_mem_free(pMsg->bodyptr);
9722 }
9723 break;
9724 }
9725 case WDA_CFG_RXP_FILTER_REQ:
9726 {
9727 WDA_ProcessConfigureRxpFilterReq(pWDA,
9728 (tSirWlanSetRxpFilters *)pMsg->bodyptr);
9729 break;
9730 }
9731 case WDA_SET_HOST_OFFLOAD:
9732 {
9733 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9734 break;
9735 }
9736 case WDA_SET_KEEP_ALIVE:
9737 {
9738 WDA_ProcessKeepAliveReq(pWDA, (tSirKeepAliveReq *)pMsg->bodyptr);
9739 break;
9740 }
9741#ifdef WLAN_NS_OFFLOAD
9742 case WDA_SET_NS_OFFLOAD:
9743 {
9744 WDA_ProcessHostOffloadReq(pWDA, (tSirHostOffloadReq *)pMsg->bodyptr);
9745 break;
9746 }
9747#endif //WLAN_NS_OFFLOAD
9748 case WDA_ADD_STA_SELF_REQ:
9749 {
9750 WDA_ProcessAddStaSelfReq(pWDA, (tAddStaSelfParams *)pMsg->bodyptr);
9751 break;
9752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009753 case WDA_DEL_STA_SELF_REQ:
9754 {
9755 WDA_ProcessDelSTASelfReq(pWDA, (tDelStaSelfParams *)pMsg->bodyptr);
9756 break;
9757 }
9758 case WDA_WOWL_ADD_BCAST_PTRN:
9759 {
9760 WDA_ProcessWowlAddBcPtrnReq(pWDA, (tSirWowlAddBcastPtrn *)pMsg->bodyptr);
9761 break;
9762 }
9763 case WDA_WOWL_DEL_BCAST_PTRN:
9764 {
9765 WDA_ProcessWowlDelBcPtrnReq(pWDA, (tSirWowlDelBcastPtrn *)pMsg->bodyptr);
9766 break;
9767 }
9768 case WDA_WOWL_ENTER_REQ:
9769 {
9770 WDA_ProcessWowlEnterReq(pWDA, (tSirHalWowlEnterParams *)pMsg->bodyptr);
9771 break;
9772 }
9773 case WDA_WOWL_EXIT_REQ:
9774 {
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07009775 WDA_ProcessWowlExitReq(pWDA, (tSirHalWowlExitParams *)pMsg->bodyptr);
Jeff Johnson295189b2012-06-20 16:38:30 -07009776 break;
9777 }
9778 case WDA_TL_FLUSH_AC_REQ:
9779 {
9780 WDA_ProcessFlushAcReq(pWDA, (tFlushACReq *)pMsg->bodyptr);
9781 break;
9782 }
9783 case WDA_SIGNAL_BTAMP_EVENT:
9784 {
9785 WDA_ProcessBtAmpEventReq(pWDA, (tSmeBtAmpEvent *)pMsg->bodyptr);
9786 break;
9787 }
9788#ifdef WDA_UT
9789 case WDA_WDI_EVENT_MSG:
9790 {
9791 WDI_processEvent(pMsg->bodyptr,(void *)pMsg->bodyval);
9792 break ;
9793 }
9794#endif
9795 case WDA_UPDATE_BEACON_IND:
9796 {
9797 WDA_ProcessUpdateBeaconParams(pWDA,
9798 (tUpdateBeaconParams *)pMsg->bodyptr);
9799 break;
9800 }
9801 case WDA_SEND_BEACON_REQ:
9802 {
9803 WDA_ProcessSendBeacon(pWDA, (tSendbeaconParams *)pMsg->bodyptr);
9804 break;
9805 }
9806 case WDA_UPDATE_PROBE_RSP_TEMPLATE_IND:
9807 {
9808 WDA_ProcessUpdateProbeRspTemplate(pWDA,
9809 (tSendProbeRespParams *)pMsg->bodyptr);
9810 break;
9811 }
9812#if defined(WLAN_FEATURE_VOWIFI) || defined(FEATURE_WLAN_CCX)
9813 case WDA_SET_MAX_TX_POWER_REQ:
9814 {
9815 WDA_ProcessSetMaxTxPowerReq(pWDA,
9816 (tMaxTxPowerParams *)pMsg->bodyptr);
9817 break;
9818 }
9819#endif
9820#ifdef WLAN_FEATURE_P2P
9821 case WDA_SET_P2P_GO_NOA_REQ:
9822 {
9823 WDA_ProcessSetP2PGONOAReq(pWDA,
9824 (tP2pPsParams *)pMsg->bodyptr);
9825 break;
9826 }
9827#endif
9828 /* timer related messages */
9829 case WDA_TIMER_BA_ACTIVITY_REQ:
9830 {
9831 WDA_BaCheckActivity(pWDA) ;
9832 break ;
9833 }
9834#ifdef WLAN_FEATURE_VOWIFI_11R
9835 case WDA_AGGR_QOS_REQ:
9836 {
9837 WDA_ProcessAggrAddTSReq(pWDA, (tAggrAddTsParams *)pMsg->bodyptr);
9838 break;
9839 }
9840#endif /* WLAN_FEATURE_VOWIFI_11R */
Jeff Johnson295189b2012-06-20 16:38:30 -07009841#ifdef ANI_MANF_DIAG
9842 case WDA_FTM_CMD_REQ:
9843 {
9844 WDA_ProcessFTMCommand(pWDA, (tPttMsgbuffer *)pMsg->bodyptr) ;
9845 break ;
9846 }
9847#endif /* ANI_MANF_DIAG */
Jeff Johnsone7245742012-09-05 17:12:55 -07009848#ifdef FEATURE_OEM_DATA_SUPPORT
9849 case WDA_START_OEM_DATA_REQ:
9850 {
9851 WDA_ProcessStartOemDataReq(pWDA, (tStartOemDataReq *)pMsg->bodyptr) ;
9852 break;
9853 }
9854#endif /* FEATURE_OEM_DATA_SUPPORT */
Jeff Johnson295189b2012-06-20 16:38:30 -07009855 /* Tx Complete Time out Indication */
9856 case WDA_TX_COMPLETE_TIMEOUT_IND:
9857 {
9858 WDA_ProcessTxCompleteTimeOutInd(pWDA);
9859 break;
9860 }
9861 case WDA_WLAN_SUSPEND_IND:
9862 {
9863 WDA_ProcessWlanSuspendInd(pWDA,
9864 (tSirWlanSuspendParam *)pMsg->bodyptr) ;
9865 break;
9866 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009867 case WDA_WLAN_RESUME_REQ:
9868 {
9869 WDA_ProcessWlanResumeReq(pWDA,
9870 (tSirWlanResumeParam *)pMsg->bodyptr) ;
9871 break;
9872 }
9873
9874 case WDA_UPDATE_CF_IND:
9875 {
9876 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
9877 pMsg->bodyptr = NULL;
9878 break;
9879 }
9880#ifdef FEATURE_WLAN_SCAN_PNO
9881 case WDA_SET_PNO_REQ:
9882 {
9883 WDA_ProcessSetPrefNetworkReq(pWDA, (tSirPNOScanReq *)pMsg->bodyptr);
9884 break;
9885 }
9886 case WDA_UPDATE_SCAN_PARAMS_REQ:
9887 {
9888 WDA_ProcessUpdateScanParams(pWDA, (tSirUpdateScanParams *)pMsg->bodyptr);
9889 break;
9890 }
9891 case WDA_SET_RSSI_FILTER_REQ:
9892 {
9893 WDA_ProcessSetRssiFilterReq(pWDA, (tSirSetRSSIFilterReq *)pMsg->bodyptr);
9894 break;
9895 }
9896#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -07009897 case WDA_SET_TX_PER_TRACKING_REQ:
9898 {
9899 WDA_ProcessSetTxPerTrackingReq(pWDA, (tSirTxPerTrackingParam *)pMsg->bodyptr);
9900 break;
9901 }
9902
9903#ifdef WLAN_FEATURE_PACKET_FILTERING
9904 case WDA_8023_MULTICAST_LIST_REQ:
9905 {
9906 WDA_Process8023MulticastListReq(pWDA, (tSirRcvFltMcAddrList *)pMsg->bodyptr);
9907 break;
9908 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009909 case WDA_RECEIVE_FILTER_SET_FILTER_REQ:
9910 {
9911 WDA_ProcessReceiveFilterSetFilterReq(pWDA, (tSirRcvPktFilterCfgType *)pMsg->bodyptr);
9912 break;
9913 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009914 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_REQ:
9915 {
9916 WDA_ProcessPacketFilterMatchCountReq(pWDA, (tpSirRcvFltPktMatchRsp)pMsg->bodyptr);
9917 break;
9918 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009919 case WDA_RECEIVE_FILTER_CLEAR_FILTER_REQ:
9920 {
9921 WDA_ProcessReceiveFilterClearFilterReq(pWDA, (tSirRcvFltPktClearParam *)pMsg->bodyptr);
9922 break;
9923 }
9924#endif // WLAN_FEATURE_PACKET_FILTERING
9925
9926
9927 case WDA_TRANSMISSION_CONTROL_IND:
9928 {
9929 WDA_ProcessTxControlInd(pWDA, (tpTxControlParams)pMsg->bodyptr);
9930 break;
9931 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009932 case WDA_SET_POWER_PARAMS_REQ:
9933 {
9934 WDA_ProcessSetPowerParamsReq(pWDA, (tSirSetPowerParamsReq *)pMsg->bodyptr);
9935 break;
9936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009937#ifdef WLAN_FEATURE_GTK_OFFLOAD
9938 case WDA_GTK_OFFLOAD_REQ:
9939 {
9940 WDA_ProcessGTKOffloadReq(pWDA, (tpSirGtkOffloadParams)pMsg->bodyptr);
9941 break;
9942 }
9943
9944 case WDA_GTK_OFFLOAD_GETINFO_REQ:
9945 {
9946 WDA_ProcessGTKOffloadGetInfoReq(pWDA, (tpSirGtkOffloadGetInfoRspParams)pMsg->bodyptr);
9947 break;
9948 }
9949#endif //WLAN_FEATURE_GTK_OFFLOAD
9950
9951 case WDA_SET_TM_LEVEL_REQ:
9952 {
9953 WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
9954 break;
9955 }
Mohit Khanna4a70d262012-09-11 16:30:12 -07009956#ifdef WLAN_FEATURE_11AC
9957 case WDA_UPDATE_OP_MODE:
9958 {
9959 if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
9960 {
9961 if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
9962 WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
9963 else
9964 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9965 " VHT OpMode Feature is Not Supported \n");
9966 }
9967 else
9968 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9969 " 11AC Feature is Not Supported \n");
9970 break;
9971 }
9972#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009973 default:
9974 {
9975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
9976 "No Handling for msg type %x in WDA "
9977 ,pMsg->type);
9978 /* Do Nothing? MSG Body should be freed at here */
9979 if(NULL != pMsg->bodyptr)
9980 {
9981 vos_mem_free(pMsg->bodyptr);
9982 }
9983 //WDA_VOS_ASSERT(0) ;
9984 }
9985 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009986 return status ;
9987}
9988
Jeff Johnson295189b2012-06-20 16:38:30 -07009989/*
9990 * FUNCTION: WDA_LowLevelIndCallback
9991 * IND API callback from WDI, send Ind to PE
9992 */
9993void WDA_lowLevelIndCallback(WDI_LowLevelIndType *wdiLowLevelInd,
9994 void* pUserData )
9995{
9996 tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData;
9997#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
9998 tSirRSSINotification rssiNotification;
9999#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070010000 if(NULL == pWDA)
10001 {
10002 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10003 "%s:pWDA is NULL", __FUNCTION__);
10004 VOS_ASSERT(0);
10005 return ;
10006 }
10007
10008 switch(wdiLowLevelInd->wdiIndicationType)
10009 {
10010 case WDI_RSSI_NOTIFICATION_IND:
10011 {
10012 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10013 "Received WDI_HAL_RSSI_NOTIFICATION_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -070010014#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
10015 rssiNotification.bReserved =
10016 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bReserved;
10017 rssiNotification.bRssiThres1NegCross =
10018 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1NegCross;
10019 rssiNotification.bRssiThres1PosCross =
10020 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres1PosCross;
10021 rssiNotification.bRssiThres2NegCross =
10022 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2NegCross;
10023 rssiNotification.bRssiThres2PosCross =
10024 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres2PosCross;
10025 rssiNotification.bRssiThres3NegCross =
10026 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3NegCross;
10027 rssiNotification.bRssiThres3PosCross =
10028 wdiLowLevelInd->wdiIndicationData.wdiLowRSSIInfo.bRssiThres3PosCross;
Jeff Johnson295189b2012-06-20 16:38:30 -070010029 WLANTL_BMPSRSSIRegionChangedNotification(
10030 pWDA->pVosContext,
10031 &rssiNotification);
10032#endif
10033 break ;
10034 }
10035 case WDI_MISSED_BEACON_IND:
10036 {
10037 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10038 "Received WDI_MISSED_BEACON_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -070010039 /* send IND to PE */
10040 WDA_SendMsg(pWDA, WDA_MISSED_BEACON_IND, NULL, 0) ;
10041 break ;
10042 }
10043 case WDI_UNKNOWN_ADDR2_FRAME_RX_IND:
10044 {
10045 /* TODO: Decode Ind and send Ind to PE */
10046 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10047 "Received WDI_UNKNOWN_ADDR2_FRAME_RX_IND from WDI ");
10048 break ;
10049 }
10050
10051 case WDI_MIC_FAILURE_IND:
10052 {
10053 tpSirSmeMicFailureInd pMicInd =
10054 (tpSirSmeMicFailureInd)vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
10055
10056 if(NULL == pMicInd)
10057 {
10058 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10059 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10060 break;
10061 }
10062 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10063 "Received WDI_MIC_FAILURE_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -070010064 pMicInd->messageType = eWNI_SME_MIC_FAILURE_IND;
10065 pMicInd->length = sizeof(tSirSmeMicFailureInd);
10066 vos_mem_copy(pMicInd->bssId,
10067 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.bssId,
10068 sizeof(tSirMacAddr));
10069 vos_mem_copy(pMicInd->info.srcMacAddr,
10070 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macSrcAddr,
10071 sizeof(tSirMacAddr));
10072 vos_mem_copy(pMicInd->info.taMacAddr,
10073 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macTaAddr,
10074 sizeof(tSirMacAddr));
10075 vos_mem_copy(pMicInd->info.dstMacAddr,
10076 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macDstAddr,
10077 sizeof(tSirMacAddr));
10078 vos_mem_copy(pMicInd->info.rxMacAddr,
10079 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.macRxAddr,
10080 sizeof(tSirMacAddr));
10081 pMicInd->info.multicast =
10082 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucMulticast;
10083 pMicInd->info.keyId=
10084 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.keyId;
10085 pMicInd->info.IV1=
10086 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.ucIV1;
10087 vos_mem_copy(pMicInd->info.TSC,
10088 wdiLowLevelInd->wdiIndicationData.wdiMICFailureInfo.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -070010089 WDA_SendMsg(pWDA, SIR_HAL_MIC_FAILURE_IND,
10090 (void *)pMicInd , 0) ;
10091 break ;
10092 }
10093 case WDI_FATAL_ERROR_IND:
10094 {
Madan Mohan Koyyalamudia2fc6412012-10-21 12:06:12 -070010095 pWDA->wdiFailed = true;
Jeff Johnson295189b2012-06-20 16:38:30 -070010096 /* TODO: Decode Ind and send Ind to PE */
10097 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10098 "Received WDI_FATAL_ERROR_IND from WDI ");
10099 break ;
10100 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010101 case WDI_DEL_STA_IND:
10102 {
Jeff Johnson295189b2012-06-20 16:38:30 -070010103 tpDeleteStaContext pDelSTACtx =
10104 (tpDeleteStaContext)vos_mem_malloc(sizeof(tDeleteStaContext));
10105
10106 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10107 "Received WDI_DEL_STA_IND from WDI ");
10108 if(NULL == pDelSTACtx)
10109 {
10110 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10111 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10112 break;
10113 }
10114 vos_mem_copy(pDelSTACtx->addr2,
10115 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macADDR2,
10116 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010117 vos_mem_copy(pDelSTACtx->bssId,
10118 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.macBSSID,
10119 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010120 pDelSTACtx->assocId =
10121 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.usAssocId;
10122 pDelSTACtx->reasonCode =
10123 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.wptReasonCode;
10124 pDelSTACtx->staId =
10125 wdiLowLevelInd->wdiIndicationData.wdiDeleteSTAIndType.ucSTAIdx;
Jeff Johnson295189b2012-06-20 16:38:30 -070010126 WDA_SendMsg(pWDA, SIR_LIM_DELETE_STA_CONTEXT_IND,
10127 (void *)pDelSTACtx , 0) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010128 break ;
10129 }
10130 case WDI_COEX_IND:
10131 {
10132 tANI_U32 index;
10133 vos_msg_t vosMsg;
10134 tSirSmeCoexInd *pSmeCoexInd = (tSirSmeCoexInd *)vos_mem_malloc(sizeof(tSirSmeCoexInd));
10135 if(NULL == pSmeCoexInd)
10136 {
10137 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10138 "%s: VOS MEM Alloc Failure-pSmeCoexInd", __FUNCTION__);
10139 break;
10140 }
10141 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10142 "Received WDI_COEX_IND from WDI ");
Jeff Johnson295189b2012-06-20 16:38:30 -070010143 /* Message Header */
10144 pSmeCoexInd->mesgType = eWNI_SME_COEX_IND;
10145 pSmeCoexInd->mesgLen = sizeof(tSirSmeCoexInd);
Jeff Johnson295189b2012-06-20 16:38:30 -070010146 /* Info from WDI Indication */
10147 pSmeCoexInd->coexIndType = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndType;
10148 for (index = 0; index < SIR_COEX_IND_DATA_SIZE; index++)
10149 {
10150 pSmeCoexInd->coexIndData[index] = wdiLowLevelInd->wdiIndicationData.wdiCoexInfo.coexIndData[index];
10151 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010152 /* VOS message wrapper */
10153 vosMsg.type = eWNI_SME_COEX_IND;
10154 vosMsg.bodyptr = (void *)pSmeCoexInd;
10155 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010156 /* Send message to SME */
10157 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10158 {
10159 /* free the mem and return */
10160 vos_mem_free((v_VOID_t *)pSmeCoexInd);
10161 }
10162 else
10163 {
10164 /* DEBUG */
10165 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10166 "[COEX WDA] Coex Ind Type (%x) data (%x %x %x %x)",
10167 pSmeCoexInd->coexIndType,
10168 pSmeCoexInd->coexIndData[0],
10169 pSmeCoexInd->coexIndData[1],
10170 pSmeCoexInd->coexIndData[2],
10171 pSmeCoexInd->coexIndData[3]);
10172 }
10173 break;
10174 }
10175 case WDI_TX_COMPLETE_IND:
10176 {
10177 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
10178 /* Calling TxCompleteAck Indication from wda context*/
10179 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10180 "Complete Indication received from HAL");
10181 if( pWDA->pAckTxCbFunc )
10182 {
10183 if( VOS_STATUS_SUCCESS !=
10184 WDA_STOP_TIMER(&pWDA->wdaTimers.TxCompleteTimer))
10185 {
10186 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10187 "Tx Complete timeout Timer Stop Failed ");
10188 }
10189 pWDA->pAckTxCbFunc( pMac, wdiLowLevelInd->wdiIndicationData.tx_complete_status);
10190 pWDA->pAckTxCbFunc = NULL;
10191 }
10192 else
10193 {
10194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10195 "Tx Complete Indication is received after timeout ");
10196 }
10197 break;
10198 }
10199#ifdef WLAN_FEATURE_P2P
10200 case WDI_P2P_NOA_ATTR_IND :
10201 {
10202 tSirP2PNoaAttr *pP2pNoaAttr =
10203 (tSirP2PNoaAttr *)vos_mem_malloc(sizeof(tSirP2PNoaAttr));
Jeff Johnson295189b2012-06-20 16:38:30 -070010204 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10205 "Received WDI_P2P_NOA_ATTR_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010206 if (NULL == pP2pNoaAttr)
10207 {
10208 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10209 "Memory allocation failure, "
10210 "WDI_P2P_NOA_ATTR_IND not forwarded");
10211 break;
10212 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010213 pP2pNoaAttr->index =
10214 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucIndex;
10215 pP2pNoaAttr->oppPsFlag =
10216 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.ucOppPsFlag;
10217 pP2pNoaAttr->ctWin =
10218 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usCtWin;
10219
10220 pP2pNoaAttr->uNoa1IntervalCnt =
10221 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa1IntervalCnt;
10222 pP2pNoaAttr->uNoa1Duration =
10223 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Duration;
10224 pP2pNoaAttr->uNoa1Interval =
10225 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1Interval;
10226 pP2pNoaAttr->uNoa1StartTime =
10227 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa1StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010228 pP2pNoaAttr->uNoa2IntervalCnt =
10229 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.usNoa2IntervalCnt;
10230 pP2pNoaAttr->uNoa2Duration =
10231 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Duration;
10232 pP2pNoaAttr->uNoa2Interval =
10233 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2Interval;
10234 pP2pNoaAttr->uNoa2StartTime =
10235 wdiLowLevelInd->wdiIndicationData.wdiP2pNoaAttrInfo.uslNoa2StartTime;
Jeff Johnson295189b2012-06-20 16:38:30 -070010236 WDA_SendMsg(pWDA, SIR_HAL_P2P_NOA_ATTR_IND,
10237 (void *)pP2pNoaAttr , 0) ;
10238 break;
10239 }
10240#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070010241#ifdef FEATURE_WLAN_SCAN_PNO
10242 case WDI_PREF_NETWORK_FOUND_IND:
10243 {
10244 vos_msg_t vosMsg;
10245 tSirPrefNetworkFoundInd *pPrefNetworkFoundInd = (tSirPrefNetworkFoundInd *)vos_mem_malloc(sizeof(tSirPrefNetworkFoundInd));
Jeff Johnson295189b2012-06-20 16:38:30 -070010246 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10247 "Received WDI_PREF_NETWORK_FOUND_IND from WDI");
Jeff Johnson295189b2012-06-20 16:38:30 -070010248 if (NULL == pPrefNetworkFoundInd)
10249 {
10250 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10251 "Memory allocation failure, "
10252 "WDI_PREF_NETWORK_FOUND_IND not forwarded");
10253 break;
10254 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010255 /* Message Header */
10256 pPrefNetworkFoundInd->mesgType = eWNI_SME_PREF_NETWORK_FOUND_IND;
10257 pPrefNetworkFoundInd->mesgLen = sizeof(*pPrefNetworkFoundInd);
10258
10259 /* Info from WDI Indication */
10260 pPrefNetworkFoundInd->ssId.length =
10261 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.ucLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070010262 vos_mem_set( pPrefNetworkFoundInd->ssId.ssId, 32, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070010263 vos_mem_copy( pPrefNetworkFoundInd->ssId.ssId,
10264 wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.ssId.sSSID,
10265 pPrefNetworkFoundInd->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -070010266 pPrefNetworkFoundInd ->rssi = wdiLowLevelInd->wdiIndicationData.wdiPrefNetworkFoundInd.rssi;
Jeff Johnson295189b2012-06-20 16:38:30 -070010267 /* VOS message wrapper */
10268 vosMsg.type = eWNI_SME_PREF_NETWORK_FOUND_IND;
10269 vosMsg.bodyptr = (void *) pPrefNetworkFoundInd;
10270 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010271 /* Send message to SME */
10272 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10273 {
10274 /* free the mem and return */
10275 vos_mem_free((v_VOID_t *) pPrefNetworkFoundInd);
10276 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010277 break;
10278 }
10279#endif // FEATURE_WLAN_SCAN_PNO
10280
10281#ifdef WLAN_WAKEUP_EVENTS
10282 case WDI_WAKE_REASON_IND:
10283 {
10284 vos_msg_t vosMsg;
10285 tANI_U32 allocSize = sizeof(tSirWakeReasonInd)
10286 + (wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen - 1);
10287 tSirWakeReasonInd *pWakeReasonInd = (tSirWakeReasonInd *)vos_mem_malloc(allocSize);
10288
10289 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10290 "[WAKE_REASON WDI] WAKE_REASON_IND Type (0x%x) data (ulReason=0x%x, ulReasonArg=0x%x, ulStoredDataLen=0x%x)",
10291 wdiLowLevelInd->wdiIndicationType,
10292 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason,
10293 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg,
10294 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10295
10296 if (NULL == pWakeReasonInd)
10297 {
10298 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10299 "Memory allocation failure, "
10300 "WDI_WAKE_REASON_IND not forwarded");
10301 break;
10302 }
10303
10304 vos_mem_zero(pWakeReasonInd, allocSize);
10305
10306 /* Message Header */
10307 pWakeReasonInd->mesgType = eWNI_SME_WAKE_REASON_IND;
10308 pWakeReasonInd->mesgLen = allocSize;
10309
10310 /* Info from WDI Indication */
10311 // Fill pWakeReasonInd structure from wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd
10312 pWakeReasonInd->ulReason = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReason;
10313 pWakeReasonInd->ulReasonArg = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulReasonArg;
10314 pWakeReasonInd->ulStoredDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen;
10315 pWakeReasonInd->ulActualDataLen = wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulActualDataLen;
10316 vos_mem_copy( (void *)&(pWakeReasonInd->aDataStart[0]),
10317 &(wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.aDataStart[0]),
10318 wdiLowLevelInd->wdiIndicationData.wdiWakeReasonInd.ulStoredDataLen);
10319
10320 /* VOS message wrapper */
10321 vosMsg.type = eWNI_SME_WAKE_REASON_IND;
10322 vosMsg.bodyptr = (void *) pWakeReasonInd;
10323 vosMsg.bodyval = 0;
10324
10325 /* Send message to SME */
10326 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10327 {
10328 /* free the mem and return */
10329 vos_mem_free((v_VOID_t *) pWakeReasonInd);
10330 }
10331
10332 break;
10333 }
10334#endif // WLAN_WAKEUP_EVENTS
10335
10336 case WDI_TX_PER_HIT_IND:
10337 {
10338 vos_msg_t vosMsg;
10339 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "Get WDI_TX_PER_HIT_IND");
10340 /* send IND to PE eWNI_SME_TX_PER_HIT_IND*/
10341 /* VOS message wrapper */
10342 vosMsg.type = eWNI_SME_TX_PER_HIT_IND;
10343 vosMsg.bodyptr = NULL;
10344 vosMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010345 /* Send message to SME */
10346 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
10347 {
10348 VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_WARN, "post eWNI_SME_TX_PER_HIT_IND to SME Failed");
10349 }
10350 break;
10351 }
10352
10353 default:
10354 {
10355 /* TODO error */
10356 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10357 "Received UNKNOWN Indication from WDI ");
10358 }
10359 }
10360 return ;
10361}
10362
Jeff Johnson295189b2012-06-20 16:38:30 -070010363/*
10364 * BA related processing in WDA.
10365 */
Jeff Johnson295189b2012-06-20 16:38:30 -070010366void WDA_TriggerBaReqCallback(WDI_TriggerBARspParamsType *wdiTriggerBaRsp,
10367 void* pUserData)
10368{
10369 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10370 tWDA_CbContext *pWDA;
Jeff Johnson295189b2012-06-20 16:38:30 -070010371 if(NULL == pWdaParams)
10372 {
10373 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10374 "%s: pWdaParams received NULL", __FUNCTION__);
10375 VOS_ASSERT(0) ;
10376 return ;
10377 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010378 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070010379 vos_mem_free(pWdaParams->wdaMsgParam) ;
10380 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10381 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010382 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10383 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010384 if(WDI_STATUS_SUCCESS == wdiTriggerBaRsp->wdiStatus)
10385 {
10386 tANI_U8 i = 0 ;
10387 tBaActivityInd *baActivityInd = NULL ;
10388 tANI_U8 baCandidateCount = wdiTriggerBaRsp->usBaCandidateCnt ;
10389 tANI_U8 allocSize = sizeof(tBaActivityInd)
10390 + sizeof(tAddBaCandidate) * (baCandidateCount) ;
10391 WDI_TriggerBARspCandidateType *wdiBaCandidate = NULL ;
10392 tAddBaCandidate *baCandidate = NULL ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010393 baActivityInd = (tBaActivityInd *)vos_mem_malloc(allocSize) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010394 if(NULL == baActivityInd)
10395 {
10396 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10397 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10398 VOS_ASSERT(0) ;
10399 return;
10400 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010401 vos_mem_copy(baActivityInd->bssId, wdiTriggerBaRsp->macBSSID,
10402 sizeof(tSirMacAddr)) ;
10403 baActivityInd->baCandidateCnt = baCandidateCount ;
10404
10405 wdiBaCandidate = (WDI_TriggerBARspCandidateType*)(wdiTriggerBaRsp + 1) ;
10406 baCandidate = (tAddBaCandidate*)(baActivityInd + 1) ;
10407
10408 for(i = 0 ; i < baCandidateCount ; i++)
10409 {
10410 tANI_U8 tid = 0 ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010411 vos_mem_copy(baCandidate->staAddr, wdiBaCandidate->macSTA,
10412 sizeof(tSirMacAddr)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010413 for(tid = 0 ; tid < STACFG_MAX_TC; tid++)
10414 {
10415 baCandidate->baInfo[tid].fBaEnable =
10416 wdiBaCandidate->wdiBAInfo[tid].fBaEnable ;
10417 baCandidate->baInfo[tid].startingSeqNum =
10418 wdiBaCandidate->wdiBAInfo[tid].startingSeqNum ;
10419 }
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070010420 wdiBaCandidate++ ;
10421 baCandidate++ ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010422 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010423 WDA_SendMsg(pWDA, SIR_LIM_ADD_BA_IND, (void *)baActivityInd , 0) ;
10424 }
10425 else
10426 {
10427 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10428 "BA Trigger RSP with Failure received ");
10429 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010430 return ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010431}
Jeff Johnson295189b2012-06-20 16:38:30 -070010432/*
10433 * BA Activity check timer handler
10434 */
10435void WDA_BaCheckActivity(tWDA_CbContext *pWDA)
10436{
10437 tANI_U8 curSta = 0 ;
10438 tANI_U8 tid = 0 ;
10439 tANI_U8 size = 0 ;
10440 tANI_U8 baCandidateCount = 0 ;
10441 tANI_U8 newBaCandidate = 0 ;
10442 WDI_TriggerBAReqCandidateType baCandidate[WDA_MAX_STA] = {{0}} ;
10443
10444 if(NULL == pWDA)
10445 {
10446 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10447 "%s:pWDA is NULL", __FUNCTION__);
10448 VOS_ASSERT(0);
10449 return ;
10450 }
10451 if(WDA_MAX_STA < pWDA->wdaMaxSta)
10452 {
10453 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10454 "Inconsistent STA entries in WDA");
10455 VOS_ASSERT(0) ;
10456 }
10457 /* walk through all STA entries and find out TX packet count */
10458 for(curSta = 0 ; curSta < pWDA->wdaMaxSta ; curSta++)
10459 {
10460 for(tid = 0 ; tid < STACFG_MAX_TC ; tid++)
10461 {
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010462 WLANTL_STAStateType tlSTAState ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010463 tANI_U32 txPktCount = 0 ;
10464 tANI_U8 validStaIndex = pWDA->wdaStaInfo[curSta].ucValidStaIndex ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010465 if((WDA_VALID_STA_INDEX == validStaIndex) &&
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010466 (VOS_STATUS_SUCCESS == WDA_TL_GET_STA_STATE( pWDA->pVosContext,
10467 curSta, &tlSTAState)) &&
Jeff Johnson295189b2012-06-20 16:38:30 -070010468 (VOS_STATUS_SUCCESS == WDA_TL_GET_TX_PKTCOUNT( pWDA->pVosContext,
10469 curSta, tid, &txPktCount)))
10470 {
10471#if 0
10472 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10473 "************* %d:%d, %d ",curSta, txPktCount,
10474 pWDA->wdaStaInfo[curSta].framesTxed[tid]);
10475#endif
10476 if(!WDA_GET_BA_TXFLAG(pWDA, curSta, tid)
Madan Mohan Koyyalamudifc1d1fe2012-10-18 15:07:12 -070010477 && (WLANTL_STA_AUTHENTICATED == tlSTAState)
Jeff Johnson295189b2012-06-20 16:38:30 -070010478 && (txPktCount >= WDA_LAST_POLLED_THRESHOLD(pWDA,
10479 curSta, tid)))
10480 {
10481 /* get prepare for sending message to HAL */
10482 //baCandidate[baCandidateCount].staIdx = curSta ;
10483 baCandidate[baCandidateCount].ucTidBitmap |= 1 << tid ;
10484 newBaCandidate = WDA_ENABLE_BA ;
10485 }
10486 pWDA->wdaStaInfo[curSta].framesTxed[tid] = txPktCount ;
10487 }
10488 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010489 /* fill the entry for all the sta with given TID's */
10490 if(WDA_ENABLE_BA == newBaCandidate)
10491 {
10492 /* move to next BA candidate */
10493 baCandidate[baCandidateCount].ucSTAIdx = curSta ;
10494 size += sizeof(WDI_TriggerBAReqCandidateType) ;
10495 baCandidateCount++ ;
10496 newBaCandidate = WDA_DISABLE_BA ;
10497 }
10498 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010499 /* prepare and send message to hal */
10500 if( 0 < baCandidateCount)
10501 {
10502 WDI_Status status = WDI_STATUS_SUCCESS ;
10503 WDI_TriggerBAReqParamsType *wdiTriggerBaReq;
10504 tWDA_ReqParams *pWdaParams =
10505 (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010506 if(NULL == pWdaParams)
10507 {
10508 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10509 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10510 VOS_ASSERT(0) ;
10511 return;
10512 }
10513 wdiTriggerBaReq = (WDI_TriggerBAReqParamsType *)
10514 vos_mem_malloc(sizeof(WDI_TriggerBAReqParamsType) + size) ;
10515 if(NULL == wdiTriggerBaReq)
10516 {
10517 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10518 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10519 VOS_ASSERT(0) ;
10520 vos_mem_free(pWdaParams);
10521 return;
10522 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010523 do
10524 {
10525 WDI_TriggerBAReqinfoType *triggerBaInfo =
10526 &wdiTriggerBaReq->wdiTriggerBAInfoType ;
10527 triggerBaInfo->usBACandidateCnt = baCandidateCount ;
10528 /* TEMP_FIX: Need to see if WDI need check for assoc session for
10529 * for each request */
10530 triggerBaInfo->ucSTAIdx = baCandidate[0].ucSTAIdx ;
10531 triggerBaInfo->ucBASessionID = 0;
10532 vos_mem_copy((wdiTriggerBaReq + 1), baCandidate, size) ;
10533 } while(0) ;
10534 wdiTriggerBaReq->wdiReqStatusCB = NULL ;
10535 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10536 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010537 pWdaParams->pWdaContext = pWDA;
10538 pWdaParams->wdaWdiApiMsgParam = wdiTriggerBaReq ;
10539 pWdaParams->wdaMsgParam = NULL;
10540 status = WDI_TriggerBAReq(wdiTriggerBaReq,
10541 WDA_TriggerBaReqCallback, pWdaParams) ;
10542 if(IS_WDI_STATUS_FAILURE(status))
10543 {
10544 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10545 "Failure in Trigger BA REQ Params WDI API, free all the memory " );
10546 vos_mem_free(pWdaParams->wdaMsgParam) ;
10547 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10548 vos_mem_free(pWdaParams) ;
10549 }
10550 }
10551 else
10552 {
10553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO_LOW,
10554 "There is no TID for initiating BA");
10555 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010556 if( VOS_STATUS_SUCCESS !=
10557 WDA_STOP_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10558 {
10559 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10560 "BA Activity Timer Stop Failed ");
10561 return ;
10562 }
10563 if( VOS_STATUS_SUCCESS !=
10564 WDA_START_TIMER(&pWDA->wdaTimers.baActivityChkTmr))
10565 {
10566 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10567 "BA Activity Timer Start Failed ");
10568 return;
10569 }
10570 return ;
10571}
Jeff Johnson295189b2012-06-20 16:38:30 -070010572/*
10573 * WDA common routine to create timer used by WDA.
10574 */
10575static VOS_STATUS wdaCreateTimers(tWDA_CbContext *pWDA)
10576{
Jeff Johnson295189b2012-06-20 16:38:30 -070010577 VOS_STATUS status = VOS_STATUS_SUCCESS ;
10578 tANI_U32 val = 0 ;
10579 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext);
10580
10581 if(NULL == pMac)
10582 {
10583 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10584 "%s:MAC context is NULL", __FUNCTION__);
10585 VOS_ASSERT(0);
10586 return VOS_STATUS_E_FAILURE;
10587 }
10588 if(wlan_cfgGetInt(pMac, WNI_CFG_BA_ACTIVITY_CHECK_TIMEOUT, &val )
10589 != eSIR_SUCCESS)
10590 {
10591 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10592 "Failed to get value for WNI_CFG_CURRENT_TX_ANTENNA");
10593 return VOS_STATUS_E_FAILURE;
10594 }
10595 val = SYS_MS_TO_TICKS(val) ;
10596
10597 /* BA activity check timer */
10598 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.baActivityChkTmr,
10599 "BA Activity Check timer", WDA_TimerHandler,
10600 WDA_TIMER_BA_ACTIVITY_REQ, val, val, TX_NO_ACTIVATE) ;
10601 if(status != TX_SUCCESS)
10602 {
10603 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10604 "Unable to create BA activity timer");
10605 return eSIR_FAILURE ;
10606 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010607 val = SYS_MS_TO_TICKS( WDA_TX_COMPLETE_TIME_OUT_VALUE ) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010608 /* Tx Complete Timeout timer */
10609 status = WDA_CREATE_TIMER(&pWDA->wdaTimers.TxCompleteTimer,
10610 "Tx Complete Check timer", WDA_TimerHandler,
10611 WDA_TX_COMPLETE_TIMEOUT_IND, val, val, TX_NO_ACTIVATE) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010612 if(status != TX_SUCCESS)
10613 {
10614 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10615 "Unable to create Tx Complete Timeout timer");
10616 /* Destroy timer of BA activity check timer */
10617 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10618 if(status != TX_SUCCESS)
10619 {
10620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10621 "Unable to Destroy BA activity timer");
10622 return eSIR_FAILURE ;
10623 }
10624 return eSIR_FAILURE ;
10625 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010626 return eSIR_SUCCESS ;
10627}
Jeff Johnson295189b2012-06-20 16:38:30 -070010628/*
10629 * WDA common routine to destroy timer used by WDA.
10630 */
10631static VOS_STATUS wdaDestroyTimers(tWDA_CbContext *pWDA)
10632{
10633 VOS_STATUS status = VOS_STATUS_SUCCESS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010634 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.TxCompleteTimer);
10635 if(status != TX_SUCCESS)
10636 {
10637 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10638 "Unable to Destroy Tx Complete Timeout timer");
10639 return eSIR_FAILURE ;
10640 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010641 status = WDA_DESTROY_TIMER(&pWDA->wdaTimers.baActivityChkTmr);
10642 if(status != TX_SUCCESS)
10643 {
10644 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10645 "Unable to Destroy BA activity timer");
10646 return eSIR_FAILURE ;
10647 }
10648
10649 return eSIR_SUCCESS ;
10650}
Jeff Johnson295189b2012-06-20 16:38:30 -070010651/*
10652 * WDA timer handler.
10653 */
10654void WDA_TimerHandler(v_VOID_t* pContext, tANI_U32 timerInfo)
10655{
10656 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
10657 vos_msg_t wdaMsg = {0} ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010658 /*
10659 * trigger CFG download in WDA by sending WDA_CFG_DNLD message
10660 */
10661 wdaMsg.type = timerInfo ;
10662 wdaMsg.bodyptr = NULL;
10663 wdaMsg.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010664 /* post the message.. */
10665 vosStatus = vos_mq_post_message( VOS_MQ_ID_WDA, &wdaMsg );
10666 if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
10667 {
10668 vosStatus = VOS_STATUS_E_BADMSG;
10669 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010670}
Jeff Johnson295189b2012-06-20 16:38:30 -070010671/*
10672 * WDA Tx Complete timeout Indication.
10673 */
10674void WDA_ProcessTxCompleteTimeOutInd(tWDA_CbContext* pWDA)
10675{
10676 tpAniSirGlobal pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010677 if( pWDA->pAckTxCbFunc )
10678 {
10679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10680 "TxComplete timer expired\n");
10681 pWDA->pAckTxCbFunc( pMac, 0);
10682 pWDA->pAckTxCbFunc = NULL;
10683 }
10684 else
10685 {
10686 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10687 "There is no request pending for TxComplete and wait timer expired\n");
10688 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010689}
Jeff Johnson295189b2012-06-20 16:38:30 -070010690/*
10691 * WDA Set REG Domain to VOS NV
10692 */
10693eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId)
10694{
10695 if(VOS_STATUS_SUCCESS != vos_nv_setRegDomain(clientCtxt, regId))
10696 {
10697 return eHAL_STATUS_INVALID_PARAMETER;
10698 }
10699 return eHAL_STATUS_SUCCESS;
10700}
10701#endif /* FEATURE_WLAN_INTEGRATED_SOC */
10702
Jeff Johnson295189b2012-06-20 16:38:30 -070010703#ifdef FEATURE_WLAN_SCAN_PNO
10704/*
10705 * FUNCTION: WDA_PNOScanReqCallback
10706 *
10707 */
10708void WDA_PNOScanReqCallback(WDI_Status status, void* pUserData)
10709{
10710 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010711 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10712 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010713 if(NULL == pWdaParams)
10714 {
10715 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10716 "%s: pWdaParams received NULL", __FUNCTION__);
10717 VOS_ASSERT(0) ;
10718 return ;
10719 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010720 if( pWdaParams != NULL )
10721 {
10722 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10723 {
10724 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10725 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010726 if( pWdaParams->wdaMsgParam != NULL)
10727 {
10728 vos_mem_free(pWdaParams->wdaMsgParam);
10729 }
10730
10731 vos_mem_free(pWdaParams) ;
10732 }
10733
10734 return ;
10735}
Jeff Johnson295189b2012-06-20 16:38:30 -070010736/*
10737 * FUNCTION: WDA_UpdateScanParamsCallback
10738 *
10739 */
10740void WDA_UpdateScanParamsCallback(WDI_Status status, void* pUserData)
10741{
10742 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10744 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010745 if(NULL == pWdaParams)
10746 {
10747 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10748 "%s: pWdaParams received NULL", __FUNCTION__);
10749 VOS_ASSERT(0) ;
10750 return ;
10751 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010752 if( pWdaParams != NULL )
10753 {
10754 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10755 {
10756 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10757 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010758 if( pWdaParams->wdaMsgParam != NULL)
10759 {
10760 vos_mem_free(pWdaParams->wdaMsgParam);
10761 }
10762 vos_mem_free(pWdaParams) ;
10763 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010764 return ;
10765}
Jeff Johnson295189b2012-06-20 16:38:30 -070010766/*
10767 * FUNCTION: WDA_SetPowerParamsCallback
10768 *
10769 */
10770void WDA_SetPowerParamsCallback(WDI_Status status, void* pUserData)
10771{
Jeff Johnsone7245742012-09-05 17:12:55 -070010772 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070010773
10774 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10775 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010776 if(NULL == pWdaParams)
10777 {
10778 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10779 "%s: pWdaParams received NULL", __FUNCTION__);
10780 VOS_ASSERT(0) ;
10781 return ;
10782 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010783 if( pWdaParams != NULL )
10784 {
10785 if( pWdaParams->wdaWdiApiMsgParam != NULL )
10786 {
10787 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10788 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010789 if( pWdaParams->wdaMsgParam != NULL)
10790 {
10791 vos_mem_free(pWdaParams->wdaMsgParam);
10792 }
10793 vos_mem_free(pWdaParams) ;
10794 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010795 return ;
10796}
Jeff Johnson295189b2012-06-20 16:38:30 -070010797/*
10798 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10799 * Request to WDI to set Preferred Network List.Offload
10800 */
10801VOS_STATUS WDA_ProcessSetPrefNetworkReq(tWDA_CbContext *pWDA,
10802 tSirPNOScanReq *pPNOScanReqParams)
10803{
Jeff Johnson43971f52012-07-17 12:26:56 -070010804 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010805 WDI_PNOScanReqParamsType *pwdiPNOScanReqInfo =
10806 (WDI_PNOScanReqParamsType *)vos_mem_malloc(sizeof(WDI_PNOScanReqParamsType)) ;
10807 tWDA_ReqParams *pWdaParams ;
10808 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010809 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10810 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010811 if(NULL == pwdiPNOScanReqInfo)
10812 {
10813 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10814 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10815 VOS_ASSERT(0);
10816 return VOS_STATUS_E_NOMEM;
10817 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010818 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10819 if(NULL == pWdaParams)
10820 {
10821 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10822 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10823 VOS_ASSERT(0);
10824 vos_mem_free(pwdiPNOScanReqInfo);
10825 return VOS_STATUS_E_NOMEM;
10826 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010827 //
10828 // Fill wdiPNOScanReqInfo->wdiPNOScanInfo from pPNOScanReqParams
10829 //
10830 pwdiPNOScanReqInfo->wdiPNOScanInfo.bEnable = pPNOScanReqParams->enable;
10831 pwdiPNOScanReqInfo->wdiPNOScanInfo.wdiModePNO = pPNOScanReqParams->modePNO;
Jeff Johnson295189b2012-06-20 16:38:30 -070010832 pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount =
10833 ( pPNOScanReqParams->ucNetworksCount < WDI_PNO_MAX_SUPP_NETWORKS )?
10834 pPNOScanReqParams->ucNetworksCount : WDI_PNO_MAX_SUPP_NETWORKS ;
Jeff Johnson295189b2012-06-20 16:38:30 -070010835 for ( i = 0; i < pwdiPNOScanReqInfo->wdiPNOScanInfo.ucNetworksCount ; i++)
10836 {
10837 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i],
10838 &pPNOScanReqParams->aNetworks[i],
10839 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.aNetworks[i]));
10840 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010841 /*Scan timer intervals*/
10842 vos_mem_copy(&pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers,
10843 &pPNOScanReqParams->scanTimers,
10844 sizeof(pwdiPNOScanReqInfo->wdiPNOScanInfo.scanTimers));
Jeff Johnson295189b2012-06-20 16:38:30 -070010845 /*Probe template for 2.4GHz band*/
10846 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize =
10847 (pPNOScanReqParams->us24GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10848 pPNOScanReqParams->us24GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010849 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a24GProbeTemplate,
10850 pPNOScanReqParams->p24GProbeTemplate,
10851 pwdiPNOScanReqInfo->wdiPNOScanInfo.us24GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010852 /*Probe template for 5GHz band*/
10853 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize =
10854 (pPNOScanReqParams->us5GProbeTemplateLen<WDI_PNO_MAX_PROBE_SIZE)?
10855 pPNOScanReqParams->us5GProbeTemplateLen:WDI_PNO_MAX_PROBE_SIZE;
Jeff Johnson295189b2012-06-20 16:38:30 -070010856 vos_mem_copy( &pwdiPNOScanReqInfo->wdiPNOScanInfo.a5GProbeTemplate,
10857 pPNOScanReqParams->p5GProbeTemplate,
10858 pwdiPNOScanReqInfo->wdiPNOScanInfo.us5GProbeSize);
Jeff Johnson295189b2012-06-20 16:38:30 -070010859 pwdiPNOScanReqInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070010860
Jeff Johnson295189b2012-06-20 16:38:30 -070010861 /* Store Params pass it to WDI */
10862 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiPNOScanReqInfo;
10863 pWdaParams->pWdaContext = pWDA;
10864 /* Store param pointer as passed in by caller */
10865 pWdaParams->wdaMsgParam = pPNOScanReqParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010866 status = WDI_SetPreferredNetworkReq(pwdiPNOScanReqInfo,
10867 (WDI_PNOScanCb)WDA_PNOScanReqCallback, pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010868 if(IS_WDI_STATUS_FAILURE(status))
10869 {
10870 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10871 "Failure in Set PNO REQ WDI API, free all the memory " );
10872 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10873 vos_mem_free(pWdaParams->wdaMsgParam);
10874 pWdaParams->wdaWdiApiMsgParam = NULL;
10875 pWdaParams->wdaMsgParam = NULL;
10876 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010877 return CONVERT_WDI2VOS_STATUS(status) ;
10878}
Jeff Johnson295189b2012-06-20 16:38:30 -070010879/*
10880 * FUNCTION: WDA_RssiFilterCallback
10881 *
10882 */
10883void WDA_RssiFilterCallback(WDI_Status status, void* pUserData)
10884{
10885 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
10886
10887 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10888 "<------ %s " ,__FUNCTION__);
10889
10890 VOS_ASSERT(NULL != pWdaParams);
10891
10892 vos_mem_free(pWdaParams->wdaMsgParam) ;
10893 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
10894 vos_mem_free(pWdaParams) ;
10895
10896 return ;
10897}
10898/*
10899 * FUNCTION: WDA_ProcessSetPreferredNetworkList
10900 * Request to WDI to set Preferred Network List.Offload
10901 */
10902VOS_STATUS WDA_ProcessSetRssiFilterReq(tWDA_CbContext *pWDA,
10903 tSirSetRSSIFilterReq* pRssiFilterParams)
10904{
Jeff Johnson43971f52012-07-17 12:26:56 -070010905 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010906 WDI_SetRssiFilterReqParamsType *pwdiSetRssiFilterReqInfo =
10907 (WDI_SetRssiFilterReqParamsType *)vos_mem_malloc(sizeof(WDI_SetRssiFilterReqParamsType)) ;
10908 tWDA_ReqParams *pWdaParams ;
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 == pwdiSetRssiFilterReqInfo)
10912 {
10913 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10914 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10915 VOS_ASSERT(0);
10916 return VOS_STATUS_E_NOMEM;
10917 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010918 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10919 if(NULL == pWdaParams)
10920 {
10921 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10922 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10923 VOS_ASSERT(0);
10924 vos_mem_free(pwdiSetRssiFilterReqInfo);
10925 return VOS_STATUS_E_NOMEM;
10926 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010927 pwdiSetRssiFilterReqInfo->rssiThreshold = pRssiFilterParams->rssiThreshold;
10928 pwdiSetRssiFilterReqInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070010929
Jeff Johnson295189b2012-06-20 16:38:30 -070010930 /* Store Params pass it to WDI */
10931 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRssiFilterReqInfo;
10932 pWdaParams->pWdaContext = pWDA;
10933 /* Store param pointer as passed in by caller */
10934 pWdaParams->wdaMsgParam = pRssiFilterParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070010935 status = WDI_SetRssiFilterReq( pwdiSetRssiFilterReqInfo,
10936 (WDI_PNOScanCb)WDA_RssiFilterCallback,
10937 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010938 if(IS_WDI_STATUS_FAILURE(status))
10939 {
10940 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10941 "Failure in Set RSSI Filter REQ WDI API, free all the memory " );
10942 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
10943 vos_mem_free(pWdaParams->wdaMsgParam);
10944 pWdaParams->wdaWdiApiMsgParam = NULL;
10945 pWdaParams->wdaMsgParam = NULL;
10946 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010947 return CONVERT_WDI2VOS_STATUS(status) ;
10948}
10949
Jeff Johnson295189b2012-06-20 16:38:30 -070010950/*
10951 * FUNCTION: WDA_ProcessUpdateScanParams
10952 * Request to WDI to update Scan Parameters
10953 */
10954VOS_STATUS WDA_ProcessUpdateScanParams(tWDA_CbContext *pWDA,
10955 tSirUpdateScanParams *pUpdateScanParams)
10956{
Jeff Johnson43971f52012-07-17 12:26:56 -070010957 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070010958 WDI_UpdateScanParamsInfoType *wdiUpdateScanParamsInfoType =
10959 (WDI_UpdateScanParamsInfoType *)vos_mem_malloc(
10960 sizeof(WDI_UpdateScanParamsInfoType)) ;
10961 tWDA_ReqParams *pWdaParams ;
10962 v_U8_t i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010963 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10964 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070010965 if(NULL == wdiUpdateScanParamsInfoType)
10966 {
10967 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10968 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10969 VOS_ASSERT(0);
10970 return VOS_STATUS_E_NOMEM;
10971 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010972 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
10973 if ( NULL == pWdaParams )
10974 {
10975 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
10976 "%s: VOS MEM Alloc Failure", __FUNCTION__);
10977 VOS_ASSERT(0);
10978 vos_mem_free(wdiUpdateScanParamsInfoType);
10979 return VOS_STATUS_E_NOMEM;
10980 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010981 //
10982 // Fill wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo from pUpdateScanParams
10983 //
Jeff Johnson295189b2012-06-20 16:38:30 -070010984 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
10985 "Update Scan Parameters b11dEnabled %d b11dResolved %d "
10986 "ucChannelCount %d usPassiveMinChTime %d usPassiveMaxChTime"
10987 " %d usActiveMinChTime %d usActiveMaxChTime %d sizeof "
10988 "sir struct %d wdi struct %d",
10989 pUpdateScanParams->b11dEnabled,
10990 pUpdateScanParams->b11dResolved,
10991 pUpdateScanParams->ucChannelCount,
10992 pUpdateScanParams->usPassiveMinChTime,
10993 pUpdateScanParams->usPassiveMaxChTime,
10994 pUpdateScanParams->usActiveMinChTime,
10995 pUpdateScanParams->usActiveMaxChTime,
10996 sizeof(tSirUpdateScanParams),
10997 sizeof(wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo) );
10998
Jeff Johnson295189b2012-06-20 16:38:30 -070010999 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dEnabled =
11000 pUpdateScanParams->b11dEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -070011001 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.b11dResolved =
11002 pUpdateScanParams->b11dResolved;
Jeff Johnson295189b2012-06-20 16:38:30 -070011003 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.cbState =
11004 pUpdateScanParams->ucCBState;
Jeff Johnson295189b2012-06-20 16:38:30 -070011005 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMaxChTime =
11006 pUpdateScanParams->usActiveMaxChTime;
11007 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usActiveMinChTime =
11008 pUpdateScanParams->usActiveMinChTime;
11009 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMaxChTime =
11010 pUpdateScanParams->usPassiveMaxChTime;
11011 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.usPassiveMinChTime =
11012 pUpdateScanParams->usPassiveMinChTime;
11013
Jeff Johnson295189b2012-06-20 16:38:30 -070011014 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount =
11015 (pUpdateScanParams->ucChannelCount < WDI_PNO_MAX_NETW_CHANNELS)?
11016 pUpdateScanParams->ucChannelCount:WDI_PNO_MAX_NETW_CHANNELS;
11017
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 for ( i = 0; i <
11019 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.ucChannelCount ;
11020 i++)
11021 {
11022 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11023 "Update Scan Parameters channel: %d",
11024 pUpdateScanParams->aChannels[i]);
11025
11026 wdiUpdateScanParamsInfoType->wdiUpdateScanParamsInfo.aChannels[i] =
11027 pUpdateScanParams->aChannels[i];
11028 }
11029
Jeff Johnson295189b2012-06-20 16:38:30 -070011030 wdiUpdateScanParamsInfoType->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011031
Jeff Johnson295189b2012-06-20 16:38:30 -070011032 /* Store Params pass it to WDI */
11033 pWdaParams->wdaWdiApiMsgParam = wdiUpdateScanParamsInfoType;
11034 pWdaParams->pWdaContext = pWDA;
11035 /* Store param pointer as passed in by caller */
11036 pWdaParams->wdaMsgParam = pUpdateScanParams;
Jeff Johnsone7245742012-09-05 17:12:55 -070011037
Jeff Johnson295189b2012-06-20 16:38:30 -070011038
11039
11040 status = WDI_UpdateScanParamsReq(wdiUpdateScanParamsInfoType,
11041 (WDI_UpdateScanParamsCb)WDA_UpdateScanParamsCallback,
11042 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011043 if(IS_WDI_STATUS_FAILURE(status))
11044 {
11045 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11046 "Failure in Update Scan Params EQ WDI API, free all the memory " );
11047 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11048 vos_mem_free(pWdaParams->wdaMsgParam);
11049 vos_mem_free(pWdaParams);
11050 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011051 return CONVERT_WDI2VOS_STATUS(status) ;
11052}
11053#endif // FEATURE_WLAN_SCAN_PNO
Jeff Johnson295189b2012-06-20 16:38:30 -070011054#ifdef WLAN_FEATURE_PACKET_FILTERING
11055/*
11056 * FUNCTION: WDA_8023MulticastListReqCallback
11057 *
11058 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011059void WDA_8023MulticastListReqCallback(
11060 WDI_RcvFltPktSetMcListRspParamsType *pwdiRcvFltPktSetMcListRspInfo,
11061 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011062{
11063 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011064 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11065 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011066 if(NULL == pWdaParams)
11067 {
11068 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11069 "%s: pWdaParams received NULL", __FUNCTION__);
11070 VOS_ASSERT(0) ;
11071 return ;
11072 }
11073
11074 vos_mem_free(pWdaParams->wdaMsgParam) ;
11075 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11076 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011077 //print a msg, nothing else to do
11078 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11079 "WDA_8023MulticastListReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011080 return ;
11081}
Jeff Johnson295189b2012-06-20 16:38:30 -070011082/*
11083 * FUNCTION: WDA_Process8023MulticastListReq
11084 * Request to WDI to add 8023 Multicast List
11085 */
11086VOS_STATUS WDA_Process8023MulticastListReq (tWDA_CbContext *pWDA,
11087 tSirRcvFltMcAddrList *pRcvFltMcAddrList)
11088{
Jeff Johnson43971f52012-07-17 12:26:56 -070011089 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011090 WDI_RcvFltPktSetMcListReqParamsType *pwdiFltPktSetMcListReqParamsType = NULL;
11091 tWDA_ReqParams *pWdaParams ;
11092 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070011093 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11094 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011095 pwdiFltPktSetMcListReqParamsType =
11096 (WDI_RcvFltPktSetMcListReqParamsType *)vos_mem_malloc(
11097 sizeof(WDI_RcvFltPktSetMcListReqParamsType)
11098 ) ;
11099 if(NULL == pwdiFltPktSetMcListReqParamsType)
11100 {
11101 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11102 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11103 return VOS_STATUS_E_NOMEM;
11104 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011105 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11106 if(NULL == pWdaParams)
11107 {
11108 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11109 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11110 vos_mem_free(pwdiFltPktSetMcListReqParamsType);
11111 return VOS_STATUS_E_NOMEM;
11112 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011113
Jeff Johnson295189b2012-06-20 16:38:30 -070011114 //
11115 // Fill pwdiFltPktSetMcListReqParamsType from pRcvFltMcAddrList
11116 //
11117 pwdiFltPktSetMcListReqParamsType->mcAddrList.ulMulticastAddrCnt =
Jeff Johnsone7245742012-09-05 17:12:55 -070011118 pRcvFltMcAddrList->ulMulticastAddrCnt;
11119
11120 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.selfMacAddr,
11121 pRcvFltMcAddrList->selfMacAddr, sizeof(tSirMacAddr));
11122 vos_mem_copy(pwdiFltPktSetMcListReqParamsType->mcAddrList.bssId,
11123 pRcvFltMcAddrList->bssId, sizeof(tSirMacAddr));
11124
Jeff Johnson295189b2012-06-20 16:38:30 -070011125 for( i = 0; i < pRcvFltMcAddrList->ulMulticastAddrCnt; i++ )
11126 {
11127 vos_mem_copy(&(pwdiFltPktSetMcListReqParamsType->mcAddrList.multicastAddr[i]),
11128 &(pRcvFltMcAddrList->multicastAddr[i]),
11129 sizeof(tSirMacAddr));
11130 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011131 pwdiFltPktSetMcListReqParamsType->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011132
Jeff Johnson295189b2012-06-20 16:38:30 -070011133 /* Store Params pass it to WDI */
11134 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiFltPktSetMcListReqParamsType;
11135 pWdaParams->pWdaContext = pWDA;
11136 /* Store param pointer as passed in by caller */
11137 pWdaParams->wdaMsgParam = pRcvFltMcAddrList;
Jeff Johnson295189b2012-06-20 16:38:30 -070011138 status = WDI_8023MulticastListReq(
11139 pwdiFltPktSetMcListReqParamsType,
11140 (WDI_8023MulticastListCb)WDA_8023MulticastListReqCallback,
11141 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011142 if(IS_WDI_STATUS_FAILURE(status))
11143 {
11144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11145 "Failure in WDA_Process8023MulticastListReq(), free all the memory " );
11146 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11147 vos_mem_free(pWdaParams->wdaMsgParam);
11148 vos_mem_free(pWdaParams);
11149 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011150 return CONVERT_WDI2VOS_STATUS(status) ;
11151}
Jeff Johnson295189b2012-06-20 16:38:30 -070011152/*
11153 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11154 *
11155 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011156void WDA_ReceiveFilterSetFilterReqCallback(
11157 WDI_SetRcvPktFilterRspParamsType *pwdiSetRcvPktFilterRspInfo,
11158 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011159{
11160 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011161 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11162 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011163 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011164 if(NULL == pWdaParams)
11165 {
11166 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11167 "%s: pWdaParams received NULL", __FUNCTION__);
11168 VOS_ASSERT(0) ;
11169 return ;
11170 }
11171
11172 vos_mem_free(pWdaParams->wdaMsgParam) ;
11173 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11174 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011175 //print a msg, nothing else to do
11176 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11177 "WDA_ReceiveFilterSetFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011178 return ;
11179}
Jeff Johnson295189b2012-06-20 16:38:30 -070011180/*
11181 * FUNCTION: WDA_ProcessReceiveFilterSetFilterReq
11182 * Request to WDI to set Receive Filters
11183 */
11184VOS_STATUS WDA_ProcessReceiveFilterSetFilterReq (tWDA_CbContext *pWDA,
11185 tSirRcvPktFilterCfgType *pRcvPktFilterCfg)
11186{
Jeff Johnson43971f52012-07-17 12:26:56 -070011187 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011188 v_SIZE_t allocSize = sizeof(WDI_SetRcvPktFilterReqParamsType) +
11189 ((pRcvPktFilterCfg->numFieldParams - 1) * sizeof(tSirRcvPktFilterFieldParams));
11190 WDI_SetRcvPktFilterReqParamsType *pwdiSetRcvPktFilterReqParamsType =
11191 (WDI_SetRcvPktFilterReqParamsType *)vos_mem_malloc(allocSize) ;
11192 tWDA_ReqParams *pWdaParams ;
11193 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070011194 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11195 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011196 if(NULL == pwdiSetRcvPktFilterReqParamsType)
11197 {
11198 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11199 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11200 VOS_ASSERT(0);
11201 return VOS_STATUS_E_NOMEM;
11202 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011203 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11204 if(NULL == pWdaParams)
11205 {
11206 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11207 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11208 VOS_ASSERT(0);
11209 vos_mem_free(pwdiSetRcvPktFilterReqParamsType);
11210 return VOS_STATUS_E_NOMEM;
11211 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011212 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId = pRcvPktFilterCfg->filterId;
11213 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType = pRcvPktFilterCfg->filterType;
11214 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams = pRcvPktFilterCfg->numFieldParams;
11215 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime = pRcvPktFilterCfg->coalesceTime;
Jeff Johnsone7245742012-09-05 17:12:55 -070011216 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.selfMacAddr,
11217 pRcvPktFilterCfg->selfMacAddr, sizeof(wpt_macAddr));
11218
11219 vos_mem_copy(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.bssId,
11220 pRcvPktFilterCfg->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011221
11222 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11223 "FID %d FT %d NParams %d CT %d",
11224 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterId,
11225 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.filterType,
11226 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams,
11227 pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.coalesceTime);
Jeff Johnson295189b2012-06-20 16:38:30 -070011228 for ( i = 0; i < pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.numFieldParams; i++ )
11229 {
11230 wpalMemoryCopy(&pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i],
11231 &pRcvPktFilterCfg->paramsData[i],
11232 sizeof(pwdiSetRcvPktFilterReqParamsType->wdiPktFilterCfg.paramsData[i]));
Jeff Johnson295189b2012-06-20 16:38:30 -070011233 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11234 "Proto %d Comp Flag %d \n",
11235 pwdiSetRcvPktFilterReqParamsType->
11236 wdiPktFilterCfg.paramsData[i].protocolLayer,
11237 pwdiSetRcvPktFilterReqParamsType->
11238 wdiPktFilterCfg.paramsData[i].cmpFlag);
Jeff Johnson295189b2012-06-20 16:38:30 -070011239 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11240 "Data Offset %d Data Len %d\n",
11241 pwdiSetRcvPktFilterReqParamsType->
11242 wdiPktFilterCfg.paramsData[i].dataOffset,
11243 pwdiSetRcvPktFilterReqParamsType->
11244 wdiPktFilterCfg.paramsData[i].dataLength);
Jeff Johnson295189b2012-06-20 16:38:30 -070011245 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11246 "CData: %d:%d:%d:%d:%d:%d\n",
11247 pwdiSetRcvPktFilterReqParamsType->
11248 wdiPktFilterCfg.paramsData[i].compareData[0],
11249 pwdiSetRcvPktFilterReqParamsType->
11250 wdiPktFilterCfg.paramsData[i].compareData[1],
11251 pwdiSetRcvPktFilterReqParamsType->
11252 wdiPktFilterCfg.paramsData[i].compareData[2],
11253 pwdiSetRcvPktFilterReqParamsType->
11254 wdiPktFilterCfg.paramsData[i].compareData[3],
11255 pwdiSetRcvPktFilterReqParamsType->
11256 wdiPktFilterCfg.paramsData[i].compareData[4],
11257 pwdiSetRcvPktFilterReqParamsType->
11258 wdiPktFilterCfg.paramsData[i].compareData[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011259 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11260 "MData: %d:%d:%d:%d:%d:%d\n",
11261 pwdiSetRcvPktFilterReqParamsType->
11262 wdiPktFilterCfg.paramsData[i].dataMask[0],
11263 pwdiSetRcvPktFilterReqParamsType->
11264 wdiPktFilterCfg.paramsData[i].dataMask[1],
11265 pwdiSetRcvPktFilterReqParamsType->
11266 wdiPktFilterCfg.paramsData[i].dataMask[2],
11267 pwdiSetRcvPktFilterReqParamsType->
11268 wdiPktFilterCfg.paramsData[i].dataMask[3],
11269 pwdiSetRcvPktFilterReqParamsType->
11270 wdiPktFilterCfg.paramsData[i].dataMask[4],
11271 pwdiSetRcvPktFilterReqParamsType->
11272 wdiPktFilterCfg.paramsData[i].dataMask[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -070011273 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011274 pwdiSetRcvPktFilterReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011275 /* Store Params pass it to WDI */
11276 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetRcvPktFilterReqParamsType;
11277 pWdaParams->pWdaContext = pWDA;
11278 /* Store param pointer as passed in by caller */
11279 pWdaParams->wdaMsgParam = pRcvPktFilterCfg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011280 status = WDI_ReceiveFilterSetFilterReq(pwdiSetRcvPktFilterReqParamsType,
11281 (WDI_ReceiveFilterSetFilterCb)WDA_ReceiveFilterSetFilterReqCallback,
11282 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011283 if(IS_WDI_STATUS_FAILURE(status))
11284 {
11285 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11286 "Failure in SetFilter(),free all the memory,status %d ",status);
11287 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11288 vos_mem_free(pWdaParams->wdaMsgParam);
11289 vos_mem_free(pWdaParams);
11290 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011291 return CONVERT_WDI2VOS_STATUS(status) ;
11292}
Jeff Johnson295189b2012-06-20 16:38:30 -070011293/*
11294 * FUNCTION: WDA_FilterMatchCountReqCallback
11295 *
11296 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011297void WDA_FilterMatchCountReqCallback(
11298 WDI_RcvFltPktMatchCntRspParamsType *pwdiRcvFltPktMatchRspParams,
11299 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011300{
11301 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11302 tWDA_CbContext *pWDA;
11303 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntReq;
11304 tpSirRcvFltPktMatchRsp pRcvFltPktMatchCntRsp =
11305 vos_mem_malloc(sizeof(tSirRcvFltPktMatchRsp));
11306 tANI_U8 i;
11307 vos_msg_t vosMsg;
11308
11309 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11310 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011311 /*WDA_VOS_ASSERT(NULL != pWdaParams);*/
11312
Jeff Johnsone7245742012-09-05 17:12:55 -070011313 if(NULL == pRcvFltPktMatchCntRsp)
11314 {
11315 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11316 "%s: pRcvFltPktMatchCntRsp is NULL", __FUNCTION__);
11317 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011318 vos_mem_free(pWdaParams);
Jeff Johnsone7245742012-09-05 17:12:55 -070011319 return ;
11320 }
11321
Jeff Johnson295189b2012-06-20 16:38:30 -070011322 if(NULL == pWdaParams)
11323 {
11324 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11325 "%s: pWdaParams received NULL", __FUNCTION__);
11326 VOS_ASSERT(0) ;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011327 vos_mem_free(pRcvFltPktMatchCntRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070011328 return ;
11329 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011330 pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ;
11331 pRcvFltPktMatchCntReq = (tpSirRcvFltPktMatchRsp)pWdaParams->wdaMsgParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011332 // Fill pRcvFltPktMatchCntRsp from pRcvFltPktMatchCntReq
11333 vos_mem_zero(pRcvFltPktMatchCntRsp,sizeof(tSirRcvFltPktMatchRsp));
11334
11335 /* Message Header */
11336 pRcvFltPktMatchCntRsp->mesgType = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11337 pRcvFltPktMatchCntRsp->mesgLen = sizeof(tSirRcvFltPktMatchRsp);
11338
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011339 pRcvFltPktMatchCntRsp->status = pwdiRcvFltPktMatchRspParams->wdiStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -070011340
11341 for (i = 0; i < SIR_MAX_NUM_FILTERS; i++)
11342 {
11343 pRcvFltPktMatchCntRsp->filterMatchCnt[i].filterId = pRcvFltPktMatchCntReq->filterMatchCnt[i].filterId;
11344 pRcvFltPktMatchCntRsp->filterMatchCnt[i].matchCnt = pRcvFltPktMatchCntReq->filterMatchCnt[i].matchCnt;
11345 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011346 /* VOS message wrapper */
11347 vosMsg.type = eWNI_PMC_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP;
11348 vosMsg.bodyptr = (void *)pRcvFltPktMatchCntRsp;
11349 vosMsg.bodyval = 0;
11350 if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, (vos_msg_t*)&vosMsg))
11351 {
11352 /* free the mem and return */
11353 vos_mem_free((v_VOID_t *)pRcvFltPktMatchCntRsp);
11354 }
11355
11356 vos_mem_free(pWdaParams->wdaMsgParam) ;
11357 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11358 vos_mem_free(pWdaParams) ;
11359}
Jeff Johnson295189b2012-06-20 16:38:30 -070011360/*
11361 * FUNCTION: WDA_ProcessPacketFilterMatchCountReq
11362 * Request to WDI to get PC Filter Match Count
11363 */
11364VOS_STATUS WDA_ProcessPacketFilterMatchCountReq (tWDA_CbContext *pWDA, tpSirRcvFltPktMatchRsp pRcvFltPktMatchRsp)
11365{
Jeff Johnson43971f52012-07-17 12:26:56 -070011366 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011367 WDI_RcvFltPktMatchCntReqParamsType *pwdiRcvFltPktMatchCntReqParamsType =
11368 (WDI_RcvFltPktMatchCntReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktMatchCntReqParamsType));
11369 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011370 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11371 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011372 if(NULL == pwdiRcvFltPktMatchCntReqParamsType)
11373 {
11374 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11375 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11376 VOS_ASSERT(0);
11377 return VOS_STATUS_E_NOMEM;
11378 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011379 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11380 if(NULL == pWdaParams)
11381 {
11382 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11383 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11384 VOS_ASSERT(0);
11385 vos_mem_free(pwdiRcvFltPktMatchCntReqParamsType);
11386 return VOS_STATUS_E_NOMEM;
11387 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011388
Jeff Johnson295189b2012-06-20 16:38:30 -070011389 pwdiRcvFltPktMatchCntReqParamsType->wdiReqStatusCB = NULL;
11390
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011391 vos_mem_copy( pwdiRcvFltPktMatchCntReqParamsType->bssId,
11392 pRcvFltPktMatchRsp->bssId,
11393 sizeof(wpt_macAddr));
11394
Jeff Johnson295189b2012-06-20 16:38:30 -070011395 /* Store Params pass it to WDI */
11396 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktMatchCntReqParamsType;
11397 pWdaParams->pWdaContext = pWDA;
11398 /* Store param pointer as passed in by caller */
11399 pWdaParams->wdaMsgParam = pRcvFltPktMatchRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011400 status = WDI_FilterMatchCountReq(pwdiRcvFltPktMatchCntReqParamsType,
11401 (WDI_FilterMatchCountCb)WDA_FilterMatchCountReqCallback,
11402 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011403 if(IS_WDI_STATUS_FAILURE(status))
11404 {
11405 /* failure returned by WDI API */
11406 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11407 "Failure in WDI_FilterMatchCountReq(), free all the memory " );
11408 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11409 vos_mem_free(pWdaParams) ;
11410 pRcvFltPktMatchRsp->status = eSIR_FAILURE ;
11411 WDA_SendMsg(pWDA, WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP, (void *)pRcvFltPktMatchRsp, 0) ;
11412 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011413 return CONVERT_WDI2VOS_STATUS(status) ;
11414}
Jeff Johnson295189b2012-06-20 16:38:30 -070011415/*
11416 * FUNCTION: WDA_ReceiveFilterSetFilterReqCallback
11417 *
11418 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070011419void WDA_ReceiveFilterClearFilterReqCallback(
11420 WDI_RcvFltPktClearRspParamsType *pwdiRcvFltPktClearRspParamsType,
11421 void * pUserData)
Jeff Johnson295189b2012-06-20 16:38:30 -070011422{
11423 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
Jeff Johnson295189b2012-06-20 16:38:30 -070011424 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11425 "<------ %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011426/* WDA_VOS_ASSERT(NULL != pWdaParams); */
11427 if(NULL == pWdaParams)
11428 {
11429 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11430 "%s: pWdaParams received NULL", __FUNCTION__);
11431 VOS_ASSERT(0) ;
11432 return ;
11433 }
11434
11435 vos_mem_free(pWdaParams->wdaMsgParam) ;
11436 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11437 vos_mem_free(pWdaParams) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011438 //print a msg, nothing else to do
11439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11440 "WDA_ReceiveFilterClearFilterReqCallback invoked " );
Jeff Johnson295189b2012-06-20 16:38:30 -070011441 return ;
11442}
Jeff Johnson295189b2012-06-20 16:38:30 -070011443/*
11444 * FUNCTION: WDA_ProcessReceiveFilterClearFilterReq
11445 * Request to WDI to clear Receive Filters
11446 */
11447VOS_STATUS WDA_ProcessReceiveFilterClearFilterReq (tWDA_CbContext *pWDA,
11448 tSirRcvFltPktClearParam *pRcvFltPktClearParam)
11449{
Jeff Johnson43971f52012-07-17 12:26:56 -070011450 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011451 WDI_RcvFltPktClearReqParamsType *pwdiRcvFltPktClearReqParamsType =
11452 (WDI_RcvFltPktClearReqParamsType *)vos_mem_malloc(sizeof(WDI_RcvFltPktClearReqParamsType));
11453 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11455 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011456 if(NULL == pwdiRcvFltPktClearReqParamsType)
11457 {
11458 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11459 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11460 VOS_ASSERT(0);
11461 return VOS_STATUS_E_NOMEM;
11462 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011463 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11464 if(NULL == pWdaParams)
11465 {
11466 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11467 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11468 VOS_ASSERT(0);
11469 vos_mem_free(pwdiRcvFltPktClearReqParamsType);
11470 return VOS_STATUS_E_NOMEM;
11471 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011472 pwdiRcvFltPktClearReqParamsType->filterClearParam.status = pRcvFltPktClearParam->status;
11473 pwdiRcvFltPktClearReqParamsType->filterClearParam.filterId = pRcvFltPktClearParam->filterId;
Jeff Johnsone7245742012-09-05 17:12:55 -070011474 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.selfMacAddr,
11475 pRcvFltPktClearParam->selfMacAddr, sizeof(wpt_macAddr));
11476 vos_mem_copy(pwdiRcvFltPktClearReqParamsType->filterClearParam.bssId,
11477 pRcvFltPktClearParam->bssId, sizeof(wpt_macAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070011478
11479 pwdiRcvFltPktClearReqParamsType->wdiReqStatusCB = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070011480 /* Store Params pass it to WDI */
11481 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiRcvFltPktClearReqParamsType;
11482 pWdaParams->pWdaContext = pWDA;
11483 /* Store param pointer as passed in by caller */
11484 pWdaParams->wdaMsgParam = pRcvFltPktClearParam;
Jeff Johnson295189b2012-06-20 16:38:30 -070011485 status = WDI_ReceiveFilterClearFilterReq(pwdiRcvFltPktClearReqParamsType,
11486 (WDI_ReceiveFilterClearFilterCb)WDA_ReceiveFilterClearFilterReqCallback,
11487 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011488 if(IS_WDI_STATUS_FAILURE(status))
11489 {
11490 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11491 "Failure in WDA_ProcessReceiveFilterClearFilterReq(), free all the memory " );
11492 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11493 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011494 return CONVERT_WDI2VOS_STATUS(status) ;
11495}
11496#endif // WLAN_FEATURE_PACKET_FILTERING
11497
Jeff Johnson295189b2012-06-20 16:38:30 -070011498/*
11499 * FUNCTION: WDA_ProcessSetPowerParamsReq
11500 * Request to WDI to set power params
11501 */
11502VOS_STATUS WDA_ProcessSetPowerParamsReq(tWDA_CbContext *pWDA,
11503 tSirSetPowerParamsReq *pPowerParams)
11504{
Jeff Johnson43971f52012-07-17 12:26:56 -070011505 WDI_Status status;
Jeff Johnson295189b2012-06-20 16:38:30 -070011506 WDI_SetPowerParamsReqParamsType *pwdiSetPowerParamsReqInfo =
11507 (WDI_SetPowerParamsReqParamsType *)vos_mem_malloc(sizeof(WDI_SetPowerParamsReqParamsType)) ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011508 tWDA_ReqParams *pWdaParams ;
Jeff Johnson295189b2012-06-20 16:38:30 -070011509 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11510 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011511 if(NULL == pwdiSetPowerParamsReqInfo)
11512 {
11513 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11514 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11515 VOS_ASSERT(0);
11516 return VOS_STATUS_E_NOMEM;
11517 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011518 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11519 if(NULL == pWdaParams)
11520 {
11521 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11522 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11523 VOS_ASSERT(0);
11524 vos_mem_free(pwdiSetPowerParamsReqInfo);
11525 return VOS_STATUS_E_NOMEM;
11526 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011527
Jeff Johnson295189b2012-06-20 16:38:30 -070011528
11529 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uIgnoreDTIM =
11530 pPowerParams->uIgnoreDTIM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011531 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uDTIMPeriod =
11532 pPowerParams->uDTIMPeriod;
Jeff Johnson295189b2012-06-20 16:38:30 -070011533 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uListenInterval =
11534 pPowerParams->uListenInterval;
11535 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBcastMcastFilter =
11536 pPowerParams->uBcastMcastFilter;
11537 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uEnableBET =
11538 pPowerParams->uEnableBET;
11539 pwdiSetPowerParamsReqInfo->wdiSetPowerParamsInfo.uBETInterval =
11540 pPowerParams->uBETInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -070011541 pwdiSetPowerParamsReqInfo->wdiReqStatusCB = NULL;
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011542
Jeff Johnson295189b2012-06-20 16:38:30 -070011543 /* Store Params pass it to WDI */
11544 pWdaParams->wdaWdiApiMsgParam = (void *)pwdiSetPowerParamsReqInfo;
11545 pWdaParams->pWdaContext = pWDA;
11546 /* Store param pointer as passed in by caller */
11547 pWdaParams->wdaMsgParam = pPowerParams;
Jeff Johnson295189b2012-06-20 16:38:30 -070011548 status = WDI_SetPowerParamsReq( pwdiSetPowerParamsReqInfo,
11549 (WDI_SetPowerParamsCb)WDA_SetPowerParamsCallback,
11550 pWdaParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070011551 if(IS_WDI_STATUS_FAILURE(status))
11552 {
11553 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11554 "Failure in Set power params REQ WDI API, free all the memory " );
11555 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11556 vos_mem_free(pWdaParams->wdaMsgParam);
11557 pWdaParams->wdaWdiApiMsgParam = NULL;
11558 pWdaParams->wdaMsgParam = NULL;
11559 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011560 return CONVERT_WDI2VOS_STATUS(status) ;
11561}
11562
11563/*
11564 * FUNCTION: WDA_SetTmLevelRspCallback
11565 * Set TM Level response
11566 */
11567void WDA_SetTmLevelRspCallback(WDI_Status status, void* pUserData)
11568{
11569 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11570
11571 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11572 "<------ %s " ,__FUNCTION__);
11573
11574 if(NULL == pWdaParams)
11575 {
11576 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11577 "%s: pWdaParams received NULL", __FUNCTION__);
11578 VOS_ASSERT(0) ;
11579 return ;
11580 }
11581
11582 /* Dose not need to send notification to upper layer
11583 * Just free allocated resources */
11584 if( pWdaParams != NULL )
11585 {
11586 if( pWdaParams->wdaWdiApiMsgParam != NULL )
11587 {
11588 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11589 }
11590 vos_mem_free(pWdaParams->wdaMsgParam) ;
11591 vos_mem_free(pWdaParams) ;
11592 }
11593}
11594
11595/*
11596 * FUNCTION: WDA_ProcessSetTmLevelReq
11597 * Set TM Level request
11598 */
11599VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
11600 tAniSetTmLevelReq *setTmLevelReq)
11601{
11602 WDI_Status status = WDI_STATUS_SUCCESS ;
11603 tWDA_ReqParams *pWdaParams ;
11604 WDI_SetTmLevelReqType *wdiSetTmLevelReq =
11605 (WDI_SetTmLevelReqType *)vos_mem_malloc(
11606 sizeof(WDI_SetTmLevelReqType)) ;
11607 if(NULL == wdiSetTmLevelReq)
11608 {
11609 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11610 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11611 VOS_ASSERT(0);
11612 return VOS_STATUS_E_NOMEM;
11613 }
11614
11615 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11616 if(NULL == pWdaParams)
11617 {
11618 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11619 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11620 VOS_ASSERT(0);
11621 vos_mem_free(wdiSetTmLevelReq);
11622 return VOS_STATUS_E_NOMEM;
11623 }
11624
11625 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11626 "------> %s " ,__FUNCTION__);
11627
11628 wdiSetTmLevelReq->tmMode = setTmLevelReq->tmMode;
11629 wdiSetTmLevelReq->tmLevel = setTmLevelReq->newTmLevel;
11630
11631 pWdaParams->pWdaContext = pWDA;
11632 pWdaParams->wdaMsgParam = setTmLevelReq;
11633 pWdaParams->wdaWdiApiMsgParam = wdiSetTmLevelReq;
11634
11635 status = WDI_SetTmLevelReq(wdiSetTmLevelReq,
11636 (WDI_SetTmLevelCb)WDA_SetTmLevelRspCallback, pWdaParams);
11637
11638 if(IS_WDI_STATUS_FAILURE(status))
11639 {
11640 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11641 "Failure set thernal mitigation level free all the memory " );
11642 vos_mem_free(pWdaParams->wdaMsgParam) ;
11643 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11644 vos_mem_free(pWdaParams) ;
11645 }
11646
11647 return CONVERT_WDI2VOS_STATUS(status) ;
11648}
11649
11650VOS_STATUS WDA_ProcessTxControlInd(tWDA_CbContext *pWDA,
11651 tpTxControlParams pTxCtrlParam)
11652{
11653 VOS_STATUS wdaStatus;
11654
11655 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11656 "------> %s " ,__FUNCTION__);
Jeff Johnson295189b2012-06-20 16:38:30 -070011657 if( pTxCtrlParam == NULL )
11658 {
11659 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11660 "%s: Input tpTxControlParams is NULL", __FUNCTION__);
11661 return VOS_STATUS_E_FAILURE;
11662 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011663 if( pTxCtrlParam->stopTx == eANI_BOOLEAN_TRUE )
11664 {
11665 wdaStatus = WDA_SuspendDataTx(pWDA);
11666 }
11667 else /* pTxCtrlParam->stopTx == eANI_BOOLEAN_FALSE */
11668 {
11669 wdaStatus = WDA_ResumeDataTx(pWDA);
11670 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011671 return wdaStatus;
11672}
11673
11674 /* FUNCTION WDA_featureCapsExchange
11675 * WDA API to invoke capability exchange between host and FW.
11676 */
11677void WDA_featureCapsExchange(v_PVOID_t pVosContext)
11678{
11679 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11680 "%s:enter", __FUNCTION__ );
11681 WDI_featureCapsExchangeReq( NULL, pVosContext);
11682}
11683
11684 /* FUNCTION WDA_getHostWlanFeatCaps
11685 * Wrapper for WDI API, that will return if the feature (enum value).passed
11686 * to this API is supported or not in Host
11687 * return value
11688 * 0 - implies feature is NOT Supported
11689 * any non zero value - implies feature is SUPPORTED
11690 */
11691tANI_U8 WDA_getHostWlanFeatCaps(tANI_U8 featEnumValue)
11692{
11693 return WDI_getHostWlanFeatCaps(featEnumValue);
11694}
11695
11696 /* FUNCTION WDA_getFwWlanFeatCaps
11697 * Wrapper for WDI API, that will return if the feature (enum value).passed
11698 * to this API is supported or not in FW
11699 * return value
11700 * 0 - implies feature is NOT Supported
11701 * any non zero value - implies feature is SUPPORTED
11702 */
11703tANI_U8 WDA_getFwWlanFeatCaps(tANI_U8 featEnumValue)
11704{
11705 return WDI_getFwWlanFeatCaps(featEnumValue);
11706}
11707
11708/*
11709 * FUNCTION: WDA_shutdown
11710 * Shutdown WDA/WDI without handshaking with Riva.
11711 * Synchronous function.
11712 */
11713VOS_STATUS WDA_shutdown(v_PVOID_t pVosContext, wpt_boolean closeTransport)
11714{
11715 WDI_Status wdiStatus;
11716 //tANI_U8 eventIdx = 0;
11717 VOS_STATUS status = VOS_STATUS_SUCCESS;
11718 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Jeff Johnson295189b2012-06-20 16:38:30 -070011719 if (NULL == pWDA)
11720 {
11721 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11722 "%s: Invoked with invalid pWDA", __FUNCTION__ );
11723 VOS_ASSERT(0);
11724 return VOS_STATUS_E_FAILURE;
11725 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011726 /* FTM mode stay START_STATE */
11727 if( (WDA_READY_STATE != pWDA->wdaState) &&
11728 (WDA_INIT_STATE != pWDA->wdaState) &&
11729 (WDA_START_STATE != pWDA->wdaState) )
11730 {
11731 VOS_ASSERT(0);
11732 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011733
Jeff Johnson295189b2012-06-20 16:38:30 -070011734 if ( eDRIVER_TYPE_MFG != pWDA->driverMode )
11735 {
11736 wdaDestroyTimers(pWDA);
11737 }
Madan Mohan Koyyalamudida61e7e2012-10-30 18:08:14 -070011738
Jeff Johnson295189b2012-06-20 16:38:30 -070011739 /* call WDI shutdown */
11740 wdiStatus = WDI_Shutdown(closeTransport);
Jeff Johnson295189b2012-06-20 16:38:30 -070011741 if (IS_WDI_STATUS_FAILURE(wdiStatus) )
11742 {
11743 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11744 "error in WDA Stop" );
11745 status = VOS_STATUS_E_FAILURE;
11746 }
11747 /* WDI stop is synchrnous, shutdown is complete when it returns */
11748 pWDA->wdaState = WDA_STOP_STATE;
11749
Jeff Johnson295189b2012-06-20 16:38:30 -070011750 /* shutdown should perform the stop & close actions. */
11751 /* Destroy the event */
11752 status = vos_event_destroy(&pWDA->txFrameEvent);
11753 if(!VOS_IS_STATUS_SUCCESS(status))
11754 {
11755 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11756 "VOS Event destroy failed - status = %d\n", status);
11757 status = VOS_STATUS_E_FAILURE;
11758 }
11759 status = vos_event_destroy(&pWDA->suspendDataTxEvent);
11760 if(!VOS_IS_STATUS_SUCCESS(status))
11761 {
11762 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11763 "VOS Event destroy failed - status = %d\n", status);
11764 status = VOS_STATUS_E_FAILURE;
11765 }
11766 status = vos_event_destroy(&pWDA->waitOnWdiIndicationCallBack);
11767 if(!VOS_IS_STATUS_SUCCESS(status))
11768 {
11769 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11770 "VOS Event destroy failed - status = %d\n", status);
11771 status = VOS_STATUS_E_FAILURE;
11772 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011773 /* free WDA context */
11774 status = vos_free_context(pVosContext,VOS_MODULE_ID_WDA,pWDA);
11775 if ( !VOS_IS_STATUS_SUCCESS(status) )
11776 {
11777 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11778 "error in WDA close " );
11779 status = VOS_STATUS_E_FAILURE;
11780 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011781 return status;
11782}
Jeff Johnsone7245742012-09-05 17:12:55 -070011783/*
11784 * FUNCTION: WDA_stopFailed
11785 * WDA stop failed
11786 */
11787
11788void WDA_stopFailed(v_PVOID_t pVosContext)
11789{
11790 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -070011791 if(pWDA == NULL)
11792 {
11793 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11794 "Could not get the WDA Context pointer" );
11795 return;
11796 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011797 pWDA->needShutdown = TRUE;
11798}
11799/*
11800 * FUNCTION: WDA_needShutdown
11801 * WDA needs a shutdown
11802 */
11803
11804v_BOOL_t WDA_needShutdown(v_PVOID_t pVosContext)
11805{
11806 tWDA_CbContext *pWDA = (tWDA_CbContext *)VOS_GET_WDA_CTXT(pVosContext);
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -070011807 if(pWDA == NULL)
11808 {
11809 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11810 "Could not get the WDA Context pointer" );
11811 return 0;
11812 }
11813 return pWDA->needShutdown;
Jeff Johnsone7245742012-09-05 17:12:55 -070011814}
11815
Mohit Khanna4a70d262012-09-11 16:30:12 -070011816#ifdef WLAN_FEATURE_11AC
11817/*
11818 * FUNCTION: WDA_SetBeaconFilterReqCallback
11819 *
11820 */
11821void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
11822{
11823 tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
11824 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
11825 "<------ %s " ,__FUNCTION__);
11826 if(NULL == pWdaParams)
11827 {
11828 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11829 "%s: pWdaParams received NULL", __FUNCTION__);
11830 VOS_ASSERT(0) ;
11831 return ;
11832 }
Jeff Johnsone7245742012-09-05 17:12:55 -070011833
Mohit Khanna4a70d262012-09-11 16:30:12 -070011834 vos_mem_free(pWdaParams->wdaMsgParam) ;
11835 vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
11836 vos_mem_free(pWdaParams) ;
11837 /*
11838 * No respone required for SetBeaconFilter req so just free the request
11839 * param here
11840 */
11841
11842 return ;
11843}
11844
11845VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
11846 tUpdateVHTOpMode *pData)
11847{
11848 WDI_Status status = WDI_STATUS_SUCCESS ;
11849 tWDA_ReqParams *pWdaParams ;
11850 WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
11851 sizeof(WDI_UpdateVHTOpMode)) ;
11852 if(NULL == wdiTemp)
11853 {
11854 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11855 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11856 VOS_ASSERT(0);
11857 return VOS_STATUS_E_NOMEM;
11858 }
11859 pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
11860 if(NULL == pWdaParams)
11861 {
11862 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11863 "%s: VOS MEM Alloc Failure", __FUNCTION__);
11864 VOS_ASSERT(0);
11865 vos_mem_free(wdiTemp);
11866 return VOS_STATUS_E_NOMEM;
11867 }
11868
11869 wdiTemp->opMode = pData->opMode;
11870 wdiTemp->staId = pData->staId;
11871
11872 pWdaParams->pWdaContext = pWDA;
11873 /* Store Req pointer, as this will be used for response */
11874 pWdaParams->wdaMsgParam = (void *)pData;
11875 /* store Params pass it to WDI */
11876 pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
11877
11878 status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
11879
11880 if(IS_WDI_STATUS_FAILURE(status))
11881 {
11882 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
11883 "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
11884 vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
11885 vos_mem_free(pWdaParams->wdaMsgParam);
11886 vos_mem_free(pWdaParams);
11887 }
11888 return CONVERT_WDI2VOS_STATUS(status) ;
11889}
11890#endif
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011891
11892/*==========================================================================
11893 FUNCTION WDA_TransportChannelDebug
11894
Madan Mohan Koyyalamudid93f4942012-10-05 15:05:40 -070011895 DESCRIPTION
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011896 Display Transport Channel debugging information
11897 User may request to display DXE channel snapshot
11898 Or if host driver detects any abnormal stcuk may display
11899
11900 PARAMETERS
11901 displaySnapshot : Dispaly DXE snapshot option
11902 enableStallDetect : Enable stall detect feature
11903 This feature will take effect to data performance
11904 Not integrate till fully verification
11905
11906 RETURN VALUE
11907 NONE
11908
11909===========================================================================*/
11910void WDA_TransportChannelDebug
11911(
11912 v_BOOL_t displaySnapshot,
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011913 v_BOOL_t toggleStallDetect
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011914)
11915{
Madan Mohan Koyyalamudi24a00f92012-10-22 15:21:02 -070011916 WDI_TransportChannelDebug(displaySnapshot, toggleStallDetect);
Madan Mohan Koyyalamudi8cb53982012-09-28 14:34:47 -070011917 return;
Madan Mohan Koyyalamudi5eec74a2012-09-28 14:59:25 -070011918}