summaryrefslogtreecommitdiff
path: root/sysutils/smartmontools/files/patch-os__freebsd.h
blob: 7bace7bc234d86a85e37a251a5c406027c9d6962 (plain) (blame)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
--- os_freebsd.h.orig	2018-08-19 18:45:53 UTC
+++ os_freebsd.h
@@ -606,4 +606,164 @@ HPT_PASS_THROUGH_HEADER, *PHPT_PASS_THROUGH_HEADER;
 #define __unused __attribute__ ((__unused__))
 #endif
 
+// MFI definition from the kernel sources, see sys/dev/mfi
+
+#define MFI_STAT_OK          0x00
+#define MFI_DCMD_PD_GET_LIST 0x02010000
+
+#define MFI_CTRLR_PREFIX	"/dev/mfi"
+#define MRSAS_CTRLR_PREFIX	"/dev/mrsas"
+
+/*
+ * MFI Frame flags
+ */
+#define MFI_FRAME_POST_IN_REPLY_QUEUE           0x0000
+#define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE      0x0001
+#define MFI_FRAME_SGL32                         0x0000
+#define MFI_FRAME_SGL64                         0x0002
+#define MFI_FRAME_SENSE32                       0x0000
+#define MFI_FRAME_SENSE64                       0x0004
+#define MFI_FRAME_DIR_NONE                      0x0000
+#define MFI_FRAME_DIR_WRITE                     0x0008
+#define MFI_FRAME_DIR_READ                      0x0010
+#define MFI_FRAME_DIR_BOTH                      0x0018
+#define MFI_FRAME_IEEE_SGL                      0x0020
+#define MFI_FRAME_FMT "\20" \
+    "\1NOPOST" \
+    "\2SGL64" \
+    "\3SENSE64" \
+    "\4WRITE" \
+    "\5READ" \
+    "\6IEEESGL"
+
+/* MFI Commands */
+typedef enum {
+    MFI_CMD_INIT =              0x00,
+    MFI_CMD_LD_READ,
+    MFI_CMD_LD_WRITE,
+    MFI_CMD_LD_SCSI_IO,
+    MFI_CMD_PD_SCSI_IO,
+    MFI_CMD_DCMD,
+    MFI_CMD_ABORT,
+    MFI_CMD_SMP,
+    MFI_CMD_STP
+} mfi_cmd_t;
+
+/* Scatter Gather elements */
+struct mfi_sg32 {
+    uint32_t    addr;
+    uint32_t    len;
+} __packed;
+
+struct mfi_sg64 {
+    uint64_t    addr;
+    uint32_t    len;
+} __packed;
+
+struct mfi_sg_skinny {
+    uint64_t    addr;
+    uint32_t    len;
+    uint32_t    flag;
+} __packed;
+
+union mfi_sgl {
+    struct mfi_sg32             sg32[1];
+    struct mfi_sg64             sg64[1];
+    struct mfi_sg_skinny        sg_skinny[1];
+} __packed;
+
+/* Message frames.  All messages have a common header */
+struct mfi_frame_header {
+    uint8_t             cmd;
+    uint8_t             sense_len;
+    uint8_t             cmd_status;
+    uint8_t             scsi_status;
+    uint8_t             target_id;
+    uint8_t             lun_id;
+    uint8_t             cdb_len;
+    uint8_t             sg_count;
+    uint32_t    context;
+    /*
+     * pad0 is MSI Specific. Not used by Driver. Zero the value before
+     * sending the command to f/w.
+     */
+    uint32_t    pad0;
+    uint16_t    flags;
+#define MFI_FRAME_DATAOUT       0x08
+#define MFI_FRAME_DATAIN        0x10
+    uint16_t    timeout;
+    uint32_t    data_len;
+} __packed;
+
+#define MFI_PASS_FRAME_SIZE 48
+struct mfi_pass_frame {
+    struct mfi_frame_header header;
+    uint32_t    sense_addr_lo;
+    uint32_t    sense_addr_hi;
+    uint8_t             cdb[16];
+    union mfi_sgl       sgl;
+} __packed;
+
+#define MFI_DCMD_FRAME_SIZE     40
+#define MFI_MBOX_SIZE           12
+
+struct mfi_dcmd_frame {
+    struct mfi_frame_header header;
+    uint32_t	opcode;
+    uint8_t		mbox[MFI_MBOX_SIZE];
+    union mfi_sgl	sgl;
+} __packed;
+
+#define MAX_IOCTL_SGE   16
+struct mfi_ioc_packet {
+    uint16_t    mfi_adapter_no;
+    uint16_t    mfi_pad1;
+    uint32_t    mfi_sgl_off;
+    uint32_t    mfi_sge_count;
+    uint32_t    mfi_sense_off;
+    uint32_t    mfi_sense_len;
+    union {
+        uint8_t raw[128];
+        struct mfi_frame_header hdr;
+    } mfi_frame;
+
+    struct iovec mfi_sgl[MAX_IOCTL_SGE];
+} __packed;
+
+#ifdef COMPAT_FREEBSD32
+struct mfi_ioc_packet32 {
+    uint16_t    mfi_adapter_no;
+    uint16_t    mfi_pad1;
+    uint32_t    mfi_sgl_off;
+    uint32_t    mfi_sge_count;
+    uint32_t    mfi_sense_off;
+    uint32_t    mfi_sense_len;
+    union {
+        uint8_t raw[128];
+        struct mfi_frame_header hdr;
+    } mfi_frame;
+
+    struct iovec32 mfi_sgl[MAX_IOCTL_SGE];
+} __packed;
+#endif
+
+struct mfi_pd_address {
+    uint16_t		device_id;
+    uint16_t		encl_device_id;
+    uint8_t			encl_index;
+    uint8_t			slot_number;
+    uint8_t			scsi_dev_type;	/* 0 = disk */
+    uint8_t			connect_port_bitmap;
+    uint64_t		sas_addr[2];
+} __packed;
+
+#define MAX_SYS_PDS 240
+struct mfi_pd_list {
+    uint32_t		size;
+    uint32_t		count;
+    struct mfi_pd_address	addr[MAX_SYS_PDS];
+} __packed;
+
+#define MFI_CMD		_IOWR('M', 1, struct mfi_ioc_packet)
+
 #endif /* OS_FREEBSD_H_ */