1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <dev/biovar.h>
19
20 #include <sys/buf.h>
21 #include <sys/queue.h>
22 #include <sys/rwlock.h>
23
24 #include <scsi/scsi_all.h>
25 #include <scsi/scsi_disk.h>
26 #include <scsi/scsiconf.h>
27
28 #define DEVNAME(_s) ((_s)->sc_dev.dv_xname)
29
30
31 #ifdef SR_DEBUG
32 extern u_int32_t sr_debug;
33 #define DPRINTF(x...) do { if (sr_debug) printf(x); } while(0)
34 #define DNPRINTF(n,x...) do { if (sr_debug & n) printf(x); } while(0)
35 #define SR_D_CMD 0x0001
36 #define SR_D_INTR 0x0002
37 #define SR_D_MISC 0x0004
38 #define SR_D_IOCTL 0x0008
39 #define SR_D_CCB 0x0010
40 #define SR_D_WU 0x0020
41 #define SR_D_META 0x0040
42 #define SR_D_DIS 0x0080
43 #define SR_D_STATE 0x0100
44 #else
45 #define DPRINTF(x...)
46 #define DNPRINTF(n,x...)
47 #endif
48
49 #define SR_MAXFER MAXPHYS
50 #define SR_MAX_LD 1
51 #define SR_MAX_CMDS 16
52 #define SR_MAX_STATES 7
53
54
55 struct sr_softc;
56
57 #define SR_UUID_MAX 4
58 struct sr_uuid {
59 u_int32_t sui_id[SR_UUID_MAX];
60 } __packed;
61
62 struct sr_ccb {
63 struct buf ccb_buf;
64
65 struct sr_workunit *ccb_wu;
66 struct sr_discipline *ccb_dis;
67
68 int ccb_target;
69 int ccb_state;
70 #define SR_CCB_FREE 0
71 #define SR_CCB_INPROGRESS 1
72 #define SR_CCB_OK 2
73 #define SR_CCB_FAILED 3
74
75 TAILQ_ENTRY(sr_ccb) ccb_link;
76 } __packed;
77
78 TAILQ_HEAD(sr_ccb_list, sr_ccb);
79
80 struct sr_workunit {
81 struct scsi_xfer *swu_xs;
82 struct sr_discipline *swu_dis;
83
84 int swu_state;
85 #define SR_WU_FREE 0
86 #define SR_WU_INPROGRESS 1
87 #define SR_WU_OK 2
88 #define SR_WU_FAILED 3
89 #define SR_WU_PARTIALLYFAILED 4
90 #define SR_WU_DEFERRED 5
91 #define SR_WU_PENDING 6
92 #define SR_WU_RESTART 7
93 #define SR_WU_REQUEUE 8
94
95 int swu_fake;
96
97 daddr64_t swu_blk_start;
98 daddr64_t swu_blk_end;
99
100
101 u_int32_t swu_ios_complete;
102 u_int32_t swu_ios_failed;
103 u_int32_t swu_ios_succeeded;
104
105
106 u_int32_t swu_io_count;
107
108
109 struct sr_workunit *swu_collider;
110
111
112 struct sr_ccb_list swu_ccb;
113
114 TAILQ_ENTRY(sr_workunit) swu_link;
115 };
116
117 TAILQ_HEAD(sr_wu_list, sr_workunit);
118
119
120 #define SR_RAID1_NOWU 16
121 struct sr_raid1 {
122 u_int32_t sr1_counter;
123 };
124
125
126 #define SR_RAIDC_NOWU 16
127 struct sr_raidc {
128 u_int64_t src_sid;
129 char src_key[64];
130 };
131
132 #define SR_META_SIZE 32
133 #define SR_META_OFFSET 16
134 #define SR_META_VERSION 1
135 struct sr_metadata {
136
137 u_int64_t ssd_magic;
138 #define SR_MAGIC 0x4d4152436372616dLLU
139 u_int8_t ssd_version;
140 u_int8_t ssd_pad1[3];
141 u_int32_t ssd_flags;
142
143
144 u_int32_t ssd_checksum;
145 u_int32_t ssd_size;
146 u_int32_t ssd_ondisk;
147 u_int32_t ssd_pad2;
148 struct sr_uuid ssd_uuid;
149
150
151 u_int32_t ssd_vd_ver;
152 u_int32_t ssd_vd_size;
153 u_int32_t ssd_vd_volid;
154 u_int32_t ssd_vd_chk;
155
156
157 u_int32_t ssd_chunk_ver;
158 u_int32_t ssd_chunk_no;
159 u_int32_t ssd_chunk_size;
160 u_int32_t ssd_chunk_id;
161 u_int32_t ssd_chunk_chk;
162 u_int32_t ssd_pad3;
163
164
165 u_int32_t ssd_opt_ver;
166 u_int32_t ssd_opt_no;
167 u_int32_t ssd_opt_size;
168 u_int32_t ssd_opt_chk;
169 } __packed;
170
171 struct sr_metadata_list {
172 struct sr_metadata *sml_metadata;
173 dev_t sml_mm;
174 int sml_used;
175
176 SLIST_ENTRY(sr_metadata_list) sml_link;
177 };
178
179 SLIST_HEAD(sr_metadata_list_head, sr_metadata_list);
180
181 #define SR_OPT_VERSION 1
182 struct sr_opt_meta {
183 u_int32_t som_type;
184 u_int32_t som_pad;
185 #define SR_OPT_INVALID 0x00
186 #define SR_OPT_CRYPTO 0x01
187 union {
188 struct sr_raidc smm_crypto;
189 } som_meta;
190 };
191
192 #define SR_CHUNK_VERSION 1
193 struct sr_chunk_meta {
194 u_int32_t scm_volid;
195 u_int32_t scm_chunk_id;
196 u_int32_t scm_status;
197 u_int32_t scm_pad1;
198 char scm_devname[32];
199 int64_t scm_size;
200 int64_t scm_coerced_size;
201 struct sr_uuid scm_uuid;
202 } __packed;
203
204 struct sr_chunk {
205 struct sr_chunk_meta src_meta;
206
207
208 dev_t src_dev_mm;
209
210
211 int src_meta_ondisk;
212 char src_devname[32];
213 int64_t src_size;
214
215 SLIST_ENTRY(sr_chunk) src_link;
216 };
217
218 SLIST_HEAD(sr_chunk_head, sr_chunk);
219
220 #define SR_VOL_VERSION 1
221 struct sr_vol_meta {
222 u_int32_t svm_volid;
223 u_int32_t svm_status;
224 u_int32_t svm_flags;
225 #define SR_VOL_DIRTY 0x01
226 u_int32_t svm_level;
227 int64_t svm_size;
228 char svm_devname[32];
229 char svm_vendor[8];
230 char svm_product[16];
231 char svm_revision[4];
232 u_int32_t svm_no_chunk;
233 struct sr_uuid svm_uuid;
234 } __packed;
235
236 struct sr_volume {
237 struct sr_vol_meta sv_meta;
238
239
240 struct sr_chunk_head sv_chunk_list;
241 struct sr_chunk **sv_chunks;
242
243
244 struct ksensor sv_sensor;
245 struct ksensordev sv_sensordev;
246 int sv_sensor_valid;
247 };
248
249 struct sr_discipline {
250 struct sr_softc *sd_sc;
251 u_int8_t sd_type;
252 #define SR_MD_RAID0 0
253 #define SR_MD_RAID1 1
254 #define SR_MD_RAID5 2
255 #define SR_MD_CACHE 3
256 #define SR_MD_RAIDC 4
257 char sd_name[10];
258 u_int8_t sd_scsibus;
259 struct scsi_link sd_link;
260
261 union {
262 struct sr_raid1 mdd_raid1;
263 struct sr_raidc mdd_raidc;
264 } sd_dis_specific;
265 #define mds sd_dis_specific
266
267
268 struct sr_metadata *sd_meta;
269 u_int32_t sd_meta_flags;
270
271 int sd_sync;
272 int sd_must_flush;
273
274 struct device *sd_scsibus_dev;
275 void (*sd_shutdownhook)(void *);
276
277
278 struct sr_volume sd_vol;
279
280
281 struct sr_ccb *sd_ccb;
282 struct sr_ccb_list sd_ccb_freeq;
283 u_int32_t sd_max_ccb_per_wu;
284
285 struct sr_workunit *sd_wu;
286 u_int32_t sd_max_wu;
287
288 struct sr_wu_list sd_wu_freeq;
289 struct sr_wu_list sd_wu_pendq;
290 struct sr_wu_list sd_wu_defq;
291
292
293 int sd_wu_pending;
294 u_int64_t sd_wu_collisions;
295
296
297 int (*sd_alloc_resources)(struct sr_discipline *);
298 int (*sd_assemble_volume)(void *);
299 int (*sd_bringup_volume)(void *);
300 int (*sd_shutdown_volume)(void *);
301 int (*sd_free_resources)(struct sr_discipline *);
302 int (*sd_quiesce_io)(struct sr_discipline *);
303 void (*sd_set_chunk_state)(struct sr_discipline *,
304 int, int);
305 void (*sd_set_vol_state)(struct sr_discipline *);
306
307
308 struct scsi_sense_data sd_scsi_sense;
309 int (*sd_scsi_rw)(struct sr_workunit *);
310 int (*sd_scsi_sync)(struct sr_workunit *);
311 int (*sd_scsi_tur)(struct sr_workunit *);
312 int (*sd_scsi_start_stop)(struct sr_workunit *);
313 int (*sd_scsi_inquiry)(struct sr_workunit *);
314 int (*sd_scsi_read_cap)(struct sr_workunit *);
315 int (*sd_scsi_req_sense)(struct sr_workunit *);
316 };
317
318 struct sr_softc {
319 struct device sc_dev;
320
321 int (*sc_ioctl)(struct device *, u_long, caddr_t);
322
323 struct rwlock sc_lock;
324
325 int sc_sensors_running;
326
327
328
329
330 struct sr_discipline *sc_attach_dis;
331
332
333
334
335
336 #define SR_MAXSCSIBUS 256
337 struct sr_discipline *sc_dis[SR_MAXSCSIBUS];
338 };