📄 initproc.c
字号:
{
NdisUnicodeStringToAnsiString(
&DestinationANSIString,
(PUNICODE_STRING)(&(ReturnedValue->ParameterData.StringData))
);
for(j=0;DestinationANSIString.Buffer[j] != '\0';j++)
{
*(pTmp)=DestinationANSIString.Buffer[j];
pTmp++;
}
*((PULONG)(pPtr-4))=j;
}
}
else if (RegInfoTab->Type == 3) {
NdisReadConfiguration(
&Status,
&ReturnedValue,
RegHdl,
&RegInfoTab->ObjNSName,
NdisParameterHexInteger);
if (Status == NDIS_STATUS_SUCCESS) {
Value = ReturnedValue->ParameterData.IntegerData;
*((PINT)pPtr) = Value;
}
}
}
Adapter->WepKey1.KeyIndex=0x0;
Adapter->WepKey2.KeyIndex=0x1;
Adapter->WepKey3.KeyIndex=0x2;
Adapter->WepKey4.KeyIndex=0x3;
switch(Adapter->TxWepKey){
case 0:
Adapter->WepKey1.KeyIndex |= 0x80000000;
NdisMoveMemory(&(Adapter->CurrentWEPKey),&(Adapter->WepKey1) , 12 + Adapter->WepKey1.KeyLength);
break;
case 1:
Adapter->WepKey2.KeyIndex |= 0x80000000;
NdisMoveMemory(&(Adapter->CurrentWEPKey),&(Adapter->WepKey2) , 12 + Adapter->WepKey2.KeyLength);
break;
case 2:
Adapter->WepKey3.KeyIndex |= 0x80000000;
NdisMoveMemory(&(Adapter->CurrentWEPKey),&(Adapter->WepKey3) , 12 + Adapter->WepKey3.KeyLength);
break;
case 3:
Adapter->WepKey4.KeyIndex |= 0x80000000;
NdisMoveMemory(&(Adapter->CurrentWEPKey),&(Adapter->WepKey4) , 12 + Adapter->WepKey4.KeyLength);
break;
default:
break;
}
return NDIS_STATUS_SUCCESS;
}
/******************************************************************************
*
* Name: InitSyncObjects()
*
* Description: Syncronization object initialization function
*
* Arguments:
* PMRVDRV_ADAPTER Adapter
*
* Return Value:
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_FAILURE
*
* Notes:
*
*****************************************************************************/
NDIS_STATUS
InitSyncObjects(
IN PMRVDRV_ADAPTER Adapter
)
{
DWORD threadID;
DWORD waitStatus;
MSGQUEUEOPTIONS msgOptions = {0};
HANDLE hNotifications = NULL;
#define QUEUE_ENTRIES 3
#define MAX_NAMELEN 200
#define QUEUE_SIZE (QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + MAX_NAMELEN))
// Allocate spinlock
//NdisAllocateSpinLock(&Adapter->TxSpinLock);
InitializeCriticalSection(&Adapter->TxCriticalSection);
InitializeCriticalSection(&Adapter->IntCriticalSection);
Adapter->hControllerInterruptEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
Adapter->hPMUEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
Adapter->TxResourceControlEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
msgOptions.dwFlags = 0;
msgOptions.dwMaxMessages = QUEUE_ENTRIES;
msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
msgOptions.bReadAccess = TRUE;
Adapter->hPowerNotify= CreateMsgQueue(NULL, &msgOptions);
if (!Adapter->hPowerNotify) {
DWORD dwErr = GetLastError();
RETAILMSG(1, (TEXT("PMU ERR: CreateMessageQueue ERROR:%d\n"), dwErr));
}
hNotifications = RequestPowerNotifications(Adapter->hPowerNotify, PBT_TRANSITION); // Flags
if (!hNotifications) {
DWORD dwErr = GetLastError();
RETAILMSG(TRUE, (TEXT("PMU ERR:RequestPowerNotifications ERROR:%d\n"), dwErr));
}
//tt ++ v5 firmware
Adapter->hOidQueryEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
//tt
//Adapter->hControllerInterruptEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
if (NULL == Adapter->hControllerInterruptEvent)
{
//RETAILMSG(1,(TEXT("Null Interrupt EVENT \n")));
return NDIS_STATUS_FAILURE;
}
// Adapter->hTxEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
//if (NULL == Adapter->hTxEvent)
//{
// RETAILMSG(1,(TEXT("Null Tx EVENT \n")));
// return NDIS_STATUS_FAILURE;
//}
Adapter->hThreadReadyEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
if (NULL == Adapter->hThreadReadyEvent)
{
//RETAILMSG(1,(TEXT("Null ThreadReadyEvent \n")));
return NDIS_STATUS_FAILURE;
}
Adapter->hControllerInterruptThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)MrvSdioIstThread,
Adapter,
0,
&threadID);
if (NULL == Adapter->hControllerInterruptThread)
{
//RETAILMSG(1,(TEXT("Null Interrupt Thread \n")));
return NDIS_STATUS_FAILURE;
}
waitStatus = WaitForSingleObject(Adapter->hThreadReadyEvent, INFINITE);
if (WAIT_OBJECT_0 != waitStatus)
{
//RETAILMSG(1,(TEXT("call WaitFor SingleObject Fail : \n")));
return NDIS_STATUS_FAILURE;
}
/*
Adapter->hTxThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)MrvTransmitThread,
Adapter,
0,
&threadID);
if (NULL == Adapter->hTxThread)
{
RETAILMSG(1,(TEXT("Null Transmit Thread \n")));
return NDIS_STATUS_FAILURE;
}
waitStatus = WaitForSingleObject(Adapter->hThreadReadyEvent, INFINITE);
if (WAIT_OBJECT_0 != waitStatus)
{
RETAILMSG(1,(TEXT("call WaitFor SingleObject Fail : \n")));
return NDIS_STATUS_FAILURE;
}
*/
//tt ++ ra fail
// NdisMInitializeTimer(
// &Adapter->MrvDrvSendCompleteTimer,
// Adapter->MrvDrvAdapterHdl,
// (PNDIS_TIMER_FUNCTION) BatchIndicateRetQPkts,
// (PVOID) Adapter
// );
//tt --
// Initialize Timer
#ifdef AUTO_REASSOCIATION
Adapter->bIsSendCmdImterSet = FALSE;
NdisMInitializeTimer(
&Adapter->MrvDrvSendCmdTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvSendCmdTimerHandler,
(PVOID) Adapter
);
#endif
#ifdef SDIO
// Whenever we get an interrupt from SDIO device, we start
// a timer to eventually form a DPC to handle interrupts. This
// timer based DPC here is MrvDrvSdioIntTimerHandler().
#if 0 //dralee
NdisMInitializeTimer(
&Adapter->MrvDrvSdioIntTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION)MrvDrvSdioIntTimerHandler,
(PVOID)Adapter
);
#endif
//Adapter->MrvDrvSdioIntTimerIsSet = FALSE;
NdisMInitializeTimer(
&Adapter->MrvDrvSdioCheckFWReadyTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION)MrvDrvSdioCheckFWReadyTimerFunction,
(PVOID)Adapter
);
Adapter->MrvDrvSdioCheckFWReadyTimerIsSet = FALSE;
#ifdef RETQ_TIMER
NdisMInitializeTimer(
&Adapter->MrvRetQTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION)MrvRetQTimerFunction,
(PVOID)Adapter
);
Adapter->RetQTimerIsSet = 0;
#endif
#endif // SDIO
///crlo:modify-RETQ_TIMER ++
#ifndef SDIO
#ifdef RETQ_TIMER
NdisMInitializeTimer(
&Adapter->MrvRetQTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION)MrvRetQTimerFunction,
(PVOID)Adapter
);
Adapter->RetQTimerIsSet = 0;
#endif
#endif ///ndef SDIO
///crlo:modify-RETQ_TIMER --
NdisInitializeWorkItem(
&Adapter->MrvDrvPMWorkItem,
(NDIS_PROC)MrvDrvPMCallback,
(PVOID)Adapter
);
NdisMInitializeTimer(
&Adapter->MrvDrvIndicateConnectStatusTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION)MrvDrvIndicateConnectStatusTimer,
(PVOID)Adapter
);
Adapter->DisconnectTimerSet = FALSE;
#ifdef CONFIG_WLAN_DHCP_PROXY
// Initialize the timer for command
NdisMInitializeTimer(
&Adapter->DHCPProxyRxPktTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) wlan_DHCPProxyRxPktTimerFunc,
(PVOID)Adapter
);
Adapter->DHCPProxyRxPktTimerSet = FALSE;
#endif
// Initialize the timer for command
NdisMInitializeTimer(
&Adapter->MrvDrvCommandTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvCommandTimerFunction,
(PVOID)Adapter
);
Adapter->CommandTimerSet = FALSE;
// Initialize the timer for Tx
NdisMInitializeTimer(
&Adapter->MrvDrvTxPktTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvTxPktTimerFunction,
(PVOID)Adapter
);
Adapter->TxPktTimerIsSet = FALSE;
NdisMInitializeTimer(
&Adapter->MrvDrvRssiHighTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvRssiHighTimerFunction,
(PVOID)Adapter
);
Adapter->RssiHighTimerIsSet = FALSE;
#ifdef TX_PRY_Q
InitializeTxNodeQ(Adapter);
#endif
// Initialize the timer for TX Check queued packed and send
//lykao, 061605
/*
NdisMInitializeTimer(
&Adapter->MrvDrvCheckTxQueueTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvCheckTxQueueTimerFunction,
(PVOID)Adapter
);
Adapter->CheckTxQueueTimerIsSet = FALSE;
//lykao, 061505
NdisMSetPeriodicTimer(
&Adapter->MrvDrvCheckTxQueueTimer,
5
);
*/
//NdisMSetPeriodicTimer(
// &Adapter->MrvDrvCheckTxQueueTimer,
// 1
// );
//Adapter->CheckTxQueueTimerIsSet = TRUE;
#ifdef REASSOCIATE
// Initialize the timer for Reconnect
NdisMInitializeTimer(
&Adapter->MrvReConnectTimer,
Adapter->MrvDrvAdapterHdl,
(PNDIS_TIMER_FUNCTION) MrvDrvReConnectTimerFunction,
(PVOID)Adapter
);
Adapter->ReConnectTimerIsSet = FALSE;
DBGPRINT(DBG_LOAD, (" MrvReConnectTimer success \n"));
#endif //REASSOCIATE
if ( (Adapter->DefaultPerChannelScanTime < 20) || (Adapter->DefaultPerChannelScanTime > 1000) )
{
DBGPRINT(DBG_WARNING, ("Default channel time out of range: %d, set to default(%d)!\n",
Adapter->DefaultPerChannelScanTime, HostCmd_SCAN_MAX_CH_TIME));
Adapter->DefaultPerChannelScanTime = HostCmd_SCAN_MAX_CH_TIME;
}
//#ifdef SDIO
// #ifndef MRVL_WINCE50
// NdisAllocateSpinLock(&Adapter->lDPCLock);
// #endif
//NdisAllocateSpinLock(&Adapter->lDPCPendingLock);
//#endif //SDIO
return NDIS_STATUS_SUCCESS;
}
//tt ++ v5 firmware
/*
Does the code need to delay for 10000 ms!!??
*/
VOID BCAInitialization( IN PMRVDRV_ADAPTER Adapter )
{
if ( Adapter->BTMode != 0 )
{
// only send command if BT mode is not 0
DBGPRINT(DBG_LOAD, ("Setting BT Mode parameters:\n"));
DBGPRINT(DBG_LOAD, ("BTMode=0x%x, Antenna Config = 0x%x, Freq Config = 0x%x\n",
Adapter->BTMode, Adapter->BTAntennaConfig, Adapter->BTFrequencyConfig));
DBGPRINT(DBG_LOAD, ("TX Lo = 0x%x, TX Hi = 0x%x, RX Lo = 0x%x, RX Hi = 0x%x\n",
Adapter->BTWLANTxPriorityLo, Adapter->BTWLANTxPriorityHi,
Adapter->BTWLANRxPriorityLo, Adapter->BTWLANRxPriorityHi));
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_BCA_CONFIG,
HostCmd_ACT_GEN_SET,
HostCmd_OPTION_USE_INT,
0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL );
NdisMSleep(10000);
DBGPRINT( DBG_LOAD, ("TrafficType=%d, TimeShareInterval=%d, BTTime=%d\n",
Adapter->BTTrafficType, Adapter->BTTimeShareInterval, Adapter-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -