📄 wlan_pmufsm.c
字号:
}
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 + -