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

📄 exitproc.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
 *
 *  Purpose:    This module provides NDIS shutdown routines
 *
 *  $Author: cuizt $
 *
 *  $Date: 2007/07/02 09:10:16 $
 *
 *  $Revision: 1.3.2.4 $
 *
 *****************************************************************************/

/*
===============================================================================
            INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "If.h"
#include "logmain.h"
extern DWORD g_AssociationDuration;

/*
===============================================================================
            CODED PUBLIC PROCEDURES
===============================================================================

/******************************************************************************
 *
 *  Name: MrvDrvReset()
 *
 *  Description: 
 *      NDIS miniport reset routine.
 *
 *  Conditions for Use:   
 *      Will be called by NDIS wrapper to reset the device
 *
 *  Arguments:            
 *      OUT PBOOLEAN AddressingReset
 *      IN  NDIS_HANDLE MiniportAdapterContext
 *    
 *  Return Value:         
 * 
 *  Notes:                
 *
 *****************************************************************************/
NDIS_STATUS
MrvDrvReset(
  OUT PBOOLEAN AddressingReset,
  IN  NDIS_HANDLE MiniportAdapterContext
  )
{
  BOOLEAN timerStatus;
  PMRVDRV_ADAPTER Adapter;
  BOOLEAN  bDoNotify = FALSE;

RETAILMSG(1,(L"MrvDrvReset,hd=0x%x\r\n",MiniportAdapterContext));

  DBGPRINT(DBG_LOAD | DBG_WARNING,("WARNING: +MrvDrvReset()\n")); 
  //RETAILMSG(1,(TEXT("WARNING: +MrvDrvReset() \r\n")));

	V5DbgMsg( (L"+ MrvDrvReset\n") );
   
    //MrvPrintFile("\nMrvDrvReset");
 

  Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

Adapter->bIsPendingReset = TRUE; // tt cetk_1
/* tt ra fail
  Adapter->bIsPendingReset = TRUE;
*/

  // Set AddressingReset indication
  *AddressingReset = FALSE;

    // report link status change
  //ResetDisconnectStatus(Adapter);
  
  if ( Adapter->MediaConnectStatus == NdisMediaStateConnected)
  {
    bDoNotify = TRUE;
    Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
#ifdef DEBUG_PARA_ROAMING_PRINT
	RETAILMSG(1,(TEXT("NdisMediaStateDisconnected is caused by MrvDrvReset!...\n")));
#endif
    WriteCommonLogFile(WIFI_LOG,"AP is disconnected(Reason=3) (MrvDrvReset)!...\r\n",
    				strlen("AP is disconnected(Reason=3) (MrvDrvReset)!...\r\n"));
   if(g_AssociationDuration != 0)
  {
	char logstr[200];
	sprintf(logstr,"Association Duration is %d seconds\r\n", (GetTickCount() - g_AssociationDuration)/1000);
	WriteCommonLogFile(WIFI_LOG,logstr, strlen(logstr));
	g_AssociationDuration = 0;
  }

  }

  /* tt ra fail, msdn said: miniport need not call this
      NdisMIndicateStatus(
                          Adapter->MrvDrvAdapterHdl,
                          NDIS_STATUS_MEDIA_DISCONNECT,
                          (PVOID)NULL,
                          0);   
       NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
*/
    //tx
    CleanUpSingleTxBuffer(Adapter);

    // rx
    ResetRxPDQ(Adapter);
  
    // command 
  //ResetCmdBuffer(Adapter);

    // reset the Adapter object
    //ResetAdapterObject(Adapter);

  // Enable interrupt
  EnableInterrupt(Adapter);

  //Adapter->bIsPendingReset = FALSE;

/*
#ifndef NDIS50_MINIPORT
  // Check device removal status
    if (Adapter->SurpriseRemoved == TRUE) 
        return NDIS_STATUS_ADAPTER_REMOVED;
#else
  if ( cf_IsFirmwareLoaded(Adapter -> hwIface) == IX_STATUS_FAILURE )
  {
    DBGPRINT(DBG_LOAD,("card removed!"));
    return NDIS_STATUS_ADAPTER_REMOVED;       
  }   
#endif
*/ 

// tt cetk_1 ++
  if (bDoNotify == TRUE)
  {
    NdisMCancelTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, &timerStatus);
    NdisMSetTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, 10);
    Adapter->DisconnectTimerSet = TRUE;
  }
  else
  {
        Adapter->bIsPendingReset = FALSE;
  }
// tt --
/* tt ra fail
  if (bDoNotify == TRUE)
  {
    NdisMSetTimer(&Adapter->MrvDrvIndicateConnectStatusTimer, 10);
    Adapter->DisconnectTimerSet = TRUE;
  } 
*/
  return NDIS_STATUS_SUCCESS;
  
}


/******************************************************************************
 *
 *  Name: MrvDrvCheckForHang()
 *
 *  Description:
 *      NDIS miniport check for hang routine. 
 *
 *  Conditions for Use:
 *      Will be called by NDIS wrapper to determine current station operation status.
 *      If the station is not responding, NDIS wrapper will call MrvDrvReset() to reset 
 *      the station. Driver first check and use current HW status stored in device 
 *      object to report system then update the status and send command to query HW status.
 *
 *  Arguments:
 *      IN NDIS_HANDLE MiniportAdapterContext
 *    
 *  Return Value:
 *    TRUE if the NIC HW is not operating properly
 *    FALSE if the NIC HW is OK
 * 
 *  Notes: According to Microsoft NDIS document, this function is normally called 
 *         by NDIS wrapper approximately every 2 seconds.
 *
 *****************************************************************************/
BOOLEAN
MrvDrvCheckForHang(
  IN NDIS_HANDLE MiniportAdapterContext
  )
{
  PMRVDRV_ADAPTER  Adapter;

RETAILMSG(1,(L"MrvDrvCheckForHang,hd=0x%x\r\n",MiniportAdapterContext));
    
    DBGPRINT(DBG_LOAD|DBG_WARNING,("INIT - Enter MrvDrvCheckForHang\n"));
	V5DbgMsg( (L"+ MrvDrvCheckForHang\n") );
	return FALSE; //tt ra fail
  
  Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;

   //lykao, 061505, test
   // return FALSE;
    //BugFix1
   if ( (Adapter->psState != PS_STATE_FULL_POWER) &&
            (Adapter->psState != PS_STATE_WAKEUP) )
    {
		DBGPRINT(DBG_LOAD, ("Not in wake mode \n"));
		return FALSE;
	}
#ifdef DEEP_SLEEP 
    // In Deep Sleep Mode no packet can be sent out 
    if (Adapter->IsDeepSleep)
    { 
      return FALSE;
    }
#endif

    if ( Adapter->SurpriseRemoved == TRUE )
    {
        DBGPRINT(DBG_WARNING, ("Adapter is removed, return TRUE in CheckForHang\n"));
        return TRUE;
    }


#ifdef UNDER_CE
    /// when D3 don't check for hang 
    if ( Adapter->CurPowerState != NdisDeviceStateD0 )
    {
        return FALSE;
    }
    /// check the timeout times , may be we need to set the bigger number than '2' in longer check for hang period 
    if ( Adapter->ucNumCmdTimeOut > 2 )
    {

        DBGPRINT(DBG_LOAD | DBG_WARNING, 
                        ("CheckForHang: %d cmd time out in last period, reset!\n", 
                        Adapter->ucNumCmdTimeOut));

        // more than 2 cmd time out in the last period, something is wrong
        Adapter->ucNumCmdTimeOut = 0;

        return TRUE;
    }

    Adapter->ucNumCmdTimeOut = 0;

    //dralee
    //if ( (Adapter->psState == PS_STATE_SLEEP_PENDING) &&
      if((Adapter->psState == PS_STATE_SLEEP) )
    {
        ULONG   ulCurrentSystemUpTime, ulDiff;

        NdisGetSystemUpTime(&ulCurrentSystemUpTime);

        ulDiff = ulCurrentSystemUpTime - Adapter->ulAwakeTimeStamp;

        if ( (Adapter->ulAwakeTimeStamp != 0) && 
             (ulCurrentSystemUpTime > Adapter->ulAwakeTimeStamp) &&
             (ulDiff > MRVL_MAX_TIME_BETWEEN_AWAKE) )
        {
            DBGPRINT(DBG_WARNING, ("Time since last awake time: %d(ms), "
                                   "card probably removed!\n", ulDiff));
            return TRUE;
        }
    }
    else
    {
        // update the awake time stamp, sometimes, the FW can stay awake
        // due to hi traffic
        NdisGetSystemUpTime(&Adapter->ulAwakeTimeStamp);
    }
#endif // under_ce

    if ( Adapter->MediaConnectStatus == NdisMediaStateConnected )
    {
        Adapter->usTimeElapsedSinceLastScan += MRVL_CHECK_FOR_HANG_TIME;

        if ( (Adapter->ulTxByteInLastPeriod + Adapter->ulRxByteInLastPeriod) < 
             MRVL_SCAN_ALLOW_THRESHOLD )
        {

            if ( Adapter->usTimeElapsedSinceLastScan > MRVL_BACKGOUND_SCAN_TIME )
            {
                Adapter->usTimeElapsedSinceLastScan = 0;

        if (!Adapter->bIsAssociateInProgress && !Adapter->bIsScanInProgress) 
        {
          DBGPRINT(DBG_OID, ("period scan in MrvDrvCheckForHang()"));

          Adapter->bIsScanWhileConnect = TRUE;
          
#if 0
          // scan
                  PrepareAndSendCommand(
                      Adapter,
                      HostCmd_CMD_802_11_SCAN,
                      0,
                      HostCmd_OPTION_USE_INT,
                      (NDIS_OID)0,
                      HostCmd_PENDING_ON_NONE,
                      0, 
                      FALSE, 
                      NULL, 
                      NULL, 
                      NULL, 
                      NULL);
#endif  
        }
        /*
              // update RSSI value
              PrepareAndSendCommand(
                  Adapter,
                  HostCmd_CMD_802_11_RSSI,
                  0,
                  HostCmd_OPTION_USE_INT,
                  (NDIS_OID)0,
                  HostCmd_PENDING_ON_NONE,
                  0, 
                  FALSE, 
                  NULL, 
                  NULL, 
                  NULL, 
                  NULL);
            */      
            }
        }

        Adapter->ulTxByteInLastPeriod =
        Adapter->ulRxByteInLastPeriod = 0;
    }

    return FALSE;
    
}

/******************************************************************************
 *
 *  Name: MrvDrvHalt()
 *
 *  Description:  NDIS miniport halt event handler
 *
 *
 *  Arguments:    IN NDIS_HANDLE MiniportAdapterContext
 *          Miniport context
 *    
 *  Return Value:   None
 *
 *  Notes: 
 *
 *****************************************************************************/

VOID
MrvDrvHalt(
  IN NDIS_HANDLE MiniportAdapterContext
  )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -