⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdproc.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************* ?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 + -