uefi_raw/protocol/
scsi.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// SPDX-License-Identifier: MIT OR Apache-2.0

use crate::{guid, Event, Guid, Status};
use core::ffi::c_void;

newtype_enum! {
    /// Corresponds to the `EFI_SCSI_IO_TYPE_*` defines.
    #[derive(Default)]
    pub enum ScsiIoType: u8  => {
        DISK = 0x00,
        TAPE = 0x01,
        PRINTER = 0x02,
        PROCESSOR = 0x03,
        WRITE_ONCE_READ_MULTIPLE = 0x04,
        CDROM = 0x05,
        SCANNER = 0x06,
        OPTICAL = 0x07,
        MEDIUM_CHANGER = 0x08,
        COMMUNICATION = 0x09,
        RAID = 0x0c,
        ENCLOSURE_SERVICES = 0x0d,
        REDUCED_BLOCK_COMMANDS = 0x0e,
        OPTICAL_CARD_READER_WRITER = 0x0f,
        BRIDGE_CONTROLLER = 0x10,
        OBJECT_BASED_STORAGE = 0x11,
        RESERVED_LOW = 0x12,
        RESERVED_HIGH = 0x1e,
        UNKNOWN = 0x1f,
    }
}

newtype_enum! {
    /// Corresponds to the `EFI_SCSI_IO_DATA_DIRECTION_*` defines.
    #[derive(Default)]
    pub enum ScsiIoDataDirection: u8 => {
        READ = 0,
        WRITE = 1,
        BIDIRECTIONAL = 2,
    }
}

newtype_enum! {
    /// Corresponds to the `EFI_SCSI_IO_STATUS_HOST_ADAPTER_*` defines.
    #[derive(Default)]
    pub enum ScsiIoHostAdapterStatus: u8 => {
       OK = 0x00,
       TIMEOUT_COMMAND = 0x09,
       TIMEOUT = 0x0b,
       MESSAGE_REJECT = 0x0d,
       BUS_RESET = 0x0e,
       PARITY_ERROR = 0x0f,
       REQUEST_SENSE_FAILED = 0x10,
       SELECTION_TIMEOUT = 0x11,
       DATA_OVERRUN_UNDERRUN = 0x12,
       BUS_FREE = 0x13,
       PHASE_ERROR = 0x14,
       OTHER = 0x7f,
    }
}

newtype_enum! {
    /// Corresponds to the `EFI_SCSI_IO_STATUS_TARGET_*` defines.
    #[derive(Default)]
    pub enum ScsiIoTargetStatus: u8 => {
        GOOD = 0x00,
        CHECK_CONDITION = 0x02,
        CONDITION_MET = 0x04,
        BUSY = 0x08,
        INTERMEDIATE = 0x10,
        INTERMEDIATE_CONDITION_MET = 0x14,
        RESERVATION_CONFLICT = 0x18,
        COMMAND_TERMINATED = 0x22,
        QUEUE_FULL = 0x28,
    }
}

#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ScsiIoScsiRequestPacket {
    pub timeout: u64,
    pub in_data_buffer: *mut c_void,
    pub out_data_buffer: *mut c_void,
    pub sense_data: *mut c_void,
    pub cdb: *mut c_void,
    pub in_transfer_length: u32,
    pub out_transfer_length: u32,
    pub cdb_length: u8,
    pub data_direction: ScsiIoDataDirection,
    pub host_adapter_status: ScsiIoHostAdapterStatus,
    pub target_status: ScsiIoTargetStatus,
    pub sense_data_length: u8,
}

#[derive(Debug)]
#[repr(C)]
pub struct ScsiIoProtocol {
    pub get_device_type:
        unsafe extern "efiapi" fn(this: *const Self, device_type: *mut ScsiIoType) -> Status,
    pub get_device_location:
        unsafe extern "efiapi" fn(this: *const Self, target: *mut *mut u8, lun: *mut u64) -> Status,
    pub reset_bus: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
    pub reset_device: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
    pub execute_scsi_command: unsafe extern "efiapi" fn(
        this: *const Self,
        packet: *mut ScsiIoScsiRequestPacket,
        event: Event,
    ) -> Status,
    pub io_align: u32,
}

impl ScsiIoProtocol {
    pub const GUID: Guid = guid!("932f47e6-2362-4002-803e-3cd54b138f85");
}