📄 miscproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module provides the implementation of power managment
* and timer routines
*
* $Author: schiu $
*
* $Date: 2004/12/15 $
*
* $Revision: #12 $
*
*****************************************************************************/
#include "precomp.h"
/******************************************************************************
*
* Name: MrvDrvPMCallback()
*
* Description: Timer that will be fired after initialize routine is done
* to indicate disconnect
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvPMCallback(
IN struct _NDIS_WORK_ITEM *pWorkItem,
IN PVOID Context
)
{
// get the adpater context
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) Context;
//--------------------------------------------------------------------------------
// Reinitialize all config parameters.
//--------------------------------------------------------------------------------
PostFwDownload( Adapter );
//--------------------------------------------------------------------------------
// Update and report link status
//--------------------------------------------------------------------------------
Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;
Adapter->ulNumOfBSSIDs = 0;
Adapter->ulPSNumOfBSSIDs = 0;
//--------------------------------------------------------------------------------
// Report link status change
//--------------------------------------------------------------------------------
// RETAILMSG(1, (TEXT("indicate NDIS_STATUS_MEDIA_DISCONNECT 2\r\n")));
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
#ifdef MRVL_GUI_INTERFACE
MrvlNotifyApplication(
COMMAND_EVENT_DISCONNECT,
NULL,
0);
#endif // MRVL_GUI_INTERFACE
}
#ifdef WHQL_FIX
/******************************************************************************
*
* Name: MrvDrvIndicateConnectStatusTimer()
*
* Description: (1) Timer that will be fired after initialize routine is done to indicate disconnect
* (2) when NDIS call the reset functuion the timer used for indicate connect when reset completely
*
* Arguments:
* IN PVOID SystemSpecific1
* IN PVOID FunctionContext
* IN PVOID SystemSpecific2
* IN PVOID SystemSpecific3
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvIndicateConnectStatusTimer(
IN PVOID SystemSpecific1,
IN NDIS_HANDLE MiniportAdapterContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) MiniportAdapterContext;
if (Adapter->bIsPendingReset == TRUE) // used for rest
{
Adapter->MediaConnectStatus = NdisMediaStateConnected ;
//NdisMIndicateStatus(
// Adapter->MrvDrvAdapterHdl,
// NDIS_STATUS_MEDIA_CONNECT,
// (PVOID)NULL,
// 0);
//NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
Adapter->bIsPendingReset = FALSE;
}
/*
else // used for initialize
{
if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected )
{
// Need to indicate media status because initially, the card is always
// at disconnected state
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
DBGPRINT(DBG_CMDRESP, ("IndicateDisconnectTimer: Indicated disconnect\n"));
#ifdef MRVL_GUI_INTERFACE
MrvlNotifyApplication(
COMMAND_EVENT_DISCONNECT,
NULL,
0);
#endif
}
}
*/
Adapter->DisconnectTimerSet = FALSE;
}
#endif
/******************************************************************************
*
* Name: MrvDrvAvoidScanAfterConnectedTimer()
*
* Description: Timer that will be fired after initialize routine is done
* to indicate connected
*
*
* Arguments:
* IN PVOID SystemSpecific1
* IN PVOID FunctionContext
* IN PVOID SystemSpecific2
* IN PVOID SystemSpecific3
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID
MrvDrvAvoidScanAfterConnectedTimer(
IN PVOID SystemSpecific1,
IN NDIS_HANDLE MiniportAdapterContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) MiniportAdapterContext;
Adapter->bAvoidScanAfterConnectedforMSecs = FALSE;
}
/******************************************************************************
*
* Name: MrvDrvTxPktTimerFunction()
*
* Description: Tx Timer routine
*
* Conditions for Use: (Not used in the current verison of driver)
*
* Arguments:
* IN PVOID SystemSpecific1
* IN PVOID FunctionContext
* IN PVOID SystemSpecific2
* IN PVOID SystemSpecific3
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID MrvDrvTxPktTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
USHORT usLOCAL_INTCause;
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
DBGPRINT(DBG_TIMERS | DBG_WARNING,("- TX Pkt timeout, Tx Done does not response \n"));
///RETAILMSG(1, (TEXT("- TX Pkt timeout, Tx Done does not response \r\n")));
usLOCAL_INTCause = 0;
NdisRawReadPortUshort(
Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
&usLOCAL_INTCause);
///RETAILMSG(1, (TEXT("usLOCAL_INTCause = %x \r\n"),usLOCAL_INTCause));
if (usLOCAL_INTCause & CFMACREG_CCR_HIC_RxUpLdRdy )
{
HandleRxReadyEvent(Adapter);
}
if (( Adapter->SentPacket !=NULL ) ||(usLOCAL_INTCause & CFMACREG_CCR_HIC_TxDnLdRdy ))
{
DBGPRINT(DBG_TXDATA,("Tx Timeout: #%d pkts in Queue\n\r",Adapter->TxPacketCount));
// clean up the timed out pkt
HandleTxSingleDoneEvent(Adapter);
}
Adapter->bIsDoingTx = FALSE;
NdisRawWritePortUshort(
Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
usLOCAL_INTCause);
Adapter->TxPktTimerIsSet = FALSE;
return;
}
VOID MrvDrvReConnectTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
// NDIS_STATUS Status;
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
DBGPRINT(DBG_TIMERS | DBG_ALLEN,("++ MrvDrvReConnectTimerFunction\n"));
ReConnectHandler(Adapter);
//Adapter->ReConnectTimerIsSet = FALSE;
DBGPRINT(DBG_TIMERS | DBG_ALLEN,("-- MrvDrvReConnectTimerFunction\n"));
return;
}
#ifdef ACTIVE_ROAMING
VOID MrvDrvActiveRoamingTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
ActiveRoamingHandler(Adapter);
return;
}
#ifdef BG_SCAN
VOID MrvDrvBGActiveRoamingTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
BOOLEAN timerStatus;
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
//ActiveRoamingHandler(Adapter);
if ( Adapter->MediaConnectStatus == NdisMediaStateConnected )
{
//preset
if ((Adapter->bBgScanEnabled==TRUE) )
{
EnableBgScan(Adapter,FALSE);
}
SetupBgScanCurrentSSID(Adapter,Adapter->ulScanInterval);
EnableBgScan(Adapter,TRUE);
}
NdisMCancelTimer(&Adapter->MrvBGActiveRoamingTimer, &timerStatus);
Adapter->BGActiveRoamingTimerIsSet = FALSE;
return;
}
#endif //BG_SCAN
#endif //ACTIVE_ROAMING
/******************************************************************************
*
* Name: MrvDrvCommandTimerFunction()
*
* Description: Command time-out routine
*
* Conditions for Use: When current command exceeds expected execution time limit,
* commad will expire and call the command time-out ruotine
*
* Arguments:
* IN PVOID SystemSpecific1
* IN PVOID FunctionContext
* IN PVOID SystemSpecific2
* IN PVOID SystemSpecific3
*
* Return Value: None
*
* Notes:
*
*****************************************************************************/
VOID MrvDrvCommandTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
CmdCtrlNode *pTempNode;
PHostCmd_DS_GEN pRetPtr;
USHORT usLOCAL_INTCause;
// get the adpater context
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
if( !Adapter->CurCmd )
{
DBGPRINT(DBG_TIMERS,("MrvDrvCommandTimerFunction() Timer fired, but no current command.\n"));
return;
}
Adapter->ucNumCmdTimeOut++;
DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("MISC - Command TIME OUT !! \n"));
pTempNode = Adapter->CurCmd;
pRetPtr = (PHostCmd_DS_GEN)(pTempNode->BufVirtualAddr);
/// RETAILMSG(1, (TEXT("MrvDrvCommandTimerFunction %02x \r\n "), pRetPtr->Command ));
DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("pRetPtr->Command 0x%x !! \n", pRetPtr->Command));
usLOCAL_INTCause = 0;
NdisRawReadPortUshort(
Adapter->ulMrvDrvVirtualIoBase + CFMACREG_CCR_HOST_INT_CAUSE,
&usLOCAL_INTCause);
/// RETAILMSG(1, (TEXT("CMDTimer: Int cause read: 0x%x \r\n "), usLOCAL_INTCause ));
DBGPRINT(DBG_CMDRESP | DBG_ERROR, ("CMDTimer: Int cause read: 0x%x\n",
usLOCAL_INTCause));
if ( CFMACREG_CCR_HIC_CmdRspRdy & usLOCAL_INTCause )
{
if (Adapter->ucNumCmdTimeOut > 2)
{
DBGPRINT(DBG_CMDRESP, ("Cmd Timer: More than 2 time out! set AdapterRemoved To TRUE!\n"));
//Adapter->SurpriseRemoved = TRUE;
}
}
EnableInterrupt(Adapter);
// if the current command uses NO_INT option and is already finished
if ((pRetPtr->Command & HostCmd_RET_NONE) != 0 )
{
DBGPRINT(DBG_CMDRESP,("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout\n"));
/// RETAILMSG(1, (TEXT("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout \r\n ")));
HandleCommandFinishedEvent(Adapter);
return;
}
if ((pRetPtr->Command == HostCmd_CMD_802_11_SCAN )
// && (Adapter->CurCmd->Pad[2] |= MRVDRV_SCAN_CMD_END)
)
{
NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
Adapter->bIsScanInProgress = FALSE;
Adapter->bIsAssociationBlockedByScan = FALSE;
if (Adapter->PendingGetBssidOid.bIsPendingOID)
{
Adapter->PendingGetBssidOid.bIsPendingOID = FALSE;
*(Adapter->PendingGetBssidOid.BytesReadWrite) = 0;
NdisMQueryInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
}
}
else if ((pRetPtr->Command == HostCmd_CMD_802_11_ASSOCIATE) ||
(pRetPtr->Command == HostCmd_CMD_802_11_ASSOCIATE_EXT) ||
(pRetPtr->Command == HostCmd_CMD_802_11_REASSOCIATE) ||
(pRetPtr->Command == HostCmd_CMD_802_11_AD_HOC_START))
{
/// RETAILMSG(1, (TEXT("HostCmd_CMD_802_11_ASSOCIATE_EXT timeout \r\n ")));
Adapter->bIsAssociateInProgress = FALSE;
Adapter->bIsAssociationBlockedByScan = FALSE;
if (Adapter->PendingSetSssidOid.bIsPendingOID)
{
Adapter->PendingSetSssidOid.bIsPendingOID = FALSE;
*(Adapter->PendingSetSssidOid.BytesReadWrite) = 0;
NdisMSetInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS);
}
}
else
{
if ( pTempNode->PendingInfo == HostCmd_PENDING_ON_GET_OID )
{
NdisMQueryInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_NOT_ACCEPTED );
DBGPRINT(DBG_CMDRESP, ("Call NdisMQueryInformationComplete With FAILURE\n"));
}
else if( pTempNode->PendingInfo == HostCmd_PENDING_ON_SET_OID )
{
NdisMSetInformationComplete(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_SUCCESS );
DBGPRINT(DBG_ALLEN, ("return NDIS_STATUS_SUCCESS\n"));
DBGPRINT(DBG_CMDRESP, ("Call NdisMSetInformationComplete With FAILURE\n"));
}
}
// set the timer state variable to TRUE
Adapter->isCommandTimerExpired = TRUE;
Adapter->bIsDoingCmd = FALSE;
// Clean up
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -