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