2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
7 * Written by Paul Brook
9 * 2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10 * when the allocation length of CDB is smaller
12 * 2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
13 * MODE SENSE response.
15 * This code is licensed under the LGPL.
17 * Note that this file only handles the SCSI architecture model and device
18 * commands. Emulation of interface/link layer protocols is handled by
19 * the host adapter emulator.
25 #define DPRINTF(fmt, ...) \
26 do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
28 #define DPRINTF(fmt, ...) do {} while(0)
31 #define BADF(fmt, ...) \
32 do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
34 #include "qemu-common.h"
35 #include "qemu-error.h"
37 #include "scsi-defs.h"
40 #include "block_int.h"
46 #define SCSI_DMA_BUF_SIZE 131072
47 #define SCSI_MAX_INQUIRY_LEN 256
49 typedef struct SCSIDiskState SCSIDiskState;
51 typedef struct SCSIDiskReq {
53 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
55 uint32_t sector_count;
76 static int scsi_handle_rw_error(SCSIDiskReq *r, int error);
78 static void scsi_free_request(SCSIRequest *req)
80 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
82 if (r->iov.iov_base) {
83 qemu_vfree(r->iov.iov_base);
87 /* Helper function for command completion with sense. */
88 static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
90 DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
91 r->req.tag, sense.key, sense.asc, sense.ascq);
92 scsi_req_build_sense(&r->req, sense);
93 scsi_req_complete(&r->req, CHECK_CONDITION);
96 /* Cancel a pending data transfer. */
97 static void scsi_cancel_io(SCSIRequest *req)
99 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
101 DPRINTF("Cancel tag=0x%x\n", req->tag);
103 bdrv_aio_cancel(r->req.aiocb);
105 /* This reference was left in by scsi_*_data. We take ownership of
106 * it the moment scsi_req_cancel is called, independent of whether
107 * bdrv_aio_cancel completes the request or not. */
108 scsi_req_unref(&r->req);
113 static uint32_t scsi_init_iovec(SCSIDiskReq *r)
115 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
117 if (!r->iov.iov_base) {
118 r->buflen = SCSI_DMA_BUF_SIZE;
119 r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
121 r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
122 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
123 return r->qiov.size / 512;
126 static void scsi_read_complete(void * opaque, int ret)
128 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
129 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
132 if (r->req.aiocb != NULL) {
134 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
138 if (scsi_handle_rw_error(r, -ret)) {
143 DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->qiov.size);
145 n = r->qiov.size / 512;
147 r->sector_count -= n;
148 scsi_req_data(&r->req, r->qiov.size);
151 if (!r->req.io_canceled) {
152 scsi_req_unref(&r->req);
156 static void scsi_flush_complete(void * opaque, int ret)
158 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
159 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
161 if (r->req.aiocb != NULL) {
163 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
167 if (scsi_handle_rw_error(r, -ret)) {
172 scsi_req_complete(&r->req, GOOD);
175 if (!r->req.io_canceled) {
176 scsi_req_unref(&r->req);
180 /* Read more data from scsi device into buffer. */
181 static void scsi_read_data(SCSIRequest *req)
183 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
184 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
187 if (r->sector_count == (uint32_t)-1) {
188 DPRINTF("Read buf_len=%zd\n", r->iov.iov_len);
190 scsi_req_data(&r->req, r->iov.iov_len);
193 DPRINTF("Read sector_count=%d\n", r->sector_count);
194 if (r->sector_count == 0) {
195 /* This also clears the sense buffer for REQUEST SENSE. */
196 scsi_req_complete(&r->req, GOOD);
200 /* No data transfer may already be in progress */
201 assert(r->req.aiocb == NULL);
203 /* The request is used as the AIO opaque value, so add a ref. */
204 scsi_req_ref(&r->req);
205 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
206 DPRINTF("Data transfer direction invalid\n");
207 scsi_read_complete(r, -EINVAL);
212 scsi_read_complete(r, -ENOMEDIUM);
216 n = scsi_init_iovec(r);
217 bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
218 r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
219 scsi_read_complete, r);
220 if (r->req.aiocb == NULL) {
221 scsi_read_complete(r, -EIO);
226 * scsi_handle_rw_error has two return values. 0 means that the error
227 * must be ignored, 1 means that the error has been processed and the
228 * caller should not do anything else for this request. Note that
229 * scsi_handle_rw_error always manages its reference counts, independent
230 * of the return value.
232 static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
234 int is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
235 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
236 BlockErrorAction action = bdrv_get_on_error(s->qdev.conf.bs, is_read);
238 if (action == BLOCK_ERR_IGNORE) {
239 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_IGNORE, is_read);
243 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
244 || action == BLOCK_ERR_STOP_ANY) {
246 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_STOP, is_read);
247 vm_stop(RUN_STATE_IO_ERROR);
248 bdrv_iostatus_set_err(s->qdev.conf.bs, error);
249 scsi_req_retry(&r->req);
253 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
256 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
259 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
262 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
265 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_REPORT, is_read);
270 static void scsi_write_complete(void * opaque, int ret)
272 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
273 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
276 if (r->req.aiocb != NULL) {
278 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
282 if (scsi_handle_rw_error(r, -ret)) {
287 n = r->qiov.size / 512;
289 r->sector_count -= n;
290 if (r->sector_count == 0) {
291 scsi_req_complete(&r->req, GOOD);
294 DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
295 scsi_req_data(&r->req, r->qiov.size);
299 if (!r->req.io_canceled) {
300 scsi_req_unref(&r->req);
304 static void scsi_write_data(SCSIRequest *req)
306 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
307 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
310 /* No data transfer may already be in progress */
311 assert(r->req.aiocb == NULL);
313 /* The request is used as the AIO opaque value, so add a ref. */
314 scsi_req_ref(&r->req);
315 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
316 DPRINTF("Data transfer direction invalid\n");
317 scsi_write_complete(r, -EINVAL);
321 n = r->qiov.size / 512;
324 scsi_write_complete(r, -ENOMEDIUM);
327 bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
328 r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
329 scsi_write_complete, r);
330 if (r->req.aiocb == NULL) {
331 scsi_write_complete(r, -ENOMEM);
334 /* Called for the first time. Ask the driver to send us more data. */
335 scsi_write_complete(r, 0);
339 /* Return a pointer to the data buffer. */
340 static uint8_t *scsi_get_buf(SCSIRequest *req)
342 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
344 return (uint8_t *)r->iov.iov_base;
347 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
349 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
352 if (req->cmd.buf[1] & 0x2) {
353 /* Command support data - optional, not implemented */
354 BADF("optional INQUIRY command support request not implemented\n");
358 if (req->cmd.buf[1] & 0x1) {
359 /* Vital product data */
360 uint8_t page_code = req->cmd.buf[2];
361 if (req->cmd.xfer < 4) {
362 BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
363 "less than 4\n", page_code, req->cmd.xfer);
367 outbuf[buflen++] = s->qdev.type & 0x1f;
368 outbuf[buflen++] = page_code ; // this page
369 outbuf[buflen++] = 0x00;
372 case 0x00: /* Supported page codes, mandatory */
375 DPRINTF("Inquiry EVPD[Supported pages] "
376 "buffer size %zd\n", req->cmd.xfer);
378 outbuf[buflen++] = 0x00; // list of supported pages (this page)
380 outbuf[buflen++] = 0x80; // unit serial number
382 outbuf[buflen++] = 0x83; // device identification
383 if (s->qdev.type == TYPE_DISK) {
384 outbuf[buflen++] = 0xb0; // block limits
385 outbuf[buflen++] = 0xb2; // thin provisioning
387 outbuf[pages] = buflen - pages - 1; // number of pages
390 case 0x80: /* Device serial number, optional */
395 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
399 l = strlen(s->serial);
400 if (l > req->cmd.xfer) {
407 DPRINTF("Inquiry EVPD[Serial number] "
408 "buffer size %zd\n", req->cmd.xfer);
409 outbuf[buflen++] = l;
410 memcpy(outbuf+buflen, s->serial, l);
415 case 0x83: /* Device identification page, mandatory */
417 int max_len = 255 - 8;
418 int id_len = strlen(bdrv_get_device_name(s->qdev.conf.bs));
420 if (id_len > max_len) {
423 DPRINTF("Inquiry EVPD[Device identification] "
424 "buffer size %zd\n", req->cmd.xfer);
426 outbuf[buflen++] = 4 + id_len;
427 outbuf[buflen++] = 0x2; // ASCII
428 outbuf[buflen++] = 0; // not officially assigned
429 outbuf[buflen++] = 0; // reserved
430 outbuf[buflen++] = id_len; // length of data following
432 memcpy(outbuf+buflen, bdrv_get_device_name(s->qdev.conf.bs), id_len);
436 case 0xb0: /* block limits */
438 unsigned int unmap_sectors =
439 s->qdev.conf.discard_granularity / s->qdev.blocksize;
440 unsigned int min_io_size =
441 s->qdev.conf.min_io_size / s->qdev.blocksize;
442 unsigned int opt_io_size =
443 s->qdev.conf.opt_io_size / s->qdev.blocksize;
445 if (s->qdev.type == TYPE_ROM) {
446 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
450 /* required VPD size with unmap support */
451 outbuf[3] = buflen = 0x3c;
453 memset(outbuf + 4, 0, buflen - 4);
455 /* optimal transfer length granularity */
456 outbuf[6] = (min_io_size >> 8) & 0xff;
457 outbuf[7] = min_io_size & 0xff;
459 /* optimal transfer length */
460 outbuf[12] = (opt_io_size >> 24) & 0xff;
461 outbuf[13] = (opt_io_size >> 16) & 0xff;
462 outbuf[14] = (opt_io_size >> 8) & 0xff;
463 outbuf[15] = opt_io_size & 0xff;
465 /* optimal unmap granularity */
466 outbuf[28] = (unmap_sectors >> 24) & 0xff;
467 outbuf[29] = (unmap_sectors >> 16) & 0xff;
468 outbuf[30] = (unmap_sectors >> 8) & 0xff;
469 outbuf[31] = unmap_sectors & 0xff;
472 case 0xb2: /* thin provisioning */
474 outbuf[3] = buflen = 8;
476 outbuf[5] = 0x40; /* write same with unmap supported */
482 BADF("Error: unsupported Inquiry (EVPD[%02X]) "
483 "buffer size %zd\n", page_code, req->cmd.xfer);
490 /* Standard INQUIRY data */
491 if (req->cmd.buf[2] != 0) {
492 BADF("Error: Inquiry (STANDARD) page or code "
493 "is non-zero [%02X]\n", req->cmd.buf[2]);
498 if (req->cmd.xfer < 5) {
499 BADF("Error: Inquiry (STANDARD) buffer size %zd "
500 "is less than 5\n", req->cmd.xfer);
504 buflen = req->cmd.xfer;
505 if (buflen > SCSI_MAX_INQUIRY_LEN) {
506 buflen = SCSI_MAX_INQUIRY_LEN;
508 memset(outbuf, 0, buflen);
510 outbuf[0] = s->qdev.type & 0x1f;
511 outbuf[1] = s->removable ? 0x80 : 0;
512 if (s->qdev.type == TYPE_ROM) {
513 memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
515 memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
517 memcpy(&outbuf[8], "QEMU ", 8);
518 memset(&outbuf[32], 0, 4);
519 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
521 * We claim conformance to SPC-3, which is required for guests
522 * to ask for modern features like READ CAPACITY(16) or the
523 * block characteristics VPD page by default. Not all of SPC-3
524 * is actually implemented, but we're good enough.
527 outbuf[3] = 2; /* Format 2 */
530 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
532 /* If the allocation length of CDB is too small,
533 the additional length is not adjusted */
537 /* Sync data transfer and TCQ. */
538 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
542 static inline bool media_is_dvd(SCSIDiskState *s)
545 if (s->qdev.type != TYPE_ROM) {
548 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
551 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
552 return nb_sectors > CD_MAX_SECTORS;
555 static inline bool media_is_cd(SCSIDiskState *s)
558 if (s->qdev.type != TYPE_ROM) {
561 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
564 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
565 return nb_sectors <= CD_MAX_SECTORS;
568 static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
571 static const int rds_caps_size[5] = {
578 uint8_t media = r->req.cmd.buf[1];
579 uint8_t layer = r->req.cmd.buf[6];
580 uint8_t format = r->req.cmd.buf[7];
583 if (s->qdev.type != TYPE_ROM) {
587 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
591 if (format != 0xff) {
592 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
593 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
596 if (media_is_cd(s)) {
597 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
600 if (format >= ARRAY_SIZE(rds_caps_size)) {
603 size = rds_caps_size[format];
604 memset(outbuf, 0, size);
609 /* Physical format information */
614 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
616 outbuf[4] = 1; /* DVD-ROM, part version 1 */
617 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
618 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
619 outbuf[7] = 0; /* default densities */
621 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
622 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
626 case 0x01: /* DVD copyright information, all zeros */
629 case 0x03: /* BCA information - invalid field for no BCA info */
632 case 0x04: /* DVD disc manufacturing information, all zeros */
635 case 0xff: { /* List capabilities */
638 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
639 if (!rds_caps_size[i]) {
643 outbuf[size + 1] = 0x40; /* Not writable, readable */
644 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
654 /* Size of buffer, not including 2 byte size field */
655 stw_be_p(outbuf, size - 2);
662 static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
664 uint8_t event_code, media_status;
668 media_status = MS_TRAY_OPEN;
669 } else if (bdrv_is_inserted(s->qdev.conf.bs)) {
670 media_status = MS_MEDIA_PRESENT;
673 /* Event notification descriptor */
674 event_code = MEC_NO_CHANGE;
675 if (media_status != MS_TRAY_OPEN) {
676 if (s->media_event) {
677 event_code = MEC_NEW_MEDIA;
678 s->media_event = false;
679 } else if (s->eject_request) {
680 event_code = MEC_EJECT_REQUESTED;
681 s->eject_request = false;
685 outbuf[0] = event_code;
686 outbuf[1] = media_status;
688 /* These fields are reserved, just clear them. */
694 static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
698 uint8_t *buf = r->req.cmd.buf;
699 uint8_t notification_class_request = buf[4];
700 if (s->qdev.type != TYPE_ROM) {
703 if ((buf[1] & 1) == 0) {
709 outbuf[0] = outbuf[1] = 0;
710 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
711 if (notification_class_request & (1 << GESN_MEDIA)) {
712 outbuf[2] = GESN_MEDIA;
713 size += scsi_event_status_media(s, &outbuf[size]);
717 stw_be_p(outbuf, size - 4);
721 static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
725 if (s->qdev.type != TYPE_ROM) {
728 current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM;
729 memset(outbuf, 0, 40);
730 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
731 stw_be_p(&outbuf[6], current);
732 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
733 outbuf[10] = 0x03; /* persistent, current */
734 outbuf[11] = 8; /* two profiles */
735 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
736 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
737 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
738 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
739 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
740 stw_be_p(&outbuf[20], 1);
741 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
743 stl_be_p(&outbuf[24], 1); /* SCSI */
744 outbuf[28] = 1; /* DBE = 1, mandatory */
745 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
746 stw_be_p(&outbuf[32], 3);
747 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
749 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
750 /* TODO: Random readable, CD read, DVD read, drive serial number,
755 static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
757 if (s->qdev.type != TYPE_ROM) {
760 memset(outbuf, 0, 8);
761 outbuf[5] = 1; /* CD-ROM */
765 static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
768 static const int mode_sense_valid[0x3f] = {
769 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
770 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
771 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
772 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
773 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
774 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
777 BlockDriverState *bdrv = s->qdev.conf.bs;
778 int cylinders, heads, secs;
779 uint8_t *p = *p_outbuf;
781 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
788 * If Changeable Values are requested, a mask denoting those mode parameters
789 * that are changeable shall be returned. As we currently don't support
790 * parameter changes via MODE_SELECT all bits are returned set to zero.
791 * The buffer was already menset to zero by the caller of this function.
794 case MODE_PAGE_HD_GEOMETRY:
796 if (page_control == 1) { /* Changeable Values */
799 /* if a geometry hint is available, use it */
800 bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
801 p[2] = (cylinders >> 16) & 0xff;
802 p[3] = (cylinders >> 8) & 0xff;
803 p[4] = cylinders & 0xff;
805 /* Write precomp start cylinder, disabled */
806 p[6] = (cylinders >> 16) & 0xff;
807 p[7] = (cylinders >> 8) & 0xff;
808 p[8] = cylinders & 0xff;
809 /* Reduced current start cylinder, disabled */
810 p[9] = (cylinders >> 16) & 0xff;
811 p[10] = (cylinders >> 8) & 0xff;
812 p[11] = cylinders & 0xff;
813 /* Device step rate [ns], 200ns */
816 /* Landing zone cylinder */
820 /* Medium rotation rate [rpm], 5400 rpm */
821 p[20] = (5400 >> 8) & 0xff;
825 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
827 if (page_control == 1) { /* Changeable Values */
830 /* Transfer rate [kbit/s], 5Mbit/s */
833 /* if a geometry hint is available, use it */
834 bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
837 p[6] = s->qdev.blocksize >> 8;
838 p[8] = (cylinders >> 8) & 0xff;
839 p[9] = cylinders & 0xff;
840 /* Write precomp start cylinder, disabled */
841 p[10] = (cylinders >> 8) & 0xff;
842 p[11] = cylinders & 0xff;
843 /* Reduced current start cylinder, disabled */
844 p[12] = (cylinders >> 8) & 0xff;
845 p[13] = cylinders & 0xff;
846 /* Device step rate [100us], 100us */
849 /* Device step pulse width [us], 1us */
851 /* Device head settle delay [100us], 100us */
854 /* Motor on delay [0.1s], 0.1s */
856 /* Motor off delay [0.1s], 0.1s */
858 /* Medium rotation rate [rpm], 5400 rpm */
859 p[28] = (5400 >> 8) & 0xff;
863 case MODE_PAGE_CACHING:
866 if (page_control == 1) { /* Changeable Values */
869 if (bdrv_enable_write_cache(s->qdev.conf.bs)) {
874 case MODE_PAGE_R_W_ERROR:
876 p[2] = 0x80; /* Automatic Write Reallocation Enabled */
877 if (s->qdev.type == TYPE_ROM) {
878 p[3] = 0x20; /* Read Retry Count */
882 case MODE_PAGE_AUDIO_CTL:
886 case MODE_PAGE_CAPABILITIES:
888 if (page_control == 1) { /* Changeable Values */
892 p[2] = 0x3b; /* CD-R & CD-RW read */
893 p[3] = 0; /* Writing not supported */
894 p[4] = 0x7f; /* Audio, composite, digital out,
895 mode 2 form 1&2, multi session */
896 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
897 RW corrected, C2 errors, ISRC,
899 p[6] = 0x2d | (s->tray_locked ? 2 : 0);
900 /* Locking supported, jumper present, eject, tray */
901 p[7] = 0; /* no volume & mute control, no
903 p[8] = (50 * 176) >> 8; /* 50x read speed */
904 p[9] = (50 * 176) & 0xff;
905 p[10] = 2 >> 8; /* Two volume levels */
907 p[12] = 2048 >> 8; /* 2M buffer */
909 p[14] = (16 * 176) >> 8; /* 16x read speed current */
910 p[15] = (16 * 176) & 0xff;
911 p[18] = (16 * 176) >> 8; /* 16x write speed */
912 p[19] = (16 * 176) & 0xff;
913 p[20] = (16 * 176) >> 8; /* 16x write speed current */
914 p[21] = (16 * 176) & 0xff;
921 *p_outbuf += p[1] + 2;
925 static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
927 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
929 int page, dbd, buflen, ret, page_control;
931 uint8_t dev_specific_param;
933 dbd = r->req.cmd.buf[1] & 0x8;
934 page = r->req.cmd.buf[2] & 0x3f;
935 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
936 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
937 (r->req.cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, r->req.cmd.xfer, page_control);
938 memset(outbuf, 0, r->req.cmd.xfer);
941 if (bdrv_is_read_only(s->qdev.conf.bs)) {
942 dev_specific_param = 0x80; /* Readonly. */
944 dev_specific_param = 0x00;
947 if (r->req.cmd.buf[0] == MODE_SENSE) {
948 p[1] = 0; /* Default media type. */
949 p[2] = dev_specific_param;
950 p[3] = 0; /* Block descriptor length. */
952 } else { /* MODE_SENSE_10 */
953 p[2] = 0; /* Default media type. */
954 p[3] = dev_specific_param;
955 p[6] = p[7] = 0; /* Block descriptor length. */
959 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
960 if (!dbd && nb_sectors) {
961 if (r->req.cmd.buf[0] == MODE_SENSE) {
962 outbuf[3] = 8; /* Block descriptor length */
963 } else { /* MODE_SENSE_10 */
964 outbuf[7] = 8; /* Block descriptor length */
966 nb_sectors /= (s->qdev.blocksize / 512);
967 if (nb_sectors > 0xffffff) {
970 p[0] = 0; /* media density code */
971 p[1] = (nb_sectors >> 16) & 0xff;
972 p[2] = (nb_sectors >> 8) & 0xff;
973 p[3] = nb_sectors & 0xff;
974 p[4] = 0; /* reserved */
975 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
976 p[6] = s->qdev.blocksize >> 8;
981 if (page_control == 3) {
983 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
988 for (page = 0; page <= 0x3e; page++) {
989 mode_sense_page(s, page, &p, page_control);
992 ret = mode_sense_page(s, page, &p, page_control);
1000 * The mode data length field specifies the length in bytes of the
1001 * following data that is available to be transferred. The mode data
1002 * length does not include itself.
1004 if (r->req.cmd.buf[0] == MODE_SENSE) {
1005 outbuf[0] = buflen - 1;
1006 } else { /* MODE_SENSE_10 */
1007 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1008 outbuf[1] = (buflen - 2) & 0xff;
1010 if (buflen > r->req.cmd.xfer) {
1011 buflen = r->req.cmd.xfer;
1016 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1018 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1019 int start_track, format, msf, toclen;
1020 uint64_t nb_sectors;
1022 msf = req->cmd.buf[1] & 2;
1023 format = req->cmd.buf[2] & 0xf;
1024 start_track = req->cmd.buf[6];
1025 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1026 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
1027 nb_sectors /= s->qdev.blocksize / 512;
1030 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1033 /* multi session : only a single session defined */
1035 memset(outbuf, 0, 12);
1041 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1046 if (toclen > req->cmd.xfer) {
1047 toclen = req->cmd.xfer;
1052 static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
1054 SCSIRequest *req = &r->req;
1055 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1056 bool start = req->cmd.buf[4] & 1;
1057 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
1059 if (s->qdev.type == TYPE_ROM && loej) {
1060 if (!start && !s->tray_open && s->tray_locked) {
1061 scsi_check_condition(r,
1062 bdrv_is_inserted(s->qdev.conf.bs)
1063 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1064 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1067 bdrv_eject(s->qdev.conf.bs, !start);
1068 s->tray_open = !start;
1073 static int scsi_disk_emulate_command(SCSIDiskReq *r)
1075 SCSIRequest *req = &r->req;
1076 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1077 uint64_t nb_sectors;
1081 if (!r->iov.iov_base) {
1083 * FIXME: we shouldn't return anything bigger than 4k, but the code
1084 * requires the buffer to be as big as req->cmd.xfer in several
1085 * places. So, do not allow CDBs with a very large ALLOCATION
1086 * LENGTH. The real fix would be to modify scsi_read_data and
1087 * dma_buf_read, so that they return data beyond the buflen
1090 if (req->cmd.xfer > 65536) {
1091 goto illegal_request;
1093 r->buflen = MAX(4096, req->cmd.xfer);
1094 r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
1097 outbuf = r->iov.iov_base;
1098 switch (req->cmd.buf[0]) {
1099 case TEST_UNIT_READY:
1100 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1105 buflen = scsi_disk_emulate_inquiry(req, outbuf);
1107 goto illegal_request;
1112 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
1114 goto illegal_request;
1118 buflen = scsi_disk_emulate_read_toc(req, outbuf);
1120 goto illegal_request;
1124 if (req->cmd.buf[1] & 1) {
1125 goto illegal_request;
1129 if (req->cmd.buf[1] & 3) {
1130 goto illegal_request;
1134 if (req->cmd.buf[1] & 1) {
1135 goto illegal_request;
1139 if (req->cmd.buf[1] & 3) {
1140 goto illegal_request;
1144 if (scsi_disk_emulate_start_stop(r) < 0) {
1148 case ALLOW_MEDIUM_REMOVAL:
1149 s->tray_locked = req->cmd.buf[4] & 1;
1150 bdrv_lock_medium(s->qdev.conf.bs, req->cmd.buf[4] & 1);
1152 case READ_CAPACITY_10:
1153 /* The normal LEN field for this command is zero. */
1154 memset(outbuf, 0, 8);
1155 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1159 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1160 goto illegal_request;
1162 nb_sectors /= s->qdev.blocksize / 512;
1163 /* Returned value is the address of the last sector. */
1165 /* Remember the new size for read/write sanity checking. */
1166 s->qdev.max_lba = nb_sectors;
1167 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1168 if (nb_sectors > UINT32_MAX) {
1169 nb_sectors = UINT32_MAX;
1171 outbuf[0] = (nb_sectors >> 24) & 0xff;
1172 outbuf[1] = (nb_sectors >> 16) & 0xff;
1173 outbuf[2] = (nb_sectors >> 8) & 0xff;
1174 outbuf[3] = nb_sectors & 0xff;
1177 outbuf[6] = s->qdev.blocksize >> 8;
1181 case MECHANISM_STATUS:
1182 buflen = scsi_emulate_mechanism_status(s, outbuf);
1184 goto illegal_request;
1187 case GET_CONFIGURATION:
1188 buflen = scsi_get_configuration(s, outbuf);
1190 goto illegal_request;
1193 case GET_EVENT_STATUS_NOTIFICATION:
1194 buflen = scsi_get_event_status_notification(s, r, outbuf);
1196 goto illegal_request;
1199 case READ_DVD_STRUCTURE:
1200 buflen = scsi_read_dvd_structure(s, r, outbuf);
1202 goto illegal_request;
1205 case SERVICE_ACTION_IN_16:
1206 /* Service Action In subcommands. */
1207 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
1208 DPRINTF("SAI READ CAPACITY(16)\n");
1209 memset(outbuf, 0, req->cmd.xfer);
1210 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1214 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
1215 goto illegal_request;
1217 nb_sectors /= s->qdev.blocksize / 512;
1218 /* Returned value is the address of the last sector. */
1220 /* Remember the new size for read/write sanity checking. */
1221 s->qdev.max_lba = nb_sectors;
1222 outbuf[0] = (nb_sectors >> 56) & 0xff;
1223 outbuf[1] = (nb_sectors >> 48) & 0xff;
1224 outbuf[2] = (nb_sectors >> 40) & 0xff;
1225 outbuf[3] = (nb_sectors >> 32) & 0xff;
1226 outbuf[4] = (nb_sectors >> 24) & 0xff;
1227 outbuf[5] = (nb_sectors >> 16) & 0xff;
1228 outbuf[6] = (nb_sectors >> 8) & 0xff;
1229 outbuf[7] = nb_sectors & 0xff;
1232 outbuf[10] = s->qdev.blocksize >> 8;
1235 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
1237 /* set TPE bit if the format supports discard */
1238 if (s->qdev.conf.discard_granularity) {
1242 /* Protection, exponent and lowest lba field left blank. */
1243 buflen = req->cmd.xfer;
1246 DPRINTF("Unsupported Service Action In\n");
1247 goto illegal_request;
1251 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1257 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1258 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1260 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1265 if (r->req.status == -1) {
1266 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1271 /* Execute a scsi command. Returns the length of the data expected by the
1272 command. This will be Positive for data transfers from the device
1273 (eg. disk reads), negative for transfers to the device (eg. disk writes),
1274 and zero if the command does not transfer any data. */
1276 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
1278 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1279 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1285 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req->lun, req->tag, buf[0]);
1290 for (i = 1; i < r->req.cmd.len; i++) {
1291 printf(" 0x%02x", buf[i]);
1298 case TEST_UNIT_READY:
1307 case ALLOW_MEDIUM_REMOVAL:
1308 case READ_CAPACITY_10:
1310 case READ_DVD_STRUCTURE:
1311 case GET_CONFIGURATION:
1312 case GET_EVENT_STATUS_NOTIFICATION:
1313 case MECHANISM_STATUS:
1314 case SERVICE_ACTION_IN_16:
1316 rc = scsi_disk_emulate_command(r);
1321 r->iov.iov_len = rc;
1323 case SYNCHRONIZE_CACHE:
1324 /* The request is used as the AIO opaque value, so add a ref. */
1325 scsi_req_ref(&r->req);
1326 bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
1327 r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
1328 if (r->req.aiocb == NULL) {
1329 scsi_flush_complete(r, -EIO);
1336 len = r->req.cmd.xfer / s->qdev.blocksize;
1337 DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
1338 if (r->req.cmd.lba > s->qdev.max_lba) {
1341 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1342 r->sector_count = len * (s->qdev.blocksize / 512);
1348 case WRITE_VERIFY_10:
1349 case WRITE_VERIFY_12:
1350 case WRITE_VERIFY_16:
1351 len = r->req.cmd.xfer / s->qdev.blocksize;
1352 DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
1353 (command & 0xe) == 0xe ? "And Verify " : "",
1354 r->req.cmd.lba, len);
1355 if (r->req.cmd.lba > s->qdev.max_lba) {
1358 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1359 r->sector_count = len * (s->qdev.blocksize / 512);
1362 DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
1363 /* We don't support mode parameter changes.
1364 Allow the mode parameter header + block descriptors only. */
1365 if (r->req.cmd.xfer > 12) {
1369 case MODE_SELECT_10:
1370 DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
1371 /* We don't support mode parameter changes.
1372 Allow the mode parameter header + block descriptors only. */
1373 if (r->req.cmd.xfer > 16) {
1379 DPRINTF("Seek(%d) (sector %" PRId64 ")\n", command == SEEK_6 ? 6 : 10,
1381 if (r->req.cmd.lba > s->qdev.max_lba) {
1386 len = r->req.cmd.xfer / s->qdev.blocksize;
1388 DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
1389 r->req.cmd.lba, len);
1391 if (r->req.cmd.lba > s->qdev.max_lba) {
1396 * We only support WRITE SAME with the unmap bit set for now.
1398 if (!(buf[1] & 0x8)) {
1402 rc = bdrv_discard(s->qdev.conf.bs,
1403 r->req.cmd.lba * (s->qdev.blocksize / 512),
1404 len * (s->qdev.blocksize / 512));
1406 /* XXX: better error code ?*/
1414 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1415 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1418 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1421 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1424 if (r->sector_count == 0 && r->iov.iov_len == 0) {
1425 scsi_req_complete(&r->req, GOOD);
1427 len = r->sector_count * 512 + r->iov.iov_len;
1428 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
1431 if (!r->sector_count) {
1432 r->sector_count = -1;
1438 static void scsi_disk_reset(DeviceState *dev)
1440 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1441 uint64_t nb_sectors;
1443 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
1445 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1446 nb_sectors /= s->qdev.blocksize / 512;
1450 s->qdev.max_lba = nb_sectors;
1453 static void scsi_destroy(SCSIDevice *dev)
1455 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1457 scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
1458 blockdev_mark_auto_del(s->qdev.conf.bs);
1461 static void scsi_cd_change_media_cb(void *opaque, bool load)
1463 SCSIDiskState *s = opaque;
1466 * When a CD gets changed, we have to report an ejected state and
1467 * then a loaded state to guests so that they detect tray
1468 * open/close and media change events. Guests that do not use
1469 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1470 * states rely on this behavior.
1472 * media_changed governs the state machine used for unit attention
1473 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
1475 s->media_changed = load;
1476 s->tray_open = !load;
1477 s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
1478 s->media_event = true;
1479 s->eject_request = false;
1482 static void scsi_cd_eject_request_cb(void *opaque, bool force)
1484 SCSIDiskState *s = opaque;
1486 s->eject_request = true;
1488 s->tray_locked = false;
1492 static bool scsi_cd_is_tray_open(void *opaque)
1494 return ((SCSIDiskState *)opaque)->tray_open;
1497 static bool scsi_cd_is_medium_locked(void *opaque)
1499 return ((SCSIDiskState *)opaque)->tray_locked;
1502 static const BlockDevOps scsi_cd_block_ops = {
1503 .change_media_cb = scsi_cd_change_media_cb,
1504 .eject_request_cb = scsi_cd_eject_request_cb,
1505 .is_tray_open = scsi_cd_is_tray_open,
1506 .is_medium_locked = scsi_cd_is_medium_locked,
1509 static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
1511 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1512 if (s->media_changed) {
1513 s->media_changed = false;
1514 s->qdev.unit_attention = SENSE_CODE(MEDIUM_CHANGED);
1518 static int scsi_initfn(SCSIDevice *dev)
1520 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1523 if (!s->qdev.conf.bs) {
1524 error_report("scsi-disk: drive property not set");
1528 if (!s->removable && !bdrv_is_inserted(s->qdev.conf.bs)) {
1529 error_report("Device needs media, but drive is empty");
1534 /* try to fall back to value set with legacy -drive serial=... */
1535 dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
1536 if (*dinfo->serial) {
1537 s->serial = g_strdup(dinfo->serial);
1542 s->version = g_strdup(QEMU_VERSION);
1545 if (bdrv_is_sg(s->qdev.conf.bs)) {
1546 error_report("scsi-disk: unwanted /dev/sg*");
1551 bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_cd_block_ops, s);
1553 bdrv_set_buffer_alignment(s->qdev.conf.bs, s->qdev.blocksize);
1555 bdrv_iostatus_enable(s->qdev.conf.bs);
1556 add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, NULL);
1560 static int scsi_hd_initfn(SCSIDevice *dev)
1562 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1563 s->qdev.blocksize = s->qdev.conf.logical_block_size;
1564 s->qdev.type = TYPE_DISK;
1565 return scsi_initfn(&s->qdev);
1568 static int scsi_cd_initfn(SCSIDevice *dev)
1570 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1571 s->qdev.blocksize = 2048;
1572 s->qdev.type = TYPE_ROM;
1573 s->removable = true;
1574 return scsi_initfn(&s->qdev);
1577 static int scsi_disk_initfn(SCSIDevice *dev)
1581 if (!dev->conf.bs) {
1582 return scsi_initfn(dev); /* ... and die there */
1585 dinfo = drive_get_by_blockdev(dev->conf.bs);
1586 if (dinfo->media_cd) {
1587 return scsi_cd_initfn(dev);
1589 return scsi_hd_initfn(dev);
1593 static const SCSIReqOps scsi_disk_reqops = {
1594 .size = sizeof(SCSIDiskReq),
1595 .free_req = scsi_free_request,
1596 .send_command = scsi_send_command,
1597 .read_data = scsi_read_data,
1598 .write_data = scsi_write_data,
1599 .cancel_io = scsi_cancel_io,
1600 .get_buf = scsi_get_buf,
1603 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
1604 uint8_t *buf, void *hba_private)
1606 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1609 req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
1614 static int get_device_type(SCSIDiskState *s)
1616 BlockDriverState *bdrv = s->qdev.conf.bs;
1619 uint8_t sensebuf[8];
1620 sg_io_hdr_t io_header;
1623 memset(cmd, 0, sizeof(cmd));
1624 memset(buf, 0, sizeof(buf));
1626 cmd[4] = sizeof(buf);
1628 memset(&io_header, 0, sizeof(io_header));
1629 io_header.interface_id = 'S';
1630 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
1631 io_header.dxfer_len = sizeof(buf);
1632 io_header.dxferp = buf;
1633 io_header.cmdp = cmd;
1634 io_header.cmd_len = sizeof(cmd);
1635 io_header.mx_sb_len = sizeof(sensebuf);
1636 io_header.sbp = sensebuf;
1637 io_header.timeout = 6000; /* XXX */
1639 ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
1640 if (ret < 0 || io_header.driver_status || io_header.host_status) {
1643 s->qdev.type = buf[0];
1644 s->removable = (buf[1] & 0x80) != 0;
1648 static int scsi_block_initfn(SCSIDevice *dev)
1650 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1654 if (!s->qdev.conf.bs) {
1655 error_report("scsi-block: drive property not set");
1659 /* check we are using a driver managing SG_IO (version 3 and after) */
1660 if (bdrv_ioctl(s->qdev.conf.bs, SG_GET_VERSION_NUM, &sg_version) < 0 ||
1661 sg_version < 30000) {
1662 error_report("scsi-block: scsi generic interface too old");
1666 /* get device type from INQUIRY data */
1667 rc = get_device_type(s);
1669 error_report("scsi-block: INQUIRY failed");
1673 /* Make a guess for the block size, we'll fix it when the guest sends.
1674 * READ CAPACITY. If they don't, they likely would assume these sizes
1675 * anyway. (TODO: check in /sys).
1677 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
1678 s->qdev.blocksize = 2048;
1680 s->qdev.blocksize = 512;
1682 return scsi_initfn(&s->qdev);
1685 static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
1686 uint32_t lun, uint8_t *buf,
1689 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1700 case WRITE_VERIFY_10:
1701 case WRITE_VERIFY_12:
1702 case WRITE_VERIFY_16:
1703 return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun,
1707 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
1712 #define DEFINE_SCSI_DISK_PROPERTIES() \
1713 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1714 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1715 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1717 static SCSIDeviceInfo scsi_disk_info[] = {
1719 .qdev.name = "scsi-hd",
1720 .qdev.fw_name = "disk",
1721 .qdev.desc = "virtual SCSI disk",
1722 .qdev.size = sizeof(SCSIDiskState),
1723 .qdev.reset = scsi_disk_reset,
1724 .init = scsi_hd_initfn,
1725 .destroy = scsi_destroy,
1726 .alloc_req = scsi_new_request,
1727 .unit_attention_reported = scsi_disk_unit_attention_reported,
1728 .qdev.props = (Property[]) {
1729 DEFINE_SCSI_DISK_PROPERTIES(),
1730 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1731 DEFINE_PROP_END_OF_LIST(),
1734 .qdev.name = "scsi-cd",
1735 .qdev.fw_name = "disk",
1736 .qdev.desc = "virtual SCSI CD-ROM",
1737 .qdev.size = sizeof(SCSIDiskState),
1738 .qdev.reset = scsi_disk_reset,
1739 .init = scsi_cd_initfn,
1740 .destroy = scsi_destroy,
1741 .alloc_req = scsi_new_request,
1742 .unit_attention_reported = scsi_disk_unit_attention_reported,
1743 .qdev.props = (Property[]) {
1744 DEFINE_SCSI_DISK_PROPERTIES(),
1745 DEFINE_PROP_END_OF_LIST(),
1749 .qdev.name = "scsi-block",
1750 .qdev.fw_name = "disk",
1751 .qdev.desc = "SCSI block device passthrough",
1752 .qdev.size = sizeof(SCSIDiskState),
1753 .qdev.reset = scsi_disk_reset,
1754 .init = scsi_block_initfn,
1755 .destroy = scsi_destroy,
1756 .alloc_req = scsi_block_new_request,
1757 .qdev.props = (Property[]) {
1758 DEFINE_SCSI_DISK_PROPERTIES(),
1759 DEFINE_PROP_END_OF_LIST(),
1763 .qdev.name = "scsi-disk", /* legacy -device scsi-disk */
1764 .qdev.fw_name = "disk",
1765 .qdev.desc = "virtual SCSI disk or CD-ROM (legacy)",
1766 .qdev.size = sizeof(SCSIDiskState),
1767 .qdev.reset = scsi_disk_reset,
1768 .init = scsi_disk_initfn,
1769 .destroy = scsi_destroy,
1770 .alloc_req = scsi_new_request,
1771 .unit_attention_reported = scsi_disk_unit_attention_reported,
1772 .qdev.props = (Property[]) {
1773 DEFINE_SCSI_DISK_PROPERTIES(),
1774 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1775 DEFINE_PROP_END_OF_LIST(),
1780 static void scsi_disk_register_devices(void)
1784 for (i = 0; i < ARRAY_SIZE(scsi_disk_info); i++) {
1785 scsi_qdev_register(&scsi_disk_info[i]);
1788 device_init(scsi_disk_register_devices)