📄 initproc.c
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 *****************
*
* Purpose: This module provides the implementaion of NDIS miniport
* dirver initialization, reset and check for hang routines.
*
* $Author: heb $
*
* $Date: 2007/07/13 08:01:35 $
*
* $Revision: 1.13.2.5 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#ifdef IF_SPI
#if CMCS
//chenglong
#include "common.h"
#endif
#endif
// jeff.spurgat 2003-04-04
#ifdef UNDER_CE
// jeff.spurgat 2003-04-15
// cardservices support
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#endif
#include "If.h"
#include <regext.h>
//////////////added by zhangb////////////////
#include "ParaRoamingProc.h"
//////////////added by zhangb////////////////
#include "logmain.h"
extern DWORD g_AssociationDuration;
//#ifdef DEBUG_PARA_ROAMING
PRIVATE_PARAROAMING_ADAPTER priv;
//#endif
//#if DBG
unsigned char lptRegImage1 = 0;
unsigned char lptRegImage2 = 0;
// PJG: Note if using igxbug in precompiled header
// you need to define the debug vars manually.
LARGE_INTEGER t1Time, t1LastTime, t1CurTime;
LARGE_INTEGER t2Time, t2LastTime, t2CurTime;
LARGE_INTEGER t3Time, t3LastTime, t3CurTime;
LARGE_INTEGER t4Time, t4LastTime, t4CurTime;
LARGE_INTEGER t5Time, t5LastTime, t5CurTime;
LARGE_INTEGER t6Time, t6LastTime, t6CurTime;
LARGE_INTEGER curTime;
LARGE_INTEGER lastTime;
ULONG DebugLevel = DBG_DEFAULT;
LARGE_INTEGER isrTimeDelay;
#ifdef UNDER_CE
FILE *MrvDbgfp = NULL;
#endif // #ifdef UNDER_CE
//#endif
unsigned char wlan_cal_data[] = {
//Action
0x00,0x00,
//Reserved1[9]
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//PA calibration options
0x0a,
//type of external PA
0x00,
//Antenna selection
0x05,
//channel calibration
0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,
0x08,0x00,0x09,0x00,0x0A,0x00,0x0b,0x00,0x0C,0x00,0x0D,0x00,0x0e,0x00,
//RF register calibration
0xaA,0x0B,0x0C,0x00,
//Reserved2[4]
0x00,0x00,0x00,0x00,
//Regulatory Domain
0x00,0x02,
//ECO present or not
0x32,
//VGA capacitor calibration
0xCc,
//Reserved3[12]
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//# MAC address
0x00,0x0b,0x6c,0x4e,0xcd,0xd2
};
//#define NEW_SCHEME_TO_GET_RESOURCES
#ifdef IF_SPI
BOOL g_bWLAN_FW_Downloaded = FALSE;
///crlo:add ++
#ifdef IF_SPI
static BOOL isDrvInitialized = FALSE;
#endif ///IF_SPI
///crlo:add --
#ifdef CMCS
//chenglong
NDIS_HANDLE g_nMiniportAdapterContext;
extern void SPI_Initialize(void);
#endif
#endif
/*
===============================================================================
CODED PUBLIC VARIABLE
===============================================================================
*/
//
// Registry table, works with INF file and ReadRegistryInfo() to provide a
// convenient way for device specific registry information reading.
//
static REGINFOTAB MrvDrvRegInfoTab[] = {
{NDIS_STRING_CONST("DesiredSSID"), "DesiredSSID", 1, FIELD_OFFSET(MRVDRV_ADAPTER, DesiredSSID)+4, 32},
{NDIS_STRING_CONST("NetWorkMode"), "NetworkMode", 0, FIELD_OFFSET(MRVDRV_ADAPTER, InfrastructureMode), 4},
{NDIS_STRING_CONST("AuthMode"), "AuthMode", 0, FIELD_OFFSET(MRVDRV_ADAPTER, AuthenticationMode), 4},
{NDIS_STRING_CONST("TxAntenna"), "TxAntenna", 3, FIELD_OFFSET(MRVDRV_ADAPTER, TxAntenna), 4},
{NDIS_STRING_CONST("RxAntenna"), "RxAntenna", 3, FIELD_OFFSET(MRVDRV_ADAPTER, RxAntenna), 4},
{NDIS_STRING_CONST("Channel"), "Channel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, Channel), 4},
{NDIS_STRING_CONST("DataRate"), "DataRate", 3, FIELD_OFFSET(MRVDRV_ADAPTER, DataRate), 4},
{NDIS_STRING_CONST("FragThsd"), "FragThsd", 0, FIELD_OFFSET(MRVDRV_ADAPTER, FragThsd), 4},
{NDIS_STRING_CONST("RTSThsd"), "RTSThsd", 0, FIELD_OFFSET(MRVDRV_ADAPTER, RTSThsd), 4},
{NDIS_STRING_CONST("MaxChanTime"), "MaxChanTime", 0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultPerChannelScanTime), 4},
{NDIS_STRING_CONST("Preamble"), "Preamble", 0, FIELD_OFFSET(MRVDRV_ADAPTER, Preamble), 4},
{NDIS_STRING_CONST("PowerMode"), "PowerMode", 0, FIELD_OFFSET(MRVDRV_ADAPTER, PSMode), 4},
{NDIS_STRING_CONST("RoamingMode"), "RoamingMode", 0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingMode), 1},
{NDIS_STRING_CONST("RoamingRSSILevel"), "RoamingRSSILevel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingLevel), 1},
{NDIS_STRING_CONST("RoamingPeriod"), "RoamingPeriod", 0, FIELD_OFFSET(MRVDRV_ADAPTER, RoamingPeriod), 4},
//tt ++ v5 firmware
{NDIS_STRING_CONST("BTMode"), "BTMode", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTMode), 4},
{NDIS_STRING_CONST("BTAntennaConfig"), "BTAntennaConfig", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTAntennaConfig), 4},
{NDIS_STRING_CONST("BTFrequencyConfig"), "BTFrequencyConfig", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTFrequencyConfig), 4},
{NDIS_STRING_CONST("BTWLANTxPriorityLo"), "BTWLANTxPriorityLo", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANTxPriorityLo), 4},
{NDIS_STRING_CONST("BTWLANTxPriorityHi"), "BTWLANTxPriorityHi", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANTxPriorityHi), 4},
{NDIS_STRING_CONST("BTWLANRxPriorityLo"), "BTWLANRxPriorityLo", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityLo), 4},
{NDIS_STRING_CONST("BTWLANRxPriorityHi"), "BTWLANRxPriorityHi", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi), 4},
{NDIS_STRING_CONST("BTTrafficType"), "BTTrafficType", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi), 4},
{NDIS_STRING_CONST("BTTimeShareInterval"), "BTTimeShareInterval", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi), 4},
{NDIS_STRING_CONST("BTTime"), "BTTime", 0, FIELD_OFFSET(MRVDRV_ADAPTER, BTWLANRxPriorityHi), 4},
//tt --
{NDIS_STRING_CONST("QOS"), "QOS", 0, FIELD_OFFSET(MRVDRV_ADAPTER, EnableQOS), 4},
{NDIS_STRING_CONST("WepStatus"), "WepStatus", 0, FIELD_OFFSET(MRVDRV_ADAPTER, WEPStatus), 4},
{NDIS_STRING_CONST("TxWepKey"), "TxWepKey", 0, FIELD_OFFSET(MRVDRV_ADAPTER, TxWepKey), 4},
{NDIS_STRING_CONST("TxPower"), "TxPower", 0, FIELD_OFFSET(MRVDRV_ADAPTER, TxPower), 4},
{NDIS_STRING_CONST("WepKey1"), "WepKey1", 1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey1)+12, 16},
{NDIS_STRING_CONST("WepKey2"), "WepKey2", 1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey2)+12, 16},
{NDIS_STRING_CONST("WepKey3"), "WepKey3", 1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey3)+12, 16},
{NDIS_STRING_CONST("WepKey4"), "WepKey4", 1, FIELD_OFFSET(MRVDRV_ADAPTER, WepKey4)+12, 16},
{NDIS_STRING_CONST("AdhocDefaultBand"), "AdhocDefaultBand" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocDefaultBand), 4},
{NDIS_STRING_CONST("AdhocDefaultChannel"),"AdhocDefaultChannel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocDefaultChannel), 4},
{NDIS_STRING_CONST("AdhocWiFiDataRate"), "AdhocWiFiDataRate" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, AdhocWiFiDataRate), 4},
//{NDIS_STRING_CONST("SetSD4BIT"), "SetSD4BIT" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SetSD4BIT), 4}
{NDIS_STRING_CONST("SetSD4BIT"), "SetSD4BIT" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SetSD4BIT), 4},
{NDIS_STRING_CONST("SdioIstThread"), "SdioIstThread" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, SdioIstThread), 4},
#ifdef ENABLE_802_11D
{NDIS_STRING_CONST("Enable80211D"), "Enable80211D" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, Enable80211D), 4},
{NDIS_STRING_CONST("DefaultRegion"), "DefaultRegion" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultRegion), 4},
{NDIS_STRING_CONST("DefaultBand"), "DefaultBand" , 0, FIELD_OFFSET(MRVDRV_ADAPTER, DefaultBand), 4},
#endif
};
// jeff.spurgat 20003-04-02
// Registry settings for Install_Driver function (required in WinCE)
//
// The following settings are set as default:
//
// [HKEY_LOCAL_MACHINE\Comm\CF8385PN]
// "DisplayName"="Marvell MrvDrv CF 802.11b"
// "Group"="NDIS"
// "ImagePath"="CF8385PN.dll"
//
// [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PCI\Template\CF8385PN]
// "Dll"="NDIS.dll"
// "Entry"="NdisPCIBusDeviceInit"
// "IsrDll"="giisr.dll"
// "IsrHandler"="ISRHandler"
// "Class"=dword:02
// "SubClass"=dword:00
// "ProgIF"=dword:0
// "PortIsIO"=dword:0
// "PortOffset"=dword:00
// "PortSize"=dword:0
// "PortMask"=dword:00000000
// "VendorID"=multi_sz:"0000"
// "DeviceID"=multi_sz:"0000"
//
// [HKEY_LOCAL_MACHINE\Drivers\PCMCIA\CF8385PN]
// "Dll"="ndis.dll"
// "Prefix"="NDS"
// "Miniport"="CF8385PN"
//
// [HKEY_LOCAL_MACHINE\Drivers\PCMCIA\Detect\101]
// "Dll"="CF8385PN.dll"
// "Entry"="DetectMrvDrv"
//
#define SIZE_OF_REG_TAB (sizeof(MrvDrvRegInfoTab)/sizeof(REGINFOTAB))
/*
===============================================================================
CODED PUBLIC PROCEDURES
===============================================================================
*/
//*********************************************
void SetWifiState(DWORD dwState)
{
DWORD Status ;
HKEY hKey= 0 ;
Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\State\\Hardware"), 0L, KEY_WRITE, &hKey);
if(Status == ERROR_SUCCESS)
{
Status = RegSetValueEx(hKey, TEXT("WiFi"), 0, REG_DWORD, (LPBYTE)&dwState, sizeof(DWORD));
RegCloseKey(hKey);
}
}
// The call-back function for Registry Notifications.
void RegistryNotifyCallbackFunc(HREGNOTIFY hNotify, DWORD dwUserData, const PBYTE pData, const UINT cbData)
{
DWORD dwState=(DWORD)*pData;
//DEBUGMSG(1, (TEXT("RegistryNotifyCallbackFunc data=%d\n"), dwState));
if(dwState==0)
SetWifiState(1);
if(dwState==4)
SetWifiState(3);
if(dwState==6)
SetWifiState(7);
if(7<dwState && dwState<15)
SetWifiState(11);
if((15<dwState) && (dwState<31) && (dwState%2==0))
SetWifiState(19);
return;
}
void InitWlanStateMonitor(void)
{
HKEY hKey;
HREGNOTIFY g_hRegNotify;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("System\\State"), 0, KEY_QUERY_VALUE, &hKey))
{
HRESULT hr = RegistryNotifyCallback(hKey, TEXT("Hardware"),TEXT("WiFi"),RegistryNotifyCallbackFunc,0,NULL,&g_hRegNotify);
RegCloseKey(hKey);
}
}
//*******************************************
/* Add the coded public routines here, each with their own prologue. */
// jeff.spurgat 2003-04-02
// DllEntry is required for WinCE driver
#ifdef UNDER_CE
//-----------------------------------------------------------------------------
// Function : DllEntry
// This function provides the DLL entry point required for the WinCE
// driver. Since all network drivers are implemented as DLL's in WinCE,
// this entry point is needed.
//
// Inputs : HANDLE hDLL, handle identifying this DLL.
//
// DWORD dwReason, reason of invocation of this entry point.
//
// LPVOID lpReserved, reserved param
//
// Outputs : None.
//
// Returns : TRUE - don't really know what this function is used
// for, it has basically been reproduced here from
// the WinCE sample driver. Just safer to return TRUE
// than FALSE :-)
//
//-----------------------------------------------------------------------------
BOOL __stdcall
DllEntry( HANDLE hDLL,
DWORD dwReason,
LPVOID lpReserved )
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGMSG(1, (TEXT("MRVDRVND5: DLL_PROCESS_ATTACH\n")));
DisableThreadLibraryCalls ((HMODULE)hDLL);
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(1, (TEXT("MRVDRVND5: DLL_PROCESS_DETACH\n")));
break;
}
return TRUE;
}
#endif
// jeff.spurgat 2003-04-02
// Added AddKeyValues() function, which is used by Install_Driver() to set
// registry key entries. This function was taken from samples in Platform
// Builder.
#ifdef UNDER_CE
/****************************************************************************
* Function : AddKeyValues
* This function adds the specified key and its value into the
* registry under HKEY_LOCAL_MACHINE.
*
* Inputs : LPWSTR KeyName, name of the key to be added to the registry.
*
* PREG_VALUE_DESCR Vals, value associated with this key.
*
* Outputs : None.
*
* NOTE : 1. This function only supports REG_MULTI_SZ strings with
* one item.
* 2. Assumes that input Value for the specified Key is NULL
* terminated.
*
* Returns : TRUE - if successfully added Key & Value
* FALSE - if failed to add Key & Value
*
***************************************************************************/
BOOL
AddKeyValues (LPWSTR KeyName, PREG_VALUE_DESCR Vals)
{
DWORD Status;
DWORD dwDisp;
HKEY hKey;
PREG_VALUE_DESCR pValue;
DWORD ValLen;
PBYTE pVal;
DWORD dwVal;
LPWSTR pStr;
Status = RegCreateKeyEx (HKEY_LOCAL_MACHINE, KeyName, 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, &dwDisp);
if (Status != ERROR_SUCCESS)
return (FALSE);
pValue = Vals;
while (pValue->val_name)
{
switch (pValue->val_type)
{
case REG_DWORD:
pVal = (PBYTE)&dwVal;
dwVal = (DWORD)pValue->val_data;
ValLen = sizeof (DWORD);
break;
case REG_SZ:
pVal = (PBYTE)pValue->val_data;
ValLen = (wcslen ((LPWSTR)pVal) + 1) * sizeof (WCHAR);
break;
case REG_MULTI_SZ:
dwVal = wcslen ((LPWSTR)pValue->val_data);
ValLen = (dwVal + 2) * sizeof (WCHAR);
pVal = LocalAlloc (LPTR, ValLen);
if (pVal == NULL)
{
RegCloseKey (hKey);
return (FALSE);
}
wcscpy ((LPWSTR)pVal, (LPWSTR)pValue->val_data);
pStr = (LPWSTR)pVal + dwVal;
pStr[1] = 0;
break;
}
Status = RegSetValueEx (hKey, pValue->val_name, 0, pValue->val_type, pVal, ValLen);
if (pValue->val_type == REG_MULTI_SZ)
LocalFree (pVal);
if (Status != ERROR_SUCCESS)
{
RegCloseKey (hKey);
return (FALSE);
}
pValue++;
}
RegCloseKey (hKey);
return (TRUE);
}
#endif // UNDER_CE
/******************************************************************************
*
* Name: DriverEntry()
*
* Description:
* NDIS miniport driver primary driver entry.
*
* Arguments:
* DriverObject - Pointer to driver object created by the system.
* RegistryPath - The registry path of this driver
*
* Return Value:
*
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_BAD_CHARACTERISTICS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -