Ping stalls from TDLS discovery to enable link
Initiator to postpone TX direct packet until either receiving
direct packet or TDLS_WAIT_TIME_INITIATOR (300 msec)
Reponder to exit BMPS before sending TDLS setup or discovery
response.
Do not allow BMPS if TDLS is ongoing.
Rewrite TL suspend/resume routine to handle up to 41 STA.
Change-Id: Iae353d6bef0c225e357fe9e9153625bafff15a6c
CRs-Fixed: 466258
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 82b7e3d..b6e415d 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -155,9 +155,16 @@
#endif
/*Enables debugging behavior in TL*/
#define TL_DEBUG
+/*Enables debugging FC control frame in TL*/
+//#define TL_DEBUG_FC
//#define WLAN_SOFTAP_FLOWCTRL_EN
//#define BTAMP_TEST
+#ifdef TL_DEBUG_FC
+#include <wlan_qct_pal_status.h>
+#include <wlan_qct_pal_device.h> // wpalReadRegister
+#endif
+
/*----------------------------------------------------------------------------
* Preprocessor Definitions and Constants
* -------------------------------------------------------------------------*/
@@ -3223,8 +3230,6 @@
{
WLANTL_CbType* pTLCb = NULL;
vos_msg_t vosMsg;
- v_U8_t ucTxSuspendReq, ucTxSuspended;
- v_U32_t STAId = 0;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
@@ -3233,7 +3238,7 @@
Extract TL control block
------------------------------------------------------------------------*/
pTLCb = VOS_GET_TL_CB(pvosGCtx);
- if ( NULL == pTLCb || NULL == pucSTAId )
+ if ( NULL == pTLCb )
{
TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
"WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_SuspendDataTx"));
@@ -3243,65 +3248,33 @@
/*------------------------------------------------------------------------
Check the type of request: generic suspend, or per station suspend
------------------------------------------------------------------------*/
- /* Station IDs for Suspend request are received as bitmap */
- ucTxSuspendReq = *pucSTAId;
- ucTxSuspended = pTLCb->ucTxSuspended;
-
- if (WLAN_ALL_STA == ucTxSuspended)
- {
- /* All Stations are in Suspend mode. Nothing to do */
- TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
- "WLAN TL:All stations already suspended"));
- return VOS_STATUS_E_EXISTS;
- }
-
- if (WLAN_ALL_STA == *pucSTAId)
+ if (NULL == pucSTAId)
{
/* General Suspend Request received */
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL:General suspend requested"));
- vos_atomic_set_U8( &pTLCb->ucTxSuspended, WLAN_ALL_STA);
+ vos_atomic_set_U8( &pTLCb->ucTxSuspended, 1);
vosMsg.reserved = WLAN_MAX_STA_COUNT;
}
else
{
- /* Station specific Suspend Request received */
- /* Update Station Id Bit map for suspend request */
- do
+ if ( WLANTL_STA_ID_INVALID( *pucSTAId ) )
{
- /* If Bit set for this station with STAId */
- if (ucTxSuspendReq >> (STAId +1) )
- {
- /* If it is Not a valid station ID */
- if ( WLANTL_STA_ID_INVALID( STAId ) )
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Invalid station id requested on WLANTL_SuspendDataTx"));
- STAId++;
- continue;
- }
- /* If this station is Not registered with TL */
- if( NULL == pTLCb->atlSTAClients[STAId] )
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Station memory was not previously allocated on WLANTL_SuspendDataTx"));
- STAId++;
- continue;
- }
- if ( 0 == pTLCb->atlSTAClients[STAId]->ucExists )
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Station was not previously registered on WLANTL_SuspendDataTx"));
- STAId++;
- continue;
- }
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid station id %d requested on WLANTL_SuspendDataTx", *pucSTAId));
+ return VOS_STATUS_E_FAULT;
+ }
- TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
- "WLAN TL:Suspend request for station: %d", STAId));
- vos_atomic_set_U8( &pTLCb->atlSTAClients[STAId]->ucTxSuspended, 1);
- }
- STAId++;
- } while ( STAId < WLAN_MAX_STA_COUNT );
+ if ( pTLCb->atlSTAClients[*pucSTAId] && (0 == pTLCb->atlSTAClients[*pucSTAId]->ucExists ))
+ {
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Station %d was not previously registered on WLANTL_SuspendDataTx", *pucSTAId));
+ return VOS_STATUS_E_EXISTS;
+ }
+
+ TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
+ "WLAN TL:Suspend request for station: %d", *pucSTAId));
+ vos_atomic_set_U8( &pTLCb->atlSTAClients[*pucSTAId]->ucTxSuspended, 1);
vosMsg.reserved = *pucSTAId;
}
@@ -3360,8 +3333,6 @@
)
{
WLANTL_CbType* pTLCb = NULL;
- v_U8_t ucTxResumeReq;
- v_U32_t STAId = 0;
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*------------------------------------------------------------------------
@@ -3369,75 +3340,48 @@
Extract TL control block
------------------------------------------------------------------------*/
pTLCb = VOS_GET_TL_CB(pvosGCtx);
- if ( NULL == pTLCb || NULL == pucSTAId)
+ if ( NULL == pTLCb )
{
TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
"WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_ResumeDataTx"));
return VOS_STATUS_E_FAULT;
}
- ucTxResumeReq = *pucSTAId;
/*------------------------------------------------------------------------
Check to see the type of resume
------------------------------------------------------------------------*/
- if ( WLAN_ALL_STA == *pucSTAId)
+ if ( NULL == pucSTAId )
{
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL:General resume requested"));
vos_atomic_set_U8( &pTLCb->ucTxSuspended, 0);
-
- /* Set to Resume for all stations */
- for (STAId = 0; STAId < WLAN_MAX_STA_COUNT; STAId++)
- {
- if( NULL != pTLCb->atlSTAClients[STAId] )
- {
- vos_atomic_set_U8( &pTLCb->atlSTAClients[STAId]->ucTxSuspended, 0);
- }
- }
}
else
{
- do
+ if ( WLANTL_STA_ID_INVALID( *pucSTAId ))
{
- /* If Bit Set for this station with STAId */
- if (ucTxResumeReq >> (STAId + 1))
- {
- /* If it is Not a valid station ID */
- if ( WLANTL_STA_ID_INVALID( STAId ))
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Invalid station id requested on WLANTL_ResumeDataTx"));
- STAId++;
- continue;
- }
- if ( NULL == pTLCb->atlSTAClients[STAId])
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Station was not allocated memory on WLANTL_ResumeDataTx"));
- STAId++;
- continue;
- }
- /* If this station is Not registered with TL */
- if ( 0 == pTLCb->atlSTAClients[STAId]->ucExists )
- {
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLAN TL:Station was not previously registered on WLANTL_ResumeDataTx"));
- STAId++;
- continue;
- }
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid station id %d requested on WLANTL_ResumeDataTx", *pucSTAId));
+ return VOS_STATUS_E_FAULT;
+ }
- TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
- "WLAN TL:Resume request for station: %d", STAId));
- vos_atomic_set_U8( &pTLCb->atlSTAClients[STAId]->ucTxSuspended, 0);
- }
- STAId++;
- } while ( STAId < WLAN_MAX_STA_COUNT );
+ if ( pTLCb->atlSTAClients[*pucSTAId] && (0 == pTLCb->atlSTAClients[*pucSTAId]->ucExists ))
+ {
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Station %d was not previously registered on WLANTL_ResumeDataTx", *pucSTAId));
+ return VOS_STATUS_E_EXISTS;
+ }
+
+ TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
+ "WLAN TL:Resume request for station: %d", *pucSTAId));
+ vos_atomic_set_U8( &pTLCb->atlSTAClients[*pucSTAId]->ucTxSuspended, 0);
}
/*------------------------------------------------------------------------
Resuming transmission
------------------------------------------------------------------------*/
- if ( pTLCb->uResCount >= WDA_TLI_MIN_RES_MF )
+ if (( pTLCb->uResCount >= WDA_TLI_MIN_RES_MF ) &&
+ ( 0 == pTLCb->ucTxSuspended ))
{
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL:Resuming transmission"));
@@ -5082,11 +5026,16 @@
{
#if 1 //enable processing of only fcStaTxDisabled bitmap for now. the else part is old better qos code.
// need to revisit the old code for full implementation.
- v_U8_t ucTxSuspended = 0, ucTxSuspendReq = 0, ucTxResumeReq = 0;
- WLANTL_CbType* pTLCb = NULL;
-
+ v_U8_t ucSTAId;
+ v_U16_t ucStaValidBitmap;
+ v_U16_t ucStaTxDisabledBitmap;
+ WLANTL_CbType* pTLCb = NULL;
+ #ifdef TL_DEBUG_FC
+ v_U32_t rxTimeStamp;
+ v_U32_t curTick;
+ #endif
/*------------------------------------------------------------------------
- Extract TL control block
+ Extract TL control block
------------------------------------------------------------------------*/
pTLCb = VOS_GET_TL_CB(pvosGCtx);
if ( NULL == pTLCb )
@@ -5095,27 +5044,30 @@
"WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_SuspendDataTx"));
return VOS_STATUS_E_FAULT;
}
+ ucStaValidBitmap = WDA_GET_RX_FC_VALID_STA_MASK(pvBDHeader);
+ ucStaTxDisabledBitmap = WDA_GET_RX_FC_STA_TX_DISABLED_BITMAP(pvBDHeader);
+#ifdef TL_DEBUG_FC
+ rxTimeStamp = WDA_GET_RX_TIMESTAMP(pvBDHeader);
+ /* hard code of MTU_GLOBAL_TIMER_ADDR to calculate the time between generated and processed */
+ wpalReadRegister(0x03081400+0x1D4, &curTick);
- /* Existing Stations with Tx suspended */
- ucTxSuspended = pTLCb->ucTxSuspended;
-
- /* Suspend Request Received */
- ucTxSuspendReq = (v_U8_t) WDA_GET_RX_FC_STA_TX_DISABLED_BITMAP(pvBDHeader);
TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "WLANTL_ProcessFCFrame called for Stations:: Current: %x Requested: %x ", ucTxSuspended, ucTxSuspendReq));
-
- ucTxResumeReq = ucTxSuspendReq ^ ( ucTxSuspended | ucTxSuspendReq );
- ucTxSuspendReq = ucTxSuspendReq ^ ( ucTxSuspended & ucTxSuspendReq );
- TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
- "Station Suspend request processed :: Suspend: %x :Resume: %x ", ucTxSuspendReq, ucTxResumeReq));
-
- if ( 0 != ucTxSuspendReq )
+ "%ld (%ld-%ld): Disabled %x Valid %x\n", curTick > rxTimeStamp ? curTick - rxTimeStamp : rxTimeStamp - (0xFFFFFFFF - curTick),
+ curTick, rxTimeStamp, ucStaTxDisabledBitmap, ucStaValidBitmap));
+#endif
+ for(ucSTAId = 0; ucStaValidBitmap != 0; ucStaValidBitmap >>=1, ucStaTxDisabledBitmap >>= 1, ucSTAId ++)
{
- WLANTL_SuspendDataTx(pvosGCtx, &ucTxSuspendReq, NULL);
- }
- if ( 0 != ucTxResumeReq )
- {
- WLANTL_ResumeDataTx(pvosGCtx, &ucTxResumeReq);
+ if ( (0 == (ucStaValidBitmap & 0x1)) || (pTLCb->atlSTAClients[ucSTAId] && (0 == pTLCb->atlSTAClients[ucSTAId]->ucExists)) )
+ continue;
+
+ if (ucStaTxDisabledBitmap & 0x1)
+ {
+ WLANTL_SuspendDataTx(pvosGCtx, &ucSTAId, NULL);
+ }
+ else
+ {
+ WLANTL_ResumeDataTx(pvosGCtx, &ucSTAId);
+ }
}
#else
@@ -5512,6 +5464,13 @@
}
+#ifdef FEATURE_WLAN_TDLS
+ if (( pClientSTA->ucExists ) &&
+ (WLAN_STA_TDLS == pClientSTA->wSTADesc.wSTAType) &&
+ (pClientSTA->ucTxSuspended))
+ vos_atomic_set_U8( &pClientSTA->ucTxSuspended, 0 );
+#endif
+
#ifdef FEATURE_WLAN_CCX
if ((pClientSTA->wSTADesc.ucIsCcxSta)|| broadcast)
{
@@ -8618,6 +8577,7 @@
for ( ucIndex = 0; ucIndex < WLAN_MAX_STA_COUNT ; ucIndex++)
{
if ( ucIndex != ucStaId && pTLCb->atlSTAClients[ucIndex] && pTLCb->atlSTAClients[ucIndex]->ucExists &&
+ !pTLCb->atlSTAClients[ucIndex]->ucTxSuspended &&
vos_mem_compare( (void*)pTLCb->atlSTAClients[ucIndex]->wSTADesc.vSTAMACAddress.bytes,
(void*)w8023Header.vDA, 6) )
{