/*++

Copyright (c) 1997-2000 Microsoft Corporation

Module Name:

    data.c

Abstract:

    Data definitions for discardable/pageable data

Author:
    Ravisankar Pudipeddi (ravisp) -  1 Feb 1997
    Neil Sandlin (neilsa) June 1 1999    

Environment:

    Kernel mode

Revision History :

--*/

#include "pch.h"

#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg ("INIT")
#endif
//
// Beginning of Init Data
//

//
// Global registry values (in pcmcia\\parameters)
//
#define PCMCIA_REGISTRY_INTERRUPT_MASK_VALUE        L"ForcedInterruptMask"
#define PCMCIA_REGISTRY_INTERRUPT_FILTER_VALUE      L"FilterInterruptMask"
#define PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_LO_VALUE   L"AttributeMemoryLow"
#define PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_HI_VALUE   L"AttributeMemoryHigh"
#define PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_SIZE_VALUE L"AttributeMemorySize"
#define PCMCIA_REGISTRY_SOUNDS_ENABLED_VALUE        L"SoundsEnabled"
#define PCMCIA_REGISTRY_POWER_POLICY_VALUE          L"PowerPolicy"
#define PCMCIA_REGISTRY_FORCE_CTLR_DEVICE_WAKE      L"ForceControllerDeviceWake"
#define PCMCIA_REGISTRY_IO_HIGH_VALUE               L"IoHigh"
#define PCMCIA_REGISTRY_IO_LOW_VALUE                L"IoLow"
#define PCMCIA_REGISTRY_READY_DELAY_ITER_VALUE      L"ReadyDelayIter"
#define PCMCIA_REGISTRY_READY_STALL_VALUE           L"ReadyStall"
#define PCMCIA_REGISTRY_USE_POLLED_CSC_VALUE        L"ForcePolledMode"
#define PCMCIA_REGISTRY_CBMODEM_DELAY_VALUE         L"CBModemReadyDelay"
#define PCMCIA_REGISTRY_PCIC_MEMORY_WINDOW_DELAY    L"PcicMemoryWindowDelay"
#define PCMCIA_REGISTRY_PCIC_RESET_WIDTH_DELAY      L"PcicResetWidthDelay"
#define PCMCIA_REGISTRY_PCIC_RESET_SETUP_DELAY      L"PcicResetSetupDelay"
#define PCMCIA_REGISTRY_CB_RESET_WIDTH_DELAY        L"CBResetWidthDelay"
#define PCMCIA_REGISTRY_CB_RESET_SETUP_DELAY        L"CBResetSetupDelay"
#define PCMCIA_REGISTRY_CONTROLLER_POWERUP_DELAY    L"ControllerPowerUpDelay"
#define PCMCIA_REGISTRY_DISABLE_ISA_PCI_ROUTING     L"DisableIsaToPciRouting"
#define PCMCIA_REGISTRY_DEFAULT_ROUTE_R2_TO_ISA     L"DefaultRouteToIsa"
#define PCMCIA_REGISTRY_DISABLE_ACPI_NAMESPACE_CHK  L"DisableAcpiNameSpaceCheck"
#define PCMCIA_REGISTRY_IRQ_ROUTE_PCI_CTLR          L"IrqRouteToPciController"
#define PCMCIA_REGISTRY_IRQ_ROUTE_ISA_CTLR          L"IrqRouteToIsaController"
#define PCMCIA_REGISTRY_IRQ_ROUTE_PCI_LOC           L"IrqRouteToPciLocation"
#define PCMCIA_REGISTRY_IRQ_ROUTE_ISA_LOC           L"IrqRouteToIsaLocation"
#define PCMCIA_REGISTRY_REPORT_MTD0002_AS_ERROR     L"ReportMTD0002AsError"
#define PCMCIA_REGISTRY_DEBUG_MASK                  L"DebugMask"
#define PCMCIA_REGISTRY_EVENT_DPC_DELAY             L"EventDpcDelay"

//
// Table which defines global registry settings
//
//          RegistryName                           Internal Variable              Default Value
//          ------------                           -----------------              -------------
GLOBAL_REGISTRY_INFORMATION GlobalRegistryInfo[] = {
#if DBG
   PCMCIA_REGISTRY_DEBUG_MASK,                  &PcmciaDebugMask,             1,
#endif   
   PCMCIA_REGISTRY_INTERRUPT_MASK_VALUE,        &globalOverrideIrqMask,       0,
   PCMCIA_REGISTRY_INTERRUPT_FILTER_VALUE,      &globalFilterIrqMask,         0,
   PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_LO_VALUE,   &globalAttributeMemoryLow,    PCMCIA_DEFAULT_ATTRIBUTE_MEMORY_LOW,
   PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_HI_VALUE,   &globalAttributeMemoryHigh,   PCMCIA_DEFAULT_ATTRIBUTE_MEMORY_HIGH,
   PCMCIA_REGISTRY_ATTRIBUTE_MEMORY_SIZE_VALUE, &globalAttributeMemorySize,   0,
   PCMCIA_REGISTRY_SOUNDS_ENABLED_VALUE,        &initSoundsEnabled,           1,
   PCMCIA_REGISTRY_POWER_POLICY_VALUE,          &PcmciaPowerPolicy,           1,
   PCMCIA_REGISTRY_FORCE_CTLR_DEVICE_WAKE,      &PcmciaControllerDeviceWake,  0,
   PCMCIA_REGISTRY_IO_HIGH_VALUE,               &globalIoHigh,                PCMCIA_DEFAULT_IO_HIGH,
   PCMCIA_REGISTRY_IO_LOW_VALUE,                &globalIoLow,                 PCMCIA_DEFAULT_IO_LOW, 
   PCMCIA_REGISTRY_READY_DELAY_ITER_VALUE,      &globalReadyDelayIter,        PCMCIA_DEFAULT_READY_DELAY_ITER,
   PCMCIA_REGISTRY_READY_STALL_VALUE,           &globalReadyStall,            PCMCIA_DEFAULT_READY_STALL,
   PCMCIA_REGISTRY_USE_POLLED_CSC_VALUE,        &initUsePolledCsc,            0,
   PCMCIA_REGISTRY_DISABLE_ISA_PCI_ROUTING,     &pcmciaDisableIsaPciRouting,  0,
   PCMCIA_REGISTRY_ISA_IRQ_RESCAN_COMPLETE,     &pcmciaIsaIrqRescanComplete,  0,
   PCMCIA_REGISTRY_IRQ_ROUTE_PCI_CTLR,          &pcmciaIrqRouteToPciController, 0,
   PCMCIA_REGISTRY_IRQ_ROUTE_ISA_CTLR,          &pcmciaIrqRouteToIsaController, 0,
   PCMCIA_REGISTRY_IRQ_ROUTE_PCI_LOC,           &pcmciaIrqRouteToPciLocation, 0,
   PCMCIA_REGISTRY_IRQ_ROUTE_ISA_LOC,           &pcmciaIrqRouteToIsaLocation, 0,
   PCMCIA_REGISTRY_DISABLE_ACPI_NAMESPACE_CHK,  &initDisableAcpiNameSpaceCheck, 0,
   PCMCIA_REGISTRY_DEFAULT_ROUTE_R2_TO_ISA,     &initDefaultRouteR2ToIsa,     0,
   PCMCIA_REGISTRY_CBMODEM_DELAY_VALUE,         &CBModemReadyDelay,           PCMCIA_DEFAULT_CB_MODEM_READY_DELAY,
   PCMCIA_REGISTRY_PCIC_MEMORY_WINDOW_DELAY,    &PcicMemoryWindowDelay,       PCMCIA_DEFAULT_PCIC_MEMORY_WINDOW_DELAY,
   PCMCIA_REGISTRY_PCIC_RESET_WIDTH_DELAY,      &PcicResetWidthDelay,         PCMCIA_DEFAULT_PCIC_RESET_WIDTH_DELAY,
   PCMCIA_REGISTRY_PCIC_RESET_SETUP_DELAY,      &PcicResetSetupDelay,         PCMCIA_DEFAULT_PCIC_RESET_SETUP_DELAY,
   PCMCIA_REGISTRY_CB_RESET_WIDTH_DELAY,        &CBResetWidthDelay,           PCMCIA_DEFAULT_CB_RESET_WIDTH_DELAY,
   PCMCIA_REGISTRY_CB_RESET_SETUP_DELAY,        &CBResetSetupDelay,           PCMCIA_DEFAULT_CB_RESET_SETUP_DELAY,
   PCMCIA_REGISTRY_CONTROLLER_POWERUP_DELAY,    &ControllerPowerUpDelay,      PCMCIA_DEFAULT_CONTROLLER_POWERUP_DELAY,
   PCMCIA_REGISTRY_EVENT_DPC_DELAY,             &EventDpcDelay,               PCMCIA_DEFAULT_EVENT_DPC_DELAY,
   PCMCIA_REGISTRY_REPORT_MTD0002_AS_ERROR,     &pcmciaReportMTD0002AsError,  1
};

ULONG GlobalInfoCount = sizeof(GlobalRegistryInfo) / sizeof(GLOBAL_REGISTRY_INFORMATION);

ULONG initSoundsEnabled;
ULONG initUsePolledCsc; 
ULONG initDisableAcpiNameSpaceCheck;
ULONG initDefaultRouteR2ToIsa;
//
// end of Init Data
//
#ifdef ALLOC_DATA_PRAGMA
#pragma data_seg ()
#endif


#ifdef ALLOC_DATA_PRAGMA
   #pragma data_seg()
#endif
//
// Non-Paged global variables
//

//
// List of FDOs managed by this driver
//
PDEVICE_OBJECT   FdoList;
//
// GLobal Flags
//
ULONG            PcmciaGlobalFlags = 0;
//
// Event used by PcmciaWait
//
KEVENT           PcmciaDelayTimerEvent;
//
// Objects used by PcmciaPlayTone
//

PPCMCIA_SOUND_EVENT PcmciaToneList;
KTIMER PcmciaToneTimer;
KDPC PcmciaToneDpc;
KSPIN_LOCK PcmciaToneLock;
KSPIN_LOCK PcmciaGlobalLock;
PPCMCIA_NTDETECT_DATA pNtDetectDataList = NULL;

ULONG PcicStallPower = PWRON_DELAY;

//
// Various values set by PcmciaLoadGlobalRegistryValues
//
ULONG PcicMemoryWindowDelay;
ULONG PcicResetWidthDelay;
ULONG PcicResetSetupDelay;
ULONG CBResetWidthDelay;
ULONG CBResetSetupDelay;
ULONG CBModemReadyDelay;
ULONG ControllerPowerUpDelay;
ULONG EventDpcDelay;
ULONG PcmciaPowerPolicy;
LONG PcmciaControllerDeviceWake;

ULONG globalOverrideIrqMask;   
ULONG globalFilterIrqMask;   
ULONG globalIoLow;              
ULONG globalIoHigh;             
ULONG globalReadyDelayIter;     
ULONG globalReadyStall;         
ULONG globalAttributeMemoryLow; 
ULONG globalAttributeMemoryHigh;
ULONG globalAttributeMemorySize;
ULONG pcmciaDisableIsaPciRouting; 
ULONG pcmciaIsaIrqRescanComplete; 
ULONG pcmciaIrqRouteToPciController;
ULONG pcmciaIrqRouteToIsaController;
ULONG pcmciaIrqRouteToPciLocation;
ULONG pcmciaIrqRouteToIsaLocation;
ULONG pcmciaReportMTD0002AsError;
#if DBG
ULONG PcmciaDebugMask;
#endif

#ifdef ALLOC_DATA_PRAGMA
   #pragma data_seg("PAGE")
#endif
//
// Paged const tables
//


const
PCI_CONTROLLER_INFORMATION PciControllerInformation[] = {

   // Vendor id                 Device Id                 Controller type
   // -------------------------------------------------------------------------------
   PCI_CIRRUSLOGIC_VENDORID, PCI_CLPD6729_DEVICEID,    PcmciaCLPD6729,     
   PCI_CIRRUSLOGIC_VENDORID, PCI_CLPD6832_DEVICEID,    PcmciaCLPD6832,     
   PCI_CIRRUSLOGIC_VENDORID, PCI_CLPD6834_DEVICEID,    PcmciaCLPD6834,     
   PCI_TI_VENDORID,          PCI_TI1031_DEVICEID,      PcmciaTI1031,       
   PCI_TI_VENDORID,          PCI_TI1130_DEVICEID,      PcmciaTI1130,       
   PCI_TI_VENDORID,          PCI_TI1131_DEVICEID,      PcmciaTI1131,       
   PCI_TI_VENDORID,          PCI_TI1250_DEVICEID,      PcmciaTI1250,       
   PCI_TI_VENDORID,          PCI_TI1220_DEVICEID,      PcmciaTI1220,       
   PCI_TI_VENDORID,          PCI_TI1251B_DEVICEID,     PcmciaTI1251B,      
   PCI_TI_VENDORID,          PCI_TI1450_DEVICEID,      PcmciaTI1450,       
   PCI_TOSHIBA_VENDORID,     PCI_TOPIC95_DEVICEID,     PcmciaTopic95,      
   PCI_RICOH_VENDORID,       PCI_RL5C465_DEVICEID,     PcmciaRL5C465,      
   PCI_RICOH_VENDORID,       PCI_RL5C466_DEVICEID,     PcmciaRL5C466,      
   PCI_RICOH_VENDORID,       PCI_RL5C475_DEVICEID,     PcmciaRL5C475,      
   PCI_RICOH_VENDORID,       PCI_RL5C476_DEVICEID,     PcmciaRL5C476,      
   PCI_RICOH_VENDORID,       PCI_RL5C478_DEVICEID,     PcmciaRL5C478,      
   PCI_DATABOOK_VENDORID,    PCI_DB87144_DEVICEID,     PcmciaDB87144,      
   PCI_OPTI_VENDORID,        PCI_OPTI82C814_DEVICEID,  PcmciaOpti82C814,   
   PCI_OPTI_VENDORID,        PCI_OPTI82C824_DEVICEID,  PcmciaOpti82C824,   
   PCI_TRIDENT_VENDORID,     PCI_TRID82C194_DEVICEID,  PcmciaTrid82C194,   
   PCI_NEC_VENDORID,         PCI_NEC66369_DEVICEID,    PcmciaNEC66369,     
   // --------------------------------------------------------------------
   // Additional database entries go above this line
   //
   PCI_INVALID_VENDORID,     0,                        0,                  
};

const
PCI_VENDOR_INFORMATION PciVendorInformation[] = {
   PCI_TI_VENDORID,           PcmciaTI,
   PCI_TOSHIBA_VENDORID,      PcmciaTopic,
   PCI_RICOH_VENDORID,        PcmciaRicoh,
   PCI_O2MICRO_VENDORID,      PcmciaO2Micro,
   PCI_NEC_VENDORID,          PcmciaNEC,
   PCI_DATABOOK_VENDORID,     PcmciaDatabook,
   PCI_OPTI_VENDORID,         PcmciaOpti,
   PCI_TRIDENT_VENDORID,      PcmciaTrid,
   PCI_INVALID_VENDORID,      0
};

const
DEVICE_DISPATCH_TABLE DeviceDispatchTable[] = {
   {PcmciaIntelCompatible, NULL,         PcicSetPower,  NULL,          NULL,       NULL},
   {PcmciaPciPcmciaBridge, NULL,         PcicSetPower,  NULL,          NULL,       NULL},
   {PcmciaElcController,   NULL,         PcicSetPower,  NULL,          NULL,       NULL},
                                                                      
   {PcmciaCardBusCompatible, NULL,       CBSetPower,    NULL,          NULL,       CBSetWindowPage},
   {PcmciaDatabook,   NULL,              TcicSetPower,  NULL,          NULL,       NULL},
   {PcmciaTI,         TIInitialize,      CBSetPower,    NULL,          TISetZV,    TISetWindowPage},
   {PcmciaCirrusLogic,CLInitialize,      CLSetPower,    NULL,          CLSetZV,    CBSetWindowPage},
   {PcmciaTopic,      TopicInitialize,   TopicSetPower, TopicSetAudio, TopicSetZV, CBSetWindowPage},
   {PcmciaRicoh,      RicohInitialize,   CBSetPower,    NULL,          RicohSetZV, CBSetWindowPage},
   {PcmciaDatabookCB, DBInitialize,      CBSetPower,    NULL,          DBSetZV,    CBSetWindowPage},
   {PcmciaOpti,       OptiInitialize,    OptiSetPower,  NULL,          OptiSetZV,  NULL},
   {PcmciaTrid,       NULL,              CBSetPower,    NULL,          NULL,       NULL},
   {PcmciaO2Micro,    O2MInitialize,     O2MSetPower,   NULL,          O2MSetZV,   CBSetWindowPage},
   {PcmciaNEC_98,     NULL,              PcicSetPower,  NULL,          NULL,       NULL},
   {PcmciaNEC,        NULL,              CBSetPower,    NULL,          NULL,       NULL},

   //------------------------------------------------------------------
   // Additional dispatch table entries go above this line
   //
   {PcmciaInvalidControllerClass,  NULL, NULL, NULL, NULL}
};

const
PCMCIA_ID_ENTRY PcmciaAdapterHardwareIds[] = {
   PcmciaIntelCompatible,       "*PNP0E00",
   PcmciaElcController,         "*PNP0E02",
   PcmciaDatabook,              "*DBK0000",
   PcmciaCLPD6729,              "*PNP0E01",
   PcmciaNEC98,                 "*nEC1E01",
   PcmciaNEC98102,              "*nEC8091",
   PcmciaInvalidControllerType,  0
};

const
PCMCIA_REGISTER_INIT PcicRegisterInitTable[] = {
   PCIC_INTERRUPT,            IGC_PCCARD_RESETLO,
   PCIC_CARD_CHANGE,          0x00,
   PCIC_CARD_INT_CONFIG,      0x00,
   PCIC_ADD_WIN_ENA,          0x00,
   PCIC_IO_CONTROL,           0x00,
   //
   // Init the 2 I/O windows
   //
   PCIC_IO_ADD0_STRT_L,       0x00,
   PCIC_IO_ADD0_STRT_H,       0x00,
   PCIC_IO_ADD0_STOP_L,       0x00,
   PCIC_IO_ADD0_STOP_H,       0x00,

   PCIC_IO_ADD1_STRT_L,       0x00,
   PCIC_IO_ADD1_STRT_H,       0x00,
   PCIC_IO_ADD1_STOP_L,       0x00,
   PCIC_IO_ADD1_STOP_H,       0x00,
   //
   // Init all 5 memory windows
   //
   PCIC_MEM_ADD0_STRT_L,      0xFF,
   PCIC_MEM_ADD0_STRT_H,      0x0F,
   PCIC_MEM_ADD0_STOP_L,      0xFF,
   PCIC_MEM_ADD0_STOP_H,      0x0F,
   PCIC_CRDMEM_OFF_ADD0_L,    0x00,
   PCIC_CRDMEM_OFF_ADD0_H,    0x00,

   PCIC_MEM_ADD1_STRT_L,      0xFF,
   PCIC_MEM_ADD1_STRT_H,      0x0F,
   PCIC_MEM_ADD1_STOP_L,      0xFF,
   PCIC_MEM_ADD1_STOP_H,      0x0F,
   PCIC_CRDMEM_OFF_ADD1_L,    0x00,
   PCIC_CRDMEM_OFF_ADD1_H,    0x00,

   PCIC_MEM_ADD2_STRT_L,      0xFF,
   PCIC_MEM_ADD2_STRT_H,      0x0F,
   PCIC_MEM_ADD2_STOP_L,      0xFF,
   PCIC_MEM_ADD2_STOP_H,      0x0F,
   PCIC_CRDMEM_OFF_ADD2_L,    0x00,
   PCIC_CRDMEM_OFF_ADD2_H,    0x00,

   PCIC_MEM_ADD3_STRT_L,      0xFF,
   PCIC_MEM_ADD3_STRT_H,      0x0F,
   PCIC_MEM_ADD3_STOP_L,      0xFF,
   PCIC_MEM_ADD3_STOP_H,      0x0F,
   PCIC_CRDMEM_OFF_ADD3_L,    0x00,
   PCIC_CRDMEM_OFF_ADD3_H,    0x00,

   PCIC_MEM_ADD4_STRT_L,      0xFF,
   PCIC_MEM_ADD4_STRT_H,      0x0F,
   PCIC_MEM_ADD4_STOP_L,      0xFF,
   PCIC_MEM_ADD4_STOP_H,      0x0F,
   PCIC_CRDMEM_OFF_ADD4_L,    0x00,
   PCIC_CRDMEM_OFF_ADD4_H,    0x00,
   //
   // Any other registers go here
   //
   0xFFFFFFFF,                0x00
};

#ifdef ALLOC_DATA_PRAGMA
   #pragma data_seg()
#endif
//
// Non-paged const tables
//

//
// This should be non-pageable since it is referenced by the
// Power management code - most of which runs at raised IRQL
// This represents the default set of registers that need to be
// saved/restored on a cardbus controller power-down/power-up
//

//
// Register context for the pcmcia controller
//
const
PCMCIA_CONTEXT_RANGE DefaultPciContextSave[] = {
   CFGSPACE_BRIDGE_CTRL,           2,
   CFGSPACE_LEGACY_MODE_BASE_ADDR, 4,
//   CFGSPACE_CB_LATENCY_TIMER, 1,
   0, 0
};

//
// cardbus socket registers required to be saved
//   
const
PCMCIA_CONTEXT_RANGE DefaultCardbusContextSave[] = {
   0, 0
};

//
// cardbus socket registers excluded from context save
//   
const
PCMCIA_CONTEXT_RANGE ExcludeCardbusContextRange[] = {
   CARDBUS_SOCKET_EVENT_REG,              0x4,
   CARDBUS_SOCKET_PRESENT_STATE_REG,      0xc,
   0, 0
};

//
// The following table defines any devices that need special
// attention during configuration. Note that values of 0xffff
// mean "don't care". The table is scanned until a match is made
// for the current device. 
//
// Values are:
//  validentry, devicetype, manufacturer, code, crc, configdelay1, configdelay2, configdelay3, configflags
//
// delay values are in milliseconds
//
const
PCMCIA_DEVICE_CONFIG_PARAMS DeviceConfigParams[] = {
   1, PCCARD_TYPE_MODEM,  0x109,  0x505, 0xD293,   3100,  900,    0, CONFIG_WORKER_APPLY_MODEM_HACK,  // motorola BitSurfr 56k
   1, PCCARD_TYPE_MODEM, 0xffff, 0xffff, 0xffff,      0, 1800,    0, 0,                               // any other modem
   1, PCCARD_TYPE_ATA,   0xffff, 0xffff, 0xffff,      0,    0, 2000, 0,                               // any ata device
   0
};