|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: *
24: * SCSIPublic.h
25: *
26: */
27:
28: #ifndef _SCSIPUBLIC_H
29: #define _SCSIPUBLIC_H
30:
31: typedef struct _SCSIInquiry
32: {
33: unsigned char devType; /* 0 Device type, */
34: unsigned char devTypeMod; /* 1 Device type modifier */
35: unsigned char version; /* 2 ISO/ECMA/ANSI version */
36: unsigned char format; /* 3 Response data format */
37: unsigned char length; /* 4 Additional Length */
38: unsigned char reserved5; /* 5 Reserved */
39: unsigned char reserved6; /* 6 Reserved */
40: unsigned char flags; /* 7 Capability flags */
41: unsigned char vendorName[8]; /* 8-15 Vendor-specific */
42: unsigned char productName[16]; /* 16-31 Product id */
43: unsigned char productRevision[4]; /* 32-35 Product revision */
44: unsigned char vendorSpecific[20]; /* 36-55 Vendor stuff */
45: unsigned char moreReserved[40]; /* 56-95 Reserved */
46: } SCSIInquiry;
47:
48: /*
49: * These are device type qualifiers. We need them to distinguish between "unknown"
50: * and "missing" devices.
51: */
52: enum
53: {
54: kSCSIDevTypeQualifierConnected = 0x00, /* Exists and is connected */
55: kSCSIDevTypeQualifierNotConnected = 0x20, /* Logical unit exists */
56: kSCSIDevTypeQualifierReserved = 0x40,
57: kSCSIDevTypeQualifierMissing = 0x60, /* No such logical unit */
58: kSCSIDevTypeQualifierVendorSpecific = 0x80, /* Non-standardized */
59: kSCSIDevTypeQualifierMask = 0xE0,
60: };
61:
62: enum _SCSIDevFlags
63: {
64: kSCSIDevCapRelAdr = 0x80,
65: kSCSIDevCapWBus32 = 0x40,
66: kSCSIDevCapWBus16 = 0x20,
67: kSCSIDevCapSync = 0x10,
68: kSCSIDevCapLinked = 0x08,
69: kSCSIDevCapCmdQue = 0x02,
70: kSCSIDevCapSftRe = 0x01,
71: };
72:
73: typedef struct _SCSISenseData
74: {
75: unsigned char errorCode; /* 0 Result validity */
76: unsigned char segmentNumber; /* 1 Segment number */
77: unsigned char senseKey; /* 2 Sense code, flags */
78: unsigned char info[4]; /* 3-6 Sense-key specific */
79: unsigned char additionalSenseLength; /* 7 Sense length info */
80: unsigned char reservedForCopy[4]; /* 8-11 Sense-key specific */
81: unsigned char additionalSenseCode; /* 12 What kind of error */
82: unsigned char additionalSenseQualifier; /* 13 More error info */
83: unsigned char fruCode; /* 14 Field replacable */
84: unsigned char senseKeySpecific[2]; /* 15-16 Additional info */
85: unsigned char additional[101]; /* 17-26 Additional info */
86: } SCSISenseData;
87:
88: /*
89: * The high-bit of errorCode signals whether there is a logical
90: * block. The low value signals whether there is a valid sense
91: */
92: enum _SCSIErrorCode
93: {
94: kSCSISenseHasLBN = 0x80, /* Logical block number set */
95: kSCSISenseInfoValid = 0x70, /* Is sense key valid? */
96: kSCSISenseInfoMask = 0x70, /* Mask for sense info */
97: kSCSISenseCurrentErr = 0x70, /* Error code (byte 0 & 0x7F */
98: kSCSISenseDeferredErr = 0x71, /* Error code (byte 0 & 0x7F */
99: };
100:
101: /*
102: * These bits may be set in the sense key
103: */
104: enum _SCSISenseKeyMasks
105: {
106: kSCSISenseKeyMask = 0x0F,
107: kSCSISenseILI = 0x20, /* Illegal logical Length */
108: kSCSISenseEOM = 0x40, /* End of media */
109: kSCSISenseFileMark = 0x80, /* End of file mark */
110: };
111: /*
112: * SCSI sense codes. (Returned after request sense).
113: */
114: enum _SCSISenseKeys
115: {
116: kSCSISenseNone = 0x00, /* No error */
117: kSCSISenseRecoveredErr = 0x01, /* Warning */
118: kSCSISenseNotReady = 0x02, /* Device not ready */
119: kSCSISenseMediumErr = 0x03, /* Device medium error */
120: kSCSISenseHardwareErr = 0x04, /* Device hardware error */
121: kSCSISenseIllegalReq = 0x05, /* Illegal request for dev. */
122: kSCSISenseUnitAtn = 0x06, /* Unit attention (not err) */
123: kSCSISenseDataProtect = 0x07, /* Data protection */
124: kSCSISenseBlankCheck = 0x08, /* Tape-specific error */
125: kSCSISenseVendorSpecific = 0x09, /* Vendor-specific error */
126: kSCSISenseCopyAborted = 0x0a, /* Copy request cancelled */
127: kSCSISenseAbortedCmd = 0x0b, /* Initiator aborted cmd. */
128: kSCSISenseEqual = 0x0c, /* Comparison equal */
129: kSCSISenseVolumeOverflow = 0x0d, /* Write past end mark */
130: kSCSISenseMiscompare = 0x0e, /* Comparison failed */
131: };
132:
133: enum _SCSIStatus
134: {
135: kSCSIStatusGood = 0x00,
136: kSCSIStatusCheckCondition = 0x02,
137: kSCSIStatusConditionMet = 0x04,
138: kSCSIStatusBusy = 0x08,
139: kSCSIStatusIntermediate = 0x10,
140: kSCSIStatusIntermediateMet = 0x0a,
141: kSCSIStatusReservationConfict = 0x18,
142: kSCSIStatusCommandTerminated = 0x22,
143: kSCSIStatusQueueFull = 0x28,
144: };
145:
146:
147: enum _SCSIDevTypes
148: {
149: kSCSIDevTypeDirect = 0, /* Hard disk (not CD-ROM) */
150: kSCSIDevTypeSequential, /* Magtape or DAT */
151: kSCSIDevTypePrinter, /* Printer */
152: kSCSIDevTypeProcessor, /* Attached processor */
153: kSCSIDevTypeWorm, /* Write-once, read multiple */
154: kSCSIDevTypeCDROM, /* CD-ROM */
155: kSCSIDevTypeScanner, /* Scanner */
156: kSCSIDevTypeOptical, /* Optical disk */
157: kSCSIDevTypeChanger, /* Jukebox */
158: kSCSIDevTypeComm, /* Communication link */
159: kSCSIDevTypeGraphicArts0A,
160: kSCSIDevTypeGraphicArts0B,
161: kSCSIDevTypeFirstReserved, /* Reserved sequence start */
162: kSCSIDevTypeUnknownOrMissing = 0x1F,
163: kSCSIDevTypeMask = 0x1F,
164: };
165:
166:
167: /*
168: * SCSI command codes. Commands defined as ...6, ...10, ...12, are
169: * six-byte, ten-byte, and twelve-byte variants of the indicated command.
170: */
171:
172: /*
173: * These commands are supported for all devices.
174: */
175: enum _SCSICmds
176: {
177: kSCSICmdChangeDefinition = 0x40,
178: kSCSICmdCompare = 0x39,
179: kSCSICmdCopy = 0x18,
180: kSCSICmdCopyAndVerify = 0x3a,
181: kSCSICmdInquiry = 0x12,
182: kSCSICmdLogSelect = 0x4c,
183: kSCSICmdLogSense = 0x4d,
184: kSCSICmdModeSelect12 = 0x55,
185: kSCSICmdModeSelect6 = 0x15,
186: kSCSICmdModeSense12 = 0x5a,
187: kSCSICmdModeSense6 = 0x1a,
188: kSCSICmdReadBuffer = 0x3c,
189: kSCSICmdRecvDiagResult = 0x1c,
190: kSCSICmdRequestSense = 0x03,
191: kSCSICmdSendDiagnostic = 0x1d,
192: kSCSICmdTestUnitReady = 0x00,
193: kSCSICmdWriteBuffer = 0x3b,
194:
195: /*
196: * These commands are supported by direct-access devices only.
197: */
198: kSCSICmdFormatUnit = 0x04,
199: kSCSICmdLockUnlockCache = 0x36,
200: kSCSICmdPrefetch = 0x34,
201: kSCSICmdPreventAllowRemoval = 0x1e,
202: kSCSICmdRead6 = 0x08,
203: kSCSICmdRead10 = 0x28,
204: kSCSICmdReadCapacity = 0x25,
205: kSCSICmdReadDefectData = 0x37,
206: kSCSICmdReadLong = 0x3e,
207: kSCSICmdReassignBlocks = 0x07,
208: kSCSICmdRelease = 0x17,
209: kSCSICmdReserve = 0x16,
210: kSCSICmdRezeroUnit = 0x01,
211: kSCSICmdSearchDataEql = 0x31,
212: kSCSICmdSearchDataHigh = 0x30,
213: kSCSICmdSearchDataLow = 0x32,
214: kSCSICmdSeek6 = 0x0b,
215: kSCSICmdSeek10 = 0x2b,
216: kSCSICmdSetLimits = 0x33,
217: kSCSICmdStartStopUnit = 0x1b,
218: kSCSICmdSynchronizeCache = 0x35,
219: kSCSICmdVerify = 0x2f,
220: kSCSICmdWrite6 = 0x0a,
221: kSCSICmdWrite10 = 0x2a,
222: kSCSICmdWriteAndVerify = 0x2e,
223: kSCSICmdWriteLong = 0x3f,
224: kSCSICmdWriteSame = 0x41,
225:
226: /*
227: * These commands are supported by sequential devices.
228: */
229: kSCSICmdRewind = 0x01,
230: kSCSICmdWriteFilemarks = 0x10,
231: kSCSICmdSpace = 0x11,
232: kSCSICmdLoadUnload = 0x1B,
233: /*
234: * ANSI SCSI-II for CD-ROM devices.
235: */
236: kSCSICmdReadCDTableOfContents = 0x43,
237: };
238:
239: /*
240: * Message codes (for Msg In and Msg Out phases).
241: */
242: enum _SCSIMsgs
243: {
244: kSCSIMsgAbort = 0x06,
245: kSCSIMsgAbortTag = 0x0d,
246: kSCSIMsgBusDeviceReset = 0x0c,
247: kSCSIMsgClearQueue = 0x0e,
248: kSCSIMsgCmdComplete = 0x00,
249: kSCSIMsgDisconnect = 0x04,
250: kSCSIMsgIdentify = 0x80,
251: kSCSIMsgIgnoreWideResdue = 0x23,
252: kSCSIMsgInitiateRecovery = 0x0f,
253: kSCSIMsgInitiatorDetectedErr = 0x05,
254: kSCSIMsgLinkedCmdComplete = 0x0a,
255: kSCSIMsgLinkedCmdCompleteFlag = 0x0b,
256: kSCSIMsgParityErr = 0x09,
257: kSCSIMsgRejectMsg = 0x07,
258: kSCSIMsgModifyDataPtr = 0x00, /* Extended msg */
259: kSCSIMsgNop = 0x08,
260: kSCSIMsgHeadOfQueueTag = 0x21, /* Two byte msg */
261: kSCSIMsgOrderedQueueTag = 0x22, /* Two byte msg */
262: kSCSIMsgSimpleQueueTag = 0x20, /* Two byte msg */
263: kSCSIMsgReleaseRecovery = 0x10,
264: kSCSIMsgRestorePointers = 0x03,
265: kSCSIMsgSaveDataPointers = 0x02,
266: kSCSIMsgSyncXferReq = 0x01, /* Extended msg */
267: kSCSIMsgWideDataXferReq = 0x03, /* Extended msg */
268: kSCSIMsgTerminateIOP = 0x11,
269: kSCSIMsgExtended = 0x01,
270: kSCSIMsgEnableDisconnectMask = 0x40,
271: };
272:
273: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.