wlan: Forward cached data to the STA via RX thread.
Currently the cached frames are forwared to STA in
TX thread context. Changing it to go via RX thread.
For this, a new api WLANTL_RxProcessMsg to process
messages in RX thread and a new TL queue ( tlrxmq )
has been added.
Change-Id: Iacae4a45f13a7c51d12f29895d18b90c15b49cb6
CRs-Fixed: 657831
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index e0d54cf..570cf77 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -1939,6 +1939,44 @@
);
/*==========================================================================
+ FUNCTION WLANTL_RxProcessMsg
+
+ DESCRIPTION
+ Called by VOSS when a message was serialized for TL through the
+ rx thread/task.
+
+ DEPENDENCIES
+ The TL must be initialized before this function can be called.
+
+ PARAMETERS
+
+ IN
+ pvosGCtx: pointer to the global vos context; a handle to TL's
+ control block can be extracted from its context
+ message: type and content of the message
+
+
+ RETURN VALUE
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_INVAL: invalid input parameters
+ VOS_STATUS_E_FAULT: pointer to TL cb is NULL ; access would cause a
+ page fault
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ Other values can be returned as a result of a function call, please check
+ corresponding API for more info.
+ SIDE EFFECTS
+
+============================================================================*/
+VOS_STATUS
+WLANTL_RxProcessMsg
+(
+ v_PVOID_t pvosGCtx,
+ vos_msg_t* message
+);
+
+/*==========================================================================
FUNCTION WLANTL_McFreeMsg
DESCRIPTION
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 95c89be..f426448 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -978,9 +978,9 @@
uData = ucSTAId | (ucUcastSig << 8 ) | (ucBcastSig << 16);
sMessage.bodyval = uData;
- sMessage.type = WLANTL_TX_FWD_CACHED;
+ sMessage.type = WLANTL_RX_FWD_CACHED;
- return vos_tx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
+ return vos_rx_mq_serialize(VOS_MQ_ID_TL, &sMessage);
} /* WLANTL_StartForwarding() */
@@ -6225,6 +6225,92 @@
}/* WLANTL_RxCachedFrames */
/*==========================================================================
+ FUNCTION WLANTL_RxProcessMsg
+
+ DESCRIPTION
+ Called by VOSS when a message was serialized for TL through the
+ rx thread/task.
+
+ DEPENDENCIES
+ The TL must be initialized before this function can be called.
+
+ PARAMETERS
+
+ IN
+ pvosGCtx: pointer to the global vos context; a handle to TL's
+ control block can be extracted from its context
+ message: type and content of the message
+
+
+ RETURN VALUE
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_INVAL: invalid input parameters
+ VOS_STATUS_E_FAULT: pointer to TL cb is NULL ; access would cause a
+ page fault
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ Other values can be returned as a result of a function call, please check
+ corresponding API for more info.
+ SIDE EFFECTS
+
+============================================================================*/
+VOS_STATUS
+WLANTL_RxProcessMsg
+(
+ v_PVOID_t pvosGCtx,
+ vos_msg_t* message
+)
+{
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ v_U32_t uData;
+ v_U8_t ucSTAId;
+ v_U8_t ucUcastSig;
+ v_U8_t ucBcastSig;
+
+ /*------------------------------------------------------------------------
+ Sanity check
+ ------------------------------------------------------------------------*/
+ if ( NULL == message )
+ {
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid parameter sent on WLANTL_RxProcessMessage"));
+ return VOS_STATUS_E_INVAL;
+ }
+
+ /*------------------------------------------------------------------------
+ Process message
+ ------------------------------------------------------------------------*/
+ TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
+ "WLAN TL:Received message: %d through rx flow", message->type));
+
+ switch( message->type )
+ {
+
+ case WLANTL_RX_FWD_CACHED:
+ /*---------------------------------------------------------------------
+ The data sent with the message has the following structure:
+ | 00 | ucBcastSignature | ucUcastSignature | ucSTAID |
+ each field above is one byte
+ ---------------------------------------------------------------------*/
+ uData = message->bodyval;
+ ucSTAId = ( uData & 0x000000FF);
+ ucUcastSig = ( uData & 0x0000FF00)>>8;
+ ucBcastSig = (v_U8_t)(( uData & 0x00FF0000)>>16);
+ vosStatus = WLANTL_ForwardSTAFrames( pvosGCtx, ucSTAId,
+ ucUcastSig, ucBcastSig);
+ break;
+
+ default:
+ /*no processing for now*/
+ break;
+ }
+
+ return VOS_STATUS_SUCCESS;
+}
+
+
+/*==========================================================================
FUNCTION WLANTL_ResourceCB
DESCRIPTION
@@ -8696,10 +8782,6 @@
)
{
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
- v_U32_t uData;
- v_U8_t ucSTAId;
- v_U8_t ucUcastSig;
- v_U8_t ucBcastSig;
void (*callbackRoutine) (void *callbackContext);
void *callbackContext;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
@@ -8730,20 +8812,7 @@
case WLANTL_TX_RES_NEEDED:
vosStatus = WLANTL_GetTxResourcesCB( pvosGCtx );
break;
-
- case WLANTL_TX_FWD_CACHED:
- /*---------------------------------------------------------------------
- The data sent with the message has the following structure:
- | 00 | ucBcastSignature | ucUcastSignature | ucSTAID |
- each field above is one byte
- ---------------------------------------------------------------------*/
- uData = message->bodyval;
- ucSTAId = ( uData & 0x000000FF);
- ucUcastSig = ( uData & 0x0000FF00)>>8;
- ucBcastSig = (v_U8_t)(( uData & 0x00FF0000)>>16);
- vosStatus = WLANTL_ForwardSTAFrames( pvosGCtx, ucSTAId,
- ucUcastSig, ucBcastSig);
- break;
+
case WDA_DS_TX_START_XMIT:
WLANTL_ClearTxXmitPending(pvosGCtx);
vosStatus = WDA_DS_TxFrames( pvosGCtx );
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index 36d1f29..29a7710 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -254,7 +254,8 @@
and TL is low on resources*/
WLANTL_TX_RES_NEEDED = 1,
- /* Forwarding RX cached frames */
+ /* Forwarding RX cached frames. This is not used anymore as it is
+ replaced by WLANTL_RX_FWD_CACHED in RX thread*/
WLANTL_TX_FWD_CACHED = 2,
/* Serialized STAID AC Indication */
@@ -272,6 +273,18 @@
WLANTL_TX_MAX
}WLANTL_TxSignalsType;
+
+/*---------------------------------------------------------------------------
+ TL signals for RX thread
+---------------------------------------------------------------------------*/
+typedef enum
+{
+
+ /* Forwarding RX cached frames */
+ WLANTL_RX_FWD_CACHED = 0,
+
+}WLANTL_RxSignalsType;
+
/*---------------------------------------------------------------------------
STA Event type
---------------------------------------------------------------------------*/
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index a85d29c..474ce76 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -1762,6 +1762,11 @@
pTargetMq = &(gpVosContext->vosSched.wdiRxMq);
break;
}
+ case VOS_MQ_ID_TL:
+ {
+ pTargetMq = &(gpVosContext->vosSched.tlRxMq);
+ break;
+ }
default:
diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c
index 60086fe..ced64cd 100644
--- a/CORE/VOSS/src/vos_sched.c
+++ b/CORE/VOSS/src/vos_sched.c
@@ -1133,6 +1133,32 @@
continue;
}
+ // Check now the TL queue
+ if (!vos_is_mq_empty(&pSchedContext->tlRxMq))
+ {
+ // Service the TL message queue
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s: Servicing the VOS TL RX Message queue",__func__);
+ pMsgWrapper = vos_mq_get(&pSchedContext->tlRxMq);
+ if (pMsgWrapper == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: pMsgWrapper is NULL", __func__);
+ VOS_ASSERT(0);
+ break;
+ }
+ vStatus = WLANTL_RxProcessMsg( pSchedContext->pVContext,
+ pMsgWrapper->pVosMsg);
+ if (!VOS_IS_STATUS_SUCCESS(vStatus))
+ {
+ VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Issue Processing RX TL message",__func__);
+ }
+ // return message to the Core
+ vos_core_return_msg(pSchedContext->pVContext, pMsgWrapper);
+ continue;
+ }
+
// Check the WDI queue
if (!vos_is_mq_empty(&pSchedContext->wdiRxMq))
{
@@ -1364,6 +1390,18 @@
VOS_ASSERT(0);
return vStatus;
}
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
+ "%s: Initializing the TL Rx Message queue",__func__);
+ vStatus = vos_mq_init(&pSchedContext->tlRxMq);
+ if (! VOS_IS_STATUS_SUCCESS(vStatus))
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to init TL RX Message queue",__func__);
+ VOS_ASSERT(0);
+ return vStatus;
+ }
+
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: Initializing the WDI Tx Message queue",__func__);
vStatus = vos_mq_init(&pSchedContext->wdiTxMq);
@@ -1449,6 +1487,12 @@
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
"%s De-Initializing the TL Tx Message queue",__func__);
vos_mq_deinit(&pSchedContext->tlTxMq);
+
+ //Rx TL
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
+ "%s De-Initializing the TL Rx Message queue",__func__);
+ vos_mq_deinit(&pSchedContext->tlRxMq);
+
//Tx WDI
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH,
"%s: DeInitializing the WDI Tx Message queue",__func__);
@@ -1683,6 +1727,15 @@
sysTxFreeMsg(pSchedContext->pVContext, pMsgWrapper->pVosMsg);
}
+ while( NULL != (pMsgWrapper = vos_mq_get(&pSchedContext->tlRxMq) ))
+ {
+ VOS_TRACE( VOS_MODULE_ID_VOSS,
+ VOS_TRACE_LEVEL_INFO,
+ "%s: Freeing RX TL MSG message type %d",__func__,
+ pMsgWrapper->pVosMsg->type );
+ sysTxFreeMsg(pSchedContext->pVContext, pMsgWrapper->pVosMsg);
+ }
+
while( NULL != (pMsgWrapper = vos_mq_get(&pSchedContext->sysRxMq) ))
{
VOS_TRACE( VOS_MODULE_ID_VOSS,
diff --git a/CORE/VOSS/src/vos_sched.h b/CORE/VOSS/src/vos_sched.h
index 8311ee3..1965031 100644
--- a/CORE/VOSS/src/vos_sched.h
+++ b/CORE/VOSS/src/vos_sched.h
@@ -160,6 +160,9 @@
/* TL Message queue on the Tx thread */
VosMqType tlTxMq;
+ /* TL Message queue on the Rx thread */
+ VosMqType tlRxMq;
+
/* SYS Message queue on the Tx thread */
VosMqType sysTxMq;