Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-doc
Path: blob/main/website/static/security/patches/EN-13:03/mfi.patch
18096 views
1
Index: sys/dev/mfi/mfi.c
2
===================================================================
3
--- sys/dev/mfi/mfi.c (revision 254079)
4
+++ sys/dev/mfi/mfi.c (working copy)
5
@@ -107,7 +107,7 @@ static void mfi_bio_complete(struct mfi_command *)
6
static struct mfi_command *mfi_build_ldio(struct mfi_softc *,struct bio*);
7
static struct mfi_command *mfi_build_syspdio(struct mfi_softc *,struct bio*);
8
static int mfi_send_frame(struct mfi_softc *, struct mfi_command *);
9
-static int mfi_abort(struct mfi_softc *, struct mfi_command *);
10
+static int mfi_abort(struct mfi_softc *, struct mfi_command **);
11
static int mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int, struct thread *);
12
static void mfi_timeout(void *);
13
static int mfi_user_command(struct mfi_softc *,
14
@@ -373,6 +373,8 @@ mfi_attach(struct mfi_softc *sc)
15
sx_init(&sc->mfi_config_lock, "MFI config");
16
TAILQ_INIT(&sc->mfi_ld_tqh);
17
TAILQ_INIT(&sc->mfi_syspd_tqh);
18
+ TAILQ_INIT(&sc->mfi_ld_pend_tqh);
19
+ TAILQ_INIT(&sc->mfi_syspd_pend_tqh);
20
TAILQ_INIT(&sc->mfi_evt_queue);
21
TASK_INIT(&sc->mfi_evt_task, 0, mfi_handle_evt, sc);
22
TASK_INIT(&sc->mfi_map_sync_task, 0, mfi_handle_map_sync, sc);
23
@@ -694,6 +696,7 @@ mfi_attach(struct mfi_softc *sc)
24
device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
25
return (EINVAL);
26
}
27
+ sc->mfi_intr_ptr = mfi_intr_tbolt;
28
sc->mfi_enable_intr(sc);
29
} else {
30
if ((error = mfi_comms_init(sc)) != 0)
31
@@ -704,6 +707,7 @@ mfi_attach(struct mfi_softc *sc)
32
device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
33
return (EINVAL);
34
}
35
+ sc->mfi_intr_ptr = mfi_intr;
36
sc->mfi_enable_intr(sc);
37
}
38
if ((error = mfi_get_controller_info(sc)) != 0)
39
@@ -1278,6 +1282,17 @@ mfi_shutdown(struct mfi_softc *sc)
40
struct mfi_command *cm;
41
int error;
42
43
+
44
+ if (sc->mfi_aen_cm)
45
+ sc->cm_aen_abort = 1;
46
+ if (sc->mfi_aen_cm != NULL)
47
+ mfi_abort(sc, &sc->mfi_aen_cm);
48
+
49
+ if (sc->mfi_map_sync_cm)
50
+ sc->cm_map_abort = 1;
51
+ if (sc->mfi_map_sync_cm != NULL)
52
+ mfi_abort(sc, &sc->mfi_map_sync_cm);
53
+
54
mtx_lock(&sc->mfi_io_lock);
55
error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_SHUTDOWN, NULL, 0);
56
if (error) {
57
@@ -1285,12 +1300,6 @@ mfi_shutdown(struct mfi_softc *sc)
58
return (error);
59
}
60
61
- if (sc->mfi_aen_cm != NULL)
62
- mfi_abort(sc, sc->mfi_aen_cm);
63
-
64
- if (sc->mfi_map_sync_cm != NULL)
65
- mfi_abort(sc, sc->mfi_map_sync_cm);
66
-
67
dcmd = &cm->cm_frame->dcmd;
68
dcmd->header.flags = MFI_FRAME_DIR_NONE;
69
cm->cm_flags = MFI_CMD_POLLED;
70
@@ -1312,6 +1321,7 @@ mfi_syspdprobe(struct mfi_softc *sc)
71
struct mfi_command *cm = NULL;
72
struct mfi_pd_list *pdlist = NULL;
73
struct mfi_system_pd *syspd, *tmp;
74
+ struct mfi_system_pending *syspd_pend;
75
int error, i, found;
76
77
sx_assert(&sc->mfi_config_lock, SA_XLOCKED);
78
@@ -1352,6 +1362,10 @@ mfi_syspdprobe(struct mfi_softc *sc)
79
if (syspd->pd_id == pdlist->addr[i].device_id)
80
found = 1;
81
}
82
+ TAILQ_FOREACH(syspd_pend, &sc->mfi_syspd_pend_tqh, pd_link) {
83
+ if (syspd_pend->pd_id == pdlist->addr[i].device_id)
84
+ found = 1;
85
+ }
86
if (found == 0)
87
mfi_add_sys_pd(sc, pdlist->addr[i].device_id);
88
}
89
@@ -1387,6 +1401,7 @@ mfi_ldprobe(struct mfi_softc *sc)
90
struct mfi_command *cm = NULL;
91
struct mfi_ld_list *list = NULL;
92
struct mfi_disk *ld;
93
+ struct mfi_disk_pending *ld_pend;
94
int error, i;
95
96
sx_assert(&sc->mfi_config_lock, SA_XLOCKED);
97
@@ -1415,6 +1430,10 @@ mfi_ldprobe(struct mfi_softc *sc)
98
if (ld->ld_id == list->ld_list[i].ld.v.target_id)
99
goto skip_add;
100
}
101
+ TAILQ_FOREACH(ld_pend, &sc->mfi_ld_pend_tqh, ld_link) {
102
+ if (ld_pend->ld_id == list->ld_list[i].ld.v.target_id)
103
+ goto skip_add;
104
+ }
105
mfi_add_ld(sc, list->ld_list[i].ld.v.target_id);
106
skip_add:;
107
}
108
@@ -1617,9 +1636,7 @@ mfi_aen_register(struct mfi_softc *sc, int seq, in
109
< current_aen.members.evt_class)
110
current_aen.members.evt_class =
111
prior_aen.members.evt_class;
112
- mtx_lock(&sc->mfi_io_lock);
113
- mfi_abort(sc, sc->mfi_aen_cm);
114
- mtx_unlock(&sc->mfi_io_lock);
115
+ mfi_abort(sc, &sc->mfi_aen_cm);
116
}
117
}
118
119
@@ -1811,10 +1828,17 @@ mfi_add_ld(struct mfi_softc *sc, int id)
120
struct mfi_command *cm;
121
struct mfi_dcmd_frame *dcmd = NULL;
122
struct mfi_ld_info *ld_info = NULL;
123
+ struct mfi_disk_pending *ld_pend;
124
int error;
125
126
mtx_assert(&sc->mfi_io_lock, MA_OWNED);
127
128
+ ld_pend = malloc(sizeof(*ld_pend), M_MFIBUF, M_NOWAIT | M_ZERO);
129
+ if (ld_pend != NULL) {
130
+ ld_pend->ld_id = id;
131
+ TAILQ_INSERT_TAIL(&sc->mfi_ld_pend_tqh, ld_pend, ld_link);
132
+ }
133
+
134
error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_INFO,
135
(void **)&ld_info, sizeof(*ld_info));
136
if (error) {
137
@@ -1855,11 +1879,13 @@ mfi_add_ld_complete(struct mfi_command *cm)
138
hdr = &cm->cm_frame->header;
139
ld_info = cm->cm_private;
140
141
- if (hdr->cmd_status != MFI_STAT_OK) {
142
+ if (sc->cm_map_abort || hdr->cmd_status != MFI_STAT_OK) {
143
free(ld_info, M_MFIBUF);
144
+ wakeup(&sc->mfi_map_sync_cm);
145
mfi_release_command(cm);
146
return;
147
}
148
+ wakeup(&sc->mfi_map_sync_cm);
149
mfi_release_command(cm);
150
151
mtx_unlock(&sc->mfi_io_lock);
152
@@ -1884,10 +1910,17 @@ static int mfi_add_sys_pd(struct mfi_softc *sc, in
153
struct mfi_command *cm;
154
struct mfi_dcmd_frame *dcmd = NULL;
155
struct mfi_pd_info *pd_info = NULL;
156
+ struct mfi_system_pending *syspd_pend;
157
int error;
158
159
mtx_assert(&sc->mfi_io_lock, MA_OWNED);
160
161
+ syspd_pend = malloc(sizeof(*syspd_pend), M_MFIBUF, M_NOWAIT | M_ZERO);
162
+ if (syspd_pend != NULL) {
163
+ syspd_pend->pd_id = id;
164
+ TAILQ_INSERT_TAIL(&sc->mfi_syspd_pend_tqh, syspd_pend, pd_link);
165
+ }
166
+
167
error = mfi_dcmd_command(sc, &cm, MFI_DCMD_PD_GET_INFO,
168
(void **)&pd_info, sizeof(*pd_info));
169
if (error) {
170
@@ -1981,19 +2014,87 @@ mfi_bio_command(struct mfi_softc *sc)
171
mfi_enqueue_bio(sc, bio);
172
return cm;
173
}
174
+
175
+/*
176
+ * mostly copied from cam/scsi/scsi_all.c:scsi_read_write
177
+ */
178
+
179
+int
180
+mfi_build_cdb(int readop, uint8_t byte2, u_int64_t lba, u_int32_t block_count, uint8_t *cdb)
181
+{
182
+ int cdb_len;
183
+
184
+ if (((lba & 0x1fffff) == lba)
185
+ && ((block_count & 0xff) == block_count)
186
+ && (byte2 == 0)) {
187
+ /* We can fit in a 6 byte cdb */
188
+ struct scsi_rw_6 *scsi_cmd;
189
+
190
+ scsi_cmd = (struct scsi_rw_6 *)cdb;
191
+ scsi_cmd->opcode = readop ? READ_6 : WRITE_6;
192
+ scsi_ulto3b(lba, scsi_cmd->addr);
193
+ scsi_cmd->length = block_count & 0xff;
194
+ scsi_cmd->control = 0;
195
+ cdb_len = sizeof(*scsi_cmd);
196
+ } else if (((block_count & 0xffff) == block_count) && ((lba & 0xffffffff) == lba)) {
197
+ /* Need a 10 byte CDB */
198
+ struct scsi_rw_10 *scsi_cmd;
199
+
200
+ scsi_cmd = (struct scsi_rw_10 *)cdb;
201
+ scsi_cmd->opcode = readop ? READ_10 : WRITE_10;
202
+ scsi_cmd->byte2 = byte2;
203
+ scsi_ulto4b(lba, scsi_cmd->addr);
204
+ scsi_cmd->reserved = 0;
205
+ scsi_ulto2b(block_count, scsi_cmd->length);
206
+ scsi_cmd->control = 0;
207
+ cdb_len = sizeof(*scsi_cmd);
208
+ } else if (((block_count & 0xffffffff) == block_count) &&
209
+ ((lba & 0xffffffff) == lba)) {
210
+ /* Block count is too big for 10 byte CDB use a 12 byte CDB */
211
+ struct scsi_rw_12 *scsi_cmd;
212
+
213
+ scsi_cmd = (struct scsi_rw_12 *)cdb;
214
+ scsi_cmd->opcode = readop ? READ_12 : WRITE_12;
215
+ scsi_cmd->byte2 = byte2;
216
+ scsi_ulto4b(lba, scsi_cmd->addr);
217
+ scsi_cmd->reserved = 0;
218
+ scsi_ulto4b(block_count, scsi_cmd->length);
219
+ scsi_cmd->control = 0;
220
+ cdb_len = sizeof(*scsi_cmd);
221
+ } else {
222
+ /*
223
+ * 16 byte CDB. We'll only get here if the LBA is larger
224
+ * than 2^32
225
+ */
226
+ struct scsi_rw_16 *scsi_cmd;
227
+
228
+ scsi_cmd = (struct scsi_rw_16 *)cdb;
229
+ scsi_cmd->opcode = readop ? READ_16 : WRITE_16;
230
+ scsi_cmd->byte2 = byte2;
231
+ scsi_u64to8b(lba, scsi_cmd->addr);
232
+ scsi_cmd->reserved = 0;
233
+ scsi_ulto4b(block_count, scsi_cmd->length);
234
+ scsi_cmd->control = 0;
235
+ cdb_len = sizeof(*scsi_cmd);
236
+ }
237
+
238
+ return cdb_len;
239
+}
240
+
241
static struct mfi_command *
242
mfi_build_syspdio(struct mfi_softc *sc, struct bio *bio)
243
{
244
struct mfi_command *cm;
245
struct mfi_pass_frame *pass;
246
- int flags = 0, blkcount = 0;
247
uint32_t context = 0;
248
+ int flags = 0, blkcount = 0, readop;
249
+ uint8_t cdb_len;
250
251
if ((cm = mfi_dequeue_free(sc)) == NULL)
252
return (NULL);
253
254
/* Zero out the MFI frame */
255
- context = cm->cm_frame->header.context;
256
+ context = cm->cm_frame->header.context;
257
bzero(cm->cm_frame, sizeof(union mfi_frame));
258
cm->cm_frame->header.context = context;
259
pass = &cm->cm_frame->pass;
260
@@ -2001,35 +2102,31 @@ mfi_build_syspdio(struct mfi_softc *sc, struct bio
261
pass->header.cmd = MFI_CMD_PD_SCSI_IO;
262
switch (bio->bio_cmd & 0x03) {
263
case BIO_READ:
264
-#define SCSI_READ 0x28
265
- pass->cdb[0] = SCSI_READ;
266
flags = MFI_CMD_DATAIN;
267
+ readop = 1;
268
break;
269
case BIO_WRITE:
270
-#define SCSI_WRITE 0x2a
271
- pass->cdb[0] = SCSI_WRITE;
272
flags = MFI_CMD_DATAOUT;
273
+ readop = 0;
274
break;
275
default:
276
- panic("Invalid bio command");
277
+ /* TODO: what about BIO_DELETE??? */
278
+ panic("Unsupported bio command %x\n", bio->bio_cmd);
279
}
280
281
/* Cheat with the sector length to avoid a non-constant division */
282
blkcount = (bio->bio_bcount + MFI_SECTOR_LEN - 1) / MFI_SECTOR_LEN;
283
/* Fill the LBA and Transfer length in CDB */
284
- pass->cdb[2] = (bio->bio_pblkno & 0xff000000) >> 24;
285
- pass->cdb[3] = (bio->bio_pblkno & 0x00ff0000) >> 16;
286
- pass->cdb[4] = (bio->bio_pblkno & 0x0000ff00) >> 8;
287
- pass->cdb[5] = bio->bio_pblkno & 0x000000ff;
288
- pass->cdb[7] = (blkcount & 0xff00) >> 8;
289
- pass->cdb[8] = (blkcount & 0x00ff);
290
+ cdb_len = mfi_build_cdb(readop, 0, bio->bio_pblkno, blkcount,
291
+ pass->cdb);
292
pass->header.target_id = (uintptr_t)bio->bio_driver1;
293
+ pass->header.lun_id = 0;
294
pass->header.timeout = 0;
295
pass->header.flags = 0;
296
pass->header.scsi_status = 0;
297
pass->header.sense_len = MFI_SENSE_LEN;
298
pass->header.data_len = bio->bio_bcount;
299
- pass->header.cdb_len = 10;
300
+ pass->header.cdb_len = cdb_len;
301
pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
302
pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
303
cm->cm_complete = mfi_bio_complete;
304
@@ -2047,7 +2144,8 @@ mfi_build_ldio(struct mfi_softc *sc, struct bio *b
305
{
306
struct mfi_io_frame *io;
307
struct mfi_command *cm;
308
- int flags, blkcount;
309
+ int flags;
310
+ uint32_t blkcount;
311
uint32_t context = 0;
312
313
if ((cm = mfi_dequeue_free(sc)) == NULL)
314
@@ -2068,7 +2166,8 @@ mfi_build_ldio(struct mfi_softc *sc, struct bio *b
315
flags = MFI_CMD_DATAOUT;
316
break;
317
default:
318
- panic("Invalid bio command");
319
+ /* TODO: what about BIO_DELETE??? */
320
+ panic("Unsupported bio command %x\n", bio->bio_cmd);
321
}
322
323
/* Cheat with the sector length to avoid a non-constant division */
324
@@ -2358,7 +2457,7 @@ mfi_complete(struct mfi_softc *sc, struct mfi_comm
325
}
326
327
static int
328
-mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort)
329
+mfi_abort(struct mfi_softc *sc, struct mfi_command **cm_abort)
330
{
331
struct mfi_command *cm;
332
struct mfi_abort_frame *abort;
333
@@ -2365,8 +2464,7 @@ static int
334
int i = 0;
335
uint32_t context = 0;
336
337
- mtx_assert(&sc->mfi_io_lock, MA_OWNED);
338
-
339
+ mtx_lock(&sc->mfi_io_lock);
340
if ((cm = mfi_dequeue_free(sc)) == NULL) {
341
return (EBUSY);
342
}
343
@@ -2380,29 +2478,27 @@ static int
344
abort->header.cmd = MFI_CMD_ABORT;
345
abort->header.flags = 0;
346
abort->header.scsi_status = 0;
347
- abort->abort_context = cm_abort->cm_frame->header.context;
348
- abort->abort_mfi_addr_lo = (uint32_t)cm_abort->cm_frame_busaddr;
349
+ abort->abort_context = (*cm_abort)->cm_frame->header.context;
350
+ abort->abort_mfi_addr_lo = (uint32_t)(*cm_abort)->cm_frame_busaddr;
351
abort->abort_mfi_addr_hi =
352
- (uint32_t)((uint64_t)cm_abort->cm_frame_busaddr >> 32);
353
+ (uint32_t)((uint64_t)(*cm_abort)->cm_frame_busaddr >> 32);
354
cm->cm_data = NULL;
355
cm->cm_flags = MFI_CMD_POLLED;
356
357
- if (sc->mfi_aen_cm)
358
- sc->cm_aen_abort = 1;
359
- if (sc->mfi_map_sync_cm)
360
- sc->cm_map_abort = 1;
361
mfi_mapcmd(sc, cm);
362
mfi_release_command(cm);
363
364
- while (i < 5 && sc->mfi_aen_cm != NULL) {
365
- msleep(&sc->mfi_aen_cm, &sc->mfi_io_lock, 0, "mfiabort",
366
+ mtx_unlock(&sc->mfi_io_lock);
367
+ while (i < 5 && *cm_abort != NULL) {
368
+ tsleep(cm_abort, 0, "mfiabort",
369
5 * hz);
370
i++;
371
}
372
- while (i < 5 && sc->mfi_map_sync_cm != NULL) {
373
- msleep(&sc->mfi_map_sync_cm, &sc->mfi_io_lock, 0, "mfiabort",
374
- 5 * hz);
375
- i++;
376
+ if (*cm_abort != NULL) {
377
+ /* Force a complete if command didn't abort */
378
+ mtx_lock(&sc->mfi_io_lock);
379
+ (*cm_abort)->cm_complete(*cm_abort);
380
+ mtx_unlock(&sc->mfi_io_lock);
381
}
382
383
return (0);
384
@@ -2458,8 +2554,8 @@ mfi_dump_syspd_blocks(struct mfi_softc *sc, int id
385
{
386
struct mfi_command *cm;
387
struct mfi_pass_frame *pass;
388
- int error;
389
- int blkcount = 0;
390
+ int error, readop, cdb_len;
391
+ uint32_t blkcount;
392
393
if ((cm = mfi_dequeue_free(sc)) == NULL)
394
return (EBUSY);
395
@@ -2467,14 +2563,10 @@ mfi_dump_syspd_blocks(struct mfi_softc *sc, int id
396
pass = &cm->cm_frame->pass;
397
bzero(pass->cdb, 16);
398
pass->header.cmd = MFI_CMD_PD_SCSI_IO;
399
- pass->cdb[0] = SCSI_WRITE;
400
- pass->cdb[2] = (lba & 0xff000000) >> 24;
401
- pass->cdb[3] = (lba & 0x00ff0000) >> 16;
402
- pass->cdb[4] = (lba & 0x0000ff00) >> 8;
403
- pass->cdb[5] = (lba & 0x000000ff);
404
+
405
+ readop = 0;
406
blkcount = (len + MFI_SECTOR_LEN - 1) / MFI_SECTOR_LEN;
407
- pass->cdb[7] = (blkcount & 0xff00) >> 8;
408
- pass->cdb[8] = (blkcount & 0x00ff);
409
+ cdb_len = mfi_build_cdb(readop, 0, lba, blkcount, pass->cdb);
410
pass->header.target_id = id;
411
pass->header.timeout = 0;
412
pass->header.flags = 0;
413
@@ -2481,7 +2573,7 @@ mfi_dump_syspd_blocks(struct mfi_softc *sc, int id
414
pass->header.scsi_status = 0;
415
pass->header.sense_len = MFI_SENSE_LEN;
416
pass->header.data_len = len;
417
- pass->header.cdb_len = 10;
418
+ pass->header.cdb_len = cdb_len;
419
pass->sense_addr_lo = (uint32_t)cm->cm_sense_busaddr;
420
pass->sense_addr_hi = (uint32_t)((uint64_t)cm->cm_sense_busaddr >> 32);
421
cm->cm_data = virt;
422
@@ -2488,7 +2580,7 @@ mfi_dump_syspd_blocks(struct mfi_softc *sc, int id
423
cm->cm_len = len;
424
cm->cm_sg = &pass->sgl;
425
cm->cm_total_frame_size = MFI_PASS_FRAME_SIZE;
426
- cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT;
427
+ cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT | MFI_CMD_SCSI;
428
429
error = mfi_mapcmd(sc, cm);
430
bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
431
@@ -2687,16 +2779,24 @@ mfi_check_command_post(struct mfi_softc *sc, struc
432
}
433
}
434
435
-static int mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm)
436
+static int
437
+mfi_check_for_sscd(struct mfi_softc *sc, struct mfi_command *cm)
438
{
439
- struct mfi_config_data *conf_data=(struct mfi_config_data *)cm->cm_data;
440
+ struct mfi_config_data *conf_data;
441
struct mfi_command *ld_cm = NULL;
442
struct mfi_ld_info *ld_info = NULL;
443
+ struct mfi_ld_config *ld;
444
+ char *p;
445
int error = 0;
446
447
- if ((cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) &&
448
- (conf_data->ld[0].params.isSSCD == 1)) {
449
- error = 1;
450
+ conf_data = (struct mfi_config_data *)cm->cm_data;
451
+
452
+ if (cm->cm_frame->dcmd.opcode == MFI_DCMD_CFG_ADD) {
453
+ p = (char *)conf_data->array;
454
+ p += conf_data->array_size * conf_data->array_count;
455
+ ld = (struct mfi_ld_config *)p;
456
+ if (ld->params.isSSCD == 1)
457
+ error = 1;
458
} else if (cm->cm_frame->dcmd.opcode == MFI_DCMD_LD_DELETE) {
459
error = mfi_dcmd_command (sc, &ld_cm, MFI_DCMD_LD_GET_INFO,
460
(void **)&ld_info, sizeof(*ld_info));
461
Index: sys/dev/mfi/mfi_cam.c
462
===================================================================
463
--- sys/dev/mfi/mfi_cam.c (revision 254079)
464
+++ sys/dev/mfi/mfi_cam.c (working copy)
465
@@ -79,6 +79,11 @@ static void mfip_cam_poll(struct cam_sim *);
466
static struct mfi_command * mfip_start(void *);
467
static void mfip_done(struct mfi_command *cm);
468
469
+static int mfi_allow_disks = 0;
470
+TUNABLE_INT("hw.mfi.allow_cam_disk_passthrough", &mfi_allow_disks);
471
+SYSCTL_INT(_hw_mfi, OID_AUTO, allow_cam_disk_passthrough, CTLFLAG_RD,
472
+ &mfi_allow_disks, 0, "event message locale");
473
+
474
static devclass_t mfip_devclass;
475
static device_method_t mfip_methods[] = {
476
DEVMETHOD(device_probe, mfip_probe),
477
@@ -349,7 +354,8 @@ mfip_done(struct mfi_command *cm)
478
command = csio->cdb_io.cdb_bytes[0];
479
if (command == INQUIRY) {
480
device = csio->data_ptr[0] & 0x1f;
481
- if ((device == T_DIRECT) || (device == T_PROCESSOR))
482
+ if ((!mfi_allow_disks && device == T_DIRECT) ||
483
+ (device == T_PROCESSOR))
484
csio->data_ptr[0] =
485
(csio->data_ptr[0] & 0xe0) | T_NODEVICE;
486
}
487
@@ -392,6 +398,9 @@ mfip_done(struct mfi_command *cm)
488
static void
489
mfip_cam_poll(struct cam_sim *sim)
490
{
491
- return;
492
+ struct mfip_softc *sc = cam_sim_softc(sim);
493
+ struct mfi_softc *mfisc = sc->mfi_sc;
494
+
495
+ mfisc->mfi_intr_ptr(mfisc);
496
}
497
498
Index: sys/dev/mfi/mfi_disk.c
499
===================================================================
500
--- sys/dev/mfi/mfi_disk.c (revision 254079)
501
+++ sys/dev/mfi/mfi_disk.c (working copy)
502
@@ -93,6 +93,7 @@ mfi_disk_attach(device_t dev)
503
{
504
struct mfi_disk *sc;
505
struct mfi_ld_info *ld_info;
506
+ struct mfi_disk_pending *ld_pend;
507
uint64_t sectors;
508
uint32_t secsize;
509
char *state;
510
@@ -111,6 +112,13 @@ mfi_disk_attach(device_t dev)
511
secsize = MFI_SECTOR_LEN;
512
mtx_lock(&sc->ld_controller->mfi_io_lock);
513
TAILQ_INSERT_TAIL(&sc->ld_controller->mfi_ld_tqh, sc, ld_link);
514
+ TAILQ_FOREACH(ld_pend, &sc->ld_controller->mfi_ld_pend_tqh,
515
+ ld_link) {
516
+ TAILQ_REMOVE(&sc->ld_controller->mfi_ld_pend_tqh,
517
+ ld_pend, ld_link);
518
+ free(ld_pend, M_MFIBUF);
519
+ break;
520
+ }
521
mtx_unlock(&sc->ld_controller->mfi_io_lock);
522
523
switch (ld_info->ld_config.params.state) {
524
@@ -131,16 +139,16 @@ mfi_disk_attach(device_t dev)
525
break;
526
}
527
528
- if ( strlen(ld_info->ld_config.properties.name) == 0 ) {
529
- device_printf(dev,
530
- "%juMB (%ju sectors) RAID volume (no label) is %s\n",
531
- sectors / (1024 * 1024 / secsize), sectors, state);
532
- } else {
533
- device_printf(dev,
534
- "%juMB (%ju sectors) RAID volume '%s' is %s\n",
535
- sectors / (1024 * 1024 / secsize), sectors,
536
- ld_info->ld_config.properties.name, state);
537
- }
538
+ if ( strlen(ld_info->ld_config.properties.name) == 0 ) {
539
+ device_printf(dev,
540
+ "%juMB (%ju sectors) RAID volume (no label) is %s\n",
541
+ sectors / (1024 * 1024 / secsize), sectors, state);
542
+ } else {
543
+ device_printf(dev,
544
+ "%juMB (%ju sectors) RAID volume '%s' is %s\n",
545
+ sectors / (1024 * 1024 / secsize), sectors,
546
+ ld_info->ld_config.properties.name, state);
547
+ }
548
549
sc->ld_disk = disk_alloc();
550
sc->ld_disk->d_drv1 = sc;
551
Index: sys/dev/mfi/mfi_syspd.c
552
===================================================================
553
--- sys/dev/mfi/mfi_syspd.c (revision 254079)
554
+++ sys/dev/mfi/mfi_syspd.c (working copy)
555
@@ -89,7 +89,6 @@ DRIVER_MODULE(mfisyspd, mfi, mfi_syspd_driver, mfi
556
static int
557
mfi_syspd_probe(device_t dev)
558
{
559
-
560
return (0);
561
}
562
563
@@ -98,12 +97,12 @@ mfi_syspd_attach(device_t dev)
564
{
565
struct mfi_system_pd *sc;
566
struct mfi_pd_info *pd_info;
567
+ struct mfi_system_pending *syspd_pend;
568
uint64_t sectors;
569
uint32_t secsize;
570
571
sc = device_get_softc(dev);
572
pd_info = device_get_ivars(dev);
573
-
574
sc->pd_dev = dev;
575
sc->pd_id = pd_info->ref.v.device_id;
576
sc->pd_unit = device_get_unit(dev);
577
@@ -115,6 +114,13 @@ mfi_syspd_attach(device_t dev)
578
secsize = MFI_SECTOR_LEN;
579
mtx_lock(&sc->pd_controller->mfi_io_lock);
580
TAILQ_INSERT_TAIL(&sc->pd_controller->mfi_syspd_tqh, sc, pd_link);
581
+ TAILQ_FOREACH(syspd_pend, &sc->pd_controller->mfi_syspd_pend_tqh,
582
+ pd_link) {
583
+ TAILQ_REMOVE(&sc->pd_controller->mfi_syspd_pend_tqh,
584
+ syspd_pend, pd_link);
585
+ free(syspd_pend, M_MFIBUF);
586
+ break;
587
+ }
588
mtx_unlock(&sc->pd_controller->mfi_io_lock);
589
device_printf(dev, "%juMB (%ju sectors) SYSPD volume\n",
590
sectors / (1024 * 1024 / secsize), sectors);
591
@@ -139,6 +145,7 @@ mfi_syspd_attach(device_t dev)
592
disk_create(sc->pd_disk, DISK_VERSION);
593
594
device_printf(dev, " SYSPD volume attached\n");
595
+
596
return (0);
597
}
598
599
Index: sys/dev/mfi/mfi_tbolt.c
600
===================================================================
601
--- sys/dev/mfi/mfi_tbolt.c (revision 254079)
602
+++ sys/dev/mfi/mfi_tbolt.c (working copy)
603
@@ -69,13 +69,10 @@ uint8_t
604
mfi_build_mpt_pass_thru(struct mfi_softc *sc, struct mfi_command *mfi_cmd);
605
union mfi_mpi2_request_descriptor *mfi_build_and_issue_cmd(struct mfi_softc
606
*sc, struct mfi_command *mfi_cmd);
607
-int mfi_tbolt_is_ldio(struct mfi_command *mfi_cmd);
608
void mfi_tbolt_build_ldio(struct mfi_softc *sc, struct mfi_command *mfi_cmd,
609
struct mfi_cmd_tbolt *cmd);
610
static int mfi_tbolt_make_sgl(struct mfi_softc *sc, struct mfi_command
611
*mfi_cmd, pMpi25IeeeSgeChain64_t sgl_ptr, struct mfi_cmd_tbolt *cmd);
612
-static int mfi_tbolt_build_cdb(struct mfi_softc *sc, struct mfi_command
613
- *mfi_cmd, uint8_t *cdb);
614
void
615
map_tbolt_cmd_status(struct mfi_command *mfi_cmd, uint8_t status,
616
uint8_t ext_status);
617
@@ -502,6 +499,7 @@ mfi_tbolt_alloc_cmd(struct mfi_softc *sc)
618
+ i * MEGASAS_MAX_SZ_CHAIN_FRAME);
619
cmd->sg_frame_phys_addr = sc->sg_frame_busaddr + i
620
* MEGASAS_MAX_SZ_CHAIN_FRAME;
621
+ cmd->sync_cmd_idx = sc->mfi_max_fw_cmds;
622
623
TAILQ_INSERT_TAIL(&(sc->mfi_cmd_tbolt_tqh), cmd, next);
624
}
625
@@ -574,11 +572,11 @@ void
626
map_tbolt_cmd_status(struct mfi_command *mfi_cmd, uint8_t status,
627
uint8_t ext_status)
628
{
629
-
630
switch (status) {
631
case MFI_STAT_OK:
632
- mfi_cmd->cm_frame->header.cmd_status = 0;
633
- mfi_cmd->cm_frame->dcmd.header.cmd_status = 0;
634
+ mfi_cmd->cm_frame->header.cmd_status = MFI_STAT_OK;
635
+ mfi_cmd->cm_frame->dcmd.header.cmd_status = MFI_STAT_OK;
636
+ mfi_cmd->cm_error = MFI_STAT_OK;
637
break;
638
639
case MFI_STAT_SCSI_IO_FAILED:
640
@@ -618,6 +616,7 @@ mfi_tbolt_return_cmd(struct mfi_softc *sc, struct
641
{
642
mtx_assert(&sc->mfi_io_lock, MA_OWNED);
643
644
+ cmd->sync_cmd_idx = sc->mfi_max_fw_cmds;
645
TAILQ_INSERT_TAIL(&sc->mfi_cmd_tbolt_tqh, cmd, next);
646
}
647
648
@@ -667,16 +666,26 @@ mfi_tbolt_complete_cmd(struct mfi_softc *sc)
649
extStatus = cmd_mfi->cm_frame->dcmd.header.scsi_status;
650
map_tbolt_cmd_status(cmd_mfi, status, extStatus);
651
652
- /* remove command from busy queue if not polled */
653
- TAILQ_FOREACH(cmd_mfi_check, &sc->mfi_busy, cm_link) {
654
- if (cmd_mfi_check == cmd_mfi) {
655
- mfi_remove_busy(cmd_mfi);
656
- break;
657
+ if (cmd_mfi->cm_flags & MFI_CMD_SCSI &&
658
+ (cmd_mfi->cm_flags & MFI_CMD_POLLED) != 0) {
659
+ /* polled LD/SYSPD IO command */
660
+ mfi_tbolt_return_cmd(sc, cmd_tbolt);
661
+ /* XXX mark okay for now DJA */
662
+ cmd_mfi->cm_frame->header.cmd_status = MFI_STAT_OK;
663
+ } else {
664
+
665
+ /* remove command from busy queue if not polled */
666
+ TAILQ_FOREACH(cmd_mfi_check, &sc->mfi_busy, cm_link) {
667
+ if (cmd_mfi_check == cmd_mfi) {
668
+ mfi_remove_busy(cmd_mfi);
669
+ break;
670
+ }
671
}
672
+
673
+ /* complete the command */
674
+ mfi_complete(sc, cmd_mfi);
675
+ mfi_tbolt_return_cmd(sc, cmd_tbolt);
676
}
677
- cmd_mfi->cm_error = 0;
678
- mfi_complete(sc, cmd_mfi);
679
- mfi_tbolt_return_cmd(sc, cmd_tbolt);
680
681
sc->last_reply_idx++;
682
if (sc->last_reply_idx >= sc->mfi_max_fw_cmds) {
683
@@ -811,13 +820,13 @@ mfi_tbolt_build_ldio(struct mfi_softc *sc, struct
684
MFI_FRAME_DIR_READ)
685
io_info.isRead = 1;
686
687
- io_request->RaidContext.timeoutValue
688
- = MFI_FUSION_FP_DEFAULT_TIMEOUT;
689
- io_request->Function = MPI2_FUNCTION_LD_IO_REQUEST;
690
- io_request->DevHandle = device_id;
691
- cmd->request_desc->header.RequestFlags
692
- = (MFI_REQ_DESCRIPT_FLAGS_LD_IO
693
- << MFI_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
694
+ io_request->RaidContext.timeoutValue
695
+ = MFI_FUSION_FP_DEFAULT_TIMEOUT;
696
+ io_request->Function = MPI2_FUNCTION_LD_IO_REQUEST;
697
+ io_request->DevHandle = device_id;
698
+ cmd->request_desc->header.RequestFlags
699
+ = (MFI_REQ_DESCRIPT_FLAGS_LD_IO
700
+ << MFI_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
701
if ((io_request->IoFlags == 6) && (io_info.numBlocks == 0))
702
io_request->RaidContext.RegLockLength = 0x100;
703
io_request->DataLength = mfi_cmd->cm_frame->io.header.data_len
704
@@ -825,41 +834,37 @@ mfi_tbolt_build_ldio(struct mfi_softc *sc, struct
705
}
706
707
int
708
-mfi_tbolt_is_ldio(struct mfi_command *mfi_cmd)
709
-{
710
- if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_READ
711
- || mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
712
- return 1;
713
- else
714
- return 0;
715
-}
716
-
717
-int
718
mfi_tbolt_build_io(struct mfi_softc *sc, struct mfi_command *mfi_cmd,
719
struct mfi_cmd_tbolt *cmd)
720
{
721
- uint32_t device_id;
722
+ struct mfi_mpi2_request_raid_scsi_io *io_request;
723
uint32_t sge_count;
724
- uint8_t cdb[32], cdb_len;
725
+ uint8_t cdb_len;
726
+ int readop;
727
+ u_int64_t lba;
728
729
- memset(cdb, 0, 32);
730
- struct mfi_mpi2_request_raid_scsi_io *io_request = cmd->io_request;
731
+ io_request = cmd->io_request;
732
+ if (!(mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_READ
733
+ || mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE))
734
+ return 1;
735
736
- device_id = mfi_cmd->cm_frame->header.target_id;
737
+ mfi_tbolt_build_ldio(sc, mfi_cmd, cmd);
738
739
- /* Have to build CDB here for TB as BSD don't have a scsi layer */
740
- if ((cdb_len = mfi_tbolt_build_cdb(sc, mfi_cmd, cdb)) == 1)
741
- return 1;
742
+ /* Convert to SCSI command CDB */
743
+ bzero(io_request->CDB.CDB32, sizeof(io_request->CDB.CDB32));
744
+ if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
745
+ readop = 0;
746
+ else
747
+ readop = 1;
748
749
- /* Just the CDB length,rest of the Flags are zero */
750
+ lba = mfi_cmd->cm_frame->io.lba_hi;
751
+ lba = (lba << 32) + mfi_cmd->cm_frame->io.lba_lo;
752
+ cdb_len = mfi_build_cdb(readop, 0, lba,
753
+ mfi_cmd->cm_frame->io.header.data_len, io_request->CDB.CDB32);
754
+
755
+ /* Just the CDB length, rest of the Flags are zero */
756
io_request->IoFlags = cdb_len;
757
- memcpy(io_request->CDB.CDB32, cdb, 32);
758
759
- if (mfi_tbolt_is_ldio(mfi_cmd))
760
- mfi_tbolt_build_ldio(sc, mfi_cmd , cmd);
761
- else
762
- return 1;
763
-
764
/*
765
* Construct SGL
766
*/
767
@@ -883,85 +888,13 @@ mfi_tbolt_build_io(struct mfi_softc *sc, struct mf
768
769
io_request->SenseBufferLowAddress = mfi_cmd->cm_sense_busaddr;
770
io_request->SenseBufferLength = MFI_SENSE_LEN;
771
+ io_request->RaidContext.Status = MFI_STAT_INVALID_STATUS;
772
+ io_request->RaidContext.exStatus = MFI_STAT_INVALID_STATUS;
773
+
774
return 0;
775
}
776
777
-static int
778
-mfi_tbolt_build_cdb(struct mfi_softc *sc, struct mfi_command *mfi_cmd,
779
- uint8_t *cdb)
780
-{
781
- uint32_t lba_lo, lba_hi, num_lba;
782
- uint8_t cdb_len;
783
784
- if (mfi_cmd == NULL || cdb == NULL)
785
- return 1;
786
- num_lba = mfi_cmd->cm_frame->io.header.data_len;
787
- lba_lo = mfi_cmd->cm_frame->io.lba_lo;
788
- lba_hi = mfi_cmd->cm_frame->io.lba_hi;
789
-
790
- if (lba_hi == 0 && (num_lba <= 0xFF) && (lba_lo <= 0x1FFFFF)) {
791
- if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
792
- /* Read 6 or Write 6 */
793
- cdb[0] = (uint8_t) (0x0A);
794
- else
795
- cdb[0] = (uint8_t) (0x08);
796
-
797
- cdb[4] = (uint8_t) num_lba;
798
- cdb[3] = (uint8_t) (lba_lo & 0xFF);
799
- cdb[2] = (uint8_t) (lba_lo >> 8);
800
- cdb[1] = (uint8_t) ((lba_lo >> 16) & 0x1F);
801
- cdb_len = 6;
802
- }
803
- else if (lba_hi == 0 && (num_lba <= 0xFFFF) && (lba_lo <= 0xFFFFFFFF)) {
804
- if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
805
- /* Read 10 or Write 10 */
806
- cdb[0] = (uint8_t) (0x2A);
807
- else
808
- cdb[0] = (uint8_t) (0x28);
809
- cdb[8] = (uint8_t) (num_lba & 0xFF);
810
- cdb[7] = (uint8_t) (num_lba >> 8);
811
- cdb[5] = (uint8_t) (lba_lo & 0xFF);
812
- cdb[4] = (uint8_t) (lba_lo >> 8);
813
- cdb[3] = (uint8_t) (lba_lo >> 16);
814
- cdb[2] = (uint8_t) (lba_lo >> 24);
815
- cdb_len = 10;
816
- } else if ((num_lba > 0xFFFF) && (lba_hi == 0)) {
817
- if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
818
- /* Read 12 or Write 12 */
819
- cdb[0] = (uint8_t) (0xAA);
820
- else
821
- cdb[0] = (uint8_t) (0xA8);
822
- cdb[9] = (uint8_t) (num_lba & 0xFF);
823
- cdb[8] = (uint8_t) (num_lba >> 8);
824
- cdb[7] = (uint8_t) (num_lba >> 16);
825
- cdb[6] = (uint8_t) (num_lba >> 24);
826
- cdb[5] = (uint8_t) (lba_lo & 0xFF);
827
- cdb[4] = (uint8_t) (lba_lo >> 8);
828
- cdb[3] = (uint8_t) (lba_lo >> 16);
829
- cdb[2] = (uint8_t) (lba_lo >> 24);
830
- cdb_len = 12;
831
- } else {
832
- if (mfi_cmd->cm_frame->header.cmd == MFI_CMD_LD_WRITE)
833
- cdb[0] = (uint8_t) (0x8A);
834
- else
835
- cdb[0] = (uint8_t) (0x88);
836
- cdb[13] = (uint8_t) (num_lba & 0xFF);
837
- cdb[12] = (uint8_t) (num_lba >> 8);
838
- cdb[11] = (uint8_t) (num_lba >> 16);
839
- cdb[10] = (uint8_t) (num_lba >> 24);
840
- cdb[9] = (uint8_t) (lba_lo & 0xFF);
841
- cdb[8] = (uint8_t) (lba_lo >> 8);
842
- cdb[7] = (uint8_t) (lba_lo >> 16);
843
- cdb[6] = (uint8_t) (lba_lo >> 24);
844
- cdb[5] = (uint8_t) (lba_hi & 0xFF);
845
- cdb[4] = (uint8_t) (lba_hi >> 8);
846
- cdb[3] = (uint8_t) (lba_hi >> 16);
847
- cdb[2] = (uint8_t) (lba_hi >> 24);
848
- cdb_len = 16;
849
- }
850
- return cdb_len;
851
-}
852
-
853
static int
854
mfi_tbolt_make_sgl(struct mfi_softc *sc, struct mfi_command *mfi_cmd,
855
pMpi25IeeeSgeChain64_t sgl_ptr, struct mfi_cmd_tbolt *cmd)
856
@@ -1100,8 +1033,7 @@ mfi_tbolt_send_frame(struct mfi_softc *sc, struct
857
if ((cm->cm_flags & MFI_CMD_POLLED) == 0) {
858
cm->cm_timestamp = time_uptime;
859
mfi_enqueue_busy(cm);
860
- }
861
- else { /* still get interrupts for it */
862
+ } else { /* still get interrupts for it */
863
hdr->cmd_status = MFI_STAT_INVALID_STATUS;
864
hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
865
}
866
@@ -1118,19 +1050,28 @@ mfi_tbolt_send_frame(struct mfi_softc *sc, struct
867
}
868
else
869
device_printf(sc->mfi_dev, "DJA NA XXX SYSPDIO\n");
870
- }
871
- else if (hdr->cmd == MFI_CMD_LD_SCSI_IO ||
872
+ } else if (hdr->cmd == MFI_CMD_LD_SCSI_IO ||
873
hdr->cmd == MFI_CMD_LD_READ || hdr->cmd == MFI_CMD_LD_WRITE) {
874
+ cm->cm_flags |= MFI_CMD_SCSI;
875
if ((req_desc = mfi_build_and_issue_cmd(sc, cm)) == NULL) {
876
device_printf(sc->mfi_dev, "LDIO Failed \n");
877
return 1;
878
}
879
- } else
880
- if ((req_desc = mfi_tbolt_build_mpt_cmd(sc, cm)) == NULL) {
881
+ } else if ((req_desc = mfi_tbolt_build_mpt_cmd(sc, cm)) == NULL) {
882
device_printf(sc->mfi_dev, "Mapping from MFI to MPT "
883
"Failed\n");
884
return 1;
885
- }
886
+ }
887
+
888
+ if (cm->cm_flags & MFI_CMD_SCSI) {
889
+ /*
890
+ * LD IO needs to be posted since it doesn't get
891
+ * acknowledged via a status update so have the
892
+ * controller reply via mfi_tbolt_complete_cmd.
893
+ */
894
+ hdr->flags &= ~MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
895
+ }
896
+
897
MFI_WRITE4(sc, MFI_ILQP, (req_desc->words & 0xFFFFFFFF));
898
MFI_WRITE4(sc, MFI_IHQP, (req_desc->words >>0x20));
899
900
@@ -1137,12 +1078,21 @@ mfi_tbolt_send_frame(struct mfi_softc *sc, struct
901
if ((cm->cm_flags & MFI_CMD_POLLED) == 0)
902
return 0;
903
904
+ if (cm->cm_flags & MFI_CMD_SCSI) {
905
+ /* check reply queue */
906
+ mfi_tbolt_complete_cmd(sc);
907
+ }
908
+
909
/* This is a polled command, so busy-wait for it to complete. */
910
while (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
911
DELAY(1000);
912
tm -= 1;
913
if (tm <= 0)
914
- break;
915
+ break;
916
+ if (cm->cm_flags & MFI_CMD_SCSI) {
917
+ /* check reply queue */
918
+ mfi_tbolt_complete_cmd(sc);
919
+ }
920
}
921
922
if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
923
@@ -1375,7 +1325,7 @@ mfi_tbolt_sync_map_info(struct mfi_softc *sc)
924
free(ld_sync, M_MFIBUF);
925
goto out;
926
}
927
-
928
+
929
context = cmd->cm_frame->header.context;
930
bzero(cmd->cm_frame, sizeof(union mfi_frame));
931
cmd->cm_frame->header.context = context;
932
Index: sys/dev/mfi/mfivar.h
933
===================================================================
934
--- sys/dev/mfi/mfivar.h (revision 254079)
935
+++ sys/dev/mfi/mfivar.h (working copy)
936
@@ -105,6 +105,7 @@ struct mfi_command {
937
#define MFI_ON_MFIQ_READY (1<<6)
938
#define MFI_ON_MFIQ_BUSY (1<<7)
939
#define MFI_ON_MFIQ_MASK ((1<<5)|(1<<6)|(1<<7))
940
+#define MFI_CMD_SCSI (1<<8)
941
uint8_t retry_for_fw_reset;
942
void (* cm_complete)(struct mfi_command *cm);
943
void *cm_private;
944
@@ -125,6 +126,11 @@ struct mfi_disk {
945
#define MFI_DISK_FLAGS_DISABLED 0x02
946
};
947
948
+struct mfi_disk_pending {
949
+ TAILQ_ENTRY(mfi_disk_pending) ld_link;
950
+ int ld_id;
951
+};
952
+
953
struct mfi_system_pd {
954
TAILQ_ENTRY(mfi_system_pd) pd_link;
955
device_t pd_dev;
956
@@ -136,6 +142,11 @@ struct mfi_system_pd {
957
int pd_flags;
958
};
959
960
+struct mfi_system_pending {
961
+ TAILQ_ENTRY(mfi_system_pending) pd_link;
962
+ int pd_id;
963
+};
964
+
965
struct mfi_evt_queue_elm {
966
TAILQ_ENTRY(mfi_evt_queue_elm) link;
967
struct mfi_evt_detail detail;
968
@@ -284,6 +295,8 @@ struct mfi_softc {
969
970
TAILQ_HEAD(,mfi_disk) mfi_ld_tqh;
971
TAILQ_HEAD(,mfi_system_pd) mfi_syspd_tqh;
972
+ TAILQ_HEAD(,mfi_disk_pending) mfi_ld_pend_tqh;
973
+ TAILQ_HEAD(,mfi_system_pending) mfi_syspd_pend_tqh;
974
eventhandler_tag mfi_eh;
975
struct cdev *mfi_cdev;
976
977
@@ -302,6 +315,7 @@ struct mfi_softc {
978
uint32_t frame_cnt);
979
int (*mfi_adp_reset)(struct mfi_softc *sc);
980
int (*mfi_adp_check_reset)(struct mfi_softc *sc);
981
+ void (*mfi_intr_ptr)(void *sc);
982
983
/* ThunderBolt */
984
uint32_t mfi_tbolt;
985
@@ -420,7 +434,8 @@ extern int mfi_tbolt_reset(struct mfi_softc *sc);
986
extern void mfi_tbolt_sync_map_info(struct mfi_softc *sc);
987
extern void mfi_handle_map_sync(void *context, int pending);
988
extern int mfi_dcmd_command(struct mfi_softc *, struct mfi_command **,
989
- uint32_t, void **, size_t);
990
+ uint32_t, void **, size_t);
991
+extern int mfi_build_cdb(int, uint8_t, u_int64_t, u_int32_t, uint8_t *);
992
993
#define MFIQ_ADD(sc, qname) \
994
do { \
995
996