|
|
/*****************************************************************************
** ** ** COPYRIGHT (C) 2000, 2001 MKNET CORPORATION ** ** DEVELOPED FOR THE MK7100-BASED VFIR PCI CONTROLLER. ** ** ** *****************************************************************************/
/**********************************************************************
Module Name: WINREG.C
Routines: ParseRegistryParameters ProcessRegistry
Comments: Parse Windows Registry.
*****************************************************************************/
#include "precomp.h"
#pragma hdrstop
//************************************************************
// MK7RegTabType
//
// One instance of this structure will be used for every configuration
// parameter that this driver supports. The table contains all of the
// relavent information about each parameter: Name, whether or not it is
// required, where it is located in the "Adapter" structure, the size of
// the parameter in bytes, the default value for the parameter, and what
// the minimum and maximum values are for the parameter. In the debug
// version of the driver, this table also contains a field for the ascii
// name of the parameter.
//************************************************************
typedef struct _MK7RegTabType { NDIS_STRING RegVarName; // variable name text
char *RegAscName; // variable name text
UINT Mandantory; // 1 -> manditory, 0 -> optional
#define MK7OPTIONAL 0
#define MK7MANDATORY 1
UINT FieldOffset; // offset to MK7_ADAPTER field loaded
UINT FieldSize; // size (in bytes) of the field
UINT Default; // default value to use
UINT Min; // minimum value allowed
UINT Max; // maximum value allowed
} MK7RegTabType;
//************************************************************
// Registry Parameters Table
//
// This table contains a list of all of the configuration parameters
// that the driver supports. The driver will attempt to find these
// parameters in the registry and use the registry value for these
// parameters. If the parameter is not found in the registry, then the
// default value is used. This is a way for us to set defaults for
// certain parameters.
//
//************************************************************
MK7RegTabType MK7RegTab[ ] = { //
// REGISTRY NAME TEXT NAME MAN/OPT OFFSET
// SIZE DEF VAL MIN MAX
//
//#if DBG
// {NDIS_STRING_CONST("Debug"), "Debug", MK7OPTIONAL, MK7_OFFSET(Debug),
// MK7_SIZE(Debug), DBG_NORMAL, 0, 0xffffffff},
//#endif
{NDIS_STRING_CONST("MaxConnectRate"), "MaxConnectRate", MK7OPTIONAL, MK7_OFFSET(MaxConnSpeed), MK7_SIZE(MaxConnSpeed), 16000000, 9600, 16000000},
{NDIS_STRING_CONST("MinTurnAroundTime"), "MinTurnAroundTime", MK7OPTIONAL, MK7_OFFSET(turnAroundTime_usec), MK7_SIZE(turnAroundTime_usec), DEFAULT_TURNAROUND_usec, 0, DEFAULT_TURNAROUND_usec},
//
// All the ones from here down are not really necessary except for testing.
//
{NDIS_STRING_CONST("BusNumber"), "BusNumber", MK7OPTIONAL, MK7_OFFSET(BusNumber), MK7_SIZE(BusNumber), 0, 0, 16},
{NDIS_STRING_CONST("SlotNumber"), "SlotNumber", MK7OPTIONAL, MK7_OFFSET(MKSlot), MK7_SIZE(MKSlot), 0, 0, 32},
#if DBG
{NDIS_STRING_CONST("Loopback"), "Loopback", MK7OPTIONAL, MK7_OFFSET(LB), MK7_SIZE(LB), 0, 0, 2}, #endif
{NDIS_STRING_CONST("RingSize"), "RingSize", MK7OPTIONAL, MK7_OFFSET(RingSize), MK7_SIZE(RingSize), DEF_RING_SIZE, MIN_RING_SIZE, MAX_RING_SIZE},
{NDIS_STRING_CONST("RXRingSize"), "RXRingSize", MK7OPTIONAL, MK7_OFFSET(RegNumRcb), MK7_SIZE(RegNumRcb), DEF_RXRING_SIZE,MIN_RING_SIZE, DEF_RXRING_SIZE},
{NDIS_STRING_CONST("TXRingSize"), "TXRingSize", MK7OPTIONAL, MK7_OFFSET(RegNumTcb), MK7_SIZE(RegNumTcb), DEF_TXRING_SIZE,MIN_RING_SIZE, DEF_TXRING_SIZE},
{NDIS_STRING_CONST("ExtraBOFs"), "ExtraBOFs", MK7OPTIONAL, MK7_OFFSET(RegExtraBOFs), MK7_SIZE(RegExtraBOFs), DEF_EBOFS, MIN_EBOFS, MAX_EBOFS},
{NDIS_STRING_CONST("Speed"), "Speed", MK7OPTIONAL, MK7_OFFSET(RegSpeed), MK7_SIZE(RegSpeed), 16000000, 4000000, 16000000},
{NDIS_STRING_CONST("BusType"), "BusType", MK7OPTIONAL, MK7_OFFSET(MKBusType), MK7_SIZE(MKBusType), PCIBUS, PCIBUS, PCIBUS},
{NDIS_STRING_CONST("IoSize"), "IoSize", MK7OPTIONAL, MK7_OFFSET(MKBaseSize), MK7_SIZE(MKBaseSize), MK7_IO_SIZE, MK7_IO_SIZE, MK7_IO_SIZE},
{NDIS_STRING_CONST("Wireless"), "Wireless", MK7OPTIONAL, MK7_OFFSET(Wireless), MK7_SIZE(Wireless), 1, 0, 1}, };
#define NUM_REG_PARAM ( sizeof (MK7RegTab) / sizeof (MK7RegTabType) )
//-----------------------------------------------------------------------------
// Procedure: ParseRegistryParameters
//
// Description: This routine will parse all of the parameters out of the
// registry/PROTOCOL.INI, and store the values in the "Adapter"
// Structure. If the parameter is not present in the registry, then the
// default value for the parameter will be placed into the "Adapter"
// structure. This routine also checks the validity of the parameter
// value, and if the value is out of range, the driver will the min/max
// value allowed.
//
// Arguments:
// Adapter - ptr to Adapter object instance
// ConfigHandle - NDIS Configuration Registery handle
//
// Returns:
// NDIS_STATUS_SUCCESS - All mandatory parameters were parsed
// NDIS_STATUS_FAILED - A mandatory parameter was not present
//-----------------------------------------------------------------------------
NDIS_STATUS ParseRegistryParameters(IN PMK7_ADAPTER Adapter, IN NDIS_HANDLE ConfigHandle) { UINT i; NDIS_STATUS Status; MK7RegTabType *RegTab; UINT value; PUCHAR fieldPtr; PNDIS_CONFIGURATION_PARAMETER ReturnedValue; #if DBG
char ansiRegName[32]; ULONG paramval; #endif
//****************************************
// Grovel through the registry parameters and aquire all of the values
// stored therein.
//****************************************
for (i=0, RegTab=MK7RegTab; i<NUM_REG_PARAM; i++, RegTab++) {
fieldPtr = ((PUCHAR) Adapter) + RegTab->FieldOffset;
#if DBG
strcpy(ansiRegName, RegTab->RegAscName); #endif
//****************************************
// Get the configuration value for a specific parameter. Under NT the
// parameters are all read in as DWORDs.
//****************************************
NdisReadConfiguration(&Status, &ReturnedValue, ConfigHandle, &RegTab->RegVarName, NdisParameterInteger);
//****************************************
// Param in Reg:
// Check that it's w/i the min-max range. If not set it to
// default, else just set to that in the Reg.
//
// Param not in Reg:
// If it's a mandatory param, error out.
// If it's optional (non-mandatory), again use default.
//****************************************
if (Status == NDIS_STATUS_SUCCESS) {
#if DBG
paramval = ReturnedValue->ParameterData.IntegerData; #endif
if (ReturnedValue->ParameterData.IntegerData < RegTab->Min || ReturnedValue->ParameterData.IntegerData > RegTab->Max) { value = RegTab->Default; } else { value = ReturnedValue->ParameterData.IntegerData; } } else if (RegTab->Mandantory) { DBGSTR(("Could not find mandantory in registry\n")); DBGLOG("<= ParseRegistryParameters (ERROR out)", 0); return (NDIS_STATUS_FAILURE); } else { // non-mandatory
value = RegTab->Default; }
//****************************************
// Store the value in the adapter structure.
//****************************************
switch (RegTab->FieldSize) { case 1: *((PUCHAR) fieldPtr) = (UCHAR) value; break;
case 2: *((PUSHORT) fieldPtr) = (USHORT) value; break;
case 4: *((PULONG) fieldPtr) = (ULONG) value; break;
default: DBGSTR(("Bogus field size %d\n", RegTab->FieldSize)); break; } }
return (NDIS_STATUS_SUCCESS); }
//----------------------------------------------------------------------
// Procedure: [ProcessRegistry]
//
// Description: Do all the one time Registry stuff.
//
// Return: NDIS_STATUS_SUCCESS
// (!NDIS_STATUS_SUCCESS)
//----------------------------------------------------------------------
NDIS_STATUS ProcessRegistry(PMK7_ADAPTER Adapter, NDIS_HANDLE WrapperConfigurationContext) { NDIS_STATUS Status; NDIS_HANDLE ConfigHandle; PVOID OverrideNetAddress; ULONG i;
NdisOpenConfiguration(&Status, &ConfigHandle, WrapperConfigurationContext);
if (Status != NDIS_STATUS_SUCCESS) { return (NDIS_STATUS_FAILURE); }
//****************************************
// Parse all our configuration parameters. Error out if bad
// status returned -- Required param not in Registry.
//****************************************
Status = ParseRegistryParameters(Adapter, ConfigHandle); if (Status != NDIS_STATUS_SUCCESS) { NdisCloseConfiguration(ConfigHandle); return (Status); }
NdisCloseConfiguration(ConfigHandle);
// Adapter->NumRcb = Adapter->RegNumRcb;
// Adapter->NumTcb = Adapter->RegNumTcb;
Adapter->NumRcb = DEF_RXRING_SIZE; Adapter->NumTcb = DEF_TXRING_SIZE; Adapter->NumRpd = CalRpdSize(Adapter->NumRcb); Adapter->extraBOFsRequired = Adapter->RegExtraBOFs;
return(Status); }
|