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 }