home *** CD-ROM | disk | FTP | other *** search
/ Computer Installation Guide - Dragon Clan Series / CD2.iso / Audio / CDDA2WAV / ASPIDEF.H next >
Encoding:
C/C++ Source or Header  |  1994-06-14  |  10.9 KB  |  367 lines

  1. /*
  2.  * ASPIDEF - communication with Advanced SCSI Programming Interface
  3.  *
  4.  * LAST CHANGE:
  5.  *   10/17/93 - first version,    OK
  6.  */
  7.  
  8. /* aspi functions error messages */
  9. #define ASPIE_SUCCESS 0     /* Ok */
  10. #define ASPIE_PENDING -1    /* Pending SCSI request  */
  11. #define ASPIE_FATAL -2        /* Undefined ASPI error */
  12. #define ASPIE_INVDEVICEID -5    /* SCSI device not installed */
  13. #define ASPIE_INVSCSIREQ -6    /* Invalid SCSI request */
  14. #define ASPIE_INVADAPTERID -7    /* Invalid host adapter number */
  15. #define ASPIE_HOSTABORT -8    /* ASPI request aborted by host */
  16. #define ASPIE_SELTIMEOUT -9    /* Selection timeout */
  17. #define ASPIE_DATAOVERRUN -10    /* Data over-run/under-run */
  18. #define ASPIE_BUSFREE -11    /* Unexpected bus free */
  19. #define ASPIE_PHASEERR -12    /* Target bus phase sequence failure */
  20. #define ASPIE_TARGETBUSY -13    /* Specified target is busy */
  21. #define ASPIE_RESERVATION -14    /* Reservation conflict */
  22. #define ASPIE_UNITNOTREADY -15    /* Unit not ready */
  23. #define ASPIE_MEDIUM -16    /* Medium error */
  24. #define ASPIE_HARDWARE -17    /* Non-recoverable hardware failure */
  25. #define ASPIE_ILLEGALREQ -18    /* Illegal request */
  26. #define ASPIE_UNITATTENTION -19 /* Unit attention */
  27. #define ASPIE_DATAPROTECT -20    /* Medium is write protected */
  28. #define ASPIE_BLANKCHECK -21    /* Encountered non blank data */
  29. #define ASPIE_TARGETABORT -22    /* Command aborted by target */
  30. #define ASPIE_VOLOVERFLOW -23    /* Volume overflow */
  31. #define ASPIE_IOERROR -25    /* Unknown I/O error */
  32. #define ASPIE_ENDOFMEDIUM -37    /* End of medium detected */
  33.  
  34. /* srb.flags values */
  35. #define SRBF_POSTING        0x01
  36. #define SRBF_LINKED        0x02
  37. #define SRBF_NOLENCHECK     0x00    /* direction ctrled by SCSI cmd */
  38. #define SRBF_READ        0x08    /* xfer to host, length checked */
  39. #define SRBF_WRITE        0x10    /* xfer to target, length checked */
  40. #define SRBF_NOXFER        0x18    /* no data transfer */
  41.  
  42. /* srb.cmd values */
  43. #define SRBC_INQUIRY        0
  44. #define SRBC_GETDEVTYPE     1
  45. #define SRBC_EXECIO        2
  46. #define SRBC_ABORTSRB        3
  47. #define SRBC_RESETDEVICE    4
  48. #define SRBC_SETADAPTERCONFIG    5
  49. #define SRBC_GETDRIVEINFO    6
  50.  
  51. /* srb.status results */
  52. #define SRBS_PENDING        0x00 /* SCSI request in progress */
  53. #define SRBS_COMPLETE        0x01 /* SCSI request completed no error */
  54. #define SRBS_ABORTED        0x02 /* SCSI request aborted */
  55. #define SRBS_ERROR        0x04 /* SCSI request completed with error */
  56. #define SRBS_INVSCSIREQ     0x80 /* Invalid SCSI request */
  57. #define SRBS_INVADAPTERID    0x81 /* Invalid host adapter number */
  58. #define SRBS_INVDEVICEID    0x82 /* SCSI device not installed */
  59.  
  60. /* srb.bAdapterStatus results */
  61. #define SRB_ADS_SUCCESS     0x00 /* No adapter status available */
  62. #define SRB_ADS_TIMEOUT     0x11 /* Selection timeout */
  63. #define SRB_ADS_DATAOVFL    0x12 /* Data overrun/underrun error */
  64. #define SRB_ADS_BUSFREE     0x13 /* Unexpected bus free */
  65. #define SRB_ADS_PHASEERR    0x14 /* Target bus phase sequence error */
  66.  
  67. /* srb.bTargetStatus results */
  68. #define SRB_TGS_GOOD        0x00 /* Good status or none available */
  69. #define SRB_TGS_CHECKCOND    0x02 /* Check Condition */
  70. #define SRB_TGS_CONDMET     0x04 /* Condition met */
  71. #define SRB_TGS_BUSY        0x08 /* Target busy */
  72. #define SRB_TGS_INTERM        0x10 /* Intermediate command good */
  73. #define SRB_TGS_INTERMCONDMET    0x14 /* Intermediate condition met */
  74. #define SRB_TGS_RESCONFLICT    0x18 /* Reservation conflict */
  75. #define SRB_TGS_CMDTERMINATED    0x22 /* Command terminated */
  76. #define SRB_TGS_QUEUEFULL    0x28 /* Queue full */
  77.  
  78.  
  79. /* result of 'AspiHostAdapterInquiry' */
  80. typedef struct HA_INQUIRY {
  81.   int nAdapters;
  82.   int adapterTargetId;
  83.   char szManager [17];
  84.   char szAdapter [17];
  85. } HA_INQUIRY;
  86.  
  87.  
  88. /* result of 'AspiGetDiskDriveInfo' */
  89. typedef struct HA_DRIVEINFO {
  90.   BYTE bDriveFlags;
  91.   BYTE bInt13Drive;
  92.   BYTE bPreferredHeadTranslation;
  93.   BYTE bPreferredSectorTranslation;
  94.   BYTE _reserved [10];
  95. } HA_DRIVEINFO;
  96.  
  97.  
  98. /* flags of 'DriveInfo.bDriveFlags' & DDF_INT13INFO */
  99. #define DDFM_INT13INFO    0x03
  100. #define DDF_ASPICONTROL 0    /* no INT 13h support for this LUN */
  101. #define DDF_DOSCONTROL    1    /* LUN has INT 13h support, ctrled by DOS */
  102. #define DDF_BIOSCONTROL 2    /* LUN ctrled by INT 13h but no DOS support */
  103.  
  104. /*
  105.  * Parameter structure of 'AspiSetAdapterConfig' and a 1522 adapter.
  106.  * This structure is highly adapter specific (might not work for other
  107.  * controlers).
  108.  */
  109. typedef struct HA_SETADAPTERCONFIG {
  110.   BYTE irqChannel;        /* Interrupt channel # */
  111.   BYTE dmaChannel;        /* DMA channel # */
  112.   BYTE haScsiId;        /* Host Adapter SCSI ID */
  113.   BYTE fParity;         /* Parity enabled/disabled */
  114.   BYTE busOnTime;        /* DMA bus-on timing (usec) */
  115.   BYTE busOffTime;        /* DMA bus-off timing (usec) */
  116.   BYTE fSyncMode;        /* Synchronous mode enabled? */
  117.   BYTE selectionTimeout;    /* Selection timeout (usec) */
  118.   BYTE fAllowDisconnect;    /* Allow SCSI disconnection? */
  119.   BYTE transferMode;        /* 0 = PIO, 1 = DMA */
  120.   BYTE _reserved1;
  121.   BYTE _reserved2;
  122.   DWORD revisionLevel;        /* firmware rev. level */
  123.   DWORD _reserved3;
  124.   DWORD _reserved4;
  125.   DWORD _reserved5;
  126.   BYTE parameters [16];
  127. } HA_SETADAPTERCONFIG;
  128.  
  129.  
  130. #pragma pack (1)    /* no alignment, tight packing */
  131.  
  132. typedef struct SRB {
  133.   BYTE bCmd;
  134.   BYTE bStatus;
  135.   BYTE bAdapterId;
  136.   BYTE bFlags;
  137.   DWORD _dwReserved;
  138. } SRB;
  139.  
  140. typedef VOID (FAR *LPFNASPIPOST) (SRB FAR *lpSrb);
  141.  
  142.  
  143. typedef struct SRB_INQUIRY {
  144.   SRB srb;
  145.   BYTE nAdapters;
  146.   BYTE adapterTargetId;
  147.   char achManager [16];
  148.   char achAdapter [16];
  149.   BYTE parameters [16];
  150. } SRB_INQUIRY;
  151.  
  152.  
  153. typedef struct SRB_SETADAPTERCONFIG {
  154.   SRB srb;
  155.   HA_SETADAPTERCONFIG config;
  156. } SRB_GETCONFIG;
  157.  
  158.  
  159. typedef struct SRB_GETDEVTYPE {
  160.   SRB srb;
  161.   BYTE bTargetId;
  162.   BYTE bLun;
  163.   BYTE bDeviceTypeCode;
  164. } SRB_GETDEVTYPE;
  165.  
  166.  
  167. typedef struct SRB_GETDRIVEINFO {
  168.   SRB srb;
  169.   BYTE bTargetId;
  170.   BYTE bLun;
  171.   HA_DRIVEINFO driveInfo;
  172. } SRB_GETDRIVEINFO;
  173.  
  174.  
  175. typedef struct SRB_ABORT {
  176.   SRB srb;
  177.   SRB FAR *lpSrbToAbort;
  178. } SRB_ABORT;
  179.  
  180.  
  181. typedef struct SRB_RESET {
  182.   SRB srb;
  183.   BYTE bTargetId;
  184.   BYTE bLun;
  185.   BYTE _reserved [14];
  186.   BYTE bAdapterStatus;
  187.   BYTE bTargetStatus;
  188.   LPFNASPIPOST lpfnPost;
  189.   BYTE _workspace [34];
  190. } SRB_RESET;
  191.  
  192.  
  193. typedef struct SENSEDATA {
  194.   BYTE bErrorCode;    /* =70h current error, =71h deferred error */
  195.   BYTE bSegmentNum;    /* Number of current segment descriptor */
  196.   BYTE bSenseKey;    /* Sense key Bit 0..4, 5=ILI, 6=EOM, 7=FILEMRK */
  197.   BYTE wInfo;        /* Information MSB/LSB */
  198.   BYTE cbAddData;    /* Additional sense length */
  199.   WORD bCmdSpecInfo;    /* Command specific information MSB/LSB */
  200.   BYTE bAddSenseCode;    /* Additional sense code */
  201.   BYTE bAddSenseQual;    /* Additional sense code qualifier */
  202.   BYTE bFieldRepUCode;    /* Field replaceable unit code */
  203.   BYTE bMore [4];    /* Additional sense bytes... */
  204. } SENSEDATA;
  205.  
  206.  
  207. typedef struct CDB_6 {
  208.   BYTE bCmd;
  209.   BYTE bLun;
  210.   BYTE b2, b3, b4, b5;
  211.   BYTE sense [14];
  212. } CDB_6;
  213.  
  214.  
  215. typedef struct CDB_10 {
  216.   BYTE bCmd;
  217.   BYTE bLun;
  218.   BYTE b2, b3, b4, b5, b6, b7, b8, b9;
  219.   BYTE sense [14];
  220. } CDB_10;
  221.  
  222.  
  223. /* scsi inquiry command */
  224. typedef struct CDB_INQUIRY {
  225.   unsigned bCmd : 8;
  226.   unsigned fEvpd : 1;
  227.   unsigned _reserved1 : 4;
  228.   unsigned bLun : 3;
  229.   unsigned bPageCode : 8;
  230.   unsigned _reserved2 : 8;
  231.   unsigned bLen : 8;
  232.   unsigned bControl : 8;
  233.   BYTE sense [14];
  234. } CDB_INQUIRY;
  235.  
  236.  
  237. /* start/stop unit command */
  238. typedef struct CDB_SSUNIT {
  239.   unsigned bCmd : 8;
  240.   unsigned fImmed : 1;
  241.   unsigned _reserved1 : 4;
  242.   unsigned bLun : 3;
  243.   unsigned _reserved2 : 8;
  244.   unsigned _reserved3 : 8;
  245.   unsigned fStart : 1;
  246.   unsigned fEject : 1;
  247.   unsigned _reserved4 : 6;
  248.   unsigned bControl : 8;
  249.   BYTE sense [14];
  250. } CDB_SSUNIT;
  251.  
  252.  
  253. /* allow medium removal command */
  254. typedef struct CDB_MEDREM {
  255.   unsigned bCmd : 8;
  256.   unsigned _reserved1 : 5;
  257.   unsigned bLun : 3;
  258.   unsigned _reserved2 : 8;
  259.   unsigned _reserved3 : 8;
  260.   unsigned fPrevent : 1;
  261.   unsigned _reserved4 : 7;
  262.   unsigned bControl : 8;
  263.   BYTE sense [14];
  264. } CDB_MEDREM;
  265.  
  266.  
  267. typedef struct SRB_IO {
  268.   SRB srb;
  269.   BYTE bTargetId;
  270.   BYTE bLun;
  271.   DWORD cbData;
  272.   BYTE cbSense;
  273.   VOID FAR *lpData;
  274.   SRB FAR *lpSrbLink;
  275.   BYTE cCdb;
  276.   BYTE bAdapterStatus;
  277.   BYTE bTargetStatus;
  278.   LPFNASPIPOST lpfnPost;
  279.   WORD wPostRealDS;
  280.   SRB FAR *lpSrbReal;
  281.   WORD _reserved1;
  282.   DWORD dwSrbPhysAddr;
  283.   BYTE workspace [22];
  284.   union cdb {
  285.     CDB_6 cdb6;
  286.     CDB_10 cdb10;
  287.     CDB_INQUIRY inquiry;
  288.     CDB_SSUNIT ssunit;
  289.     CDB_MEDREM medrem;
  290.     BYTE raw [32];
  291.   } cdb;
  292. } SRB_IO;
  293.  
  294.  
  295. /* result of function 'ScsiInquiry' */
  296. typedef struct SCSI_INQUIRY {
  297.   unsigned deviceTypeCode : 5;        /* byte 0 */
  298.   unsigned peripheralQualifier : 3;
  299.   unsigned deviceTypeQualifier : 7;    /* byte 1 */
  300.   unsigned fRemovableMedium : 1;
  301.   unsigned scsiVersion : 3;        /* byte 2 */
  302.   unsigned ecmaVersion : 3;
  303.   unsigned isoVersion : 2;
  304.   unsigned responseDataFormat : 4;    /* byte 3 */
  305.   unsigned _reserved1 : 2;
  306.   unsigned canTerminateIoProcess : 1;
  307.   unsigned fAsyncEventNotify : 1;
  308.   unsigned cbVendorData : 8;        /* byte 4 */
  309.   unsigned _reserved2 : 8;        /* byte 5 */
  310.   unsigned _reserved3 : 8;        /* byte 6 */
  311.   unsigned fSoftReset : 1;        /* byte 7 */
  312.   unsigned fCmdQueueing : 1;
  313.   unsigned cache : 1;
  314.   unsigned fLinkedCommands : 1;
  315.   unsigned fSynchronousTransfer : 1;
  316.   unsigned fWideScsi16 : 1;
  317.   unsigned fWideScsi32 : 1;
  318.   unsigned fRelativeAddrMode : 1;
  319.   char achVendor [8];            /* byte 8.. */
  320.   char achProduct [16];
  321.   char achRevision [4];
  322.   BYTE vendorData [60];
  323. } SCSI_INQUIRY;
  324.  
  325. /* Inquiry DeviceTypeCodes */
  326. #define DTC_DISK    0x00 /* Direct-access device */
  327. #define DTC_TAPE    0x01 /* Sequential-access device */
  328. #define DTC_PRINTER    0x02 /* Printer device */
  329. #define DTC_PROCESSOR    0x03 /* Processor device */
  330. #define DTC_WORM    0x04 /* Write-once device */
  331. #define DTC_CDROM    0x05 /* CD-ROM device */
  332. #define DTC_SCANNER    0x06 /* Scanner device */
  333. #define DTC_OPTICAL    0x07 /* Optical memory device */
  334. #define DTC_JUKEBOX    0x08 /* Medium changer device */
  335. #define DTC_COMM    0x09 /* Communications device */
  336. #define DTC_PREPRESS1    0x0A /* Pre-press device 1 */
  337. #define DTC_PREPRESS2    0x0B /* Pre-press device 2 */
  338. #define DTC_UNKNOWN    0x1F /* Unknown or no device type */
  339.  
  340. #pragma pack ()
  341.  
  342.  
  343. #define memzero(x) memset (&(x), 0, sizeof (x))
  344.  
  345. static VOID (FAR * NEAR fnAspi) (SRB FAR *) = NULL;
  346.  
  347.  
  348. /*$proto:aspilib.c*/
  349. char *AspiGetErrorText (int errorCode);
  350. BOOL AspiInit (VOID);
  351. int AspiPostRequest (SRB *srb);
  352. int AspiGetError (SRB *srb);
  353. int AspiRequestWait (SRB *srb);
  354. int AspiAbortRequest (SRB *srb);
  355. int AspiHostAdapterInquiry (int adapterId, HA_INQUIRY *pInquiry);
  356. int AspiGetDeviceType (int adapterId, int targetId, int lun);
  357. int AspiResetDevice (int adapterId, int targetId, int lun);
  358. int AspiGetDiskDriveInfo (int adapterId, int targetId, int lun,
  359.   HA_DRIVEINFO *pDriveInfo);
  360. int ScsiTestUnitReady (int adapterId, int targetId, int lun);
  361. int ScsiInquiry (int adapterId, int targetId, int lun,
  362.   SCSI_INQUIRY *pInquiry);
  363. int ScsiRead (int adapterId, int targetId, int lun, VOID *pBuffer,
  364.   int firstBlock, int nBlocks);
  365. int ScsiWrite (int adapterId, int targetId, int lun, VOID *pBuffer,
  366.   int firstBlock, int nBlocks);
  367.