]> Git Repo - qemu.git/blob - hw/scsi-bus.c
scsi-disk: enable scatter/gather functionality
[qemu.git] / hw / scsi-bus.c
1 #include "hw.h"
2 #include "qemu-error.h"
3 #include "scsi.h"
4 #include "scsi-defs.h"
5 #include "qdev.h"
6 #include "blockdev.h"
7 #include "trace.h"
8 #include "dma.h"
9
10 static char *scsibus_get_fw_dev_path(DeviceState *dev);
11 static int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf);
12 static void scsi_req_dequeue(SCSIRequest *req);
13
14 static struct BusInfo scsi_bus_info = {
15     .name  = "SCSI",
16     .size  = sizeof(SCSIBus),
17     .get_fw_dev_path = scsibus_get_fw_dev_path,
18     .props = (Property[]) {
19         DEFINE_PROP_UINT32("channel", SCSIDevice, channel, 0),
20         DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
21         DEFINE_PROP_UINT32("lun", SCSIDevice, lun, -1),
22         DEFINE_PROP_END_OF_LIST(),
23     },
24 };
25 static int next_scsi_bus;
26
27 static int scsi_device_init(SCSIDevice *s)
28 {
29     SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
30     if (sc->init) {
31         return sc->init(s);
32     }
33     return 0;
34 }
35
36 static void scsi_device_destroy(SCSIDevice *s)
37 {
38     SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
39     if (sc->destroy) {
40         sc->destroy(s);
41     }
42 }
43
44 static SCSIRequest *scsi_device_alloc_req(SCSIDevice *s, uint32_t tag, uint32_t lun,
45                                           uint8_t *buf, void *hba_private)
46 {
47     SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
48     if (sc->alloc_req) {
49         return sc->alloc_req(s, tag, lun, buf, hba_private);
50     }
51
52     return NULL;
53 }
54
55 static void scsi_device_unit_attention_reported(SCSIDevice *s)
56 {
57     SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
58     if (sc->unit_attention_reported) {
59         sc->unit_attention_reported(s);
60     }
61 }
62
63 /* Create a scsi bus, and attach devices to it.  */
64 void scsi_bus_new(SCSIBus *bus, DeviceState *host, const SCSIBusInfo *info)
65 {
66     qbus_create_inplace(&bus->qbus, &scsi_bus_info, host, NULL);
67     bus->busnr = next_scsi_bus++;
68     bus->info = info;
69     bus->qbus.allow_hotplug = 1;
70 }
71
72 static void scsi_dma_restart_bh(void *opaque)
73 {
74     SCSIDevice *s = opaque;
75     SCSIRequest *req, *next;
76
77     qemu_bh_delete(s->bh);
78     s->bh = NULL;
79
80     QTAILQ_FOREACH_SAFE(req, &s->requests, next, next) {
81         scsi_req_ref(req);
82         if (req->retry) {
83             req->retry = false;
84             switch (req->cmd.mode) {
85             case SCSI_XFER_FROM_DEV:
86             case SCSI_XFER_TO_DEV:
87                 scsi_req_continue(req);
88                 break;
89             case SCSI_XFER_NONE:
90                 assert(!req->sg);
91                 scsi_req_dequeue(req);
92                 scsi_req_enqueue(req);
93                 break;
94             }
95         }
96         scsi_req_unref(req);
97     }
98 }
99
100 void scsi_req_retry(SCSIRequest *req)
101 {
102     /* No need to save a reference, because scsi_dma_restart_bh just
103      * looks at the request list.  */
104     req->retry = true;
105 }
106
107 static void scsi_dma_restart_cb(void *opaque, int running, RunState state)
108 {
109     SCSIDevice *s = opaque;
110
111     if (!running) {
112         return;
113     }
114     if (!s->bh) {
115         s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
116         qemu_bh_schedule(s->bh);
117     }
118 }
119
120 static int scsi_qdev_init(DeviceState *qdev)
121 {
122     SCSIDevice *dev = SCSI_DEVICE(qdev);
123     SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus);
124     SCSIDevice *d;
125     int rc = -1;
126
127     if (dev->channel > bus->info->max_channel) {
128         error_report("bad scsi channel id: %d", dev->channel);
129         goto err;
130     }
131     if (dev->id != -1 && dev->id > bus->info->max_target) {
132         error_report("bad scsi device id: %d", dev->id);
133         goto err;
134     }
135
136     if (dev->id == -1) {
137         int id = -1;
138         if (dev->lun == -1) {
139             dev->lun = 0;
140         }
141         do {
142             d = scsi_device_find(bus, dev->channel, ++id, dev->lun);
143         } while (d && d->lun == dev->lun && id <= bus->info->max_target);
144         if (id > bus->info->max_target) {
145             error_report("no free target");
146             goto err;
147         }
148         dev->id = id;
149     } else if (dev->lun == -1) {
150         int lun = -1;
151         do {
152             d = scsi_device_find(bus, dev->channel, dev->id, ++lun);
153         } while (d && d->lun == lun && lun < bus->info->max_lun);
154         if (lun > bus->info->max_lun) {
155             error_report("no free lun");
156             goto err;
157         }
158         dev->lun = lun;
159     } else {
160         d = scsi_device_find(bus, dev->channel, dev->id, dev->lun);
161         if (dev->lun == d->lun && dev != d) {
162             qdev_free(&d->qdev);
163         }
164     }
165
166     QTAILQ_INIT(&dev->requests);
167     rc = scsi_device_init(dev);
168     if (rc == 0) {
169         dev->vmsentry = qemu_add_vm_change_state_handler(scsi_dma_restart_cb,
170                                                          dev);
171     }
172
173 err:
174     return rc;
175 }
176
177 static int scsi_qdev_exit(DeviceState *qdev)
178 {
179     SCSIDevice *dev = SCSI_DEVICE(qdev);
180
181     if (dev->vmsentry) {
182         qemu_del_vm_change_state_handler(dev->vmsentry);
183     }
184     scsi_device_destroy(dev);
185     return 0;
186 }
187
188 /* handle legacy '-drive if=scsi,...' cmd line args */
189 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
190                                       int unit, bool removable, int bootindex)
191 {
192     const char *driver;
193     DeviceState *dev;
194
195     driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk";
196     dev = qdev_create(&bus->qbus, driver);
197     qdev_prop_set_uint32(dev, "scsi-id", unit);
198     if (bootindex >= 0) {
199         qdev_prop_set_int32(dev, "bootindex", bootindex);
200     }
201     if (qdev_prop_exists(dev, "removable")) {
202         qdev_prop_set_bit(dev, "removable", removable);
203     }
204     if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
205         qdev_free(dev);
206         return NULL;
207     }
208     if (qdev_init(dev) < 0)
209         return NULL;
210     return SCSI_DEVICE(dev);
211 }
212
213 int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
214 {
215     Location loc;
216     DriveInfo *dinfo;
217     int res = 0, unit;
218
219     loc_push_none(&loc);
220     for (unit = 0; unit < bus->info->max_target; unit++) {
221         dinfo = drive_get(IF_SCSI, bus->busnr, unit);
222         if (dinfo == NULL) {
223             continue;
224         }
225         qemu_opts_loc_restore(dinfo->opts);
226         if (!scsi_bus_legacy_add_drive(bus, dinfo->bdrv, unit, false, -1)) {
227             res = -1;
228             break;
229         }
230     }
231     loc_pop(&loc);
232     return res;
233 }
234
235 /* SCSIReqOps implementation for invalid commands.  */
236
237 static int32_t scsi_invalid_command(SCSIRequest *req, uint8_t *buf)
238 {
239     scsi_req_build_sense(req, SENSE_CODE(INVALID_OPCODE));
240     scsi_req_complete(req, CHECK_CONDITION);
241     return 0;
242 }
243
244 static const struct SCSIReqOps reqops_invalid_opcode = {
245     .size         = sizeof(SCSIRequest),
246     .send_command = scsi_invalid_command
247 };
248
249 /* SCSIReqOps implementation for unit attention conditions.  */
250
251 static int32_t scsi_unit_attention(SCSIRequest *req, uint8_t *buf)
252 {
253     if (req->dev && req->dev->unit_attention.key == UNIT_ATTENTION) {
254         scsi_req_build_sense(req, req->dev->unit_attention);
255     } else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
256         scsi_req_build_sense(req, req->bus->unit_attention);
257     }
258     scsi_req_complete(req, CHECK_CONDITION);
259     return 0;
260 }
261
262 static const struct SCSIReqOps reqops_unit_attention = {
263     .size         = sizeof(SCSIRequest),
264     .send_command = scsi_unit_attention
265 };
266
267 /* SCSIReqOps implementation for REPORT LUNS and for commands sent to
268    an invalid LUN.  */
269
270 typedef struct SCSITargetReq SCSITargetReq;
271
272 struct SCSITargetReq {
273     SCSIRequest req;
274     int len;
275     uint8_t buf[2056];
276 };
277
278 static void store_lun(uint8_t *outbuf, int lun)
279 {
280     if (lun < 256) {
281         outbuf[1] = lun;
282         return;
283     }
284     outbuf[1] = (lun & 255);
285     outbuf[0] = (lun >> 8) | 0x40;
286 }
287
288 static bool scsi_target_emulate_report_luns(SCSITargetReq *r)
289 {
290     DeviceState *qdev;
291     int i, len, n;
292     int channel, id;
293     bool found_lun0;
294
295     if (r->req.cmd.xfer < 16) {
296         return false;
297     }
298     if (r->req.cmd.buf[2] > 2) {
299         return false;
300     }
301     channel = r->req.dev->channel;
302     id = r->req.dev->id;
303     found_lun0 = false;
304     n = 0;
305     QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
306         SCSIDevice *dev = SCSI_DEVICE(qdev);
307
308         if (dev->channel == channel && dev->id == id) {
309             if (dev->lun == 0) {
310                 found_lun0 = true;
311             }
312             n += 8;
313         }
314     }
315     if (!found_lun0) {
316         n += 8;
317     }
318     len = MIN(n + 8, r->req.cmd.xfer & ~7);
319     if (len > sizeof(r->buf)) {
320         /* TODO: > 256 LUNs? */
321         return false;
322     }
323
324     memset(r->buf, 0, len);
325     stl_be_p(&r->buf, n);
326     i = found_lun0 ? 8 : 16;
327     QTAILQ_FOREACH(qdev, &r->req.bus->qbus.children, sibling) {
328         SCSIDevice *dev = SCSI_DEVICE(qdev);
329
330         if (dev->channel == channel && dev->id == id) {
331             store_lun(&r->buf[i], dev->lun);
332             i += 8;
333         }
334     }
335     assert(i == n + 8);
336     r->len = len;
337     return true;
338 }
339
340 static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
341 {
342     assert(r->req.dev->lun != r->req.lun);
343     if (r->req.cmd.buf[1] & 0x2) {
344         /* Command support data - optional, not implemented */
345         return false;
346     }
347
348     if (r->req.cmd.buf[1] & 0x1) {
349         /* Vital product data */
350         uint8_t page_code = r->req.cmd.buf[2];
351         if (r->req.cmd.xfer < 4) {
352             return false;
353         }
354
355         r->buf[r->len++] = page_code ; /* this page */
356         r->buf[r->len++] = 0x00;
357
358         switch (page_code) {
359         case 0x00: /* Supported page codes, mandatory */
360         {
361             int pages;
362             pages = r->len++;
363             r->buf[r->len++] = 0x00; /* list of supported pages (this page) */
364             r->buf[pages] = r->len - pages - 1; /* number of pages */
365             break;
366         }
367         default:
368             return false;
369         }
370         /* done with EVPD */
371         assert(r->len < sizeof(r->buf));
372         r->len = MIN(r->req.cmd.xfer, r->len);
373         return true;
374     }
375
376     /* Standard INQUIRY data */
377     if (r->req.cmd.buf[2] != 0) {
378         return false;
379     }
380
381     /* PAGE CODE == 0 */
382     if (r->req.cmd.xfer < 5) {
383         return -1;
384     }
385
386     r->len = MIN(r->req.cmd.xfer, 36);
387     memset(r->buf, 0, r->len);
388     if (r->req.lun != 0) {
389         r->buf[0] = TYPE_NO_LUN;
390     } else {
391         r->buf[0] = TYPE_NOT_PRESENT | TYPE_INACTIVE;
392         r->buf[2] = 5; /* Version */
393         r->buf[3] = 2 | 0x10; /* HiSup, response data format */
394         r->buf[4] = r->len - 5; /* Additional Length = (Len - 1) - 4 */
395         r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ.  */
396         memcpy(&r->buf[8], "QEMU    ", 8);
397         memcpy(&r->buf[16], "QEMU TARGET     ", 16);
398         strncpy((char *) &r->buf[32], QEMU_VERSION, 4);
399     }
400     return true;
401 }
402
403 static int32_t scsi_target_send_command(SCSIRequest *req, uint8_t *buf)
404 {
405     SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
406
407     switch (buf[0]) {
408     case REPORT_LUNS:
409         if (!scsi_target_emulate_report_luns(r)) {
410             goto illegal_request;
411         }
412         break;
413     case INQUIRY:
414         if (!scsi_target_emulate_inquiry(r)) {
415             goto illegal_request;
416         }
417         break;
418     case REQUEST_SENSE:
419         if (req->cmd.xfer < 4) {
420             goto illegal_request;
421         }
422         r->len = scsi_device_get_sense(r->req.dev, r->buf,
423                                        MIN(req->cmd.xfer, sizeof r->buf),
424                                        (req->cmd.buf[1] & 1) == 0);
425         if (r->req.dev->sense_is_ua) {
426             scsi_device_unit_attention_reported(req->dev);
427             r->req.dev->sense_len = 0;
428             r->req.dev->sense_is_ua = false;
429         }
430         break;
431     default:
432         scsi_req_build_sense(req, SENSE_CODE(LUN_NOT_SUPPORTED));
433         scsi_req_complete(req, CHECK_CONDITION);
434         return 0;
435     illegal_request:
436         scsi_req_build_sense(req, SENSE_CODE(INVALID_FIELD));
437         scsi_req_complete(req, CHECK_CONDITION);
438         return 0;
439     }
440
441     if (!r->len) {
442         scsi_req_complete(req, GOOD);
443     }
444     return r->len;
445 }
446
447 static void scsi_target_read_data(SCSIRequest *req)
448 {
449     SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
450     uint32_t n;
451
452     n = r->len;
453     if (n > 0) {
454         r->len = 0;
455         scsi_req_data(&r->req, n);
456     } else {
457         scsi_req_complete(&r->req, GOOD);
458     }
459 }
460
461 static uint8_t *scsi_target_get_buf(SCSIRequest *req)
462 {
463     SCSITargetReq *r = DO_UPCAST(SCSITargetReq, req, req);
464
465     return r->buf;
466 }
467
468 static const struct SCSIReqOps reqops_target_command = {
469     .size         = sizeof(SCSITargetReq),
470     .send_command = scsi_target_send_command,
471     .read_data    = scsi_target_read_data,
472     .get_buf      = scsi_target_get_buf,
473 };
474
475
476 SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
477                             uint32_t tag, uint32_t lun, void *hba_private)
478 {
479     SCSIRequest *req;
480
481     req = g_malloc0(reqops->size);
482     req->refcount = 1;
483     req->bus = scsi_bus_from_device(d);
484     req->dev = d;
485     req->tag = tag;
486     req->lun = lun;
487     req->hba_private = hba_private;
488     req->status = -1;
489     req->sense_len = 0;
490     req->ops = reqops;
491     trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
492     return req;
493 }
494
495 SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
496                           uint8_t *buf, void *hba_private)
497 {
498     SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
499     SCSIRequest *req;
500     SCSICommand cmd;
501
502     if (scsi_req_parse(&cmd, d, buf) != 0) {
503         trace_scsi_req_parse_bad(d->id, lun, tag, buf[0]);
504         req = scsi_req_alloc(&reqops_invalid_opcode, d, tag, lun, hba_private);
505     } else {
506         trace_scsi_req_parsed(d->id, lun, tag, buf[0],
507                               cmd.mode, cmd.xfer);
508         if (cmd.lba != -1) {
509             trace_scsi_req_parsed_lba(d->id, lun, tag, buf[0],
510                                       cmd.lba);
511         }
512
513         if ((d->unit_attention.key == UNIT_ATTENTION ||
514              bus->unit_attention.key == UNIT_ATTENTION) &&
515             (buf[0] != INQUIRY &&
516              buf[0] != REPORT_LUNS &&
517              buf[0] != GET_CONFIGURATION &&
518              buf[0] != GET_EVENT_STATUS_NOTIFICATION &&
519
520              /*
521               * If we already have a pending unit attention condition,
522               * report this one before triggering another one.
523               */
524              !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
525             req = scsi_req_alloc(&reqops_unit_attention, d, tag, lun,
526                                  hba_private);
527         } else if (lun != d->lun ||
528             buf[0] == REPORT_LUNS ||
529             (buf[0] == REQUEST_SENSE && (d->sense_len || cmd.xfer < 4))) {
530             req = scsi_req_alloc(&reqops_target_command, d, tag, lun,
531                                  hba_private);
532         } else {
533             req = scsi_device_alloc_req(d, tag, lun, buf, hba_private);
534         }
535     }
536
537     req->cmd = cmd;
538     req->resid = req->cmd.xfer;
539
540     switch (buf[0]) {
541     case INQUIRY:
542         trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]);
543         break;
544     case TEST_UNIT_READY:
545         trace_scsi_test_unit_ready(d->id, lun, tag);
546         break;
547     case REPORT_LUNS:
548         trace_scsi_report_luns(d->id, lun, tag);
549         break;
550     case REQUEST_SENSE:
551         trace_scsi_request_sense(d->id, lun, tag);
552         break;
553     default:
554         break;
555     }
556
557     return req;
558 }
559
560 uint8_t *scsi_req_get_buf(SCSIRequest *req)
561 {
562     return req->ops->get_buf(req);
563 }
564
565 static void scsi_clear_unit_attention(SCSIRequest *req)
566 {
567     SCSISense *ua;
568     if (req->dev->unit_attention.key != UNIT_ATTENTION &&
569         req->bus->unit_attention.key != UNIT_ATTENTION) {
570         return;
571     }
572
573     /*
574      * If an INQUIRY command enters the enabled command state,
575      * the device server shall [not] clear any unit attention condition;
576      * See also MMC-6, paragraphs 6.5 and 6.6.2.
577      */
578     if (req->cmd.buf[0] == INQUIRY ||
579         req->cmd.buf[0] == GET_CONFIGURATION ||
580         req->cmd.buf[0] == GET_EVENT_STATUS_NOTIFICATION) {
581         return;
582     }
583
584     if (req->dev->unit_attention.key == UNIT_ATTENTION) {
585         ua = &req->dev->unit_attention;
586     } else {
587         ua = &req->bus->unit_attention;
588     }
589
590     /*
591      * If a REPORT LUNS command enters the enabled command state, [...]
592      * the device server shall clear any pending unit attention condition
593      * with an additional sense code of REPORTED LUNS DATA HAS CHANGED.
594      */
595     if (req->cmd.buf[0] == REPORT_LUNS &&
596         !(ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc &&
597           ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
598         return;
599     }
600
601     *ua = SENSE_CODE(NO_SENSE);
602 }
603
604 int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len)
605 {
606     int ret;
607
608     assert(len >= 14);
609     if (!req->sense_len) {
610         return 0;
611     }
612
613     ret = scsi_build_sense(req->sense, req->sense_len, buf, len, true);
614
615     /*
616      * FIXME: clearing unit attention conditions upon autosense should be done
617      * only if the UA_INTLCK_CTRL field in the Control mode page is set to 00b
618      * (SAM-5, 5.14).
619      *
620      * We assume UA_INTLCK_CTRL to be 00b for HBAs that support autosense, and
621      * 10b for HBAs that do not support it (do not call scsi_req_get_sense).
622      * Here we handle unit attention clearing for UA_INTLCK_CTRL == 00b.
623      */
624     if (req->dev->sense_is_ua) {
625         scsi_device_unit_attention_reported(req->dev);
626         req->dev->sense_len = 0;
627         req->dev->sense_is_ua = false;
628     }
629     return ret;
630 }
631
632 int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed)
633 {
634     return scsi_build_sense(dev->sense, dev->sense_len, buf, len, fixed);
635 }
636
637 void scsi_req_build_sense(SCSIRequest *req, SCSISense sense)
638 {
639     trace_scsi_req_build_sense(req->dev->id, req->lun, req->tag,
640                                sense.key, sense.asc, sense.ascq);
641     memset(req->sense, 0, 18);
642     req->sense[0] = 0xf0;
643     req->sense[2] = sense.key;
644     req->sense[7] = 10;
645     req->sense[12] = sense.asc;
646     req->sense[13] = sense.ascq;
647     req->sense_len = 18;
648 }
649
650 int32_t scsi_req_enqueue(SCSIRequest *req)
651 {
652     int32_t rc;
653
654     assert(!req->enqueued);
655     scsi_req_ref(req);
656     if (req->bus->info->get_sg_list) {
657         req->sg = req->bus->info->get_sg_list(req);
658     } else {
659         req->sg = NULL;
660     }
661     req->enqueued = true;
662     QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
663
664     scsi_req_ref(req);
665     rc = req->ops->send_command(req, req->cmd.buf);
666     scsi_req_unref(req);
667     return rc;
668 }
669
670 static void scsi_req_dequeue(SCSIRequest *req)
671 {
672     trace_scsi_req_dequeue(req->dev->id, req->lun, req->tag);
673     req->retry = false;
674     if (req->enqueued) {
675         QTAILQ_REMOVE(&req->dev->requests, req, next);
676         req->enqueued = false;
677         scsi_req_unref(req);
678     }
679 }
680
681 static int scsi_get_performance_length(int num_desc, int type, int data_type)
682 {
683     /* MMC-6, paragraph 6.7.  */
684     switch (type) {
685     case 0:
686         if ((data_type & 3) == 0) {
687             /* Each descriptor is as in Table 295 - Nominal performance.  */
688             return 16 * num_desc + 8;
689         } else {
690             /* Each descriptor is as in Table 296 - Exceptions.  */
691             return 6 * num_desc + 8;
692         }
693     case 1:
694     case 4:
695     case 5:
696         return 8 * num_desc + 8;
697     case 2:
698         return 2048 * num_desc + 8;
699     case 3:
700         return 16 * num_desc + 8;
701     default:
702         return 8;
703     }
704 }
705
706 static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
707 {
708     switch (buf[0] >> 5) {
709     case 0:
710         cmd->xfer = buf[4];
711         cmd->len = 6;
712         /* length 0 means 256 blocks */
713         if (cmd->xfer == 0) {
714             cmd->xfer = 256;
715         }
716         break;
717     case 1:
718     case 2:
719         cmd->xfer = lduw_be_p(&buf[7]);
720         cmd->len = 10;
721         break;
722     case 4:
723         cmd->xfer = ldl_be_p(&buf[10]) & 0xffffffffULL;
724         cmd->len = 16;
725         break;
726     case 5:
727         cmd->xfer = ldl_be_p(&buf[6]) & 0xffffffffULL;
728         cmd->len = 12;
729         break;
730     default:
731         return -1;
732     }
733
734     switch (buf[0]) {
735     case TEST_UNIT_READY:
736     case REWIND:
737     case START_STOP:
738     case SET_CAPACITY:
739     case WRITE_FILEMARKS:
740     case WRITE_FILEMARKS_16:
741     case SPACE:
742     case RESERVE:
743     case RELEASE:
744     case ERASE:
745     case ALLOW_MEDIUM_REMOVAL:
746     case VERIFY_10:
747     case SEEK_10:
748     case SYNCHRONIZE_CACHE:
749     case SYNCHRONIZE_CACHE_16:
750     case LOCATE_16:
751     case LOCK_UNLOCK_CACHE:
752     case LOAD_UNLOAD:
753     case SET_CD_SPEED:
754     case SET_LIMITS:
755     case WRITE_LONG_10:
756     case MOVE_MEDIUM:
757     case UPDATE_BLOCK:
758     case RESERVE_TRACK:
759     case SET_READ_AHEAD:
760     case PRE_FETCH:
761     case PRE_FETCH_16:
762     case ALLOW_OVERWRITE:
763         cmd->xfer = 0;
764         break;
765     case MODE_SENSE:
766         break;
767     case WRITE_SAME_10:
768         cmd->xfer = 1;
769         break;
770     case READ_CAPACITY_10:
771         cmd->xfer = 8;
772         break;
773     case READ_BLOCK_LIMITS:
774         cmd->xfer = 6;
775         break;
776     case SEND_VOLUME_TAG:
777         /* GPCMD_SET_STREAMING from multimedia commands.  */
778         if (dev->type == TYPE_ROM) {
779             cmd->xfer = buf[10] | (buf[9] << 8);
780         } else {
781             cmd->xfer = buf[9] | (buf[8] << 8);
782         }
783         break;
784     case WRITE_10:
785     case WRITE_VERIFY_10:
786     case WRITE_6:
787     case WRITE_12:
788     case WRITE_VERIFY_12:
789     case WRITE_16:
790     case WRITE_VERIFY_16:
791         cmd->xfer *= dev->blocksize;
792         break;
793     case READ_10:
794     case READ_6:
795     case READ_REVERSE:
796     case RECOVER_BUFFERED_DATA:
797     case READ_12:
798     case READ_16:
799         cmd->xfer *= dev->blocksize;
800         break;
801     case FORMAT_UNIT:
802         /* MMC mandates the parameter list to be 12-bytes long.  Parameters
803          * for block devices are restricted to the header right now.  */
804         if (dev->type == TYPE_ROM && (buf[1] & 16)) {
805             cmd->xfer = 12;
806         } else {
807             cmd->xfer = (buf[1] & 16) == 0 ? 0 : (buf[1] & 32 ? 8 : 4);
808         }
809         break;
810     case INQUIRY:
811     case RECEIVE_DIAGNOSTIC:
812     case SEND_DIAGNOSTIC:
813         cmd->xfer = buf[4] | (buf[3] << 8);
814         break;
815     case READ_CD:
816     case READ_BUFFER:
817     case WRITE_BUFFER:
818     case SEND_CUE_SHEET:
819         cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16);
820         break;
821     case PERSISTENT_RESERVE_OUT:
822         cmd->xfer = ldl_be_p(&buf[5]) & 0xffffffffULL;
823         break;
824     case ERASE_12:
825         if (dev->type == TYPE_ROM) {
826             /* MMC command GET PERFORMANCE.  */
827             cmd->xfer = scsi_get_performance_length(buf[9] | (buf[8] << 8),
828                                                     buf[10], buf[1] & 0x1f);
829         }
830         break;
831     case MECHANISM_STATUS:
832     case READ_DVD_STRUCTURE:
833     case SEND_DVD_STRUCTURE:
834     case MAINTENANCE_OUT:
835     case MAINTENANCE_IN:
836         if (dev->type == TYPE_ROM) {
837             /* GPCMD_REPORT_KEY and GPCMD_SEND_KEY from multi media commands */
838             cmd->xfer = buf[9] | (buf[8] << 8);
839         }
840         break;
841     }
842     return 0;
843 }
844
845 static int scsi_req_stream_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
846 {
847     switch (buf[0]) {
848     /* stream commands */
849     case ERASE_12:
850     case ERASE_16:
851         cmd->xfer = 0;
852         break;
853     case READ_6:
854     case READ_REVERSE:
855     case RECOVER_BUFFERED_DATA:
856     case WRITE_6:
857         cmd->len = 6;
858         cmd->xfer = buf[4] | (buf[3] << 8) | (buf[2] << 16);
859         if (buf[1] & 0x01) { /* fixed */
860             cmd->xfer *= dev->blocksize;
861         }
862         break;
863     case REWIND:
864     case START_STOP:
865         cmd->len = 6;
866         cmd->xfer = 0;
867         break;
868     case SPACE_16:
869         cmd->xfer = buf[13] | (buf[12] << 8);
870         break;
871     case READ_POSITION:
872         cmd->xfer = buf[8] | (buf[7] << 8);
873         break;
874     case FORMAT_UNIT:
875         cmd->xfer = buf[4] | (buf[3] << 8);
876         break;
877     /* generic commands */
878     default:
879         return scsi_req_length(cmd, dev, buf);
880     }
881     return 0;
882 }
883
884 static void scsi_cmd_xfer_mode(SCSICommand *cmd)
885 {
886     switch (cmd->buf[0]) {
887     case WRITE_6:
888     case WRITE_10:
889     case WRITE_VERIFY_10:
890     case WRITE_12:
891     case WRITE_VERIFY_12:
892     case WRITE_16:
893     case WRITE_VERIFY_16:
894     case COPY:
895     case COPY_VERIFY:
896     case COMPARE:
897     case CHANGE_DEFINITION:
898     case LOG_SELECT:
899     case MODE_SELECT:
900     case MODE_SELECT_10:
901     case SEND_DIAGNOSTIC:
902     case WRITE_BUFFER:
903     case FORMAT_UNIT:
904     case REASSIGN_BLOCKS:
905     case SEARCH_EQUAL:
906     case SEARCH_HIGH:
907     case SEARCH_LOW:
908     case UPDATE_BLOCK:
909     case WRITE_LONG_10:
910     case WRITE_SAME_10:
911     case SEARCH_HIGH_12:
912     case SEARCH_EQUAL_12:
913     case SEARCH_LOW_12:
914     case MEDIUM_SCAN:
915     case SEND_VOLUME_TAG:
916     case SEND_CUE_SHEET:
917     case SEND_DVD_STRUCTURE:
918     case PERSISTENT_RESERVE_OUT:
919     case MAINTENANCE_OUT:
920         cmd->mode = SCSI_XFER_TO_DEV;
921         break;
922     default:
923         if (cmd->xfer)
924             cmd->mode = SCSI_XFER_FROM_DEV;
925         else {
926             cmd->mode = SCSI_XFER_NONE;
927         }
928         break;
929     }
930 }
931
932 static uint64_t scsi_cmd_lba(SCSICommand *cmd)
933 {
934     uint8_t *buf = cmd->buf;
935     uint64_t lba;
936
937     switch (buf[0] >> 5) {
938     case 0:
939         lba = ldl_be_p(&buf[0]) & 0x1fffff;
940         break;
941     case 1:
942     case 2:
943     case 5:
944         lba = ldl_be_p(&buf[2]) & 0xffffffffULL;
945         break;
946     case 4:
947         lba = ldq_be_p(&buf[2]);
948         break;
949     default:
950         lba = -1;
951
952     }
953     return lba;
954 }
955
956 int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
957 {
958     int rc;
959
960     if (dev->type == TYPE_TAPE) {
961         rc = scsi_req_stream_length(cmd, dev, buf);
962     } else {
963         rc = scsi_req_length(cmd, dev, buf);
964     }
965     if (rc != 0)
966         return rc;
967
968     memcpy(cmd->buf, buf, cmd->len);
969     scsi_cmd_xfer_mode(cmd);
970     cmd->lba = scsi_cmd_lba(cmd);
971     return 0;
972 }
973
974 /*
975  * Predefined sense codes
976  */
977
978 /* No sense data available */
979 const struct SCSISense sense_code_NO_SENSE = {
980     .key = NO_SENSE , .asc = 0x00 , .ascq = 0x00
981 };
982
983 /* LUN not ready, Manual intervention required */
984 const struct SCSISense sense_code_LUN_NOT_READY = {
985     .key = NOT_READY, .asc = 0x04, .ascq = 0x03
986 };
987
988 /* LUN not ready, Medium not present */
989 const struct SCSISense sense_code_NO_MEDIUM = {
990     .key = NOT_READY, .asc = 0x3a, .ascq = 0x00
991 };
992
993 /* LUN not ready, medium removal prevented */
994 const struct SCSISense sense_code_NOT_READY_REMOVAL_PREVENTED = {
995     .key = NOT_READY, .asc = 0x53, .ascq = 0x00
996 };
997
998 /* Hardware error, internal target failure */
999 const struct SCSISense sense_code_TARGET_FAILURE = {
1000     .key = HARDWARE_ERROR, .asc = 0x44, .ascq = 0x00
1001 };
1002
1003 /* Illegal request, invalid command operation code */
1004 const struct SCSISense sense_code_INVALID_OPCODE = {
1005     .key = ILLEGAL_REQUEST, .asc = 0x20, .ascq = 0x00
1006 };
1007
1008 /* Illegal request, LBA out of range */
1009 const struct SCSISense sense_code_LBA_OUT_OF_RANGE = {
1010     .key = ILLEGAL_REQUEST, .asc = 0x21, .ascq = 0x00
1011 };
1012
1013 /* Illegal request, Invalid field in CDB */
1014 const struct SCSISense sense_code_INVALID_FIELD = {
1015     .key = ILLEGAL_REQUEST, .asc = 0x24, .ascq = 0x00
1016 };
1017
1018 /* Illegal request, LUN not supported */
1019 const struct SCSISense sense_code_LUN_NOT_SUPPORTED = {
1020     .key = ILLEGAL_REQUEST, .asc = 0x25, .ascq = 0x00
1021 };
1022
1023 /* Illegal request, Saving parameters not supported */
1024 const struct SCSISense sense_code_SAVING_PARAMS_NOT_SUPPORTED = {
1025     .key = ILLEGAL_REQUEST, .asc = 0x39, .ascq = 0x00
1026 };
1027
1028 /* Illegal request, Incompatible medium installed */
1029 const struct SCSISense sense_code_INCOMPATIBLE_FORMAT = {
1030     .key = ILLEGAL_REQUEST, .asc = 0x30, .ascq = 0x00
1031 };
1032
1033 /* Illegal request, medium removal prevented */
1034 const struct SCSISense sense_code_ILLEGAL_REQ_REMOVAL_PREVENTED = {
1035     .key = ILLEGAL_REQUEST, .asc = 0x53, .ascq = 0x00
1036 };
1037
1038 /* Command aborted, I/O process terminated */
1039 const struct SCSISense sense_code_IO_ERROR = {
1040     .key = ABORTED_COMMAND, .asc = 0x00, .ascq = 0x06
1041 };
1042
1043 /* Command aborted, I_T Nexus loss occurred */
1044 const struct SCSISense sense_code_I_T_NEXUS_LOSS = {
1045     .key = ABORTED_COMMAND, .asc = 0x29, .ascq = 0x07
1046 };
1047
1048 /* Command aborted, Logical Unit failure */
1049 const struct SCSISense sense_code_LUN_FAILURE = {
1050     .key = ABORTED_COMMAND, .asc = 0x3e, .ascq = 0x01
1051 };
1052
1053 /* Unit attention, Power on, reset or bus device reset occurred */
1054 const struct SCSISense sense_code_RESET = {
1055     .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x00
1056 };
1057
1058 /* Unit attention, No medium */
1059 const struct SCSISense sense_code_UNIT_ATTENTION_NO_MEDIUM = {
1060     .key = UNIT_ATTENTION, .asc = 0x3a, .ascq = 0x00
1061 };
1062
1063 /* Unit attention, Medium may have changed */
1064 const struct SCSISense sense_code_MEDIUM_CHANGED = {
1065     .key = UNIT_ATTENTION, .asc = 0x28, .ascq = 0x00
1066 };
1067
1068 /* Unit attention, Reported LUNs data has changed */
1069 const struct SCSISense sense_code_REPORTED_LUNS_CHANGED = {
1070     .key = UNIT_ATTENTION, .asc = 0x3f, .ascq = 0x0e
1071 };
1072
1073 /* Unit attention, Device internal reset */
1074 const struct SCSISense sense_code_DEVICE_INTERNAL_RESET = {
1075     .key = UNIT_ATTENTION, .asc = 0x29, .ascq = 0x04
1076 };
1077
1078 /*
1079  * scsi_build_sense
1080  *
1081  * Convert between fixed and descriptor sense buffers
1082  */
1083 int scsi_build_sense(uint8_t *in_buf, int in_len,
1084                      uint8_t *buf, int len, bool fixed)
1085 {
1086     bool fixed_in;
1087     SCSISense sense;
1088     if (!fixed && len < 8) {
1089         return 0;
1090     }
1091
1092     if (in_len == 0) {
1093         sense.key = NO_SENSE;
1094         sense.asc = 0;
1095         sense.ascq = 0;
1096     } else {
1097         fixed_in = (in_buf[0] & 2) == 0;
1098
1099         if (fixed == fixed_in) {
1100             memcpy(buf, in_buf, MIN(len, in_len));
1101             return MIN(len, in_len);
1102         }
1103
1104         if (fixed_in) {
1105             sense.key = in_buf[2];
1106             sense.asc = in_buf[12];
1107             sense.ascq = in_buf[13];
1108         } else {
1109             sense.key = in_buf[1];
1110             sense.asc = in_buf[2];
1111             sense.ascq = in_buf[3];
1112         }
1113     }
1114
1115     memset(buf, 0, len);
1116     if (fixed) {
1117         /* Return fixed format sense buffer */
1118         buf[0] = 0xf0;
1119         buf[2] = sense.key;
1120         buf[7] = 10;
1121         buf[12] = sense.asc;
1122         buf[13] = sense.ascq;
1123         return MIN(len, 18);
1124     } else {
1125         /* Return descriptor format sense buffer */
1126         buf[0] = 0x72;
1127         buf[1] = sense.key;
1128         buf[2] = sense.asc;
1129         buf[3] = sense.ascq;
1130         return 8;
1131     }
1132 }
1133
1134 static const char *scsi_command_name(uint8_t cmd)
1135 {
1136     static const char *names[] = {
1137         [ TEST_UNIT_READY          ] = "TEST_UNIT_READY",
1138         [ REWIND                   ] = "REWIND",
1139         [ REQUEST_SENSE            ] = "REQUEST_SENSE",
1140         [ FORMAT_UNIT              ] = "FORMAT_UNIT",
1141         [ READ_BLOCK_LIMITS        ] = "READ_BLOCK_LIMITS",
1142         [ REASSIGN_BLOCKS          ] = "REASSIGN_BLOCKS",
1143         [ READ_6                   ] = "READ_6",
1144         [ WRITE_6                  ] = "WRITE_6",
1145         [ SET_CAPACITY             ] = "SET_CAPACITY",
1146         [ READ_REVERSE             ] = "READ_REVERSE",
1147         [ WRITE_FILEMARKS          ] = "WRITE_FILEMARKS",
1148         [ SPACE                    ] = "SPACE",
1149         [ INQUIRY                  ] = "INQUIRY",
1150         [ RECOVER_BUFFERED_DATA    ] = "RECOVER_BUFFERED_DATA",
1151         [ MAINTENANCE_IN           ] = "MAINTENANCE_IN",
1152         [ MAINTENANCE_OUT          ] = "MAINTENANCE_OUT",
1153         [ MODE_SELECT              ] = "MODE_SELECT",
1154         [ RESERVE                  ] = "RESERVE",
1155         [ RELEASE                  ] = "RELEASE",
1156         [ COPY                     ] = "COPY",
1157         [ ERASE                    ] = "ERASE",
1158         [ MODE_SENSE               ] = "MODE_SENSE",
1159         [ START_STOP               ] = "START_STOP",
1160         [ RECEIVE_DIAGNOSTIC       ] = "RECEIVE_DIAGNOSTIC",
1161         [ SEND_DIAGNOSTIC          ] = "SEND_DIAGNOSTIC",
1162         [ ALLOW_MEDIUM_REMOVAL     ] = "ALLOW_MEDIUM_REMOVAL",
1163         [ READ_CAPACITY_10         ] = "READ_CAPACITY_10",
1164         [ READ_10                  ] = "READ_10",
1165         [ WRITE_10                 ] = "WRITE_10",
1166         [ SEEK_10                  ] = "SEEK_10",
1167         [ WRITE_VERIFY_10          ] = "WRITE_VERIFY_10",
1168         [ VERIFY_10                ] = "VERIFY_10",
1169         [ SEARCH_HIGH              ] = "SEARCH_HIGH",
1170         [ SEARCH_EQUAL             ] = "SEARCH_EQUAL",
1171         [ SEARCH_LOW               ] = "SEARCH_LOW",
1172         [ SET_LIMITS               ] = "SET_LIMITS",
1173         [ PRE_FETCH                ] = "PRE_FETCH/READ_POSITION",
1174         /* READ_POSITION and PRE_FETCH use the same operation code */
1175         [ SYNCHRONIZE_CACHE        ] = "SYNCHRONIZE_CACHE",
1176         [ LOCK_UNLOCK_CACHE        ] = "LOCK_UNLOCK_CACHE",
1177         [ READ_DEFECT_DATA         ] = "READ_DEFECT_DATA",
1178         [ MEDIUM_SCAN              ] = "MEDIUM_SCAN",
1179         [ COMPARE                  ] = "COMPARE",
1180         [ COPY_VERIFY              ] = "COPY_VERIFY",
1181         [ WRITE_BUFFER             ] = "WRITE_BUFFER",
1182         [ READ_BUFFER              ] = "READ_BUFFER",
1183         [ UPDATE_BLOCK             ] = "UPDATE_BLOCK",
1184         [ READ_LONG_10             ] = "READ_LONG_10",
1185         [ WRITE_LONG_10            ] = "WRITE_LONG_10",
1186         [ CHANGE_DEFINITION        ] = "CHANGE_DEFINITION",
1187         [ WRITE_SAME_10            ] = "WRITE_SAME_10",
1188         [ UNMAP                    ] = "UNMAP",
1189         [ READ_TOC                 ] = "READ_TOC",
1190         [ REPORT_DENSITY_SUPPORT   ] = "REPORT_DENSITY_SUPPORT",
1191         [ GET_CONFIGURATION        ] = "GET_CONFIGURATION",
1192         [ LOG_SELECT               ] = "LOG_SELECT",
1193         [ LOG_SENSE                ] = "LOG_SENSE",
1194         [ MODE_SELECT_10           ] = "MODE_SELECT_10",
1195         [ RESERVE_10               ] = "RESERVE_10",
1196         [ RELEASE_10               ] = "RELEASE_10",
1197         [ MODE_SENSE_10            ] = "MODE_SENSE_10",
1198         [ PERSISTENT_RESERVE_IN    ] = "PERSISTENT_RESERVE_IN",
1199         [ PERSISTENT_RESERVE_OUT   ] = "PERSISTENT_RESERVE_OUT",
1200         [ WRITE_FILEMARKS_16       ] = "WRITE_FILEMARKS_16",
1201         [ EXTENDED_COPY            ] = "EXTENDED_COPY",
1202         [ ATA_PASSTHROUGH          ] = "ATA_PASSTHROUGH",
1203         [ ACCESS_CONTROL_IN        ] = "ACCESS_CONTROL_IN",
1204         [ ACCESS_CONTROL_OUT       ] = "ACCESS_CONTROL_OUT",
1205         [ READ_16                  ] = "READ_16",
1206         [ COMPARE_AND_WRITE        ] = "COMPARE_AND_WRITE",
1207         [ WRITE_16                 ] = "WRITE_16",
1208         [ WRITE_VERIFY_16          ] = "WRITE_VERIFY_16",
1209         [ VERIFY_16                ] = "VERIFY_16",
1210         [ PRE_FETCH_16             ] = "PRE_FETCH_16",
1211         [ SYNCHRONIZE_CACHE_16     ] = "SPACE_16/SYNCHRONIZE_CACHE_16",
1212         /* SPACE_16 and SYNCHRONIZE_CACHE_16 use the same operation code */
1213         [ LOCATE_16                ] = "LOCATE_16",
1214         [ WRITE_SAME_16            ] = "ERASE_16/WRITE_SAME_16",
1215         /* ERASE_16 and WRITE_SAME_16 use the same operation code */
1216         [ SERVICE_ACTION_IN_16     ] = "SERVICE_ACTION_IN_16",
1217         [ WRITE_LONG_16            ] = "WRITE_LONG_16",
1218         [ REPORT_LUNS              ] = "REPORT_LUNS",
1219         [ BLANK                    ] = "BLANK",
1220         [ MOVE_MEDIUM              ] = "MOVE_MEDIUM",
1221         [ LOAD_UNLOAD              ] = "LOAD_UNLOAD",
1222         [ READ_12                  ] = "READ_12",
1223         [ WRITE_12                 ] = "WRITE_12",
1224         [ ERASE_12                 ] = "ERASE_12/GET_PERFORMANCE",
1225         /* ERASE_12 and GET_PERFORMANCE use the same operation code */
1226         [ SERVICE_ACTION_IN_12     ] = "SERVICE_ACTION_IN_12",
1227         [ WRITE_VERIFY_12          ] = "WRITE_VERIFY_12",
1228         [ VERIFY_12                ] = "VERIFY_12",
1229         [ SEARCH_HIGH_12           ] = "SEARCH_HIGH_12",
1230         [ SEARCH_EQUAL_12          ] = "SEARCH_EQUAL_12",
1231         [ SEARCH_LOW_12            ] = "SEARCH_LOW_12",
1232         [ READ_ELEMENT_STATUS      ] = "READ_ELEMENT_STATUS",
1233         [ SEND_VOLUME_TAG          ] = "SEND_VOLUME_TAG/SET_STREAMING",
1234         /* SEND_VOLUME_TAG and SET_STREAMING use the same operation code */
1235         [ READ_CD                  ] = "READ_CD",
1236         [ READ_DEFECT_DATA_12      ] = "READ_DEFECT_DATA_12",
1237         [ READ_DVD_STRUCTURE       ] = "READ_DVD_STRUCTURE",
1238         [ RESERVE_TRACK            ] = "RESERVE_TRACK",
1239         [ SEND_CUE_SHEET           ] = "SEND_CUE_SHEET",
1240         [ SEND_DVD_STRUCTURE       ] = "SEND_DVD_STRUCTURE",
1241         [ SET_CD_SPEED             ] = "SET_CD_SPEED",
1242         [ SET_READ_AHEAD           ] = "SET_READ_AHEAD",
1243         [ ALLOW_OVERWRITE          ] = "ALLOW_OVERWRITE",
1244         [ MECHANISM_STATUS         ] = "MECHANISM_STATUS",
1245     };
1246
1247     if (cmd >= ARRAY_SIZE(names) || names[cmd] == NULL)
1248         return "*UNKNOWN*";
1249     return names[cmd];
1250 }
1251
1252 SCSIRequest *scsi_req_ref(SCSIRequest *req)
1253 {
1254     req->refcount++;
1255     return req;
1256 }
1257
1258 void scsi_req_unref(SCSIRequest *req)
1259 {
1260     if (--req->refcount == 0) {
1261         if (req->ops->free_req) {
1262             req->ops->free_req(req);
1263         }
1264         g_free(req);
1265     }
1266 }
1267
1268 /* Tell the device that we finished processing this chunk of I/O.  It
1269    will start the next chunk or complete the command.  */
1270 void scsi_req_continue(SCSIRequest *req)
1271 {
1272     trace_scsi_req_continue(req->dev->id, req->lun, req->tag);
1273     if (req->cmd.mode == SCSI_XFER_TO_DEV) {
1274         req->ops->write_data(req);
1275     } else {
1276         req->ops->read_data(req);
1277     }
1278 }
1279
1280 /* Called by the devices when data is ready for the HBA.  The HBA should
1281    start a DMA operation to read or fill the device's data buffer.
1282    Once it completes, calling scsi_req_continue will restart I/O.  */
1283 void scsi_req_data(SCSIRequest *req, int len)
1284 {
1285     uint8_t *buf;
1286     if (req->io_canceled) {
1287         trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
1288         return;
1289     }
1290     trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
1291     assert(req->cmd.mode != SCSI_XFER_NONE);
1292     if (!req->sg) {
1293         req->resid -= len;
1294         req->bus->info->transfer_data(req, len);
1295         return;
1296     }
1297
1298     /* If the device calls scsi_req_data and the HBA specified a
1299      * scatter/gather list, the transfer has to happen in a single
1300      * step.  */
1301     assert(!req->dma_started);
1302     req->dma_started = true;
1303
1304     buf = scsi_req_get_buf(req);
1305     if (req->cmd.mode == SCSI_XFER_FROM_DEV) {
1306         req->resid = dma_buf_read(buf, len, req->sg);
1307     } else {
1308         req->resid = dma_buf_write(buf, len, req->sg);
1309     }
1310     scsi_req_continue(req);
1311 }
1312
1313 void scsi_req_print(SCSIRequest *req)
1314 {
1315     FILE *fp = stderr;
1316     int i;
1317
1318     fprintf(fp, "[%s id=%d] %s",
1319             req->dev->qdev.parent_bus->name,
1320             req->dev->id,
1321             scsi_command_name(req->cmd.buf[0]));
1322     for (i = 1; i < req->cmd.len; i++) {
1323         fprintf(fp, " 0x%02x", req->cmd.buf[i]);
1324     }
1325     switch (req->cmd.mode) {
1326     case SCSI_XFER_NONE:
1327         fprintf(fp, " - none\n");
1328         break;
1329     case SCSI_XFER_FROM_DEV:
1330         fprintf(fp, " - from-dev len=%zd\n", req->cmd.xfer);
1331         break;
1332     case SCSI_XFER_TO_DEV:
1333         fprintf(fp, " - to-dev len=%zd\n", req->cmd.xfer);
1334         break;
1335     default:
1336         fprintf(fp, " - Oops\n");
1337         break;
1338     }
1339 }
1340
1341 void scsi_req_complete(SCSIRequest *req, int status)
1342 {
1343     assert(req->status == -1);
1344     req->status = status;
1345
1346     assert(req->sense_len < sizeof(req->sense));
1347     if (status == GOOD) {
1348         req->sense_len = 0;
1349     }
1350
1351     if (req->sense_len) {
1352         memcpy(req->dev->sense, req->sense, req->sense_len);
1353         req->dev->sense_len = req->sense_len;
1354         req->dev->sense_is_ua = (req->ops == &reqops_unit_attention);
1355     } else {
1356         req->dev->sense_len = 0;
1357         req->dev->sense_is_ua = false;
1358     }
1359
1360     /*
1361      * Unit attention state is now stored in the device's sense buffer
1362      * if the HBA didn't do autosense.  Clear the pending unit attention
1363      * flags.
1364      */
1365     scsi_clear_unit_attention(req);
1366
1367     scsi_req_ref(req);
1368     scsi_req_dequeue(req);
1369     req->bus->info->complete(req, req->status, req->resid);
1370     scsi_req_unref(req);
1371 }
1372
1373 void scsi_req_cancel(SCSIRequest *req)
1374 {
1375     if (!req->enqueued) {
1376         return;
1377     }
1378     scsi_req_ref(req);
1379     scsi_req_dequeue(req);
1380     req->io_canceled = true;
1381     if (req->ops->cancel_io) {
1382         req->ops->cancel_io(req);
1383     }
1384     if (req->bus->info->cancel) {
1385         req->bus->info->cancel(req);
1386     }
1387     scsi_req_unref(req);
1388 }
1389
1390 void scsi_req_abort(SCSIRequest *req, int status)
1391 {
1392     if (!req->enqueued) {
1393         return;
1394     }
1395     scsi_req_ref(req);
1396     scsi_req_dequeue(req);
1397     req->io_canceled = true;
1398     if (req->ops->cancel_io) {
1399         req->ops->cancel_io(req);
1400     }
1401     scsi_req_complete(req, status);
1402     scsi_req_unref(req);
1403 }
1404
1405 void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense)
1406 {
1407     SCSIRequest *req;
1408
1409     while (!QTAILQ_EMPTY(&sdev->requests)) {
1410         req = QTAILQ_FIRST(&sdev->requests);
1411         scsi_req_cancel(req);
1412     }
1413     sdev->unit_attention = sense;
1414 }
1415
1416 static char *scsibus_get_fw_dev_path(DeviceState *dev)
1417 {
1418     SCSIDevice *d = SCSI_DEVICE(dev);
1419     char path[100];
1420
1421     snprintf(path, sizeof(path), "channel@%x/%s@%x,%x", d->channel,
1422              qdev_fw_name(dev), d->id, d->lun);
1423
1424     return strdup(path);
1425 }
1426
1427 SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun)
1428 {
1429     DeviceState *qdev;
1430     SCSIDevice *target_dev = NULL;
1431
1432     QTAILQ_FOREACH_REVERSE(qdev, &bus->qbus.children, ChildrenHead, sibling) {
1433         SCSIDevice *dev = SCSI_DEVICE(qdev);
1434
1435         if (dev->channel == channel && dev->id == id) {
1436             if (dev->lun == lun) {
1437                 return dev;
1438             }
1439             target_dev = dev;
1440         }
1441     }
1442     return target_dev;
1443 }
1444
1445 static void scsi_device_class_init(ObjectClass *klass, void *data)
1446 {
1447     DeviceClass *k = DEVICE_CLASS(klass);
1448     k->bus_info = &scsi_bus_info;
1449     k->init     = scsi_qdev_init;
1450     k->unplug   = qdev_simple_unplug_cb;
1451     k->exit     = scsi_qdev_exit;
1452 }
1453
1454 static TypeInfo scsi_device_type_info = {
1455     .name = TYPE_SCSI_DEVICE,
1456     .parent = TYPE_DEVICE,
1457     .instance_size = sizeof(SCSIDevice),
1458     .abstract = true,
1459     .class_size = sizeof(SCSIDeviceClass),
1460     .class_init = scsi_device_class_init,
1461 };
1462
1463 static void scsi_register_types(void)
1464 {
1465     type_register_static(&scsi_device_type_info);
1466 }
1467
1468 type_init(scsi_register_types)
This page took 0.108344 seconds and 4 git commands to generate.