Lines Matching +full:fixed +full:- +full:length

3 #include "qemu/error-report.h"
6 #include "qemu/hw-version.h"
7 #include "hw/qdev-properties.h"
9 #include "migration/qemu-file-types.h"
12 #include "system/block-backend.h"
36 QTAILQ_FOREACH_RCU(kid, &bus->qbus.children, sibling) { in do_scsi_device_find()
37 DeviceState *qdev = kid->child; in do_scsi_device_find()
40 if (dev->channel == channel && dev->id == id) { in do_scsi_device_find()
41 if (dev->lun == lun) { in do_scsi_device_find()
59 * main thread hot-plugging the device. in do_scsi_device_find()
64 if (retval && !include_unrealized && !qdev_is_realized(&retval->qdev)) { in do_scsi_device_find()
91 * vmstate ->put(), use scsi_device_for_each_req_async() for other cases.
108 WITH_QEMU_LOCK_GUARD(&s->requests_lock) { in scsi_device_for_each_req_sync()
109 QTAILQ_FOREACH_SAFE(req, &s->requests, next, next_req) { in scsi_device_for_each_req_sync()
124 SCSIDevice *s = data->s; in scsi_device_for_each_req_async_bh()
131 WITH_QEMU_LOCK_GUARD(&s->requests_lock) { in scsi_device_for_each_req_async_bh()
136 QTAILQ_FOREACH_SAFE(req, &s->requests, next, next) { in scsi_device_for_each_req_async_bh()
137 if (req->ctx == ctx) { in scsi_device_for_each_req_async_bh()
146 data->fn(elem->data, data->fn_opaque); in scsi_device_for_each_req_async_bh()
147 scsi_req_unref(elem->data); in scsi_device_for_each_req_async_bh()
154 blk_dec_in_flight(s->conf.blk); in scsi_device_for_each_req_async_bh()
165 data->s = params->s; in scsi_device_for_each_req_async_do_ctx()
166 data->fn = params->fn; in scsi_device_for_each_req_async_do_ctx()
167 data->fn_opaque = params->fn_opaque; in scsi_device_for_each_req_async_do_ctx()
173 object_ref(OBJECT(data->s)); in scsi_device_for_each_req_async_do_ctx()
176 blk_inc_in_flight(data->s->conf.blk); in scsi_device_for_each_req_async_do_ctx()
183 * must be thread-safe because it runs concurrently in each AioContext that is
186 * Keeps the BlockBackend's in-flight counter incremented until everything is
197 WITH_QEMU_LOCK_GUARD(&s->requests_lock) { in scsi_device_for_each_req_async()
199 QTAILQ_FOREACH(req, &s->requests, next) { in scsi_device_for_each_req_async()
200 g_hash_table_add(aio_contexts, req->ctx); in scsi_device_for_each_req_async()
220 if (sc->realize) { in scsi_device_realize()
221 sc->realize(s, errp); in scsi_device_realize()
228 if (sc->unrealize) { in scsi_device_unrealize()
229 sc->unrealize(s); in scsi_device_unrealize()
236 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus); in scsi_bus_parse_cdb()
239 assert(cmd->len == 0); in scsi_bus_parse_cdb()
241 if (bus->info->parse_cdb) { in scsi_bus_parse_cdb()
242 rc = bus->info->parse_cdb(dev, cmd, buf, buf_len, hba_private); in scsi_bus_parse_cdb()
251 if (sc->alloc_req) { in scsi_device_alloc_req()
252 return sc->alloc_req(s, tag, lun, buf, hba_private); in scsi_device_alloc_req()
261 if (sc->unit_attention_reported) { in scsi_device_unit_attention_reported()
262 sc->unit_attention_reported(s); in scsi_device_unit_attention_reported()
271 bus->busnr = next_scsi_bus++; in scsi_bus_init_named()
272 bus->info = info; in scsi_bus_init_named()
278 req->retry = true; in scsi_req_retry()
285 if (req->retry) { in scsi_dma_restart_req()
286 req->retry = false; in scsi_dma_restart_req()
287 switch (req->cmd.mode) { in scsi_dma_restart_req()
322 if (d && d->lun == lun) { in scsi_bus_is_address_free()
339 if (dev->channel > bus->info->max_channel) { in scsi_bus_check_address()
340 error_setg(errp, "bad scsi channel id: %d", dev->channel); in scsi_bus_check_address()
343 if (dev->id != -1 && dev->id > bus->info->max_target) { in scsi_bus_check_address()
344 error_setg(errp, "bad scsi device id: %d", dev->id); in scsi_bus_check_address()
347 if (dev->lun != -1 && dev->lun > bus->info->max_lun) { in scsi_bus_check_address()
348 error_setg(errp, "bad scsi device lun: %d", dev->lun); in scsi_bus_check_address()
352 if (dev->id != -1 && dev->lun != -1) { in scsi_bus_check_address()
354 if (!scsi_bus_is_address_free(bus, dev->channel, dev->id, dev->lun, &d)) { in scsi_bus_check_address()
355 error_setg(errp, "lun already used by '%s'", d->qdev.id); in scsi_bus_check_address()
366 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus); in scsi_qdev_realize()
370 if (dev->id == -1) { in scsi_qdev_realize()
371 int id = -1; in scsi_qdev_realize()
372 if (dev->lun == -1) { in scsi_qdev_realize()
373 dev->lun = 0; in scsi_qdev_realize()
376 is_free = scsi_bus_is_address_free(bus, dev->channel, ++id, dev->lun, NULL); in scsi_qdev_realize()
377 } while (!is_free && id < bus->info->max_target); in scsi_qdev_realize()
382 dev->id = id; in scsi_qdev_realize()
383 } else if (dev->lun == -1) { in scsi_qdev_realize()
384 int lun = -1; in scsi_qdev_realize()
386 is_free = scsi_bus_is_address_free(bus, dev->channel, dev->id, ++lun, NULL); in scsi_qdev_realize()
387 } while (!is_free && lun < bus->info->max_lun); in scsi_qdev_realize()
392 dev->lun = lun; in scsi_qdev_realize()
395 qemu_mutex_init(&dev->requests_lock); in scsi_qdev_realize()
396 QTAILQ_INIT(&dev->requests); in scsi_qdev_realize()
402 dev->vmsentry = qdev_add_vm_change_state_handler(DEVICE(dev), in scsi_qdev_realize()
410 if (dev->vmsentry) { in scsi_qdev_unrealize()
411 qemu_del_vm_change_state_handler(dev->vmsentry); in scsi_qdev_unrealize()
416 qemu_mutex_destroy(&dev->requests_lock); in scsi_qdev_unrealize()
420 blockdev_mark_auto_del(dev->conf.blk); in scsi_qdev_unrealize()
423 /* handle legacy '-drive if=scsi,...' cmd line args */
436 driver = "scsi-generic"; in scsi_bus_legacy_add_drive()
439 if (dinfo && dinfo->media_cd) { in scsi_bus_legacy_add_drive()
440 driver = "scsi-cd"; in scsi_bus_legacy_add_drive()
442 driver = "scsi-hd"; in scsi_bus_legacy_add_drive()
451 s->conf = *conf; in scsi_bus_legacy_add_drive()
453 check_boot_index(conf->bootindex, &local_err); in scsi_bus_legacy_add_drive()
459 add_boot_device_path(conf->bootindex, dev, NULL); in scsi_bus_legacy_add_drive()
461 qdev_prop_set_uint32(dev, "scsi-id", unit); in scsi_bus_legacy_add_drive()
473 if (!qdev_realize_and_unref(dev, &bus->qbus, errp)) { in scsi_bus_legacy_add_drive()
486 .bootindex = -1, in scsi_bus_legacy_handle_cmdline()
493 for (unit = 0; unit <= bus->info->max_target; unit++) { in scsi_bus_legacy_handle_cmdline()
494 dinfo = drive_get(IF_SCSI, bus->busnr, unit); in scsi_bus_legacy_handle_cmdline()
498 qemu_opts_loc_restore(dinfo->opts); in scsi_bus_legacy_handle_cmdline()
537 if (req->dev->unit_attention.key == UNIT_ATTENTION) { in scsi_fetch_unit_attention_sense()
538 ua = &req->dev->unit_attention; in scsi_fetch_unit_attention_sense()
539 } else if (req->bus->unit_attention.key == UNIT_ATTENTION) { in scsi_fetch_unit_attention_sense()
540 ua = &req->bus->unit_attention; in scsi_fetch_unit_attention_sense()
598 if (r->req.cmd.xfer < 16) { in scsi_target_emulate_report_luns()
601 if (r->req.cmd.buf[2] > 2) { in scsi_target_emulate_report_luns()
608 channel = r->req.dev->channel; in scsi_target_emulate_report_luns()
609 id = r->req.dev->id; in scsi_target_emulate_report_luns()
620 QTAILQ_FOREACH_RCU(kid, &r->req.bus->qbus.children, sibling) { in scsi_target_emulate_report_luns()
621 DeviceState *qdev = kid->child; in scsi_target_emulate_report_luns()
624 if (dev->channel == channel && dev->id == id && dev->lun != 0 && in scsi_target_emulate_report_luns()
625 qdev_is_realized(&dev->qdev)) { in scsi_target_emulate_report_luns()
626 store_lun(tmp, dev->lun); in scsi_target_emulate_report_luns()
633 r->buf_len = len; in scsi_target_emulate_report_luns()
634 r->buf = g_byte_array_free(buf, FALSE); in scsi_target_emulate_report_luns()
635 r->len = MIN(len, r->req.cmd.xfer & ~7); in scsi_target_emulate_report_luns()
637 /* store the LUN list length */ in scsi_target_emulate_report_luns()
638 stl_be_p(&r->buf[0], len - 8); in scsi_target_emulate_report_luns()
645 scsi_clear_reported_luns_changed(&r->req); in scsi_target_emulate_report_luns()
652 assert(r->req.dev->lun != r->req.lun); in scsi_target_emulate_inquiry()
654 scsi_target_alloc_buf(&r->req, SCSI_INQUIRY_LEN); in scsi_target_emulate_inquiry()
656 if (r->req.cmd.buf[1] & 0x2) { in scsi_target_emulate_inquiry()
657 /* Command support data - optional, not implemented */ in scsi_target_emulate_inquiry()
661 if (r->req.cmd.buf[1] & 0x1) { in scsi_target_emulate_inquiry()
663 uint8_t page_code = r->req.cmd.buf[2]; in scsi_target_emulate_inquiry()
664 r->buf[r->len++] = page_code ; /* this page */ in scsi_target_emulate_inquiry()
665 r->buf[r->len++] = 0x00; in scsi_target_emulate_inquiry()
671 pages = r->len++; in scsi_target_emulate_inquiry()
672 r->buf[r->len++] = 0x00; /* list of supported pages (this page) */ in scsi_target_emulate_inquiry()
673 r->buf[pages] = r->len - pages - 1; /* number of pages */ in scsi_target_emulate_inquiry()
680 assert(r->len < r->buf_len); in scsi_target_emulate_inquiry()
681 r->len = MIN(r->req.cmd.xfer, r->len); in scsi_target_emulate_inquiry()
686 if (r->req.cmd.buf[2] != 0) { in scsi_target_emulate_inquiry()
691 r->len = MIN(r->req.cmd.xfer, SCSI_INQUIRY_LEN); in scsi_target_emulate_inquiry()
692 memset(r->buf, 0, r->len); in scsi_target_emulate_inquiry()
693 if (r->req.lun != 0) { in scsi_target_emulate_inquiry()
694 r->buf[0] = TYPE_NO_LUN; in scsi_target_emulate_inquiry()
696 r->buf[0] = TYPE_NOT_PRESENT | TYPE_INACTIVE; in scsi_target_emulate_inquiry()
697 r->buf[2] = 5; /* Version */ in scsi_target_emulate_inquiry()
698 r->buf[3] = 2 | 0x10; /* HiSup, response data format */ in scsi_target_emulate_inquiry()
699 r->buf[4] = r->len - 5; /* Additional Length = (Len - 1) - 4 */ in scsi_target_emulate_inquiry()
700 r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ. */ in scsi_target_emulate_inquiry()
701 memcpy(&r->buf[8], "QEMU ", 8); in scsi_target_emulate_inquiry()
702 memcpy(&r->buf[16], "QEMU TARGET ", 16); in scsi_target_emulate_inquiry()
703 pstrcpy((char *) &r->buf[32], 4, qemu_hw_version()); in scsi_target_emulate_inquiry()
710 if (req->dev->type == TYPE_SCANNER) in scsi_sense_len()
719 int fixed_sense = (req->cmd.buf[1] & 1) == 0; in scsi_target_send_command()
721 if (req->lun != 0 && in scsi_target_send_command()
739 scsi_target_alloc_buf(&r->req, scsi_sense_len(req)); in scsi_target_send_command()
740 if (req->lun != 0) { in scsi_target_send_command()
743 r->len = scsi_build_sense_buf(r->buf, req->cmd.xfer, in scsi_target_send_command()
746 r->len = scsi_device_get_sense(r->req.dev, r->buf, in scsi_target_send_command()
747 MIN(req->cmd.xfer, r->buf_len), in scsi_target_send_command()
750 if (r->req.dev->sense_is_ua) { in scsi_target_send_command()
751 scsi_device_unit_attention_reported(req->dev); in scsi_target_send_command()
752 r->req.dev->sense_len = 0; in scsi_target_send_command()
753 r->req.dev->sense_is_ua = false; in scsi_target_send_command()
768 if (!r->len) { in scsi_target_send_command()
771 return r->len; in scsi_target_send_command()
779 n = r->len; in scsi_target_read_data()
781 r->len = 0; in scsi_target_read_data()
782 scsi_req_data(&r->req, n); in scsi_target_read_data()
784 scsi_req_complete(&r->req, GOOD); in scsi_target_read_data()
792 return r->buf; in scsi_target_get_buf()
799 r->buf = g_malloc(len); in scsi_target_alloc_buf()
800 r->buf_len = len; in scsi_target_alloc_buf()
802 return r->buf; in scsi_target_alloc_buf()
809 g_free(r->buf); in scsi_target_free_buf()
828 + sizeof(req->sense); in scsi_req_alloc()
830 req = g_malloc(reqops->size); in scsi_req_alloc()
831 memset((uint8_t *)req + memset_off, 0, reqops->size - memset_off); in scsi_req_alloc()
832 req->refcount = 1; in scsi_req_alloc()
833 req->bus = bus; in scsi_req_alloc()
834 req->dev = d; in scsi_req_alloc()
835 req->tag = tag; in scsi_req_alloc()
836 req->lun = lun; in scsi_req_alloc()
837 req->hba_private = hba_private; in scsi_req_alloc()
838 req->status = -1; in scsi_req_alloc()
839 req->host_status = -1; in scsi_req_alloc()
840 req->ops = reqops; in scsi_req_alloc()
842 object_ref(OBJECT(qbus->parent)); in scsi_req_alloc()
843 notifier_list_init(&req->cancel_notifiers); in scsi_req_alloc()
845 if (reqops->init_req) { in scsi_req_alloc()
846 reqops->init_req(req); in scsi_req_alloc()
849 trace_scsi_req_alloc(req->dev->id, req->lun, req->tag); in scsi_req_alloc()
856 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus); in scsi_req_new()
864 trace_scsi_req_parse_bad(d->id, lun, tag, 0); in scsi_req_new()
868 if ((d->unit_attention.key == UNIT_ATTENTION || in scsi_req_new()
869 bus->unit_attention.key == UNIT_ATTENTION) && in scsi_req_new()
879 !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) { in scsi_req_new()
881 } else if (lun != d->lun || in scsi_req_new()
883 (buf[0] == REQUEST_SENSE && d->sense_len)) { in scsi_req_new()
889 if (ops != NULL || !sc->parse_cdb) { in scsi_req_new()
892 ret = sc->parse_cdb(d, &cmd, buf, buf_len, hba_private); in scsi_req_new()
896 trace_scsi_req_parse_bad(d->id, lun, tag, buf[0]); in scsi_req_new()
901 trace_scsi_req_parsed(d->id, lun, tag, buf[0], in scsi_req_new()
903 if (cmd.lba != -1) { in scsi_req_new()
904 trace_scsi_req_parsed_lba(d->id, lun, tag, buf[0], in scsi_req_new()
917 req->ctx = qemu_get_current_aio_context(); in scsi_req_new()
918 req->cmd = cmd; in scsi_req_new()
919 req->residual = req->cmd.xfer; in scsi_req_new()
923 trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]); in scsi_req_new()
926 trace_scsi_test_unit_ready(d->id, lun, tag); in scsi_req_new()
929 trace_scsi_report_luns(d->id, lun, tag); in scsi_req_new()
932 trace_scsi_request_sense(d->id, lun, tag); in scsi_req_new()
943 return req->ops->get_buf(req); in scsi_req_get_buf()
950 if (req->dev->unit_attention.key == UNIT_ATTENTION) { in scsi_clear_reported_luns_changed()
951 ua = &req->dev->unit_attention; in scsi_clear_reported_luns_changed()
952 } else if (req->bus->unit_attention.key == UNIT_ATTENTION) { in scsi_clear_reported_luns_changed()
953 ua = &req->bus->unit_attention; in scsi_clear_reported_luns_changed()
958 if (ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc && in scsi_clear_reported_luns_changed()
959 ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq) { in scsi_clear_reported_luns_changed()
969 if (!req->sense_len) { in scsi_req_get_sense()
973 ret = scsi_convert_sense(req->sense, req->sense_len, buf, len, true); in scsi_req_get_sense()
978 * (SAM-5, 5.14). in scsi_req_get_sense()
984 if (req->dev->sense_is_ua) { in scsi_req_get_sense()
985 scsi_device_unit_attention_reported(req->dev); in scsi_req_get_sense()
986 req->dev->sense_len = 0; in scsi_req_get_sense()
987 req->dev->sense_is_ua = false; in scsi_req_get_sense()
992 int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed) in scsi_device_get_sense() argument
994 return scsi_convert_sense(dev->sense, dev->sense_len, buf, len, fixed); in scsi_device_get_sense()
999 trace_scsi_req_build_sense(req->dev->id, req->lun, req->tag, in scsi_req_build_sense()
1001 req->sense_len = scsi_build_sense(req->sense, sense); in scsi_req_build_sense()
1006 assert(!req->enqueued); in scsi_req_enqueue_internal()
1008 if (req->bus->info->get_sg_list) { in scsi_req_enqueue_internal()
1009 req->sg = req->bus->info->get_sg_list(req); in scsi_req_enqueue_internal()
1011 req->sg = NULL; in scsi_req_enqueue_internal()
1013 req->enqueued = true; in scsi_req_enqueue_internal()
1015 WITH_QEMU_LOCK_GUARD(&req->dev->requests_lock) { in scsi_req_enqueue_internal()
1016 QTAILQ_INSERT_TAIL(&req->dev->requests, req, next); in scsi_req_enqueue_internal()
1024 assert(!req->retry); in scsi_req_enqueue()
1027 rc = req->ops->send_command(req, req->cmd.buf); in scsi_req_enqueue()
1034 trace_scsi_req_dequeue(req->dev->id, req->lun, req->tag); in scsi_req_dequeue()
1035 req->retry = false; in scsi_req_dequeue()
1036 if (req->enqueued) { in scsi_req_dequeue()
1037 WITH_QEMU_LOCK_GUARD(&req->dev->requests_lock) { in scsi_req_dequeue()
1038 QTAILQ_REMOVE(&req->dev->requests, req, next); in scsi_req_dequeue()
1040 req->enqueued = false; in scsi_req_dequeue()
1047 /* MMC-6, paragraph 6.7. */ in scsi_get_performance_length()
1051 /* Each descriptor is as in Table 295 - Nominal performance. */ in scsi_get_performance_length()
1054 /* Each descriptor is as in Table 296 - Exceptions. */ in scsi_get_performance_length()
1078 xfer_unit = dev->blocksize; in ata_passthrough_xfer_unit()
1091 int length = buf[2] & 0x3; in ata_passthrough_12_xfer() local
1095 switch (length) { in ata_passthrough_12_xfer()
1097 case 3: /* USB-specific. */ in ata_passthrough_12_xfer()
1115 int length = buf[2] & 0x3; in ata_passthrough_16_xfer() local
1119 switch (length) { in ata_passthrough_16_xfer()
1121 case 3: /* USB-specific. */ in ata_passthrough_16_xfer()
1140 cmd->xfer = scsi_cdb_xfer(buf); in scsi_req_xfer()
1167 cmd->xfer = 0; in scsi_req_xfer()
1173 cmd->xfer = 0; in scsi_req_xfer()
1175 cmd->xfer = 1; in scsi_req_xfer()
1177 cmd->xfer *= dev->blocksize; in scsi_req_xfer()
1183 cmd->xfer = buf[1] & 1 ? 0 : dev->blocksize; in scsi_req_xfer()
1186 cmd->xfer = 8; in scsi_req_xfer()
1189 cmd->xfer = 6; in scsi_req_xfer()
1193 if (dev->type == TYPE_ROM) { in scsi_req_xfer()
1194 cmd->xfer = buf[10] | (buf[9] << 8); in scsi_req_xfer()
1196 cmd->xfer = buf[9] | (buf[8] << 8); in scsi_req_xfer()
1200 /* length 0 means 256 blocks */ in scsi_req_xfer()
1201 if (cmd->xfer == 0) { in scsi_req_xfer()
1202 cmd->xfer = 256; in scsi_req_xfer()
1211 cmd->xfer *= dev->blocksize; in scsi_req_xfer()
1215 /* length 0 means 256 blocks */ in scsi_req_xfer()
1216 if (cmd->xfer == 0) { in scsi_req_xfer()
1217 cmd->xfer = 256; in scsi_req_xfer()
1223 cmd->xfer *= dev->blocksize; in scsi_req_xfer()
1226 /* MMC mandates the parameter list to be 12-bytes long. Parameters in scsi_req_xfer()
1228 if (dev->type == TYPE_ROM && (buf[1] & 16)) { in scsi_req_xfer()
1229 cmd->xfer = 12; in scsi_req_xfer()
1231 cmd->xfer = (buf[1] & 16) == 0 ? 0 : (buf[1] & 32 ? 8 : 4); in scsi_req_xfer()
1237 cmd->xfer = buf[4] | (buf[3] << 8); in scsi_req_xfer()
1243 cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16); in scsi_req_xfer()
1246 cmd->xfer = ldl_be_p(&buf[5]) & 0xffffffffULL; in scsi_req_xfer()
1249 if (dev->type == TYPE_ROM) { in scsi_req_xfer()
1251 cmd->xfer = scsi_get_performance_length(buf[9] | (buf[8] << 8), in scsi_req_xfer()
1260 if (dev->type == TYPE_ROM) { in scsi_req_xfer()
1262 cmd->xfer = buf[9] | (buf[8] << 8); in scsi_req_xfer()
1266 if (dev->type == TYPE_ROM) { in scsi_req_xfer()
1268 cmd->xfer = 0; in scsi_req_xfer()
1270 cmd->xfer = ata_passthrough_12_xfer(dev, buf); in scsi_req_xfer()
1274 cmd->xfer = ata_passthrough_16_xfer(dev, buf); in scsi_req_xfer()
1286 cmd->xfer = 0; in scsi_req_stream_xfer()
1292 cmd->xfer = buf[4] | (buf[3] << 8) | (buf[2] << 16); in scsi_req_stream_xfer()
1293 if (buf[1] & 0x01) { /* fixed */ in scsi_req_stream_xfer()
1294 cmd->xfer *= dev->blocksize; in scsi_req_stream_xfer()
1301 cmd->xfer = buf[14] | (buf[13] << 8) | (buf[12] << 16); in scsi_req_stream_xfer()
1302 if (buf[1] & 0x01) { /* fixed */ in scsi_req_stream_xfer()
1303 cmd->xfer *= dev->blocksize; in scsi_req_stream_xfer()
1308 cmd->xfer = 0; in scsi_req_stream_xfer()
1311 cmd->xfer = buf[13] | (buf[12] << 8); in scsi_req_stream_xfer()
1317 cmd->xfer = 20; in scsi_req_stream_xfer()
1320 cmd->xfer = 32; in scsi_req_stream_xfer()
1323 cmd->xfer = buf[8] | (buf[7] << 8); in scsi_req_stream_xfer()
1326 return -1; in scsi_req_stream_xfer()
1331 cmd->xfer = buf[4] | (buf[3] << 8); in scsi_req_stream_xfer()
1349 cmd->xfer = 0; in scsi_req_medium_changer_xfer()
1352 cmd->xfer = buf[9] | (buf[8] << 8) | (buf[7] << 16); in scsi_req_medium_changer_xfer()
1367 cmd->xfer = 0; in scsi_req_scanner_length()
1370 cmd->xfer = buf[4]; in scsi_req_scanner_length()
1376 cmd->xfer = buf[8] | (buf[7] << 8) | (buf[6] << 16); in scsi_req_scanner_length()
1388 if (!cmd->xfer) { in scsi_cmd_xfer_mode()
1389 cmd->mode = SCSI_XFER_NONE; in scsi_cmd_xfer_mode()
1392 switch (cmd->buf[0]) { in scsi_cmd_xfer_mode()
1433 /* SCAN conflicts with START_STOP. START_STOP has cmd->xfer set to 0 for in scsi_cmd_xfer_mode()
1434 * non-scanner devices, so we only get here for SCAN and not for START_STOP. in scsi_cmd_xfer_mode()
1436 cmd->mode = SCSI_XFER_TO_DEV; in scsi_cmd_xfer_mode()
1441 cmd->mode = (cmd->buf[2] & 0x8) ? in scsi_cmd_xfer_mode()
1445 cmd->mode = SCSI_XFER_FROM_DEV; in scsi_cmd_xfer_mode()
1456 cmd->lba = -1; in scsi_req_parse_cdb()
1459 return -1; in scsi_req_parse_cdb()
1462 cmd->len = len; in scsi_req_parse_cdb()
1463 switch (dev->type) { in scsi_req_parse_cdb()
1481 memcpy(cmd->buf, buf, cmd->len); in scsi_req_parse_cdb()
1483 cmd->lba = scsi_cmd_lba(cmd); in scsi_req_parse_cdb()
1489 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, dev->qdev.parent_bus); in scsi_device_report_change()
1492 if (bus->info->change) { in scsi_device_report_change()
1493 bus->info->change(bus, dev, sense); in scsi_device_report_change()
1499 assert(req->refcount > 0); in scsi_req_ref()
1500 req->refcount++; in scsi_req_ref()
1506 assert(req->refcount > 0); in scsi_req_unref()
1507 if (--req->refcount == 0) { in scsi_req_unref()
1508 BusState *qbus = req->dev->qdev.parent_bus; in scsi_req_unref()
1511 if (bus->info->free_request && req->hba_private) { in scsi_req_unref()
1512 bus->info->free_request(bus, req->hba_private); in scsi_req_unref()
1514 if (req->ops->free_req) { in scsi_req_unref()
1515 req->ops->free_req(req); in scsi_req_unref()
1517 object_unref(OBJECT(req->dev)); in scsi_req_unref()
1518 object_unref(OBJECT(qbus->parent)); in scsi_req_unref()
1527 if (req->io_canceled) { in scsi_req_continue()
1528 trace_scsi_req_continue_canceled(req->dev->id, req->lun, req->tag); in scsi_req_continue()
1531 trace_scsi_req_continue(req->dev->id, req->lun, req->tag); in scsi_req_continue()
1532 if (req->cmd.mode == SCSI_XFER_TO_DEV) { in scsi_req_continue()
1533 req->ops->write_data(req); in scsi_req_continue()
1535 req->ops->read_data(req); in scsi_req_continue()
1545 if (req->io_canceled) { in scsi_req_data()
1546 trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len); in scsi_req_data()
1549 trace_scsi_req_data(req->dev->id, req->lun, req->tag, len); in scsi_req_data()
1550 assert(req->cmd.mode != SCSI_XFER_NONE); in scsi_req_data()
1551 if (!req->sg) { in scsi_req_data()
1552 req->residual -= len; in scsi_req_data()
1553 req->bus->info->transfer_data(req, len); in scsi_req_data()
1560 assert(!req->dma_started); in scsi_req_data()
1561 req->dma_started = true; in scsi_req_data()
1564 if (req->cmd.mode == SCSI_XFER_FROM_DEV) { in scsi_req_data()
1565 dma_buf_read(buf, len, &req->residual, req->sg, in scsi_req_data()
1568 dma_buf_write(buf, len, &req->residual, req->sg, in scsi_req_data()
1580 req->dev->qdev.parent_bus->name, in scsi_req_print()
1581 req->dev->id, in scsi_req_print()
1582 scsi_command_name(req->cmd.buf[0])); in scsi_req_print()
1583 for (i = 1; i < req->cmd.len; i++) { in scsi_req_print()
1584 fprintf(fp, " 0x%02x", req->cmd.buf[i]); in scsi_req_print()
1586 switch (req->cmd.mode) { in scsi_req_print()
1588 fprintf(fp, " - none\n"); in scsi_req_print()
1591 fprintf(fp, " - from-dev len=%zd\n", req->cmd.xfer); in scsi_req_print()
1594 fprintf(fp, " - to-dev len=%zd\n", req->cmd.xfer); in scsi_req_print()
1597 fprintf(fp, " - Oops\n"); in scsi_req_print()
1607 assert(req->status == -1 && req->host_status == -1); in scsi_req_complete_failed()
1608 assert(req->ops != &reqops_unit_attention); in scsi_req_complete_failed()
1610 if (!req->bus->info->fail) { in scsi_req_complete_failed()
1611 status = scsi_sense_from_host_status(req->host_status, &sense); in scsi_req_complete_failed()
1619 req->host_status = host_status; in scsi_req_complete_failed()
1622 req->bus->info->fail(req); in scsi_req_complete_failed()
1625 notifier_list_notify(&req->cancel_notifiers, req); in scsi_req_complete_failed()
1631 assert(req->status == -1 && req->host_status == -1); in scsi_req_complete()
1632 req->status = status; in scsi_req_complete()
1633 req->host_status = SCSI_HOST_OK; in scsi_req_complete()
1635 assert(req->sense_len <= sizeof(req->sense)); in scsi_req_complete()
1637 req->sense_len = 0; in scsi_req_complete()
1640 if (req->sense_len) { in scsi_req_complete()
1641 memcpy(req->dev->sense, req->sense, req->sense_len); in scsi_req_complete()
1642 req->dev->sense_len = req->sense_len; in scsi_req_complete()
1643 req->dev->sense_is_ua = (req->ops == &reqops_unit_attention); in scsi_req_complete()
1645 req->dev->sense_len = 0; in scsi_req_complete()
1646 req->dev->sense_is_ua = false; in scsi_req_complete()
1651 req->bus->info->complete(req, req->residual); in scsi_req_complete()
1654 notifier_list_notify(&req->cancel_notifiers, req); in scsi_req_complete()
1661 assert(req->io_canceled); in scsi_req_cancel_complete()
1662 if (req->bus->info->cancel) { in scsi_req_cancel_complete()
1663 req->bus->info->cancel(req); in scsi_req_cancel_complete()
1665 notifier_list_notify(&req->cancel_notifiers, req); in scsi_req_cancel_complete()
1675 trace_scsi_req_cancel(req->dev->id, req->lun, req->tag); in scsi_req_cancel_async()
1677 notifier_list_add(&req->cancel_notifiers, notifier); in scsi_req_cancel_async()
1679 if (req->io_canceled) { in scsi_req_cancel_async()
1684 assert(req->aiocb); in scsi_req_cancel_async()
1690 req->io_canceled = true; in scsi_req_cancel_async()
1691 if (req->aiocb) { in scsi_req_cancel_async()
1692 blk_aio_cancel_async(req->aiocb); in scsi_req_cancel_async()
1700 trace_scsi_req_cancel(req->dev->id, req->lun, req->tag); in scsi_req_cancel()
1701 if (!req->enqueued) { in scsi_req_cancel()
1704 assert(!req->io_canceled); in scsi_req_cancel()
1708 req->io_canceled = true; in scsi_req_cancel()
1709 if (req->aiocb) { in scsi_req_cancel()
1710 blk_aio_cancel(req->aiocb); in scsi_req_cancel()
1753 * Override a pre-existing unit attention condition, except for a more in scsi_bus_set_ua()
1756 prec1 = scsi_ua_precedence(bus->unit_attention); in scsi_bus_set_ua()
1759 bus->unit_attention = sense; in scsi_bus_set_ua()
1769 trace_scsi_device_set_ua(sdev->id, sdev->lun, sense.key, in scsi_device_set_ua()
1773 * Override a pre-existing unit attention condition, except for a more in scsi_device_set_ua()
1776 prec1 = scsi_ua_precedence(sdev->unit_attention); in scsi_device_set_ua()
1779 sdev->unit_attention = sense; in scsi_device_set_ua()
1800 blk_drain(sdev->conf.blk); in scsi_device_purge_requests()
1807 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, sdev->qdev.parent_bus); in scsi_device_drained_begin()
1813 assert(bus->drain_count < INT_MAX); in scsi_device_drained_begin()
1819 if (bus->drain_count++ == 0) { in scsi_device_drained_begin()
1821 if (bus->info->drained_begin) { in scsi_device_drained_begin()
1822 bus->info->drained_begin(bus); in scsi_device_drained_begin()
1829 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, sdev->qdev.parent_bus); in scsi_device_drained_end()
1835 assert(bus->drain_count > 0); in scsi_device_drained_end()
1837 if (bus->drain_count-- == 1) { in scsi_device_drained_end()
1839 if (bus->info->drained_end) { in scsi_device_drained_end()
1840 bus->info->drained_end(bus); in scsi_device_drained_end()
1848 DeviceState *hba = dev->parent_bus->parent; in scsibus_get_dev_path()
1854 path = g_strdup_printf("%s/%d:%d:%d", id, d->channel, d->id, d->lun); in scsibus_get_dev_path()
1856 path = g_strdup_printf("%d:%d:%d", d->channel, d->id, d->lun); in scsibus_get_dev_path()
1865 return g_strdup_printf("channel@%x/%s@%x,%x", d->channel, in scsibus_get_fw_dev_path()
1866 qdev_fw_name(dev), d->id, d->lun); in scsibus_get_fw_dev_path()
1875 assert(!req->io_canceled); in put_scsi_req()
1876 assert(req->status == -1 && req->host_status == -1); in put_scsi_req()
1877 assert(req->enqueued); in put_scsi_req()
1879 qemu_put_sbyte(f, req->retry ? 1 : 2); in put_scsi_req()
1880 qemu_put_buffer(f, req->cmd.buf, sizeof(req->cmd.buf)); in put_scsi_req()
1881 qemu_put_be32s(f, &req->tag); in put_scsi_req()
1882 qemu_put_be32s(f, &req->lun); in put_scsi_req()
1883 if (req->bus->info->save_request) { in put_scsi_req()
1884 req->bus->info->save_request(f, req); in put_scsi_req()
1886 if (req->ops->save_request) { in put_scsi_req()
1887 req->ops->save_request(f, req); in put_scsi_req()
1905 SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, s->qdev.parent_bus); in get_scsi_requests()
1918 * A too-short CDB would have been rejected by scsi_req_new, so just use in get_scsi_requests()
1919 * SCSI_CMD_BUF_SIZE as the CDB length. in get_scsi_requests()
1922 req->retry = (sbyte == 1); in get_scsi_requests()
1923 if (bus->info->load_request) { in get_scsi_requests()
1924 req->hba_private = bus->info->load_request(f, req); in get_scsi_requests()
1926 if (req->ops->load_request) { in get_scsi_requests()
1927 req->ops->load_request(f, req); in get_scsi_requests()
1945 .name = "scsi-requests",
1954 return s->sense_len > SCSI_SENSE_BUF_SIZE_OLD; in scsi_sense_state_needed()
1965 SCSI_SENSE_BUF_SIZE - SCSI_SENSE_BUF_SIZE_OLD),
2000 DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
2001 DEFINE_PROP_UINT32("lun", SCSIDevice, lun, -1),
2007 set_bit(DEVICE_CATEGORY_STORAGE, k->categories); in scsi_device_class_init()
2008 k->bus_type = TYPE_SCSI_BUS; in scsi_device_class_init()
2009 k->realize = scsi_qdev_realize; in scsi_device_class_init()
2010 k->unrealize = scsi_qdev_unrealize; in scsi_device_class_init()
2018 device_add_bootindex_property(obj, &s->conf.bootindex, in scsi_dev_instance_init()
2020 &s->qdev); in scsi_dev_instance_init()
2038 k->get_dev_path = scsibus_get_dev_path; in scsi_bus_class_init()
2039 k->get_fw_dev_path = scsibus_get_fw_dev_path; in scsi_bus_class_init()
2040 k->check_address = scsi_bus_check_address; in scsi_bus_class_init()
2041 hc->unplug = qdev_simple_device_unplug_cb; in scsi_bus_class_init()