📄 wlan_pmufsm.c
字号:
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
BOOLEAN timerStatus;
NDIS_STATUS Status;
WlanPmuCmdListNode *cmd = NULL;
WlanPmuCB *pCB = FunctionContext;
DEBUGMSG(1,(L"PMU TRACE:" L"Timeout"));
NdisMCancelTimer(&pCB->stSleepCmdTimer, &timerStatus);
Status = MRVDRV_ALLOC_MEM((PVOID *)(&cmd), sizeof(WlanPmuCmdListNode));
if( Status == NDIS_STATUS_SUCCESS )
{
cmd->cmd_type = WLAN_PMU_CMD_ENTER_SLEEP_TIMEOUT;
cmd->args = 0;
pmu_AppendCmdNode(cmd);
}
else
{
DEBUGMSG(1,(L"PMU ERROR:" L"No enough memory!"));
}
}
/*.......................................................................
* Func Name: wlan_PMUExitSleepCmdTimerFunc
* Description: Enter sleep command resend timeout.
* Input: CB point
* Output: 无
*/
VOID wlan_PMUExitSleepCmdTimerFunc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
BOOLEAN timerStatus;
NDIS_STATUS Status;
WlanPmuCmdListNode *cmd = NULL;
WlanPmuCB *pCB = FunctionContext;
DEBUGMSG(1,(L"PMU TRACE:" L"Timeout"));
NdisMCancelTimer(&pCB->stExitSleepCmdTimer, &timerStatus);
Status = MRVDRV_ALLOC_MEM((PVOID *)(&cmd), sizeof(WlanPmuCmdListNode));
if( Status == NDIS_STATUS_SUCCESS )
{
cmd->cmd_type = WLAN_PMU_CMD_EXIT_SLEEP_TIMEOUT;
cmd->args = 0;
pmu_AppendCmdNode(cmd);
}
else
{
DEBUGMSG(1,(L"PMU ERROR:" L"No enough memory!"));
}
}
/*.......................................................................
* Func Name: wlan_PMUEnterDSCmdTimerFunc
* Description: Exit deep sleep command resend timeout.
* Input: CB point
* Output: 无
*/
void wlan_PMUEnterDSCmdTimerFunc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
BOOLEAN timerStatus;
WlanPmuCmdListNode *cmd = NULL;
WlanPmuCB *pCB = FunctionContext;
NDIS_STATUS Status;
DEBUGMSG(1,(L"PMU TRACE:" L"Timeout, Enter deep sleep."));
NdisMCancelTimer(&pCB->stEnterDSCmdTimer, &timerStatus);
Status = MRVDRV_ALLOC_MEM((PVOID *)(&cmd), sizeof(WlanPmuCmdListNode));
if( Status == NDIS_STATUS_SUCCESS )
{
cmd->cmd_type = WLAN_PMU_CMD_ENTER_DEEP_SLEEP_TIMEOUT;
cmd->args = 0;
pmu_AppendCmdNode(cmd);
}
else
{
DEBUGMSG(1,(L"PMU ERROR:" L"No enough memory!"));
}
}
/*.......................................................................
* Func Name: wlan_PMUExitDSCmdTimerFunc
* Description: Exit deep sleep command resend timeout.
* Input: CB point
* Output: 无
*/
void wlan_PMUExitDSCmdTimerFunc(
IN PVOID SystemSpecific1,
IN PVOID FunctionContext,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
BOOLEAN timerStatus;
WlanPmuCmdListNode *cmd = NULL;
WlanPmuCB *pCB = FunctionContext;
NDIS_STATUS Status;
DEBUGMSG(1,(L"PMU TRACE:" L"Timeout, Exit deep sleep."));
NdisMCancelTimer(&pCB->stExitDSCmdTimer, &timerStatus);
Status = MRVDRV_ALLOC_MEM((PVOID *)(&cmd), sizeof(WlanPmuCmdListNode));
if( Status == NDIS_STATUS_SUCCESS )
{
cmd->cmd_type = WLAN_PMU_CMD_EXIT_DEEP_SLEEP_TIMEOUT;
cmd->args = 0;
pmu_AppendCmdNode(cmd);
}
else
{
DEBUGMSG(1,(L"PMU ERROR:" L"No enough memory!"));
}
}
void wlan_WaitExitFromSleepMode(int timeout)
{
if(g_stWlanPmuCB.iState != WLAN_PMU_FSM_STATUS_SLEEP)
{
return;
}
DEBUGMSG(1,(L"PMU TRACE:" L"Waiting for exit from sleep"));
ResetEvent(g_stWlanPmuCB.wakeup_q);
WaitForSingleObject(g_stWlanPmuCB.wakeup_q, timeout);
DEBUGMSG(1,(L"PMU TRACE:" L"Exit from sleep"));
}
/*.......................................................................
* Func Name: wlan_PMUInit
* Description: WLAN PMU module INIT
* Input: 无
* Output: 无
*/
void wlan_PMUInit(IN PMRVDRV_ADAPTER adapter)
{
WlanPmuCB *pCB = &g_stWlanPmuCB;
DWORD threadID;
if(pCB->iInitCompleted == 1)
return;
DEBUGMSG(1,(L"PMU TRACE:" L"Wlan pmu module init"));
#ifdef CONFIG_EXCE_FREQUENCY
WritePLLDivMult(0, 17);
#endif
/*
* 初始化控制块
*/
pCB->adapter = adapter;
pCB->iState = WLAN_PMU_FSM_STATUS_DISCONNECTED;
pCB->dwSleepRTCTimeout = 40;
pCB->dwDeepSleepRTCTimeout = 240;
pCB->dwDTIMMultiple = 8;
pCB->callbacks = &g_stWlanPmuCallbacks;
pCB->queue = CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->head = pCB->tail = NULL;
pCB->iCurrentCmdCount = 0;
pCB->iDeviceShutDown = 0;
pCB->iLocalNetBusy = 0;
#ifdef DEBUG_PARA_ROAMING
pCB->ppriv = &priv;
#endif
//bit def: bit0:sysInit value; bit1:VoIP; bit2:MSN/IE;
pCB->iWlanAppStatusActive= ((WLAN_PMU_ROAMING_BUSY) |(WLAN_PMU_DHCP_BUSY));
pCB->iIsExitingDeepSleep = 0;
pCB->iIsinSleepMode = 0;
pCB->iNoenterSleepBecauseInroaming = FALSE;
pCB->bSwitchSleepNoSleep = FALSE;
pCB->bFromUserIdleToOnState = FALSE;
pCB->bSetReassociateTimer = FALSE;
pCB->iCPUSleepMode = -1;
pCB->ulBackLightLevel = 0;
pCB->iIsIncomingCallWakeup = 0;
pCB->skb = NULL;
pCB->queue_mutex = CreateMutex(NULL, FALSE, NULL);
pCB->standby_que = CreateMutex(NULL, FALSE, NULL);
pCB->iSleepCmdTimeoutTimes = 0;
pCB->iDeepSleepRTCWakeUpCount = 0;
pCB->iExitDSAssociateTimeoutTimes = 0;
pCB->iExitDSCmdTimeoutTimes = 0;
adapter->HostSleepAwake = 0;
NdisZeroMemory(pCB->stARPBuffer.dst_mac,6);
NdisZeroMemory(pCB->stARPBuffer.src_mac,6);
pCB->stARPBuffer.type = 0x0608;
pCB->stARPBuffer.hw_type = 0x0100;
pCB->stARPBuffer.protocol_type = 0x0008;
pCB->stARPBuffer.hw_size = 6;
pCB->stARPBuffer.protocol_size = 4;
pCB->stARPBuffer.code = 0x0200;
NdisZeroMemory(pCB->stARPBuffer.sender_mac,6);
NdisZeroMemory(pCB->stARPBuffer.sender_ip,4);
NdisZeroMemory(pCB->stARPBuffer.target_mac,6);
NdisZeroMemory(pCB->stARPBuffer.target_ip,4);
NdisZeroMemory(pCB->stARPBuffer.trailer,18);
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
pCB->iARPFieldGot = 0;
pCB->iARPRespCount = 0;
#endif
pCB->iGotIfNetPrep = 0;
pCB->iGotRelatedAPs = 0;
pCB->iGotRelatedAPsOldStatus = 0;
pCB->iCurrentDeepSleepIntervalIndex = 0;
pCB->iDeepSleepRTCWakeUpTotalCount = 1;
pCB->iSDBusAppStatus = 0;
pCB->iRebootTimerCount = 0;
pCB->iDHCPTimerSetted = 0;
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
pCB->iGetIPNetTableTimerSetted = 0;
#endif
pCB->dwSIPSvrIpaddr = 0;
pCB->AddressLength = 6;
memset(pCB->MacAddress,0,MAX_ADAPTER_ADDRESS_LENGTH);
memset(pCB->abySIPMacAddr,0,MAX_ADAPTER_ADDRESS_LENGTH);
memset(pCB->abyGWMacAddr,0,MAX_ADAPTER_ADDRESS_LENGTH);
pCB->iLinkStatus= 1;
pCB->wakeup_q = CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->hWlanSleepStatusEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->hKeybadProcEvent= CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->hAppStatusCheckTimerEvent= CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->hIPAddrChangedEvent= NULL;
pCB->hIPAddrChangedRegisted= CreateEvent(NULL, FALSE, FALSE,NULL);
pCB->hAdapterCheckEvent= CreateEvent(NULL, FALSE, FALSE,NULL);
memset(pCB->MacAddress, 0, MAX_ADAPTER_ADDRESS_LENGTH);
pCB->AddressLength = 0;
pCB->iHostWakeUpTimerSeted = 0;
#ifdef CONFIG_WLAN_PMU_ARP_REQUEST
pCB->iArpReqSendTimerSeted = 0;
#endif
pCB->iTxPktStatTimerSeted = 0;
pCB->iAdapterCheckTimerSetted = 0;
pCB->dwLastHostWakeTime = 0;
pCB->dwIfIndex = 0;
InitializeCriticalSection(&pCB->IntCriticalSection);
pCB->iDeepSleepRestartInterval = WLAN_PMU_DEEP_SLEEP_RESET_DEF_INTERVAL; //ms
#ifndef _WIN32_WCE
NdisZeroMemory(&pCB->stIfNetPrep,sizeof(NetReport));
#endif
NdisMInitializeTimer(
&pCB->stSleepCmdTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUSleepCmdTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stExitSleepCmdTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUExitSleepCmdTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stExitDSCmdTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUExitDSCmdTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stEnterDSCmdTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUEnterDSCmdTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stExitDSAssociateTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUExitDSAssociateTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stHostSleepConfirmTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUHostSleepConfirmTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stTxCmdTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUTxCmdTimeout,
(PVOID) pCB
);
#ifndef _WIN32_WCE
NdisMInitializeTimer(
&pCB->stSleepModeCPURunTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUSleepModeCPURunTimerFunc,
(PVOID) pCB
);
#endif
NdisMInitializeTimer(
&pCB->stAdapterCheckTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUAdapterCheckTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stDHCPTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUDHCPTimerFunc,
(PVOID) pCB
);
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
NdisMInitializeTimer(
&pCB->stGetIPNetTableTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUGetIPNetTableTimerFunc,
(PVOID) pCB
);
#endif
NdisMInitializeTimer(
&pCB->stTxPktStatTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUTxPktStatTimerFunc,
(PVOID) pCB
);
#ifdef CONFIG_WLAN_PMU_ARP_REQUEST
NdisMInitializeTimer(
&pCB->stArpReqSendTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUArpReqSendTimerFunc,
(PVOID) pCB
);
#endif
NdisMInitializeTimer(
&pCB->stHostWakeUpTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUHostWakeUpTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stReassociateTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUReassociateTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stKeybadProcTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUKeybadProcTimerFunc,
(PVOID) pCB
);
NdisMInitializeTimer(
&pCB->stTurnWlanProcTimer,
adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_PMUTurnWlanProcTimerFunc,
(PVOID) pCB
);
pCB->hWlanSleepStatusThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)wlan_PMUSystemEventThread,
pCB,
0,
&threadID);
if (NULL == pCB->hWlanSleepStatusThread)
{
DEBUGMSG(1,(TEXT("Creat PMU Thread fail \n")));
return;
}
pCB->registerKeyboard = FALSE;
pCB->keybadinfo.dwSize = sizeof(PROCESSENTRY32);
wcscpy(pCB->keybadinfo.szExeFile, TEXT("acdd"));
/*
* register VoIP messageObject.
*/
//ED_CreateMessageObject();
if(!ED_RegisterMessageProc(EXDATNAME_VOIP_PMU,wlan_PMUVoIPProc))
{
DEBUGMSG(1,(L"PMU ERROR:" L"Register VoIP message proc funtion failed"));
}
else
{
DEBUGMSG(1,(L"PMU Trace:" L"Register VoIP message proc funtion sucessfully!"));
}
if(!ED_RegisterMessageProc(EXDATNAME_WFI,wlan_PMUKeybdProc))
{
DEBUGMSG(1,(L"PMU ERROR:" L"Register message proc funtion failed"));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -