
/* NT IBM SDLC Adapter Device Driver: Device Objects */


/*       Resource Type equates */

#define GRABBEDRESOURCE_GOTDMA        0x04

//#############################################################################

/*****************************************************************************/
/* Config data record                                                        */
/*****************************************************************************/

typedef enum           _ADAPTER_TYPE
{
                        AT_NONE  = -1,
                        AT_SDLC  = 0,
                        AT_MPCA1 = 2,
                        AT_MPCA2 = 3,
                        AT_MPAA1 = 4,
                        AT_MPAA2 = 5,
                        AT_COUNT = 6
}
                        ADAPTER_TYPE;

typedef struct         _CONFIGDATA
{
  ADAPTER_TYPE          AdapterType;
  char *                FlavourName;
  IO_ADDRESS            AdapterBaseAddress;
                        /* bottom byte (& 0xFF) can be used as an identifier */
  UCHAR                 MPAAAdapterIdentifier;  /* as set in MCA POS register*/
  UCHAR                 DMAChannel;         /* set by GetConfigData          */
  IO_ADDRESS            MPCAModePort;
  UCHAR                 MPCAModeValue;
  ULONG                 AddressSpace;
  ULONG                 BusNumber;
  KIRQL                 Irql;
  CCHAR                 Vector;
  BOOLEAN               Shareable;          /* we share internally, not viaNT*/
  KINTERRUPT_MODE       InterruptMode;
  KIRQL                 Irql2;
  CCHAR                 Vector2;
  BOOLEAN               Shareable2;
  KINTERRUPT_MODE       InterruptMode2;
}                       CONFIGDATA,
                     * PCONFIGDATA;

#define IRQ3 (KIRQL)((CCHAR)HIGH_LEVEL - 3)
#define IRQ4 (KIRQL)((CCHAR)HIGH_LEVEL - 4)

/*****************************************************************************/
/* The Device object - one per adapter.                                      */
/*****************************************************************************/

typedef struct         _IBMSYNC_DEVICE_EXTENSION
{
  PDEVICE_OBJECT     pDeviceObject;     /* backpointer from extn -> DeviceObj*/
#ifdef IBMSYNC_TRACE
  TRC_NAME            Name;
#endif
  BOOLean             DeviceIsOpen;     /* true after successful OpenCreate  */
                                        /* 'device' is NT object             */
  BOOLean             AdapterIsClosing; /* 'adapter' is the card.  When this */
                                        /* is set, ignore interrupts         */
  PIRP                IoctlCurrentIrp;  /* Pass pIrp to Ioctl routines becos */
                                        /* some are exec'd via KeSynchrExec  */
                                        /* which can only pass pDX.          */
  PKEVENT            pUserEvent;        /* user's event from SetSemaphoreH   */
  BOOLean             HardwareError;    /* if set, fatal hardware error -    */
                                        /* e.g. WAITUNTIL timed out          */
                                        /* picked up @ end of EntryPtIoctl   */
                                        /* Reset by AdapterReset             */
  ULONG               Information;      /* If a synchronized routine wants to*/
                                        /* return an error status, it can't  */
                                        /* do it directly because synchnr.   */
                                        /* routines return a boolean only.   */
                                        /* Therefore return a failure        */
                                        /* indication and set the IoStatus.  */
                                        /* Information value in here.        */
                                        /* Also used to return frame length  */
                                        /* for IoctlRxFrame.                 */
  NTSTATUS            IoctlRetStatus;   /* Set by Ioctl handlers to return   */
                                        /* Ioctl statuses.                   */
  int                 LinkMaxFrameSize; /* as set by user in Set Link Charcts*/
                                        /* = max size allowed on this link   */

  PIR                pIR;               /* pointer to user interface record  */
  IR                  OurIR;            /* dummy IR for initialisation!      */
// /*IRMdl?*/   PMDL pIRMdl;            /* the IR that maps the interface rec*/
                                        /* This is set up when the user calls*/
                                        /* IoctlSetInterfaceRecord and relea-*/
                                        /* sed when IoctlClose               */
  CONFIGDATA          ConfigData;       /* copied from static configdata at  */
                                        /* start of day                      */
#define ADAPTERBASE ConfigData.AdapterBaseAddress
  int                 DPCAction;        /* Set by interrupt routines to reqst*/
                                        /* actions by DPC routine.  If this  */
                                        /* is non-0, the exit from the       */
                                        /* interrupt routine requests a DPC. */
                                        /* The DPC routine resets it.        */
#define DPC_ACTION_PULSE    1

  PKINTERRUPT         Interrupt;        /* standard interrupt (#1)           */
  PKINTERRUPT         Interrupt2;       /* alternate interrupt (#2)          */

  // send buffer stuff

  UCHAR            * pSendBuf;
#define               SENDBUF_SIZE 3000 /* as used by OS2 driver             */
                                        /* allows 2*1024 x.25 frames + some  */
  PMDL               pSendMdl;
  PHYSICAL_ADDRESS    SendBufPhysAddr;
  USHORT              TxConsecutiveUnderrunCount;
  int                 TxFSMCurState;
  USHORT              TxNextToBuffer;    /* index into pSendbuf.             */
  USHORT              TxNextToTransmit;  /* index into pSendbuf.             */
  UCHAR             *pTxPIOData;         /* pointer                          */
  UCHAR               TxResult;          /* only 1 Tx result byte from 8273  */
  USHORT              TxStartUnusedArea;

  /***************************************************************************/
  /* Ok - what the heck is TxStartUnusedArea? (I hear you cry).              */
  /*                                                                         */
  /* When we start putting stuff into the buffer, we can put and get right   */
  /* up to the end.  When the Put side wraps round, there will be some slop  */
  /* at the end - from the end of the last buffered tx frame to the real end */
  /* of the buffer.  This is then used by the Get side: we keep getting      */
  /* Tx Frames out of the buffer until the next one would be past the        */
  /* TxStartUnusedArea.  Once this occurs, we move the TxStartUnusedArea out */
  /* to the BUFFER_SIZE again - the Put side is now restricted by this rather*/
  /* than by TxNextToTransmit.                                               */
  /*                                                                         */
  /***************************************************************************/

  // receive buffer stuff

  RCVINFO             RcvInfo;          /* see rb.h for RCVINFO              */
  int                 RxFSMCurState;
  UCHAR             *pRxPIOData;
  short               RxResultCount;
  UCHAR               RxResultBuffer[8];/* RxResult bytes read from RxRes reg*/
  UCHAR               OurAddress1;      /* user's address values held here   */
  UCHAR               OurAddress2;

  UCHAR               LinkOptionsByte;  /* user's link options are held here */
                                        /* the bits in this byte have the    */
                                        /* same meaning as defined for the   */
                                        /* SLLinkOptionsByte in ui.h         */
  UCHAR               GrabbedResources;
  BOOLEAN             DMAIsActive;

  UCHAR               CmdStringReadPortA[2];
  UCHAR               CmdStringResetOpMode[3];
  UCHAR               CmdStringResetSerialIOMode[3];
  UCHAR               CmdStringSetOpMode[3];
  UCHAR               CmdStringSetSerialIOMode[3];
  UCHAR               CmdStringDataTransferMode[3];

  UCHAR               CmdStringResetPortB[3];
  UCHAR               CmdStringSetPortB[3];

  UCHAR               CmdStringReceive[6];
  UCHAR               CmdStringTransmit[6];
  UCHAR               CmdStringAbortTransmit[2];
  UCHAR               CmdStringDisableReceiver[2];

  UCHAR               LastPortA;        /* see GetV24Input/Write8273Cmd      */
  BOOLean             PowerFailed;
}
                      IBMSYNC_DEVICE_EXTENSION,
                     *PDX;              /* pDX normal name for extension ptr */

#define INIT_MAXFRSIZENOW  CAST((SENDBUF_SIZE-8) / 2, USHORT)
                                        /* -8 allows for record lengths/safty*/
