• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  * include/nuttx/scsi.h
3  *
4  *   Copyright (C) 2008, 2009 Gregory Nutt. All rights reserved.
5  *   Author: Gregory Nutt <gnutt@nuttx.org>
6  *
7  * References:
8  *   "SCSI Primary Commands - 3 (SPC-3),"  American National Standard
9  *   for Information Technology, May 4, 2005
10  *
11  *   "SCSI Primary Commands - 4 (SPC-4),"  American National Standard
12  *   for Information Technology, July 19, 2008
13  *
14  *   "SCSI Block Commands -2 (SBC-2)," American National Standard
15  *   for Information Technology, November 13, 2004
16  *
17  *   "SCSI Multimedia Commands - 3 (MMC-3),"  American National Standard
18  *   for Information Technology, November 12, 2001
19  *
20  * Redistribution and use in source and binary forms, with or without
21  * modification, are permitted provided that the following conditions
22  * are met:
23  *
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in
28  *    the documentation and/or other materials provided with the
29  *    distribution.
30  * 3. Neither the name NuttX nor the names of its contributors may be
31  *    used to endorse or promote products derived from this software
32  *    without specific prior written permission.
33  *
34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
37  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
38  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
39  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
40  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
41  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
42  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
44  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
45  * POSSIBILITY OF SUCH DAMAGE.
46  *
47  ****************************************************************************/
48 
49 #ifndef __INCLUDE_NUTTX_SCSI_H
50 #define __INCLUDE_NUTTX_SCSI_H
51 
52 /****************************************************************************
53  * Included Files
54  ****************************************************************************/
55 
56 /****************************************************************************
57  * Pre-processor Definitions
58  ****************************************************************************/
59 
60 /* SCSI commands ************************************************************/
61 
62 #define SCSI_CMD_TESTUNITREADY                   0x00
63 #define SCSI_CMD_REZEROUNIT                      0x01
64 #define SCSI_CMD_REQUESTSENSE                    0x03
65 #define SCSI_CMD_FORMAT_UNIT                     0x04
66 #define SCSI_CMD_REASSIGNBLOCKS                  0x07
67 #define SCSI_CMD_READ6                           0x08
68 #define SCSI_CMD_WRITE6                          0x0a
69 #define SCSI_CMD_SEEK6                           0x0b
70 #define SCSI_CMD_SPACE6                          0x11
71 #define SCSI_CMD_INQUIRY                         0x12
72 #define SCSI_CMD_MODESELECT6                     0x15
73 #define SCSI_CMD_RESERVE6                        0x16
74 #define SCSI_CMD_RELEASE6                        0x17
75 #define SCSI_CMD_COPY                            0x18
76 #define SCSI_CMD_MODESENSE6                      0x1a
77 #define SCSI_CMD_STARTSTOPUNIT                   0x1b
78 #define SCSI_CMD_RECEIVEDIAGNOSTICRESULTS        0x1c
79 #define SCSI_CMD_SENDDIAGNOSTIC                  0x1d
80 #define SCSI_CMD_PREVENTMEDIAREMOVAL             0x1e
81 #define SCSI_CMD_READFORMATCAPACITIES            0x23
82 #define SCSI_CMD_READCAPACITY10                  0x25
83 #define SCSI_CMD_READ10                          0x28
84 #define SCSI_CMD_WRITE10                         0x2a
85 #define SCSI_CMD_READ16                          0x88
86 #define SCSI_CMD_WRITE16                         0x8a
87 #define SCSI_CMD_SEEK10                          0x2b
88 #define SCSI_CMD_WRITEANDVERIFY                  0x2e
89 #define SCSI_CMD_VERIFY10                        0x2f
90 #define SCSI_CMD_SEARCHDATAHIGH                  0x30
91 #define SCSI_CMD_SEARCHDATAEQUAL                 0x31
92 #define SCSI_CMD_SEARCHDATALOW                   0x32
93 #define SCSI_CMD_SETLIMITS10                     0x33
94 #define SCSI_CMD_PREFETCH10                      0x34
95 #define SCSI_CMD_SYNCHCACHE10                    0x35
96 #define SCSI_CMD_LOCKCACHE                       0x36
97 #define SCSI_CMD_READDEFECTDATA10                0x37
98 #define SCSI_CMD_COMPARE                         0x39
99 #define SCSI_CMD_COPYANDVERIFY                   0x3a
100 #define SCSI_CMD_WRITEBUFFER                     0x3b
101 #define SCSI_CMD_READBUFFER                      0x3c
102 #define SCSI_CMD_READLONG10                      0x3e
103 #define SCSI_CMD_WRITELONG10                     0x3f
104 #define SCSI_CMD_CHANGEDEFINITION                0x40
105 #define SCSI_CMD_WRITESAME10                     0x41
106 #define SCSI_CMD_LOGSELECT                       0x4c
107 #define SCSI_CMD_LOGSENSE                        0x4d
108 #define SCSI_CMD_XDWRITE10                       0x50
109 #define SCSI_CMD_XPWRITE10                       0x51
110 #define SCSI_CMD_XDREAD10                        0x52
111 #define SCSI_CMD_MODESELECT10                    0x55
112 #define SCSI_CMD_RESERVE10                       0x56
113 #define SCSI_CMD_RELEASE10                       0x57
114 #define SCSI_CMD_MODESENSE10                     0x5a
115 #define SCSI_CMD_PERSISTENTRESERVEIN             0x5e
116 #define SCSI_CMD_PERSISTENTRESERVEOUT            0x5f
117 #define SCSI_CMD_32                              0x7f
118 #define SCSI_CMD_XDWRITEEXTENDED                 0x80
119 #define SCSI_CMD_REBUILD                         0x82
120 #define SCSI_CMD_REGENERATE                      0x82
121 #define SCSI_CMD_EXTENDEDCOPY                    0x83
122 #define SCSI_CMD_COPYRESULTS                     0x84
123 #define SCSI_CMD_ACCESSCONTROLIN                 0x86
124 #define SCSI_CMD_ACCESSCONTROLOUT                0x87
125 #define SCSI_CMD_READ16                          0x88
126 #define SCSI_CMD_WRITE16                         0x8a
127 #define SCSI_CMD_READATTRIBUTE                   0x8c
128 #define SCSI_CMD_WRITEATTRIBUTE                  0x8d
129 #define SCSI_CMD_WRITEANDVERIFY16                0x8e
130 #define SCSI_CMD_PREFETCH16                      0x90
131 #define SCSI_CMD_SYNCHCACHE16                    0x91
132 #define SCSI_CMD_LOCKUNLOCKACACHE                0x92
133 #define SCSI_CMD_WRITESAME16                     0x93
134 #define SCSI_CMD_READCAPACITY16                  0x9e
135 #define SCSI_CMD_READLONG16                      0x9e
136 #define SCSI_CMD_WRITELONG106                    0x9f
137 #define SCSI_CMD_REPORTLUNS                      0xa0
138 #define SCSI_CMD_MAINTENANCEIN                   0xa3
139 #define SCSI_CMD_MAINTENANCEOUT                  0xa4
140 #define SCSI_CMD_MOVEMEDIUM                      0xa5
141 #define SCSI_CMD_MOVEMEDIUMATTACHED              0xa7
142 #define SCSI_CMD_READ12                          0xa8
143 #define SCSI_CMD_WRITE12                         0xaa
144 #define SCSI_CMD_READMEDIASERIALNUMBER           0xab
145 #define SCSI_CMD_WRITEANDVERIFY12                0xae
146 #define SCSI_CMD_VERIFY12                        0xaf
147 #define SCSI_CMD_SETLIMITS12                     0xb3
148 #define SCSI_CMD_READELEMENTSTATUS               0xb4
149 #define SCSI_CMD_READDEFECTDATA12                0xb7
150 #define SCSI_CMD_REDUNDANCYGROUPIN               0xba
151 #define SCSI_CMD_REDUNDANCYGROUPOUT              0xbb
152 #define SCSI_CMD_SPAREIN                         0xbc
153 #define SCSI_CMD_SPAREOUT                        0xbd
154 #define SCSI_CMD_VOLUMESETIN                     0xbe
155 #define SCSI_CMD_VOLUMESETOUT                    0xbf
156 
157 /* Common SCSI KCQ values (sense Key/additional sense Code/ASC Qualifier) ***
158  *
159  *   0xnn0386  Write Fault Data Corruption
160  *   0xnn0500  Illegal request
161  *   0xnn0600  Unit attention
162  *   0xnn0700  Data protect
163  *   0xnn0800  LUN communication failure
164  *   0xnn0801  LUN communication timeout
165  *   0xnn0802  LUN communication parity error
166  *   0xnn0803  LUN communication CRC error
167  *   0xnn0900  vendor specific sense key
168  *   0xnn0901  servo fault
169  *   0xnn0904  head select fault
170  *   0xnn0a00  error log overflow
171  *   0xnn0b00  aborted command
172  *   0xnn0c00  write error
173  *   0xnn0c02  write error - auto-realloc failed
174  *   0xnn0e00  data miscompare
175  *   0xnn1200  address mark not founf for ID field
176  *   0xnn1400  logical block not found
177  *   0xnn1500  random positioning error
178  *   0xnn1501  mechanical positioning error
179  *   0xnn1502  positioning error detected by read of medium
180  *   0xnn2700  write protected
181  *   0xnn2900  POR or bus reset occurred
182  *   0xnn3101  format failed
183  *   0xnn3191  format corrupted
184  *   0xnn3201  defect list update error
185  *   0xnn3202  no spares available
186  *   0xnn3501  unspecified enclosure services failure
187  *   0xnn3700  parameter rounded
188  *   0xnn3d00  invalid bits in identify message
189  *   0xnn3e00  LUN not self-configured yet
190  *   0xnn4001  DRAM parity error
191  *   0xnn4002  DRAM parity error
192  *   0xnn4200  power-on or self-test failure
193  *   0xnn4c00  LUN failed self-configuration
194  *   0xnn5c00  RPL status change
195  *   0xnn5c01  spindles synchronized
196  *   0xnn5c02  spindles not synchronized
197  *   0xnn6500  voltage fault
198  *   0xnn8000  general firmware error
199  */
200 
201 /* No sense KCQ values */
202 
203 #define SCSI_KCQ_NOSENSE                         0x000000  /* No error */
204 #define SCSI_KCQ_PFATHRESHOLDREACHED             0x005c00  /* No sense - PFA threshold reached */
205 
206 /* Soft error KCQ values */
207 
208 #define SCSI_KCQSE_RWENOINDEX                    0x010100  /* Recovered Write error - no index */
209 #define SCSI_KCQSE_RECOVEREDNOSEEKCOMPLETION     0x010200  /* Recovered no seek completion */
210 #define SCSI_KCQSE_RWEWRITEFAULT                 0x010300  /* Recovered Write error - write fault */
211 #define SCSI_KCQSE_TRACKFOLLOWINGERROR           0x010900  /* Track following error */
212 #define SCSI_KCQSE_TEMPERATUREWARNING            0x010b01  /* Temperature warning */
213 #define SCSI_KCQSE_RWEWARREALLOCATED             0x010c01  /* Recovered Write error with auto-realloc - reallocated */
214 #define SCSI_KCQSE_RWERECOMMENDREASSIGN          0x010c03  /* Recovered Write error - recommend reassign */
215 #define SCSI_KCQSE_RDWOEUSINGPREVLBI             0x011201  /* Recovered data without ECC using prev logical block ID */
216 #define SCSI_KCQSE_RDWEUSINGPREVLBI              0x011202  /* Recovered data with ECC using prev logical block ID */
217 #define SCSI_KCQSE_RECOVEREDRECORDNOTFOUND       0x011401  /* Recovered Record Not Found */
218 #define SCSI_KCQSE_RWEDSME                       0x011600  /* Recovered Write error - Data Sync Mark Error */
219 #define SCSI_KCQSE_RWEDSEDATAREWRITTEN           0x011601  /* Recovered Write error - Data Sync Error - data rewritten */
220 #define SCSI_KCQSE_RWEDSERECOMMENDREWRITE        0x011602  /* Recovered Write error - Data Sync Error - recommend rewrite */
221 #define SCSI_KCQSE_RWEDSEDATAAUTOREALLOCATED     0x011603  /* Recovered Write error - Data Sync Error - data auto-reallocated */
222 #define SCSI_KCQSE_RWEDSERECOMMENDREASSIGNMENT   0x011604  /* Recovered Write error - Data Sync Error - recommend reassignment */
223 #define SCSI_KCQSE_RDWNECORRECTIONAPPLIED        0x011700  /* Recovered data with no error correction applied */
224 #define SCSI_KCQSE_RREWITHRETRIES                0x011701  /* Recovered Read error - with retries */
225 #define SCSI_KCQSE_RDUSINGPOSITIVEOFFSET         0x011702  /* Recovered data using positive offset */
226 #define SCSI_KCQSE_RDUSINGNEGATIVEOFFSET         0x011703  /* Recovered data using negative offset */
227 #define SCSI_KCQSE_RDUSINGPREVIOUSLBI            0x011705  /* Recovered data using previous logical block ID */
228 #define SCSI_KCQSE_RREWOEAUTOREALLOCATED         0x011706  /* Recovered Read error - without ECC, auto reallocated */
229 #define SCSI_KCQSE_RREWOERECOMMENDREASSIGN       0x011707  /* Recovered Read error - without ECC, recommend reassign */
230 #define SCSI_KCQSE_RREWOERECOMMENDREWRITE        0x011708  /* Recovered Read error - without ECC, recommend rewrite */
231 #define SCSI_KCQSE_RREWOEDATAREWRITTEN           0x011709  /* Recovered Read error - without ECC, data rewritten */
232 #define SCSI_KCQSE_RREWE                         0x011800  /* Recovered Read error - with ECC */
233 #define SCSI_KCQSE_RDWEANDRETRIES                0x011801  /* Recovered data with ECC and retries */
234 #define SCSI_KCQSE_RREWEAUTOREALLOCATED          0x011802  /* Recovered Read error - with ECC, auto reallocated */
235 #define SCSI_KCQSE_RREWERECOMMENDREASSIGN        0x011805  /* Recovered Read error - with ECC, recommend reassign */
236 #define SCSI_KCQSE_RDUSINGECCANDOFFSETS          0x011806  /* Recovered data using ECC and offsets */
237 #define SCSI_KCQSE_RREWEDATAREWRITTEN            0x011807  /* Recovered Read error - with ECC, data rewritten */
238 #define SCSI_KCQSE_DLNOTFOUND                    0x011c00  /* Defect List not found */
239 #define SCSI_KCQSE_PRIMARYDLNOTFOUND             0x011c01  /* Primary defect list not found */
240 #define SCSI_KCQSE_GROWNDLNOTFOUND               0x011c02  /* Grown defect list not found */
241 #define SCSI_KCQSE_PARTIALDLTRANSFERRED          0x011f00  /* Partial defect list transferred */
242 #define SCSI_KCQSE_INTERNALTARGETFAILURE         0x014400  /* Internal target failure */
243 #define SCSI_KCQSE_PFATHRESHOLDREACHED           0x015d00  /* PFA threshold reached */
244 #define SCSI_KCQSE_PFATESTWARNING                0x015dff  /* PFA test warning */
245 #define SCSI_KCQSE_INTERNALLOGICFAILURE          0x018100  /* Internal logic failure */
246 
247 /* Not Ready / Diagnostic Failure KCQ values */
248 
249 #define SCSI_KCQNR_CAUSENOTREPORTABLE            0x020400  /* Not Ready - Cause not reportable. */
250 #define SCSI_KCQNR_BECOMINGREADY                 0x020401  /* Not Ready - becoming ready */
251 #define SCSI_KCQNR_NEEDINITIALIZECOMMAND         0x020402  /* Not Ready - need initialize command (start unit) */
252 #define SCSI_KCQNR_MANUALINTERVENTIONREQUIRED    0x020403  /* Not Ready - manual intervention required */
253 #define SCSI_KCQNR_FORMATINPROGRESS              0x020404  /* Not Ready - format in progress */
254 #define SCSI_KCQNR_SELFTESTINPROGRESS            0x020409  /* Not Ready - self-test in progress */
255 #define SCSI_KCQNR_MEDIUMFORMATCORRUPTED         0x023100  /* Not Ready - medium format corrupted */
256 #define SCSI_KCQNR_FORMATCOMMANDFAILED           0x023101  /* Not Ready - format command failed */
257 #define SCSI_KCQNR_ESUNAVAILABLE                 0x023502  /* Not Ready - enclosure services unavailable */
258 #define SCSI_KCQNR_MEDIANOTPRESENT               0x023a00  /* Not Ready - media not present */
259 #define SCSI_KCQDF_BRINGUPFAILORDEGRADEDMODE     0x024080  /* Diagnostic Failure - bring-up fail or degraded mode */
260 #define SCSI_KCQDF_HARDDISKCONTROLLER            0x024081  /* Diagnostic Failure - Hard Disk Controller */
261 #define SCSI_KCQDF_RAMMICROCODENOTLOADED         0x024085  /* Diagnostic Failure - RAM microcode not loaded */
262 #define SCSI_KCQDF_RROCALIBRATION                0x024090  /* Diagnostic Failure - RRO Calibration */
263 #define SCSI_KCQDF_CHANNELCALIBRATION            0x024091  /* Diagnostic Failure - Channel Calibration */
264 #define SCSI_KCQDF_HEADLOAD                      0x024092  /* Diagnostic Failure - Head Load */
265 #define SCSI_KCQDF_WRITEAE                       0x024093  /* Diagnostic Failure - Write AE */
266 #define SCSI_KCQDF_12VOVERCURRENT                0x024094  /* Diagnostic Failure - 12V over current */
267 #define SCSI_KCQDF_OTHERSPINDLEFAILURE           0x024095  /* Diagnostic Failure - Other spindle failure */
268 #define SCSI_KCQDF_SELFRESET                     0x0240b0  /* Diagnostic Failure - self-reset */
269 #define SCSI_KCQDF_CONFIGNOTLOADED               0x024c00  /* Diagnostic Failure - config not loaded */
270 
271 /* Medium error KCQ values */
272 
273 #define SCSI_KCQME_WRITEFAULT                    0x030300  /* Medium Error - write fault */
274 #define SCSI_KCQME_WRITEFAULTAUTOREALLOCFAILED   0x030c02  /* Medium Error - write error - auto-realloc failed */
275 #define SCSI_KCQME_WRITERTLIMITEXCEEDED          0x030cbb  /* Medium Error - write recovery time limit exceeded */
276 #define SCSI_KCQME_IDCRCERROR                    0x031000  /* Medium Error - ID CRC error */
277 #define SCSI_KCQME_UNRRE1                        0x031100  /* Medium Error - unrecovered read error */
278 #define SCSI_KCQME_READRETRIESEXHAUSTED          0x031101  /* Medium Error - read retries exhausted */
279 #define SCSI_KCQME_ERRORTOOLONGTOCORRECT         0x031102  /* Medium Error - error too long to correct */
280 #define SCSI_KCQME_UREAUTOREALLOCFAILED          0x031104  /* Medium Error - unrecovered read error - auto re-alloc failed */
281 #define SCSI_KCQME_URERECOMMENDREASSIGN          0x03110b  /* Medium Error - unrecovered read error - recommend reassign */
282 #define SCSI_KCQME_READRTLIMITEXCEEDED           0x0311ff  /* Medium Error - read recovery time limit exceeded */
283 #define SCSI_KCQME_RECORDNOTFOUND                0x031401  /* Medium Error - record not found */
284 #define SCSI_KCQME_DSME                          0x031600  /* Medium Error - Data Sync Mark error */
285 #define SCSI_KCQME_DSERECOMMENDREASSIGN          0x031604  /* Medium Error - Data Sync Error - recommend reassign */
286 #define SCSI_KCQME_DLE                           0x031900  /* Medium Error - defect list error */
287 #define SCSI_KCQME_DLNOTAVAILABLE                0x031901  /* Medium Error - defect list not available */
288 #define SCSI_KCQME_DLEINPRIMARYLIST              0x031902  /* Medium Error - defect list error in primary list */
289 #define SCSI_KCQME_DLEINGROWNLIST                0x031903  /* Medium Error - defect list error in grown list */
290 #define SCSI_KCQME_FEWERTHAN50PCTDLCOPIES        0x03190e  /* Medium Error - fewer than 50% defect list copies */
291 #define SCSI_KCQME_MEDIUMFORMATCORRUPTED         0x033100  /* Medium Error - medium format corrupted */
292 #define SCSI_KCQME_FORMATCOMMANDFAILED           0x033101  /* Medium Error - format command failed */
293 #define SCSI_KCQME_DATAAUTOREALLOCATED           0x038000  /* Medium Error - data auto-reallocated */
294 
295 /* Hardware Error KCQ values */
296 
297 #define SCSI_KCQHE_NOINDEXORSECTOR               0x040100  /* Hardware Error - no index or sector */
298 #define SCSI_KCQHE_NOSEEKCOMPLETE                0x040200  /* Hardware Error - no seek complete */
299 #define SCSI_KCQHE_WRITEFAULT                    0x040300  /* Hardware Error - write fault */
300 #define SCSI_KCQHE_COMMUNICATIONFAILURE          0x040800  /* Hardware Error - communication failure */
301 #define SCSI_KCQHE_TRACKFOLLOWINGERROR           0x040900  /* Hardware Error - track following error */
302 #define SCSI_KCQHE_UREINRESERVEDAREA             0x041100  /* Hardware Error - unrecovered read error in reserved area */
303 #define SCSI_KCQHE_DSMEINRESERVEDAREA            0x041600  /* Hardware Error - Data Sync Mark error in reserved area */
304 #define SCSI_KCQHE_DLE                           0x041900  /* Hardware Error - defect list error */
305 #define SCSI_KCQHE_DLEINPRIMARYLIST              0x041902  /* Hardware Error - defect list error in Primary List */
306 #define SCSI_KCQHE_DLEINGROWNLIST                0x041903  /* Hardware Error - defect list error in Grown List */
307 #define SCSI_KCQHE_REASSIGNFAILED                0x043100  /* Hardware Error - reassign failed */
308 #define SCSI_KCQHE_NODEFECTSPAREAVAILABLE        0x043200  /* Hardware Error - no defect spare available */
309 #define SCSI_KCQHE_UNSUPPORTEDENCLOSUREFUNCTION  0x043501  /* Hardware Error - unsupported enclosure function */
310 #define SCSI_KCQHE_ESUNAVAILABLE                 0x043502  /* Hardware Error - enclosure services unavailable */
311 #define SCSI_KCQHE_ESTRANSFERFAILURE             0x043503  /* Hardware Error - enclosure services transfer failure */
312 #define SCSI_KCQHE_ESREFUSED                     0x043504  /* Hardware Error - enclosure services refused */
313 #define SCSI_KCQHE_SELFTESTFAILED                0x043e03  /* Hardware Error - self-test failed */
314 #define SCSI_KCQHE_UNABLETOUPDATESELFTEST        0x043e04  /* Hardware Error - unable to update self-test */
315 #define SCSI_KCQHE_DMDIAGNOSTICFAIL              0x044080  /* Hardware Error - Degrade Mode. Diagnostic Fail */
316 #define SCSI_KCQHE_DMHWERROR                     0x044081  /* Hardware Error - Degrade Mode. H/W Error */
317 #define SCSI_KCQHE_DMRAMMICROCODENOTLOADED       0x044085  /* Hardware Error - Degrade Mode. RAM microcode not loaded */
318 #define SCSI_KCQHE_SEEKTESTFAILURE               0x044090  /* Hardware Error - seek test failure */
319 #define SCSI_KCQHE_READWRITETESTFAILURE          0x0440a0  /* Hardware Error - read/write test failure */
320 #define SCSI_KCQHE_DEVICESELFRESET               0x0440b0  /* Hardware Error - device self-reset */
321 #define SCSI_KCQHE_COMPONENTMISMATCH             0x0440d0  /* Hardware Error - component mismatch */
322 #define SCSI_KCQHE_INTERNALTARGETFAILURE         0x044400  /* Hardware Error - internal target failure */
323 #define SCSI_KCQHE_INTERNALLOGICERROR            0x048100  /* Hardware Error - internal logic error */
324 #define SCSI_KCQHE_COMMANDTIMEOUT                0x048200  /* Hardware Error - command timeout */
325 
326 /* Illegal Request KCQ values */
327 
328 #define SCSI_KCQIR_PARMLISTLENGTHERROR           0x051a00  /* Illegal Request - parm list length error */
329 #define SCSI_KCQIR_INVALIDCOMMAND                0x052000  /* Illegal Request - invalid/unsupported command code */
330 #define SCSI_KCQIR_LBAOUTOFRANGE                 0x052100  /* Illegal Request - LBA out of range */
331 #define SCSI_KCQIR_INVALIDFIELDINCBA             0x052400  /* Illegal Request - invalid field in CDB (Command Descriptor Block) */
332 #define SCSI_KCQIR_INVALIDLUN                    0x052500  /* Illegal Request - invalid LUN */
333 #define SCSI_KCQIR_INVALIDFIELDSINPARMLIST       0x052600  /* Illegal Request - invalid fields in parm list */
334 #define SCSI_KCQIR_PARAMETERNOTSUPPORTED         0x052601  /* Illegal Request - parameter not supported */
335 #define SCSI_KCQIR_INVALIDPARMVALUE              0x052602  /* Illegal Request - invalid parm value */
336 #define SCSI_KCQIR_IFPTHRESHOLDPARAMETER         0x052603  /* Illegal Request - invalid field parameter - threshold parameter */
337 #define SCSI_KCQIR_INVALIDRELEASEOFPR            0x052604  /* Illegal Request - invalid release of persistent reservation */
338 #define SCSI_KCQIR_IFPTMSFIRMWARETAG             0x052697  /* Illegal Request - invalid field parameter - TMS firmware tag */
339 #define SCSI_KCQIR_IFPCHECKSUM                   0x052698  /* Illegal Request - invalid field parameter - check sum */
340 #define SCSI_KCQIR_IFPFIRMWARETAG                0x052699  /* Illegal Request - invalid field parameter - firmware tag */
341 #define SCSI_KCQIR_COMMANDSEQUENCEERROR          0x052c00  /* Illegal Request - command sequence error */
342 #define SCSI_KCQIR_UNSUPPORTEDENCLOSUREFUNCTION  0x053501  /* Illegal Request - unsupported enclosure function */
343 #define SCSI_KCQIR_SAVINGPARMSNOTSUPPORTED       0x053900  /* Illegal Request - Saving parameters not supported */
344 #define SCSI_KCQIR_INVALIDMESSAGE                0x054900  /* Illegal Request - invalid message */
345 #define SCSI_KCQIR_MEDIALOADOREJECTFAILED        0x055300  /* Illegal Request - media load or eject failed */
346 #define SCSI_KCQIR_UNLOADTAPEFAILURE             0x055301  /* Illegal Request - unload tape failure */
347 #define SCSI_KCQIR_MEDIUMREMOVALPREVENTED        0x055302  /* Illegal Request - medium removal prevented */
348 #define SCSI_KCQIR_SYSTEMRESOURCEFAILURE         0x055500  /* Illegal Request - system resource failure */
349 #define SCSI_KCQIR_SYSTEMBUFFERFULL              0x055501  /* Illegal Request - system buffer full */
350 #define SCSI_KCQIR_INSUFFICIENTRR                0x055504  /* Illegal Request - Insufficient Registration Resources */
351 
352 /* Unit Attention KCQ values */
353 
354 #define SCSI_KCQUA_NOTREADYTOTRANSITION          0x062800  /* Unit Attention - not-ready to ready transition (format complete) */
355 #define SCSI_KCQUA_DEVICERESETOCCURRED           0x062900  /* Unit Attention - POR or device reset occurred */
356 #define SCSI_KCQUA_POROCCURRED                   0x062901  /* Unit Attention - POR occurred */
357 #define SCSI_KCQUA_SCSIBUSRESETOCCURRED          0x062902  /* Unit Attention - SCSI bus reset occurred */
358 #define SCSI_KCQUA_TARGETRESETOCCURRED           0x062903  /* Unit Attention - TARGET RESET occurred */
359 #define SCSI_KCQUA_SELFINITIATEDRESETOCCURRED    0x062904  /* Unit Attention - self-initiated-reset occurred */
360 #define SCSI_KCQUA_TRANSCEIVERMODECHANGETOSE     0x062905  /* Unit Attention - transceiver mode change to SE */
361 #define SCSI_KCQUA_TRANSCEIVERMODECHANGETOLVD    0x062906  /* Unit Attention - transceiver mode change to LVD */
362 #define SCSI_KCQUA_PARAMETERSCHANGED             0x062a00  /* Unit Attention - parameters changed */
363 #define SCSI_KCQUA_MODEPARAMETERSCHANGED         0x062a01  /* Unit Attention - mode parameters changed */
364 #define SCSI_KCQUA_LOGSELECTPARMSCHANGED         0x062a02  /* Unit Attention - log select parms changed */
365 #define SCSI_KCQUA_RESERVATIONSPREEMPTED         0x062a03  /* Unit Attention - Reservations pre-empted */
366 #define SCSI_KCQUA_RESERVATIONSRELEASED          0x062a04  /* Unit Attention - Reservations released */
367 #define SCSI_KCQUA_REGISTRATIONSPREEMPTED        0x062a05  /* Unit Attention - Registrations pre-empted */
368 #define SCSI_KCQUA_COMMANDSCLEARED               0x062f00  /* Unit Attention - commands cleared by another initiator */
369 #define SCSI_KCQUA_OPERATINGCONDITIONSCHANGED    0x063f00  /* Unit Attention - target operating conditions have changed */
370 #define SCSI_KCQUA_MICROCODECHANGED              0x063f01  /* Unit Attention - microcode changed */
371 #define SCSI_KCQUA_CHANGEDOPERATINGDEFINITION    0x063f02  /* Unit Attention - changed operating definition */
372 #define SCSI_KCQUA_INQUIRYPARAMETERSCHANGED      0x063f03  /* Unit Attention - inquiry parameters changed */
373 #define SCSI_KCQUA_DEVICEIDENTIFIERCHANGED       0x063f05  /* Unit Attention - device identifier changed */
374 #define SCSI_KCQUA_INVALIDAPMPARAMETERS          0x063f90  /* Unit Attention - invalid APM parameters */
375 #define SCSI_KCQUA_WORLDWIDENAMEMISMATCH         0x063f91  /* Unit Attention - world-wide name mismatch */
376 #define SCSI_KCQUA_PFATHRESHOLDREACHED           0x065d00  /* Unit Attention - PFA threshold reached */
377 #define SCSI_KCQUA_PFATHRESHOLDEXCEEDED          0x065dff  /* Unit Attention - PFA threshold exceeded */
378 
379 /* Write Protect KCQ values */
380 
381 #define SCSI_KCQWP_COMMANDNOTALLOWED             0x072700 /* Write Protect - command not allowed */
382 
383 /* Aborted Command KCQ values */
384 
385 #define SCSI_KCQAC_NOADDITIONALSENSECODE         0x0b0000  /* Aborted Command - no additional sense code */
386 #define SCSI_KCQAC_SYNCDATATRANSFERERROR         0x0b1b00  /* Aborted Command - sync data transfer error (extra ACK) */
387 #define SCSI_KCQAC_UNSUPPORTEDLUN                0x0b2500  /* Aborted Command - unsupported LUN */
388 #define SCSI_KCQAC_ECHOBUFFEROVERWRITTEN         0x0b3f0f  /* Aborted Command - echo buffer overwritten */
389 #define SCSI_KCQAC_MESSAGEREJECTERROR            0x0b4300  /* Aborted Command - message reject error */
390 #define SCSI_KCQAC_INTERNALTARGETFAILURE         0x0b4400  /* Aborted Command - internal target failure */
391 #define SCSI_KCQAC_SELECTIONFAILURE              0x0b4500  /* Aborted Command - Selection/Reselection failure */
392 #define SCSI_KCQAC_SCSIPARITYERROR               0x0b4700  /* Aborted Command - SCSI parity error */
393 #define SCSI_KCQAC_INITIATORDETECTEDERRORECEIVED 0x0b4800  /* Aborted Command - initiator-detected error message received */
394 #define SCSI_KCQAC_ILLEGALMESSAGE                0x0b4900  /* Aborted Command - inappropriate/illegal message */
395 #define SCSI_KCQAC_DATAPHASEERROR                0x0b4b00  /* Aborted Command - data phase error */
396 #define SCSI_KCQAC_OVERLAPPEDCOMMANDSATTEMPTED   0x0b4e00  /* Aborted Command - overlapped commands attempted */
397 #define SCSI_KCQAC_LOOPINITIALIZATION            0x0b4f00  /* Aborted Command - due to loop initialization */
398 
399 /* Other KCQ values: */
400 
401 #define SCSO_KCQOTHER_MISCOMPARE                 0x0e1d00  /* Miscompare - during verify byte check operation */
402 
403 /* SSCSI Status Codes *******************************************************/
404 
405 #define SCSI_STATUS_OK                           0x00  /* OK */
406 #define SCSI_STATUS_CHECKCONDITION               0x02  /* Check condition */
407 #define SCSI_STATUS_CONDITIONMET                 0x04  /* Condition met */
408 #define SCSI_STATUS_BUSY                         0x08  /* Busy */
409 #define SCSI_STATUS_INTERMEDIATE                 0x10  /* Intermediate */
410 #define SCSI_STATUS_DATAOVERUNDERRUN             0x12  /* Data Under/Over Run? */
411 #define SCSI_STATUS_INTERMEDIATECONDITIONMET     0x14  /* Intermediate - Condition met */
412 #define SCSI_STATUS_RESERVATIONCONFLICT          0x18  /* Reservation conflict */
413 #define SCSI_STATUS_COMMANDTERMINATED            0x22  /* Command terminated */
414 #define SCSI_STATUS_QUEUEFULL                    0x28  /* Queue (task set) full */
415 #define SCSI_STATUS_ACAACTIVE                    0x30  /* ACA active */
416 #define SCSI_STATUS_TASKABORTED                  0x40  /* Task aborted */
417 
418 /* Definitions for selected SCSI commands ***********************************/
419 
420 /* Inquiry */
421 
422 #define SCSICMD_INQUIRYFLAGS_EVPD                0x01  /* Bit 0: EVPD */
423                                                        /* Bits 5-7: Peripheral Qualifier */
424 #define SCSIRESP_INQUIRYPQ_CONNECTED             0x00  /*   000: Device is connected */
425 #define SCSIRESP_INQUIRYPQ_NOTCONNECTED          0x20  /*   001: Device is NOT connected */
426 #define SCSIRESP_INQUIRYPQ_NOTCAPABLE            0x60  /*   011: LUN not supported */
427                                                        /* Bits 0-4: Peripheral Device */
428 #define SCSIRESP_INQUIRYPD_DIRECTACCESS          0x00  /*   Direct-access block device */
429 #define SCSIRESP_INQUIRYPD_SEQUENTIALACCESS      0x01  /*   Sequential-access block device */
430 #define SCSIRESP_INQUIRYPD_PRINTER               0x02  /*   Printer device */
431 #define SCSIRESP_INQUIRYPD_PROCESSOR             0x03  /*   Processor device */
432 #define SCSIRESP_INQUIRYPD_WRONCE                0x04  /*   Write once device */
433 #define SCSIRESP_INQUIRYPD_CDDVD                 0x05  /*   CD/DVD device */
434 #define SCSIRESP_INQUIRYPD_SCANNER               0x06  /*   Scanner device (obsolete) */
435 #define SCSIRESP_INQUIRYPD_OPTICAL               0x07  /*   Optical memory device */
436 #define SCSIRESP_INQUIRYPD_MEDIUMCHANGER         0x08  /*   Medium changer device (Jukebox) */
437 #define SCSIRESP_INQUIRYPD_COMMUNICATIONS        0x09  /*   Communications device (obsolete) */
438 #define SCSIRESP_INQUIRYPD_STORAGEARRAY          0x0c  /*   Storage array controller device */
439 #define SCSIRESP_INQUIRYPD_ENCLOSURESERVICES     0x0d  /*   Enclosure services device */
440 #define SCSIRESP_INQUIRYPD_RBC                   0x0e  /*   Simplified direct-access device */
441 #define SCSIRESP_INQUIRYPD_OCRW                  0x0f  /*   Optical reader/writer device */
442 #define SCSIRESP_INQUIRYPD_BCC                   0x10  /*   Bridge controller commands */
443 #define SCSIRESP_INQUIRYPD_OSD                   0x11  /*   Object-based storage device */
444 #define SCSIRESP_INQUIRYPD_ADC                   0x12  /*   Automation/drive interface */
445 #define SCSIRESP_INQUIRYPD_WKLU                  0x1e  /*   Well-known logical unit */
446 #define SCSIRESP_INQUIRYPD_UNKNOWN               0x1f  /*   Direct-access block device */
447 
448 #define SCSIRESP_INQUIRYFLAGS1_RMB               0x80  /* Bit 7: RMB */
449 #define SCSIRESP_INQUIRYFLAGS2_NORMACA           0x20  /* Bit 5: NormACA */
450 #define SCSIRESP_INQUIRYFLAGS2_HISUP             0x10  /* Bit 4: HiSup */
451 #define SCSIRESP_INQUIRYFLAGS2_FMTMASK           0x0f  /* Bits 0-3: Response data format */
452 
453 #define SCSIRESP_INQUIRYFLAGS3_SCCS              0x80  /* Bit 8: SCCS */
454 #define SCSIRESP_INQUIRYFLAGS3_ACC               0x40  /* Bit 7: ACC */
455 #define SCSIRESP_INQUIRYFLAGS3_TPGSMASK          0x30  /* Bits 4-5: TPGS */
456 #define SCSIRESP_INQUIRYFLAGS3_3PC               0x08  /* Bit 3: 3PC */
457 #define SCSIRESP_INQUIRYFLAGS3_PROTECT           0x01  /* Bit 0: Protect */
458 
459 #define SCSIRESP_INQUIRYFLAGS4_BQUE              0x80  /* Bit 7: BQue */
460 #define SCSIRESP_INQUIRYFLAGS4_ENCSERV           0x40  /* Bit 6: EncServ */
461 #define SCSIRESP_INQUIRYFLAGS4_VS                0x20  /* Bit 5: VS */
462 #define SCSIRESP_INQUIRYFLAGS4_MULTIP            0x10  /* Bit 4: MultIP */
463 #define SCSIRESP_INQUIRYFLAGS4_MCHNGR            0x08  /* Bit 3: MChngr */
464 #define SCSIRESP_INQUIRYFLAGS4_ADDR16            0x01  /* Bit 0: Addr16 */
465 
466 #define SCSIRESP_INQUIRYFLAGS5_WBUS16            0x20  /* Bit 5: WBus16 */
467 #define SCSIRESP_INQUIRYFLAGS5_SYNC              0x10  /* Bit 4: SYNC */
468 #define SCSIRESP_INQUIRYFLAGS5_LINKED            0x08  /* Bit 3: LINKED */
469 #define SCSIRESP_INQUIRYFLAGS5_CMDQUEUE          0x02  /* Bit 1: CmdQue */
470 #define SCSIRESP_INQUIRYFLAGS5_VS                0x01  /* Bit 0: VS */
471 
472 #define SCSIRESP_INQUIRYFLAGS6_CLOCKINGMASK      0xc0  /* Bits 2-3: Clocking */
473 #define SCSIRESP_INQUIRYFLAGS6_QAS               0x02  /* Bit 1: QAS */
474 #define SCSIRESP_INQUIRYFLAGS6_IUS               0x01  /* Bit 0: IUS */
475 
476 /* Sense data */
477 /* Sense data response codes */
478 
479 #define SCSIRESP_SENSEDATA_CURRENTFIXED          0x70 /* Byte 1 is always the response code */
480 #define SCSIRESP_SENSEDATA_DEFERREDFIXED         0x71
481 #define SCSIRESP_SENSEDATA_CURRENTDESC           0x72
482 #define SCSIRESP_SENSEDATA_DEFERREDDESC          0x73
483 
484 #define SCSIRESP_SENSEDATA_RESPVALID             0x80
485 
486 /* Fixed sense data flags */
487 
488 #define SCSIRESP_SENSEDATA_FILEMARK              0x80 /* Bit 7: FileMark */
489 #define SCSIRESP_SENSEDATA_EOM                   0x40 /* Bit 6: EOM */
490 #define SCSIRESP_SENSEDATA_ILI                   0x20 /* Bit 5: ILI */
491 #define SCSIRESP_SENSEDATA_SENSEKEYMASK          0x0f /* Bits 0-3: Sense key */
492 #define SCSIRESP_SENSEDATA_NOSENSE               0x00 /*   Nothing to be reported */
493 #define SCSIRESP_SENSEDATA_RECOVEREDERROR        0x01 /*   Successful after recovery action */
494 #define SCSIRESP_SENSEDATA_NOTREADY              0x02 /*   Logical unit is not accessible */
495 #define SCSIRESP_SENSEDATA_MEDIUMERROR           0x03 /*   Error posssibly caused by flaw in medium */
496 #define SCSIRESP_SENSEDATA_HARDWAREERROR         0x04 /*   Non-recoverable hardware error */
497 #define SCSIRESP_SENSEDATA_ILLEGALREQUEST        0x05 /*   Error in recived request */
498 #define SCSIRESP_SENSEDATA_UNITATTENTION         0x06 /*   Unit attention condition */
499 #define SCSIRESP_SENSEDATA_DATAPROTECT           0x07 /*   Action failed, medium protected */
500 #define SCSIRESP_SENSEDATA_BLANKCHECK            0x08 /*   Encountered blank media */
501 #define SCSIRESP_SENSEDATA_VENDORSPECIFIC        0x09 /*   Vendor specific condition */
502 #define SCSIRESP_SENSEDATA_ABORTEDCOMMAND        0x0b /*   Command was aborted */
503 
504 #define SCSIRESP_SENSEDATA_KEYVALID              0x80 /* Sense-specific data valid */
505 
506 /* Mode Select 6 */
507 
508 #define SCSICMD_MODESELECT6_PF                   0x10 /* Bit 4: PF */
509 #define SCSICMD_MODESELECT6_SP                   0x01 /* Bit 0: SP */
510 
511 /* Mode Sense 6 */
512 
513 #define SCSICMD_MODESENSE6_DBD                   0x08 /* Bit 3: PF */
514 
515 #define SCSICMD_MODESENSE_PCMASK                 0xc0 /* Bits 6-7: Page control (PC) */
516 #define SCSICMD_MODESENSE_PCCURRENT              0x00 /*   Current values */
517 #define SCSICMD_MODESENSE_PCCHANGEABLE           0x40 /*   Changeable values */
518 #define SCSICMD_MODESENSE_PCDEFAULT              0x80 /*   Default values */
519 #define SCSICMD_MODESENSE_PCSAVED                0xc0 /*   Saved values */
520 #define SCSICMD_MODESENSE_PGCODEMASK             0x3f /* Bits 0-5: Page code */
521 
522 #define SCSICMD_MODESENSE6_PCDEFAULT             0x80 /*   Default values */
523                                                       /* Direct-access device page codes */
524 #define SCSIRESP_MODESENSE_PGCCODE_VENDOR        0x00 /*   Vendor-specific */
525 #define SCSIRESP_MODESENSE_PGCCODE_RWERROR       0x01 /*   Read/Write error recovery mode page */
526 #define SCSIRESP_MODESENSE_PGCCODE_RECONNECT     0x02 /*   Disconnect-reconnect mode page */
527 #define SCSIRESP_MODESENSE_PGCCODE_FORMATDEV     0x03 /*   Format device mode page (obsolete) */
528 #define SCSIRESP_MODESENSE_PGCCODE_RIGID         0x04 /*   Rigid disk geometry mode page (obsolete) */
529 #define SCSIRESP_MODESENSE_PGCCODE_FLEXIBLE      0x05 /*   Flexible disk geometry mode page (obsolete) */
530 #define SCSIRESP_MODESENSE_PGCCODE_VERIFY        0x07 /*   Verify error recovery mode page */
531 #define SCSIRESP_MODESENSE_PGCCODE_CACHING       0x08 /*   Caching mode page */
532 #define SCSIRESP_MODESENSE_PGCCODE_CONTROL       0x0a /*   Control mode page (0x0a/0x00) */
533 #define SCSIRESP_MODESENSE_PGCCODE_CONTROLEXT    0x0a /*   Control extension mode page (0x0a/0x01) */
534 #define SCSIRESP_MODESENSE_PGCCODE_MEDIUMTYPES   0x0b /*   Medum types supported mode page (obsolete) */
535 #define SCSIRESP_MODESENSE_PGCCODE_NP            0x0c /*   Notch and partition mode page (obsolete) */
536 #define SCSIRESP_MODESENSE_PGCCODE_XOR           0x10 /*   XOR control mode page */
537 #define SCSIRESP_MODESENSE_PGCCODE_ES            0x14 /*   Enclosure services mode page */
538 #define SCSIRESP_MODESENSE_PGCCODE_PSLUN         0x18 /*   Protocol-specific LUN mode page */
539 #define SCSIRESP_MODESENSE_PGCCODE_PSPORT        0x19 /*   Protocol-specific port mode page */
540 #define SCSIRESP_MODESENSE_PGCCODE_POWER         0x1a /*   Power condition mode page */
541 #define SCSIRESP_MODESENSE_PGCCODE_IE            0x1c /*   Informational exceptions control mode page (0x1c/0x00) */
542 #define SCSIRESP_MODESENSE_PGCCODE_BC            0x1c /*   Background control mode page (0x1c/0x01) */
543 #define SCSIRESP_MODESENSE_PGCCODE_RETURNALL     0x3f /*   Return all mode pages */
544                                                       /* Direct-access caching mode page */
545 #define SCSIRESP_CACHINGMODEPG_PS                0x80 /*   Byte 0, Bit 7: PS */
546 #define SCSIRESP_CACHINGMODEPG_SPF               0x60 /*   Byte 0, Bit 6: SPF */
547 #define SCSIRESP_CACHINGMODEPG_IC                0x80 /*   Byte 2, Bit 7: IC */
548 #define SCSIRESP_CACHINGMODEPG_ABPF              0x40 /*   Byte 2, Bit 6: ABPF */
549 #define SCSIRESP_CACHINGMODEPG_CAP               0x20 /*   Byte 2, Bit 5: CAP */
550 #define SCSIRESP_CACHINGMODEPG_DISC              0x10 /*   Byte 2, Bit 4: DISC */
551 #define SCSIRESP_CACHINGMODEPG_SIZE              0x08 /*   Byte 2, Bit 3: SIZE */
552 #define SCSIRESP_CACHINGMODEPG_WCE               0x04 /*   Byte 2, Bit 2: Write cache enable (WCE) */
553 #define SCSIRESP_CACHINGMODEPG_MF                0x02 /*   Byte 2, Bit 1: MF */
554 #define SCSIRESP_CACHINGMODEPG_RCD               0x01 /*   Byte 2, Bit 0: Read cache disable (RCD) */
555 
556 #define SCSIRESP_MODEPARMHDR_DAPARM_WP           0x80 /* Bit 7: WP (Direct-access block devices only) */
557 #define SCSIRESP_MODEPARMHDR_DAPARM_DBPFUA       0x10 /* Bit 4: DBOFUA (Direct-access block devices only) */
558 
559 #define SCSIRESP_PAGEFMT_PS                      0x80 /* Bit 7: PS */
560 #define SCSIRESP_PAGEFMT_SPF                     0x40 /* Bit 6: SPF */
561 #define SCSIRESP_PAGEFMT_PGCODEMASK              0x3f /* Bits 0-5: Page code */
562 
563 /* Prevent / Allow Medium Removal */
564 
565 #define SCSICMD_PREVENTMEDIUMREMOVAL_TRANSPORT   0x01 /* Removal prohibited from data transport */
566 #define SCSICMD_PREVENTMEDIUMREMOVAL_MCHANGER    0x02 /* Removal prohibited from medium changer */
567 
568 /* Read format capacities */
569 
570 #define SCIRESP_RDFMTCAPACITIES_UNFORMATED       0x01 /* Unformatted media */
571 #define SCIRESP_RDFMTCAPACITIES_FORMATED         0x02 /* Formatted media */
572 #define SCIRESP_RDFMTCAPACITIES_NOMEDIA          0x03 /* No media */
573 
574 /* Read 6 */
575 
576 #define SCSICMD_READ6_MSLBAMASK                  0x1f
577 
578 /* Write 6 */
579 
580 #define SCSICMD_WRITE6_MSLBAMASK                 0x1f
581 
582 /* Mode Select 10 */
583 
584 #define SCSICMD_MODESELECT10_PF                  0x10 /* Bit 4: PF */
585 #define SCSICMD_MODESELECT10_SP                  0x01 /* Bit 0: SP */
586 
587 /* Mode Sense 10 */
588 
589 #define SCSICMD_MODESENSE10_LLBAA                0x10 /* Bit 4: LLBAA */
590 #define SCSICMD_MODESENSE10_DBD                  0x08 /* Bit 3: PF */
591 
592 /* Read 10 */
593 
594 #define SCSICMD_READ10FLAGS_RDPROTECTMASK        0xe0
595 #define SCSICMD_READ10FLAGS_DPO                  0x10 /* Disable Page Out */
596 #define SCSICMD_READ10FLAGS_FUA                  0x08
597 #define SCSICMD_READ10FLAGS_FUANV                0x02
598 
599 /* Write 10 */
600 
601 #define SCSICMD_WRITE10FLAGS_WRPROTECTMASK       0xe0
602 #define SCSICMD_WRITE10FLAGS_DPO                 0x10 /* Disable Page Out */
603 #define SCSICMD_WRITE10FLAGS_FUA                 0x08
604 #define SCSICMD_WRITE10FLAGS_FUANV               0x02
605 
606 /* Verify 10 */
607 
608 #define SCSICMD_VERIFY10_VRPROTECTMASK           0xe0 /* Byte 1: Bits 5-7: VRPROTECT */
609 #define SCSICMD_VERIFY10_DPO                     0x10 /* Byte 1: Bit 4: Disable Page Out (DPO) */
610 #define SCSICMD_VERIFY10_BYTCHK                  0x02 /* Byte 1: Bit 2: BytChk */
611 
612 /* Read 12 */
613 
614 #define SCSICMD_READ12FLAGS_RDPROTECTMASK        0xe0
615 #define SCSICMD_READ12FLAGS_DPO                  0x10 /* Disable Page Out */
616 #define SCSICMD_READ12FLAGS_FUA                  0x08
617 #define SCSICMD_READ12FLAGS_FUANV                0x02
618 
619 /* Write 12 */
620 
621 #define SCSICMD_WRITE12FLAGS_WRPROTECTMASK       0xe0
622 #define SCSICMD_WRITE12FLAGS_DPO                 0x10 /* Disable Page Out */
623 #define SCSICMD_WRITE12FLAGS_FUA                 0x08
624 #define SCSICMD_WRITE12FLAGS_FUANV               0x02
625 
626 /* Verify 12 */
627 
628 #define SCSICMD_VERIFY12_VRPROTECTMASK           0xe0 /* Byte 1: Bits 5-7: VRPROTECT */
629 #define SCSICMD_VERIFY12_DPO                     0x10 /* Byte 1: Bit 4: Disable Page Out (DPO) */
630 #define SCSICMD_VERIFY12_BYTCHK                  0x02 /* Byte 1: Bit 2: BytChk */
631 
632 /****************************************************************************
633  * Public Types
634  ****************************************************************************/
635 
636 /* Format structures for selected SCSI primary commands */
637 
638 #define SCSICMD_TESTUNITREADY_SIZEOF 6
639 
640 struct scsicmd_requestsense_s
641 {
642   uint8_t opcode;        /* 0: 0x03 */
643   uint8_t flags;         /* 1: See SCSICMD_REQUESTSENSE_FLAGS_* */
644   uint8_t reserved[2];   /* 2-3: Reserved */
645   uint8_t alloclen;      /* 4: Allocation length */
646   uint8_t control;       /* 5: Control */
647 };
648 #define SCSICMD_REQUESTSENSE_SIZEOF 6
649 #define SCSICMD_REQUESTSENSE_MSSIZEOF 12 /* MS-Windows REQUEST SENSE with cbw->cdblen == 12 */
650 
651 struct scsiresp_fixedsensedata_s
652 {
653   uint8_t code;          /* 0: Response code See  SCSIRESP_SENSEDATA_*FIXED defns */
654   uint8_t obsolete;      /* 1: */
655   uint8_t flags;         /* 2: See SCSIRESP_SENSEDATA_* definitions */
656   uint8_t info[4];       /* 3-6: Information */
657   uint8_t len;           /* 7: Additional length */
658   uint8_t cmdinfo[4];    /* 8-11: Command-specific information */
659   uint8_t code2;         /* 12: Additional sense code */
660   uint8_t qual2;         /* 13: Additional sense code qualifier */
661   uint8_t fru;           /* 14: Field replacement unit code */
662   uint8_t key[3];        /* 15-17: Sense key specific */
663                          /* 18-: Additional bytes may follow */
664 };
665 #define SCSIRESP_FIXEDSENSEDATA_SIZEOF 18 /* Minimum size */
666 
667 struct scscicmd_inquiry_s
668 {
669   uint8_t opcode;        /* 0: 0x12 */
670   uint8_t flags;         /* 1: See SCSICMD_INQUIRY_FLAGS_* */
671   uint8_t pagecode;      /* 2: Page code */
672   uint8_t alloclen[2];   /* 3-4: Allocation length */
673   uint8_t control;       /* 5: Control */
674 };
675 #define SCSICMD_INQUIRY_SIZEOF 6
676 
677 #define SCSI_GET_INQUIRY_PDT(pdt) ((pdt) & 0x1f)    /* get the Peripheral Device Type */
678 #define SCSI_GET_INQUIRY_RMB(rmb) ((rmb) >> 7)      /* get  Removable Medium Bit */
679 #define SCSI_MEDIUM_NOT_REMOVABLE (0)               /* Not Removable */
680 #define SCSI_MEDIUM_CAN_REMOVABLE (1)               /* Can Removable */
681 
682 struct scsiresp_inquiry_s
683 {
684   /* Mandatory */
685 
686   uint8_t qualtype;      /* 0: Bits 5-7: Peripheral qualifier; Bits 0-4: Peripheral device type */
687   uint8_t flags1;        /* 1: See SCSIRESP_INQUIRY_FLAGS1_* */
688   uint8_t version;       /* 2: Version */
689   uint8_t flags2;        /* 3: See SCSIRESP_INQUIRY_FLAGS2_* */
690   uint8_t len;           /* 4: Additional length */
691   uint8_t flags3;        /* 5: See SCSIRESP_INQUIRY_FLAGS3_* */
692   uint8_t flags4;        /* 6: See SCSIRESP_INQUIRY_FLAGS4_* */
693   uint8_t flags5;        /* 7: See SCSIRESP_INQUIRY_FLAGS5_* */
694   uint8_t vendorid[8];   /* 8-15: T10 Vendor Identification */
695   uint8_t productid[16]; /* 16-31: Product Identification */
696   uint8_t revision[4];   /* 32-35: Product Revision Level */
697 
698   /* Optional */
699 
700   uint8_t vendor[20];    /* 36-55: Vendor specific */
701   uint8_t flags6;        /* 56: See SCSIRESP_INQUIRY_FLAGS6_* */
702   uint8_t reserved1;     /* 57: Reserved */
703   uint8_t version1[2];   /* 58-59: Version Descriptor 1 */
704   uint8_t version2[2];   /* 60-61: Version Descriptor 2 */
705   uint8_t version3[2];   /* 62-63: Version Descriptor 3 */
706   uint8_t version4[2];   /* 64-65: Version Descriptor 4 */
707   uint8_t version5[2];   /* 66-67: Version Descriptor 5 */
708   uint8_t version6[2];   /* 68-69: Version Descriptor 6 */
709   uint8_t version7[2];   /* 70-71: Version Descriptor 7 */
710   uint8_t version8[2];   /* 72-73: Version Descriptor 8 */
711   uint8_t reserved2[22]; /* 74-95: Reserved */
712                        /* 96-: Vendor-specific parameters may follow */
713 };
714 #define SCSIRESP_INQUIRY_SIZEOF 36 /* Minimum size */
715 
716 struct scsicmd_modeselect6_s
717 {
718   uint8_t opcode;        /* 0x15 */
719   uint8_t flags;         /* 1: See SCSICMD_MODESELECT6_FLAGS_* */
720   uint8_t reserved[2];   /* 2-3: Reserved */
721   uint8_t plen;          /* 4: Parameter list length */
722   uint8_t control;       /* 5: Control */
723 };
724 #define SCSICMD_MODESELECT6_SIZEOF 6
725 
726 struct scsicmd_modesense6_s
727 {
728   uint8_t opcode;        /* 0x1a */
729   uint8_t flags;         /* 1: See SCSICMD_MODESENSE6_FLAGS_* */
730   uint8_t pcpgcode;      /* 2: Bits 6-7: PC, bits 0-5: page code */
731   uint8_t subpgcode;     /* 3: subpage code */
732   uint8_t alloclen;      /* 4: Allocation length */
733   uint8_t control;       /* 5: Control */
734 };
735 #define SCSICMD_MODESENSE6_SIZEOF 6
736 
737 struct scsiresp_modeparameterhdr6_s
738 {
739   uint8_t mdlen;         /* 0: Mode data length */
740   uint8_t type;          /* 1: Medium type */
741   uint8_t param;         /* 2: Device-specific parameter */
742   uint8_t bdlen;         /* 3: Block descriptor length */
743 };
744 #define SCSIRESP_MODEPARAMETERHDR6_SIZEOF 4
745 
746 struct scsiresp_blockdesc_s
747 {
748   uint8_t density;       /* 0: density code */
749   uint8_t nblocks[3];    /* 1-3: Number of blocks */
750   uint8_t reserved;      /* 4: reserved */
751   uint8_t blklen[3];     /* 5-7: Block len */
752 };
753 #define SCSIRESP_BLOCKDESC_SIZEOF 8
754 
755 struct scsiresp_pageformat_s
756 {
757   uint8_t pgcode;       /* 0: See SCSIRESP_PAGEFMT_* definitions */
758   uint8_t pglen;        /* 1: Page length (n-1) */
759   uint8_t parms[1];     /* 2-n: Mode parameters */
760 };
761 
762 struct scsiresp_subpageformat_s
763 {
764   uint8_t pgcode;       /* 0: See SCSIRESP_PAGEFMT_* definitions */
765   uint8_t subpgcode;    /* 1: sub-page code */
766   uint8_t pglen[2];     /* 2-3: Page length (n-3) */
767   uint8_t parms[1];     /* 4-n: Mode parameters */
768 };
769 
770 struct scsiresp_cachingmodepage_s
771 {
772   uint8_t pgcode;      /* 0: Bit 7: PS; Bit 6: SPF, Bits 0-5: page code == 8 */
773   uint8_t len;         /* 1: Page length (18) */
774   uint8_t flags1;      /* 2: See SCSIRESP_CACHINGMODEPG_* definitions */
775   uint8_t priority;    /* 3: Bits 4-7: Demand read retention priority; Bits 0-3: Write retention priority */
776   uint8_t dpflen[2];   /* 4-5: Disable prefetch transfer length */
777   uint8_t minpf[2];    /* 6-7: Minimum pre-fetch */
778   uint8_t maxpf[2];    /* 8-9: Maximum pre-fetch */
779   uint8_t maxpfc[2];   /* 10-11: Maximum pref-fetch ceiling */
780   uint8_t flags2;      /* 12: See SCSIRESP_CACHINGMODEPG_* definitions */
781   uint8_t nsegments;   /* 13: Number of cache segments */
782   uint8_t segsize[2];  /* 14-15: Cache segment size */
783   uint8_t reserved;    /* 16: Reserved */
784   uint8_t obsolete[3]; /* 17-19: Obsolete */
785 };
786 
787 /* Format structures for selected SCSI block commands */
788 
789 struct scsicmd_read6_s
790 {
791   uint8_t opcode;        /* 0: 0x08 */
792   uint8_t mslba;         /* 1: Bits 5-7: reserved; Bits 0-6: MS Logical Block Address (LBA) */
793   uint8_t lslba[2];      /* 2-3: LS Logical Block Address (LBA) */
794   uint8_t xfrlen;        /* 4: Transfer length (in contiguous logical blocks)*/
795   uint8_t control;       /* 5: Control */
796 };
797 #define SCSICMD_READ6_SIZEOF 6
798 
799 struct scsicmd_write6_s
800 {
801   uint8_t opcode;        /* 0: 0x0a */
802   uint8_t mslba;         /* 1: Bits 5-7: reserved; Bits 0-6: MS Logical Block Address (LBA) */
803   uint8_t lslba[2];      /* 2-3: LS Logical Block Address (LBA) */
804   uint8_t xfrlen;        /* 4: Transfer length (in contiguous logical blocks) */
805   uint8_t control;       /* 5: Control */
806 };
807 #define SCSICMD_WRITE6_SIZEOF 6
808 
809 struct scsicmd_startstopunit_s
810 {
811   uint8_t opcode;        /* 0: 0x1b */
812   uint8_t immed;         /* 1: Bits 2-7: Reserved, Bit 0: Immed */
813   uint8_t reserved;      /* 2: reserved */
814   uint8_t pcm;           /* 3: Bits 4-7: Reserved, Bits 0-3: Power condition modifier */
815   uint8_t pc;            /* 4: Bits 4-7: Power condition, Bit 2: NO_FLUSH, Bit 1: LOEJ, Bit 0: START */
816   uint8_t control;       /* 5: Control */
817 };
818 #define SCSICMD_STARTSTOPUNIT_SIZEOF 6
819 
820 struct scsicmd_preventmediumremoval_s
821 {
822   uint8_t opcode;        /* 0: 0x1e */
823   uint8_t reserved[3];   /* 1-3: Reserved */
824   uint8_t prevent;       /* 4: Bits 2-7: Reserved, Bits 0:1: prevent */
825   uint8_t control;       /* 5: Control */
826 };
827 #define SCSICMD_PREVENTMEDIUMREMOVAL_SIZEOF 6
828 
829 struct scsicmd_readformatcapcacities_s
830 {
831   uint8_t opcode;        /* 0: 0x23 */
832   uint8_t reserved[6];   /* 1-6: Reserved */
833   uint8_t alloclen[2];   /* 7-8: Allocation length */
834   uint8_t control;       /* 9: Control */
835 };
836 #define SCSICMD_READFORMATCAPACITIES_SIZEOF 10
837 
838 struct scsiresp_readformatcapacities_s
839 {
840   /* Current capacity header */
841 
842   uint8_t reserved[3];  /* 0-2: Reserved */
843   uint8_t listlen;      /* 3: Capacity list length */
844 
845   /* Current/Maximum Capacity Descriptor (actually a separate structure) */
846 
847   uint8_t nblocks[4];   /* 4-7: Number of blocks */
848   uint8_t type;         /* 8: Bits 2-7: Reserved, Bits 0-1: Descriptor type */
849   uint8_t blocklen[3];  /* 9-11: Block length */
850 };
851 #define SCSIRESP_READFORMATCAPACITIES_SIZEOF 12
852 #define SCSIRESP_CURRCAPACITYDESC_SIZEOF 8
853 
854 struct scsiresp_formattedcapacitydesc_s
855 {
856   uint8_t nblocks[4];   /* 0-3: Number of blocks */
857   uint8_t type;         /* 4: Bits 2-7: Type, bits 0-1, reserved */
858   uint8_t param[3];     /* 5-7: Type dependent parameter */
859 };
860 #define SCSIRESP_FORMATTEDCAPACITYDESC_SIZEOF 8
861 
862 struct scsicmd_readcapacity10_s
863 {
864   uint8_t opcode;        /* 0: 0x25 */
865   uint8_t reserved1;     /* 1: Bits 1-7: Reserved, Bit 0: Obsolete */
866   uint8_t lba[4];        /* 2-5: Logical block address (LBA) */
867   uint8_t reserved2[2];  /* 6-7: Reserved */
868   uint8_t pmi;           /* 8: Bits 1-7 Reserved; Bit 0: PMI */
869   uint8_t control;       /* 9: Control */
870 };
871 #define SCSICMD_READCAPACITY10_SIZEOF 10
872 
873 struct scsiresp_readcapacity10_s
874 {
875   uint8_t lba[4];        /* 0-3: Returned logical block address (LBA) */
876   uint8_t blklen[4];     /* 4-7: Logical block length (in bytes) */
877 };
878 #define SCSIRESP_READCAPACITY10_SIZEOF 8
879 
880 struct scsicmd_readcapacity16_s
881 {
882   uint8_t opcode;        /* 0: 0x9E */
883   uint8_t reserved1;     /* 1: Bits 0-4: Service Action, Bit 5-7: Reserved */
884   uint8_t lba[8];        /* 2-9: Logical block address (LBA) */
885   uint8_t blklen[4];     /* 10-13: Allocation Length */
886   uint8_t pmi;           /* 14: Bits 1-7 Reserved; Bit 0: PMI */
887   uint8_t control;       /* 15: Control */
888 };
889 #define SCSICMD_READCAPACITY16_SIZEOF 16
890 
891 struct scsiresp_readcapacity16_s
892 {
893   uint8_t lba[8];        /* 0-7: Returned logical block address (LBA) */
894   uint8_t blklen[4];     /* 8-11: Logical block length (in bytes) */
895   uint8_t prot;          /* 12: Bits 0: PROT_EN, Bits 1-3: P_TYPE, Bits 4-7: Reserved*/
896   uint8_t reserved[19];  /* 13-31: Reserved */
897 };
898 #define SCSIRESP_READCAPACITY16_SIZEOF 32
899 
900 struct scsicmd_read16_s
901 {
902   uint8_t opcode;        /* 0: 0x88 */
903   uint8_t flags;         /* 1: See SCSICMD_READ16 FLAGS* */
904   uint8_t lba[8];        /* 2-9: Logical Block Address (LBA) */
905   uint8_t xfrlen[4];     /* 10-13: Transfer length (in contiguous logical blocks) */
906   uint8_t groupno;       /* 14: Bits 7: Restricted for MMC-4; Bits 5-6: reserved; Bits 0-4: group number */
907   uint8_t control;       /* 15: Control */
908 };
909 #define SCSICMD_READ16_SIZEOF 16
910 
911 struct scsicmd_write16_s
912 {
913   uint8_t opcode;        /* 0: 0x8a */
914   uint8_t flags;         /* 1: See SCSICMD_WRITE10FLAGS_* */
915   uint8_t lba[8];        /* 2-9: Logical Block Address (LBA) */
916   uint8_t xfrlen[4];     /* 10-13: Transfer length (in contiguous logical blocks) */
917   uint8_t groupno;       /* 14: Bits 7: RESTRICTED FOR MMC-4; Bits 5-6: reserved; Bits 0-4: group number */
918   uint8_t control;       /* 9: Control */
919 };
920 #define SCSICMD_WRITE16_SIZEOF 16
921 
922 struct scsicmd_read10_s
923 {
924   uint8_t opcode;        /* 0: 0x28 */
925   uint8_t flags;         /* 1: See SCSICMD_READ10FLAGS_* */
926   uint8_t lba[4];        /* 2-5: Logical Block Address (LBA) */
927   uint8_t groupno;       /* 6: Bits 5-7: reserved; Bits 0-6: group number */
928   uint8_t xfrlen[2];     /* 7-8: Transfer length (in contiguous logical blocks) */
929   uint8_t control;       /* 9: Control */
930 };
931 #define SCSICMD_READ10_SIZEOF 10
932 
933 struct scsicmd_write10_s
934 {
935   uint8_t opcode;        /* 0: 0x2a */
936   uint8_t flags;         /* 1: See SCSICMD_WRITE10FLAGS_* */
937   uint8_t lba[4];        /* 2-5: Logical Block Address (LBA) */
938   uint8_t groupno;       /* 6: Bits 5-7: reserved; Bits 0-6: group number */
939   uint8_t xfrlen[2];     /* 7-8: Transfer length (in contiguous logical blocks) */
940   uint8_t control;       /* 9: Control */
941 };
942 #define SCSICMD_WRITE10_SIZEOF 10
943 
944 struct scsicmd_verify10_s
945 {
946   uint8_t opcode;        /* 0: 0x2f */
947   uint8_t flags;         /* 1: See SCSICMD_VERIFY10_* definitions */
948   uint8_t lba[4];        /* 2-5: Logical block address (LBA) */
949   uint8_t groupno;       /* 6: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */
950   uint8_t len[2];        /* 7-8: Verification length (in blocks) */
951   uint8_t control;       /* 9: Control */
952 };
953 #define SCSICMD_VERIFY10_SIZEOF 10
954 
955 struct scsicmd_synchronizecache10_s
956 {
957   uint8_t opcode;        /* 0: 0x35 */
958   uint8_t flags;         /* 1: See SCSICMD_SYNCHRONIZECACHE10_* definitions */
959   uint8_t lba[4];        /* 2-5: Logical block address (LBA) */
960   uint8_t groupno;       /* 6: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */
961   uint8_t len[2];        /* 7-8: Number of logical blocks */
962   uint8_t control;       /* 9: Control */
963 };
964 #define SCSICMD_SYNCHRONIZECACHE10_SIZEOF 10
965 
966 struct scsicmd_modeselect10_s
967 {
968   uint8_t opcode;        /* 0: 0x55 */
969   uint8_t flags;         /* 1: See SCSICMD_MODESELECT10_FLAGS_* */
970   uint8_t reserved[5];   /* 2-6: Reserved */
971   uint8_t parmlen[2];    /* 7-8: Parameter list length */
972   uint8_t control;       /* 9: Control */
973 };
974 #define SCSICMD_MODESELECT10_SIZEOF 10
975 
976 struct scsiresp_modeparameterhdr10_s
977 {
978   uint8_t mdlen[2];      /* 0-1: Mode data length */
979   uint8_t type;          /* 2: Medium type */
980   uint8_t param;         /* 3: Device-specific parameter */
981   uint8_t reserved[2];   /* 4-5: reserved */
982   uint8_t bdlen[2];      /* 6-7: Block descriptor length */
983 };
984 #define SCSIRESP_MODEPARAMETERHDR10_SIZEOF 8
985 
986 struct scsicmd_modesense10_s
987 {
988   uint8_t opcode;        /* O: 0x5a */
989   uint8_t flags;         /* 1: See SCSICMD_MODESENSE10_FLAGS_* */
990   uint8_t pcpgcode;      /* 2: Bits 6-7: PC, bits 0-5: page code */
991   uint8_t subpgcode;     /* 3: subpage code */
992   uint8_t reserved[3];   /* 4-6: reserved */
993   uint8_t alloclen[2];   /* 7-8: Allocation length */
994   uint8_t control;       /* 9: Control */
995 };
996 #define SCSICMD_MODESENSE10_SIZEOF 10
997 
998 struct scsicmd_read12_s
999 {
1000   uint8_t opcode;        /* 0: 0xa8 */
1001   uint8_t flags;         /* 1: See SCSICMD_READ12FLAGS_* */
1002   uint8_t lba[4];        /* 2-5: Logical Block Address (LBA) */
1003   uint8_t xfrlen[4];     /* 6-9: Transfer length (in contiguous logical blocks) */
1004   uint8_t groupno;       /* 10: Bit 7: restricted; Bits 5-6: reserved; Bits 0-6: group number */
1005   uint8_t control;       /* 11: Control */
1006 };
1007 #define SCSICMD_READ12_SIZEOF 12
1008 
1009 struct scsicmd_write12_s
1010 {
1011   uint8_t opcode;        /* 0: 0xaa */
1012   uint8_t flags;         /* 1: See SCSICMD_WRITE12FLAGS_* */
1013   uint8_t lba[4];        /* 2-5: Logical Block Address (LBA) */
1014   uint8_t xfrlen[4];     /* 6-9: Transfer length (in contiguous logical blocks) */
1015   uint8_t groupno;       /* 10: Bit 7: restricted; Bits 5-6: reserved; Bits 0-6: group number */
1016   uint8_t control;       /* 11: Control */
1017 };
1018 #define SCSICMD_WRITE12_SIZEOF 12
1019 
1020 struct scsicmd_verify12_s
1021 {
1022   uint8_t opcode;        /* 0: 0xaf */
1023   uint8_t flags;         /* 1: See SCSICMD_VERIFY12_* definitions */
1024   uint8_t lba[4];        /* 2-5: Logical block address (LBA) */
1025   uint8_t len[4];        /* 6-9: Verification length */
1026   uint8_t groupno;       /* 10: Bit 7: restricted; Bits 5-6: Reserved, Bits 0-4: Group number */
1027   uint8_t control;       /* 11: Control */
1028 };
1029 #define SCSICMD_VERIFY12_SIZEOF 12
1030 
1031 #define SCSICMD_TESTUNITREADY8_SIZEOF 6
1032 
1033 /****************************************************************************
1034  * Public Functions
1035  ****************************************************************************/
1036 
1037 #undef EXTERN
1038 #if defined(__cplusplus)
1039 #define EXTERN extern "C"
1040 extern "C"
1041 {
1042 #else
1043 #define EXTERN extern
1044 #endif
1045 
1046 #undef EXTERN
1047 #if defined(__cplusplus)
1048 }
1049 #endif
1050 
1051 #endif /* __INCLUDE_NUTTX_SCSI_H */