blob: de7d4b6f47ae8008d0e85da25dff62f0bec03631 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, 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/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/*===========================================================================
43
44
45 W L A N _ Q C T _ WDA _ DS . C
46
47 OVERVIEW:
48
49 This software unit holds the implementation of WLAN Data Abtraction APIs
50 for the WLAN Transport Layer.
51
52 DEPENDENCIES:
53
54 Are listed for each API below.
55
56
57 Copyright (c) 2010-2011 QUALCOMM Incorporated.
58 All Rights Reserved.
59 Qualcomm Confidential and Proprietary
60===========================================================================*/
61
62/*===========================================================================
63
64 EDIT HISTORY FOR FILE
65
66
67 This section contains comments describing changes made to the module.
68 Notice that changes are listed in reverse chronological order.
69
70
71 $Header:$ $DateTime: $ $Author: $
72
73
74when who what, where, why
75-------- --- ----------------------------------------------
7612/08/2010 seokyoun Created. Move down HAL interfaces from TL to WDA
77 for UMAC convergence btween Volans/Libra and Prima
78=========================================================================== */
79
80#include "wlan_qct_wda.h"
81#include "wlan_qct_tl.h"
82#include "wlan_qct_tli.h"
83#include "tlDebug.h"
84#if defined( FEATURE_WLAN_NON_INTEGRATED_SOC )
85#include "wlan_bal_misc.h"
86#endif
87
Madan Mohan Koyyalamudia53c4dc2012-11-13 10:35:42 -080088#define WDA_DS_DXE_RES_COUNT (WDA_TLI_MIN_RES_DATA + 20)
Jeff Johnson295189b2012-06-20 16:38:30 -070089
90#define VOS_TO_WPAL_PKT(_vos_pkt) ((wpt_packet*)_vos_pkt)
91
92#if defined( FEATURE_WLAN_INTEGRATED_SOC )
93#define WDA_HI_FLOW_MASK 0xF0
94#define WDA_LO_FLOW_MASK 0x0F
95
96static v_VOID_t
97WDA_DS_TxCompleteCB
98(
99 v_PVOID_t pvosGCtx,
100 v_PVOID_t pFrameDataBuff
101);
102#endif
103
104#if defined( FEATURE_WLAN_NON_INTEGRATED_SOC )
105/*==========================================================================
106 FUNCTION WDA_DS_PrepareBDHeader
107
108 DESCRIPTION
109 Inline function for preparing BD header before HAL processing.
110
111 DEPENDENCIES
112 Just notify HAL that suspend in TL is complete.
113
114 PARAMETERS
115
116 IN
117 vosDataBuff: vos data buffer
118 ucDisableFrmXtl: is frame xtl disabled
119
120 OUT
121 ppvBDHeader: it will contain the BD header
122 pvDestMacAddr: it will contain the destination MAC address
123 pvosStatus: status of the combined processing
124 pusPktLen: packet len.
125
126 RETURN VALUE
127 No return.
128
129 SIDE EFFECTS
130
131============================================================================*/
132void
133WDA_DS_PrepareBDHeader
134(
135 vos_pkt_t* vosDataBuff,
136 v_PVOID_t* ppvBDHeader,
137 v_MACADDR_t* pvDestMacAddr,
138 v_U8_t ucDisableFrmXtl,
139 VOS_STATUS* pvosStatus,
140 v_U16_t* pusPktLen,
141 v_U8_t ucQosEnabled,
142 v_U8_t ucWDSEnabled,
143 v_U8_t extraHeadSpace
144)
145{
146 v_U8_t ucHeaderOffset;
147 v_U8_t ucHeaderLen;
148#ifndef WLAN_SOFTAP_FEATURE
149 v_PVOID_t pvPeekData;
150#endif
151 v_U8_t ucBDHeaderLen = WLANTL_BD_HEADER_LEN(ucDisableFrmXtl);
152
153 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
154 /*-------------------------------------------------------------------------
155 Get header pointer from VOSS
156 !!! make sure reserve head zeros out the memory
157 -------------------------------------------------------------------------*/
158 vos_pkt_get_packet_length( vosDataBuff, pusPktLen);
159
160 if ( WLANTL_MAC_HEADER_LEN(ucDisableFrmXtl) > *pusPktLen )
161 {
162 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
163 "WLAN TL: Length of the packet smaller than expected network"
164 " header %d", *pusPktLen ));
165
166 *pvosStatus = VOS_STATUS_E_INVAL;
167 return;
168 }
169
170 vos_pkt_reserve_head( vosDataBuff, ppvBDHeader,
171 ucBDHeaderLen );
172 if ( NULL == *ppvBDHeader )
173 {
174 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
175 "WLAN TL:VOSS packet corrupted on Attach BD header"));
176 *pvosStatus = VOS_STATUS_E_INVAL;
177 return;
178 }
179
180 /*-----------------------------------------------------------------------
181 Extract MAC address
182 -----------------------------------------------------------------------*/
183#ifdef WLAN_SOFTAP_FEATURE
184 {
185 v_SIZE_t usMacAddrSize = VOS_MAC_ADDR_SIZE;
186 *pvosStatus = vos_pkt_extract_data( vosDataBuff,
187 ucBDHeaderLen +
188 WLANTL_MAC_ADDR_ALIGN(ucDisableFrmXtl),
189 (v_PVOID_t)pvDestMacAddr,
190 &usMacAddrSize );
191 }
192#else
193 *pvosStatus = vos_pkt_peek_data( vosDataBuff,
194 ucBDHeaderLen +
195 WLANTL_MAC_ADDR_ALIGN(ucDisableFrmXtl),
196 (v_PVOID_t)&pvPeekData,
197 VOS_MAC_ADDR_SIZE );
198
199 /*Fix me*/
200 vos_copy_macaddr(pvDestMacAddr, (v_MACADDR_t*)pvPeekData);
201#endif
202 if ( VOS_STATUS_SUCCESS != *pvosStatus )
203 {
204 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
205 "WLAN TL:Failed while attempting to extract MAC Addr %d",
206 *pvosStatus));
207 }
208 else
209 {
210 /*---------------------------------------------------------------------
211 Fill MPDU info fields:
212 - MPDU data start offset
213 - MPDU header start offset
214 - MPDU header length
215 - MPDU length - this is a 16b field - needs swapping
216 --------------------------------------------------------------------*/
217 ucHeaderOffset = ucBDHeaderLen;
218 ucHeaderLen = WLANTL_MAC_HEADER_LEN(ucDisableFrmXtl);
219
220 if ( 0 != ucDisableFrmXtl )
221 {
222 if ( 0 != ucQosEnabled )
223 {
224 ucHeaderLen += WLANTL_802_11_HEADER_QOS_CTL;
225 }
226
227 // Similar to Qos we need something for WDS format !
228 if ( ucWDSEnabled != 0 )
229 {
230 // If we have frame translation enabled
231 ucHeaderLen += WLANTL_802_11_HEADER_ADDR4_LEN;
232 }
233 if ( extraHeadSpace != 0 )
234 {
235 // Decrease the packet length with the extra padding after the header
236 *pusPktLen = *pusPktLen - extraHeadSpace;
237 }
238 }
239
240 WLANHAL_TX_BD_SET_MPDU_HEADER_LEN( *ppvBDHeader, ucHeaderLen);
241 WLANHAL_TX_BD_SET_MPDU_HEADER_OFFSET( *ppvBDHeader, ucHeaderOffset);
242 WLANHAL_TX_BD_SET_MPDU_DATA_OFFSET( *ppvBDHeader,
243 ucHeaderOffset + ucHeaderLen + extraHeadSpace);
244 WLANHAL_TX_BD_SET_MPDU_LEN( *ppvBDHeader, *pusPktLen);
245
246 TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
247 "WLAN TL: VALUES ARE HLen=%x Hoff=%x doff=%x len=%x ex=%d",
248 ucHeaderLen, ucHeaderOffset,
249 (ucHeaderOffset + ucHeaderLen + extraHeadSpace),
250 *pusPktLen, extraHeadSpace));
251 }/* if peek MAC success*/
252
253}/* WLANTL_PrepareBDHeader */
254#endif /* FEATURE_WLAN_NON_INTEGRATED_SOC */
255
256#ifdef WLAN_PERF
257/*==========================================================================
258 FUNCTION WDA_TLI_FastHwFwdDataFrame
259
260 DESCRIPTION
261 For NON integrated SOC, this function is called by TL.
262
263 Fast path function to quickly forward a data frame if HAL determines BD
264 signature computed here matches the signature inside current VOSS packet.
265 If there is a match, HAL and TL fills in the swapped packet length into
266 BD header and DxE header, respectively. Otherwise, packet goes back to
267 normal (slow) path and a new BD signature would be tagged into BD in this
268 VOSS packet later by the WLANHAL_FillTxBd() function.
269
270 TODO For integrated SOC, this function does nothing yet. Pima SLM/HAL
271 should provide the equivelant functionality.
272
273 DEPENDENCIES
274
275 PARAMETERS
276
277 IN
278 pvosGCtx VOS context
279 vosDataBuff Ptr to VOSS packet
280 pMetaInfo For getting frame's TID
281 pStaInfo For checking STA type
282
283 OUT
284 pvosStatus returned status
285 puFastFwdOK Flag to indicate whether frame could be fast forwarded
286
287 RETURN VALUE
288 No return.
289
290 SIDE EFFECTS
291
292============================================================================*/
293void WDA_TLI_FastHwFwdDataFrame
294(
295 v_PVOID_t pvosGCtx,
296 vos_pkt_t* vosDataBuff,
297 VOS_STATUS* pvosStatus,
298 v_U32_t* puFastFwdOK,
299 WLANTL_MetaInfoType* pMetaInfo,
300 WLAN_STADescType* pStaInfo
301)
302{
303#if defined( FEATURE_WLAN_INTEGRATED_SOC )
304 /* FIXME WDI/WDA should support this function
305 once HAL supports it
306 */
307#else /* FEATURE_WLAN_INTEGRATED_SOC */
308 v_PVOID_t pvPeekData;
309 v_U8_t ucDxEBDWLANHeaderLen = WLANTL_BD_HEADER_LEN(0) + sizeof(WLANBAL_sDXEHeaderType);
310 v_U8_t ucIsUnicast;
311 WLANBAL_sDXEHeaderType *pDxEHeader;
312 v_PVOID_t pvBDHeader;
313 v_PVOID_t pucBuffPtr;
314 v_U16_t usPktLen;
315
316 /*-----------------------------------------------------------------------
317 Extract packet length
318 -----------------------------------------------------------------------*/
319
320 vos_pkt_get_packet_length( vosDataBuff, &usPktLen);
321
322 /*-----------------------------------------------------------------------
323 Extract MAC address
324 -----------------------------------------------------------------------*/
325 *pvosStatus = vos_pkt_peek_data( vosDataBuff,
326 WLANTL_MAC_ADDR_ALIGN(0),
327 (v_PVOID_t)&pvPeekData,
328 VOS_MAC_ADDR_SIZE );
329
330 if ( VOS_STATUS_SUCCESS != *pvosStatus )
331 {
332 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
333 "WLAN TL:Failed while attempting to extract MAC Addr %d",
334 *pvosStatus));
335 *pvosStatus = VOS_STATUS_E_INVAL;
336 return;
337 }
338
339 /*-----------------------------------------------------------------------
340 Reserve head room for DxE header, BD, and WLAN header
341 -----------------------------------------------------------------------*/
342
343 vos_pkt_reserve_head( vosDataBuff, &pucBuffPtr,
344 ucDxEBDWLANHeaderLen );
345 if ( NULL == pucBuffPtr )
346 {
347 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
348 "WLAN TL:No enough space in VOSS packet %p for DxE/BD/WLAN header", vosDataBuff));
349 *pvosStatus = VOS_STATUS_E_INVAL;
350 return;
351 }
352 pDxEHeader = (WLANBAL_sDXEHeaderType *)pucBuffPtr;
353 pvBDHeader = (v_PVOID_t) &pDxEHeader[1];
354
355 /* UMA Tx acceleration is enabled.
356 * UMA would help convert frames to 802.11, fill partial BD fields and
357 * construct LLC header. To further accelerate this kind of frames,
358 * HAL would attempt to reuse the BD descriptor if the BD signature
359 * matches to the saved BD descriptor.
360 */
361 if(pStaInfo->wSTAType == WLAN_STA_IBSS)
362 ucIsUnicast = !(((tANI_U8 *)pvPeekData)[0] & 0x01);
363 else
364 ucIsUnicast = 1;
365
366 *puFastFwdOK = (v_U32_t) WLANHAL_TxBdFastFwd(pvosGCtx, pvPeekData, pMetaInfo->ucTID, ucIsUnicast, pvBDHeader, usPktLen );
367
368 /* Can't be fast forwarded. Trim the VOS head back to original location. */
369 if(! *puFastFwdOK){
370 vos_pkt_trim_head(vosDataBuff, ucDxEBDWLANHeaderLen);
371 }else{
372 /* could be fast forwarded. Now notify BAL DxE header filling could be completely skipped
373 */
374 v_U32_t uPacketSize = WLANTL_BD_HEADER_LEN(0) + usPktLen;
375 vos_pkt_set_user_data_ptr( vosDataBuff, VOS_PKT_USER_DATA_ID_BAL,
376 (v_PVOID_t)uPacketSize);
377 pDxEHeader->size = SWAP_ENDIAN_UINT32(uPacketSize);
378 }
379
380 *pvosStatus = VOS_STATUS_SUCCESS;
381 return;
382#endif /* FEATURE_WLAN_INTEGRATED_SOC */
383}
384#endif /*WLAN_PERF*/
385
386/*==========================================================================
387 FUNCTION WDA_DS_Register
388
389 DESCRIPTION
390 Register TL client to WDA. This function registers TL RX/TX functions
391 to WDI by calling WDI_DS_Register.
392
393
394 For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions
395 to register TL's RX/TX functions to BAL
396
397 TODO
398 For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification.
399 The uCount parameter is AC mask. It should be redefined to use the
400 same resource callback function.
401
402 DEPENDENCIES
403
404 PARAMETERS
405
406 IN
407 pvosGCtx VOS context
408 pfnTxCompleteCallback TX complete callback upon TX completion
409 pfnRxPacketCallback RX callback
410 pfnTxPacketCallback TX callback
411 pfnResourceCB gets called when updating TX PDU number
412 uResTheshold minimum TX PDU size for a packet
413 pCallbackContext WDI calls callback function with it
414 VOS global context pointer
415 OUT
416 uAvailableTxBuf available TX PDU numbder.
417 BAL returns it for NON integrated SOC
418
419 RETURN VALUE
420 VOS_STATUS_E_FAULT: pointer is NULL and other errors
421 VOS_STATUS_SUCCESS: Everything is good :)
422
423 SIDE EFFECTS
424
425============================================================================*/
426VOS_STATUS WDA_DS_Register
427(
428 v_PVOID_t pvosGCtx,
429 WDA_DS_TxCompleteCallback pfnTxCompleteCallback,
430 WDA_DS_RxPacketCallback pfnRxPacketCallback,
431 WDA_DS_TxPacketCallback pfnTxPacketCallback,
432 WDA_DS_ResourceCB pfnResourceCB,
433 v_U32_t uResTheshold,
434 v_PVOID_t pCallbackContext,
435 v_U32_t *uAvailableTxBuf
436)
437{
438#if defined( FEATURE_WLAN_INTEGRATED_SOC )
439 tWDA_CbContext *wdaContext = NULL;
440 WDI_Status wdiStatus;
441
442 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
443 "WLAN WDA: WDA_DS_Register" );
444
445 /*------------------------------------------------------------------------
446 Sanity check
447 ------------------------------------------------------------------------*/
448 if ( ( NULL == pvosGCtx ) ||
449 ( NULL == pfnTxPacketCallback ) ||
450 ( NULL == pfnTxCompleteCallback ) ||
451 ( NULL == pfnRxPacketCallback ) ||
452 ( NULL == pfnResourceCB) )
453 {
454 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
455 "WLAN WDA:Invalid pointers on WDA_DS_Register" );
456 return VOS_STATUS_E_FAULT;
457 }
458
459 /*------------------------------------------------------------------------
460 Extract WDA context
461 ------------------------------------------------------------------------*/
462 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
463 if ( NULL == wdaContext )
464 {
465 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
466 "WLAN WDA:Invalid wda context pointer "
467 "from pvosGCtx on WDA_DS_Register" );
468 return VOS_STATUS_E_FAULT;
469 }
470
471 /*------------------------------------------------------------------------
472 Register with WDI as transport layer client
473 ------------------------------------------------------------------------*/
474 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register");
475
476 wdaContext->pfnTxResourceCB = pfnResourceCB;
477 wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback;
478
479 wdiStatus = WDI_DS_Register( wdaContext->pWdiContext,
480 (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB,
481 (WDI_DS_RxPacketCallback)pfnRxPacketCallback,
482 WDA_DS_TxFlowControlCallback,
483 pvosGCtx );
484
485 if ( WDI_STATUS_SUCCESS != wdiStatus )
486 {
487 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
488 "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus );
489 return VOS_STATUS_E_FAILURE;
490 }
491
492 /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF
493 Put hardcoded value not to put TL into OOR. Revisit it */
494 *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT;
495
496 return VOS_STATUS_SUCCESS;
497#else /* FEATURE_WLAN_INTEGRATED_SOC */
498 VOS_STATUS vosStatus;
499 WLANBAL_TlRegType tlReg;
500
501 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
502 "WLAN WDA: WDA_DS_Register" );
503
504 /*------------------------------------------------------------------------
505 Sanity check
506 ------------------------------------------------------------------------*/
507 if ( ( NULL == pvosGCtx ) ||
508 ( NULL == pfnTxPacketCallback ) ||
509 ( NULL == pfnTxCompleteCallback ) ||
510 ( NULL == pfnRxPacketCallback ) ||
511 ( NULL == pfnResourceCB ) )
512 {
513 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
514 "WLAN WDA:Invalid pointers on WDA_DS_Register" );
515 return VOS_STATUS_E_FAULT;
516 }
517
518 /*------------------------------------------------------------------------
519 Register with BAL as transport layer client
520 ------------------------------------------------------------------------*/
521 tlReg.receiveFrameCB = pfnRxPacketCallback;
522 tlReg.getTXFrameCB = pfnTxPacketCallback;
523 tlReg.txCompleteCB = pfnTxCompleteCallback;
524 tlReg.txResourceCB = pfnResourceCB;
525 tlReg.txResourceThreashold = uResTheshold;
526 tlReg.tlUsrData = pvosGCtx;
527
528 vosStatus = WLANBAL_RegTlCbFunctions( pvosGCtx, &tlReg );
529
530 if ( VOS_STATUS_SUCCESS != vosStatus )
531 {
532 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
533 "WLAN TL: TL failed to register with BAL, Err: %d", vosStatus );
534 return vosStatus;
535 }
536
537 /*------------------------------------------------------------------------
538 Request resources for tx from bus
539 ------------------------------------------------------------------------*/
540 vosStatus = WLANBAL_GetTxResources( pvosGCtx, uAvailableTxBuf );
541
542 if ( VOS_STATUS_SUCCESS != vosStatus )
543 {
544 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
545 "WLAN TL:TL failed to get resources from BAL, Err: %d",
546 vosStatus );
547 return vosStatus;
548 }
549
550 return vosStatus;
551#endif
552}
553
554/*==========================================================================
555 FUNCTION WDA_DS_StartXmit
556
557 DESCRIPTION
558 Serialize TX transmit reques to TX thread.
559
560 TODO This sends TX transmit request to TL. It should send to WDI for
561 abstraction.
562
563 For NON integrated SOC, this function calls WLANBAL_StartXmit
564
565 DEPENDENCIES
566
567 PARAMETERS
568
569 IN
570 pvosGCtx VOS context
571
572 RETURN VALUE
573 VOS_STATUS_E_FAULT: pointer is NULL and other errors
574 VOS_STATUS_SUCCESS: Everything is good :)
575
576 SIDE EFFECTS
577
578============================================================================*/
579VOS_STATUS
580WDA_DS_StartXmit
581(
582 v_PVOID_t pvosGCtx
583)
584{
585#if defined( FEATURE_WLAN_INTEGRATED_SOC )
586 vos_msg_t sMessage;
587/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
588
589 if ( NULL == pvosGCtx )
590 {
591 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
592 "WLAN WDA:Invalid pointers on WDA_DS_StartXmit" );
593 return VOS_STATUS_E_FAULT;
594 }
595
596 /* Serialize our event */
597 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
598 "Serializing WDA TX Start Xmit event" );
599
600 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
601
602 sMessage.bodyptr = NULL;
603 sMessage.type = WDA_DS_TX_START_XMIT;
604
605 return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
606#else /* FEATURE_WLAN_INTEGRATED_SOC */
607 return WLANBAL_StartXmit( pvosGCtx );
608#endif /* FEATURE_WLAN_INTEGRATED_SOC */
609}
610
611
612/*==========================================================================
613 FUNCTION WDA_DS_FinishULA
614
615 DESCRIPTION
616 Serialize Finish Upper Level Authentication reques to TX thread.
617
618 DEPENDENCIES
619
620 PARAMETERS
621
622 IN
623 callbackRoutine routine to be called in TX thread
624 callbackContext user data for the above routine
625
626 RETURN VALUE
627 please see vos_tx_mq_serialize
628
629 SIDE EFFECTS
630
631============================================================================*/
632VOS_STATUS
633WDA_DS_FinishULA
634(
635 void (*callbackRoutine) (void *callbackContext),
636 void *callbackContext
637)
638{
639 vos_msg_t sMessage;
640/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
641
642 /* Serialize our event */
643 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
644 "Serializing WDA_DS_FinishULA event" );
645
646 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
647
648 sMessage.bodyval = (v_U32_t)callbackContext;
649 sMessage.bodyptr = callbackRoutine;
650 sMessage.type = WDA_DS_FINISH_ULA;
651
652 return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
653}/*WDA_DS_FinishULA*/
654
655/*==========================================================================
656 FUNCTION WDA_DS_BuildTxPacketInfo
657
658 DESCRIPTION
659 Build TX meta info for integrated SOC.
660
661 Same function calls HAL for reserve BD header space into VOS packet and
662 HAL function to fill it.
663
664 DEPENDENCIES
665
666 PARAMETERS
667
668 IN
669 pvosGCtx VOS context
670 vosDataBuff vos data buffer
671 pvDestMacAddr destination MAC address ponter
672 ucDisableFrmXtl Is frame xtl disabled?
673 ucQosEnabled Is QoS enabled?
674 ucWDSEnabled Is WDS enabled?
675 extraHeadSpace Extra head bytes. If it's not 0 due to 4 bytes align
676 of BD header.
677 typeSubtype typeSubtype from MAC header or TX metainfo/BD
678 pAddr2 address 2
679 uTid tid
680 txFlag
681 timeStamp
682 ucIsEapol
683 ucUP
684
685 OUT
686 *pusPktLen Packet length
687
688 RETURN VALUE
689 VOS_STATUS_E_FAULT: pointer is NULL and other errors
690 VOS_STATUS_SUCCESS: Everything is good :)
691
692 SIDE EFFECTS
693
694============================================================================*/
695VOS_STATUS
696WDA_DS_BuildTxPacketInfo
697(
698 v_PVOID_t pvosGCtx,
699 vos_pkt_t* vosDataBuff,
700 v_MACADDR_t* pvDestMacAddr,
701 v_U8_t ucDisableFrmXtl,
702 v_U16_t* pusPktLen,
703 v_U8_t ucQosEnabled,
704 v_U8_t ucWDSEnabled,
705 v_U8_t extraHeadSpace,
706 v_U8_t typeSubtype,
707 v_PVOID_t pAddr2,
708 v_U8_t uTid,
709 v_U8_t txFlag,
710 v_U32_t timeStamp,
711 v_U8_t ucIsEapol,
712 v_U8_t ucUP
713)
714{
715#if defined( FEATURE_WLAN_INTEGRATED_SOC )
716 VOS_STATUS vosStatus;
717 WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL;
718 v_SIZE_t usMacAddrSize;
719 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
720
721 /*------------------------------------------------------------------------
722 Sanity check
723 Extract TL control block
724 ------------------------------------------------------------------------*/
725 if ( ( NULL == pvosGCtx ) || ( NULL == vosDataBuff ) || ( NULL == pvDestMacAddr ) )
726 {
727 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
728 "WDA:Invalid parameter sent on WDA_DS_BuildTxPacketInfo" );
729 return VOS_STATUS_E_FAULT;
730 }
731
732 /*------------------------------------------------------------------------
733 Extract TX Meta Info pointer from PAL packet
734 ------------------------------------------------------------------------*/
735 pTxMetaInfo = WDI_DS_ExtractTxMetaData( VOS_TO_WPAL_PKT(vosDataBuff) );
736 if ( NULL == pTxMetaInfo )
737 {
738 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
739 "WLAN TL:Invalid RxMetaInfo pointer from PAL packet on WLANTL_RxFrames");
740 VOS_ASSERT( 0 );
741 return VOS_STATUS_E_FAULT;
742 }
743
744 /* Zero out memeory */
745 vos_mem_zero( pTxMetaInfo, sizeof( WDI_DS_TxMetaInfoType ) );
746
747 /* Fill the TX Meta info */
748 pTxMetaInfo->txFlags = txFlag;
749 pTxMetaInfo->qosEnabled = ucQosEnabled;
750 pTxMetaInfo->fenableWDS = ucWDSEnabled;
751 pTxMetaInfo->ac = ucUP;
752 pTxMetaInfo->fUP = uTid;
753 pTxMetaInfo->isEapol = ucIsEapol;
754 pTxMetaInfo->fdisableFrmXlt = ucDisableFrmXtl;
755 pTxMetaInfo->frmType = ( ( typeSubtype & 0x30 ) >> 4 );
756 pTxMetaInfo->typeSubtype = typeSubtype;
757
758 /* Length = MAC header + payload */
759 vos_pkt_get_packet_length( vosDataBuff, pusPktLen);
760 pTxMetaInfo->fPktlen = *pusPktLen;
761
762 // Dst address
763 usMacAddrSize = VOS_MAC_ADDR_SIZE;
764 vosStatus = vos_pkt_extract_data( vosDataBuff,
765 WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ),
766 (v_PVOID_t)pvDestMacAddr,
767 &usMacAddrSize );
768 if ( VOS_STATUS_SUCCESS != vosStatus )
769 {
770 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
771 "WDA:Failed while attempting to extract MAC Addr %d",
772 vosStatus );
773 VOS_ASSERT( 0 );
774 return VOS_STATUS_E_FAULT;
775 }
776
777 VOS_ASSERT(usMacAddrSize == VOS_MAC_ADDR_SIZE);
778
779 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr );
780
781 // ADDR2
782 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress, pAddr2 );
783
784 /* Dump TX meta infro for debugging */
785 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
786 "WLAN TL: Dump TX meta info: "
787 "txFlags:%d, qosEnabled:%d, ac:%d, "
788 "isEapol:%d, fdisableFrmXlt:%d" "frmType%d",
789 pTxMetaInfo->txFlags, ucQosEnabled, pTxMetaInfo->ac,
790 pTxMetaInfo->isEapol, pTxMetaInfo->fdisableFrmXlt, pTxMetaInfo->frmType );
791
792 return VOS_STATUS_SUCCESS;
793#else /* FEATURE_WLAN_INTEGRATED_SOC */
794 VOS_STATUS vosStatus;
795 v_PVOID_t pvBDHeader;
796
797 WDA_DS_PrepareBDHeader( vosDataBuff, &pvBDHeader, pvDestMacAddr, ucDisableFrmXtl,
798 &vosStatus, pusPktLen, ucQosEnabled, ucWDSEnabled, extraHeadSpace );
799
800 if ( VOS_STATUS_SUCCESS != vosStatus )
801 {
802 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
803 "WLAN TL:Failed while attempting to prepare BD %d", vosStatus );
804 return vosStatus;
805 }
806
807 vosStatus = WLANHAL_FillTxBd( pvosGCtx, typeSubtype, pvDestMacAddr, pAddr2,
808 &uTid, ucDisableFrmXtl, pvBDHeader, txFlag, timeStamp );
809
810 if ( VOS_STATUS_SUCCESS != vosStatus )
811 {
812 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
813 "WLAN TL:Failed while attempting to fill BD %d", vosStatus );
814 return vosStatus;
815 }
816
817 return VOS_STATUS_SUCCESS;
818
819#endif /* FEATURE_WLAN_INTEGRATED_SOC */
820}
821
822
823/*==========================================================================
824 FUNCTION WDS_DS_TrimRxPacketInfo
825
826 DESCRIPTION
827 Trim/Remove RX BD header for NON integrated SOC.
828 It does nothing for integrated SOC.
829
830 DEPENDENCIES
831
832 PARAMETERS
833
834 IN
835 vosDataBuff vos data buffer
836
837 RETURN VALUE
838 VOS_STATUS_E_FAULT: pointer is NULL and other errors
839 VOS_STATUS_SUCCESS: Everything is good :)
840
841 SIDE EFFECTS
842
843============================================================================*/
844VOS_STATUS
845WDA_DS_TrimRxPacketInfo
846(
847 vos_pkt_t *vosDataBuff
848)
849{
850#if defined( FEATURE_WLAN_INTEGRATED_SOC )
851 /* Nothing to trim
852 * Do Nothing */
853
854 return VOS_STATUS_SUCCESS;
855#else /* FEATURE_WLAN_INTEGRATED_SOC */
856 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
857 v_U16_t usPktLen;
858 v_U8_t ucMPDUHOffset;
859 v_U16_t usMPDUDOffset;
860 v_U16_t usMPDULen;
861 v_U8_t ucMPDUHLen = 0;
862 v_U8_t aucBDHeader[WLANHAL_RX_BD_HEADER_SIZE];
863
864 vos_pkt_pop_head( vosDataBuff, aucBDHeader, WLANHAL_RX_BD_HEADER_SIZE);
865
866 ucMPDUHOffset = (v_U8_t)WLANHAL_RX_BD_GET_MPDU_H_OFFSET(aucBDHeader);
867 usMPDUDOffset = (v_U16_t)WLANHAL_RX_BD_GET_MPDU_D_OFFSET(aucBDHeader);
868 usMPDULen = (v_U16_t)WLANHAL_RX_BD_GET_MPDU_LEN(aucBDHeader);
869 ucMPDUHLen = (v_U8_t)WLANHAL_RX_BD_GET_MPDU_H_LEN(aucBDHeader);
870
871 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
872 "WLAN TL:BD header processing data: HO %d DO %d Len %d HLen %d"
873 " Tid %d BD %d",
874 ucMPDUHOffset, usMPDUDOffset, usMPDULen, ucMPDUHLen,
875 WLANHAL_RX_BD_HEADER_SIZE );
876
877 vos_pkt_get_packet_length( vosDataBuff, &usPktLen);
878
879 if (( ucMPDUHOffset >= WLANHAL_RX_BD_HEADER_SIZE ) &&
880 ( usMPDUDOffset > ucMPDUHOffset ) &&
881 ( usMPDULen >= ucMPDUHLen ) &&
882 ( usPktLen >= usMPDULen ))
883 {
884 if((ucMPDUHOffset - WLANHAL_RX_BD_HEADER_SIZE) > 0)
885 {
886 vos_pkt_trim_head( vosDataBuff, ucMPDUHOffset - WLANHAL_RX_BD_HEADER_SIZE);
887 }
888 else
889 {
890 /* Nothing to trim
891 * Do Nothing */
892 }
893 vosStatus = VOS_STATUS_SUCCESS;
894 }
895 else
896 {
897 vosStatus = VOS_STATUS_E_FAILURE;
898 }
899
900 return vosStatus;
901#endif /* FEATURE_WLAN_INTEGRATED_SOC */
902}
903
904
905
906/*==========================================================================
907 FUNCTION WDA_DS_PeekRxPacketInfo
908
909 DESCRIPTION
910 Return RX metainfo pointer for for integrated SOC.
911
912 Same function will return BD header pointer.
913
914 DEPENDENCIES
915
916 PARAMETERS
917
918 IN
919 vosDataBuff vos data buffer
920
921 pvDestMacAddr destination MAC address ponter
922 bSwap Want to swap BD header? For backward compatability
923 It does nothing for integrated SOC
924 OUT
925 *ppRxHeader RX metainfo pointer
926
927 RETURN VALUE
928 VOS_STATUS_E_FAULT: pointer is NULL and other errors
929 VOS_STATUS_SUCCESS: Everything is good :)
930
931 SIDE EFFECTS
932
933============================================================================*/
934VOS_STATUS
935WDA_DS_PeekRxPacketInfo
936(
937 vos_pkt_t *vosDataBuff,
938 v_PVOID_t *ppRxHeader,
939 v_BOOL_t bSwap
940)
941{
942#if defined( FEATURE_WLAN_INTEGRATED_SOC )
943 /*------------------------------------------------------------------------
944 Sanity check
945 ------------------------------------------------------------------------*/
946 if ( NULL == vosDataBuff )
947 {
948 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
949 "WDA:Invalid parameter sent on WDA_DS_PeekRxPacketInfo" );
950 return VOS_STATUS_E_FAULT;
951 }
952
953 *ppRxHeader = WDI_DS_ExtractRxMetaData( (wpt_packet*)vosDataBuff );
954
955 if ( NULL == *ppRxHeader )
956 {
957 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
958 "WDA:Failed to get RX meta data from WDI" );
959 return VOS_STATUS_E_FAILURE;
960 }
961
962 return VOS_STATUS_SUCCESS;
963#else /* FEATURE_WLAN_INTEGRATED_SOC */
964 VOS_STATUS vosStatus;
965
966 vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)ppRxHeader,
967 WLANHAL_RX_BD_HEADER_SIZE);
968
969 if ( ( VOS_STATUS_SUCCESS != vosStatus ) || ( NULL == (v_PVOID_t)ppRxHeader ) )
970 {
971 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
972 "WDA :Cannot extract BD header" );
973 return VOS_STATUS_E_FAILURE;
974 }
975
976 if ( VOS_TRUE == bSwap )
977 {
978 WLANHAL_SwapRxBd( *ppRxHeader );
979 }
980
981 return VOS_STATUS_SUCCESS;
982#endif /* FEATURE_WLAN_INTEGRATED_SOC */
983}
984
985
986
987/*==========================================================================
988 FUNCTION WDA_DS_GetFrameTypeSubType
989
990 DESCRIPTION
991 Get typeSubtype from the packet. The BD header should have this.
992 But some reason, Libra/Volans read it from 802.11 header and save it
993 back to BD header. So for NON integrated SOC, this function does
994 the same.
995
996 For integrated SOC, WDI does the same, not TL.
997 It does return typeSubtype from RX meta info for integrated SOC.
998
999 DEPENDENCIES
1000
1001 PARAMETERS
1002
1003 IN
1004 pvosGCtx VOS context
1005 vosDataBuff vos data buffer
1006 pRxHeader RX meta info or BD header pointer
1007
1008 OUT
1009 ucTypeSubtype typeSubtype
1010
1011 RETURN VALUE
1012 VOS_STATUS_E_FAULT: pointer is NULL and other errors
1013 VOS_STATUS_SUCCESS: Everything is good :)
1014
1015 SIDE EFFECTS
1016
1017============================================================================*/
1018VOS_STATUS
1019WDA_DS_GetFrameTypeSubType
1020(
1021 v_PVOID_t pvosGCtx,
1022 vos_pkt_t *vosDataBuff,
1023 v_PVOID_t pRxHeader,
1024 v_U8_t *ucTypeSubtype
1025)
1026{
1027#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1028 /*------------------------------------------------------------------------
1029 Sanity check
1030 ------------------------------------------------------------------------*/
1031 if ( NULL == pRxHeader )
1032 {
1033 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1034 "WDA:Invalid parameter sent on WDA_DS_GetFrameTypeSubType" );
1035 return VOS_STATUS_E_FAULT;
1036 }
1037
1038 *ucTypeSubtype = ( WDA_GET_RX_TYPE( pRxHeader ) << 4 ) | WDA_GET_RX_SUBTYPE( pRxHeader );
1039
1040 return VOS_STATUS_SUCCESS;
1041#else /* FEATURE_WLAN_INTEGRATED_SOC */
1042 v_PVOID_t pvBDHeader = pRxHeader;
1043 v_U16_t usFrmCtrl = 0;
1044 v_U8_t ucFrmType;
1045 v_SIZE_t usFrmCtrlSize = sizeof(usFrmCtrl);
1046 VOS_STATUS vosStatus;
1047
1048 /*---------------------------------------------------------------------
1049 Extract frame control field from 802.11 header if present
1050 (frame translation not done)
1051 ---------------------------------------------------------------------*/
1052 vosStatus = vos_pkt_extract_data( vosDataBuff,
1053 ( 0 == WLANHAL_RX_BD_GET_FT(pvBDHeader) ) ?
1054 WLANHAL_RX_BD_GET_MPDU_H_OFFSET(pvBDHeader):
1055 WLANHAL_RX_BD_HEADER_SIZE,
1056 &usFrmCtrl, &usFrmCtrlSize );
1057
1058 if (( VOS_STATUS_SUCCESS != vosStatus ) ||
1059 ( sizeof(usFrmCtrl) != usFrmCtrlSize ))
1060 {
1061 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1062 "WLAN TL: Cannot extract Frame Control Field" );
1063 return VOS_STATUS_E_FAILURE;
1064 }
1065
1066
1067 ucFrmType = (v_U8_t)WLANHAL_RxBD_GetFrameTypeSubType( pvBDHeader,
1068 usFrmCtrl);
1069 WLANHAL_RX_BD_SET_TYPE_SUBTYPE(pvBDHeader, ucFrmType);
1070
1071 *ucTypeSubtype = ucFrmType;
1072
1073 return VOS_STATUS_SUCCESS;
1074#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1075}
1076
1077
1078/*==========================================================================
1079 FUNCTION WDA_DS_RxAmsduBdFix
1080
1081 DESCRIPTION
1082 For backward compatability with Libra/Volans. Need to call HAL function
1083 for HW BD bug fix
1084
1085 It does nothing for integrated SOC.
1086
1087 DEPENDENCIES
1088
1089 PARAMETERS
1090
1091 IN
1092 pvosGCtx VOS context
1093 pvBDHeader BD header pointer
1094
1095 OUT
1096
1097 RETURN VALUE
1098 VOS_STATUS_E_FAULT: pointer is NULL and other errors
1099 VOS_STATUS_SUCCESS: Everything is good :)
1100
1101 SIDE EFFECTS
1102
1103============================================================================*/
1104VOS_STATUS
1105WDA_DS_RxAmsduBdFix
1106(
1107 v_PVOID_t pvosGCtx,
1108 v_PVOID_t pvBDHeader
1109)
1110{
1111#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1112 /* Do nothing for Prima */
1113 return VOS_STATUS_SUCCESS;
1114#else /* FEATURE_WLAN_INTEGRATED_SOC */
1115 /* AMSDU HW bug fix
1116 * After 2nd AMSDU subframe HW could not handle BD correctly
1117 * HAL workaround is needed */
1118 WLANHAL_RxAmsduBdFix(pvosGCtx, pvBDHeader);
1119 return VOS_STATUS_SUCCESS;
1120#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1121}
1122
1123/*==========================================================================
1124 FUNCTION WDA_DS_GetRssi
1125
1126 DESCRIPTION
1127 Get RSSI
1128
1129 TODO It returns hardcoded value in the meantime since WDA/WDI does nothing
1130 support it yet for Prima.
1131
1132 DEPENDENCIES
1133
1134 PARAMETERS
1135
1136 IN
1137 vosDataBuff vos data buffer
1138
1139 OUT
1140 puRssi RSSI
1141
1142 RETURN VALUE
1143 VOS_STATUS_E_FAULT: pointer is NULL and other errors
1144 VOS_STATUS_SUCCESS: Everything is good :)
1145
1146 SIDE EFFECTS
1147
1148============================================================================*/
1149VOS_STATUS
1150WDA_DS_GetRssi
1151(
1152 v_PVOID_t pvosGCtx,
1153 v_S7_t* puRssi
1154)
1155{
1156#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1157 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1158 "WDA:halPS_GetRssi no longer supported. Need replacement");
1159
1160 *puRssi = -30;
1161
1162 return VOS_STATUS_SUCCESS;
1163#else /* FEATURE_WLAN_INTEGRATED_SOC */
1164 halPS_GetRssi(vos_get_context(VOS_MODULE_ID_SME, pvosGCtx), puRssi);
1165 return VOS_STATUS_SUCCESS;
1166#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1167}
1168
1169/*==========================================================================
1170 FUNCTION WDA_DS_GetTxResources
1171
1172 DESCRIPTION
1173 It does return hardcoded value. It should bigger number than 0.
1174 Returning 0 will put TL in out-of-resource condition for TX.
1175
1176 Return current PDU resources from BAL for NON integrated SOC.
1177
1178 DEPENDENCIES
1179
1180 PARAMETERS
1181
1182 IN
1183 vosDataBuff vos data buffer
1184
1185 OUT
1186 puResCount available PDU number for TX
1187
1188 RETURN VALUE
1189 VOS_STATUS_E_FAULT: pointer is NULL and other errors
1190 VOS_STATUS_SUCCESS: Everything is good :)
1191
1192 SIDE EFFECTS
1193
1194============================================================================*/
1195VOS_STATUS
1196WDA_DS_GetTxResources
1197(
1198 v_PVOID_t pvosGCtx,
1199 v_U32_t* puResCount
1200)
1201{
1202#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1203 /* Return minimum necessary number of packet(DXE descriptor) for data */
1204 /* TODO Need to get this from DXE??? */
1205 *puResCount = WDA_TLI_BD_PDU_RESERVE_THRESHOLD + 50;
1206 return VOS_STATUS_SUCCESS;
1207#else /* FEATURE_WLAN_INTEGRATED_SOC */
1208 return WLANBAL_GetTxResources( pvosGCtx, puResCount );
1209#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1210}
1211
1212
1213
1214/*==========================================================================
1215 FUNCTION WDA_DS_GetReplayCounter
1216
1217 DESCRIPTION
1218 Return replay counter from BD header or RX meta info
1219
1220 DEPENDENCIES
1221
1222 PARAMETERS
1223
1224 IN
1225 pRxHeader RX meta info or BD header pointer
1226
1227 OUT
1228
1229 RETURN VALUE
1230 Replay Counter
1231
1232 SIDE EFFECTS
1233
1234============================================================================*/
1235v_U64_t
1236WDA_DS_GetReplayCounter
1237(
1238 v_PVOID_t pRxHeader
1239)
1240{
1241#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1242 return WDA_GET_RX_REPLAY_COUNT( pRxHeader );
1243#else /* FEATURE_WLAN_INTEGRATED_SOC */
1244 v_U8_t *pucRxBDHeader = pRxHeader;
1245
1246/* 48-bit replay counter is created as follows
1247 from RX BD 6 byte PMI command:
1248 Addr : AES/TKIP
1249 0x38 : pn3/tsc3
1250 0x39 : pn2/tsc2
1251 0x3a : pn1/tsc1
1252 0x3b : pn0/tsc0
1253
1254 0x3c : pn5/tsc5
1255 0x3d : pn4/tsc4 */
1256
1257#ifdef ANI_BIG_BYTE_ENDIAN
1258 v_U64_t ullcurrentReplayCounter = 0;
1259 /* Getting 48-bit replay counter from the RX BD */
1260 ullcurrentReplayCounter = WLANHAL_RX_BD_GET_PMICMD_20TO23(pucRxBDHeader);
1261 ullcurrentReplayCounter <<= 16;
1262 ullcurrentReplayCounter |= (( WLANHAL_RX_BD_GET_PMICMD_24TO25(pucRxBDHeader) & 0xFFFF0000) >> 16);
1263 return ullcurrentReplayCounter;
1264#else
1265 v_U64_t ullcurrentReplayCounter = 0;
1266 /* Getting 48-bit replay counter from the RX BD */
1267 ullcurrentReplayCounter = (WLANHAL_RX_BD_GET_PMICMD_24TO25(pucRxBDHeader) & 0x0000FFFF);
1268 ullcurrentReplayCounter <<= 32;
1269 ullcurrentReplayCounter |= WLANHAL_RX_BD_GET_PMICMD_20TO23(pucRxBDHeader);
1270 return ullcurrentReplayCounter;
1271#endif
1272
1273#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1274}
1275
1276#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1277/*==========================================================================
1278 FUNCTION WDA_DS_TxFrames
1279
1280 DESCRIPTION
1281 Pull packets from TL and push them to WDI. It gets invoked upon
1282 WDA_DS_TX_START_XMIT.
1283
1284 This function is equivelant of WLANSSC_Transmit in Libra/Volans.
1285
1286 TODO
1287 This function should be implemented and moved in WDI.
1288
1289 DEPENDENCIES
1290
1291 PARAMETERS
1292
1293 IN
1294 pvosGCtx VOS context
1295
1296 OUT
1297
1298 RETURN VALUE
1299 VOS_STATUS_E_FAULT: pointer is NULL and other errors
1300 VOS_STATUS_SUCCESS: Everything is good :)
1301
1302 SIDE EFFECTS
1303
1304============================================================================*/
1305
1306VOS_STATUS
1307WDA_DS_TxFrames
1308(
1309 v_PVOID_t pvosGCtx
1310)
1311{
1312 VOS_STATUS vosStatus;
1313 vos_pkt_t *pTxMgmtChain = NULL;
1314 vos_pkt_t *pTxDataChain = NULL;
1315 vos_pkt_t *pTxPacket = NULL;
1316 v_BOOL_t bUrgent;
1317 wpt_uint32 ucTxResReq;
1318 WDI_Status wdiStatus;
1319 tWDA_CbContext *wdaContext = NULL;
1320 v_U32_t uMgmtAvailRes;
1321 v_U32_t uDataAvailRes;
1322 WLANTL_TxCompCBType pfnTxComp = NULL;
1323
1324 wdaContext = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pvosGCtx);
1325 if ( NULL == wdaContext )
1326 {
1327 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1328 "WDA:Invalid wda context pointer from pvosGCtx on WDA_DS_TxFrames" );
1329 return VOS_STATUS_E_FAULT;
1330 }
1331
1332 /*-------------------------------------------------------------------------
1333 Need to fetch separatelly for Mgmt and Data frames because TL is not
1334 aware of separate resource management at the lower levels
1335 -------------------------------------------------------------------------*/
1336 /*Mgmt tx*/
1337 uMgmtAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
1338 WDI_MGMT_POOL_ID);
1339
1340 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
1341 &pTxMgmtChain,
1342 uMgmtAvailRes,
1343 (wdaContext->uTxFlowMask & WDA_HI_FLOW_MASK),
1344 &bUrgent );
1345
1346 // We need to initialize vsoStatus in case we don't enter the "while"
1347 // loop. If we don't enter the loop, it means that there are no packets,
1348 // available, and that is considered success. If we enter the loop,
1349 // vosStatus will be set appropriately inside the loop
1350 vosStatus = VOS_STATUS_SUCCESS;
1351
1352 while ( NULL != pTxMgmtChain )
1353 {
1354 /* Walk the chain and unchain the packet */
1355 pTxPacket = pTxMgmtChain;
1356 vosStatus = vos_pkt_walk_packet_chain( pTxMgmtChain, &pTxMgmtChain, VOS_TRUE );
1357
1358 if( (VOS_STATUS_SUCCESS != vosStatus) &&
1359 (VOS_STATUS_E_EMPTY != vosStatus) )
1360 {
1361 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1362 "WDA Walking packet chain returned status : %d", vosStatus );
1363 VOS_ASSERT( 0 );
1364 vosStatus = VOS_STATUS_E_FAILURE;
1365 break;
1366 }
1367
1368 if ( VOS_STATUS_E_EMPTY == vosStatus )
1369 {
1370 vosStatus = VOS_STATUS_SUCCESS;
1371 }
1372
1373 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
1374 (wpt_packet*)pTxPacket,
1375 0 /* more */ );
1376 if ( WDI_STATUS_SUCCESS != wdiStatus )
1377 {
1378 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1379 "WDA : Pushing a packet to WDI failed.");
Madan Mohan Koyyalamudi15a48f02012-10-05 17:13:53 -07001380 VOS_ASSERT( wdiStatus != WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -07001381 //We need to free the packet here
1382 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
1383 if(pfnTxComp)
1384 {
1385 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
1386 }
1387 }
1388
1389 };
1390
1391 /*Data tx*/
1392 uDataAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
1393 WDI_DATA_POOL_ID);
1394
1395 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
1396 &pTxDataChain,
1397 /*WDA_DS_DXE_RES_COUNT*/ uDataAvailRes,
1398 (wdaContext->uTxFlowMask & WDA_LO_FLOW_MASK),
1399 &bUrgent );
1400
1401 // We need to initialize vsoStatus in case we don't enter the "while"
1402 // loop. If we don't enter the loop, it means that there are no packets,
1403 // available, and that is considered success. If we enter the loop,
1404 // vosStatus will be set appropriately inside the loop
1405 vosStatus = VOS_STATUS_SUCCESS;
1406
1407 while ( NULL != pTxDataChain )
1408 {
1409 /* Walk the chain and unchain the packet */
1410 pTxPacket = pTxDataChain;
1411 vosStatus = vos_pkt_walk_packet_chain( pTxDataChain, &pTxDataChain, VOS_TRUE );
1412
1413 if( (VOS_STATUS_SUCCESS != vosStatus) &&
1414 (VOS_STATUS_E_EMPTY != vosStatus) )
1415 {
1416 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1417 "WDA Walking packet chain returned status : %d", vosStatus );
1418 VOS_ASSERT( 0 );
1419 vosStatus = VOS_STATUS_E_FAILURE;
1420 break;
1421 }
1422
1423 if ( VOS_STATUS_E_EMPTY == vosStatus )
1424 {
1425 vosStatus = VOS_STATUS_SUCCESS;
1426 }
1427
1428 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
1429 (wpt_packet*)pTxPacket,
1430 0 /* more */ );
1431 if ( WDI_STATUS_SUCCESS != wdiStatus )
1432 {
1433 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1434 "WDA : Pushing a packet to WDI failed.");
Madan Mohan Koyyalamudi15a48f02012-10-05 17:13:53 -07001435 VOS_ASSERT( wdiStatus != WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -07001436 //We need to free the packet here
1437 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
1438 if(pfnTxComp)
1439 {
1440 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
1441 }
1442 }
1443
1444 };
1445
1446 WDI_DS_TxComplete(wdaContext->pWdiContext, ucTxResReq);
1447
1448 return vosStatus;
1449}
1450#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1451
1452#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1453/*==========================================================================
1454 FUNCTION WDA_DS_TxFlowControlCallback
1455
1456 DESCRIPTION
1457 Invoked by WDI to control TX flow.
1458
1459 DEPENDENCIES
1460
1461 PARAMETERS
1462
1463 IN
1464 pvosGCtx VOS context
1465 uFlowMask TX channel mask for flow control
1466 Defined in WDA_TXFlowEnumType
1467
1468 OUT
1469
1470 RETURN VALUE
1471
1472 SIDE EFFECTS
1473
1474============================================================================*/
1475v_VOID_t
1476WDA_DS_TxFlowControlCallback
1477(
1478 v_PVOID_t pvosGCtx,
1479 v_U8_t ucFlowMask
1480)
1481{
1482 tWDA_CbContext* wdaContext = NULL;
1483 v_U8_t ucOldFlowMask;
1484 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1485
1486 /*------------------------------------------------------------------------
1487 Sanity check
1488 ------------------------------------------------------------------------*/
1489 if ( NULL == pvosGCtx )
1490 {
1491 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1492 "WDA: Invalid parameter sent on WDA_DS_TxFlowControlCallback" );
1493 return;
1494 }
1495
1496 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1497 if ( NULL == wdaContext )
1498 {
1499 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1500 "WDA: Invalid context on WDA_DS_TxFlowControlCallback" );
1501 return;
1502 }
1503
1504 /* two physical DXE channels
1505 1) data packets(all four AC) and BAP for the low priority channel(lower 4 bits)
1506 2) management packets for high priority channel(5th bit)
1507 */
1508
1509
1510 /*Save and reset */
1511 ucOldFlowMask = wdaContext->uTxFlowMask;
1512 wdaContext->uTxFlowMask = ucFlowMask;
1513
1514 /*If the AC is being enabled - resume data xfer
1515
1516 Assume previous value of wdaContext->uTxFlowMask:
1517
1518 DATA\MGM | ON | OFF
1519 ----------------------
1520 ON | 1F | 0F *
1521 ----------------------
1522 OFF | 10 *| 00 *
1523
1524 * - states in which a channel can be enabled
1525
1526 ucFlowMask will tell which channel must be enabled
1527 to enable a channel a new bit must be turned on =>
1528 ucFlowMask > wdaContext->uTxFlowMask when enable happens
1529 */
1530
1531 if ( ucFlowMask > ucOldFlowMask )
1532 {
1533 WDA_DS_StartXmit(pvosGCtx);
1534 }
1535
1536}
1537#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1538
1539/*==========================================================================
1540 FUNCTION WDA_DS_GetTxFlowMask
1541
1542 DESCRIPTION
1543 return TX flow mask control value
1544
1545 DEPENDENCIES
1546
1547 PARAMETERS
1548
1549 IN
1550 pvosGCtx VOS context
1551
1552 OUT
1553 uFlowMask TX channel mask for flow control
1554 Defined in WDA_TXFlowEnumType
1555
1556 RETURN VALUE
1557 VOS_STATUS_E_INVAL: pointer is NULL and other errors
1558 VOS_STATUS_SUCCESS: Everything is good :)
1559
1560 SIDE EFFECTS
1561
1562============================================================================*/
1563VOS_STATUS
1564WDA_DS_GetTxFlowMask
1565(
1566 v_PVOID_t pvosGCtx,
1567 v_U8_t* puFlowMask
1568)
1569{
1570#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1571 tWDA_CbContext* wdaContext = NULL;
1572 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1573
1574 /*------------------------------------------------------------------------
1575 Sanity check
1576 ------------------------------------------------------------------------*/
1577 if ( ( NULL == pvosGCtx ) || ( NULL == puFlowMask ) )
1578 {
1579 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1580 "WDA: Invalid parameter sent on WDA_DS_GetTxFlowMask" );
1581 return VOS_STATUS_E_INVAL;
1582 }
1583
1584 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1585 if ( NULL == wdaContext )
1586 {
1587 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1588 "WDA: Invalid context on WDA_DS_GetTxFlowMask" );
1589 return VOS_STATUS_E_INVAL;
1590 }
1591
1592 *puFlowMask = wdaContext->uTxFlowMask;
1593
1594 return VOS_STATUS_SUCCESS;
1595#else
1596 *puFlowMask = WDA_TXFLOWMASK;
1597 return VOS_STATUS_SUCCESS;
1598#endif /* FEATURE_WLAN_INTEGRATED_SOC */
1599}
1600
1601#if defined( FEATURE_WLAN_INTEGRATED_SOC )
1602v_VOID_t
1603WDA_DS_TxCompleteCB
1604(
1605 v_PVOID_t pvosGCtx,
1606 v_PVOID_t pFrameDataBuff
1607)
1608{
1609 tWDA_CbContext* wdaContext = NULL;
1610 WDI_DS_TxMetaInfoType* pTxMetadata;
1611 VOS_STATUS vosStatus;
1612 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1613
1614 /*------------------------------------------------------------------------
1615 Sanity check
1616 ------------------------------------------------------------------------*/
1617
1618 if ( ( NULL == pvosGCtx ) || ( NULL == pFrameDataBuff ) )
1619 {
1620 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1621 "WDA: Invalid parameter sent on WDA_DS_TxCompleteCB" );
1622 return;
1623 }
1624
1625 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1626 if ( NULL == wdaContext )
1627 {
1628 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1629 "WDA: Invalid context on WDA_DS_TxCompleteCB" );
1630 return;
1631 }
1632
1633 // extract metadata from PAL packet
1634 pTxMetadata = WDI_DS_ExtractTxMetaData( (wpt_packet*)pFrameDataBuff );
1635
1636 if ( eWLAN_PAL_STATUS_SUCCESS == pTxMetadata->txCompleteStatus )
1637 vosStatus = VOS_STATUS_SUCCESS;
1638 else
1639 vosStatus = VOS_STATUS_E_FAILURE;
1640
1641 wdaContext->pfnTxCompleteCallback( pvosGCtx, pFrameDataBuff, vosStatus );
1642}
1643#endif /* FEATURE_WLAN_INTEGRATED_SOC */