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