REFACTOR: Final cleanup of DiscImageChef.Devices.

This commit is contained in:
2017-12-23 20:04:36 +00:00
parent e5c92090a1
commit 536888507f
45 changed files with 2811 additions and 2688 deletions

View File

@@ -46,7 +46,7 @@ namespace DiscImageChef.Devices.FreeBSD
const int CAM_MAX_CDBLEN = 16;
/// <summary>
/// Sends a SCSI command (64-bit arch)
/// Sends a SCSI command (64-bit arch)
/// </summary>
/// <returns>0 if no error occurred, otherwise, errno</returns>
/// <param name="dev">CAM device</param>
@@ -56,7 +56,10 @@ namespace DiscImageChef.Devices.FreeBSD
/// <param name="timeout">Timeout in seconds</param>
/// <param name="direction">SCSI command transfer direction</param>
/// <param name="duration">Time it took to execute the command in milliseconds</param>
/// <param name="sense"><c>True</c> if SCSI error returned non-OK status and <paramref name="senseBuffer"/> contains SCSI sense</param>
/// <param name="sense">
/// <c>True</c> if SCSI error returned non-OK status and <paramref name="senseBuffer" /> contains SCSI
/// sense
/// </param>
internal static int SendScsiCommand64(IntPtr dev, byte[] cdb, ref byte[] buffer, out byte[] senseBuffer,
uint timeout, CcbFlags direction, out double duration, out bool sense)
{
@@ -151,7 +154,7 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// Sends a SCSI command (32-bit arch)
/// Sends a SCSI command (32-bit arch)
/// </summary>
/// <returns>0 if no error occurred, otherwise, errno</returns>
/// <param name="dev">CAM device</param>
@@ -161,7 +164,10 @@ namespace DiscImageChef.Devices.FreeBSD
/// <param name="timeout">Timeout in seconds</param>
/// <param name="direction">SCSI command transfer direction</param>
/// <param name="duration">Time it took to execute the command in milliseconds</param>
/// <param name="sense"><c>True</c> if SCSI error returned non-OK status and <paramref name="senseBuffer"/> contains SCSI sense</param>
/// <param name="sense">
/// <c>True</c> if SCSI error returned non-OK status and <paramref name="senseBuffer" /> contains SCSI
/// sense
/// </param>
internal static int SendScsiCommand(IntPtr dev, byte[] cdb, ref byte[] buffer, out byte[] senseBuffer,
uint timeout, CcbFlags direction, out double duration, out bool sense)
{
@@ -256,7 +262,7 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// Converts ATA protocol to CAM flags
/// Converts ATA protocol to CAM flags
/// </summary>
/// <param name="protocol">ATA protocol</param>
/// <returns>CAM flags</returns>
@@ -279,7 +285,7 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// Sends an ATA command in CHS mode
/// Sends an ATA command in CHS mode
/// </summary>
/// <returns>0 if no error occurred, otherwise, errno</returns>
/// <param name="dev">CAM device</param>
@@ -377,7 +383,7 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// Sends an ATA command in 28-bit LBA mode
/// Sends an ATA command in 28-bit LBA mode
/// </summary>
/// <returns>0 if no error occurred, otherwise, errno</returns>
/// <param name="dev">CAM device</param>
@@ -475,7 +481,7 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// Sends an ATA command in 48-bit mode
/// Sends an ATA command in 48-bit mode
/// </summary>
/// <returns>0 if no error occurred, otherwise, errno</returns>
/// <param name="dev">CAM device</param>

View File

@@ -39,80 +39,80 @@ namespace DiscImageChef.Devices.FreeBSD
enum FileFlags
{
/// <summary>
/// O_RDONLY
///</summary>
/// O_RDONLY
/// </summary>
ReadOnly = 0x00000000,
/// <summary>
/// O_WRONLY
///</summary>
/// O_WRONLY
/// </summary>
WriteOnly = 0x00000001,
/// <summary>
/// O_RDWR
///</summary>
/// O_RDWR
/// </summary>
ReadWrite = 0x00000002,
/// <summary>
/// O_NONBLOCK
///</summary>
/// O_NONBLOCK
/// </summary>
NonBlocking = 0x00000004,
/// <summary>
/// O_APPEND
///</summary>
/// O_APPEND
/// </summary>
Append = 0x00000008,
/// <summary>
/// O_SHLOCK
///</summary>
/// O_SHLOCK
/// </summary>
SharedLock = 0x00000010,
/// <summary>
/// O_EXLOCK
///</summary>
/// O_EXLOCK
/// </summary>
ExclusiveLock = 0x00000020,
/// <summary>
/// O_ASYNC
///</summary>
/// O_ASYNC
/// </summary>
Async = 0x00000040,
/// <summary>
/// O_FSYNC
///</summary>
/// O_FSYNC
/// </summary>
SyncWrites = 0x00000080,
/// <summary>
/// O_NOFOLLOW
///</summary>
/// O_NOFOLLOW
/// </summary>
NoFollowSymlink = 0x00000100,
/// <summary>
/// O_CREAT
///</summary>
/// O_CREAT
/// </summary>
OpenOrCreate = 0x00000200,
/// <summary>
/// O_TRUNC
///</summary>
/// O_TRUNC
/// </summary>
Truncate = 0x00000400,
/// <summary>
/// O_EXCL
///</summary>
/// O_EXCL
/// </summary>
CreateNew = 0x00000800,
/// <summary>
/// O_NOCTTY
///</summary>
/// O_NOCTTY
/// </summary>
NoControlTty = 0x00008000,
/// <summary>
/// O_DIRECT
///</summary>
/// O_DIRECT
/// </summary>
Direct = 0x00010000,
/// <summary>
/// O_DIRECTORY
///</summary>
/// O_DIRECTORY
/// </summary>
Directory = 0x00020000,
/// <summary>
/// O_EXEC
///</summary>
/// O_EXEC
/// </summary>
Execute = 0x00040000,
/// <summary>
/// O_TTY_INIT
///</summary>
/// O_TTY_INIT
/// </summary>
InitializeTty = 0x00080000,
/// <summary>
/// O_CLOEXEC
///</summary>
/// O_CLOEXEC
/// </summary>
CloseOnExec = 0x00100000
}
@@ -120,24 +120,24 @@ namespace DiscImageChef.Devices.FreeBSD
enum CamAtaIoFlags : byte
{
/// <summary>
/// 48-bit command
///</summary>
/// 48-bit command
/// </summary>
ExtendedCommand = 0x01,
/// <summary>
/// FPDMA command
///</summary>
/// FPDMA command
/// </summary>
Fpdma = 0x02,
/// <summary>
/// Control, not a command
///</summary>
/// Control, not a command
/// </summary>
Control = 0x04,
/// <summary>
/// Needs result
///</summary>
/// Needs result
/// </summary>
NeedResult = 0x08,
/// <summary>
/// DMA command
///</summary>
/// DMA command
/// </summary>
Dma = 0x10
}
@@ -314,37 +314,37 @@ namespace DiscImageChef.Devices.FreeBSD
ProtoUnspecified,
/// <summary>
/// Small Computer System Interface
/// Small Computer System Interface
/// </summary>
ProtoScsi,
/// <summary>
/// AT Attachment
/// AT Attachment
/// </summary>
ProtoAta,
/// <summary>
/// AT Attachment Packetized Interface
/// AT Attachment Packetized Interface
/// </summary>
ProtoAtapi,
/// <summary>
/// SATA Port Multiplier
/// SATA Port Multiplier
/// </summary>
ProtoSatapm,
/// <summary>
/// SATA Enclosure Management Bridge
/// SATA Enclosure Management Bridge
/// </summary>
ProtoSemb,
/// <summary>
/// NVMe
/// NVMe
/// </summary>
ProtoNvme,
/// <summary>
/// MMC, SD, SDIO
/// MMC, SD, SDIO
/// </summary>
ProtoMmcsd
}
@@ -391,170 +391,170 @@ namespace DiscImageChef.Devices.FreeBSD
enum CcbFlags : uint
{
/// <summary>
/// The CDB field is a pointer
/// The CDB field is a pointer
/// </summary>
CamCdbPointer = 0x00000001,
/// <summary>
/// SIM queue actions are enabled
/// SIM queue actions are enabled
/// </summary>
CamQueueEnable = 0x00000002,
/// <summary>
/// CCB contains a linked CDB
/// CCB contains a linked CDB
/// </summary>
CamCdbLinked = 0x00000004,
/// <summary>
/// Perform transport negotiation with this command.
/// Perform transport negotiation with this command.
/// </summary>
CamNegotiate = 0x00000008,
/// <summary>
/// Data type with physical addrs
/// Data type with physical addrs
/// </summary>
CamDataIsphys = 0x00000010,
/// <summary>
/// Disable autosense feature
/// Disable autosense feature
/// </summary>
CamDisAutosense = 0x00000020,
/// <summary>
/// Data direction (00:IN/OUT)
/// Data direction (00:IN/OUT)
/// </summary>
CamDirBoth = 0x00000000,
/// <summary>
/// Data direction (01:DATA IN)
/// Data direction (01:DATA IN)
/// </summary>
CamDirIn = 0x00000040,
/// <summary>
/// Data direction (10:DATA OUT)
/// Data direction (10:DATA OUT)
/// </summary>
CamDirOut = 0x00000080,
/// <summary>
/// Data direction (11:no data)
/// Data direction (11:no data)
/// </summary>
CamDirNone = 0x000000C0,
/// <summary>
/// Data type (000:Virtual)
/// Data type (000:Virtual)
/// </summary>
CamDataVaddr = 0x00000000,
/// <summary>
/// Data type (001:Physical)
/// Data type (001:Physical)
/// </summary>
CamDataPaddr = 0x00000010,
/// <summary>
/// Data type (010:sglist)
/// Data type (010:sglist)
/// </summary>
CamDataSg = 0x00040000,
/// <summary>
/// Data type (011:sglist phys)
/// Data type (011:sglist phys)
/// </summary>
CamDataSgPaddr = 0x00040010,
/// <summary>
/// Data type (100:bio)
/// Data type (100:bio)
/// </summary>
CamDataBio = 0x00200000,
/// <summary>
/// Use Soft reset alternative
/// Use Soft reset alternative
/// </summary>
CamSoftRstOp = 0x00000100,
/// <summary>
/// Flush resid bytes on complete
/// Flush resid bytes on complete
/// </summary>
CamEngSync = 0x00000200,
/// <summary>
/// Disable DEV Q freezing
/// Disable DEV Q freezing
/// </summary>
CamDevQfrzdis = 0x00000400,
/// <summary>
/// Freeze DEV Q on execution
/// Freeze DEV Q on execution
/// </summary>
CamDevQfreeze = 0x00000800,
/// <summary>
/// Command takes a lot of power
/// Command takes a lot of power
/// </summary>
CamHighPower = 0x00001000,
/// <summary>
/// Sense data is a pointer
/// Sense data is a pointer
/// </summary>
CamSensePtr = 0x00002000,
/// <summary>
/// Sense pointer is physical addr
/// Sense pointer is physical addr
/// </summary>
CamSensePhys = 0x00004000,
/// <summary>
/// Use the tag action in this ccb
/// Use the tag action in this ccb
/// </summary>
CamTagActionValid = 0x00008000,
/// <summary>
/// Pass driver does err. recovery
/// Pass driver does err. recovery
/// </summary>
CamPassErrRecover = 0x00010000,
/// <summary>
/// Disable disconnect
/// Disable disconnect
/// </summary>
CamDisDisconnect = 0x00020000,
/// <summary>
/// Message buffer ptr is physical
/// Message buffer ptr is physical
/// </summary>
CamMsgBufPhys = 0x00080000,
/// <summary>
/// Autosense data ptr is physical
/// Autosense data ptr is physical
/// </summary>
CamSnsBufPhys = 0x00100000,
/// <summary>
/// CDB poiner is physical
/// CDB poiner is physical
/// </summary>
CamCdbPhys = 0x00400000,
/// <summary>
/// SG list is for the HBA engine
/// SG list is for the HBA engine
/// </summary>
CamEngSglist = 0x00800000,
/* Phase cognizant mode flags */
/// <summary>
/// Disable autosave/restore ptrs
/// Disable autosave/restore ptrs
/// </summary>
CamDisAutosrp = 0x01000000,
/// <summary>
/// Disable auto disconnect
/// Disable auto disconnect
/// </summary>
CamDisAutodisc = 0x02000000,
/// <summary>
/// Target CCB available
/// Target CCB available
/// </summary>
CamTgtCcbAvail = 0x04000000,
/// <summary>
/// The SIM runs in phase mode
/// The SIM runs in phase mode
/// </summary>
CamTgtPhaseMode = 0x08000000,
/// <summary>
/// Message buffer valid
/// Message buffer valid
/// </summary>
CamMsgbValid = 0x10000000,
/// <summary>
/// Status buffer valid
/// Status buffer valid
/// </summary>
CamStatusValid = 0x20000000,
/// <summary>
/// Data buffer valid
/// Data buffer valid
/// </summary>
CamDatabValid = 0x40000000,
/* Host target Mode flags */
/// <summary>
/// Send sense data with status
/// Send sense data with status
/// </summary>
CamSendSense = 0x08000000,
/// <summary>
/// Terminate I/O Message sup.
/// Terminate I/O Message sup.
/// </summary>
CamTermIo = 0x10000000,
/// <summary>
/// Disconnects are mandatory
/// Disconnects are mandatory
/// </summary>
CamDisconnect = 0x20000000,
/// <summary>
/// Send status after data phase
/// Send status after data phase
/// </summary>
CamSendStatus = 0x40000000,
/// <summary>
/// Call callback without lock.
/// Call callback without lock.
/// </summary>
CamUnlocked = 0x80000000
}
@@ -642,7 +642,11 @@ namespace DiscImageChef.Devices.FreeBSD
/// <summary>Request was too large for this host</summary>
CamReqTooBig = 0x1a,
/// <summary>This request should be requeued to preserve transaction ordering. This typically occurs when the SIM recognizes an error that should freeze the queue and must place additional requests for the target at the sim level back into the XPT queue.</summary>
/// <summary>
/// This request should be requeued to preserve transaction ordering. This typically occurs when the SIM
/// recognizes an error that should freeze the queue and must place additional requests for the target at the sim level
/// back into the XPT queue.
/// </summary>
CamRequeueReq = 0x1b,
/// <summary>ATA error, look at error code in CCB</summary>

View File

@@ -44,7 +44,7 @@ namespace DiscImageChef.Devices.FreeBSD
static class ListDevices
{
/// <summary>
/// Gets a list of all known storage devices on FreeBSD
/// Gets a list of all known storage devices on FreeBSD
/// </summary>
/// <returns>List of devices</returns>
internal static DeviceInfo[] GetList()

View File

@@ -37,13 +37,17 @@ using System.Runtime.InteropServices;
using lun_id_t = System.UInt32;
using path_id_t = System.UInt32;
using target_id_t = System.UInt32;
// ReSharper disable BuiltInTypeReferenceStyle
#pragma warning disable 649
#pragma warning disable 169
namespace DiscImageChef.Devices.FreeBSD
{
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct AtaCmd
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct AtaCmd
{
public CamAtaIoFlags flags;
public byte command;
@@ -62,7 +66,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct AtaRes
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct AtaRes
{
public CamAtaIoFlags flags;
public byte status;
@@ -79,55 +84,61 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CamPinfo
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CamPinfo
{
public uint priority;
public uint generation;
public int index;
}
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct ListEntry
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct ListEntry
{
/// <summary>
/// LIST_ENTRY(ccb_hdr)=le->*le_next
/// LIST_ENTRY(ccb_hdr)=le->*le_next
/// </summary>
public IntPtr LeNext;
/// <summary>
/// LIST_ENTRY(ccb_hdr)=le->**le_prev
/// LIST_ENTRY(ccb_hdr)=le->**le_prev
/// </summary>
public IntPtr LePrev;
}
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct SlistEntry
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct SlistEntry
{
/// <summary>
/// SLIST_ENTRY(ccb_hdr)=sle->*sle_next
/// SLIST_ENTRY(ccb_hdr)=sle->*sle_next
/// </summary>
public IntPtr SleNext;
}
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct TailqEntry
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct TailqEntry
{
/// <summary>
/// TAILQ_ENTRY(ccb_hdr)=tqe->*tqe_next
/// TAILQ_ENTRY(ccb_hdr)=tqe->*tqe_next
/// </summary>
public IntPtr TqeNext;
/// <summary>
/// TAILQ_ENTRY(ccb_hdr)=tqe->**tqe_prev
/// TAILQ_ENTRY(ccb_hdr)=tqe->**tqe_prev
/// </summary>
public IntPtr TqePrev;
}
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct StailqEntry
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct StailqEntry
{
/// <summary>
/// STAILQ_ENTRY(ccb_hdr)=stqe->*stqe_next
/// STAILQ_ENTRY(ccb_hdr)=stqe->*stqe_next
/// </summary>
public IntPtr StqeNext;
}
[StructLayout(LayoutKind.Explicit)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CamqEntry
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CamqEntry
{
[FieldOffset(0)] public ListEntry le;
[FieldOffset(0)] public SlistEntry sle;
@@ -136,7 +147,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct Timeval
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct Timeval
{
public long tv_sec;
/// <summary>long</summary>
@@ -144,7 +156,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbQosArea
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbQosArea
{
public Timeval etime;
public UIntPtr sim_data;
@@ -152,7 +165,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbHdr
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbHdr
{
public CamPinfo pinfo;
public CamqEntry xpt_links;
@@ -176,7 +190,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct ScsiSenseData
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct ScsiSenseData
{
const int SSD_FULL_SIZE = 252;
public byte error_code;
@@ -184,10 +199,11 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO function codes.
/// SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO function codes.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbScsiio
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbScsiio
{
public CcbHdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
@@ -213,7 +229,7 @@ namespace DiscImageChef.Devices.FreeBSD
/// <summary>Transfer residual length: 2's comp</summary>
public int resid;
/// <summary>
/// Area for the CDB send, or pointer to the CDB bytes to send
/// Area for the CDB send, or pointer to the CDB bytes to send
/// </summary>
const int IOCDBLEN = 16;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = IOCDBLEN)] public byte[] cdb_bytes;
@@ -221,7 +237,10 @@ namespace DiscImageChef.Devices.FreeBSD
public IntPtr msg_ptr;
/// <summary>Number of bytes for the Message</summary>
public short msg_len;
/// <summary>What to do for tag queueing. The tag action should be either the define below (to send a non-tagged transaction) or one of the defined scsi tag messages from scsi_message.h.</summary>
/// <summary>
/// What to do for tag queueing. The tag action should be either the define below (to send a non-tagged
/// transaction) or one of the defined scsi tag messages from scsi_message.h.
/// </summary>
public byte tag_action;
/// <summary>tag id from initator (target mode)</summary>
public uint tag_id;
@@ -230,10 +249,11 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO function codes.
/// SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO function codes.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbScsiio64
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbScsiio64
{
public CcbHdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
@@ -260,7 +280,7 @@ namespace DiscImageChef.Devices.FreeBSD
public int resid;
public uint alignment;
/// <summary>
/// Area for the CDB send, or pointer to the CDB bytes to send
/// Area for the CDB send, or pointer to the CDB bytes to send
/// </summary>
const int IOCDBLEN = 16;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = IOCDBLEN)] public byte[] cdb_bytes;
@@ -268,7 +288,10 @@ namespace DiscImageChef.Devices.FreeBSD
public IntPtr msg_ptr;
/// <summary>Number of bytes for the Message</summary>
public short msg_len;
/// <summary>What to do for tag queueing. The tag action should be either the define below (to send a non-tagged transaction) or one of the defined scsi tag messages from scsi_message.h.</summary>
/// <summary>
/// What to do for tag queueing. The tag action should be either the define below (to send a non-tagged
/// transaction) or one of the defined scsi tag messages from scsi_message.h.
/// </summary>
public byte tag_action;
/// <summary>tag id from initator (target mode)</summary>
public uint tag_id;
@@ -277,10 +300,11 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// ATA I/O Request CCB used for the XPT_ATA_IO function code.
/// ATA I/O Request CCB used for the XPT_ATA_IO function code.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbAtaio
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbAtaio
{
public CcbHdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
@@ -302,137 +326,140 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct NvmeCommand
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct NvmeCommand
{
ushort opc_fuse_rsvd1;
/// <summary>
/// command identifier
/// command identifier
/// </summary>
public ushort cid;
/// <summary>
/// namespace identifier
/// namespace identifier
/// </summary>
public uint nsid;
/// <summary>
/// reserved
/// reserved
/// </summary>
public uint rsvd2;
/// <summary>
/// reserved
/// reserved
/// </summary>
public uint rsvd3;
/// <summary>
/// metadata pointer
/// metadata pointer
/// </summary>
public ulong mptr;
/// <summary>
/// prp entry 1
/// prp entry 1
/// </summary>
public ulong prp1;
/// <summary>
/// prp entry 2
/// prp entry 2
/// </summary>
public ulong prp2;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw10;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw11;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw12;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw13;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw14;
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw15;
/// <summary>
/// opcode
/// opcode
/// </summary>
public byte Opc => (byte)((opc_fuse_rsvd1 & 0xFF00) >> 8);
/// <summary>
/// fused operation
/// fused operation
/// </summary>
public byte Fuse => (byte)((opc_fuse_rsvd1 & 0xC0) >> 6);
/// <summary>
/// reserved
/// reserved
/// </summary>
public byte Rsvd1 => (byte)(opc_fuse_rsvd1 & 0x3F);
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct NvmeStatus
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct NvmeStatus
{
ushort status;
/// <summary>
/// phase tag
/// phase tag
/// </summary>
public byte P => (byte)((status & 0x8000) >> 15);
/// <summary>
/// status code
/// status code
/// </summary>
public byte Sc => (byte)((status & 0x7F80) >> 7);
/// <summary>
/// status code type
/// status code type
/// </summary>
public byte Sct => (byte)((status & 0x70) >> 4);
/// <summary>
/// reserved
/// reserved
/// </summary>
public byte Rsvd2 => (byte)((status & 0xC) >> 15);
/// <summary>
/// more
/// more
/// </summary>
public byte M => (byte)((status & 0x2) >> 1);
/// <summary>
/// do not retry
/// do not retry
/// </summary>
public byte Dnr => (byte)(status & 0x1);
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct NvmeCompletion
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct NvmeCompletion
{
/// <summary>
/// command-specific
/// command-specific
/// </summary>
public uint cdw0;
/// <summary>
/// reserved
/// reserved
/// </summary>
public uint rsvd1;
/// <summary>
/// submission queue head pointer
/// submission queue head pointer
/// </summary>
public ushort sqhd;
/// <summary>
/// submission queue identifier
/// submission queue identifier
/// </summary>
public ushort sqid;
/// <summary>
/// command identifier
/// command identifier
/// </summary>
public ushort cid;
@@ -440,10 +467,11 @@ namespace DiscImageChef.Devices.FreeBSD
}
/// <summary>
/// NVMe I/O Request CCB used for the XPT_NVME_IO and XPT_NVME_ADMIN function codes.
/// NVMe I/O Request CCB used for the XPT_NVME_IO and XPT_NVME_ADMIN function codes.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbNvmeio
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbNvmeio
{
public CcbHdr ccb_h;
/// <summary>Ptr for next CCB for action</summary>
@@ -463,7 +491,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct PeriphMatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct PeriphMatchPattern
{
const int DEV_IDLEN = 16;
@@ -476,14 +505,16 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DeviceIdMatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DeviceIdMatchPattern
{
public byte id_len;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] id;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct ScsiStaticInquiryPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct ScsiStaticInquiryPattern
{
const int SID_VENDOR_SIZE = 8;
const int SID_PRODUCT_SIZE = 16;
@@ -496,24 +527,27 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Explicit)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DeviceMatchPatternData
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DeviceMatchPatternData
{
[FieldOffset(0)] public ScsiStaticInquiryPattern inq_pat;
[FieldOffset(0)] public DeviceIdMatchPattern devid_pat;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DeviceMatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DeviceMatchPattern
{
public path_id_t path_id;
public target_id_t target_id;
public lun_id_t target_lun;
public uint path_id;
public uint target_id;
public uint target_lun;
public DevPatternFlags flags;
public DeviceMatchPatternData data;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct BusMatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct BusMatchPattern
{
const int DEV_IDLEN = 16;
@@ -525,7 +559,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Explicit)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct MatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct MatchPattern
{
[FieldOffset(0)] public PeriphMatchPattern periph_pattern;
[FieldOffset(0)] public DeviceMatchPattern device_pattern;
@@ -533,14 +568,16 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DevMatchPattern
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DevMatchPattern
{
public DevMatchType type;
public MatchPattern pattern;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct PeriphMatchResult
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct PeriphMatchResult
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] periph_name;
public uint unit_number;
@@ -550,7 +587,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct MmcCid
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct MmcCid
{
public uint mid;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] pnm;
@@ -563,45 +601,46 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct MmcParams
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct MmcParams
{
/// <summary>
/// Card model
/// Card model
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] public byte[] model;
/// <summary>
/// Card OCR
/// Card OCR
/// </summary>
public uint card_ocr;
/// <summary>
/// OCR of the IO portion of the card
/// OCR of the IO portion of the card
/// </summary>
public uint io_ocr;
/// <summary>
/// Card CID -- raw
/// Card CID -- raw
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] card_cid;
/// <summary>
/// Card CID -- parsed
/// Card CID -- parsed
/// </summary>
public MmcCid cid;
/// <summary>
/// Card CSD -- raw
/// Card CSD -- raw
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] card_csd;
/// <summary>
/// Card RCA
/// Card RCA
/// </summary>
public ushort card_rca;
/// <summary>
/// What kind of card is it
/// What kind of card is it
/// </summary>
public MmcCardFeatures card_features;
@@ -609,7 +648,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DeviceMatchResult
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DeviceMatchResult
{
public path_id_t path_id;
public target_id_t target_id;
@@ -622,7 +662,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct BusMatchResult
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct BusMatchResult
{
public path_id_t path_id;
const int DEV_IDLEN = 16;
@@ -632,7 +673,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Explicit)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct MatchResult
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct MatchResult
{
[FieldOffset(0)] public PeriphMatchResult periph_result;
[FieldOffset(0)] public DeviceMatchResult device_result;
@@ -640,14 +682,16 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct DevMatchResult
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct DevMatchResult
{
public DevMatchType type;
public MatchResult result;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbDmCookie
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbDmCookie
{
public IntPtr bus;
public IntPtr target;
@@ -657,7 +701,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbDevPosition
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbDevPosition
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public CamGenerations[] generations;
DevPosType position_type;
@@ -665,7 +710,8 @@ namespace DiscImageChef.Devices.FreeBSD
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbDevMatch
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbDevMatch
{
public CcbHdr ccb_h;
CcbDevMatchStatus status;
@@ -673,7 +719,7 @@ namespace DiscImageChef.Devices.FreeBSD
public uint pattern_buf_len;
/// <summary>
/// dev_match_pattern*
/// dev_match_pattern*
/// </summary>
public IntPtr patterns;
@@ -681,7 +727,7 @@ namespace DiscImageChef.Devices.FreeBSD
public uint match_buf_len;
/// <summary>
/// dev_match_result*
/// dev_match_result*
/// </summary>
public IntPtr matches;
@@ -689,104 +735,105 @@ namespace DiscImageChef.Devices.FreeBSD
}
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
[SuppressMessage("ReSharper", "BuiltInTypeReferenceStyle")]
struct CamDevice
{
const int MAXPATHLEN = 1024;
const int DEV_IDLEN = 16;
const int SIM_IDLEN = 16;
/// <summary>
/// Pathname of the device given by the user. This may be null if the user states the device name and unit number separately.
/// Pathname of the device given by the user. This may be null if the user states the device name and unit number
/// separately.
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXPATHLEN)] public byte[] DevicePath;
/// <summary>
/// Device name given by the user.
/// Device name given by the user.
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = DEV_IDLEN + 1)] public byte[] GivenDevName;
/// <summary>
/// Unit number given by the user.
/// Unit number given by the user.
/// </summary>
public uint GivenUnitNumber;
/// <summary>
/// Name of the device, e.g. 'pass'
/// Name of the device, e.g. 'pass'
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = DEV_IDLEN + 1)] public byte[] DeviceName;
/// <summary>
/// Unit number of the passthrough device associated with this particular device.
/// Unit number of the passthrough device associated with this particular device.
/// </summary>
public uint DevUnitNum;
/// <summary>
/// Controller name, e.g. 'ahc'
/// Controller name, e.g. 'ahc'
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = SIM_IDLEN + 1)] public byte[] SimName;
/// <summary>
/// Controller unit number
/// Controller unit number
/// </summary>
public uint SimUnitNumber;
/// <summary>
/// Controller bus number
/// Controller bus number
/// </summary>
public uint BusId;
/// <summary>
/// Logical Unit Number
/// Logical Unit Number
/// </summary>
public lun_id_t TargetLun;
/// <summary>
/// Target ID
/// Target ID
/// </summary>
public target_id_t TargetId;
/// <summary>
/// System SCSI bus number
/// System SCSI bus number
/// </summary>
public path_id_t PathId;
/// <summary>
/// type of peripheral device
/// type of peripheral device
/// </summary>
public ushort PdType;
/// <summary>
/// SCSI Inquiry data
/// SCSI Inquiry data
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] InqData;
/// <summary>
/// device serial number
/// device serial number
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)] public byte[] SerialNum;
/// <summary>
/// length of the serial number
/// length of the serial number
/// </summary>
public byte SerialNumLen;
/// <summary>
/// Negotiated sync period
/// Negotiated sync period
/// </summary>
public byte SyncPeriod;
/// <summary>
/// Negotiated sync offset
/// Negotiated sync offset
/// </summary>
public byte SyncOffset;
/// <summary>
/// Negotiated bus width
/// Negotiated bus width
/// </summary>
public byte BusWidth;
/// <summary>
/// file descriptor for device
/// file descriptor for device
/// </summary>
public int Fd;
}
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] struct CcbGetdev
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
struct CcbGetdev
{
public CcbHdr ccb_h;
public CamProto protocol;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] inq_data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public byte[] ident_data;
/// <summary>
/// device serial number
/// device serial number
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 252)] public byte[] serial_num;
public byte inq_flags;
/// <summary>
/// length of the serial number
/// length of the serial number
/// </summary>
public byte serial_num_len;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public IntPtr[] padding;