VirtualBox

source: vbox/trunk/include/VBox/scsi.h@ 80539

Last change on this file since 80539 was 80539, checked in by vboxsync, 6 years ago

Storage/DevVirtioSCSI.cpp: Added code to properly free some allocated entities when done. Also gave the request completion command access to the OUT components of the request (CDB) in case it needs to determine the command type. Also moved SCSI status text lookup into Storage/Debug.cpp

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.1 KB
Line 
1/** @file
2 * VirtualBox - SCSI declarations. (DEV,+)
3 */
4
5/*
6 * Copyright (C) 2006-2019 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef VBOX_INCLUDED_scsi_h
27#define VBOX_INCLUDED_scsi_h
28#ifndef RT_WITHOUT_PRAGMA_ONCE
29# pragma once
30#endif
31
32#include <iprt/assert.h>
33
34/**
35 * @todo: Remove when the splitting code was removed from DevATA.
36 * The limit doesn't belong here but is specific for each host platform.
37 */
38#ifdef RT_OS_FREEBSD
39/* The cam subsystem doesn't allow more */
40# define SCSI_MAX_BUFFER_SIZE (64 * _1K)
41#else
42# define SCSI_MAX_BUFFER_SIZE (100 * _1K)
43#endif
44
45/**
46 * SCSI command opcode identifiers.
47 *
48 * SCSI-3, so far for CD/DVD Logical Units, from Table 49 of the MMC-3 draft standard.
49 */
50typedef enum SCSICMD
51{
52 SCSI_BLANK = 0xa1,
53 SCSI_CLOSE_TRACK_SESSION = 0x5b,
54 SCSI_ERASE_10 = 0x2c,
55 SCSI_FORMAT_UNIT = 0x04,
56 SCSI_GET_CONFIGURATION = 0x46,
57 SCSI_GET_EVENT_STATUS_NOTIFICATION = 0x4a,
58 SCSI_GET_PERFORMANCE = 0xac,
59 /** Inquiry command. */
60 SCSI_INQUIRY = 0x12,
61 SCSI_LOAD_UNLOAD_MEDIUM = 0xa6,
62 SCSI_MECHANISM_STATUS = 0xbd,
63 SCSI_MODE_SELECT_10 = 0x55,
64 SCSI_MODE_SENSE_10 = 0x5a,
65 SCSI_PAUSE_RESUME = 0x4b,
66 SCSI_PLAY_AUDIO_10 = 0x45,
67 SCSI_PLAY_AUDIO_12 = 0xa5,
68 SCSI_PLAY_AUDIO_MSF = 0x47,
69 SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1e,
70 /** Read(10) command. */
71 SCSI_READ_10 = 0x28,
72 SCSI_READ_12 = 0xa8,
73 SCSI_READ_BUFFER = 0x3c,
74 SCSI_READ_BUFFER_CAPACITY = 0x5c,
75 /** Read Capacity(6) command. */
76 SCSI_READ_CAPACITY = 0x25,
77 SCSI_READ_CD = 0xbe,
78 SCSI_READ_CD_MSF = 0xb9,
79 SCSI_READ_DISC_INFORMATION = 0x51,
80 SCSI_READ_DVD_STRUCTURE = 0xad,
81 SCSI_READ_FORMAT_CAPACITIES = 0x23,
82 SCSI_READ_SUBCHANNEL = 0x42,
83 SCSI_READ_TOC_PMA_ATIP = 0x43,
84 SCSI_READ_TRACK_INFORMATION = 0x52,
85 SCSI_REPAIR_TRACK = 0x58,
86 SCSI_REPORT_KEY = 0xa4,
87 SCSI_REQUEST_SENSE = 0x03,
88 SCSI_RESERVE_TRACK = 0x53,
89 SCSI_SCAN = 0xba,
90 SCSI_SEEK_10 = 0x2b,
91 SCSI_SEND_CUE_SHEET = 0x5d,
92 SCSI_SEND_DVD_STRUCTURE = 0xbf,
93 SCSI_SEND_EVENT = 0xa2,
94 SCSI_SEND_KEY = 0xa3,
95 SCSI_SEND_OPC_INFORMATION = 0x54,
96 SCSI_SET_CD_SPEED = 0xbb,
97 SCSI_SET_READ_AHEAD = 0xa7,
98 SCSI_SET_STREAMING = 0xb6,
99 SCSI_START_STOP_UNIT = 0x1b,
100 SCSI_LOAD_UNLOAD = 0x1b,
101 SCSI_STOP_PLAY_SCAN = 0x4e,
102 /** Synchronize Cache command. */
103 SCSI_SYNCHRONIZE_CACHE = 0x35,
104 SCSI_TEST_UNIT_READY = 0x00,
105 SCSI_VERIFY_10 = 0x2f,
106 /** Write(10) command. */
107 SCSI_WRITE_10 = 0x2a,
108 SCSI_WRITE_12 = 0xaa,
109 SCSI_WRITE_AND_VERIFY_10 = 0x2e,
110 SCSI_WRITE_BUFFER = 0x3b,
111
112 /** Mode Sekect(6) command */
113 SCSI_MODE_SELECT_6 = 0x15,
114 /** Mode Sense(6) command */
115 SCSI_MODE_SENSE_6 = 0x1a,
116 /** Report LUNs command. */
117 SCSI_REPORT_LUNS = 0xa0,
118 SCSI_REPORT_DENSITY = 0x44,
119 /** Rezero Unit command. Obsolete for ages now, but used by cdrecord. */
120 SCSI_REZERO_UNIT = 0x01,
121 SCSI_REWIND = 0x01,
122 SCSI_SERVICE_ACTION_IN_16 = 0x9e,
123 SCSI_READ_16 = 0x88,
124 SCSI_WRITE_16 = 0x8a,
125 SCSI_READ_6 = 0x08,
126 SCSI_WRITE_6 = 0x0a,
127 SCSI_LOG_SENSE = 0x4d,
128 SCSI_UNMAP = 0x42,
129 SCSI_RESERVE_6 = 0x16,
130 SCSI_RELEASE_6 = 0x17,
131 SCSI_RESERVE_10 = 0x56,
132 SCSI_RELEASE_10 = 0x57,
133 SCSI_READ_BLOCK_LIMITS = 0x05,
134 SCSI_MAINTENANCE_IN = 0xa3
135} SCSICMD;
136
137/**
138 * Service action in opcode identifiers
139 */
140typedef enum SCSISVCACTIONIN
141{
142 SCSI_SVC_ACTION_IN_READ_CAPACITY_16 = 0x10
143} SCSISVCACTIONIN;
144
145/**
146 * Maintenance in opcode identifiers
147 */
148typedef enum SCSIMAINTENANCEIN
149{
150 SCSI_MAINTENANCE_IN_REPORT_SUPP_OPC = 0x0c
151} SCSIMAINTENANCEIN;
152
153/* Mode page codes for mode sense/select commands. */
154#define SCSI_MODEPAGE_ERROR_RECOVERY 0x01
155#define SCSI_MODEPAGE_WRITE_PARAMETER 0x05
156#define SCSI_MODEPAGE_CD_STATUS 0x2a
157
158
159/* Page control codes. */
160#define SCSI_PAGECONTROL_CURRENT 0x00
161#define SCSI_PAGECONTROL_CHANGEABLE 0x01
162#define SCSI_PAGECONTROL_DEFAULT 0x02
163#define SCSI_PAGECONTROL_SAVED 0x03
164
165
166/* Status codes */
167#define SCSI_STATUS_OK 0x00
168#define SCSI_STATUS_CHECK_CONDITION 0x02
169#define SCSI_STATUS_CONDITION_MET 0x04
170#define SCSI_STATUS_BUSY 0x08
171#define SCSI_STATUS_INTERMEDIATE 0x10
172#define SCSI_STATUS_DATA_UNDEROVER_RUN 0x12
173#define SCSI_STATUS_INTERMEDIATE_CONDITION_MET 0x14
174#define SCSI_STATUS_RESERVATION_CONFLICT 0x18
175#define SCSI_STATUS_COMMAND_TERMINATED 0x22
176#define SCSI_STATUS_QUEUE_FULL 0x28
177#define SCSI_STATUS_ACA_ACTIVE 0x30
178#define SCSI_STATUS_TASK_ABORTED 0x40
179
180/* Sense data response codes - This is the first byte in the sense data */
181#define SCSI_SENSE_RESPONSE_CODE_CURR_FIXED 0x70
182#define SCSI_SENSE_RESPONSE_CODE_DEFERRED_FIXED 0x71
183#define SCSI_SENSE_RESPONSE_CODE_CURR_DESC 0x72
184#define SCSI_SENSE_RESPONSE_CODE_DEFERRED_DESC 0x73
185
186/* Sense keys */
187#define SCSI_SENSE_NONE 0
188#define SCSI_SENSE_RECOVERED_ERROR 1
189#define SCSI_SENSE_NOT_READY 2
190#define SCSI_SENSE_MEDIUM_ERROR 3
191#define SCSI_SENSE_HARDWARE_ERROR 4
192#define SCSI_SENSE_ILLEGAL_REQUEST 5
193#define SCSI_SENSE_UNIT_ATTENTION 6
194#define SCSI_SENSE_DATA_PROTECT 7
195#define SCSI_SENSE_BLANK_CHECK 8
196#define SCSI_SENSE_VENDOR_SPECIFIC 9
197#define SCSI_SENSE_COPY_ABORTED 10
198#define SCSI_SENSE_ABORTED_COMMAND 11
199#define SCSI_SENSE_VOLUME_OVERFLOW 13
200#define SCSI_SENSE_MISCOMPARE 14
201
202/* Additional sense bit flags (to be ORed with sense key). */
203#define SCSI_SENSE_FLAG_FILEMARK 0x80
204#define SCSI_SENSE_FLAG_EOM 0x40
205#define SCSI_SENSE_FLAG_ILI 0x20
206
207/* Additional sense keys */
208#define SCSI_ASC_NONE 0x00
209#define SCSI_ASC_WRITE_ERROR 0x0c
210#define SCSI_ASC_READ_ERROR 0x11
211#define SCSI_ASC_ILLEGAL_OPCODE 0x20
212#define SCSI_ASC_LOGICAL_BLOCK_OOR 0x21
213#define SCSI_ASC_INV_FIELD_IN_CMD_PACKET 0x24
214#define SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED 0x25
215#define SCSI_ASC_WRITE_PROTECTED 0x27
216#define SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED 0x28
217#define SCSI_ASC_POWER_ON_RESET_BUS_DEVICE_RESET_OCCURRED 0x29
218#define SCSI_ASC_CANNOT_READ_MEDIUM 0x30
219#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3a
220#define SCSI_ASC_SAVING_PARAMETERS_NOT_SUPPORTED 0x39
221#define SCSI_ASC_INTERNAL_TARGET_FAILURE 0x44
222#define SCSI_ASC_INVALID_MESSAGE 0x49
223#define SCSI_ASC_MEDIA_LOAD_OR_EJECT_FAILED 0x53
224#define SCSI_ASC_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION 0x00
225#define SCSI_ASC_SYSTEM_RESOURCE_FAILURE 0x55
226#define SCSI_ASC_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
227#define SCSI_ASC_COMMAND_TO_LOGICAL_UNIT_FAILED 0x6E
228
229/** Additional sense code qualifiers (ASCQ). */
230/* NB: The ASC/ASCQ combination determines the full meaning. */
231#define SCSI_ASCQ_SYSTEM_BUFFER_FULL 0x01
232#define SCSI_ASCQ_POWER_ON_RESET_BUS_DEVICE_RESET_OCCURRED 0x00
233#define SCSI_ASCQ_END_OF_DATA_DETECTED 0x05
234#define SCSI_ASCQ_FILEMARK_DETECTED 0x01
235#define SCSI_ASCQ_EOP_EOM_DETECTED 0x02
236#define SCSI_ASCQ_SETMARK_DETECTED 0x03
237#define SCSI_ASCQ_BOP_BOM_DETECTED 0x04
238#define SCSI_ASCQ_UNKNOWN_FORMAT 0x01
239#define SCSI_ASCQ_INCOMPATIBLE_FORMAT 0x02
240
241/** @name SCSI_INQUIRY
242 * @{
243 */
244
245/** Length of the SCSI INQUIRY vendor identifier (without termination). */
246#define SCSI_INQUIRY_VENDOR_ID_LENGTH 8
247/** Length of the SCSI INQUIRY product identifier (without termination). */
248#define SCSI_INQUIRY_PRODUCT_ID_LENGTH 16
249/** Length of the SCSI INQUIRY revision identifier (without termination). */
250#define SCSI_INQUIRY_REVISION_LENGTH 4
251
252#pragma pack(1)
253typedef struct SCSIINQUIRYCDB
254{
255 unsigned u8Cmd : 8;
256 unsigned fEVPD : 1;
257 unsigned u4Reserved : 4;
258 unsigned u3LUN : 3;
259 unsigned u8PageCode : 8;
260 unsigned u8Reserved : 8;
261 uint8_t cbAlloc;
262 uint8_t u8Control;
263} SCSIINQUIRYCDB;
264#pragma pack()
265AssertCompileSize(SCSIINQUIRYCDB, 6);
266typedef SCSIINQUIRYCDB *PSCSIINQUIRYCDB;
267typedef const SCSIINQUIRYCDB *PCSCSIINQUIRYCDB;
268
269#pragma pack(1)
270typedef struct SCSIINQUIRYDATA
271{
272 unsigned u5PeripheralDeviceType : 5; /**< 0x00 / 00 */
273 unsigned u3PeripheralQualifier : 3;
274 unsigned u6DeviceTypeModifier : 7; /**< 0x01 */
275 unsigned fRMB : 1;
276 unsigned u3AnsiVersion : 3; /**< 0x02 */
277 unsigned u3EcmaVersion : 3;
278 unsigned u2IsoVersion : 2;
279 unsigned u4ResponseDataFormat : 4; /**< 0x03 */
280 unsigned u2Reserved0 : 2;
281 unsigned fTrmlOP : 1;
282 unsigned fAEC : 1;
283 unsigned cbAdditional : 8; /**< 0x04 */
284 unsigned u8Reserved1 : 8; /**< 0x05 */
285 unsigned u8Reserved2 : 8; /**< 0x06 */
286 unsigned fSftRe : 1; /**< 0x07 */
287 unsigned fCmdQue : 1;
288 unsigned fReserved3 : 1;
289 unsigned fLinked : 1;
290 unsigned fSync : 1;
291 unsigned fWBus16 : 1;
292 unsigned fWBus32 : 1;
293 unsigned fRelAdr : 1;
294 int8_t achVendorId[SCSI_INQUIRY_VENDOR_ID_LENGTH]; /**< 0x08 */
295 int8_t achProductId[SCSI_INQUIRY_PRODUCT_ID_LENGTH]; /**< 0x10 */
296 int8_t achProductLevel[SCSI_INQUIRY_REVISION_LENGTH]; /**< 0x20 */
297 uint8_t abVendorSpecific[20]; /**< 0x24/36 - Optional it seems. */
298 uint8_t abReserved4[40];
299 uint8_t abVendorSpecificParameters[1]; /**< 0x60/96 - Variable size. */
300} SCSIINQUIRYDATA;
301#pragma pack()
302AssertCompileSize(SCSIINQUIRYDATA, 97);
303typedef SCSIINQUIRYDATA *PSCSIINQUIRYDATA;
304typedef const SCSIINQUIRYDATA *PCSCSIINQUIRYDATA;
305
306#define SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED 0x00
307#define SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_BUT_SUPPORTED 0x01
308#define SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED 0x03
309
310#define SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS 0x00
311#define SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_SEQUENTIAL_ACCESS 0x01
312#define SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_CD_DVD 0x05
313#define SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_UNKNOWN 0x1f
314
315/** @} */
316
317#if defined(IN_RING3) && (defined(LOG_ENABLED) || defined(RT_STRICT))
318const char * SCSICmdText(uint8_t uCmd);
319const char * SCSIStatusText(uint8_t uStatus);
320const char * SCSISenseText(uint8_t uSense);
321const char * SCSISenseExtText(uint8_t uASC, uint8_t uASCQ);
322int SCSILogModePage(char *pszBuf, size_t cchBuffer, uint8_t *pbModePage,
323 size_t cbModePage);
324int SCSILogCueSheet(char *pszBuf, size_t cchBuffer, uint8_t *pbCueSheet,
325 size_t cbCueSheet);
326#endif
327
328#endif /* !VBOX_INCLUDED_scsi_h */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette