SCAN-OFFLOAD: Remove the scan commands from smeScanCmdPendingList
If Scan offload is enabled then remove the pending commands in
smeScanCmdPendingList along with smeCmdPendingList while closing
a session.
Change-Id: Icc9c3148fa109f8c29ce760b858ad300e977c368
CRs-Fixed: 500914
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 48d11d6..d93fc96 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -241,7 +241,8 @@
void smePushCommand( tpAniSirGlobal pMac, tSmeCmd *pCmd, tANI_BOOLEAN fHighPriority );
void smeProcessPendingQueue( tpAniSirGlobal pMac );
void smeReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCmd);
-void purgeSmeSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId);
+void purgeSmeSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId,
+ tDblLinkList *pList);
tANI_BOOLEAN smeCommandPending(tpAniSirGlobal pMac);
tANI_BOOLEAN pmcProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
//this function is used to abort a command where the normal processing of the command
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 50b9add..2c60b9f 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -916,7 +916,8 @@
{
eCsrRoamState PreviousState;
- smsLog( pMac, LOG1, "CSR RoamState: [ %d <== %d ]", NewRoamState, pMac->roam.curState[sessionId]);
+ smsLog( pMac, LOG1, "CSR RoamState[%hu]: [ %d <== %d ]", sessionId,
+ NewRoamState, pMac->roam.curState[sessionId]);
PreviousState = pMac->roam.curState[sessionId];
@@ -13575,7 +13576,13 @@
vos_timer_destroy(&pSession->hTimerJoinRetry);
#endif
vos_timer_destroy(&pSession->hTimerIbssJoining);
- purgeSmeSessionCmdList(pMac, sessionId);
+ purgeSmeSessionCmdList(pMac, sessionId, &pMac->sme.smeCmdPendingList);
+ if (pMac->fScanOffload)
+ {
+ purgeSmeSessionCmdList(pMac, sessionId,
+ &pMac->sme.smeScanCmdPendingList);
+ }
+
purgeCsrSessionCmdList(pMac, sessionId);
csrInitSession(pMac, sessionId);
}
@@ -13596,7 +13603,13 @@
}
else
{
- purgeSmeSessionCmdList(pMac, sessionId);
+ purgeSmeSessionCmdList(pMac, sessionId,
+ &pMac->sme.smeCmdPendingList);
+ if (pMac->fScanOffload)
+ {
+ purgeSmeSessionCmdList(pMac, sessionId,
+ &pMac->sme.smeScanCmdPendingList);
+ }
purgeCsrSessionCmdList(pMac, sessionId);
status = csrIssueDelStaForSessionReq( pMac, sessionId,
pSession->selfMacAddr, callback, pContext);
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 48ea388..6217000 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -6502,6 +6502,7 @@
tListElem *pEntry, *pEntryTmp;
tSmeCmd *pCommand;
tDblLinkList localList;
+ tDblLinkList *pCmdList;
vos_mem_zero(&localList, sizeof(tDblLinkList));
if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
@@ -6509,19 +6510,23 @@
smsLog(pMac, LOGE, FL(" failed to open list"));
return fRet;
}
+ if (!pMac->fScanOffload)
+ pCmdList = &pMac->sme.smeCmdPendingList;
+ else
+ pCmdList = &pMac->sme.smeScanCmdPendingList;
- csrLLLock(&pMac->sme.smeCmdPendingList);
- pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
+ csrLLLock(pCmdList);
+ pEntry = csrLLPeekHead(pCmdList, LL_ACCESS_NOLOCK);
while(pEntry)
{
- pEntryTmp = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
+ pEntryTmp = csrLLNext(pCmdList, pEntry, LL_ACCESS_NOLOCK);
pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
if( eSmeCommandScan == pCommand->command )
{
switch( pCommand->u.scanCmd.reason )
{
case eCsrScanIdleScan:
- if( csrLLRemoveEntry(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK) )
+ if( csrLLRemoveEntry(pCmdList, pEntry, LL_ACCESS_NOLOCK) )
{
csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
}
@@ -6535,7 +6540,7 @@
pEntry = pEntryTmp;
}
- csrLLUnlock(&pMac->sme.smeCmdPendingList);
+ csrLLUnlock(pCmdList);
while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
{
@@ -6555,6 +6560,7 @@
tListElem *pEntry, *pEntryTmp;
tSmeCmd *pCommand;
tDblLinkList localList;
+ tDblLinkList *pCmdList;
vos_mem_zero(&localList, sizeof(tDblLinkList));
if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
@@ -6563,11 +6569,16 @@
return fRet;
}
- csrLLLock(&pMac->sme.smeCmdPendingList);
- pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
+ if (!pMac->fScanOffload)
+ pCmdList = &pMac->sme.smeCmdPendingList;
+ else
+ pCmdList = &pMac->sme.smeScanCmdPendingList;
+
+ csrLLLock(pCmdList);
+ pEntry = csrLLPeekHead(pCmdList, LL_ACCESS_NOLOCK);
while(pEntry)
{
- pEntryTmp = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
+ pEntryTmp = csrLLNext(pCmdList, pEntry, LL_ACCESS_NOLOCK);
pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
if( (eSmeCommandScan == pCommand->command) && (sessionId == pCommand->sessionId) )
{
@@ -6586,7 +6597,7 @@
smsLog (pMac, LOGW, "%s: -------- abort scan command reason = %d",
__func__, pCommand->u.scanCmd.reason);
//The rest are fresh scan requests
- if( csrLLRemoveEntry(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK) )
+ if( csrLLRemoveEntry(pCmdList, pEntry, LL_ACCESS_NOLOCK) )
{
csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
}
@@ -6597,7 +6608,7 @@
pEntry = pEntryTmp;
}
- csrLLUnlock(&pMac->sme.smeCmdPendingList);
+ csrLLUnlock(pCmdList);
while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
{
@@ -7290,8 +7301,14 @@
tListElem *pEntry = NULL;
tSmeCmd *pCommand = NULL;
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
-
- pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
+ tDblLinkList *pCmdList ;
+
+ if (!pMac->fScanOffload)
+ pCmdList = &pMac->sme.smeCmdActiveList;
+ else
+ pCmdList = &pMac->sme.smeScanCmdActiveList;
+
+ pEntry = csrLLPeekHead( pCmdList, LL_ACCESS_LOCK );
if ( pEntry )
{
pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 68ea351..c60ebd9 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -240,12 +240,12 @@
smeReleaseCmdList(pMac, &pMac->sme.smeScanCmdActiveList);
}
-void purgeSmeSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
+void purgeSmeSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId,
+ tDblLinkList *pList)
{
//release any out standing commands back to free command list
tListElem *pEntry, *pNext;
tSmeCmd *pCommand;
- tDblLinkList *pList = &pMac->sme.smeCmdPendingList;
tDblLinkList localList;
vos_mem_zero(&localList, sizeof(tDblLinkList));
@@ -278,7 +278,6 @@
smeAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
}
csrLLClose(&localList);
-
}