I/O Request Block - C Definitions

From EDM2
Jump to: navigation, search
Storage Device Driver Reference
  1. About This Book
  2. Introduction to DASD, SCSI, and CD-ROM Programming Interfaces
  3. Installation of OS/2, DASD, SCSI, and CD-ROM Device Drivers
  4. Adapter Device Driver Development Considerations
  5. DASD, SCSI, and CD-ROM Device Manager Interface Specification
  6. Error Handling
  7. Adapter Device Driver Command-Line Parameters
  8. DASD IOCtl Device Driver Test Tool
  9. Optical IOCtl Device Driver Test Tool
  10. Using Filter Device Drivers
  11. Library and Services
  12. CD-ROM Device Manager Interface Specification
  13. CD-ROM Device Driver Test Tool
  14. Building an OS/2 Virtual Disk Driver
  15. OS2DASD.DMD - Technical Reference
  16. Boot Record Architecture
  17. Extended Device Driver Interface Specification
  18. I/O Request Block - C Definitions
  19. OS/2 SCSI Device Driver Interface Specification
  20. Advanced SCSI Programming Interface (ASPI) OS/2 Specification
  21. Adapter Device Driver Interface Questions and Answers
  22. Device Driver Test Tool (DDTT)
  23. Glossary

Reprint Courtesy of International Business Machines Corporation, © International Business Machines Corporation

Following are the I/O request block C language definitions for ADD device support.

/*static char *SCCSID = "@(#)iorb.h     6.2 92/02/20";*/
/****************************************************************************/
/* I/O Request Block (IORB) Structures                                      */
/****************************************************************************/

/* ASM

       Resolve H2INC references for .INC version of file

       include  iorbtype.inc
*/

/* Typedefs to resolve forward references                                   */
typedef struct _IORBH         IORBH;
typedef struct _IORBH         FAR *PIORBH;
typedef struct _IORBH         *NPIORBH;
typedef struct _IORBH         FAR *PIORB;
typedef struct _IORBH         *NPIORB;

typedef struct _DEVICETABLE   DEVICETABLE;
typedef struct _DEVICETABLE   FAR *PDEVICETABLE;
typedef struct _DEVICETABLE   *NPDEVICETABLE;

typedef struct _UNITINFO      UNITINFO;
typedef struct _UNITINFO      FAR *PUNITINFO;
typedef struct _UNITINFO      *NPUNITINFO;

typedef struct _ADAPTERINFO   ADAPTERINFO;
typedef struct _ADAPTERINFO   FAR *PADAPTERINFO;
typedef struct _ADAPTERINFO   *NPADAPTERINFO;

typedef struct _GEOMETRY      GEOMETRY;
typedef struct _GEOMETRY      FAR *PGEOMETRY;
typedef struct _GEOMETRY      *NPGEOMETRY;

typedef struct _SCATGATENTRY  SCATGATENTRY;
typedef struct _SCATGATENTRY  FAR *PSCATGATENTRY;
typedef struct _SCATGATENTRY  *NPSCATGATENTRY;

/*--------------------------------------------------------------------------*/
/* Interface for calling ADD entry point                                    */
/*--------------------------------------------------------------------------*/
/* VOID FAR *(ADDEP) (PIORBH);                                              */

/*--------------------------------------------------------------------------*/
/* IORB Header                                                              */
/*--------------------------------------------------------------------------*/

#define DM_WORKSPACE_SIZE       20
#define ADD_WORKSPACE_SIZE      16

typedef struct _IORBH   {             /* IOH                                */

USHORT        Length;                 /* IORB length                        */
USHORT        UnitHandle;             /* Unit identifier                    */
USHORT        CommandCode;            /* Command code                       */
USHORT        CommandModifier;        /* Command modifier                   */
USHORT        RequestControl;         /* Request control flags              */
USHORT        Status;                 /* Status                             */
USHORT        ErrorCode;              /* Error code                         */
ULONG         Timeout;                /* Cmd completion timeout(s)          */
USHORT        StatusBlockLen;         /* Status block length                */
NPBYTE        pStatusBlock;           /* Status block                       */
USHORT        Reserved_1;             /* Reserved, MBZ                      */
PIORB         pNxtIORB;               /* Pointer to next IORB               */
PIORB         (FAR *NotifyAddress)(PIORB); /* Notification address          */
UCHAR         DMWorkSpace[DM_WORKSPACE_SIZE];   /* For use by DM            */
UCHAR         ADDWorkSpace[ADD_WORKSPACE_SIZE]; /* For use by ADD           */

} IORBH;
/*--------------------------------------------------------------------------*/
/* IORB CommandCode and CommandModifier Codes                               */
/*      Note:  CommandCodes are prefixed by IOCC and CommandModifiers       */
/*             by IOCM.                                                     */
/*--------------------------------------------------------------------------*/
                                          /*--------------------------------*/
                                          /* +----M=Mandatory support       */
                                          /* |    O=Optional support        */
                                          /* |                              */
                                          /* V     Notes                    */
                                          /*--------------------------------*/
#define IOCC_CONFIGURATION        0x0001  /*                                */
#define IOCM_GET_DEVICE_TABLE     0x0001  /* M                              */
#define IOCM_COMPLETE_INIT        0x0002  /* O                              */
                                  /*----------------------------------------*/
#define IOCC_UNIT_CONTROL         0x0002  /*                                */
#define IOCM_ALLOCATE_UNIT        0x0001  /* M                              */
#define IOCM_DEALLOCATE_UNIT      0x0002  /* M                              */
#define IOCM_CHANGE_UNITINFO      0x0003  /* M                              */
/*----------------------------------------*/

#define IOCC_GEOMETRY             0x0003  /*                                */
#define IOCM_GET_MEDIA_GEOMETRY   0x0001  /* M                              */
#define IOCM_SET_MEDIA_GEOMETRY   0x0002  /* O (M) >1 media type            */
#define IOCM_GET_DEVICE_GEOMETRY  0x0003  /* M                              */
#define IOCM_SET_LOGICAL_GEOMETRY 0x0004  /* O (M) CHS addressable          */
                                  /*----------------------------------------*/
#define IOCC_EXECUTE_IO           0x0004  /*                                */
#define IOCM_READ                 0x0001  /* M                              */
#define IOCM_READ_VERIFY          0x0002  /* M                              */
#define IOCM_READ_PREFETCH        0x0003  /* O                              */
#define IOCM_WRITE                0x0004  /* M                              */
#define IOCM_WRITE_VERIFY         0x0005  /* M                              */
                                  /*----------------------------------------*/
#define IOCC_FORMAT               0x0005  /*                                */
#define IOCM_FORMAT_MEDIA         0x0001  /* O (M) If HW requires           */
#define IOCM_FORMAT_TRACK         0x0002  /* O (M) If HW requires           */
#define IOCM_FORMAT_PROGRESS      0x0003  /* O                              */

#define IOCC_UNIT_STATUS          0x0006  /*                                */
#define IOCM_GET_UNIT_STATUS      0x0001  /* M                              */
#define IOCM_GET_CHANGELINE_STATE 0x0002  /* O (Mandatory for diskette)     */
#define IOCM_GET_MEDIA_SENSE      0x0003  /* O (Mandatory for diskette)     */
#define IOCM_GET_LOCK_STATUS      0x0004  /* M                              */
                                  /*----------------------------------------*/
#define IOCC_DEVICE_CONTROL       0x0007  /*                                */
#define IOCM_ABORT                0x0001  /* O (M) SCSI                     */
#define IOCM_RESET                0x0002  /* O (M) SCSI                     */
#define IOCM_SUSPEND              0x0003  /* O (M) Floppy driver            */
#define IOCM_RESUME               0x0004  /* O (M) Floppy driver            */
#define IOCM_LOCK_MEDIA           0x0005  /* M (O) Fixed media only         */
#define IOCM_UNLOCK_MEDIA         0x0006  /* M (O) Fixed media only         */
#define IOCM_EJECT_MEDIA          0x0007  /* M (O) SCSI and Floppy Driver   */
                                  /*----------------------------------------*/
#define IOCC_ADAPTER_PASSTHRU     0x0008  /*                                */
#define IOCM_EXECUTE_SCB          0x0001  /* O                              */
#define IOCM_EXECUTE_CDB          0x0002  /* O (M) SCSI adapters            */
                                  /*----------------------------------------*/

#define MAX_IOCC_COMMAND  IOCC_ADAPTER_PASSTHRU
/*--------------------------------------------------------------------------*/
/* Status flags returned in IORBH->Status                                   */
/*--------------------------------------------------------------------------*/
#define IORB_DONE                0x0001  /* 1=Done,  0=In progress          */
#define IORB_ERROR               0x0002  /* 1=Error, 0=No error             */
#define IORB_RECOV_ERROR         0x0004  /* Recovered error                 */
#define IORB_STATUSBLOCK_AVAIL   0x0008  /* Status block available          */

/*--------------------------------------------------------------------------*/
/* Error Codes returned in IORBH->ErrorCode                                 */
/*--------------------------------------------------------------------------*/

#define IOERR_RETRY                     0x8000

#define IOERR_CMD                       0x0100 
#define IOERR_CMD_NOT_SUPPORTED         IOERR_CMD+1 
#define IOERR_CMD_SYNTAX                IOERR_CMD+2
#define IOERR_CMD_SGLIST_BAD            IOERR_CMD+3
#define IOERR_CMD_SW_RESOURCE           IOERR_CMD+IOERR_RETRY+4 
#define IOERR_CMD_ABORTED               IOERR_CMD+5 
#define IOERR_CMD_ADD_SOFTWARE_FAILURE  IOERR_CMD+6 
#define IOERR_CMD_OS_SOFTWARE_FAILURE   IOERR_CMD+7 

#define IOERR_UNIT                      0x0200
#define IOERR_UNIT_NOT_ALLOCATED        IOERR_UNIT+1
#define IOERR_UNIT_ALLOCATED            IOERR_UNIT+2
#define IOERR_UNIT_NOT_READY            IOERR_UNIT+3
#define IOERR_UNIT_PWR_OFF              IOERR_UNIT+4

#define IOERR_RBA                       0x0300
#define IOERR_RBA_ADDRESSING_ERROR      IOERR_RBA+IOERR_RETRY+1
#define IOERR_RBA_LIMIT                 IOERR_RBA+2
#define IOERR_RBA_CRC_ERROR             IOERR_RBA+IOERR_RETRY+3 

#define IOERR_MEDIA                     0x0400
#define IOERR_MEDIA_NOT_FORMATTED       IOERR_MEDIA+1
#define IOERR_MEDIA_NOT_SUPPORTED       IOERR_MEDIA+2
#define IOERR_MEDIA_WRITE_PROTECT       IOERR_MEDIA+3
#define IOERR_MEDIA_CHANGED             IOERR_MEDIA+4
#define IOERR_MEDIA_NOT_PRESENT         IOERR_MEDIA+5

#define IOERR_ADAPTER                   0x0500
#define IOERR_ADAPTER_HOSTBUSCHECK      IOERR_ADAPTER+1
#define IOERR_ADAPTER_DEVICEBUSCHECK    IOERR_ADAPTER+IOERR_RETRY+2
#define IOERR_ADAPTER_OVERRUN           IOERR_ADAPTER+IOERR_RETRY+3
#define IOERR_ADAPTER_UNDERRUN          IOERR_ADAPTER+IOERR_RETRY+4
#define IOERR_ADAPTER_DIAGFAIL          IOERR_ADAPTER+5 
#define IOERR_ADAPTER_TIMEOUT           IOERR_ADAPTER+IOERR_RETRY+6
#define IOERR_ADAPTER_DEVICE_TIMEOUT    IOERR_ADAPTER+IOERR_RETRY+7
#define IOERR_ADAPTER_REQ_NOT_SUPPORTED IOERR_ADAPTER+8 
#define IOERR_ADAPTER_REFER_TO_STATUS   IOERR_ADAPTER+9
#define IOERR_ADAPTER_NONSPECIFIC       IOERR_ADAPTER+10

#define IOERR_DEVICE                    0x0600 
#define IOERR_DEVICE_DEVICEBUSCHECK     IOERR_DEVICE+IOERR_RETRY+1
#define IOERR_DEVICE_REQ_NOT_SUPPORTED  IOERR_DEVICE+2
#define IOERR_DEVICE_DIAGFAIL           IOERR_DEVICE+3
#define IOERR_DEVICE_BUSY               IOERR_DEVICE+IOERR_RETRY+4 
#define IOERR_DEVICE_OVERRUN            IOERR_DEVICE+IOERR_RETRY+5
#define IOERR_DEVICE_UNDERRUN           IOERR_DEVICE+IOERR_RETRY+6
#define IOERR_DEVICE_RESET              IOERR_DEVICE+7
#define IOERR_DEVICE_NONSPECIFIC        IOERR_DEVICE+8
/*--------------------------------------------------------------------------*/
/* Request Control flags in IORBH->RequestControl                           */ 
/*--------------------------------------------------------------------------*/
#define IORB_ASYNC_POST         0x0001   /* Asynchronous post enabled       */
#define IORB_CHAIN              0x0002   /* IORB chain link enabled         */
#define IORB_CHS_ADDRESSING     0x0004   /* CHS fmt addr in RBA field       */
#define IORB_REQ_STATUSBLOCK    0x0008   /* Obtain status block data        */
#define IORB_DISABLE_RETRY      0x0010   /* Disable retries in ADD          */


/*--------------------------------------------------------------------------*/
/* ADAPTER CONFIGURATION IORB         (for IOCC_CONFIGURATION)              */
/*--------------------------------------------------------------------------*/
typedef struct _IORB_CONFIGURATION   {  /* IOCFG                            */

  IORBH            iorbh;               /* IORB header                      */
  DEVICETABLE far *pDeviceTable;        /* Far pointer to adapt. dev. table */
  USHORT           DeviceTableLen ;     /* Length of adapter device table   */
} IORB_CONFIGURATION, FAR *PIORB_CONFIGURATION, *NPIORB_CONFIGURATION;

/* Adapter device table returned by GET_DEVICE_TABLE                        */
typedef struct _DEVICETABLE  {            /* IODT                           */

  UCHAR         ADDLevelMajor;            /* ADD major support level        */
  UCHAR         ADDLevelMinor;            /* ADD minor support level        */
  USHORT        ADDHandle;                /* ADD handle                     */
  USHORT        TotalAdapters;            /* Number of adapters supported   */
  NPADAPTERINFO pAdapter [1];             /* Array of adapter info pointers */

} DEVICETABLE, FAR *PDEVICETABLE;
/*--------------------------------------------------------------------------*/
/* Current ADD Level for DEVICETABLE->AddLevelMajor, AddLevelMinor          */
/*--------------------------------------------------------------------------*/

#define   ADD_LEVEL_MAJOR        0x01 
#define   ADD_LEVEL_MINOR        0x00 


typedef struct _UNITINFO   {               /* IOUI                          */

  USHORT    AdapterIndex;                  /* nth adapter this driver       */
  USHORT    UnitIndex;                     /* nth unit on this card         */
  USHORT    UnitFlags;                     /* Unit flags                    */
  USHORT    Reserved;                      /* Reserved ; must be 0          */
  USHORT    UnitHandle;                    /* Assigned by ADD or filter     */
  USHORT    FilterADDHandle;               /* Handle of filter ADD 0 = None */
  USHORT    UnitType;                      /* Unit type                     */
  USHORT    QueuingCount;                  /* Recommended number to queue   */
  UCHAR     UnitSCSITargetID;              /* SCSI target ID (SCSI only)    */
  UCHAR     UnitSCSILUN;                   /* SCSI log. unit (SCSI only)    */

} UNITINFO;


/*--------------------------------------------------------------------------*/ 
/* Unit Flags for UNITINFO->UnitFlags                                       */
/*--------------------------------------------------------------------------*/
#define UF_REMOVABLE     0x0001            /* Media can be removed.         */
#define UF_CHANGELINE    0x0002            /* ChangeLine supported          */
#define UF_PREFETCH      0x0004            /* Supports prefetch read        */ 
#define UF_A_DRIVE       0x0008            /* Manages A:                    */ 
#define UF_B_DRIVE       0x0010            /* Manages B:                    */ 
#define UF_NODASD_SUPT   0x0020            /* Suppress DASD Mgr support.    */ 
#define UF_NOSCSI_SUPT   0x0040            /* Suppress SCSI Mgr support.    */
#define UF_DEFECTIVE     0x0080            /* Device is defective.          */

/*--------------------------------------------------------------------------*/
/* Unit Types for UNITINFO->UnitType                                        */
/*--------------------------------------------------------------------------*/ 

#define  UIB_TYPE_DISK      0x0000         /* All direct access devices     */
#define  UIB_TYPE_TAPE      0x0001         /* Sequential access devices     */
#define  UIB_TYPE_PRINTER   0x0002         /* Printer device                */
#define  UIB_TYPE_PROCESSOR 0x0003         /* Processor type device         */
#define  UIB_TYPE_WORM      0x0004         /* Write Once/Read Many device   */
#define  UIB_TYPE_CDROM     0x0005         /* CD ROM device                 */
#define  UIB_TYPE_SCANNER   0x0006         /* Scanner device                */
#define  UIB_TYPE_OPTICAL_MEMORY 0x0007/* Some optical disk                 */
#define  UIB_TYPE_CHANGER   0x0008     /* Changer device (such as juke box) */ 
#define  UIB_TYPE_COMM      0x0009     /* Communication devices             */


typedef struct _ADAPTERINFO   {        /* IOAI                              */

  UCHAR            AdapterName [17];   /* Adapter name ASCIIZ string        */
  UCHAR            Reserved;           /*                                   */
  USHORT           AdapterUnits;       /* Number of units this adapter      */
  USHORT           AdapterDevBus;      /* Bus Type - Adapter to device      */
  UCHAR            AdapterIOAccess;    /* I/O Type - Adapter to host        */
  UCHAR            AdapterHostBus;     /* Bus Type - Adapter to host        */
  UCHAR            AdapterSCSITargetID;/* Adapter SCSI target ID            */
  UCHAR            AdapterSCSILUN;     /* Adapter SCSI LUN                  */
  USHORT           AdapterFlags; 
  USHORT           MaxHWSGList;        /* Max HW S/G list entries           */
  ULONG            MaxCDBTransferLength;/* Max data length for CDBs         */
  UNITINFO         UnitInfo [1];       /* Unit info for each unit           */

} ADAPTERINFO;


/*--------------------------------------------------------------------------*/
/* Adapter Flags for ADAPTERINFO->AdapterFlags                              */
/*--------------------------------------------------------------------------*/

#define AF_16M               0x0001        /* Supports > 16M addresses      */
#define AF_IBM_SCB           0x0002        /* Supports IBM SCB commands     */
#define AF_HW_SCATGAT        0x0004        /* Supports scatter/gather in HW */
#define AF_CHS_ADDRESSING    0x0008        /* Supports CHS addressing in HW */
#define AF_ASSOCIATED_DEVBUS 0x0010        /* Supports > 1 Device Bus       */

/*--------------------------------------------------------------------------*/
/* Adapter-to-Device protocol for ADAPTERINFO->AdapterDevBus                */
/*--------------------------------------------------------------------------*/

#define AI_DEVBUS_OTHER           0x0000
#define AI_DEVBUS_ST506           0x0001    /* ST-506 CAM-I                 */
#define AI_DEVBUS_ST506_II        0x0002    /* ST-506 CAM-II                */ 
#define AI_DEVBUS_ESDI            0x0003    /* ESDI                         */ 
#define AI_DEVBUS_FLOPPY          0x0004    /* Diskette                     */
#define AI_DEVBUS_SCSI_1          0x0005 
#define AI_DEVBUS_SCSI_2          0x0006 
#define AI_DEVBUS_SCSI_3          0x0007 
#define AI_DEVBUS_NONSCSI_CDROM   0x0008   /* Non-SCSI CD-ROM interface bus */

/*--------------------------------------------------------------------------*/
/* Note: One of the following BUS WIDTH indicators must be                  */
/*       OR'd with the above field.                                         */
/*--------------------------------------------------------------------------*/

#define  AI_DEVBUS_FAST_SCSI      0x0100 
#define  AI_DEVBUS_8BIT           0x0200 
#define  AI_DEVBUS_16BIT          0x0400 
#define  AI_DEVBUS_32BIT          0x0800 


/*--------------------------------------------------------------------------*/ 
/* Adapter-to-Device protocol for ADAPTERINFO->AdapterIOAccess              */
/*--------------------------------------------------------------------------*/ 

#define  AI_IOACCESS_OTHER      0x00
#define  AI_IOACCESS_BUS_MASTER 0x01 
#define  AI_IOACCESS_PIO        0x02 
#define  AI_IOACCESS_DMA_SLAVE  0x04 
#define  AI_IOACCESS_MEMORY_MAP 0x08 
/*--------------------------------------------------------------------------*/
/* Adapter-to-Host bus type for ADAPTERINFO->AdapterHostBus                 */
/*--------------------------------------------------------------------------*/

#define  AI_HOSTBUS_OTHER       0x00 
#define  AI_HOSTBUS_ISA         0x01 
#define  AI_HOSTBUS_EISA        0x02 
#define  AI_HOSTBUS_uCHNL       0x03 
#define  AI_HOSTBUS_UNKNOWN     0x0f 

/*--------------------------------------------------------------------------*/
/* Note: One of the following BUS WIDTH indicators must be                  */
/*       OR'd with the above field.                                         */
/*--------------------------------------------------------------------------*/

#define  AI_BUSWIDTH_8BIT       0x10 
#define  AI_BUSWIDTH_16BIT      0x20 
#define  AI_BUSWIDTH_32BIT      0x30
#define  AI_BUSWIDTH_64BIT      0x40
#define  AI_BUSWIDTH_UNKNOWN    0xf0


/****************************************************************************/ 
/* UNIT CONTROL IORB                  (for IOCC_UNIT_CONTROL)               */
/****************************************************************************/ 

typedef struct _IORB_UNIT_CONTROL  {     /* IOUC                            */

  IORBH            iorbh;                /* IORB Header                     */
  USHORT           Flags;                /*                                 */
  PUNITINFO        pUnitInfo;            /* For: IOCM_CHANGE_UNITINFO       */
  USHORT           UnitInfoLen;          /* Length of UnitInfo structure    */

} IORB_UNIT_CONTROL, FAR *PIORB_UNIT_CONTROL, *NPIORB_UNIT_CONTROL;
/****************************************************************************/ 
/* DASD GEOMETRY IORB                      (for IOCC_GEOMETRY)              */
/****************************************************************************/ 

typedef struct _IORB_GEOMETRY  {         /* IOGG                            */

  IORBH            iorbh;                /* IORB header                     */
  PGEOMETRY        pGeometry;            /* Far pointer to GEOMETRY block   */
  USHORT           GeometryLen;          /* Length of GEOMETRY block        */

} IORB_GEOMETRY, FAR *PIORB_GEOMETRY, *NPIORB_GEOMETRY;

typedef struct _GEOMETRY  {              /* IOG                             */

  ULONG      TotalSectors;
  USHORT     BytesPerSector;
  USHORT     Reserved;
  USHORT     NumHeads;
  ULONG      TotalCylinders;
  USHORT     SectorsPerTrack;

} GEOMETRY, FAR *PGEOMETRY, *NPGEOMETRY;


/****************************************************************************/ 
/* Scatter/Gather List Entry                                                */
/****************************************************************************/ 

typedef struct _SCATGATENTRY  {          /*   IOSG                         */

  ULONG           ppXferBuf;          /* Physical pointer to xfer buffer    */
  ULONG           XferBufLen;         /* Length of transfer buffer          */

} SCATGATENTRY, FAR *PSCATGATENTRY, *NPSCATGATENTRY;

#define MAXSGLISTSIZE     (sizeof(SCATGATENTRY)) * 16

/****************************************************************************/ 
/* EXECUTE_IO IORB                     (for IOCC_EXECUTE_IO)                */
/****************************************************************************/ 

typedef struct  _IORB_EXECUTEIO  {             /* IOXIO                     */

  IORBH           iorbh;           /* IORB header                           */
  USHORT          cSGList;         /* Count of S/G list elements            */
  PSCATGATENTRY   pSGList;         /* Far pointer to s/g list               */
  ULONG           ppSGList;        /* Phys. address of S/G list             */
  ULONG           RBA;             /* RBA starting address                  */
  USHORT          BlockCount;      /* Block count                           */
  USHORT          BlocksXferred;   /* Block done count                      */
  USHORT          BlockSize;       /* Size of a block in bytes              */
  USHORT          Flags;

} IORB_EXECUTEIO, FAR *PIORB_EXECUTEIO, *NPIORB_EXECUTEIO;


/****************************************************************************/ 
/* CHS Direct Addressing (Overlays RBA field)                               */
/****************************************************************************/ 

typedef struct _CHS_ADDR    {      /* IOCHS                                 */

   USHORT          Cylinder;
   UCHAR           Head;
   UCHAR           Sector;

}   CHS_ADDR, FAR *PCHS_ADDR, *NPCHS_ADDR;

/*--------------------------------------------------------------------------*/
/* IORB specific flags for IORB EXECUTE_IO->Flags                           */
/*--------------------------------------------------------------------------*/ 

#define XIO_DISABLE_HW_WRITE_CACHE        0x0001 
#define XIO_DISABLE_HW_READ_CACHE         0x0002 

/****************************************************************************/ 
/* FORMAT IORB                          (for IOCC_FORMAT)                   */
/****************************************************************************/ 


typedef struct _IORB_FORMAT    {         /* IOFMT                           */

  IORBH           iorbh;                 /* IORB Header                     */
  USHORT          cSGList;               /* Count of S/G list elements      */
  PSCATGATENTRY   pSGList;               /* Far pointer to s/g list         */
  ULONG           ppSGList;              /* Phys. address of S/Glist        */
  USHORT          FormatCmdLen;          /*                                 */
  PBYTE           pFormatCmd;            /* SCSI CDB or track fmt cmd       */
  UCHAR           Reserved_1 [8];        /* Reserved; must not be modified  */

}  IORB_FORMAT, FAR *PIORB_FORMAT, *NPIORB_FORMAT;


typedef struct _FORMAT_CMD_TRACK   {      /* FMCT                            */

   USHORT          Flags;
   ULONG           RBA;
   USHORT          cTrackEntries;

} FORMAT_CMD_TRACK, FAR *PFORMAT_CMD_TRACK, *NPFORMAT_CMD_TRAC ;

/*--------------------------------------------------------------------------*/ 
/* Flags for FORMAT_CMD_TRACK->Flags                                        */
/*--------------------------------------------------------------------------*/ 

#define FF_VERIFY       0x0001          /* Verify sectors after formatting. */


/****************************************************************************/ 
/* ADAPTER PASS THROUGH IORB           (for IOCC_ADAPTER_PASSTHRU)          */
/****************************************************************************/ 

typedef struct _IORB_ADAPTER_PASSTHRU  { /* IOPT                            */

  IORBH         iorbh;                  /* IORB header                      */
  USHORT        cSGList;                /* Count of S/G list elements       */
  PSCATGATENTRY pSGList;                /* Far pointer to s/g list          */
  ULONG         ppSGLIST;               /* Phys. address of S/G list        */ 
  USHORT        ControllerCmdLen;
  PBYTE         pControllerCmd; 
  ULONG         ppSCB;       /* Phys. pointer to SCB for SCB_PASSTHRU       */
  USHORT        Flags;

} IORB_ADAPTER_PASSTHRU, FAR *PIORB_ADAPTER_PASSTHRU, *NPIORB_ADAPTER_PASSTHRU;

/*--------------------------------------------------------------------------*/
/* IORB specific flags for IORB_ADAPTER_PASSTHRU->Flags                     */
/*                                                                          */
/* Note: These flags apply to IOCM_EXECUTE_CDB.                             */
/*--------------------------------------------------------------------------*/ 

#define PT_DIRECTION_IN     0x0001      /* Data xfer to host adapter        */

/****************************************************************************/ 
/* UNIT STATUS IORB                   (for IOCC_UNIT_STATUS)                */
/****************************************************************************/ 

typedef struct _IORB_UNIT_STATUS   {    /* IOUS                             */

  IORBH        iorbh ; 
  USHORT       UnitStatus ; 

} IORB_UNIT_STATUS, FAR *PIORB_UNIT_STATUS, *NPIORB_UNIT_STATUS;

/*--------------------------------------------------------------------------*/ 
/* Unit Status for IORB_UNIT_STATUS->UnitStatus                             */
/*                                                                          */
/* Note: These flags apply to IOCM_GET_UNIT_STATUS                          */
/*--------------------------------------------------------------------------*/ 

#define US_READY                0x0001    /* Unit ready                     */
#define US_POWER                0x0002    /* Unit powered on                */
#define US_DEFECTIVE            0x0004    /* Unit operational               */

/*--------------------------------------------------------------------------*/ 
/* Unit Status for IORB_UNIT_STATUS->UnitStatus                             */
/*                                                                          */
/* Note: These flags apply to IOCM_GET_CHANGELINE_STATE                     */
/*--------------------------------------------------------------------------*/

#define US_CHANGELINE_ACTIVE    0x0001    /* ChangeLine state               */


/*--------------------------------------------------------------------------*/ 
/* Unit Status for IORB_UNIT_STATUS->UnitStatus                             */
/*                                                                          */
/* Note: These flags apply to IOCM_GET_MEDIA_SENSE                          */
/*--------------------------------------------------------------------------*/

#define US_MEDIA_UNKNOWN        0x0000     /* Unable to determine media     */
#define US_MEDIA_720KB          0x0001     /* 720KB in 3.5" drive           */
#define US_MEDIA_144MB          0x0002     /* 1.44MB in 3.5" drive          */
#define US_MEDIA_288MB          0x0003     /* 2.88MB in 3.5" drive          */

/****************************************************************************/
/* DEVICE CONTROL IORB                 (for IOCC_DEVICE_CONTROL             */
/****************************************************************************/

typedef struct _IORB_DEVICE_CONTROL    {   /* IODC                          */

  IORBH      iorbh;                        /* IORB header                   */
  USHORT     Flags;
  USHORT     Reserved;

} IORB_DEVICE_CONTROL, FAR *PIORB_DEVICE_CONTROL, *NPIORB_DEVICE_CONTROL;

/*--------------------------------------------------------------------------*/
/* IORB-specific flags for IORB_DEVICE_CONTROL->Flags                       */
/*                                                                          */
/* Note: These flags apply to IOCM_SUSPEND                                  */
/*--------------------------------------------------------------------------*/ 

#define DC_SUSPEND_DEFERRED     0x0000    /* Suspend after device idle      */
#define DC_SUSPEND_IMMEDIATE    0x0001    /* Suspend after current request  */

#define MAX_IORB_SIZE   128