1 /*------------------------------------------------------------------------------
2  winaspi.h
3 ------------------------------------------------------------------------------*/
4 
5 #define SS_PENDING         0x00  // SCSI request is in progress.
6 #define SS_COMP            0x01  // SCSI Request Completed Without Error
7 #define SS_ABORTED         0x02  // SCSI command has been aborted.
8 #define SS_ERR             0x04  //  SCSI command has completed with an error.
9 #define SS_INVALID_SRB     0xE0  // One or more parameters in the SCSI Request Block
10                                  // (SRB) are set incorrectly.
11 #define SS_OLD_MANAGER     0xE1  // One or more ASPI for DOS managers are loaded which
12                                  // do not support ASPI for Win16.
13 #define SS_ILLEGAL_MODE    0xE2  // This ASPI manager does not support this mode of
14                                  // Windows. You typically see this error code when
15                                  // running Windows in Real Mode.
16 #define SS_NO_ASPI         0xE3  //  No ASPI managers are loaded. This typically occurs
17                                  //  when a DOS ASPI manager is not resident in memory.
18 #define SS_FAILED_INIT     0xE4  //  For some reason, other than SS_OLD_MANAGER,
19                                  //  SS_ILLEGAL_MODE or SS_NO_ASPI, ASPI for Win16
20                                  //  could not properly initialize itself. This may be
21                                  //  caused by a lack of system resources.
22 #define SS_ASPI_IS_BUSY    0xE5  //  The ASPI manager cannot handle the request at this
23                                  //  time. This error generally occurs if the ASPI
24                                  //  manager is already using up all of his resources
25                                  //  to execute other requests. Try resending the
26                                  //  command later.
27 #define SS_BUFFER_TO_BIG   0xE6  //  The ASPI manager cannot handle the given transfer
28 #define SS_INVALID_HA      0x81  //  Invalid Host Adapter Number
29 #define SS_NO_DEVICE       0x82  //  SCSI Device Not Installed
30 
31 #define HASTAT_OK          0x00  //  Host adapter did not detect an error
32 #define HASTAT_SEL_TO      0x11  //  Selection time-out
33 #define HASTAT_DO_DU       0x12  //  Data overrun/underrun
34 #define HASTAT_BUS_FREE    0x13  //  Unexpected Bus Free
35 #define HASTAT_PHASE_ERR   0x14  //  Target Bus phase sequence failure
36 
37 #define STATUS_GOOD        0x00  //  No target status
38 #define STATUS_CHKCOND     0x02  //  Check status (sense data is in SenseArea)
39 #define STATUS_BUSY        0x08  //  Specified Target/LUN is busy
40 #define STATUS_RESCONF     0x18  //  Reservation conflict
41 
42 #define SENSE_LEN          14
43 
44 
45 #define SC_HA_INQUIRY      0x00
46 #define SC_GET_DEV_TYPE    0x01
47 #define SC_EXEC_SCSI_CMD   0x02
48 #define SC_ABORT_SRB       0x03
49 #define SC_RESET_DEV       0x04
50 
51 #define SRBF_POSTING       0x01
52 #define SRBF_LINKED        0x02
53 #define SRBF_NOLENCHECK    0x00  // direction ctrled by SCSI cmd
54 #define SRBF_READ          0x08  // xfer to host, length checked
55 #define SRBF_WRITE         0x10  // xfer to target, length checked
56 #define SRBF_NOXFER        0x18  // no data transfer
57 #define SRB_EVENT_NOTIFY   0x40
58 
59 
60 
61 /*
62 typedef unsigned char BYTE;
63 typedef unsigned int  WORD;
64 typedef unsigned long DWORD;
65 */
66 
67 typedef unsigned char * LPSRB;
68 
69 
70 typedef struct
71 {
72     BYTE        SRB_Cmd;            // ASPI command code = SC_HA_INQUIRY
73     BYTE        SRB_Status;         // ASPI command status byte
74     BYTE        SRB_HaId;           // ASPI host adapter number
75     BYTE        SRB_Flags;          // ASPI request flags
76     WORD        SRB_55AASignature;  // Extended signature bytes
77     WORD        SRB_ExtBufferSize;  // Extended buffer length
78     BYTE        HA_Count;           // Number of host adapters present
79     BYTE        HA_SCSI_ID;         // SCSI ID of host adapter
80     BYTE        HA_ManagerId[16];   // String describing the manager
81     BYTE        HA_Identifier[16];  // String describing the host adapter
82     BYTE        HA_Unique[16];      // Host Adapter Unique parameters
83     WORD        HA_ExtBuffer;       // Extended buffer area
84 } SRB_HAInquiry;
85 
86 typedef struct
87 {
88     BYTE        SRB_Cmd;            // ASPI command code = SC_GET_DEV_TYPE
89     BYTE        SRB_Status;         // ASPI command status byte
90     BYTE        SRB_HaId;           // ASPI host adapter number
91     BYTE        SRB_Flags;          // ASPI request flags
92     DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
93     BYTE        SRB_Target;         // Target's SCSI ID
94     BYTE        SRB_Lun;            // Target's LUN number
95     BYTE        SRB_DeviceType;     // Target's peripheral device type
96     BYTE        SRB_Rsvd1;          // Reserved for alignment
97 } SRB_GDEVBlock;
98 
99 typedef struct
100 {                                       // Structure for 6-byte CDBs
101     BYTE        SRB_Cmd;                // ASPI command code = SC_EXEC_SCSI_CMD
102     BYTE        SRB_Status;             // ASPI command status byte
103     BYTE        SRB_HaId;               // ASPI host adapter number
104     BYTE        SRB_Flags;              // ASPI request flags
105     DWORD       SRB_Hdr_Rsvd;           // Reserved, MUST = 0
106     BYTE        SRB_Target;             // Target's SCSI ID
107     BYTE        SRB_Lun;                // Target's LUN number
108     WORD        SRB_Rsvd1;              // Reserved for Alignment
109     DWORD       SRB_BufLen;             // Data Allocation LengthPG
110     BYTE        *SRB_BufPointer;        // Data Buffer Pointer
111     BYTE        SRB_SenseLen;           // Sense Allocation Length
112     BYTE        SRB_CDBLen;             // CDB Length = 6
113     BYTE        SRB_HaStat;             // Host Adapter Status
114     BYTE        SRB_TargStat;           // Target Status
115     void        (*SRB_PostProc)();      // Post routine
116     void        *SRB_Rsvd2;             // Reserved
117     BYTE        SRB_Rsvd3[16];          // Reserved for expansion
118     BYTE        CDBByte[16];            // SCSI CDB
119     BYTE        SenseArea[SENSE_LEN+2]; // Request Sense buffer
120 } SRB_ExecSCSICmd6;
121 
122 typedef struct
123 {                                       // Structure for 10-byte CDBs
124     BYTE        SRB_Cmd;                // ASPI command code = SC_EXEC_SCSI_CMD
125     BYTE        SRB_Status;             // ASPI command status byte
126     BYTE        SRB_HaId;               // ASPI host adapter number
127     BYTE        SRB_Flags;              // ASPI request flags
128     DWORD       SRB_Hdr_Rsvd;           // Reserved, MUST = 0
129     BYTE        SRB_Target;             // Target's SCSI ID
130     BYTE        SRB_Lun;                // Target's LUN number
131     WORD        SRB_Rsvd1;              // Reserved, MUST = 0
132     DWORD       SRB_BufLen;             // Data Allocation Length
133     BYTE        *SRB_BufPointer;        // Data Buffer Pointer
134     BYTE        SRB_SenseLen;           // Sense Allocation Length
135     BYTE        SRB_CDBLen;             // CDB Length = 10
136     BYTE        SRB_HaStat;             // Host Adapter Status
137     BYTE        SRB_TargStat;           // Target Status
138     void        (*SRB_PostProc)();      // Post routine
139     void        *SRB_Rsvd2;             // Reserved
140     BYTE        SRB_Rsvd3[16];          // Reserved for expansion
141     BYTE        CDBByte[16];            // SCSI CDB
142     BYTE        SenseArea10[SENSE_LEN+2]; // Request Sense buffer
143 } SRB_ExecSCSICmd10;
144 
145 typedef struct
146 {
147     BYTE        SRB_Cmd;                // ASPI command code = SC_EXEC_SCSI_CMD
148     BYTE        SRB_Status;             // ASPI command status byte
149     BYTE        SRB_HaId;               // ASPI host adapter number
150     BYTE        SRB_Flags;              // ASPI request flags
151     DWORD       SRB_Hdr_Rsvd;           // Reserved, MUST = 0
152     BYTE        SRB_Target;             // Target's SCSI ID
153     BYTE        SRB_Lun;                // Target's LUN number
154     WORD        SRB_Rsvd1;              // Reserved, MUST = 0
155     DWORD       SRB_BufLen;             // Data Allocation Length
156     BYTE        *SRB_BufPointer;        // Data Buffer Pointer
157     BYTE        SRB_SenseLen;           // Sense Allocation Length
158     BYTE        SRB_CDBLen;             // CDB Length = 10
159     BYTE        SRB_HaStat;             // Host Adapter Status
160     BYTE        SRB_TargStat;           // Target Status
161     void        (*SRB_PostProc)();      // Post routine
162     void        *SRB_Rsvd2;             // Reserved
163     BYTE        SRB_Rsvd3[16];          // Reserved for expansion
164     BYTE        CDBByte[16];            // SCSI CDB
165     BYTE        SenseArea12[SENSE_LEN+2]; // Request Sense buffer
166 } SRB_ExecSCSICmd12;
167 
168 
169 typedef struct
170 {
171     BYTE        SRB_Cmd;            // ASPI command code = SC_ABORT_SRB
172     BYTE        SRB_Status;         // ASPI command status byte
173     BYTE        SRB_HaId;           // ASPI host adapter number
174     BYTE        SRB_Flags;          // ASPI request flags
175     DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
176     void        *SRB_ToAbort;       // Pointer to SRB to abort
177 } SRB_Abort;
178 
179 typedef struct
180 {
181     BYTE        SRB_Cmd;            // ASPI command code = SC_RESET_DEV
182     BYTE        SRB_Status;         // ASPI command status byte
183     BYTE        SRB_HaId;           // ASPI host adapter number
184     BYTE        SRB_Flags;          // ASPI request flags
185     DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
186     BYTE        SRB_Target;         // Target's SCSI ID
187     BYTE        SRB_Lun;            // Target's LUN number
188     BYTE        SRB_ResetRsvd1[12]; // Reserved, MUST = 0
189     BYTE        SRB_HaStat;         // Host Adapter Status
190     BYTE        SRB_TargStat;       // Target Status
191     void        *SRB_PostProc;      // Post routine
192     void        *SRB_Rsvd2;         // Reserved
193     BYTE        SRB_Rsvd3[32];      // Reserved
194 } SRB_BusDeviceReset;
195 
196 
197 typedef struct
198 {
199   BYTE  res0;
200   BYTE  TRACK_adr_contrl;
201   BYTE  TRACK_nr;
202   BYTE  res1;
203   DWORD TRACK_abs_adr;
204 } TRACK;
205 
206 typedef struct
207 {
208     WORD        TOC_len;
209     BYTE        TOC_first;
210     BYTE        TOC_last;
211     TRACK       track[99];
212 } TOC;
213 
214 
215 
216 void ASPIPostProc6  (SRB_ExecSCSICmd6  *DoneSRB);
217 void ASPIPostProc10 (SRB_ExecSCSICmd10 *DoneSRB);
218 void ASPIPostProc12 (SRB_ExecSCSICmd12 *DoneSRB);
219 
220