📄 cmdproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
*
* Purpose: This module provides implementaion of host command
* processing routines
*
* $Author: cuizt $
*
* $Date: 2007/07/02 09:10:16 $
*
* $Revision: 1.8.2.2 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "If.h"
#if DEBUG_NIDIS_SETINFOR
void Para_NdisMSetInformationComplete(
TCHAR* szFuntion,ulong ulLine,
NDIS_HANDLE MiniportAdapterHandle,
NDIS_STATUS Status
)
{
#ifdef WLAN_PMU_INFO_COMPLETE
__try
{
if(!MiniportAdapterHandle)
{
TCHAR wszstr[256]={0};
char szstr[256]={0};
swprintf(wszstr,L"expFun=%s,lin=0x%x",szFuntion,ulLine);
// WideChar2MultiByte(wszstr, szstr);
WideCharToMultiByte( CP_ACP,0,wszstr,wcslen(wszstr) + 1,szstr,wcslen(wszstr) + 1,NULL,NULL);
ParaPrintFile("\r\nExcp:%s\r\n",szstr);
MessageBox(NULL,wszstr,NULL,MB_OK|MB_ICONERROR);
}
NdisMSetInformationComplete(MiniportAdapterHandle,Status);
}
__except(EXCEPTION_EXECUTE_HANDLER | EXCEPTION_CONTINUE_EXECUTION |EXCEPTION_CONTINUE_SEARCH )
{
//ParaPrintFile("")
TCHAR wszstr[256]={0};
swprintf(wszstr,L"expFun=%s,lin=0x%x",szFuntion,ulLine);
MessageBox(NULL,wszstr,NULL,MB_OK|MB_ICONERROR);
}
#endif
return;
}
#endif /* 1 */
NDIS_STATUS
DownloadCommand(
IN PMRVDRV_ADAPTER Adapter,
IN CmdCtrlNode *pTempNode
);
/******************************************************************************
*
* Name: AllocateCmdBuffer()
*
* Description: Allocate command buffer
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_RESOURCES
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS AllocateCmdBuffer(
IN PMRVDRV_ADAPTER Adapter
)
{
NDIS_STATUS Status;
ULONG ulBufSize;
CmdCtrlNode *TempCmdArray;
PUCHAR pTempVirtualAddr;
UINT i;
Status = NDIS_STATUS_SUCCESS;
// initialize free queue
NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
InitializeQKeeper(&Adapter->CmdFreeQ);
NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
// initialize priority queue
//dralee_1108
//NdisAcquireSpinLock(&Adapter->PriorityQSpinLock);
InitializeQKeeper(&Adapter->CmdPendQ); // plus All pending Command
//dralee_1108
//NdisReleaseSpinLock(&Adapter->PriorityQSpinLock);
// allocate the command array space
ulBufSize = sizeof(CmdCtrlNode) * MRVDRV_NUM_OF_CMD_BUFFER;
Status = MRVDRV_ALLOC_MEM((PVOID *)(&(Adapter->CmdArray)), ulBufSize);
if( Status != NDIS_STATUS_SUCCESS )
return Status;
NdisZeroMemory(Adapter->CmdArray, ulBufSize);
// Allocate shared memory buffers
for ( i=0; i<MRVDRV_NUM_OF_CMD_BUFFER; i++ )
{
TempCmdArray = ((CmdCtrlNode *)(Adapter->CmdArray) + i);
DBGPRINT(DBG_NEWCMD,("TempCmdArray %d 0x%x ****\n",
i, TempCmdArray));
NdisAllocateMemoryWithTag(&pTempVirtualAddr, MRVDRV_SIZE_OF_CMD_BUFFER, 'LVRM');
if ( !pTempVirtualAddr )
return NDIS_STATUS_RESOURCES;
NdisZeroMemory(pTempVirtualAddr, MRVDRV_SIZE_OF_CMD_BUFFER);
TempCmdArray->BufVirtualAddr = pTempVirtualAddr;
TempCmdArray->BufPhyAddr.LowPart = 0xffffffff;
TempCmdArray->BufPhyAddr.HighPart = 0xffffffff;
// insert command to free queue
NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
CleanUpCmdCtrlNode(TempCmdArray);
InsertQNodeAtTail(&Adapter->CmdFreeQ,(PQ_NODE) TempCmdArray);
NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
}
return Status;
}
/******************************************************************************
*
* Name: FreeCmdBuffer()
*
* Description: Free command buffer
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value: NDIS_STATUS_SUCCESS
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS FreeCmdBuffer(
IN PMRVDRV_ADAPTER Adapter
)
{
CmdCtrlNode *TempCmdArray;
ULONG ulBufSize;
UINT i;
// Need to check if cmd array is allocated or not
if ( Adapter->CmdArray == NULL )
return NDIS_STATUS_SUCCESS;
//RETAILMSG(1,(TEXT("Free Cmd Buf \r\n")));
// Release shared memory buffers
for(i=0; i<MRVDRV_NUM_OF_CMD_BUFFER; i++)
{
TempCmdArray = ((CmdCtrlNode*)(Adapter->CmdArray) + i);
if ( TempCmdArray->BufVirtualAddr )
NdisFreeMemory ((PVOID)TempCmdArray->BufVirtualAddr,
MRVDRV_SIZE_OF_CMD_BUFFER,
0);
}
// Release CmdCtrlNode
if ( Adapter->CmdArray )
{
ulBufSize = sizeof(CmdCtrlNode) * MRVDRV_NUM_OF_CMD_BUFFER;
NdisFreeMemory((PVOID *)Adapter->CmdArray, ulBufSize, 0);
}
return NDIS_STATUS_SUCCESS;
}
/******************************************************************************
*
* Name: ResetCmdBuffer()
*
* Description: Reset command buffers
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value: NDIS_STATUS_SUCCESS
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS ResetCmdBuffer(
IN PMRVDRV_ADAPTER Adapter
)
{
CmdCtrlNode *TempCmdArray;
UINT i;
BOOLEAN timerStatus;
PPENDING_OID pPending;
DBGPRINT(DBG_CMDRESP, ("ResetCmdBuffer\n"));
Adapter->bIsScanInProgress = FALSE;
Adapter->bIsAssociateInProgress = FALSE;
// Cancel command timer
if (Adapter->CommandTimerSet)
{
NdisMCancelTimer(&Adapter->MrvDrvCommandTimer, &timerStatus);
Adapter->CommandTimerSet = FALSE;
Adapter->isCommandTimerExpired = FALSE;
}
EnterCriticalSection(&Adapter->CmdQueueExeSection);
EnterCriticalSection(&Adapter->TxCriticalSection);
// Reset CmdFreeQ and CmdPendingQ
InitializeQKeeper(&Adapter->CmdFreeQ);
InitializeQKeeper(&Adapter->CmdPendQ); // plus
for(i=0; i<MRVDRV_NUM_OF_CMD_BUFFER; i++)
{
TempCmdArray = ((CmdCtrlNode*)(Adapter->CmdArray) + i);
// If this is a pending command, return failure
if ( TempCmdArray->PendingInfo == HostCmd_PENDING_ON_SET_OID )
{
#ifdef WLAN_PMU_INFO_COMPLETE
#ifndef DEBUG_NIDIS_SETINFOR
NdisMSetInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_FAILURE);
#else
Para_NdisMSetInformationComplete(
TEXT(__FUNCTION__),__LINE__,
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_FAILURE);
#endif
#endif
RETAILMSG(1,(TEXT("WARNING::call NdisMSetInformationComplete, %x!\n",TempCmdArray->ExpectedRetCode)));
DBGPRINT(DBG_CMDRESP, ("call NdisMSetInformationComplete\n"));
}
if ( TempCmdArray->PendingInfo == HostCmd_PENDING_ON_GET_OID )
{
#ifdef WLAN_PMU_INFO_COMPLETE
NdisMQueryInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_FAILURE);
#endif
RETAILMSG(1,(TEXT("WARNING::call NdisMGetInformationComplete, %x!\n",TempCmdArray->ExpectedRetCode)));
DBGPRINT(DBG_CMDRESP, ("call NdisMGetInformationComplete\n"));
}
RETAILMSG(1,(TEXT("WARNING::Go on clean up node content!\n")));
// Clean up node content
TempCmdArray->Next = NULL;
CleanUpCmdCtrlNode(TempCmdArray);
// Append node to the end of CmdFreeQ
InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)(TempCmdArray));
}
Adapter->CurCmd = NULL;
Adapter->SeqNum = 0;
// return pending OIDs
pPending = &(Adapter->PendingSetSssidOid);
if (pPending->bIsPendingOID)
{
pPending->bIsPendingOID = FALSE;
#ifdef WLAN_PMU_INFO_COMPLETE
#ifndef DEBUG_NIDIS_SETINFOR
NdisMSetInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
#else
Para_NdisMSetInformationComplete(
TEXT(__FUNCTION__),__LINE__,
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
#endif
#endif
}
pPending = &(Adapter->PendingGetBssidOid);
if (pPending->bIsPendingOID)
{
pPending->bIsPendingOID = FALSE;
#ifdef WLAN_PMU_INFO_COMPLETE
#ifndef DEBUG_NIDIS_SETINFOR
NdisMSetInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
#else
Para_NdisMSetInformationComplete(
TEXT(__FUNCTION__),__LINE__,
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
#endif
#endif
}
LeaveCriticalSection(&Adapter->TxCriticalSection);
LeaveCriticalSection(&Adapter->CmdQueueExeSection);
return NDIS_STATUS_SUCCESS;
}
//+dzj
/******************************************************************************
*
* Name: pmu_ResetCmdBuffer()
*
* Description: Reset command buffers
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value: NDIS_STATUS_SUCCESS
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS Pmu_ResetCmdBuffer(
IN PMRVDRV_ADAPTER Adapter
)
{
CmdCtrlNode *TempCmdArray;
UINT i;
BOOLEAN timerStatus;
DBGPRINT(DBG_CMDRESP, ("PMU_ResetCmdBuffer\n"));
Adapter->bIsScanInProgress = FALSE;
Adapter->bIsAssociateInProgress = FALSE;
// Cancel command timer
if (Adapter->CommandTimerSet)
{
NdisMCancelTimer(&Adapter->MrvDrvCommandTimer, &timerStatus);
Adapter->CommandTimerSet = FALSE;
Adapter->isCommandTimerExpired = FALSE;
}
// Reset CmdFreeQ and CmdPendingQ
InitializeQKeeper(&Adapter->CmdFreeQ);
InitializeQKeeper(&Adapter->CmdPendQ); // plus
for(i=0; i<MRVDRV_NUM_OF_CMD_BUFFER; i++)
{
TempCmdArray = ((CmdCtrlNode*)(Adapter->CmdArray) + i);
// Clean up node content
TempCmdArray->Next = NULL;
CleanUpCmdCtrlNode(TempCmdArray);
// Append node to the end of CmdFreeQ
InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)(TempCmdArray));
}
Adapter->CurCmd = NULL;
Adapter->SeqNum = 0;
return NDIS_STATUS_SUCCESS;
}
/******************************************************************************
*
* Name: GetFreeCmdCtrlNode()
*
* Description: to get next available CmdCtrlNode
*
* Arguments: PMRVDRV_ADAPTER Adapter,
* ULONG CurrentPacketFilter
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
CmdCtrlNode *
GetFreeCmdCtrlNode(
IN PMRVDRV_ADAPTER Adapter
)
{
CmdCtrlNode *TempNode;
if ( !Adapter )
return NULL;
NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
TempNode = (CmdCtrlNode *)PopFirstQNode(&Adapter->CmdFreeQ);
CleanUpCmdCtrlNode(TempNode);
NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
return TempNode;
}
VOID
ReturnCmdNode(
IN PMRVDRV_ADAPTER Adapter,
CmdCtrlNode *TempNode
)
{
if ( !TempNode )
return;
NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
InsertQNodeAtTail(&Adapter->CmdFreeQ, (PQ_NODE)TempNode);
NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
return;
}
/******************************************************************************
*
* Name: SetCmdCtrlNode()
*
* Description: to set up CmdCtrlNode
*
* Arguments: CmdCtrlNode *pTempNode
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -