📄 miscproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module provides the implementation of power managment
* and timer routines
*
* $Author: heb $
*
* $Date: 2007/07/13 08:01:36 $
*
* $Revision: 1.15.2.5 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#include "if.h"
#include "omap730_gspx.h"//panyf for turn on /turn off
#include "ParaRoamingProc.h"
#include "logmain.h"
extern DWORD g_AssociationDuration;
extern PRIVATE_PARAROAMING_ADAPTER priv;
extern BOOL g_bWLAN_FW_Downloaded;
extern BOOL bInterruptInitialize; //panyf add for Interrupt Initialize
#ifdef REASSOCIATE
NDIS_STATUS
MrvDrvSetEncryptionStatus(
IN PMRVDRV_ADAPTER Adapter,
IN NDIS_802_11_ENCRYPTION_STATUS EncryptionStatus,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
);
#endif
/*
===============================================================================
DEFINITIONS
===============================================================================
*/
/*
===============================================================================
CODED PUBLIC PROCEDURES
===============================================================================
*/
/******************************************************************************
*
* 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;
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("NdisMediaStateDisconnected is caused by MrvDrvPMCallback!...\n")));
#endif
WriteCommonLogFile(WIFI_LOG,"AP is disconnected(Reason=3) (MrvDrvPMCallback)!...\r\n",
strlen("AP is disconnected(Reason=3) (MrvDrvPMCallback)!...\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;
}
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;
Adapter->ulNumOfBSSIDs = 0;
Adapter->ulPSNumOfBSSIDs = 0;
//--------------------------------------------------------------------------------
// Report link status change
//--------------------------------------------------------------------------------
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: Timer that will be fired after initialize routine is done
* to indicate disconnect
*
*
* 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 ;
{
char logstr[200];
sprintf(logstr,"AP is connected! SSID = %32s BSSID = %2x-%2x-%2x-%2x-%2x-%2x RSSI =%d\r\n",
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].Ssid.Ssid,
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[0],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[1],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[2],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[3],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[4],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].MacAddress[5],
Adapter->PSBSSIDList[Adapter->ulCurrentBSSIDIndex].Rssi);
WriteCommonLogFile(WIFI_LOG,logstr, strlen(logstr));
g_AssociationDuration = GetTickCount();
}
// tt cetk_1
/*
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);
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("IndicateDisconnectTimer: Indicated disconnect!!!\n")));
#endif
DBGPRINT(DBG_CMDRESP, ("IndicateDisconnectTimer: Indicated disconnect\n"));
#ifdef MRVL_GUI_INTERFACE
MrvlNotifyApplication(
COMMAND_EVENT_DISCONNECT,
NULL,
0);
#endif
}
}
Adapter->DisconnectTimerSet = FALSE;
}
#endif
/******************************************************************************
*
* 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
)
{
#ifdef IF_SPI
USHORT ucHostIntStatus=0;
SD_API_STATUS status;
USHORT ucCardStatus;
#endif ///IF_SPI
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
DBGPRINT(DBG_TIMERS | DBG_WARNING,("- TX Pkt timeout, Tx Done does not response \n"));
Adapter->TxPktTimerIsSet=FALSE;
/*
dralee suggested: don't need this block
*/
#if 0
if ( Adapter->PSMode != Ndis802_11PowerModeCAM )
{
// in power save mode, it's safer to just fail the packet
if (Adapter->SentPacket)
{
Adapter->XmitError++;
DBGPRINT(DBG_TIMERS, ("MrvDrvTxPktTimerFunction: Indicate failure for SentPacket\n"));
NDIS_SET_PACKET_STATUS(Adapter->SentPacket, NDIS_STATUS_RESOURCES);
NdisMSendComplete(
Adapter->MrvDrvAdapterHdl,
Adapter->SentPacket,
NDIS_STATUS_RESOURCES);
Adapter->SentPacket = NULL;
/*Adapter->QueuedPacket = Adapter->SentPacket;
Adapter->SentPacket = NULL;*/
}
return;
}
#endif //0
#ifdef UNDER_CE
//MessageBox(NULL, TEXT("Pkt Timeout"), TEXT("MrvDrvND5"), MB_OK);
#endif // UNDER_CE
#ifdef SDIO
if( Adapter->SentPacket !=NULL )
{
RETAILMSG(1,(L"SDIO Tx Timeout: #%d pkts in Queue\n\r",Adapter->TxPacketCount));
// clean up the timed out pkt
HandleTxSingleDoneEvent(Adapter);
}
#elif defined (IF_SPI)
///crlo:test ++
/*{
int intrval = gspi_read_intstatue();
RETAILMSG(1,(TEXT("IntrSignal: %d\r"), intrval));
}*/
///crlo:test --
//if( Adapter->SentPacket !=NULL )
{
RETAILMSG(1,(L"--SDIO Tx Timeout: #%d pkts in Queue\n\r",Adapter->TxPacketCount));
EnterCriticalSection(&Adapter->IntCriticalSection);
status = If_ReadRegister(Adapter,
//SD_IO_READ ,
1, // function 1
HCR_HOST_INT_STATUS_REGISTER,
FALSE,
&ucHostIntStatus,
sizeof(ucHostIntStatus));
if(ucHostIntStatus)
{
//EnterCriticalSection(&Adapter->IntCriticalSection);
Adapter->ucGHostIntStatus |= ucHostIntStatus;
//LeaveCriticalSection(&Adapter->IntCriticalSection);
//dralee_1226
ucCardStatus = ~ucHostIntStatus;
ucCardStatus &= 0x1f;
status = If_WriteRegister(Adapter,
//SD_IO_WRITE,
1,
HCR_HOST_INT_STATUS_REGISTER,
FALSE,
&ucCardStatus, // reg
sizeof(ucCardStatus));
LeaveCriticalSection(&Adapter->IntCriticalSection);
RETAILMSG(1,(L"HOST INT status:%x:%x\n",ucHostIntStatus, status));
SetEvent(Adapter->hControllerInterruptEvent);
}
else
{
LeaveCriticalSection(&Adapter->IntCriticalSection);
// clean up the timed out pkt
HandleTxSingleDoneEvent(Adapter);
}
}
#endif ///IF_SPI
//return;
}
VOID MrvDrvRssiHighTimerFunction(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
Adapter->RssiHighTimerIsSet = FALSE;
if(Adapter->MediaConnectStatus == NdisMediaStateConnected)
ED_PostMessage(EXDATNAME_PRM, PRM_WLAN_SIGNAL_CHANGE_HIGH, 0, 0);
}
#ifdef REASSOCIATE
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|DBG_DEBUGUSE,("++ MrvDrvReConnectTimerFunction\n"));
ReConnectHandler(Adapter);
DBGPRINT(DBG_TIMERS | DBG_ALLEN,("-- MrvDrvReConnectTimerFunction\n"));
return;
}
#endif //REASSOCIATE
/* dralee, unused
VOID MrvDrvCheckTxQueueTimerFunction(
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_TXDATA,("++ MrvDrvCheckTxQueueTimerFunction\n"));
//RETAILMSG(1,(TEXT("[Marvell]+MrvDrvCheckTxQueueTimerFunction")));
#ifndef CHECK_LATER
if ((Adapter->QueuedPacket) &&
(Adapter->MediaConnectStatus == NdisMediaStateConnected))
{
DBGPRINT(DBG_TIMERS | DBG_TXDATA,("Have a queued packed packet need to send\n"));
Status = SendSinglePacket(Adapter,Adapter->QueuedPacket);
if (Status == NDIS_STATUS_SUCCESS)
{
Adapter->SentPacket = Adapter->QueuedPacket;
Adapter->QueuedPacket = NULL;
}
}
#endif
GetCmdFromQueueToExecute(Adapter);
//RETAILMSG(1,(TEXT("[Marvell]-MrvDrvCheckTxQueueTimerFunction")));
DBGPRINT(DBG_TIMERS | DBG_TXDATA,("-- MrvDrvCheckTxQueueTimerFunction\n"));
return;
}
*/
/******************************************************************************
*
* 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;
// get the adpater context
PMRVDRV_ADAPTER Adapter = (PMRVDRV_ADAPTER) FunctionContext;
if( !Adapter->CurCmd ) // False alarm
{
DBGPRINT(DBG_TIMERS,("MrvDrvCommandTimerFunction() Timer fired, but no current command.\n"));
//lykao, 051305, begin
#ifdef SDIO
// Check CmdWaitQ and execute the next command
GetCmdFromQueueToExecute(Adapter);
#endif // SDIO
//lykao, 051305, end
return;
}
Adapter->ucNumCmdTimeOut++;
DBGPRINT(DBG_TIMERS | DBG_CMDRESP | DBG_ERROR,("MISC - Command TIME OUT !! \n"));
pTempNode = Adapter->CurCmd;
pRetPtr = (PHostCmd_DS_GEN)(pTempNode->BufVirtualAddr);
//lykao, 051305, begin
#ifdef SDIO
if (Adapter->ucNumCmdTimeOut > 2)
{
DBGPRINT(DBG_CMDRESP, ("Cmd Timer: More than 2 time out! set AdapterRemoved To TRUE!\n"));
Adapter->SurpriseRemoved = TRUE;
}
#endif
DraleeMsg((L"Command Timeout\n"));
// if the current command uses NO_INT option and is already finished
if ((pRetPtr->Command & HostCmd_RET_NONE) != 0 &&
pTempNode->INTOption == HostCmd_OPTION_NO_INT )
{
DBGPRINT(DBG_CMDRESP,("NO INT COMMAND: calling HandleCommand FinishedEvent from timeout\n"));
HandleCommandFinishedEvent(Adapter);
return;
}
if ((pRetPtr->Command == HostCmd_RET_802_11_SCAN ) &&
(Adapter->CurCmd->Pad[2] |= MRVDRV_SCAN_CMD_END))
{
/* dralee_0112, dummy //dralee
if( Adapter->ResourcesEvts & RSC_SCANNING )
{
Adapter->ResourcesEvts &= ~RSC_SCANNING;
if( Adapter->ResourcesEvts == 0 )
NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
}
*/
Adapter->bIsScanInProgress = FALSE;
Adapter->bIsAssociationBlockedByScan = FALSE;
if (Adapter->PendingGetBssidOid.bIsPendingOID)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -