/*******************************************************************************
*                                                                 
* Program     : FarSync (generic)
*                                                                 
* File        : sdci.h
*                                                                 
* Description : This header file is based on the Equates and Structure Layouts 
*               page of the SDCI section of the July '99 MSDN
*                                                    
* Modifications
*
* Version 2.1.0  01Mar01  WEB  Add QuickStart and GetLinkInterface
* Version 2.2.0  18Jul01  WEB  Certification candidate
* Version 2.2.1  07Aug01  JPG  Add FarSyncReadSignals
* Version 2.2.2  03Sep01  WEB  Extend USERDPC definition to include indication
*                              param instead of bReadIR
*                22Oct01  MJD  Added Transparent Mode support - defined 
*                              LinkOption_Transparent
* Version 3.0.0  12Sep02  WEB  Add dma mode and cardinfoex support definitions
* Version 3.1.0  07Nov02  WEB  Add interrupt handshake mode support definitions
* Version 3.2.0  09Dec02  WEB  Add LinkOption_InvertRxClock
*                              Add ResetStats IOCTL and extended InterfaceRecord
*                              Complete CardInfoEx definition
* Version 3.3.0  30Apr04  WEB  Extend CardInfoEx to include physical + IO address
* Version 3.3.1  03Mar05  WEB  Removed SA_TxAbort which was previously incorrectly
*                              named 
* Version 4.0.1  03Mar05  WEB  Correct IOCTL_SDCI_xxx definitions. Now requires
*                              CTL_CODE to be defined i.e winioctl.h (user-mode) or
*                              wdm.h (kernel-mode) must be included before this file.
*                              Add USERDPC_INDICATION_TX, FarSyncSetUserDpcEx,
*                              IoctlCodeFarSyncSetPortConfig,
*                              IoctlCodeFarSyncGetPortConfig,
*                              IoctlCodeFarSyncSetSerialConfig,
*                              IoctlCodeFarSyncGetSerialConfig
*                              IoctlCodeFarSyncSetCTBusConfig &
*                              IoctlCodeFarSyncGetCTBusConfig
* Version 4.0.1.1 03Mar05 WEB  Update FS_XXX_CONFIG structures
* Version 4.0.1.2 04Mar05 WEB  Update error counter explanations,
*                              FarSync-specific error codes & further
*                              rationalisations
* Version 4.1.0.0 15Jun05 WEB  Add TE1 and additional T4E definitions
*                              Add monitoring IOCTLs
* Version 4.1.0.1 02Aug05 MJD  Added USERDPC_INDICATION_CLOCK_SWITCH_TO_PRIMARY
* Version 4.1.0.2 09Aug05 MJD  Update FS_CLOCKING_STATUS to include uCTAInUse so
*                              that apps can tell which CT Bus the hardware is 
*                              using in slave mode, structure version now 2. 
* Version 4.2.0   12Sep05 WEB  Add async and synth detection fields to 
*                              FSCARDINFOEX
*                              SA_RxFrameTooBig is now supported by M1P
*                              Add FS_ERROR_INVALID_LENGTH definition
*
*******************************************************************************/

#ifndef __SDCI_H_ 
#define __SDCI_H_

/*****************************************************************************/
//
// There are the IOCTL code values used to communicate with the SDCI driver.
//
/*****************************************************************************/

#define IOCTL_SDCI_SetEvent                        CTL_CODE(0, (0x410 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_SetLinkCharacteristics          CTL_CODE(0, (0x420 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_SetV24OutputStatus              CTL_CODE(0, (0x430 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_TransmitFrame                   CTL_CODE(0, (0x440 >> 2), METHOD_IN_DIRECT,  FILE_ANY_ACCESS)
#define IOCTL_SDCI_AbortTransmit                   CTL_CODE(0, (0x450 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_AbortReceiver                   CTL_CODE(0, (0x460 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_OffBoardLoad                    CTL_CODE(0, (0x470 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_GetV24Status                    CTL_CODE(0, (0x620 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_ReceiveFrame                    CTL_CODE(0, (0x630 >> 2), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReceiveFrame             CTL_CODE(0, (0x630 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_ReadInterfaceRecord             CTL_CODE(0, (0x640 >> 2), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadInterfaceRecord      CTL_CODE(0, (0x640 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadInterfaceRecordEx    CTL_CODE(0, (0x650 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetLinkInterface         CTL_CODE(0, (0x710 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetUserDpc               CTL_CODE(0, (0x720 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCardMode              CTL_CODE(0, (0x730 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadCardInfo             CTL_CODE(0, (0x740 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncQuickStart               CTL_CODE(0, (0x750 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetLinkInterface         CTL_CODE(0, (0x760 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadSignals              CTL_CODE(0, (0x770 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetDMAMode               CTL_CODE(0, (0x780 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetDMAMode               CTL_CODE(0, (0x790 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadCardInfoEx           CTL_CODE(0, (0x7a0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetHandShakeMode         CTL_CODE(0, (0x7b0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetHandShakeMode         CTL_CODE(0, (0x7c0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncResetStats               CTL_CODE(0, (0x7d0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncReadTE1Status            CTL_CODE(0, (0x7e0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetUserDpcEx             CTL_CODE(0, (0x7f0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetPortConfig            CTL_CODE(0, (0x810 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetPortConfig            CTL_CODE(0, (0x820 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetSerialConfig          CTL_CODE(0, (0x830 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetSerialConfig          CTL_CODE(0, (0x840 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCTBusConfig           CTL_CODE(0, (0x850 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetCTBusConfig           CTL_CODE(0, (0x860 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetTE1Config             CTL_CODE(0, (0x870 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetTE1Config             CTL_CODE(0, (0x880 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetCTBusBackupConfig     CTL_CODE(0, (0x890 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetCTBusBackupConfig     CTL_CODE(0, (0x8a0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetClockingStatus        CTL_CODE(0, (0x8b0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncSetMonitoring            CTL_CODE(0, (0x8c0 >> 2), METHOD_BUFFERED,   FILE_ANY_ACCESS)
#define IOCTL_SDCI_FarSyncGetMonitoringStatus      CTL_CODE(0, (0x8d0 >> 2), METHOD_NEITHER,    FILE_ANY_ACCESS)

#define IoctlCodeSetEvent                       IOCTL_SDCI_SetEvent
#define IoctlCodeSetLinkChar                    IOCTL_SDCI_SetLinkCharacteristics
#define IoctlCodeSetV24                         IOCTL_SDCI_SetV24OutputStatus
#define IoctlCodeTxFrame                        IOCTL_SDCI_TransmitFrame   
#define IoctlCodeAbortTransmit                  IOCTL_SDCI_AbortTransmit
#define IoctlCodeAbortReceiver                  IOCTL_SDCI_AbortReceiver
#define IoctlCodeOffBoardLoad                   IOCTL_SDCI_OffBoardLoad
#define IoctlCodeGetV24                         IOCTL_SDCI_GetV24Status
#define IoctlCodeRxFrame                        IOCTL_SDCI_ReceiveFrame   
#define IoctlCodeFarSyncRxFrame                 IOCTL_SDCI_FarSyncReceiveFrame
#define IoctlCodeReadInterfaceRecord            IOCTL_SDCI_ReadInterfaceRecord
#define IoctlCodeFarSyncReadInterfaceRecord     IOCTL_SDCI_FarSyncReadInterfaceRecord
#define IoctlCodeFarSyncReadInterfaceRecordEx   IOCTL_SDCI_FarSyncReadInterfaceRecordEx
#define IoctlCodeFarSyncSetLinkInterface        IOCTL_SDCI_FarSyncSetLinkInterface
#define IoctlCodeSetLinkInterface               IoctlCodeFarSyncSetLinkInterface
#define IoctlCodeFarSyncSetUserDpc              IOCTL_SDCI_FarSyncSetUserDpc
#define IoctlCodeFarSyncSetCardMode             IOCTL_SDCI_FarSyncSetCardMode
#define IoctlCodeFarSyncReadCardInfo            IOCTL_SDCI_FarSyncReadCardInfo
#define IoctlCodeFarSyncQuickStart              IOCTL_SDCI_FarSyncQuickStart
#define IoctlCodeFarSyncGetLinkInterface        IOCTL_SDCI_FarSyncGetLinkInterface
#define IoctlCodeFarSyncReadSignals             IOCTL_SDCI_FarSyncReadSignals
#define IoctlCodeFarSyncSetDMAMode              IOCTL_SDCI_FarSyncSetDMAMode
#define IoctlCodeFarSyncGetDMAMode              IOCTL_SDCI_FarSyncGetDMAMode
#define IoctlCodeFarSyncReadCardInfoEx          IOCTL_SDCI_FarSyncReadCardInfoEx
#define IoctlCodeFarSyncSetHandShakeMode        IOCTL_SDCI_FarSyncSetHandShakeMode
#define IoctlCodeFarSyncGetHandShakeMode        IOCTL_SDCI_FarSyncGetHandShakeMode
#define IoctlCodeFarSyncResetStats              IOCTL_SDCI_FarSyncResetStats
#define IoctlCodeFarSyncReadTE1Status           IOCTL_SDCI_FarSyncReadTE1Status
#define IoctlCodeFarSyncSetUserDpcEx            IOCTL_SDCI_FarSyncSetUserDpcEx
#define IoctlCodeFarSyncSetPortConfig           IOCTL_SDCI_FarSyncSetPortConfig
#define IoctlCodeFarSyncGetPortConfig           IOCTL_SDCI_FarSyncGetPortConfig
#define IoctlCodeFarSyncSetSerialConfig         IOCTL_SDCI_FarSyncSetSerialConfig
#define IoctlCodeFarSyncGetSerialConfig         IOCTL_SDCI_FarSyncGetSerialConfig
#define IoctlCodeFarSyncSetCTBusConfig          IOCTL_SDCI_FarSyncSetCTBusConfig
#define IoctlCodeFarSyncGetCTBusConfig          IOCTL_SDCI_FarSyncGetCTBusConfig
#define IoctlCodeFarSyncSetTE1Config            IOCTL_SDCI_FarSyncSetTE1Config
#define IoctlCodeFarSyncGetTE1Config            IOCTL_SDCI_FarSyncGetTE1Config
#define IoctlCodeFarSyncSetCTBusBackupConfig    IOCTL_SDCI_FarSyncSetCTBusBackupConfig
#define IoctlCodeFarSyncGetCTBusBackupConfig    IOCTL_SDCI_FarSyncGetCTBusBackupConfig
#define IoctlCodeFarSyncGetClockingStatus       IOCTL_SDCI_FarSyncGetClockingStatus
#define IoctlCodeFarSyncSetMonitoring           IOCTL_SDCI_FarSyncSetMonitoring
#define IoctlCodeFarSyncGetMonitoringStatus     IOCTL_SDCI_FarSyncGetMonitoringStatus

/*****************************************************************************/
/* Constants for the driver-specific IOCtl return codes.                     */
/*****************************************************************************/
#define CEDNODMA 0xff80     /* Warning (NO DMA!) from set link chrctrstcs    */
/*****************************************************************************/
/* Equates for the link options byte 1.                                      */
/*****************************************************************************/
#define CEL4WIRE 0x80
#define CELNRZI  0x40
#define CELPDPLX 0x20
#define CELSDPLX 0x10
#define CELCLOCK 0x08
#define CELDSRS  0x04
#define CELSTNBY 0x02
#define CELDMA   0x01

/*****************************************************************************/
/* Equates for the driver set link characteristics byte 1.                   */
/*****************************************************************************/
#define CED4WIRE 0x80
#define CEDNRZI  0x40
#define CEDHDLC  0x20
#define CEDFDPLX 0x10
#define CEDCLOCK 0x08
#define CEDDMA   0x04
#define CEDRSTAT 0x02
#define CEDCSTAT 0x01

/* Nicer names for NT-style code */

#define LinkOption_4Wire           CED4WIRE
#define LinkOption_InvertRxClock   CEDDMA
#define LinkOption_NRZI            CEDNRZI
#define LinkOption_HDLC            CEDHDLC
#define LinkOption_FullDuplex      CEDFDPLX
#define LinkOption_InternalClock   CEDCLOCK
#define LinkOption_DMA             CEDDMA
#define LinkOption_ResetStatistics CEDRSTAT
#define LinkOption_Transparent     CEDCSTAT

/*****************************************************************************/
/* Equates for the output V24 interface flags.                               */
/*****************************************************************************/
#define CED24RTS 0x01
#define CED24DTR 0x02
// #define CED24DRS 0x04- not used. 0x04 is instead used by DCD 
// i.e. when configured as an output - see below
#define CED24SLS 0x08
#define CED24TST 0x10

/* Nicer names for NT-style code */

#define IR_OV24RTS  CED24RTS
#define IR_OV24DTR  CED24DTR
//#define IR_OV24DSRS CED24DRS
#define IR_OV24SlSt CED24SLS
#define IR_OV24Test CED24TST


/*****************************************************************************/
/* Equates for the input V24 interface flags.                                */
/*****************************************************************************/
#define CED24CTS 0x01
#define CED24DSR 0x02
#define CED24DCD 0x04
#define CED24RI  0x08

// CEDCR indicates the presense of a generic carrier i.e. independent of port type
// e.g. DCD for V.25, CTS for X.21
#define CEDCR  0x10

 // Note: DCD can only be used as an output signal on a FarSync T4E
 // and only then if a FarSyncSetSerialConfig has been previously
 // issued for this port, with FsSerialConfig.uDCDOutput set to
 // TRUE

/* Nicer names for NT-style code */

#define IR_IV24CTS  CED24CTS
#define IR_IV24DSR  CED24DSR
#define IR_IV24DCD  CED24DCD
#define IR_IV24RI   CED24RI
#define IR_IV24Test 0x10


/*****************************************************************************/
/* Structure for the device driver interface record.                         */
/*****************************************************************************/

#define CEDSTCRC  0         /* Frames received with incorrect CRC            */
#define CEDSTOFL  1         /* Frames received longer than the maximum       */
#define CEDSTUFL  2         /* Frames received less than 4 octets long       */
#define CEDSTSPR  3         /* Frames received ending on a non-octet bndry   */
#define CEDSTABT  4         /* Aborted frames received                       */
#define CEDSTTXU  5         /* Transmitter interrupt underruns               */
#define CEDSTRXO  6         /* Receiver    interrupt overruns                */
#define CEDSTDCD  7         /* DCD (RLSD) lost during frame reception        */
#define CEDSTCTS  8         /* CTS lost while transmitting                   */
#define CEDSTDSR  9         /* DSR drops                                     */
#define CEDSTHDW 10         /* Hardware failures - adapter errors            */

#define CEDSTMAX 11

#define SA_CRC_Error       CEDSTCRC
#define SA_RxFrameTooBig   CEDSTOFL
#define SA_RxFrameTooShort CEDSTUFL
#define SA_Spare           CEDSTSPR
#define SA_RxAbort         CEDSTABT
#define SA_TxUnderrun      CEDSTTXU
#define SA_RxOverrun       CEDSTRXO
#define SA_DCDDrop         CEDSTDCD
#define SA_CTSDrop         CEDSTCTS
#define SA_DSRDrop         CEDSTDSR
#define SA_HardwareError   CEDSTHDW

// FarSync-specific counters mapped to existing SDCI definitions 
#define SA_FramingError       SA_Spare
#define SA_RxError            SA_HardwareError
#define SA_BufferUnavailable  SA_DCDDrop
#define SA_Parity             SA_CRC_Error

#define SA_Max_Stat        CEDSTMAX

// ****************************************************************************************************
// FarSync supports the following counters. All other counter indices are not used by FarSync.

// SA_CRC_Error       Sync & Async modes
// SA_FramingError    Sync & Async modes
// SA_RxOverrun       Sync & Async modes

// SA_RxAbort         (Async) & (M1P Sync) modes only
// SA_RxError         Sync mode only
// SA_TxUnderrun      Sync mode only
// SA_RxFrameTooShort M1P Sync mode only

// SA_RxFrameTooBig   Async mode (fifo overflow) & M1P Sync

//    Note that 
//      1) Async mode is currently only supported on the T4U - it is an optional extra feature
//      2) On a TxU an SA_RxError indicates a received abort OR a rx frame length error (too big OR too small)
//      3) On an M1P an SA_RxError indicates a alternative type of RxO as reported via SA_RxOverrun
// ****************************************************************************************************

/*****************************************************************************/
/* InterfaceRecord definition                                                */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeReadInterfaceRecord,                                           */
/*   IoctlCodeFarSyncReadInterfaceRecord                                     */
/*                                                                           */
/*****************************************************************************/
typedef struct _INTERFACE_RECORD
{
  int    RxFrameCount;   /* incremented after each frame rx'd */
  int    TxMaxFrSizeNow; /* max available frame size av. now  */
                         /* (changes after each Tx DevIoctl   */
                         /* to DD or after Tx completed)      */
  int    StatusCount;    /* How many status events have been  */
                         /* triggered.                        */
  UCHAR  V24In;          /* Last 'getv24 i/p' value got       */
  UCHAR  V24Out;         /* Last 'setv24 o/p' value set       */

/* The values for the indexes into the link statistics array of the */
/* various types of statistic. */

  int    StatusArray[SA_Max_Stat];

} IR, * PIR;

/*****************************************************************************/
/* InterfaceRecordEx definition                                              */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadInterfaceRecordEx                                   */
/*                                                                           */
/*****************************************************************************/
typedef struct _INTERFACE_RECORD_EX
{
  IR     InterfaceRecord;
  int    StatusCount;    /* How many status events have been  */
  ULONG  OpenedCount;
  ULONG  TxRequestCount;
  ULONG  TxCompleteCount;
  ULONG  RxPostedCount;
  ULONG  RxCompleteCount;
} IREX, * PIREX;

/*****************************************************************************/
/* Set link characteristics parameter block definition                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeSetLinkChar                                                    */
/*                                                                           */
/*****************************************************************************/
typedef struct  _SLPARMS
{
  int     SLFrameSize;            /* max frame size on link, should    */
                                  /* include 2-byte CRC - max is 8K    */
  LONG    SLDataRate;             /* not used by us - external clocks  */
  UCHAR   SLOurAddress1;          /* ) e.g C1/FF or 00/00 or 01/03     */
  UCHAR   SLOurAddress2;          /* )                                 */
  UCHAR   SLLinkOptionsByte;      /* see documentation & LinkOption_*  */
  UCHAR   SLSpare1;
} SLPARMS, *PSLPARMS;

/*****************************************************************************/
/* Set link interface parameter block definition                             */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetLinkInterface,                                       */
/*   IoctlCodeFarSyncGetLinkInterface                                        */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     /* Note: sizeof(FsLinkIfParms) is expected to be 0x10 */
typedef struct  _FSLINKIFPARMS
{
    HANDLE Context;       // context for completion routine - not used 
    USHORT MaxFrameSize;  // maximum frame size - not used
    USHORT Interface;     // line interface: 
    ULONG  BaudRate;      // baud rate
    UCHAR  Reserved;      // reserved
} FSLINKIFPARMS, * PFSLINKIFPARMS;
#pragma pack(pop)

// USER DPC DEFINITIONS - KERNEL-MODE ONLY

#define USERDPC_INDICATION_RX     0
#define USERDPC_INDICATION_SIGNAL 1
#define USERDPC_INDICATION_ERROR  2
#define USERDPC_INDICATION_TX     3 /* indicates that the number of tx buffers 
                                       in use by the card has changed - examine
                                       *pUserDpcTxBuffersInUse for the current value */

// FarSync T4E clock notifications
#define USERDPC_INDICATION_CLOCK_RATE_CHANGED        FS_INDICATION_CLOCK_RATE_CHANGED
#define USERDPC_INDICATION_CLOCK_OUT_OF_TOLERANCE1   FS_INDICATION_CLOCK_OUT_OF_TOLERANCE1
#define USERDPC_INDICATION_CLOCK_IN_TOLERANCE1       FS_INDICATION_CLOCK_IN_TOLERANCE1
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_BACKUP    FS_INDICATION_CLOCK_SWITCH_TO_BACKUP
#define USERDPC_INDICATION_CLOCK_OUT_OF_TOLERANCE2   FS_INDICATION_CLOCK_OUT_OF_TOLERANCE2
#define USERDPC_INDICATION_CLOCK_IN_TOLERANCE2       FS_INDICATION_CLOCK_IN_TOLERANCE2
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_OSC       FS_INDICATION_CLOCK_SWITCH_TO_OSC
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_CTA       FS_INDICATION_CLOCK_SWITCH_TO_CTA
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_CTB       FS_INDICATION_CLOCK_SWITCH_TO_CTB
#define USERDPC_INDICATION_CLOCK_SWITCH_TO_PRIMARY   FS_INDICATION_CLOCK_SWITCH_TO_PRIMARY

// user DPC callback - kernel mode only
typedef VOID (*USERDPC)(PVOID /* caller's handle*/, unsigned char /* indication */);  

/*****************************************************************************/
/* Set user dpc parameter block definition                                   */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetUserDpc      ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSUSERDPCINFO
{
  USERDPC fUserDpc;      // callback address
  PVOID   pUserDpcParam; // param to supply in callback
} FSUSERDPCINFO, * PFSUSERDPCINFO;

/*****************************************************************************/
/* Extended set user dpc parameter block definition                          */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetUserDpcEx    ,                                       */
/*                                                                           */
/* If used, this structure must be allocated in NonPaged memory.             */
/*                                                                           */
/*****************************************************************************/
typedef struct  _FSUSERDPCINFOEX
{
  FSUSERDPCINFO fUserDpcInfo;
  long *        pUserDpcTxBuffersInUse; // ref to a SDCI client-owned var that is used to maintain the number of tx buffers
                                        // currently in use by the card.
} FSUSERDPCINFOEX, * PFSUSERDPCINFOEX;
#pragma pack(pop)

/*****************************************************************************/
/* Card mode parameter block definition                                      */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetCardMode     ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDMODE
{
  BOOLEAN bIdentifyMode;
} FSCARDMODE, * PFSCARDMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Card info parameter block definition                                      */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadCardInfo    ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDINFO
{
  #define FSCARDINFO_VERSION  1
  #define SERIAL_NO_LENGTH    8

  ULONG  uVersion;       // Version of this structure
  USHORT uDeviceId;
  USHORT uSubSystemId;
  ULONG  uNumberOfPorts;
  char   szSerialNo[SERIAL_NO_LENGTH+1];
  ULONG  uMajorRevision;
  ULONG  uMinorRevision;
  ULONG  uBuildState;
  ULONG  uCPUSpeed;
  ULONG  uMode;
} FSCARDINFO, * PFSCARDINFO;
#pragma pack(pop)

/*****************************************************************************/
/* DMA mode parameter block definition                                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetDMAMode,                                             */   
/*   IoctlCodeFarSyncGetDMAMode    ,                                         */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSDMAMODE
{
  #define FSDMAMODE_VERSION       1
  #define FSDMAMODE_OFF           1
  #define FSDMAMODE_ON            2
  #define FSDMAMODE_INTERMEDIATE  3 // use for processing rxs via intermediate buffer

  ULONG  uVersion;       // Version of this structure
  USHORT uTxDMAMode;
  USHORT uRxDMAMode;
} FSDMAMODE, * PFSDMAMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Interrupt handshake mode parameter block definition                       */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetHandShakeMode,                                       */   
/*   IoctlCodeFarSyncGetHandShakeMode                                        */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSHANDSHAKEMODE
{
  #define FSHANDSHAKEMODE_VERSION       1
  #define FSHANDSHAKEMODE_2             2
  #define FSHANDSHAKEMODE_3             3

  ULONG  uVersion;       // Version of this structure
  USHORT uMode;
} FSHANDSHAKEMODE, * PFSHANDSHAKEMODE;
#pragma pack(pop)

/*****************************************************************************/
/* Extended card info parameter block definition                             */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncReadCardInfoEx  ,                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FSCARDINFOEX
{
  #define FSCARDINFOEX_VERSION  2

  ULONG  uVersion;           // Version of this structure

  char   szDeviceName[32+8]; // Including aligned PADDING to allow for null-terminator
  PVOID  w_memory;           // Virtual addresses of Adapter Resources
  PVOID  w_controlSpace;     
  PVOID  w_localCfg;         
  PVOID  w_ioSpace;
  ULONG  z_memory;           // Lengths of Adapter Resources
  ULONG  z_controlSpace;     
  ULONG  z_localCfg;         
  ULONG  z_ioSpace;

  ULONG  uHiVersion;  
  ULONG  uLoVersion;

  ULONG  uReservedA[30]; // these are reserved for FarSite's own use

  PVOID  p_memory;       // physical address of window - T-Series cards 
  PVOID  p_io;           // main IO address of card
  ULONG  uExtendedClockingSupported; // are (T4E) clock synths available on the card?
  ULONG  uAsyncSupported;  // does the card support async
  ULONG  uReservedB[28];   // these are currently unused

} FSCARDINFOEX, * PFSCARDINFOEX;
#pragma pack(pop)

/*****************************************************************************/
/* Port config parameter block definition                                    */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetPortConfig,                                          */   
/*   IoctlCodeFarSyncGetPortConfig                                           */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_PORT_CONFIG
{
  #define FSPORTCONFIG_VERSION       2

  ULONG  uVersion;              // Version of this structure
  ULONG  uPortTxNumBuffers;     // 2,4,8,16,32,64,128
  ULONG  uPortRxNumBuffers;     // 2,4,8,16,32,64,128
	ULONG  uPortTxBufferLength;   // Min=2 Max=64*1024 Def= 8*1024
	ULONG  uPortRxBufferLength;   // Min=2 Max=64*1024 Def= 8*1024
  ULONG  uPortTxDMA;            // See fscfg.h for values i.e. FSDMAMODE_OFF=1, FSDMAMODE_ON=2
  ULONG  uPortRxDMA;            // See fscfg.h for values i.e. FSDMAMODE_OFF=1, FSDMAMODE_ON=2
  ULONG  uPortStartTxRx;        // See smcuser.h for values i.e. START_TX=1 | START_RX=2
  ULONG  uPortClockSource;      // See smcuser.h for values i.e. FS_CLOCK_REFERENCE_xxx
                                // Currently only supported on T4E
  ULONG  uPortTxMSB;            // FALSE ==> LSB (Default)
  ULONG  uPortRxMSB;            // FALSE ==> LSB (Default)
  ULONG  uPortMaxTxsOutstanding;// read-only - indicates how many txs can be outstanding at a time
  ULONG  uReserved[52];
} FS_PORT_CONFIG, *PFS_PORT_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* Serial config parameter block definition                                  */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetSerialConfig,                                        */   
/*   IoctlCodeFarSyncGetSerialConfig                                         */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_SERIAL_CONFIG
{
  #define FSSERIALCONFIG_VERSION   2

  ULONG  uVersion;              // Version of this structure
  ULONG  uPortInterface;        // See fscfg.h for values e.g. FS_LINE_INTERFACE_X21
  ULONG  uPortRate;
  ULONG  uPortClocking;         // See fscfg.h for values e.g. FS_LINE_CLOCKING_INTERNAL
	ULONG  uPortTransparentMode;  // HDLC=0 Transparent=1
  ULONG  uPortInvertRxClock;    // TRUE(1) or FALSE(0)
  ULONG  uPortEncoding;         // See fscfg for values i.e. FS_PORT_ENCODING_xxx
                                // Currently only supported on M1P

  // The following fields have been added in Version 2 of this structure and not be
  // processed if uVersion = 1
  ULONG  uExtendedClocking; // subsequent fields only used if this is TRUE
  ULONG  uInternalTxClock;  
  ULONG  uInternalRxClock;  
  ULONG  uTerminalTxClock;  
  ULONG  uTerminalRxClock;  
  ULONG  uDCDOutput;        // TRUE => DCD is an output

  ULONG  uEstimatedLineSpeed; // returned by FarSyncGetSerialConfig for T4E only

  ULONG  uReserved[54];
} FS_SERIAL_CONFIG, *PFS_SERIAL_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* CTBus config parameter block definition                                   */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncSetCTBusConfig                                          */   
/*   IoctlCodeFarSyncGetCTBusConfig                                          */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_CT_BUS_CONFIG
{
  #define FSCTBUSCONFIG_VERSION       2

  ULONG  uVersion;     // Version of this structure
  ULONG  uCTBusMode;   // See smcuser.h for values i.e. FS_CT_BUS_MODE_xxx
  ULONG  uCTBusFeed;   // See smcuser.h for values i.e. FS_CT_BUS_FEED_xxx
  ULONG  uFallback;    // TRUE=>auto switch if clock ref fails
  ULONG  uReserved[60];
} FS_CT_BUS_CONFIG, *PFS_CT_BUS_CONFIG;
#pragma pack(pop)

/*****************************************************************************/
/* Clocking Status block definition                                          */
/*                                                                           */
/* For use with:                                                             */
/*                                                                           */
/*   IoctlCodeFarSyncGetClockingStatus                                       */
/*                                                                           */
/*****************************************************************************/
#pragma pack(push, 4)     
typedef struct  _FS_CLOCKING_STATUS
{
  #define FSCLOCKINGSTATUS_VERSION       2

  ULONG  uVersion;               // Version of this structure
  ULONG  uPrimaryClockStatus;    // 0=out-of-tolerance, 1=good
  ULONG  uBackupClockStatus;     // 0=out-of-tolerance, 1=good
  ULONG  uCurrentConfigReference; // See smcuser.h for values i.e. FS_CT_CONFIG_xxx
  ULONG  uCTAStatus;             // 0=out-of-tolerance, 1=good
  ULONG  uCTBStatus;             // 0=out-of-tolerance, 1=good
  USHORT uCurrentStatusSummary;  // bit map status word describing clocking state/config
                                 // see smcuser.h for bit definitions
  USHORT uReserved1;
  ULONG  uCTAInUse;              // 0=CTB, 1=CTA - shows which CT Bus the card
                                 // has selected for the slave clock source
  ULONG  uReserved2[15]; 
} FS_CLOCKING_STATUS, *PFS_CLOCKING_STATUS;
#pragma pack(pop)

//######################################################################################################
//
// FarSync Error Return Codes
//
// These return codes will be passed back from the FarSync SDCI driver in the IoStatus.Status field of 
// the IRP and (if the SDCI client is a user-mode app) will be passed through transparently to the app 
// via GetLastError().
//

#define FS_ERROR_INVALID_INPUT_BUFFER_LENGTH  0xE0000001
#define FS_ERROR_INVALID_OUTPUT_BUFFER_LENGTH 0xE0000002
#define FS_ERROR_PRIMARY_IOCTL                0xE0000003
#define FS_ERROR_CARD_NOT_STARTED             0xE0000004
#define FS_ERROR_INVALID_CT_BUS_MODE          0xE0000005
#define FS_ERROR_INVALID_CT_BUS_FEED          0xE0000006
#define FS_ERROR_INVALID_IOCTL_FOR_PORTTYPE   0xE0000007
#define FS_ERROR_INVALID_LENGTH               0xE0000008

//######################################################################################################



#endif /* __SDCI_H_ */