#ifndef __PCICC32_DRV_H__
 
#define __PCICC32_DRV_H__
 
//-------------------------------------------------------------------------
 
// WINNT driver for PCICC32 interface from ARW Elektronik, Germany ---------
 
// the main header file of the driver
 
//
 
// (c) 1999 ARW Elektronik
 
//
 
// this source code is published under GPL (Open Source). You can use, redistribute and 
 
// modify it unless this header   is not modified or deleted. No warranty is given that 
 
// this software will work like expected.
 
// This product is not authorized for use as critical component in life support systems
 
// wihout the express written approval of ARW Elektronik Germany.
 
//
 
// Please announce changes and hints to ARW Elektronik
 
//
 
// what                                            who          when
 
// started                                         AR           10.03.2000
 
// dwIrqStatus added, version 2                    AR           24.02.2001
 
// with AUTOREAD, version 2.01                     AR           17.03.2001
 
// with support for LCR_READ, version 2.02         AR           31.03.2001
 
// changed to VisualStudio 6.0                     AR           30.09.2001
 
// compiled with DDK 1/2001                        AR           20.11.2001
 
// removed alloc_text cause of WIN2000 problems    AR           25.11.2001
 
// version 2.7 released                            AR           25.11.2001
 
// version 2.8 still experimental                  AR           26.05.2002
 
// version 2.16 eliminates PLXBUG in WIN2000       AR           05.06.2002
 
// version 2.17 added KeSynchronizeExecution       AR           16.06.2002
 
// version 2.18 improved snchronisation            AR           18.06.2002
 
//
 
 
 
//-------------------------------------------------------------------------
 
#define DRIVER_VERSION ((2 << 16) | 18) // the only place for version info
 
#define DRIVER_VARIANT 0                // mark customisation here
 
//-------------------------------------------------------------------------
 
 
 
//-------------------------------------------------------------------------
 
// precautions for debug compile
 
#define PCICC32_DEBUG
 
 
 
#ifndef PCICC32_DEBUG
 
#ifdef  KdPrint
 
#undef  KdPrint
 
#define KdPrint(x) /* x */
 
#endif
 
#endif
 
//-------------------------------------------------------------------------
 
 
 
//-------------------------------------------------------------------------
 
// INCLUDES
 
//
 
#define PCI_MAX_BUSES     4   // buses to search for pciada
 
 
 
#define PCICC32_MAX_PCIADA 4  // maximum of PCIADA to search for  
 
#define PCICC32_MAX_CC32  16  // maximum number of CC32 modules connected
 
 
 
//-------------------------------------------------------------------------
 
// DEFINES
 
//
 
#define PCICC32_VENDOR_ID  0x10B5  
 
#define PCICC32_DEVICE_ID  0x2258
 
#define PCICC32_SUBSYS_ID  0x2258
 
#define PCICC32_SUBVEN_ID  0x9050
 
 
 
#define LCR_SPACE         256    // space in bytes of LCR
 
#define IFR_SPACE         32768  // space in bytes of IFR
 
 
 
//----------------------------------------------------------------------------------------
 
// macros for simple address calculation
 
//
 
#define _WORD_NAF(base, n, a, f)  ((USHORT *)((ULONG)base + (n << 10) + (a << 6) + ((f & 0xf) << 2)))
 
#define _DWORD_NAF(base, n, a, f) ((ULONG  *)((ULONG)base + (n << 10) + (a << 6) + ((f & 0xf) << 2)))
 
 
 
//-------------------------------------------------------------------------
 
// TYPEDEFS
 
//
 
typedef struct _FILE_OBJ
 
{
 
        USHORT uwAssociatedCC32;                   // which CC32 number it belongs
 
        USHORT wAccessType;                // WORD or LONGWORD
 
        USHORT wBlockTransfer;             // != 0 for block transfer
 
        void   (*fRead)(void *to,  void *from); // resulting read
 
        void   (*fWrite)(void *to, void *from); // resulting write
 
        PIRP              blockingIrp;     // if != 0 then a blocking IRP is waiting
 
} FILE_OBJ, *PFILE_OBJ;
 
 
 
typedef struct
 
{
 
        int               Bus;             // bus number of pciada
 
        PCI_SLOT_NUMBER   Slot;            // slot + function number encoded
 
        PCI_COMMON_CONFIG PCIDevice;       // content of pcr, only for direct HW related functions
 
 
 
    PHYSICAL_ADDRESS  pvPhysLcr;       // local config register, unmapped and mapped
 
        PHYSICAL_ADDRESS  pvPhysIfr;       // interface registers, unmapped and mapped
 
        PVOID             pvVirtLcr;       // virtual LCR space
 
        PVOID             pvVirtIfr;       // virtual IFR space
 
 
 
        PKINTERRUPT       InterruptObject; // points to the associated interrupt obj
 
        KIRQL                     Irql;                    // virtual Irq level, unmapped and mapped
 
        ULONG                     Vector;              // mapped system vector, unmapped and mapped
 
        KAFFINITY                 Affinity;        // which processor uses this irq, unmapped and mapped
 
 
 
        PUSHORT           pwCntrl;         // LCR Cntrl Offset @ LCR + 0x50
 
        PUSHORT           pwIntCSR;        // LCR IntCSR Offset @ LCR + 0x4C
 
 
 
        ULONG                     dwLinkCount;     // how often this interface is requested
 
    BOOLEAN                       bConnected;      // CC32 is connected and powered
 
        USHORT                    wModuleNumber;   // Number (Jumper) of CC32
 
        USHORT                    wFPGAVersion;    // Revision of (CC32) FPGA
 
        USHORT                    wModuleType;     // Type of (CC32) module
 
 
 
        KDPC              kDPCobj;         // custom DPC object for irq tunneling
 
 
 
        ULONG             dwIrqStatus;     // the last unrequested status of a interrupt
 
        PIRP              *pBlockingIrp;   // points to File or == NULL when no blocking in progress 
 
 
 
        FILE_OBJ          *pIrqControlFile; // this file controls the global enable / disable IRQ
 
} PCIADA; 
 
 
 
typedef struct _DEVICE_EXT 
 
{
 
        PDEVICE_OBJECT DeviceObject;       // points to myself and carries the pointer to DriverObject
 
        PIRP actualIrp;                                    // points to .. 
 
 
 
        int    nPCIADAs;                   // how many PCIADAs are found
 
 
 
        PCIADA pciada[PCICC32_MAX_PCIADA]; // for each PCIADA a descriptor 
 
 
 
        PCIADA *cc32[PCICC32_MAX_CC32];    // points to PCIADA to which it belongs
 
 
 
        int    nInitState;                 // tracks the state of initialisation
 
} DEVICE_EXT;
 
 
 
 
 
// Prototypes to support following pragmas
 
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObj, PUNICODE_STRING regPath);
 
NTSTATUS PCICC32Open(PDEVICE_OBJECT deviceObj, PIRP irp);
 
NTSTATUS PCICC32Close(PDEVICE_OBJECT deviceObj, PIRP irp);
 
VOID     PCICC32Unload(PDRIVER_OBJECT driverObj);
 
NTSTATUS SearchDevices(PDEVICE_OBJECT device_Obj);
 
NTSTATUS PLX9050BugFix(PDEVICE_OBJECT deviceObj);
 
NTSTATUS PCICC32ReserveResources(PDEVICE_OBJECT device_Obj);
 
NTSTATUS PCICC32ExtractResources(PCIADA *pciada, PCM_RESOURCE_LIST pList); 
 
NTSTATUS PCICC32FreeResources(PDEVICE_OBJECT device_Obj);
 
NTSTATUS PCICC32TranslateBusAddress(PDEVICE_OBJECT device_Obj);
 
NTSTATUS PCICC32MapIOspace(PDEVICE_OBJECT device_object);
 
VOID     PCICC32SoftInit(PDEVICE_OBJECT device_Obj);
 
NTSTATUS InitializeCustomDPCObjects(PDEVICE_OBJECT device_object);
 
 
 
/* release all this procedures after init of the driver */
 
#ifdef ALLOC_PRAGMA
 
#pragma alloc_text (init, DriverEntry)
 
#pragma alloc_text (init, SearchDevices)
 
#pragma alloc_text (init, PLX9050BugFix)
 
#pragma alloc_text (init, PCICC32ReserveResources)
 
#pragma alloc_text (init, PCICC32ExtractResources)
 
#pragma alloc_text (init, PCICC32TranslateBusAddress)
 
#pragma alloc_text (init, PCICC32MapIOspace)
 
#pragma alloc_text (init, PCICC32SoftInit) 
 
#pragma alloc_text (init, InitializeCustomDPCObjects) 
 
#endif
 
 
 
/* put all this procedures in the paged memory-pool, all called at passiv Level */
 
#ifdef ALLOC_PRAGMA
 
#pragma alloc_text (page, PCICC32Open)
 
#pragma alloc_text (page, PCICC32Close)
 
#pragma alloc_text (page, PCICC32Unload)
 
#pragma alloc_text (page, PCICC32FreeResources)
 
#endif
 
 
 
#endif // __PCICC32_DRV_H__