1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Antmicro.Renode.Utilities.Packets;
8 
9 namespace Antmicro.Renode.Storage.SCSI.Commands
10 {
11     public enum SCSIStatus : byte
12     {
13         Good = 0,
14         CheckCondition = 1,
15         ConditionMet = 2,
16         Busy = 3,
17         ReservationConflict = 4,
18         TaskSetFull = 5,
19         AutoContingentAllegianceActive = 6,
20         TaskAborted = 7,
21     }
22 
23     public enum VitalProductDataPageCode : byte
24     {
25         SupportedVPDPages = 0x00,
26         UnitSerialNumber = 0x80,
27         DeviceIdentification = 0x83,
28         SoftwareInterfaceIdentification = 0x84,
29         ManagementNetworkAddresses = 0x85,
30         ExtendedInquiryData = 0x86,
31         ModePagePolicy = 0x87,
32         SCSIPorts = 0x88,
33         PowerCondition = 0x8A,
34         DeviceConstituents = 0x8B,
35         CFAProfileInformation = 0x8C,
36         PowerConsumption = 0x8D,
37         BlockLimits = 0xB0,
38         BlockDeviceCharacteristics = 0xB1,
39         LogicalBlockProvisioning = 0xB2,
40         Referrals = 0xB3,
41         SupportedBlockLengthsAndProtectionTypes = 0xB4,
42         BlockDeviceCharacteristicsExtension = 0xB5,
43         ZonedBlockDeviceCharacteristics = 0xB6,
44         BlockLimitsExtension = 0xB7,
45         FirmwareNumbers = 0xC0,
46         DateCode = 0xC1,
47         JumperSettings = 0xC2,
48         DeviceBehavior = 0xC3,
49     }
50 
51 #pragma warning disable 649, 169
52     public struct BarrierCommand
53     {
54         [PacketField, Offset(bytes: 0)]
55         public byte OperationCode;
56         [PacketField, Offset(bytes: 15)]
57         public byte Control;
58     }
59 
60     public struct FormatUnit
61     {
62         [PacketField, Offset(bytes: 0)]
63         public byte OperationCode;
64         [PacketField, Offset(bytes: 1, bits: 0), Width(3)]
65         public byte DefectListFormat;
66         [PacketField, Offset(bytes: 1, bits: 3), Width(1)]
67         public bool CompleteList;
68         [PacketField, Offset(bytes: 1, bits: 4), Width(1)]
69         public bool FormatData;
70         [PacketField, Offset(bytes: 1, bits: 5), Width(1)]
71         public byte LongList;
72         [PacketField, Offset(bytes: 1, bits: 6), Width(2)]
73         public byte FormatProtectionInformation;
74         [PacketField, Offset(bytes: 2)]
75         public byte VendorSpecific;
76         [PacketField, Offset(bytes: 5)]
77         public byte Control;
78     }
79 
80     public struct Inquiry
81     {
82         [PacketField, Offset(bytes: 0)]
83         public byte OperationCode;
84         [PacketField, Offset(bytes: 1, bits: 0), Width(1)]
85         public bool EnableVitalProductData;
86         [PacketField, Offset(bytes: 2)]
87         public VitalProductDataPageCode PageCode;
88         [PacketField, Offset(bytes: 3)]
89         public ushort AllocationLength;
90         [PacketField, Offset(bytes: 5)]
91         public ushort Control;
92     }
93 
94     public struct ModeSelect10
95     {
96         [PacketField, Offset(bytes: 0)]
97         public byte OperationCode;
98         [PacketField, Offset(bytes: 1, bits: 0), Width(1)]
99         public bool SavePages;
100         [PacketField, Offset(bytes: 1, bits: 4), Width(1)]
101         public bool PageFormat;
102         [PacketField, Offset(bytes: 7)]
103         public ushort ParameterListLength;
104         [PacketField, Offset(bytes: 9)]
105         public ushort Control;
106     }
107 
108     public struct ModeSense10
109     {
110         [PacketField, Offset(bytes: 0)]
111         public byte OperationCode;
112         [PacketField, Offset(bytes: 1, bits: 3), Width(1)]
113         public bool DisableBlockDescriptors;
114         [PacketField, Offset(bytes: 1, bits: 4), Width(1)]
115         public bool LongLBAAccepted;
116         [PacketField, Offset(bytes: 2, bits: 0), Width(6)]
117         public bool PageCode;
118         [PacketField, Offset(bytes: 2, bits: 6), Width(2)]
119         public byte PageControl;
120         [PacketField, Offset(bytes: 3)]
121         public byte SubpageCode;
122         [PacketField, Offset(bytes: 7)]
123         public ushort AllocationLength;
124         [PacketField, Offset(bytes: 9)]
125         public byte Control;
126     }
127 
128     public struct PreFetch10
129     {
130         [PacketField, Offset(bytes: 0)]
131         public byte OperationCode;
132         [PacketField, Offset(bytes: 1, bits: 1), Width(1)]
133         public bool Immediate;
134         [PacketField, Offset(bytes: 2)]
135         public uint LogicalBlockAddress;
136         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
137         public byte GroupNumber;
138         [PacketField, Offset(bytes: 7)]
139         public ushort PrefetchLength;
140         [PacketField, Offset(bytes: 9)]
141         public byte Control;
142     }
143 
144     public struct PreFetch16
145     {
146         [PacketField, Offset(bytes: 0)]
147         public byte OperationCode;
148         [PacketField, Offset(bytes: 1, bits: 1), Width(1)]
149         public bool Immediate;
150         [PacketField, Offset(bytes: 2)]
151         public ulong LogicalBlockAddress;
152         [PacketField, Offset(bytes: 10)]
153         public uint PrefetchLength;
154         [PacketField, Offset(bytes: 14, bits: 0), Width(5)]
155         public byte GroupNumber;
156         [PacketField, Offset(bytes: 15)]
157         public byte Control;
158     }
159 
160     public struct Read6
161     {
162         [PacketField, Offset(bytes: 0)]
163         public byte OperationCode;
164         [PacketField, Offset(bytes: 1, bits: 0), Width(5)]
165         public byte LogicalBlockAddressHigh;
166         [PacketField, Offset(bytes: 2)]
167         public ushort LogicalBlockAddressLow;
168         [PacketField, Offset(bytes: 4)]
169         public ushort TransferLength;
170         [PacketField, Offset(bytes: 5)]
171         public byte Control;
172     }
173 
174     public struct Read10
175     {
176         [PacketField, Offset(bytes: 0)]
177         public byte OperationCode;
178         [PacketField, Offset(bytes: 1, bits: 1)]
179         public bool ForceUnitAccessNonVolatile;
180         [PacketField, Offset(bytes: 1, bits: 3)]
181         public bool ForceUnitAccess;
182         [PacketField, Offset(bytes: 1, bits: 4)]
183         public bool DisablePageOut;
184         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
185         public bool ReadProtect;
186         [PacketField, Offset(bytes: 2)]
187         public uint LogicalBlockAddress;
188         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
189         public byte GroupNumber;
190         [PacketField, Offset(bytes: 7)]
191         public ushort TransferLength;
192         [PacketField, Offset(bytes: 9)]
193         public byte Control;
194     }
195 
196     public struct Read16
197     {
198         [PacketField, Offset(bytes: 0)]
199         public byte OperationCode;
200         [PacketField, Offset(bytes: 1, bits: 1)]
201         public bool ForceUnitAccessNonVolatile;
202         [PacketField, Offset(bytes: 1, bits: 3)]
203         public bool ForceUnitAccess;
204         [PacketField, Offset(bytes: 1, bits: 4)]
205         public bool DisablePageOut;
206         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
207         public bool ReadProtect;
208         [PacketField, Offset(bytes: 2)]
209         public ulong LogicalBlockAddress;
210         [PacketField, Offset(bytes: 10)]
211         public ushort TransferLength;
212         [PacketField, Offset(bytes: 14, bits: 0), Width(5)]
213         public byte GroupNumber;
214         [PacketField, Offset(bytes: 15)]
215         public byte Control;
216     }
217 
218     public struct ReadBuffer
219     {
220         [PacketField, Offset(bytes: 0)]
221         public byte OperationCode;
222         [PacketField, Offset(bytes: 1, bits: 0), Width(5)]
223         public byte Mode;
224         [PacketField, Offset(bytes: 2)]
225         public byte BufferId;
226         [PacketField, Offset(bytes: 3), Width(3)]
227         public uint BufferOffset;
228         [PacketField, Offset(bytes: 6), Width(3)]
229         public uint AllocationLength;
230         [PacketField, Offset(bytes: 9)]
231         public byte Control;
232     }
233 
234     public struct ReadCapacity10
235     {
236         [PacketField, Offset(bytes: 0)]
237         public byte OperationCode;
238         [PacketField, Offset(bytes: 2)]
239         public uint LogicalBlockAddress;
240         [PacketField, Offset(bytes: 8, bits: 0), Width(1)]
241         public bool PartialMediumIndicator;
242         [PacketField, Offset(bytes: 9)]
243         public byte Control;
244     }
245 
246     public struct ReadCapacity16
247     {
248         [PacketField, Offset(bytes: 0)]
249         public byte OperationCode;
250         [PacketField, Offset(bytes: 1, bits: 0), Width(5)]
251         public bool ServiceAction;
252         [PacketField, Offset(bytes: 2)]
253         public ulong LogicalBlockAddress;
254         [PacketField, Offset(bytes: 10)]
255         public uint AllocationLength;
256         [PacketField, Offset(bytes: 14, bits: 0), Width(1)]
257         public bool PartialMediumIndicator;
258         [PacketField, Offset(bytes: 15)]
259         public byte Control;
260     }
261 
262     public struct ReportLUNs
263     {
264         [PacketField, Offset(bytes: 0)]
265         public byte OperationCode;
266         [PacketField, Offset(bytes: 2)]
267         public byte SelectReport;
268         [PacketField, Offset(bytes: 6)]
269         public uint AllocationLength;
270         [PacketField, Offset(bytes: 11)]
271         public byte Control;
272     }
273 
274     public struct RequestSense
275     {
276         [PacketField, Offset(bytes: 0)]
277         public byte OperationCode;
278         [PacketField, Offset(bytes: 1, bits: 0), Width(1)]
279         public bool DescriptorFormat;
280         [PacketField, Offset(bytes: 4)]
281         public byte AllocationLength;
282         [PacketField, Offset(bytes: 5)]
283         public byte Control;
284     }
285 
286     public struct SecurityProtocolIn
287     {
288         [PacketField, Offset(bytes: 0)]
289         public byte OperationCode;
290         [PacketField, Offset(bytes: 1)]
291         public byte SecurityProtocol;
292         [PacketField, Offset(bytes: 2)]
293         public ushort SecurityProtocolSpecific;
294         [PacketField, Offset(bytes: 4, bits: 7), Width(1)]
295         public bool Increment512;
296         [PacketField, Offset(bytes: 6)]
297         public uint AllocationLength;
298         [PacketField, Offset(bytes: 11)]
299         public byte Control;
300     }
301 
302     public struct SecurityProtocolOut
303     {
304         [PacketField, Offset(bytes: 0)]
305         public byte OperationCode;
306         [PacketField, Offset(bytes: 1)]
307         public byte SecurityProtocol;
308         [PacketField, Offset(bytes: 2)]
309         public ushort SecurityProtocolSpecific;
310         [PacketField, Offset(bytes: 4, bits: 7), Width(1)]
311         public bool Increment512;
312         [PacketField, Offset(bytes: 6)]
313         public uint TransferLength;
314         [PacketField, Offset(bytes: 11)]
315         public byte Control;
316     }
317 
318     public struct SendDiagnostic
319     {
320         [PacketField, Offset(bytes: 0)]
321         public byte OperationCode;
322         [PacketField, Offset(bytes: 1, bits: 0), Width(1)]
323         public bool UnitOffline;
324         [PacketField, Offset(bytes: 1, bits: 1), Width(1)]
325         public bool SCSITargetDeviceOffline;
326         [PacketField, Offset(bytes: 1, bits: 2), Width(1)]
327         public bool SelfTest;
328         [PacketField, Offset(bytes: 1, bits: 4), Width(1)]
329         public bool PageFormat;
330         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
331         public byte SelfTestCode;
332         [PacketField, Offset(bytes: 3)]
333         public ushort ParameterListLength;
334         [PacketField, Offset(bytes: 5)]
335         public byte Control;
336     }
337 
338     public struct StartStopUnit
339     {
340         [PacketField, Offset(bytes: 0)]
341         public byte OperationCode;
342         [PacketField, Offset(bytes: 1, bits: 0), Width(1)]
343         public bool Immediate;
344         [PacketField, Offset(bytes: 3, bits: 0), Width(4)]
345         public byte PowerConditionModifier;
346         [PacketField, Offset(bytes: 4, bits: 0), Width(1)]
347         public bool Start;
348         [PacketField, Offset(bytes: 4, bits: 1), Width(1)]
349         public bool LoadEject;
350         [PacketField, Offset(bytes: 4, bits: 2), Width(1)]
351         public bool NoFlush;
352         [PacketField, Offset(bytes: 4, bits: 4), Width(4)]
353         public bool PowerConditions;
354         [PacketField, Offset(bytes: 5)]
355         public byte Control;
356     }
357 
358     public struct SynchronizeCache10
359     {
360         [PacketField, Offset(bytes: 0)]
361         public byte OperationCode;
362         [PacketField, Offset(bytes: 1, bits: 1)]
363         public bool Immediate;
364         [PacketField, Offset(bytes: 1, bits: 2)]
365         public bool SyncNonVolatile;
366         [PacketField, Offset(bytes: 2)]
367         public uint LogicalBlockAddress;
368         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
369         public byte GroupNumber;
370         [PacketField, Offset(bytes: 7)]
371         public ushort NumberOfLogicalBlocks;
372         [PacketField, Offset(bytes: 9)]
373         public byte Control;
374     }
375 
376     public struct SynchronizeCache16
377     {
378         [PacketField, Offset(bytes: 0)]
379         public byte OperationCode;
380         [PacketField, Offset(bytes: 1, bits: 1)]
381         public bool Immediate;
382         [PacketField, Offset(bytes: 1, bits: 2)]
383         public bool SyncNonVolatile;
384         [PacketField, Offset(bytes: 2)]
385         public ulong LogicalBlockAddress;
386         [PacketField, Offset(bytes: 10)]
387         public uint NumberOfLogicalBlocks;
388         [PacketField, Offset(bytes: 14, bits: 0), Width(5)]
389         public byte GroupNumber;
390         [PacketField, Offset(bytes: 15)]
391         public byte Control;
392     }
393 
394     public struct TestUnitReady
395     {
396         [PacketField, Offset(bytes: 0)]
397         public byte OperationCode;
398         [PacketField, Offset(bytes: 5)]
399         public byte Control;
400     }
401 
402     public struct Unmap
403     {
404         [PacketField, Offset(bytes: 0)]
405         public byte OperationCode;
406         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
407         public byte GroupNumber;
408         [PacketField, Offset(bytes: 7)]
409         public ushort ParameterListLength;
410         [PacketField, Offset(bytes: 9)]
411         public ushort Control;
412     }
413 
414     public struct Verify10
415     {
416         [PacketField, Offset(bytes: 0)]
417         public byte OperationCode;
418         [PacketField, Offset(bytes: 1, bits: 1), Width(1)]
419         public bool ByteCheck;
420         [PacketField, Offset(bytes: 1, bits: 4), Width(1)]
421         public bool DisablePageOut;
422         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
423         public bool VerifyProtect;
424         [PacketField, Offset(bytes: 2)]
425         public uint LogicalBlockAddress;
426         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
427         public byte GroupNumber;
428         [PacketField, Offset(bytes: 7)]
429         public ushort VerificationLength;
430         [PacketField, Offset(bytes: 9)]
431         public byte Control;
432     }
433 
434     public struct Write6
435     {
436         [PacketField, Offset(bytes: 0)]
437         public byte OperationCode;
438         [PacketField, Offset(bytes: 1, bits: 0), Width(5)]
439         public byte LogicalBlockAddressHigh;
440         [PacketField, Offset(bytes: 2)]
441         public ushort LogicalBlockAddressLow;
442         [PacketField, Offset(bytes: 4)]
443         public ushort TransferLength;
444         [PacketField, Offset(bytes: 5)]
445         public byte Control;
446     }
447 
448     public struct Write10
449     {
450         [PacketField, Offset(bytes: 0)]
451         public byte OperationCode;
452         [PacketField, Offset(bytes: 1, bits: 1)]
453         public bool ForceUnitAccessNonVolatile;
454         [PacketField, Offset(bytes: 1, bits: 3)]
455         public bool ForceUnitAccess;
456         [PacketField, Offset(bytes: 1, bits: 4)]
457         public bool DisablePageOut;
458         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
459         public bool WriteProtect;
460         [PacketField, Offset(bytes: 2)]
461         public uint LogicalBlockAddress;
462         [PacketField, Offset(bytes: 6, bits: 0), Width(5)]
463         public byte GroupNumber;
464         [PacketField, Offset(bytes: 7)]
465         public ushort TransferLength;
466         [PacketField, Offset(bytes: 9)]
467         public byte Control;
468     }
469 
470     public struct Write16
471     {
472         [PacketField, Offset(bytes: 0)]
473         public byte OperationCode;
474         [PacketField, Offset(bytes: 1, bits: 1)]
475         public bool ForceUnitAccessNonVolatile;
476         [PacketField, Offset(bytes: 1, bits: 3)]
477         public bool ForceUnitAccess;
478         [PacketField, Offset(bytes: 1, bits: 4)]
479         public bool DisablePageOut;
480         [PacketField, Offset(bytes: 1, bits: 5), Width(3)]
481         public bool WriteProtect;
482         [PacketField, Offset(bytes: 2)]
483         public ulong LogicalBlockAddress;
484         [PacketField, Offset(bytes: 10)]
485         public ushort TransferLength;
486         [PacketField, Offset(bytes: 14, bits: 0), Width(5)]
487         public byte GroupNumber;
488         [PacketField, Offset(bytes: 15)]
489         public byte Control;
490     }
491 
492     public struct WriteBuffer
493     {
494         [PacketField, Offset(bytes: 0)]
495         public byte OperationCode;
496         [PacketField, Offset(bytes: 1, bits: 0), Width(5)]
497         public byte Mode;
498         [PacketField, Offset(bytes: 2)]
499         public byte BufferId;
500         [PacketField, Offset(bytes: 3), Width(3)]
501         public uint BufferOffset;
502         [PacketField, Offset(bytes: 6), Width(3)]
503         public uint ParameterListLength;
504         [PacketField, Offset(bytes: 9)]
505         public byte Control;
506     }
507 #pragma warning restore 649, 169
508 }