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

📄 wlan_pmufsm.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
    }
    Sleep(500);
    len = MAX_ADAPTER_ADDRESS_LENGTH;
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
    if((pCB->iARPFieldGot & WLAN_PMU_SIP_SVR_MAC_GETED) == 0)
#endif        
    {
        if(pCB->dwSIPSvrIpaddr != 0)
        {
            if((pCB->dwSIPSvrIpaddr&ipMask) == (Gateway&ipMask))
            {
                if(SendARP(ntohl(pCB->dwSIPSvrIpaddr), 0, pCB->abySIPMacAddr,&len) != NO_ERROR)
                {
                    DEBUGMSG(1,(L"PMU ERROR:" L"Request local SIP server ARP failed."));
                }
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
                else
                {
                    if(len == 6)
                    {
                        pCB->iARPFieldGot |= WLAN_PMU_SIP_SVR_MAC_GETED;
                    }
                }
#endif                
            }
        }   
    }
    Sleep(1000);
//    pCB->iWlanAppStatusActive &= ~(WLAN_PMU_ARP_REQ_BUSY);
//    wlan_PMUWlanAppsSleep ();
    return 0;
}


/*.......................................................................
 * Func Name:      wlan_PMUKeybdProc
 * Description:    User click the keyboard event.
 * Input:          CB point
 * Output:         无
 */
#define PLL_DIV_MASK            0x0060
#define PLL_DIV_OFFSET          5
#define PLL_MULT_MASK           0x0F80
#define PLL_MULT_OFFSET         7
#define PLL_DIV_1               0
#define PLL_MULT_1              1
void WritePLLDivMult(UINT8 Div, UINT8 Mult)
{
    UINT16 Dppl1CtlReg = 0;
    PHYSICAL_ADDRESS PortAddress = {0xFFFECF00};
    OMAP730_CLKM_REGS *pClkmDPLL1Regs;

    pClkmDPLL1Regs = (OMAP730_CLKM_REGS*)MmMapIoSpace(PortAddress, sizeof(int), FALSE );


    Div &= (PLL_DIV_MASK>>PLL_DIV_OFFSET);
    Mult &= (PLL_MULT_MASK>>PLL_MULT_OFFSET);
    
    Dppl1CtlReg = INREG16(pClkmDPLL1Regs);
    
    Dppl1CtlReg &= (~PLL_DIV_MASK);
    Dppl1CtlReg |= (Div<<PLL_DIV_OFFSET);
    
    Dppl1CtlReg &= (~PLL_MULT_MASK);
    Dppl1CtlReg |= (Mult<<PLL_MULT_OFFSET);
    
    OUTREG16(pClkmDPLL1Regs, Dppl1CtlReg);
    RETAILMSG(1,(L"PMU TRACE write PLL : Div = %d; Mult = %d\r\n", Div, Mult));
    
}
void ReadPLLDivMult(UINT8 *Div, UINT8 *Mult)
{
    UINT16 Dppl1CtlReg = 0;
    PHYSICAL_ADDRESS PortAddress = {0xFFFECF00};
    OMAP730_CLKM_REGS *pClkmDPLL1Regs;
	

    pClkmDPLL1Regs = (OMAP730_CLKM_REGS*)MmMapIoSpace(PortAddress, sizeof(int), FALSE );

   
    Dppl1CtlReg = INREG16(pClkmDPLL1Regs);

    *Div = ((Dppl1CtlReg&PLL_DIV_MASK)>>PLL_DIV_OFFSET);
    *Mult = ((Dppl1CtlReg&PLL_MULT_MASK)>>PLL_MULT_OFFSET);
        
    RETAILMSG(1,(L"PMU TRACE: Div = %d; Mult = %d\r\n", *Div, *Mult));
}
DWORD wlan_PMUKeybdProc(DWORD msg, DWORD wParam, DWORD lParam)
{
    WlanPmuCB *pCB = &g_stWlanPmuCB;
    UINT8 div =0;
    UINT8 mult =0;
	
#ifdef WLAN_PMU_DEBUG
    DEBUGMSG(1,(L"PMU TRACE:" L"Keypad event."));
#endif
    if(pCB->iState == WLAN_PMU_FSM_STATUS_POWER_OFF)
        return 1;
//    ReadPLLDivMult(&div, &mult);
    SetEvent(pCB->hKeybadProcEvent);
    return 1;
}

DWORD wlan_PMUVoIPProc(DWORD msg, DWORD wParam, DWORD lParam)
{
    WlanPmuCB *pCB = &g_stWlanPmuCB;
    BOOLEAN  timerStatus;
    BOOL bCPUIdleFlag = 0;
#ifdef WLAN_PMU_DEBUG
    DEBUGMSG(1,(L"PMU TRACE:" L"Received VoIP message."));
#endif
    switch(msg)
    {
        case VOIP_PMU_START_CALLING:
            {
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->iWlanAppStatusActive |= WLAN_PMU_VOIP_BUSY;
                LeaveCriticalSection(&pCB->IntCriticalSection);
                bCPUIdleFlag = 1;
                //KernelIoControl(IOCTL_HAL_SET_CPU_IDLE_FLAG, (LPVOID)&bCPUIdleFlag, sizeof(BOOL), NULL, 0, NULL);

                SetEvent(pCB->hWlanSleepStatusEvent);
            }
            break;

        case VOIP_PMU_STOP_CALLING: 
            {
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->iWlanAppStatusActive &= ~WLAN_PMU_VOIP_BUSY;
                LeaveCriticalSection(&pCB->IntCriticalSection);
                bCPUIdleFlag = 0;
                //KernelIoControl(IOCTL_HAL_SET_CPU_IDLE_FLAG, (LPVOID)&bCPUIdleFlag, sizeof(BOOL), NULL, 0, NULL);
                SetEvent(pCB->hWlanSleepStatusEvent);
            }
            break;
        case VOIP_PMU_IP_ADDR_CHANGED:
            {
            }
            break;
        case VOIP_PMU_SIP_PROXY_ADDR_CHANGED:
            {
                unsigned long ipAddr;
                unsigned long ipMask;
                unsigned long Gateway;
                int iSIPSvrInLAN = 0;

                DWORD dwOldSipSvrAddr = pCB->dwSIPSvrIpaddr;
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->dwSIPSvrIpaddr = wParam;
                LeaveCriticalSection(&pCB->IntCriticalSection);
//                if(!(pCB->iWlanAppStatusActive & WLAN_PMU_VOIP_BUSY))
                {
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
                    if(pCB->adapter->MediaConnectStatus == NdisMediaStateConnected && pCB->iGotIfNetPrep == 1 )
                    {
                        if(pCB->dwSIPSvrIpaddr != dwOldSipSvrAddr)
                        {
                            pmu_GetIpFromStr(pCB->IPAddr.IpAddress.String, &ipAddr);
                            pmu_GetIpFromStr(pCB->IPAddr.IpMask.String, &ipMask);
                            pmu_GetIpFromStr(pCB->Gateway.IpAddress.String, &Gateway);
                            EnterCriticalSection(&pCB->IntCriticalSection);
                            pCB->iARPFieldGot &= ~(WLAN_PMU_SIP_SVR_MAC_GETED);
                            LeaveCriticalSection(&pCB->IntCriticalSection);
                            if((pCB->dwSIPSvrIpaddr&ipMask) == (Gateway&ipMask))
                            {
                                if(pCB->iGetIPNetTableTimerSetted == 0)
                                {
                                    NdisMCancelTimer(&pCB->stGetIPNetTableTimer, &timerStatus);
                                    NdisMSetTimer(&pCB->stGetIPNetTableTimer, WLAN_PMU_GET_IP_TABLE_TIMEOUT);
                                    pCB->iGetIPNetTableTimerSetted = 1;
                                }
                            }
                        }
                    }
                }
#endif                
            }
            break;
	case VOIP_PMU_VPN_START:
	{
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->iWlanAppStatusActive |= WLAN_PMU_VPN_BUSY;
                LeaveCriticalSection(&pCB->IntCriticalSection);

                SetEvent(pCB->hWlanSleepStatusEvent);
    DEBUGMSG(1,(L"PMU TRACE:" L"S[VPN start]: ******* !")); 

	}
	break;
	case VOIP_PMU_VPN_STOP:
	{
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->iWlanAppStatusActive &= ~WLAN_PMU_VPN_BUSY;
                LeaveCriticalSection(&pCB->IntCriticalSection);
                SetEvent(pCB->hWlanSleepStatusEvent);
    DEBUGMSG(1,(L"PMU TRACE:" L"S[VPN stop]: !***********")); 
	}

		break;
		
		case PRM_PMU_REBINDED_START:
			{
                if(pCB->iDHCPTimerSetted == 0)
                {
                    NdisMCancelTimer(&pCB->stDHCPTimer, &timerStatus);
                    NdisMSetTimer(&pCB->stDHCPTimer, WLAN_PMU_DHCP_BUSY_TIMEOUT);
                    EnterCriticalSection(&pCB->IntCriticalSection);
                    pCB->iDHCPTimerSetted = 1;
                    LeaveCriticalSection(&pCB->IntCriticalSection);
                }
                EnterCriticalSection(&pCB->IntCriticalSection);
                pCB->iGotIfNetPrep = 0;
                pCB->iWlanAppStatusActive |= WLAN_PMU_DHCP_BUSY;
                LeaveCriticalSection(&pCB->IntCriticalSection);
			#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
                pCB->iARPFieldGot = 0;
                pCB->iGetIPNetTableTimerSetted = 0;
                NdisMCancelTimer(&pCB->stGetIPNetTableTimer, &timerStatus);
			#endif
                wlan_PMUWlanAppsWakeup();
    			DEBUGMSG(1,(L"PMU TRACE:PRM_PMU_REBINDED_START***********")); 
			}

			break;		
		            
       default:
            break;
    }
    return 1;
}

VOID wlan_PMUKeybadProcTimerFunc(
    IN PVOID SystemSpecific1,
    IN PVOID FunctionContext,
    IN PVOID SystemSpecific2,
    IN PVOID SystemSpecific3
    )
{
    WlanPmuCB *pCB = FunctionContext;

    DEBUGMSG(1,(L"PMU TRACE:" L"S[%d]: User key Delay event !", pCB->iState)); 

    EnterCriticalSection(&pCB->IntCriticalSection);
    if(pCB->iNoenterSleepBecauseInroaming)
    {
        pCB->iNoenterSleepBecauseInroaming = FALSE;
    }
    LeaveCriticalSection(&pCB->IntCriticalSection);

    SetEvent(pCB->hAppStatusCheckTimerEvent);  

    return;
}

VOID wlan_PMUTurnWlanProcTimerFunc(
    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, Turn off wlan card."));
    
    NdisMCancelTimer(&pCB->stTurnWlanProcTimer, &timerStatus);  
    Status = MRVDRV_ALLOC_MEM((PVOID *)(&cmd), sizeof(WlanPmuCmdListNode));
    if( Status == NDIS_STATUS_SUCCESS )
    {
        cmd->cmd_type = WLAN_PMU_CMD_TURN_OFF_CARD_TIMEOUT;
        cmd->args = 0;
        pmu_AppendCmdNode(cmd);
    }
    else
    {
        DEBUGMSG(1,(L"PMU ERROR:" L"No enough memory!"));
    }   

	 
    return;
}
/*.......................................................................
 * Func Name:      wlan_PMUExitDSAssociateTimerFunc
 * Description:    Enter sleep command resend timeout.
 * Input:          CB point
 * Output:         无
 */
VOID wlan_PMUExitDSAssociateTimerFunc(
    IN PVOID SystemSpecific1,
    IN PVOID FunctionContext,
    IN PVOID SystemSpecific2,
    IN PVOID SystemSpecific3
    )
{
    WlanPmuCB *pCB = FunctionContext;
    BOOLEAN  timerStatus;
    
    DEBUGMSG(1,(L"PMU TRACE:" L"Timeout"));
    
    EnterCriticalSection(&pCB->IntCriticalSection);
    pCB->iExitDSAssociateTimeoutTimes = 0;
    NdisMCancelTimer(&pCB->stExitDSAssociateTimer, &timerStatus);  
    LeaveCriticalSection(&pCB->IntCriticalSection);
    
    pmu_FsmDSScanAndAssociate(pCB);

    return;
}

/*.......................................................................
 * Func Name:      wlan_PMUGetIPNetTableTimerFunc
 * Description:    Get ARP table timeout.
 * Input:          CB point
 * Output:         无
 */
#ifdef CONFIG_WLAN_PMU_ARP_RESPONSE
VOID wlan_PMUGetIPNetTableTimerFunc(
    IN PVOID SystemSpecific1,
    IN PVOID FunctionContext,
    IN PVOID SystemSpecific2,
    IN PVOID SystemSpecific3
    )
{
    WlanPmuCB *pCB = FunctionContext;
    int ret = 0;
    BOOLEAN  timerStatus;
    unsigned long ipAddr;
    unsigned long ipMask;
    unsigned long Gateway;
    BYTE abyGWMacAddr[MAXLEN_PHYSADDR];    
    BYTE abySIPSvrMacAddr[MAXLEN_PHYSADDR];    
    int iSIPSvrInLAN = 0;
    
    if(pCB->adapter->MediaConnectStatus == NdisMediaStateDisconnected)
    {
        return;
    }
    
    if(pCB->iGotIfNetPrep == 1)
    {
        pmu_GetIpFromStr(pCB->IPAddr.IpAddress.String, &ipAddr);
        pmu_GetIpFromStr(pCB->IPAddr.IpMask.String, &ipMask);
        pmu_GetIpFromStr(pCB->Gateway.IpAddress.String, &Gateway);
    }
    else
    {
        NdisMCancelTimer(&pCB->stGetIPNetTableTimer, &timerStatus);
        NdisMSetTimer(&pCB->stGetIPNetTableTimer, WLAN_PMU_GET_IP_TABLE_TIMEOUT);
        return;
    }
    
    memset(abyGWMacAddr, 0, MAXLEN_PHYSADDR);
    /*
     * Get Gateway MAC address.
     */
    if((pCB->iARPFieldGot & WLAN_PMU_GW_MAC_GETED) == 0)
    {
        ret = pmu_GetMacAddrWithIpAddr(Gateway, abyGWMacAddr, MAXLEN_PHYSADDR);
        if(ret != 0)
        {
            pCB->iARPFieldGot &= ~(WLAN_PMU_GW_MAC_GETED);
        }
        else
        {
            memcpy(pCB->abyGWMacAddr, abyGWMacAddr,MAX_ADAPTER_ADDRESS_LENGTH);
            pCB->iARPFieldGot |= WLAN_PMU_GW_MAC_GETED;
        }
    }
    /*
     * Get SIP server MAC address.
     */
    if((pCB->iARPFieldGot & WLAN_PMU_SIP_SVR_MAC_GETED) == 0)
    {
        if(pCB->dwSIPSvrIpaddr != 0)
        {
            if((pCB->dwSIPSvrIpaddr&ipMask) == (Gateway&ipMask))
            {
                ret = pmu_GetMacAddrWithIpAddr(pCB->dwSIPSvrIpaddr, abySIPSvrMacAddr, MAXLEN_PHYSADDR);
                if(ret == 0)
                {
                    memcpy(pCB->abySIPMacAddr, abySIPSvrMacAddr,MAX_ADAPTER_ADDRESS_LENGTH);

                    pCB->iARPFieldGot |= WLAN_PMU_SIP_SVR_MAC_GETED;
                }
                iSIPSvrInLAN = 1;
            }
            else
            {
                iSIPSvrInLAN = 0;
            }
        }
    }
    pmu_ReqARP(pCB);
    if(pCB->iARPFieldGot == (WLAN_PMU_SIP_SVR_MAC_GETED|WLAN_PMU_GW_MAC_GETED) ||
        ((pCB->iARPFieldGot & WLAN_PMU_SIP_SVR_MAC_GETED) == 0 && iSIPSvrInLAN == 0))

⌨️ 快捷键说明

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