blob: 573dae7ecaedb7e456e33310ebebf6dfda1c2877 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam1ed83fc2014-02-19 01:15:45 -08002 * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved.
3 *
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/*
Kiet Lama7f454d2014-07-24 12:04:06 -070023 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080026 */
Kiet Lam1ed83fc2014-02-19 01:15:45 -080027
28
Kiet Lama7f454d2014-07-24 12:04:06 -070029
30
Jeff Johnson295189b2012-06-20 16:38:30 -070031/*===========================================================================
32
33
34 W L A N _ Q C T _ WDA _ DS . C
35
36 OVERVIEW:
37
38 This software unit holds the implementation of WLAN Data Abtraction APIs
39 for the WLAN Transport Layer.
40
41 DEPENDENCIES:
42
43 Are listed for each API below.
44
45
Jeff Johnson295189b2012-06-20 16:38:30 -070046===========================================================================*/
47
48/*===========================================================================
49
50 EDIT HISTORY FOR FILE
51
52
53 This section contains comments describing changes made to the module.
54 Notice that changes are listed in reverse chronological order.
55
56
57 $Header:$ $DateTime: $ $Author: $
58
59
60when who what, where, why
61-------- --- ----------------------------------------------
6212/08/2010 seokyoun Created. Move down HAL interfaces from TL to WDA
63 for UMAC convergence btween Volans/Libra and Prima
64=========================================================================== */
65
66#include "wlan_qct_wda.h"
67#include "wlan_qct_tl.h"
68#include "wlan_qct_tli.h"
69#include "tlDebug.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070070
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -080071#define WDA_DS_DXE_RES_COUNT (WDA_TLI_MIN_RES_DATA + 20)
Jeff Johnson295189b2012-06-20 16:38:30 -070072
Gopichand Nakkala11acd112012-12-31 16:04:04 -080073/* macro's for acessing TL API/data structures */
74#define WDA_TL_SET_TX_XMIT_PENDING(a) WLANTL_SetTxXmitPending(a)
75#define WDA_TL_IS_TX_XMIT_PENDING(a) WLANTL_IsTxXmitPending(a)
76#define WDA_TL_CLEAR_TX_XMIT_PENDING(a) WLANTL_ClearTxXmitPending(a)
77
Jeff Johnson295189b2012-06-20 16:38:30 -070078#define WDA_HI_FLOW_MASK 0xF0
79#define WDA_LO_FLOW_MASK 0x0F
80
81static v_VOID_t
82WDA_DS_TxCompleteCB
83(
84 v_PVOID_t pvosGCtx,
85 v_PVOID_t pFrameDataBuff
86);
Jeff Johnson295189b2012-06-20 16:38:30 -070087
Jeff Johnson295189b2012-06-20 16:38:30 -070088
89#ifdef WLAN_PERF
90/*==========================================================================
91 FUNCTION WDA_TLI_FastHwFwdDataFrame
92
93 DESCRIPTION
94 For NON integrated SOC, this function is called by TL.
95
96 Fast path function to quickly forward a data frame if HAL determines BD
97 signature computed here matches the signature inside current VOSS packet.
98 If there is a match, HAL and TL fills in the swapped packet length into
99 BD header and DxE header, respectively. Otherwise, packet goes back to
100 normal (slow) path and a new BD signature would be tagged into BD in this
101 VOSS packet later by the WLANHAL_FillTxBd() function.
102
103 TODO For integrated SOC, this function does nothing yet. Pima SLM/HAL
104 should provide the equivelant functionality.
105
106 DEPENDENCIES
107
108 PARAMETERS
109
110 IN
111 pvosGCtx VOS context
112 vosDataBuff Ptr to VOSS packet
113 pMetaInfo For getting frame's TID
114 pStaInfo For checking STA type
115
116 OUT
117 pvosStatus returned status
118 puFastFwdOK Flag to indicate whether frame could be fast forwarded
119
120 RETURN VALUE
121 No return.
122
123 SIDE EFFECTS
124
125============================================================================*/
126void WDA_TLI_FastHwFwdDataFrame
127(
128 v_PVOID_t pvosGCtx,
129 vos_pkt_t* vosDataBuff,
130 VOS_STATUS* pvosStatus,
131 v_U32_t* puFastFwdOK,
132 WLANTL_MetaInfoType* pMetaInfo,
133 WLAN_STADescType* pStaInfo
134)
135{
Jeff Johnson295189b2012-06-20 16:38:30 -0700136 /* FIXME WDI/WDA should support this function
137 once HAL supports it
138 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700139}
140#endif /*WLAN_PERF*/
141
142/*==========================================================================
143 FUNCTION WDA_DS_Register
144
145 DESCRIPTION
146 Register TL client to WDA. This function registers TL RX/TX functions
147 to WDI by calling WDI_DS_Register.
148
149
150 For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions
151 to register TL's RX/TX functions to BAL
152
153 TODO
154 For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification.
155 The uCount parameter is AC mask. It should be redefined to use the
156 same resource callback function.
157
158 DEPENDENCIES
159
160 PARAMETERS
161
162 IN
163 pvosGCtx VOS context
164 pfnTxCompleteCallback TX complete callback upon TX completion
165 pfnRxPacketCallback RX callback
166 pfnTxPacketCallback TX callback
167 pfnResourceCB gets called when updating TX PDU number
168 uResTheshold minimum TX PDU size for a packet
169 pCallbackContext WDI calls callback function with it
170 VOS global context pointer
171 OUT
172 uAvailableTxBuf available TX PDU numbder.
173 BAL returns it for NON integrated SOC
174
175 RETURN VALUE
176 VOS_STATUS_E_FAULT: pointer is NULL and other errors
177 VOS_STATUS_SUCCESS: Everything is good :)
178
179 SIDE EFFECTS
180
181============================================================================*/
182VOS_STATUS WDA_DS_Register
183(
184 v_PVOID_t pvosGCtx,
185 WDA_DS_TxCompleteCallback pfnTxCompleteCallback,
186 WDA_DS_RxPacketCallback pfnRxPacketCallback,
187 WDA_DS_TxPacketCallback pfnTxPacketCallback,
188 WDA_DS_ResourceCB pfnResourceCB,
189 v_U32_t uResTheshold,
190 v_PVOID_t pCallbackContext,
191 v_U32_t *uAvailableTxBuf
192)
193{
Jeff Johnson295189b2012-06-20 16:38:30 -0700194 tWDA_CbContext *wdaContext = NULL;
195 WDI_Status wdiStatus;
196
197 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
198 "WLAN WDA: WDA_DS_Register" );
199
200 /*------------------------------------------------------------------------
201 Sanity check
202 ------------------------------------------------------------------------*/
203 if ( ( NULL == pvosGCtx ) ||
204 ( NULL == pfnTxPacketCallback ) ||
205 ( NULL == pfnTxCompleteCallback ) ||
206 ( NULL == pfnRxPacketCallback ) ||
207 ( NULL == pfnResourceCB) )
208 {
209 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
210 "WLAN WDA:Invalid pointers on WDA_DS_Register" );
211 return VOS_STATUS_E_FAULT;
212 }
213
214 /*------------------------------------------------------------------------
215 Extract WDA context
216 ------------------------------------------------------------------------*/
217 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
218 if ( NULL == wdaContext )
219 {
220 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
221 "WLAN WDA:Invalid wda context pointer "
222 "from pvosGCtx on WDA_DS_Register" );
223 return VOS_STATUS_E_FAULT;
224 }
225
226 /*------------------------------------------------------------------------
227 Register with WDI as transport layer client
228 ------------------------------------------------------------------------*/
229 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register");
230
231 wdaContext->pfnTxResourceCB = pfnResourceCB;
232 wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback;
233
234 wdiStatus = WDI_DS_Register( wdaContext->pWdiContext,
235 (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB,
236 (WDI_DS_RxPacketCallback)pfnRxPacketCallback,
237 WDA_DS_TxFlowControlCallback,
238 pvosGCtx );
239
240 if ( WDI_STATUS_SUCCESS != wdiStatus )
241 {
242 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
243 "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus );
244 return VOS_STATUS_E_FAILURE;
245 }
246
247 /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF
248 Put hardcoded value not to put TL into OOR. Revisit it */
249 *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT;
250
251 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700252}
253
254/*==========================================================================
255 FUNCTION WDA_DS_StartXmit
256
257 DESCRIPTION
258 Serialize TX transmit reques to TX thread.
259
260 TODO This sends TX transmit request to TL. It should send to WDI for
261 abstraction.
262
263 For NON integrated SOC, this function calls WLANBAL_StartXmit
264
265 DEPENDENCIES
266
267 PARAMETERS
268
269 IN
270 pvosGCtx VOS context
271
272 RETURN VALUE
273 VOS_STATUS_E_FAULT: pointer is NULL and other errors
274 VOS_STATUS_SUCCESS: Everything is good :)
275
276 SIDE EFFECTS
277
278============================================================================*/
279VOS_STATUS
280WDA_DS_StartXmit
281(
282 v_PVOID_t pvosGCtx
283)
284{
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 vos_msg_t sMessage;
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800286 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700287/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
288
289 if ( NULL == pvosGCtx )
290 {
291 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
292 "WLAN WDA:Invalid pointers on WDA_DS_StartXmit" );
293 return VOS_STATUS_E_FAULT;
294 }
295
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800296 if(WDA_TL_IS_TX_XMIT_PENDING( pvosGCtx ))
297 {
298 /*Already WDA_DS_TX_START_XMIT msg is pending in TL msg queue */
299 return VOS_STATUS_SUCCESS;
300 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700301 /* Serialize our event */
302 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
303 "Serializing WDA TX Start Xmit event" );
304
305 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
306
307 sMessage.bodyptr = NULL;
308 sMessage.type = WDA_DS_TX_START_XMIT;
309
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800310 WDA_TL_SET_TX_XMIT_PENDING(pvosGCtx);
311
312 status = vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
313
314 if(status != VOS_STATUS_SUCCESS)
315 {
316 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_FATAL,
317 "Serializing WDA TX Start Xmit event FAILED" );
318 WDA_TL_CLEAR_TX_XMIT_PENDING(pvosGCtx);
319 }
320 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700321}
322
323
324/*==========================================================================
325 FUNCTION WDA_DS_FinishULA
326
327 DESCRIPTION
328 Serialize Finish Upper Level Authentication reques to TX thread.
329
330 DEPENDENCIES
331
332 PARAMETERS
333
334 IN
335 callbackRoutine routine to be called in TX thread
336 callbackContext user data for the above routine
337
338 RETURN VALUE
339 please see vos_tx_mq_serialize
340
341 SIDE EFFECTS
342
343============================================================================*/
344VOS_STATUS
345WDA_DS_FinishULA
346(
347 void (*callbackRoutine) (void *callbackContext),
Tushnim Bhattacharyya39a8f182013-02-20 18:10:30 -0800348 void *callbackContext
Jeff Johnson295189b2012-06-20 16:38:30 -0700349)
350{
351 vos_msg_t sMessage;
352/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
353
354 /* Serialize our event */
355 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
356 "Serializing WDA_DS_FinishULA event" );
357
358 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
Arun Kumar Khandavalli8d1979d2014-01-09 21:12:25 +0530359 sMessage.bodyptr = callbackContext;
360 sMessage.callback = callbackRoutine;
361 sMessage.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700362 sMessage.type = WDA_DS_FINISH_ULA;
363
364 return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
365}/*WDA_DS_FinishULA*/
366
367/*==========================================================================
368 FUNCTION WDA_DS_BuildTxPacketInfo
369
370 DESCRIPTION
371 Build TX meta info for integrated SOC.
372
373 Same function calls HAL for reserve BD header space into VOS packet and
374 HAL function to fill it.
375
376 DEPENDENCIES
377
378 PARAMETERS
379
380 IN
381 pvosGCtx VOS context
382 vosDataBuff vos data buffer
383 pvDestMacAddr destination MAC address ponter
384 ucDisableFrmXtl Is frame xtl disabled?
385 ucQosEnabled Is QoS enabled?
386 ucWDSEnabled Is WDS enabled?
387 extraHeadSpace Extra head bytes. If it's not 0 due to 4 bytes align
388 of BD header.
389 typeSubtype typeSubtype from MAC header or TX metainfo/BD
390 pAddr2 address 2
391 uTid tid
392 txFlag
393 timeStamp
394 ucIsEapol
395 ucUP
396
397 OUT
398 *pusPktLen Packet length
399
400 RETURN VALUE
401 VOS_STATUS_E_FAULT: pointer is NULL and other errors
402 VOS_STATUS_SUCCESS: Everything is good :)
403
404 SIDE EFFECTS
405
406============================================================================*/
407VOS_STATUS
408WDA_DS_BuildTxPacketInfo
409(
410 v_PVOID_t pvosGCtx,
411 vos_pkt_t* vosDataBuff,
412 v_MACADDR_t* pvDestMacAddr,
413 v_U8_t ucDisableFrmXtl,
414 v_U16_t* pusPktLen,
415 v_U8_t ucQosEnabled,
416 v_U8_t ucWDSEnabled,
417 v_U8_t extraHeadSpace,
418 v_U8_t typeSubtype,
419 v_PVOID_t pAddr2,
420 v_U8_t uTid,
Kanchanapally, Vidyullathaf9426e52013-12-24 17:28:54 +0530421 v_U32_t txFlag,
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 v_U32_t timeStamp,
423 v_U8_t ucIsEapol,
424 v_U8_t ucUP
425)
426{
Jeff Johnson295189b2012-06-20 16:38:30 -0700427 VOS_STATUS vosStatus;
428 WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL;
429 v_SIZE_t usMacAddrSize;
Chet Lanctot4b088622013-05-22 16:09:22 -0700430 wpt_FrameCtrl *pFrameControl;
Jeff Johnson295189b2012-06-20 16:38:30 -0700431 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
432
433 /*------------------------------------------------------------------------
434 Sanity check
435 Extract TL control block
436 ------------------------------------------------------------------------*/
437 if ( ( NULL == pvosGCtx ) || ( NULL == vosDataBuff ) || ( NULL == pvDestMacAddr ) )
438 {
439 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
440 "WDA:Invalid parameter sent on WDA_DS_BuildTxPacketInfo" );
441 return VOS_STATUS_E_FAULT;
442 }
443
444 /*------------------------------------------------------------------------
445 Extract TX Meta Info pointer from PAL packet
446 ------------------------------------------------------------------------*/
447 pTxMetaInfo = WDI_DS_ExtractTxMetaData( VOS_TO_WPAL_PKT(vosDataBuff) );
448 if ( NULL == pTxMetaInfo )
449 {
450 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
451 "WLAN TL:Invalid RxMetaInfo pointer from PAL packet on WLANTL_RxFrames");
452 VOS_ASSERT( 0 );
453 return VOS_STATUS_E_FAULT;
454 }
455
456 /* Zero out memeory */
457 vos_mem_zero( pTxMetaInfo, sizeof( WDI_DS_TxMetaInfoType ) );
458
459 /* Fill the TX Meta info */
460 pTxMetaInfo->txFlags = txFlag;
461 pTxMetaInfo->qosEnabled = ucQosEnabled;
462 pTxMetaInfo->fenableWDS = ucWDSEnabled;
463 pTxMetaInfo->ac = ucUP;
464 pTxMetaInfo->fUP = uTid;
465 pTxMetaInfo->isEapol = ucIsEapol;
466 pTxMetaInfo->fdisableFrmXlt = ucDisableFrmXtl;
467 pTxMetaInfo->frmType = ( ( typeSubtype & 0x30 ) >> 4 );
468 pTxMetaInfo->typeSubtype = typeSubtype;
469
470 /* Length = MAC header + payload */
471 vos_pkt_get_packet_length( vosDataBuff, pusPktLen);
472 pTxMetaInfo->fPktlen = *pusPktLen;
473
Chet Lanctot4b088622013-05-22 16:09:22 -0700474 /* For management frames, peek into Frame Control
475 field to get value of Protected Frame bit */
476 pTxMetaInfo->fProtMgmtFrame = 0;
477 if ( WDA_TLI_MGMT_FRAME_TYPE == pTxMetaInfo->frmType )
478 {
479 if ( 1 == ucDisableFrmXtl ) /* should be 802.11, but check */
480 {
481 vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)&pFrameControl,
482 sizeof( wpt_FrameCtrl ));
483 if ( VOS_STATUS_SUCCESS != vosStatus )
484 {
485 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
486 "WDA: Failed while attempting to extract Protect Bit in "
487 "Frame Control, status %d", vosStatus );
488 VOS_ASSERT( 0 );
489 return VOS_STATUS_E_FAULT;
490 }
491 pTxMetaInfo->fProtMgmtFrame = pFrameControl->wep;
492 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
493 "WLAN TL: fProtMgmtFrame:%d", pTxMetaInfo->fProtMgmtFrame );
494 }
495 }
496
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 // Dst address
498 usMacAddrSize = VOS_MAC_ADDR_SIZE;
499 vosStatus = vos_pkt_extract_data( vosDataBuff,
500 WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ),
501 (v_PVOID_t)pvDestMacAddr,
502 &usMacAddrSize );
Manjunathappa Prakashfb585462013-12-23 19:07:07 -0800503 if ((VOS_STATUS_SUCCESS != vosStatus) ||
504 (usMacAddrSize != VOS_MAC_ADDR_SIZE))
Jeff Johnson295189b2012-06-20 16:38:30 -0700505 {
506 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
507 "WDA:Failed while attempting to extract MAC Addr %d",
508 vosStatus );
509 VOS_ASSERT( 0 );
510 return VOS_STATUS_E_FAULT;
511 }
512
Jeff Johnson295189b2012-06-20 16:38:30 -0700513 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr );
514
515 // ADDR2
516 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress, pAddr2 );
517
518 /* Dump TX meta infro for debugging */
519 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
520 "WLAN TL: Dump TX meta info: "
521 "txFlags:%d, qosEnabled:%d, ac:%d, "
Chet Lanctot4b088622013-05-22 16:09:22 -0700522 "isEapol:%d, fdisableFrmXlt:%d, frmType:%d",
Jeff Johnson295189b2012-06-20 16:38:30 -0700523 pTxMetaInfo->txFlags, ucQosEnabled, pTxMetaInfo->ac,
Chet Lanctot4b088622013-05-22 16:09:22 -0700524 pTxMetaInfo->isEapol, pTxMetaInfo->fdisableFrmXlt,
525 pTxMetaInfo->frmType );
Jeff Johnson295189b2012-06-20 16:38:30 -0700526
527 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700528}
529
530
531/*==========================================================================
532 FUNCTION WDS_DS_TrimRxPacketInfo
533
534 DESCRIPTION
535 Trim/Remove RX BD header for NON integrated SOC.
536 It does nothing for integrated SOC.
537
538 DEPENDENCIES
539
540 PARAMETERS
541
542 IN
543 vosDataBuff vos data buffer
544
545 RETURN VALUE
546 VOS_STATUS_E_FAULT: pointer is NULL and other errors
547 VOS_STATUS_SUCCESS: Everything is good :)
548
549 SIDE EFFECTS
550
551============================================================================*/
552VOS_STATUS
553WDA_DS_TrimRxPacketInfo
554(
555 vos_pkt_t *vosDataBuff
556)
557{
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 /* Nothing to trim
559 * Do Nothing */
560
561 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700562}
563
564
565
566/*==========================================================================
567 FUNCTION WDA_DS_PeekRxPacketInfo
568
569 DESCRIPTION
570 Return RX metainfo pointer for for integrated SOC.
571
572 Same function will return BD header pointer.
573
574 DEPENDENCIES
575
576 PARAMETERS
577
578 IN
579 vosDataBuff vos data buffer
580
581 pvDestMacAddr destination MAC address ponter
582 bSwap Want to swap BD header? For backward compatability
583 It does nothing for integrated SOC
584 OUT
585 *ppRxHeader RX metainfo pointer
586
587 RETURN VALUE
588 VOS_STATUS_E_FAULT: pointer is NULL and other errors
589 VOS_STATUS_SUCCESS: Everything is good :)
590
591 SIDE EFFECTS
592
593============================================================================*/
594VOS_STATUS
595WDA_DS_PeekRxPacketInfo
596(
597 vos_pkt_t *vosDataBuff,
598 v_PVOID_t *ppRxHeader,
599 v_BOOL_t bSwap
600)
601{
Jeff Johnson295189b2012-06-20 16:38:30 -0700602 /*------------------------------------------------------------------------
603 Sanity check
604 ------------------------------------------------------------------------*/
605 if ( NULL == vosDataBuff )
606 {
607 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
608 "WDA:Invalid parameter sent on WDA_DS_PeekRxPacketInfo" );
609 return VOS_STATUS_E_FAULT;
610 }
611
612 *ppRxHeader = WDI_DS_ExtractRxMetaData( (wpt_packet*)vosDataBuff );
613
614 if ( NULL == *ppRxHeader )
615 {
616 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
617 "WDA:Failed to get RX meta data from WDI" );
618 return VOS_STATUS_E_FAILURE;
619 }
620
621 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700622}
623
624
625
626/*==========================================================================
627 FUNCTION WDA_DS_GetFrameTypeSubType
628
629 DESCRIPTION
630 Get typeSubtype from the packet. The BD header should have this.
631 But some reason, Libra/Volans read it from 802.11 header and save it
632 back to BD header. So for NON integrated SOC, this function does
633 the same.
634
635 For integrated SOC, WDI does the same, not TL.
636 It does return typeSubtype from RX meta info for integrated SOC.
637
638 DEPENDENCIES
639
640 PARAMETERS
641
642 IN
643 pvosGCtx VOS context
644 vosDataBuff vos data buffer
645 pRxHeader RX meta info or BD header pointer
646
647 OUT
648 ucTypeSubtype typeSubtype
649
650 RETURN VALUE
651 VOS_STATUS_E_FAULT: pointer is NULL and other errors
652 VOS_STATUS_SUCCESS: Everything is good :)
653
654 SIDE EFFECTS
655
656============================================================================*/
657VOS_STATUS
658WDA_DS_GetFrameTypeSubType
659(
660 v_PVOID_t pvosGCtx,
661 vos_pkt_t *vosDataBuff,
662 v_PVOID_t pRxHeader,
663 v_U8_t *ucTypeSubtype
664)
665{
Jeff Johnson295189b2012-06-20 16:38:30 -0700666 /*------------------------------------------------------------------------
667 Sanity check
668 ------------------------------------------------------------------------*/
669 if ( NULL == pRxHeader )
670 {
671 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
672 "WDA:Invalid parameter sent on WDA_DS_GetFrameTypeSubType" );
673 return VOS_STATUS_E_FAULT;
674 }
675
676 *ucTypeSubtype = ( WDA_GET_RX_TYPE( pRxHeader ) << 4 ) | WDA_GET_RX_SUBTYPE( pRxHeader );
677
678 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700679}
680
681
682/*==========================================================================
683 FUNCTION WDA_DS_RxAmsduBdFix
684
685 DESCRIPTION
686 For backward compatability with Libra/Volans. Need to call HAL function
687 for HW BD bug fix
688
689 It does nothing for integrated SOC.
690
691 DEPENDENCIES
692
693 PARAMETERS
694
695 IN
696 pvosGCtx VOS context
697 pvBDHeader BD header pointer
698
699 OUT
700
701 RETURN VALUE
702 VOS_STATUS_E_FAULT: pointer is NULL and other errors
703 VOS_STATUS_SUCCESS: Everything is good :)
704
705 SIDE EFFECTS
706
707============================================================================*/
708VOS_STATUS
709WDA_DS_RxAmsduBdFix
710(
711 v_PVOID_t pvosGCtx,
712 v_PVOID_t pvBDHeader
713)
714{
Jeff Johnson295189b2012-06-20 16:38:30 -0700715 /* Do nothing for Prima */
716 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700717}
718
719/*==========================================================================
720 FUNCTION WDA_DS_GetRssi
721
722 DESCRIPTION
723 Get RSSI
724
725 TODO It returns hardcoded value in the meantime since WDA/WDI does nothing
726 support it yet for Prima.
727
728 DEPENDENCIES
729
730 PARAMETERS
731
732 IN
733 vosDataBuff vos data buffer
734
735 OUT
736 puRssi RSSI
737
738 RETURN VALUE
739 VOS_STATUS_E_FAULT: pointer is NULL and other errors
740 VOS_STATUS_SUCCESS: Everything is good :)
741
742 SIDE EFFECTS
743
744============================================================================*/
745VOS_STATUS
746WDA_DS_GetRssi
747(
748 v_PVOID_t pvosGCtx,
749 v_S7_t* puRssi
750)
751{
Jeff Johnson295189b2012-06-20 16:38:30 -0700752 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
753 "WDA:halPS_GetRssi no longer supported. Need replacement");
754
755 *puRssi = -30;
756
757 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700758}
759
760/*==========================================================================
761 FUNCTION WDA_DS_GetTxResources
762
763 DESCRIPTION
764 It does return hardcoded value. It should bigger number than 0.
765 Returning 0 will put TL in out-of-resource condition for TX.
766
767 Return current PDU resources from BAL for NON integrated SOC.
768
769 DEPENDENCIES
770
771 PARAMETERS
772
773 IN
774 vosDataBuff vos data buffer
775
776 OUT
777 puResCount available PDU number for TX
778
779 RETURN VALUE
780 VOS_STATUS_E_FAULT: pointer is NULL and other errors
781 VOS_STATUS_SUCCESS: Everything is good :)
782
783 SIDE EFFECTS
784
785============================================================================*/
786VOS_STATUS
787WDA_DS_GetTxResources
788(
789 v_PVOID_t pvosGCtx,
790 v_U32_t* puResCount
791)
792{
Jeff Johnson295189b2012-06-20 16:38:30 -0700793 /* Return minimum necessary number of packet(DXE descriptor) for data */
794 /* TODO Need to get this from DXE??? */
795 *puResCount = WDA_TLI_BD_PDU_RESERVE_THRESHOLD + 50;
796 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700797}
798
799
800
801/*==========================================================================
802 FUNCTION WDA_DS_GetReplayCounter
803
804 DESCRIPTION
805 Return replay counter from BD header or RX meta info
806
807 DEPENDENCIES
808
809 PARAMETERS
810
811 IN
812 pRxHeader RX meta info or BD header pointer
813
814 OUT
815
816 RETURN VALUE
817 Replay Counter
818
819 SIDE EFFECTS
820
821============================================================================*/
822v_U64_t
823WDA_DS_GetReplayCounter
824(
825 v_PVOID_t pRxHeader
826)
827{
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 return WDA_GET_RX_REPLAY_COUNT( pRxHeader );
Jeff Johnson295189b2012-06-20 16:38:30 -0700829}
830
Jeff Johnson295189b2012-06-20 16:38:30 -0700831/*==========================================================================
832 FUNCTION WDA_DS_TxFrames
833
834 DESCRIPTION
835 Pull packets from TL and push them to WDI. It gets invoked upon
836 WDA_DS_TX_START_XMIT.
837
838 This function is equivelant of WLANSSC_Transmit in Libra/Volans.
839
840 TODO
841 This function should be implemented and moved in WDI.
842
843 DEPENDENCIES
844
845 PARAMETERS
846
847 IN
848 pvosGCtx VOS context
849
850 OUT
851
852 RETURN VALUE
853 VOS_STATUS_E_FAULT: pointer is NULL and other errors
854 VOS_STATUS_SUCCESS: Everything is good :)
855
856 SIDE EFFECTS
857
858============================================================================*/
859
860VOS_STATUS
861WDA_DS_TxFrames
862(
863 v_PVOID_t pvosGCtx
864)
865{
866 VOS_STATUS vosStatus;
867 vos_pkt_t *pTxMgmtChain = NULL;
868 vos_pkt_t *pTxDataChain = NULL;
869 vos_pkt_t *pTxPacket = NULL;
870 v_BOOL_t bUrgent;
871 wpt_uint32 ucTxResReq;
872 WDI_Status wdiStatus;
873 tWDA_CbContext *wdaContext = NULL;
874 v_U32_t uMgmtAvailRes;
875 v_U32_t uDataAvailRes;
876 WLANTL_TxCompCBType pfnTxComp = NULL;
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -0800877 v_U32_t uTxFailCount = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700878
879 wdaContext = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pvosGCtx);
880 if ( NULL == wdaContext )
881 {
882 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
883 "WDA:Invalid wda context pointer from pvosGCtx on WDA_DS_TxFrames" );
884 return VOS_STATUS_E_FAULT;
885 }
886
887 /*-------------------------------------------------------------------------
888 Need to fetch separatelly for Mgmt and Data frames because TL is not
889 aware of separate resource management at the lower levels
890 -------------------------------------------------------------------------*/
891 /*Mgmt tx*/
892 uMgmtAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
893 WDI_MGMT_POOL_ID);
894
895 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
896 &pTxMgmtChain,
897 uMgmtAvailRes,
898 (wdaContext->uTxFlowMask & WDA_HI_FLOW_MASK),
899 &bUrgent );
900
901 // We need to initialize vsoStatus in case we don't enter the "while"
902 // loop. If we don't enter the loop, it means that there are no packets,
903 // available, and that is considered success. If we enter the loop,
904 // vosStatus will be set appropriately inside the loop
905 vosStatus = VOS_STATUS_SUCCESS;
906
907 while ( NULL != pTxMgmtChain )
908 {
909 /* Walk the chain and unchain the packet */
910 pTxPacket = pTxMgmtChain;
911 vosStatus = vos_pkt_walk_packet_chain( pTxMgmtChain, &pTxMgmtChain, VOS_TRUE );
912
913 if( (VOS_STATUS_SUCCESS != vosStatus) &&
914 (VOS_STATUS_E_EMPTY != vosStatus) )
915 {
916 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
917 "WDA Walking packet chain returned status : %d", vosStatus );
918 VOS_ASSERT( 0 );
919 vosStatus = VOS_STATUS_E_FAILURE;
920 break;
921 }
922
923 if ( VOS_STATUS_E_EMPTY == vosStatus )
924 {
925 vosStatus = VOS_STATUS_SUCCESS;
926 }
927
928 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
929 (wpt_packet*)pTxPacket,
930 0 /* more */ );
931 if ( WDI_STATUS_SUCCESS != wdiStatus )
932 {
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -0800933 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
Yue Maf74c9862013-03-21 16:36:15 -0700934 "WDA : Pushing a packet to WDI failed." );
935 if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus )
936 {
937 uTxFailCount++;
938 }
939 VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -0700940 //We need to free the packet here
941 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
942 if(pfnTxComp)
943 {
944 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
945 }
946 }
947
948 };
949
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -0800950 if ( uTxFailCount )
951 {
952 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
953 "WDA : Tx fail count for mgmt pkts: %d.", uTxFailCount);
954 uTxFailCount = 0;
955 }
956
Jeff Johnson295189b2012-06-20 16:38:30 -0700957 /*Data tx*/
958 uDataAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
959 WDI_DATA_POOL_ID);
960
961 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
962 &pTxDataChain,
963 /*WDA_DS_DXE_RES_COUNT*/ uDataAvailRes,
964 (wdaContext->uTxFlowMask & WDA_LO_FLOW_MASK),
965 &bUrgent );
966
967 // We need to initialize vsoStatus in case we don't enter the "while"
968 // loop. If we don't enter the loop, it means that there are no packets,
969 // available, and that is considered success. If we enter the loop,
970 // vosStatus will be set appropriately inside the loop
971 vosStatus = VOS_STATUS_SUCCESS;
972
973 while ( NULL != pTxDataChain )
974 {
975 /* Walk the chain and unchain the packet */
976 pTxPacket = pTxDataChain;
977 vosStatus = vos_pkt_walk_packet_chain( pTxDataChain, &pTxDataChain, VOS_TRUE );
978
979 if( (VOS_STATUS_SUCCESS != vosStatus) &&
980 (VOS_STATUS_E_EMPTY != vosStatus) )
981 {
982 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
983 "WDA Walking packet chain returned status : %d", vosStatus );
984 VOS_ASSERT( 0 );
985 vosStatus = VOS_STATUS_E_FAILURE;
986 break;
987 }
988
989 if ( VOS_STATUS_E_EMPTY == vosStatus )
990 {
991 vosStatus = VOS_STATUS_SUCCESS;
992 }
993
994 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
995 (wpt_packet*)pTxPacket,
996 0 /* more */ );
997 if ( WDI_STATUS_SUCCESS != wdiStatus )
998 {
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -0800999 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
Yue Maf74c9862013-03-21 16:36:15 -07001000 "WDA : Pushing a packet to WDI failed." );
1001 if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus )
1002 {
1003 uTxFailCount++;
1004 }
1005 VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -07001006 //We need to free the packet here
1007 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
1008 if(pfnTxComp)
1009 {
1010 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
1011 }
1012 }
1013
1014 };
1015
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -08001016 if ( uTxFailCount )
1017 {
1018 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1019 "WDA : Tx fail count for data pkts: %d.", uTxFailCount);
1020 }
1021
1022
Jeff Johnson295189b2012-06-20 16:38:30 -07001023 WDI_DS_TxComplete(wdaContext->pWdiContext, ucTxResReq);
1024
1025 return vosStatus;
1026}
Jeff Johnson295189b2012-06-20 16:38:30 -07001027
Jeff Johnson295189b2012-06-20 16:38:30 -07001028/*==========================================================================
1029 FUNCTION WDA_DS_TxFlowControlCallback
1030
1031 DESCRIPTION
1032 Invoked by WDI to control TX flow.
1033
1034 DEPENDENCIES
1035
1036 PARAMETERS
1037
1038 IN
1039 pvosGCtx VOS context
1040 uFlowMask TX channel mask for flow control
1041 Defined in WDA_TXFlowEnumType
1042
1043 OUT
1044
1045 RETURN VALUE
1046
1047 SIDE EFFECTS
1048
1049============================================================================*/
1050v_VOID_t
1051WDA_DS_TxFlowControlCallback
1052(
1053 v_PVOID_t pvosGCtx,
1054 v_U8_t ucFlowMask
1055)
1056{
1057 tWDA_CbContext* wdaContext = NULL;
1058 v_U8_t ucOldFlowMask;
1059 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1060
1061 /*------------------------------------------------------------------------
1062 Sanity check
1063 ------------------------------------------------------------------------*/
1064 if ( NULL == pvosGCtx )
1065 {
1066 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1067 "WDA: Invalid parameter sent on WDA_DS_TxFlowControlCallback" );
1068 return;
1069 }
1070
1071 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1072 if ( NULL == wdaContext )
1073 {
1074 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1075 "WDA: Invalid context on WDA_DS_TxFlowControlCallback" );
1076 return;
1077 }
1078
1079 /* two physical DXE channels
1080 1) data packets(all four AC) and BAP for the low priority channel(lower 4 bits)
1081 2) management packets for high priority channel(5th bit)
1082 */
1083
1084
1085 /*Save and reset */
1086 ucOldFlowMask = wdaContext->uTxFlowMask;
1087 wdaContext->uTxFlowMask = ucFlowMask;
1088
1089 /*If the AC is being enabled - resume data xfer
1090
1091 Assume previous value of wdaContext->uTxFlowMask:
1092
1093 DATA\MGM | ON | OFF
1094 ----------------------
1095 ON | 1F | 0F *
1096 ----------------------
1097 OFF | 10 *| 00 *
1098
1099 * - states in which a channel can be enabled
1100
1101 ucFlowMask will tell which channel must be enabled
1102 to enable a channel a new bit must be turned on =>
1103 ucFlowMask > wdaContext->uTxFlowMask when enable happens
1104 */
1105
1106 if ( ucFlowMask > ucOldFlowMask )
1107 {
1108 WDA_DS_StartXmit(pvosGCtx);
1109 }
1110
1111}
Jeff Johnson295189b2012-06-20 16:38:30 -07001112
1113/*==========================================================================
1114 FUNCTION WDA_DS_GetTxFlowMask
1115
1116 DESCRIPTION
1117 return TX flow mask control value
1118
1119 DEPENDENCIES
1120
1121 PARAMETERS
1122
1123 IN
1124 pvosGCtx VOS context
1125
1126 OUT
1127 uFlowMask TX channel mask for flow control
1128 Defined in WDA_TXFlowEnumType
1129
1130 RETURN VALUE
1131 VOS_STATUS_E_INVAL: pointer is NULL and other errors
1132 VOS_STATUS_SUCCESS: Everything is good :)
1133
1134 SIDE EFFECTS
1135
1136============================================================================*/
1137VOS_STATUS
1138WDA_DS_GetTxFlowMask
1139(
1140 v_PVOID_t pvosGCtx,
1141 v_U8_t* puFlowMask
1142)
1143{
Jeff Johnson295189b2012-06-20 16:38:30 -07001144 tWDA_CbContext* wdaContext = NULL;
1145 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1146
1147 /*------------------------------------------------------------------------
1148 Sanity check
1149 ------------------------------------------------------------------------*/
1150 if ( ( NULL == pvosGCtx ) || ( NULL == puFlowMask ) )
1151 {
1152 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1153 "WDA: Invalid parameter sent on WDA_DS_GetTxFlowMask" );
1154 return VOS_STATUS_E_INVAL;
1155 }
1156
1157 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1158 if ( NULL == wdaContext )
1159 {
1160 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1161 "WDA: Invalid context on WDA_DS_GetTxFlowMask" );
1162 return VOS_STATUS_E_INVAL;
1163 }
1164
1165 *puFlowMask = wdaContext->uTxFlowMask;
1166
1167 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001168}
1169
Jeff Johnson295189b2012-06-20 16:38:30 -07001170v_VOID_t
1171WDA_DS_TxCompleteCB
1172(
1173 v_PVOID_t pvosGCtx,
1174 v_PVOID_t pFrameDataBuff
1175)
1176{
1177 tWDA_CbContext* wdaContext = NULL;
1178 WDI_DS_TxMetaInfoType* pTxMetadata;
1179 VOS_STATUS vosStatus;
1180 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1181
1182 /*------------------------------------------------------------------------
1183 Sanity check
1184 ------------------------------------------------------------------------*/
1185
1186 if ( ( NULL == pvosGCtx ) || ( NULL == pFrameDataBuff ) )
1187 {
1188 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1189 "WDA: Invalid parameter sent on WDA_DS_TxCompleteCB" );
1190 return;
1191 }
1192
1193 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1194 if ( NULL == wdaContext )
1195 {
1196 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1197 "WDA: Invalid context on WDA_DS_TxCompleteCB" );
1198 return;
1199 }
1200
1201 // extract metadata from PAL packet
1202 pTxMetadata = WDI_DS_ExtractTxMetaData( (wpt_packet*)pFrameDataBuff );
1203
1204 if ( eWLAN_PAL_STATUS_SUCCESS == pTxMetadata->txCompleteStatus )
1205 vosStatus = VOS_STATUS_SUCCESS;
1206 else
1207 vosStatus = VOS_STATUS_E_FAILURE;
1208
1209 wdaContext->pfnTxCompleteCallback( pvosGCtx, pFrameDataBuff, vosStatus );
1210}