📄 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: schiu $
*
* $Date: 2005/01/19 $
*
* $Revision: #10 $
*
*****************************************************************************/
/*
===============================================================================
INCLUDE FILES
===============================================================================
*/
#include "precomp.h"
#ifdef IF_GSPI
#if OMAP
#include "common.h"
#endif ///OMAP
#endif ///IF_GSPI
// 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"
//#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
//#define NEW_SCHEME_TO_GET_RESOURCES
#ifdef IF_GSPI
///BOOL g_bWLAN_FW_Downloaded = FALSE;
static BOOL isDrvInitialized = FALSE;
#ifdef OMAP
NDIS_HANDLE g_nMiniportAdapterContext;
extern void SPI_Initialize(void);
#endif ///OMAP
#endif ///IF_GSPI
/*
===============================================================================
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 AvoidOidSetScan
{NDIS_STRING_CONST("AvoidScanTime"), "AvoidScanTime", 0, FIELD_OFFSET(MRVDRV_ADAPTER, AvoidScanTime), 4},
#endif
#ifdef ACTIVE_ROAMING
{NDIS_STRING_CONST("bActiveRoamingScanOneChannel"), "bActiveRoamingScanOneChannel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, bActiveRoamingScanOneChannel), 4},
{NDIS_STRING_CONST("bLinkLostScanOneChannel"), "bLinkLostScanOneChannel", 0, FIELD_OFFSET(MRVDRV_ADAPTER, bLinkLostScanOneChannel), 4},
#endif
#ifdef NEW_RSSI
{NDIS_STRING_CONST("ulRSSIThresholdTimer"), "ulRSSIThresholdTimer", 0, FIELD_OFFSET(MRVDRV_ADAPTER, ulRSSIThresholdTimer), 4},
{NDIS_STRING_CONST("RSSI_Range"), "RSSI_Range", 0, FIELD_OFFSET(MRVDRV_ADAPTER, RSSI_Range), 4},
#endif
#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
///crlo:filter_32_ESSID ++
{NDIS_STRING_CONST("ESSID_32"), "ESSID_32", 0, FIELD_OFFSET(MRVDRV_ADAPTER, ESSID_32), 4},
///crlo:filter_32_ESSID --
///crlo:Multicast ++
{NDIS_STRING_CONST("Allow_Multicast"), "Allow_Multicast", 0, FIELD_OFFSET(MRVDRV_ADAPTER, allowMultiCast), 4},
///crlo:Multicast --
#ifdef BG_SCAN
{NDIS_STRING_CONST("bActiveRoamingwithBGSCAN"),"bActiveRoamingwithBGSCAN", 0, FIELD_OFFSET(MRVDRV_ADAPTER, bActiveRoamingwithBGSCAN), 4},
#endif /* BG_SCAN */
};
// 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
===============================================================================
*/
/* 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
///crlo:test ++
/*
DWORD NDL_Init(DWORD dwContext)
{
static DWORD pHC=0;
RETAILMSG(1, (TEXT("Enter %s\n"), TEXT(__FUNCTION__)));
pHC ++;
RETAILMSG(1, (TEXT("Exit %s\n"), TEXT(__FUNCTION__)));
return pHC;
}
BOOL NDL_Deinit(DWORD hDC)
{
BOOL result = TRUE;
RETAILMSG(1, (TEXT("NDL_Deinit\n")));
return result;
}*/
///crlo:test --
/******************************************************************************
*
* 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
* NDIS_STATUS_BAD_VERSION
* NDIS_STATUS_RESOURCES
* NDIS_STATUS_FAILURE
*
* Notes:
*
*****************************************************************************/
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
NDIS_STATUS Status;
NDIS_HANDLE NdisWrapperHandle;
NDIS_MINIPORT_CHARACTERISTICS MrvDrvNMC;
INITDEBUG();
DBGPRINT(DBG_LOAD,("INIT - Enter DriverEntry\n"));
///crlo:verdef ++
//DBGPRINT(DBG_ALL, (TEXT("=== ") TEXT(IFSTRN) TEXT(CHIPSTRN) TEXT("_") TEXT(RFSTRN) TEXT(" Driver ===")));
RETAILMSG(1, (TEXT("=== ") TEXT(IFSTRN) TEXT(CHIPSTRN) TEXT("_") TEXT(RFSTRN) TEXT(" Driver ===")));
#ifdef MRVL_PRINT_FILE_MSG
MrvPrintFileMSG("[Marvell]DriverEntry === " IFSTRN CHIPSTRN "_" RFSTRN" Driver ===\n");
#endif
///crlo:verdef --
DBGPRINT(DBG_ALL, ("*** Driver version %s ***\n",
MRVDRV_DRIVER_BUILD_VERSION));
DBGPRINT(DBG_ALL, ("*** Built on %s %s ***\n",
__DATE__,
__TIME__));
// Now we must initialize the wrapper, and then register the Miniport
#if DBG
isrTimeDelay.QuadPart = 0;
#endif
NdisMInitializeWrapper(
&NdisWrapperHandle,
DriverObject,
RegistryPath,
NULL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -