windows-nt/Source/XPSP1/NT/drivers/net/irda/mknet/sys/winreg.c
2020-09-26 16:20:57 +08:00

294 lines
9.8 KiB
C

/*****************************************************************************
** **
** 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);
}