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

📄 wlan_pmufsm.c

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