blob: 2e303fb400d348f05432b95a18f901c7017be332 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Abhishek Singh00b71972016-01-07 10:51:04 +05302 * Copyright (c) 2012-2014, 2016 The Linux Foundation. All rights reserved.
Kiet Lam1ed83fc2014-02-19 01:15:45 -08003 *
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
Hanumantha Reddy Pothulae00a7e22015-09-15 20:11:30 +0530142void WDA_DS_RxLogCallback(v_U8_t logType)
Mihir Shete5affadc2015-05-29 20:54:57 +0530143{
Karthick Sa35b0692015-08-21 15:57:05 +0530144 vos_msg_t vosMessage;
145
Hanumantha Reddy Pothulae00a7e22015-09-15 20:11:30 +0530146 vosMessage.bodyval = (v_U32_t)logType;
Karthick Sa35b0692015-08-21 15:57:05 +0530147 vosMessage.reserved = 0;
148 vosMessage.type = WDA_SEND_LOG_DONE_IND;
Hanumantha Reddy Pothulae00a7e22015-09-15 20:11:30 +0530149 if (VOS_STATUS_SUCCESS != vos_mq_post_message( VOS_MQ_ID_WDA, &vosMessage )) {
Karthick Sa35b0692015-08-21 15:57:05 +0530150 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
151 "WLAN WDA:Posting DXE logging done indication failed" );
Hanumantha Reddy Pothulae00a7e22015-09-15 20:11:30 +0530152 }
Mihir Shete5affadc2015-05-29 20:54:57 +0530153 return;
154}
155
Jeff Johnson295189b2012-06-20 16:38:30 -0700156/*==========================================================================
157 FUNCTION WDA_DS_Register
158
159 DESCRIPTION
160 Register TL client to WDA. This function registers TL RX/TX functions
161 to WDI by calling WDI_DS_Register.
162
163
164 For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions
165 to register TL's RX/TX functions to BAL
166
167 TODO
168 For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification.
169 The uCount parameter is AC mask. It should be redefined to use the
170 same resource callback function.
171
172 DEPENDENCIES
173
174 PARAMETERS
175
176 IN
177 pvosGCtx VOS context
178 pfnTxCompleteCallback TX complete callback upon TX completion
179 pfnRxPacketCallback RX callback
180 pfnTxPacketCallback TX callback
181 pfnResourceCB gets called when updating TX PDU number
182 uResTheshold minimum TX PDU size for a packet
183 pCallbackContext WDI calls callback function with it
184 VOS global context pointer
185 OUT
186 uAvailableTxBuf available TX PDU numbder.
187 BAL returns it for NON integrated SOC
188
189 RETURN VALUE
190 VOS_STATUS_E_FAULT: pointer is NULL and other errors
191 VOS_STATUS_SUCCESS: Everything is good :)
192
193 SIDE EFFECTS
194
195============================================================================*/
196VOS_STATUS WDA_DS_Register
197(
198 v_PVOID_t pvosGCtx,
199 WDA_DS_TxCompleteCallback pfnTxCompleteCallback,
200 WDA_DS_RxPacketCallback pfnRxPacketCallback,
201 WDA_DS_TxPacketCallback pfnTxPacketCallback,
202 WDA_DS_ResourceCB pfnResourceCB,
203 v_U32_t uResTheshold,
204 v_PVOID_t pCallbackContext,
205 v_U32_t *uAvailableTxBuf
206)
207{
Jeff Johnson295189b2012-06-20 16:38:30 -0700208 tWDA_CbContext *wdaContext = NULL;
209 WDI_Status wdiStatus;
210
211 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
212 "WLAN WDA: WDA_DS_Register" );
213
214 /*------------------------------------------------------------------------
215 Sanity check
216 ------------------------------------------------------------------------*/
217 if ( ( NULL == pvosGCtx ) ||
218 ( NULL == pfnTxPacketCallback ) ||
219 ( NULL == pfnTxCompleteCallback ) ||
220 ( NULL == pfnRxPacketCallback ) ||
221 ( NULL == pfnResourceCB) )
222 {
223 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
224 "WLAN WDA:Invalid pointers on WDA_DS_Register" );
225 return VOS_STATUS_E_FAULT;
226 }
227
228 /*------------------------------------------------------------------------
229 Extract WDA context
230 ------------------------------------------------------------------------*/
231 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
232 if ( NULL == wdaContext )
233 {
234 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
235 "WLAN WDA:Invalid wda context pointer "
236 "from pvosGCtx on WDA_DS_Register" );
237 return VOS_STATUS_E_FAULT;
238 }
239
240 /*------------------------------------------------------------------------
241 Register with WDI as transport layer client
242 ------------------------------------------------------------------------*/
243 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register");
244
245 wdaContext->pfnTxResourceCB = pfnResourceCB;
246 wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback;
247
248 wdiStatus = WDI_DS_Register( wdaContext->pWdiContext,
249 (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB,
250 (WDI_DS_RxPacketCallback)pfnRxPacketCallback,
251 WDA_DS_TxFlowControlCallback,
Mihir Shete5affadc2015-05-29 20:54:57 +0530252 WDA_DS_RxLogCallback,
Jeff Johnson295189b2012-06-20 16:38:30 -0700253 pvosGCtx );
254
255 if ( WDI_STATUS_SUCCESS != wdiStatus )
256 {
257 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
258 "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus );
259 return VOS_STATUS_E_FAILURE;
260 }
261
262 /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF
263 Put hardcoded value not to put TL into OOR. Revisit it */
264 *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT;
265
266 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700267}
268
269/*==========================================================================
270 FUNCTION WDA_DS_StartXmit
271
272 DESCRIPTION
273 Serialize TX transmit reques to TX thread.
274
275 TODO This sends TX transmit request to TL. It should send to WDI for
276 abstraction.
277
278 For NON integrated SOC, this function calls WLANBAL_StartXmit
279
280 DEPENDENCIES
281
282 PARAMETERS
283
284 IN
285 pvosGCtx VOS context
286
287 RETURN VALUE
288 VOS_STATUS_E_FAULT: pointer is NULL and other errors
289 VOS_STATUS_SUCCESS: Everything is good :)
290
291 SIDE EFFECTS
292
293============================================================================*/
294VOS_STATUS
295WDA_DS_StartXmit
296(
297 v_PVOID_t pvosGCtx
298)
299{
Jeff Johnson295189b2012-06-20 16:38:30 -0700300 vos_msg_t sMessage;
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800301 VOS_STATUS status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700302/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
303
304 if ( NULL == pvosGCtx )
305 {
306 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
307 "WLAN WDA:Invalid pointers on WDA_DS_StartXmit" );
308 return VOS_STATUS_E_FAULT;
309 }
310
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800311 if(WDA_TL_IS_TX_XMIT_PENDING( pvosGCtx ))
312 {
313 /*Already WDA_DS_TX_START_XMIT msg is pending in TL msg queue */
314 return VOS_STATUS_SUCCESS;
315 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700316 /* Serialize our event */
317 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
318 "Serializing WDA TX Start Xmit event" );
319
320 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
321
322 sMessage.bodyptr = NULL;
323 sMessage.type = WDA_DS_TX_START_XMIT;
324
Gopichand Nakkala11acd112012-12-31 16:04:04 -0800325 WDA_TL_SET_TX_XMIT_PENDING(pvosGCtx);
326
327 status = vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
328
329 if(status != VOS_STATUS_SUCCESS)
330 {
331 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_FATAL,
332 "Serializing WDA TX Start Xmit event FAILED" );
333 WDA_TL_CLEAR_TX_XMIT_PENDING(pvosGCtx);
334 }
335 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -0700336}
337
338
339/*==========================================================================
340 FUNCTION WDA_DS_FinishULA
341
342 DESCRIPTION
343 Serialize Finish Upper Level Authentication reques to TX thread.
344
345 DEPENDENCIES
346
347 PARAMETERS
348
349 IN
350 callbackRoutine routine to be called in TX thread
351 callbackContext user data for the above routine
352
353 RETURN VALUE
354 please see vos_tx_mq_serialize
355
356 SIDE EFFECTS
357
358============================================================================*/
359VOS_STATUS
360WDA_DS_FinishULA
361(
362 void (*callbackRoutine) (void *callbackContext),
Tushnim Bhattacharyya39a8f182013-02-20 18:10:30 -0800363 void *callbackContext
Jeff Johnson295189b2012-06-20 16:38:30 -0700364)
365{
366 vos_msg_t sMessage;
367/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
368
369 /* Serialize our event */
370 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
371 "Serializing WDA_DS_FinishULA event" );
372
373 vos_mem_zero( &sMessage, sizeof(vos_msg_t) );
Arun Kumar Khandavalli8d1979d2014-01-09 21:12:25 +0530374 sMessage.bodyptr = callbackContext;
375 sMessage.callback = callbackRoutine;
376 sMessage.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700377 sMessage.type = WDA_DS_FINISH_ULA;
378
379 return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
380}/*WDA_DS_FinishULA*/
381
382/*==========================================================================
383 FUNCTION WDA_DS_BuildTxPacketInfo
384
385 DESCRIPTION
386 Build TX meta info for integrated SOC.
387
388 Same function calls HAL for reserve BD header space into VOS packet and
389 HAL function to fill it.
390
391 DEPENDENCIES
392
393 PARAMETERS
394
395 IN
396 pvosGCtx VOS context
397 vosDataBuff vos data buffer
398 pvDestMacAddr destination MAC address ponter
399 ucDisableFrmXtl Is frame xtl disabled?
400 ucQosEnabled Is QoS enabled?
401 ucWDSEnabled Is WDS enabled?
402 extraHeadSpace Extra head bytes. If it's not 0 due to 4 bytes align
403 of BD header.
404 typeSubtype typeSubtype from MAC header or TX metainfo/BD
405 pAddr2 address 2
406 uTid tid
407 txFlag
408 timeStamp
409 ucIsEapol
410 ucUP
411
412 OUT
413 *pusPktLen Packet length
414
415 RETURN VALUE
416 VOS_STATUS_E_FAULT: pointer is NULL and other errors
417 VOS_STATUS_SUCCESS: Everything is good :)
418
419 SIDE EFFECTS
420
421============================================================================*/
422VOS_STATUS
423WDA_DS_BuildTxPacketInfo
424(
425 v_PVOID_t pvosGCtx,
426 vos_pkt_t* vosDataBuff,
427 v_MACADDR_t* pvDestMacAddr,
428 v_U8_t ucDisableFrmXtl,
429 v_U16_t* pusPktLen,
430 v_U8_t ucQosEnabled,
431 v_U8_t ucWDSEnabled,
432 v_U8_t extraHeadSpace,
433 v_U8_t typeSubtype,
434 v_PVOID_t pAddr2,
435 v_U8_t uTid,
Kanchanapally, Vidyullathaf9426e52013-12-24 17:28:54 +0530436 v_U32_t txFlag,
Jeff Johnson295189b2012-06-20 16:38:30 -0700437 v_U32_t timeStamp,
438 v_U8_t ucIsEapol,
Ganesh Kondabattini10e67352015-03-16 17:41:57 +0530439 v_U8_t ucUP,
440 v_U32_t ucTxBdToken
Jeff Johnson295189b2012-06-20 16:38:30 -0700441)
442{
Jeff Johnson295189b2012-06-20 16:38:30 -0700443 VOS_STATUS vosStatus;
444 WDI_DS_TxMetaInfoType* pTxMetaInfo = NULL;
445 v_SIZE_t usMacAddrSize;
Chet Lanctot4b088622013-05-22 16:09:22 -0700446 wpt_FrameCtrl *pFrameControl;
Abhishek Singh00b71972016-01-07 10:51:04 +0530447#ifdef WLAN_FEATURE_RMC
448 WLANTL_CbType* pTLCb;
449 WLANTL_RMC_SESSION* pRMCSession;
450#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700451 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
452
453 /*------------------------------------------------------------------------
454 Sanity check
455 Extract TL control block
456 ------------------------------------------------------------------------*/
457 if ( ( NULL == pvosGCtx ) || ( NULL == vosDataBuff ) || ( NULL == pvDestMacAddr ) )
458 {
459 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
460 "WDA:Invalid parameter sent on WDA_DS_BuildTxPacketInfo" );
461 return VOS_STATUS_E_FAULT;
462 }
463
Abhishek Singh00b71972016-01-07 10:51:04 +0530464#ifdef WLAN_FEATURE_RMC
465/*----------------------------------------------------------------
466 Extract TL control block
467 --------------------------------------------------------------*/
468 pTLCb = VOS_GET_TL_CB(pvosGCtx);
469 if ( NULL == pTLCb )
470 {
471 TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
472 "WLAN TL %s: pTLCb is NULL", __func__));
473
474 return VOS_STATUS_E_FAILURE;
475 }
476#endif
477
Jeff Johnson295189b2012-06-20 16:38:30 -0700478 /*------------------------------------------------------------------------
479 Extract TX Meta Info pointer from PAL packet
480 ------------------------------------------------------------------------*/
481 pTxMetaInfo = WDI_DS_ExtractTxMetaData( VOS_TO_WPAL_PKT(vosDataBuff) );
482 if ( NULL == pTxMetaInfo )
483 {
484 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
485 "WLAN TL:Invalid RxMetaInfo pointer from PAL packet on WLANTL_RxFrames");
486 VOS_ASSERT( 0 );
487 return VOS_STATUS_E_FAULT;
488 }
489
490 /* Zero out memeory */
491 vos_mem_zero( pTxMetaInfo, sizeof( WDI_DS_TxMetaInfoType ) );
492
493 /* Fill the TX Meta info */
494 pTxMetaInfo->txFlags = txFlag;
495 pTxMetaInfo->qosEnabled = ucQosEnabled;
496 pTxMetaInfo->fenableWDS = ucWDSEnabled;
497 pTxMetaInfo->ac = ucUP;
498 pTxMetaInfo->fUP = uTid;
499 pTxMetaInfo->isEapol = ucIsEapol;
500 pTxMetaInfo->fdisableFrmXlt = ucDisableFrmXtl;
501 pTxMetaInfo->frmType = ( ( typeSubtype & 0x30 ) >> 4 );
502 pTxMetaInfo->typeSubtype = typeSubtype;
Ganesh Kondabattini10e67352015-03-16 17:41:57 +0530503 pTxMetaInfo->txBdToken = ucTxBdToken;
Jeff Johnson295189b2012-06-20 16:38:30 -0700504 /* Length = MAC header + payload */
505 vos_pkt_get_packet_length( vosDataBuff, pusPktLen);
506 pTxMetaInfo->fPktlen = *pusPktLen;
507
Chet Lanctot4b088622013-05-22 16:09:22 -0700508 /* For management frames, peek into Frame Control
509 field to get value of Protected Frame bit */
510 pTxMetaInfo->fProtMgmtFrame = 0;
511 if ( WDA_TLI_MGMT_FRAME_TYPE == pTxMetaInfo->frmType )
512 {
513 if ( 1 == ucDisableFrmXtl ) /* should be 802.11, but check */
514 {
515 vosStatus = vos_pkt_peek_data( vosDataBuff, 0, (v_PVOID_t)&pFrameControl,
516 sizeof( wpt_FrameCtrl ));
517 if ( VOS_STATUS_SUCCESS != vosStatus )
518 {
519 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
520 "WDA: Failed while attempting to extract Protect Bit in "
521 "Frame Control, status %d", vosStatus );
522 VOS_ASSERT( 0 );
523 return VOS_STATUS_E_FAULT;
524 }
525 pTxMetaInfo->fProtMgmtFrame = pFrameControl->wep;
526 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
527 "WLAN TL: fProtMgmtFrame:%d", pTxMetaInfo->fProtMgmtFrame );
528 }
529 }
530
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 // Dst address
532 usMacAddrSize = VOS_MAC_ADDR_SIZE;
533 vosStatus = vos_pkt_extract_data( vosDataBuff,
534 WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ),
535 (v_PVOID_t)pvDestMacAddr,
536 &usMacAddrSize );
Manjunathappa Prakashfb585462013-12-23 19:07:07 -0800537 if ((VOS_STATUS_SUCCESS != vosStatus) ||
538 (usMacAddrSize != VOS_MAC_ADDR_SIZE))
Jeff Johnson295189b2012-06-20 16:38:30 -0700539 {
540 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
541 "WDA:Failed while attempting to extract MAC Addr %d",
542 vosStatus );
543 VOS_ASSERT( 0 );
544 return VOS_STATUS_E_FAULT;
545 }
546
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr );
548
549 // ADDR2
550 vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress, pAddr2 );
551
Abhishek Singh00b71972016-01-07 10:51:04 +0530552#ifdef WLAN_FEATURE_RMC
553 if (pTLCb->rmcDataPathEnabled)
554 {
555 /*look up for mcast transmitter MAC address in TL's active rmc list*/
556 if (((WDA_TLI_DATA_FRAME_TYPE >> 4) == pTxMetaInfo->frmType) &&
557 (vos_is_macaddr_group(pvDestMacAddr)))
558 {
559 pRMCSession =
560 WLANTL_RmcLookUpRmcSession(pTLCb->rmcSession,
561 (v_MACADDR_t*)pTxMetaInfo->addr2MACAddress);
562
563 if (pRMCSession)
564 {
565 if (0xFF == pvDestMacAddr->bytes[0])
566 {
567 pTxMetaInfo->txFlags |= (HAL_USE_BD_RATE_1_MASK);
568 }
569 else
570 {
571 pTxMetaInfo->txFlags |= (HAL_RMC_REQUESTED_MASK);
572
573 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
574 "RMC active for " MAC_ADDRESS_STR " RMC session",
575 MAC_ADDR_ARRAY(pRMCSession->rmcAddr.bytes));
576 }
577 }
578 else
579 {
580 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,
581 "RMC disabled for " MAC_ADDRESS_STR " RMC session",
582 MAC_ADDR_ARRAY(pTxMetaInfo->addr2MACAddress));
583 }
584 }
585 }
586#endif /*WLAN_FEATURE_RMC*/
587
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 /* Dump TX meta infro for debugging */
589 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW,
590 "WLAN TL: Dump TX meta info: "
591 "txFlags:%d, qosEnabled:%d, ac:%d, "
Chet Lanctot4b088622013-05-22 16:09:22 -0700592 "isEapol:%d, fdisableFrmXlt:%d, frmType:%d",
Jeff Johnson295189b2012-06-20 16:38:30 -0700593 pTxMetaInfo->txFlags, ucQosEnabled, pTxMetaInfo->ac,
Chet Lanctot4b088622013-05-22 16:09:22 -0700594 pTxMetaInfo->isEapol, pTxMetaInfo->fdisableFrmXlt,
595 pTxMetaInfo->frmType );
Jeff Johnson295189b2012-06-20 16:38:30 -0700596
597 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700598}
599
600
601/*==========================================================================
602 FUNCTION WDS_DS_TrimRxPacketInfo
603
604 DESCRIPTION
605 Trim/Remove RX BD header for NON integrated SOC.
606 It does nothing for integrated SOC.
607
608 DEPENDENCIES
609
610 PARAMETERS
611
612 IN
613 vosDataBuff vos data buffer
614
615 RETURN VALUE
616 VOS_STATUS_E_FAULT: pointer is NULL and other errors
617 VOS_STATUS_SUCCESS: Everything is good :)
618
619 SIDE EFFECTS
620
621============================================================================*/
622VOS_STATUS
623WDA_DS_TrimRxPacketInfo
624(
625 vos_pkt_t *vosDataBuff
626)
627{
Jeff Johnson295189b2012-06-20 16:38:30 -0700628 /* Nothing to trim
629 * Do Nothing */
630
631 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700632}
633
634
635
636/*==========================================================================
637 FUNCTION WDA_DS_PeekRxPacketInfo
638
639 DESCRIPTION
640 Return RX metainfo pointer for for integrated SOC.
641
642 Same function will return BD header pointer.
643
644 DEPENDENCIES
645
646 PARAMETERS
647
648 IN
649 vosDataBuff vos data buffer
650
651 pvDestMacAddr destination MAC address ponter
652 bSwap Want to swap BD header? For backward compatability
653 It does nothing for integrated SOC
654 OUT
655 *ppRxHeader RX metainfo pointer
656
657 RETURN VALUE
658 VOS_STATUS_E_FAULT: pointer is NULL and other errors
659 VOS_STATUS_SUCCESS: Everything is good :)
660
661 SIDE EFFECTS
662
663============================================================================*/
664VOS_STATUS
665WDA_DS_PeekRxPacketInfo
666(
667 vos_pkt_t *vosDataBuff,
668 v_PVOID_t *ppRxHeader,
669 v_BOOL_t bSwap
670)
671{
Jeff Johnson295189b2012-06-20 16:38:30 -0700672 /*------------------------------------------------------------------------
673 Sanity check
674 ------------------------------------------------------------------------*/
675 if ( NULL == vosDataBuff )
676 {
677 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
678 "WDA:Invalid parameter sent on WDA_DS_PeekRxPacketInfo" );
679 return VOS_STATUS_E_FAULT;
680 }
681
682 *ppRxHeader = WDI_DS_ExtractRxMetaData( (wpt_packet*)vosDataBuff );
683
684 if ( NULL == *ppRxHeader )
685 {
686 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
687 "WDA:Failed to get RX meta data from WDI" );
688 return VOS_STATUS_E_FAILURE;
689 }
690
691 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700692}
693
694
695
696/*==========================================================================
697 FUNCTION WDA_DS_GetFrameTypeSubType
698
699 DESCRIPTION
700 Get typeSubtype from the packet. The BD header should have this.
701 But some reason, Libra/Volans read it from 802.11 header and save it
702 back to BD header. So for NON integrated SOC, this function does
703 the same.
704
705 For integrated SOC, WDI does the same, not TL.
706 It does return typeSubtype from RX meta info for integrated SOC.
707
708 DEPENDENCIES
709
710 PARAMETERS
711
712 IN
713 pvosGCtx VOS context
714 vosDataBuff vos data buffer
715 pRxHeader RX meta info or BD header pointer
716
717 OUT
718 ucTypeSubtype typeSubtype
719
720 RETURN VALUE
721 VOS_STATUS_E_FAULT: pointer is NULL and other errors
722 VOS_STATUS_SUCCESS: Everything is good :)
723
724 SIDE EFFECTS
725
726============================================================================*/
727VOS_STATUS
728WDA_DS_GetFrameTypeSubType
729(
730 v_PVOID_t pvosGCtx,
731 vos_pkt_t *vosDataBuff,
732 v_PVOID_t pRxHeader,
733 v_U8_t *ucTypeSubtype
734)
735{
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 /*------------------------------------------------------------------------
737 Sanity check
738 ------------------------------------------------------------------------*/
739 if ( NULL == pRxHeader )
740 {
741 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
742 "WDA:Invalid parameter sent on WDA_DS_GetFrameTypeSubType" );
743 return VOS_STATUS_E_FAULT;
744 }
745
746 *ucTypeSubtype = ( WDA_GET_RX_TYPE( pRxHeader ) << 4 ) | WDA_GET_RX_SUBTYPE( pRxHeader );
747
748 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700749}
750
751
752/*==========================================================================
753 FUNCTION WDA_DS_RxAmsduBdFix
754
755 DESCRIPTION
756 For backward compatability with Libra/Volans. Need to call HAL function
757 for HW BD bug fix
758
759 It does nothing for integrated SOC.
760
761 DEPENDENCIES
762
763 PARAMETERS
764
765 IN
766 pvosGCtx VOS context
767 pvBDHeader BD header pointer
768
769 OUT
770
771 RETURN VALUE
772 VOS_STATUS_E_FAULT: pointer is NULL and other errors
773 VOS_STATUS_SUCCESS: Everything is good :)
774
775 SIDE EFFECTS
776
777============================================================================*/
778VOS_STATUS
779WDA_DS_RxAmsduBdFix
780(
781 v_PVOID_t pvosGCtx,
782 v_PVOID_t pvBDHeader
783)
784{
Jeff Johnson295189b2012-06-20 16:38:30 -0700785 /* Do nothing for Prima */
786 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700787}
788
789/*==========================================================================
790 FUNCTION WDA_DS_GetRssi
791
792 DESCRIPTION
793 Get RSSI
794
795 TODO It returns hardcoded value in the meantime since WDA/WDI does nothing
796 support it yet for Prima.
797
798 DEPENDENCIES
799
800 PARAMETERS
801
802 IN
803 vosDataBuff vos data buffer
804
805 OUT
806 puRssi RSSI
807
808 RETURN VALUE
809 VOS_STATUS_E_FAULT: pointer is NULL and other errors
810 VOS_STATUS_SUCCESS: Everything is good :)
811
812 SIDE EFFECTS
813
814============================================================================*/
815VOS_STATUS
816WDA_DS_GetRssi
817(
818 v_PVOID_t pvosGCtx,
819 v_S7_t* puRssi
820)
821{
Jeff Johnson295189b2012-06-20 16:38:30 -0700822 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
823 "WDA:halPS_GetRssi no longer supported. Need replacement");
824
825 *puRssi = -30;
826
827 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700828}
829
830/*==========================================================================
831 FUNCTION WDA_DS_GetTxResources
832
833 DESCRIPTION
834 It does return hardcoded value. It should bigger number than 0.
835 Returning 0 will put TL in out-of-resource condition for TX.
836
837 Return current PDU resources from BAL for NON integrated SOC.
838
839 DEPENDENCIES
840
841 PARAMETERS
842
843 IN
844 vosDataBuff vos data buffer
845
846 OUT
847 puResCount available PDU number for TX
848
849 RETURN VALUE
850 VOS_STATUS_E_FAULT: pointer is NULL and other errors
851 VOS_STATUS_SUCCESS: Everything is good :)
852
853 SIDE EFFECTS
854
855============================================================================*/
856VOS_STATUS
857WDA_DS_GetTxResources
858(
859 v_PVOID_t pvosGCtx,
860 v_U32_t* puResCount
861)
862{
Jeff Johnson295189b2012-06-20 16:38:30 -0700863 /* Return minimum necessary number of packet(DXE descriptor) for data */
864 /* TODO Need to get this from DXE??? */
865 *puResCount = WDA_TLI_BD_PDU_RESERVE_THRESHOLD + 50;
866 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700867}
868
869
870
871/*==========================================================================
872 FUNCTION WDA_DS_GetReplayCounter
873
874 DESCRIPTION
875 Return replay counter from BD header or RX meta info
876
877 DEPENDENCIES
878
879 PARAMETERS
880
881 IN
882 pRxHeader RX meta info or BD header pointer
883
884 OUT
885
886 RETURN VALUE
887 Replay Counter
888
889 SIDE EFFECTS
890
891============================================================================*/
892v_U64_t
893WDA_DS_GetReplayCounter
894(
895 v_PVOID_t pRxHeader
896)
897{
Jeff Johnson295189b2012-06-20 16:38:30 -0700898 return WDA_GET_RX_REPLAY_COUNT( pRxHeader );
Jeff Johnson295189b2012-06-20 16:38:30 -0700899}
900
Jeff Johnson295189b2012-06-20 16:38:30 -0700901/*==========================================================================
902 FUNCTION WDA_DS_TxFrames
903
904 DESCRIPTION
905 Pull packets from TL and push them to WDI. It gets invoked upon
906 WDA_DS_TX_START_XMIT.
907
908 This function is equivelant of WLANSSC_Transmit in Libra/Volans.
909
910 TODO
911 This function should be implemented and moved in WDI.
912
913 DEPENDENCIES
914
915 PARAMETERS
916
917 IN
918 pvosGCtx VOS context
919
920 OUT
921
922 RETURN VALUE
923 VOS_STATUS_E_FAULT: pointer is NULL and other errors
924 VOS_STATUS_SUCCESS: Everything is good :)
925
926 SIDE EFFECTS
927
928============================================================================*/
929
930VOS_STATUS
931WDA_DS_TxFrames
932(
933 v_PVOID_t pvosGCtx
934)
935{
936 VOS_STATUS vosStatus;
937 vos_pkt_t *pTxMgmtChain = NULL;
938 vos_pkt_t *pTxDataChain = NULL;
939 vos_pkt_t *pTxPacket = NULL;
940 v_BOOL_t bUrgent;
941 wpt_uint32 ucTxResReq;
942 WDI_Status wdiStatus;
943 tWDA_CbContext *wdaContext = NULL;
944 v_U32_t uMgmtAvailRes;
945 v_U32_t uDataAvailRes;
946 WLANTL_TxCompCBType pfnTxComp = NULL;
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -0800947 v_U32_t uTxFailCount = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700948
949 wdaContext = (tWDA_CbContext *)vos_get_context(VOS_MODULE_ID_WDA, pvosGCtx);
950 if ( NULL == wdaContext )
951 {
952 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
953 "WDA:Invalid wda context pointer from pvosGCtx on WDA_DS_TxFrames" );
954 return VOS_STATUS_E_FAULT;
955 }
956
957 /*-------------------------------------------------------------------------
958 Need to fetch separatelly for Mgmt and Data frames because TL is not
959 aware of separate resource management at the lower levels
960 -------------------------------------------------------------------------*/
961 /*Mgmt tx*/
962 uMgmtAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
963 WDI_MGMT_POOL_ID);
964
965 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
966 &pTxMgmtChain,
967 uMgmtAvailRes,
968 (wdaContext->uTxFlowMask & WDA_HI_FLOW_MASK),
969 &bUrgent );
970
971 // We need to initialize vsoStatus in case we don't enter the "while"
972 // loop. If we don't enter the loop, it means that there are no packets,
973 // available, and that is considered success. If we enter the loop,
974 // vosStatus will be set appropriately inside the loop
975 vosStatus = VOS_STATUS_SUCCESS;
976
977 while ( NULL != pTxMgmtChain )
978 {
979 /* Walk the chain and unchain the packet */
980 pTxPacket = pTxMgmtChain;
981 vosStatus = vos_pkt_walk_packet_chain( pTxMgmtChain, &pTxMgmtChain, VOS_TRUE );
982
983 if( (VOS_STATUS_SUCCESS != vosStatus) &&
984 (VOS_STATUS_E_EMPTY != vosStatus) )
985 {
986 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
987 "WDA Walking packet chain returned status : %d", vosStatus );
988 VOS_ASSERT( 0 );
989 vosStatus = VOS_STATUS_E_FAILURE;
990 break;
991 }
992
993 if ( VOS_STATUS_E_EMPTY == vosStatus )
994 {
995 vosStatus = VOS_STATUS_SUCCESS;
996 }
997
998 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
999 (wpt_packet*)pTxPacket,
1000 0 /* more */ );
1001 if ( WDI_STATUS_SUCCESS != wdiStatus )
1002 {
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -08001003 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
Yue Maf74c9862013-03-21 16:36:15 -07001004 "WDA : Pushing a packet to WDI failed." );
1005 if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus )
1006 {
1007 uTxFailCount++;
1008 }
1009 VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -07001010 //We need to free the packet here
1011 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
1012 if(pfnTxComp)
1013 {
1014 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
1015 }
1016 }
1017
1018 };
1019
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -08001020 if ( uTxFailCount )
1021 {
1022 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1023 "WDA : Tx fail count for mgmt pkts: %d.", uTxFailCount);
1024 uTxFailCount = 0;
1025 }
1026
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 /*Data tx*/
1028 uDataAvailRes = WDI_GetAvailableResCount(wdaContext->pWdiContext,
1029 WDI_DATA_POOL_ID);
1030
1031 ucTxResReq = WLANTL_GetFrames( pvosGCtx,
1032 &pTxDataChain,
1033 /*WDA_DS_DXE_RES_COUNT*/ uDataAvailRes,
1034 (wdaContext->uTxFlowMask & WDA_LO_FLOW_MASK),
1035 &bUrgent );
1036
1037 // We need to initialize vsoStatus in case we don't enter the "while"
1038 // loop. If we don't enter the loop, it means that there are no packets,
1039 // available, and that is considered success. If we enter the loop,
1040 // vosStatus will be set appropriately inside the loop
1041 vosStatus = VOS_STATUS_SUCCESS;
1042
1043 while ( NULL != pTxDataChain )
1044 {
1045 /* Walk the chain and unchain the packet */
1046 pTxPacket = pTxDataChain;
1047 vosStatus = vos_pkt_walk_packet_chain( pTxDataChain, &pTxDataChain, VOS_TRUE );
1048
1049 if( (VOS_STATUS_SUCCESS != vosStatus) &&
1050 (VOS_STATUS_E_EMPTY != vosStatus) )
1051 {
1052 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1053 "WDA Walking packet chain returned status : %d", vosStatus );
1054 VOS_ASSERT( 0 );
1055 vosStatus = VOS_STATUS_E_FAILURE;
1056 break;
1057 }
1058
1059 if ( VOS_STATUS_E_EMPTY == vosStatus )
1060 {
1061 vosStatus = VOS_STATUS_SUCCESS;
1062 }
1063
1064 wdiStatus = WDI_DS_TxPacket( wdaContext->pWdiContext,
1065 (wpt_packet*)pTxPacket,
1066 0 /* more */ );
1067 if ( WDI_STATUS_SUCCESS != wdiStatus )
1068 {
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -08001069 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_WARN,
Yue Maf74c9862013-03-21 16:36:15 -07001070 "WDA : Pushing a packet to WDI failed." );
1071 if ( WDI_STATUS_E_NOT_ALLOWED != wdiStatus )
1072 {
1073 uTxFailCount++;
1074 }
1075 VOS_ASSERT( wdiStatus == WDI_STATUS_E_NOT_ALLOWED );
Jeff Johnson295189b2012-06-20 16:38:30 -07001076 //We need to free the packet here
1077 vos_pkt_get_user_data_ptr(pTxPacket, VOS_PKT_USER_DATA_ID_TL, (void **)&pfnTxComp);
1078 if(pfnTxComp)
1079 {
1080 pfnTxComp(pvosGCtx, pTxPacket, VOS_STATUS_E_FAILURE);
1081 }
1082 }
1083
1084 };
1085
Tushnim Bhattacharyyab6898a32013-01-21 17:55:11 -08001086 if ( uTxFailCount )
1087 {
1088 VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
1089 "WDA : Tx fail count for data pkts: %d.", uTxFailCount);
1090 }
1091
1092
Jeff Johnson295189b2012-06-20 16:38:30 -07001093 WDI_DS_TxComplete(wdaContext->pWdiContext, ucTxResReq);
1094
1095 return vosStatus;
1096}
Jeff Johnson295189b2012-06-20 16:38:30 -07001097
Jeff Johnson295189b2012-06-20 16:38:30 -07001098/*==========================================================================
1099 FUNCTION WDA_DS_TxFlowControlCallback
1100
1101 DESCRIPTION
1102 Invoked by WDI to control TX flow.
1103
1104 DEPENDENCIES
1105
1106 PARAMETERS
1107
1108 IN
1109 pvosGCtx VOS context
1110 uFlowMask TX channel mask for flow control
1111 Defined in WDA_TXFlowEnumType
1112
1113 OUT
1114
1115 RETURN VALUE
1116
1117 SIDE EFFECTS
1118
1119============================================================================*/
1120v_VOID_t
1121WDA_DS_TxFlowControlCallback
1122(
1123 v_PVOID_t pvosGCtx,
1124 v_U8_t ucFlowMask
1125)
1126{
1127 tWDA_CbContext* wdaContext = NULL;
1128 v_U8_t ucOldFlowMask;
1129 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1130
1131 /*------------------------------------------------------------------------
1132 Sanity check
1133 ------------------------------------------------------------------------*/
1134 if ( NULL == pvosGCtx )
1135 {
1136 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1137 "WDA: Invalid parameter sent on WDA_DS_TxFlowControlCallback" );
1138 return;
1139 }
1140
1141 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1142 if ( NULL == wdaContext )
1143 {
1144 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1145 "WDA: Invalid context on WDA_DS_TxFlowControlCallback" );
1146 return;
1147 }
1148
1149 /* two physical DXE channels
1150 1) data packets(all four AC) and BAP for the low priority channel(lower 4 bits)
1151 2) management packets for high priority channel(5th bit)
1152 */
1153
1154
1155 /*Save and reset */
1156 ucOldFlowMask = wdaContext->uTxFlowMask;
1157 wdaContext->uTxFlowMask = ucFlowMask;
1158
1159 /*If the AC is being enabled - resume data xfer
1160
1161 Assume previous value of wdaContext->uTxFlowMask:
1162
1163 DATA\MGM | ON | OFF
1164 ----------------------
1165 ON | 1F | 0F *
1166 ----------------------
1167 OFF | 10 *| 00 *
1168
1169 * - states in which a channel can be enabled
1170
1171 ucFlowMask will tell which channel must be enabled
1172 to enable a channel a new bit must be turned on =>
1173 ucFlowMask > wdaContext->uTxFlowMask when enable happens
1174 */
1175
1176 if ( ucFlowMask > ucOldFlowMask )
1177 {
1178 WDA_DS_StartXmit(pvosGCtx);
1179 }
1180
1181}
Jeff Johnson295189b2012-06-20 16:38:30 -07001182
1183/*==========================================================================
1184 FUNCTION WDA_DS_GetTxFlowMask
1185
1186 DESCRIPTION
1187 return TX flow mask control value
1188
1189 DEPENDENCIES
1190
1191 PARAMETERS
1192
1193 IN
1194 pvosGCtx VOS context
1195
1196 OUT
1197 uFlowMask TX channel mask for flow control
1198 Defined in WDA_TXFlowEnumType
1199
1200 RETURN VALUE
1201 VOS_STATUS_E_INVAL: pointer is NULL and other errors
1202 VOS_STATUS_SUCCESS: Everything is good :)
1203
1204 SIDE EFFECTS
1205
1206============================================================================*/
1207VOS_STATUS
1208WDA_DS_GetTxFlowMask
1209(
1210 v_PVOID_t pvosGCtx,
1211 v_U8_t* puFlowMask
1212)
1213{
Jeff Johnson295189b2012-06-20 16:38:30 -07001214 tWDA_CbContext* wdaContext = NULL;
1215 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1216
1217 /*------------------------------------------------------------------------
1218 Sanity check
1219 ------------------------------------------------------------------------*/
1220 if ( ( NULL == pvosGCtx ) || ( NULL == puFlowMask ) )
1221 {
1222 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1223 "WDA: Invalid parameter sent on WDA_DS_GetTxFlowMask" );
1224 return VOS_STATUS_E_INVAL;
1225 }
1226
1227 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1228 if ( NULL == wdaContext )
1229 {
1230 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1231 "WDA: Invalid context on WDA_DS_GetTxFlowMask" );
1232 return VOS_STATUS_E_INVAL;
1233 }
1234
1235 *puFlowMask = wdaContext->uTxFlowMask;
1236
1237 return VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001238}
1239
Jeff Johnson295189b2012-06-20 16:38:30 -07001240v_VOID_t
1241WDA_DS_TxCompleteCB
1242(
1243 v_PVOID_t pvosGCtx,
1244 v_PVOID_t pFrameDataBuff
1245)
1246{
1247 tWDA_CbContext* wdaContext = NULL;
1248 WDI_DS_TxMetaInfoType* pTxMetadata;
1249 VOS_STATUS vosStatus;
1250 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
1251
1252 /*------------------------------------------------------------------------
1253 Sanity check
1254 ------------------------------------------------------------------------*/
1255
1256 if ( ( NULL == pvosGCtx ) || ( NULL == pFrameDataBuff ) )
1257 {
1258 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1259 "WDA: Invalid parameter sent on WDA_DS_TxCompleteCB" );
1260 return;
1261 }
1262
1263 wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx );
1264 if ( NULL == wdaContext )
1265 {
1266 VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
1267 "WDA: Invalid context on WDA_DS_TxCompleteCB" );
1268 return;
1269 }
1270
1271 // extract metadata from PAL packet
1272 pTxMetadata = WDI_DS_ExtractTxMetaData( (wpt_packet*)pFrameDataBuff );
1273
1274 if ( eWLAN_PAL_STATUS_SUCCESS == pTxMetadata->txCompleteStatus )
1275 vosStatus = VOS_STATUS_SUCCESS;
1276 else
1277 vosStatus = VOS_STATUS_E_FAILURE;
1278
1279 wdaContext->pfnTxCompleteCallback( pvosGCtx, pFrameDataBuff, vosStatus );
1280}