]> Git Repo - qemu.git/blame - hw/scsi/scsi-disk.c
contrib: add systemd unit files
[qemu.git] / hw / scsi / scsi-disk.c
CommitLineData
2e5d83bb
PB
1/*
2 * SCSI Device emulation
3 *
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
6 *
7 * Written by Paul Brook
ad3cea42
AT
8 * Modifications:
9 * 2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10 * when the allocation length of CDB is smaller
11 * than 36.
12 * 2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
13 * MODE SENSE response.
2e5d83bb 14 *
8e31bf38 15 * This code is licensed under the LGPL.
a917d384
PB
16 *
17 * Note that this file only handles the SCSI architecture model and device
1d4db89c
AZ
18 * commands. Emulation of interface/link layer protocols is handled by
19 * the host adapter emulator.
2e5d83bb
PB
20 */
21
22//#define DEBUG_SCSI
23
24#ifdef DEBUG_SCSI
001faf32
BS
25#define DPRINTF(fmt, ...) \
26do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
2e5d83bb 27#else
001faf32 28#define DPRINTF(fmt, ...) do {} while(0)
2e5d83bb
PB
29#endif
30
a4ab4792 31#include "qemu/osdep.h"
da34e65c 32#include "qapi/error.h"
1de7afc9 33#include "qemu/error-report.h"
0d09e41a 34#include "hw/scsi/scsi.h"
08e2c9f1 35#include "scsi/constants.h"
9c17d615 36#include "sysemu/sysemu.h"
4be74634 37#include "sysemu/block-backend.h"
9c17d615 38#include "sysemu/blockdev.h"
0d09e41a 39#include "hw/block/block.h"
9c17d615 40#include "sysemu/dma.h"
f348b6d1 41#include "qemu/cutils.h"
22864256 42
336a6915
PB
43#ifdef __linux
44#include <scsi/sg.h>
45#endif
46
84f94a9a 47#define SCSI_WRITE_SAME_MAX 524288
215e47b9
PB
48#define SCSI_DMA_BUF_SIZE 131072
49#define SCSI_MAX_INQUIRY_LEN 256
50#define SCSI_MAX_MODE_LEN 256
51
52#define DEFAULT_DISCARD_GRANULARITY 4096
8a1bd297 53#define DEFAULT_MAX_UNMAP_SIZE (1 << 30) /* 1 GB */
f8e1f533 54#define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
a917d384 55
993935f3
PB
56#define TYPE_SCSI_DISK_BASE "scsi-disk-base"
57
fcaafb10
PB
58#define SCSI_DISK_BASE(obj) \
59 OBJECT_CHECK(SCSIDiskState, (obj), TYPE_SCSI_DISK_BASE)
60#define SCSI_DISK_BASE_CLASS(klass) \
61 OBJECT_CLASS_CHECK(SCSIDiskClass, (klass), TYPE_SCSI_DISK_BASE)
62#define SCSI_DISK_BASE_GET_CLASS(obj) \
63 OBJECT_GET_CLASS(SCSIDiskClass, (obj), TYPE_SCSI_DISK_BASE)
64
65typedef struct SCSIDiskClass {
66 SCSIDeviceClass parent_class;
67 DMAIOFunc *dma_readv;
68 DMAIOFunc *dma_writev;
94f8ba11 69 bool (*need_fua_emulation)(SCSICommand *cmd);
fcaafb10 70} SCSIDiskClass;
d52affa7 71
4c41d2ef
GH
72typedef struct SCSIDiskReq {
73 SCSIRequest req;
a917d384 74 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
e035b43d
AL
75 uint64_t sector;
76 uint32_t sector_count;
7285477a 77 uint32_t buflen;
a0e66a69 78 bool started;
94f8ba11 79 bool need_fua_emulation;
c87c0672
AL
80 struct iovec iov;
81 QEMUIOVector qiov;
a597e79c 82 BlockAcctCookie acct;
8fdc7839 83 unsigned char *status;
4c41d2ef 84} SCSIDiskReq;
a917d384 85
18e673b8
PH
86#define SCSI_DISK_F_REMOVABLE 0
87#define SCSI_DISK_F_DPOFUA 1
88#define SCSI_DISK_F_NO_REMOVABLE_DEVOPS 2
bfe3d7ac 89
fcaafb10 90typedef struct SCSIDiskState
a917d384 91{
d52affa7 92 SCSIDevice qdev;
bfe3d7ac 93 uint32_t features;
8a9c16f6 94 bool media_changed;
3c2f7c12 95 bool media_event;
4480de19 96 bool eject_request;
64cc2284 97 uint16_t port_index;
8a1bd297 98 uint64_t max_unmap_size;
f8e1f533 99 uint64_t max_io_size;
213189ab 100 QEMUBH *bh;
383b4d9b 101 char *version;
a0fef654 102 char *serial;
353815aa
DF
103 char *vendor;
104 char *product;
ece0d5e9 105 bool tray_open;
81b1008d 106 bool tray_locked;
070f8009
DB
107 /*
108 * 0x0000 - rotation rate not reported
109 * 0x0001 - non-rotating medium (SSD)
110 * 0x0002-0x0400 - reserved
111 * 0x0401-0xffe - rotations per minute
112 * 0xffff - reserved
113 */
114 uint16_t rotation_rate;
fcaafb10 115} SCSIDiskState;
2e5d83bb 116
14b20748 117static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed);
5dba48a8 118
ad2d30f7 119static void scsi_free_request(SCSIRequest *req)
4d611c9a 120{
ad2d30f7
PB
121 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
122
db4c34c3 123 qemu_vfree(r->iov.iov_base);
4d611c9a
PB
124}
125
b45ef674
PB
126/* Helper function for command completion with sense. */
127static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
ed3a34a3 128{
02fa69b6
BS
129 DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
130 r->req.tag, sense.key, sense.asc, sense.ascq);
b45ef674
PB
131 scsi_req_build_sense(&r->req, sense);
132 scsi_req_complete(&r->req, CHECK_CONDITION);
4d611c9a
PB
133}
134
03c90063 135static void scsi_init_iovec(SCSIDiskReq *r, size_t size)
103b40f5 136{
7285477a
PB
137 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
138
139 if (!r->iov.iov_base) {
43b978b9 140 r->buflen = size;
4be74634 141 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
7285477a
PB
142 }
143 r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
103b40f5 144 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
103b40f5
PB
145}
146
43b978b9
PB
147static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
148{
149 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
150
151 qemu_put_be64s(f, &r->sector);
152 qemu_put_be32s(f, &r->sector_count);
153 qemu_put_be32s(f, &r->buflen);
18eef3bc
GH
154 if (r->buflen) {
155 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
156 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
157 } else if (!req->retry) {
158 uint32_t len = r->iov.iov_len;
159 qemu_put_be32s(f, &len);
160 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
161 }
43b978b9
PB
162 }
163}
164
165static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
166{
167 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
168
169 qemu_get_be64s(f, &r->sector);
170 qemu_get_be32s(f, &r->sector_count);
171 qemu_get_be32s(f, &r->buflen);
172 if (r->buflen) {
173 scsi_init_iovec(r, r->buflen);
174 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
175 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
18eef3bc
GH
176 } else if (!r->req.retry) {
177 uint32_t len;
178 qemu_get_be32s(f, &len);
179 r->iov.iov_len = len;
180 assert(r->iov.iov_len <= r->buflen);
181 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
43b978b9
PB
182 }
183 }
184
185 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
186}
187
5b956f41
PB
188static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed)
189{
190 if (r->req.io_canceled) {
191 scsi_req_cancel_complete(&r->req);
192 return true;
193 }
194
14b20748 195 if (ret < 0 || (r->status && *r->status)) {
5b956f41
PB
196 return scsi_handle_rw_error(r, -ret, acct_failed);
197 }
198
199 return false;
200}
201
c1b35247 202static void scsi_aio_complete(void *opaque, int ret)
5d0d2467
PB
203{
204 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
205 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
206
46e3f30e
PB
207 assert(r->req.aiocb != NULL);
208 r->req.aiocb = NULL;
b9e413dd 209 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5b956f41 210 if (scsi_disk_req_check_error(r, ret, true)) {
0c92e0e6
PB
211 goto done;
212 }
5d0d2467 213
d7628080 214 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
5d0d2467
PB
215 scsi_req_complete(&r->req, GOOD);
216
217done:
b9e413dd 218 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
3df9caf8 219 scsi_req_unref(&r->req);
5d0d2467
PB
220}
221
7e8c49c5
PB
222static bool scsi_is_cmd_fua(SCSICommand *cmd)
223{
224 switch (cmd->buf[0]) {
225 case READ_10:
226 case READ_12:
227 case READ_16:
228 case WRITE_10:
229 case WRITE_12:
230 case WRITE_16:
231 return (cmd->buf[1] & 8) != 0;
232
7f64f8e2
PB
233 case VERIFY_10:
234 case VERIFY_12:
235 case VERIFY_16:
7e8c49c5
PB
236 case WRITE_VERIFY_10:
237 case WRITE_VERIFY_12:
238 case WRITE_VERIFY_16:
239 return true;
240
241 case READ_6:
242 case WRITE_6:
243 default:
244 return false;
245 }
246}
247
248static void scsi_write_do_fua(SCSIDiskReq *r)
249{
250 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
251
5fd2b563 252 assert(r->req.aiocb == NULL);
5b956f41 253 assert(!r->req.io_canceled);
0c92e0e6 254
94f8ba11 255 if (r->need_fua_emulation) {
4be74634 256 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 257 BLOCK_ACCT_FLUSH);
4be74634 258 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
7e8c49c5
PB
259 return;
260 }
261
262 scsi_req_complete(&r->req, GOOD);
3df9caf8 263 scsi_req_unref(&r->req);
7e8c49c5
PB
264}
265
5fd2b563 266static void scsi_dma_complete_noio(SCSIDiskReq *r, int ret)
a917d384 267{
5fd2b563 268 assert(r->req.aiocb == NULL);
5b956f41 269 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
270 goto done;
271 }
a597e79c 272
b77912a7
PB
273 r->sector += r->sector_count;
274 r->sector_count = 0;
7e8c49c5
PB
275 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
276 scsi_write_do_fua(r);
277 return;
278 } else {
279 scsi_req_complete(&r->req, GOOD);
280 }
c7bae6a7
PB
281
282done:
3df9caf8 283 scsi_req_unref(&r->req);
4d611c9a
PB
284}
285
ef8489d4
PB
286static void scsi_dma_complete(void *opaque, int ret)
287{
288 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
5fd2b563 289 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ef8489d4
PB
290
291 assert(r->req.aiocb != NULL);
5fd2b563
PB
292 r->req.aiocb = NULL;
293
b9e413dd 294 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
295 if (ret < 0) {
296 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
297 } else {
298 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
299 }
5fd2b563 300 scsi_dma_complete_noio(r, ret);
b9e413dd 301 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
ef8489d4
PB
302}
303
b77912a7 304static void scsi_read_complete(void * opaque, int ret)
0a4ac106
PB
305{
306 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
307 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
b77912a7 308 int n;
0a4ac106 309
46e3f30e
PB
310 assert(r->req.aiocb != NULL);
311 r->req.aiocb = NULL;
b9e413dd 312 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5b956f41 313 if (scsi_disk_req_check_error(r, ret, true)) {
0c92e0e6
PB
314 goto done;
315 }
0a4ac106 316
d7628080 317 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
b77912a7
PB
318 DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->qiov.size);
319
320 n = r->qiov.size / 512;
321 r->sector += n;
322 r->sector_count -= n;
323 scsi_req_data(&r->req, r->qiov.size);
c7bae6a7
PB
324
325done:
3df9caf8 326 scsi_req_unref(&r->req);
b9e413dd 327 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
0a4ac106 328}
5dba48a8 329
ac668426 330/* Actually issue a read to the block device. */
5fd2b563 331static void scsi_do_read(SCSIDiskReq *r, int ret)
ac668426 332{
ac668426 333 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
fcaafb10 334 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
ac668426 335
5fd2b563 336 assert (r->req.aiocb == NULL);
5b956f41 337 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
338 goto done;
339 }
ac668426 340
31e8fd86
PB
341 /* The request is used as the AIO opaque value, so add a ref. */
342 scsi_req_ref(&r->req);
343
ac668426 344 if (r->req.sg) {
4be74634 345 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
ac668426 346 r->req.resid -= r->req.sg->size;
fcaafb10
PB
347 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
348 r->req.sg, r->sector << BDRV_SECTOR_BITS,
99868af3 349 BDRV_SECTOR_SIZE,
fcaafb10
PB
350 sdc->dma_readv, r, scsi_dma_complete, r,
351 DMA_DIRECTION_FROM_DEVICE);
ac668426 352 } else {
03c90063 353 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
4be74634 354 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
03c90063 355 r->qiov.size, BLOCK_ACCT_READ);
890e48d7 356 r->req.aiocb = sdc->dma_readv(r->sector << BDRV_SECTOR_BITS, &r->qiov,
fcaafb10 357 scsi_read_complete, r, r);
ac668426
PB
358 }
359
360done:
3df9caf8 361 scsi_req_unref(&r->req);
ac668426
PB
362}
363
5fd2b563
PB
364static void scsi_do_read_cb(void *opaque, int ret)
365{
366 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
367 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
368
369 assert (r->req.aiocb != NULL);
370 r->req.aiocb = NULL;
371
b9e413dd 372 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
373 if (ret < 0) {
374 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
375 } else {
376 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
377 }
5fd2b563 378 scsi_do_read(opaque, ret);
b9e413dd 379 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
380}
381
5c6c0e51
HR
382/* Read more data from scsi device into buffer. */
383static void scsi_read_data(SCSIRequest *req)
2e5d83bb 384{
5c6c0e51 385 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
5dba48a8 386 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ac668426 387 bool first;
2e5d83bb 388
a917d384
PB
389 DPRINTF("Read sector_count=%d\n", r->sector_count);
390 if (r->sector_count == 0) {
b45ef674
PB
391 /* This also clears the sense buffer for REQUEST SENSE. */
392 scsi_req_complete(&r->req, GOOD);
a917d384 393 return;
2e5d83bb
PB
394 }
395
6fa2c95f
SH
396 /* No data transfer may already be in progress */
397 assert(r->req.aiocb == NULL);
398
c7bae6a7
PB
399 /* The request is used as the AIO opaque value, so add a ref. */
400 scsi_req_ref(&r->req);
efb9ee02
HR
401 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
402 DPRINTF("Data transfer direction invalid\n");
403 scsi_read_complete(r, -EINVAL);
404 return;
405 }
406
cd723b85 407 if (!blk_is_available(req->dev->conf.blk)) {
a1aff5bf 408 scsi_read_complete(r, -ENOMEDIUM);
c7bae6a7 409 return;
a1aff5bf 410 }
c7bae6a7 411
ac668426 412 first = !r->started;
a0e66a69 413 r->started = true;
94f8ba11 414 if (first && r->need_fua_emulation) {
4be74634 415 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 416 BLOCK_ACCT_FLUSH);
5fd2b563 417 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read_cb, r);
5d0d2467 418 } else {
ac668426 419 scsi_do_read(r, 0);
5d0d2467 420 }
2e5d83bb
PB
421}
422
c7bae6a7 423/*
14b20748
FZ
424 * scsi_handle_rw_error has two return values. False means that the error
425 * must be ignored, true means that the error has been processed and the
c7bae6a7
PB
426 * caller should not do anything else for this request. Note that
427 * scsi_handle_rw_error always manages its reference counts, independent
428 * of the return value.
429 */
14b20748 430static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed)
5dba48a8 431{
c85a7a00 432 bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV);
4c41d2ef 433 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
4be74634
MA
434 BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk,
435 is_read, error);
ea8a5d7f 436
a589569f 437 if (action == BLOCK_ERROR_ACTION_REPORT) {
d7628080
AG
438 if (acct_failed) {
439 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
440 }
efb9ee02 441 switch (error) {
14b20748
FZ
442 case 0:
443 /* The command has run, no need to fake sense. */
444 assert(r->status && *r->status);
445 scsi_req_complete(&r->req, *r->status);
446 break;
7e218df5
PB
447 case ENOMEDIUM:
448 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
449 break;
efb9ee02 450 case ENOMEM:
b45ef674 451 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
efb9ee02
HR
452 break;
453 case EINVAL:
b45ef674 454 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
efb9ee02 455 break;
703dd81a
PB
456 case ENOSPC:
457 scsi_check_condition(r, SENSE_CODE(SPACE_ALLOC_FAILED));
458 break;
efb9ee02 459 default:
b45ef674 460 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
efb9ee02 461 break;
a1f0cce2 462 }
ea8a5d7f 463 }
14b20748
FZ
464 if (!error) {
465 assert(r->status && *r->status);
466 error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
467
468 if (error == ECANCELED || error == EAGAIN || error == ENOTCONN ||
469 error == 0) {
470 /* These errors are handled by guest. */
471 scsi_req_complete(&r->req, *r->status);
472 return true;
473 }
474 }
475
4be74634 476 blk_error_action(s->qdev.conf.blk, action, is_read, error);
a589569f 477 if (action == BLOCK_ERROR_ACTION_STOP) {
3e1caa5f
PB
478 scsi_req_retry(&r->req);
479 }
a589569f 480 return action != BLOCK_ERROR_ACTION_IGNORE;
ea8a5d7f
AL
481}
482
5fd2b563 483static void scsi_write_complete_noio(SCSIDiskReq *r, int ret)
4d611c9a 484{
ea8a5d7f
AL
485 uint32_t n;
486
5fd2b563 487 assert (r->req.aiocb == NULL);
5b956f41 488 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
489 goto done;
490 }
a597e79c 491
103b40f5 492 n = r->qiov.size / 512;
ea8a5d7f
AL
493 r->sector += n;
494 r->sector_count -= n;
a917d384 495 if (r->sector_count == 0) {
7e8c49c5
PB
496 scsi_write_do_fua(r);
497 return;
a917d384 498 } else {
43b978b9 499 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
79fb50bb 500 DPRINTF("Write complete tag=0x%x more=%zd\n", r->req.tag, r->qiov.size);
103b40f5 501 scsi_req_data(&r->req, r->qiov.size);
4d611c9a 502 }
c7bae6a7
PB
503
504done:
3df9caf8 505 scsi_req_unref(&r->req);
4d611c9a
PB
506}
507
5fd2b563
PB
508static void scsi_write_complete(void * opaque, int ret)
509{
510 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
511 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
512
513 assert (r->req.aiocb != NULL);
514 r->req.aiocb = NULL;
515
b9e413dd 516 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
517 if (ret < 0) {
518 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
519 } else {
520 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
521 }
5fd2b563 522 scsi_write_complete_noio(r, ret);
b9e413dd 523 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
524}
525
42741212 526static void scsi_write_data(SCSIRequest *req)
ea8a5d7f 527{
5c6c0e51 528 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
4c41d2ef 529 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
fcaafb10 530 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
ea8a5d7f 531
6fa2c95f
SH
532 /* No data transfer may already be in progress */
533 assert(r->req.aiocb == NULL);
534
c7bae6a7
PB
535 /* The request is used as the AIO opaque value, so add a ref. */
536 scsi_req_ref(&r->req);
efb9ee02
HR
537 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
538 DPRINTF("Data transfer direction invalid\n");
5fd2b563 539 scsi_write_complete_noio(r, -EINVAL);
42741212 540 return;
efb9ee02
HR
541 }
542
5d0d2467
PB
543 if (!r->req.sg && !r->qiov.size) {
544 /* Called for the first time. Ask the driver to send us more data. */
a0e66a69 545 r->started = true;
5fd2b563 546 scsi_write_complete_noio(r, 0);
5d0d2467
PB
547 return;
548 }
cd723b85 549 if (!blk_is_available(req->dev->conf.blk)) {
5fd2b563 550 scsi_write_complete_noio(r, -ENOMEDIUM);
5d0d2467
PB
551 return;
552 }
553
7f64f8e2
PB
554 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 ||
555 r->req.cmd.buf[0] == VERIFY_16) {
556 if (r->req.sg) {
ef8489d4 557 scsi_dma_complete_noio(r, 0);
7f64f8e2 558 } else {
5fd2b563 559 scsi_write_complete_noio(r, 0);
7f64f8e2
PB
560 }
561 return;
562 }
563
5d0d2467 564 if (r->req.sg) {
4be74634 565 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
5d0d2467 566 r->req.resid -= r->req.sg->size;
fcaafb10
PB
567 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
568 r->req.sg, r->sector << BDRV_SECTOR_BITS,
99868af3 569 BDRV_SECTOR_SIZE,
fcaafb10
PB
570 sdc->dma_writev, r, scsi_dma_complete, r,
571 DMA_DIRECTION_TO_DEVICE);
5d0d2467 572 } else {
4be74634 573 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
03c90063 574 r->qiov.size, BLOCK_ACCT_WRITE);
fcaafb10
PB
575 r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov,
576 scsi_write_complete, r, r);
ea8a5d7f 577 }
a917d384 578}
2e5d83bb 579
a917d384 580/* Return a pointer to the data buffer. */
5c6c0e51 581static uint8_t *scsi_get_buf(SCSIRequest *req)
a917d384 582{
5c6c0e51 583 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2e5d83bb 584
3f4cb3d3 585 return (uint8_t *)r->iov.iov_base;
2e5d83bb
PB
586}
587
0b06c059
GH
588static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
589{
383b4d9b 590 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
0b06c059 591 int buflen = 0;
82579390 592 int start;
0b06c059 593
0b06c059
GH
594 if (req->cmd.buf[1] & 0x1) {
595 /* Vital product data */
596 uint8_t page_code = req->cmd.buf[2];
0b06c059 597
e39be482 598 outbuf[buflen++] = s->qdev.type & 0x1f;
0b06c059
GH
599 outbuf[buflen++] = page_code ; // this page
600 outbuf[buflen++] = 0x00;
82579390
PB
601 outbuf[buflen++] = 0x00;
602 start = buflen;
0b06c059
GH
603
604 switch (page_code) {
605 case 0x00: /* Supported page codes, mandatory */
39d98982 606 {
0b06c059
GH
607 DPRINTF("Inquiry EVPD[Supported pages] "
608 "buffer size %zd\n", req->cmd.xfer);
0b06c059 609 outbuf[buflen++] = 0x00; // list of supported pages (this page)
f01b5931 610 if (s->serial) {
3e1c0c9a 611 outbuf[buflen++] = 0x80; // unit serial number
f01b5931 612 }
0b06c059 613 outbuf[buflen++] = 0x83; // device identification
f37bd73b 614 if (s->qdev.type == TYPE_DISK) {
ea3bd56f 615 outbuf[buflen++] = 0xb0; // block limits
070f8009 616 outbuf[buflen++] = 0xb1; /* block device characteristics */
ea3bd56f 617 outbuf[buflen++] = 0xb2; // thin provisioning
39d98982 618 }
0b06c059 619 break;
39d98982 620 }
0b06c059
GH
621 case 0x80: /* Device serial number, optional */
622 {
3e1c0c9a 623 int l;
0b06c059 624
3e1c0c9a
HR
625 if (!s->serial) {
626 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
627 return -1;
628 }
629
630 l = strlen(s->serial);
48b62063
RW
631 if (l > 36) {
632 l = 36;
f01b5931 633 }
0b06c059
GH
634
635 DPRINTF("Inquiry EVPD[Serial number] "
636 "buffer size %zd\n", req->cmd.xfer);
a0fef654 637 memcpy(outbuf+buflen, s->serial, l);
0b06c059
GH
638 buflen += l;
639 break;
640 }
641
642 case 0x83: /* Device identification page, mandatory */
643 {
4be74634 644 const char *str = s->serial ?: blk_name(s->qdev.conf.blk);
fd930791
PB
645 int max_len = s->serial ? 20 : 255 - 8;
646 int id_len = strlen(str);
0b06c059 647
f01b5931 648 if (id_len > max_len) {
0b06c059 649 id_len = max_len;
f01b5931 650 }
0b06c059
GH
651 DPRINTF("Inquiry EVPD[Device identification] "
652 "buffer size %zd\n", req->cmd.xfer);
653
0b06c059
GH
654 outbuf[buflen++] = 0x2; // ASCII
655 outbuf[buflen++] = 0; // not officially assigned
656 outbuf[buflen++] = 0; // reserved
657 outbuf[buflen++] = id_len; // length of data following
fd930791 658 memcpy(outbuf+buflen, str, id_len);
0b06c059 659 buflen += id_len;
27395add 660
2ecab408 661 if (s->qdev.wwn) {
27395add
PB
662 outbuf[buflen++] = 0x1; // Binary
663 outbuf[buflen++] = 0x3; // NAA
664 outbuf[buflen++] = 0; // reserved
665 outbuf[buflen++] = 8;
2ecab408 666 stq_be_p(&outbuf[buflen], s->qdev.wwn);
27395add
PB
667 buflen += 8;
668 }
64cc2284 669
2ecab408 670 if (s->qdev.port_wwn) {
64cc2284
RD
671 outbuf[buflen++] = 0x61; // SAS / Binary
672 outbuf[buflen++] = 0x93; // PIV / Target port / NAA
673 outbuf[buflen++] = 0; // reserved
674 outbuf[buflen++] = 8;
2ecab408 675 stq_be_p(&outbuf[buflen], s->qdev.port_wwn);
64cc2284
RD
676 buflen += 8;
677 }
678
679 if (s->port_index) {
680 outbuf[buflen++] = 0x61; // SAS / Binary
681 outbuf[buflen++] = 0x94; // PIV / Target port / relative target port
682 outbuf[buflen++] = 0; // reserved
683 outbuf[buflen++] = 4;
684 stw_be_p(&outbuf[buflen + 2], s->port_index);
685 buflen += 4;
686 }
0b06c059
GH
687 break;
688 }
ea3bd56f 689 case 0xb0: /* block limits */
ee3659e3 690 {
ea3bd56f
CH
691 unsigned int unmap_sectors =
692 s->qdev.conf.discard_granularity / s->qdev.blocksize;
8cfacf07
CH
693 unsigned int min_io_size =
694 s->qdev.conf.min_io_size / s->qdev.blocksize;
695 unsigned int opt_io_size =
696 s->qdev.conf.opt_io_size / s->qdev.blocksize;
8a1bd297
PB
697 unsigned int max_unmap_sectors =
698 s->max_unmap_size / s->qdev.blocksize;
f8e1f533
PB
699 unsigned int max_io_sectors =
700 s->max_io_size / s->qdev.blocksize;
ee3659e3 701
f37bd73b 702 if (s->qdev.type == TYPE_ROM) {
39d98982
HR
703 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
704 page_code);
705 return -1;
706 }
ee3659e3 707 /* required VPD size with unmap support */
82579390 708 buflen = 0x40;
ee3659e3
CH
709 memset(outbuf + 4, 0, buflen - 4);
710
84f94a9a
PB
711 outbuf[4] = 0x1; /* wsnz */
712
ee3659e3
CH
713 /* optimal transfer length granularity */
714 outbuf[6] = (min_io_size >> 8) & 0xff;
715 outbuf[7] = min_io_size & 0xff;
716
f8e1f533
PB
717 /* maximum transfer length */
718 outbuf[8] = (max_io_sectors >> 24) & 0xff;
719 outbuf[9] = (max_io_sectors >> 16) & 0xff;
720 outbuf[10] = (max_io_sectors >> 8) & 0xff;
721 outbuf[11] = max_io_sectors & 0xff;
722
ee3659e3
CH
723 /* optimal transfer length */
724 outbuf[12] = (opt_io_size >> 24) & 0xff;
725 outbuf[13] = (opt_io_size >> 16) & 0xff;
726 outbuf[14] = (opt_io_size >> 8) & 0xff;
727 outbuf[15] = opt_io_size & 0xff;
ea3bd56f 728
8a1bd297
PB
729 /* max unmap LBA count, default is 1GB */
730 outbuf[20] = (max_unmap_sectors >> 24) & 0xff;
731 outbuf[21] = (max_unmap_sectors >> 16) & 0xff;
732 outbuf[22] = (max_unmap_sectors >> 8) & 0xff;
733 outbuf[23] = max_unmap_sectors & 0xff;
734
735 /* max unmap descriptors, 255 fit in 4 kb with an 8-byte header. */
736 outbuf[24] = 0;
737 outbuf[25] = 0;
738 outbuf[26] = 0;
739 outbuf[27] = 255;
740
ea3bd56f
CH
741 /* optimal unmap granularity */
742 outbuf[28] = (unmap_sectors >> 24) & 0xff;
743 outbuf[29] = (unmap_sectors >> 16) & 0xff;
744 outbuf[30] = (unmap_sectors >> 8) & 0xff;
745 outbuf[31] = unmap_sectors & 0xff;
f8e1f533
PB
746
747 /* max write same size */
748 outbuf[36] = 0;
749 outbuf[37] = 0;
750 outbuf[38] = 0;
751 outbuf[39] = 0;
752
753 outbuf[40] = (max_io_sectors >> 24) & 0xff;
754 outbuf[41] = (max_io_sectors >> 16) & 0xff;
755 outbuf[42] = (max_io_sectors >> 8) & 0xff;
756 outbuf[43] = max_io_sectors & 0xff;
ea3bd56f
CH
757 break;
758 }
070f8009
DB
759 case 0xb1: /* block device characteristics */
760 {
761 buflen = 8;
762 outbuf[4] = (s->rotation_rate >> 8) & 0xff;
763 outbuf[5] = s->rotation_rate & 0xff;
764 outbuf[6] = 0;
765 outbuf[7] = 0;
766 break;
767 }
ea3bd56f
CH
768 case 0xb2: /* thin provisioning */
769 {
82579390 770 buflen = 8;
ea3bd56f 771 outbuf[4] = 0;
5222aaf2 772 outbuf[5] = 0xe0; /* unmap & write_same 10/16 all supported */
f644a290 773 outbuf[6] = s->qdev.conf.discard_granularity ? 2 : 1;
ea3bd56f 774 outbuf[7] = 0;
ee3659e3
CH
775 break;
776 }
0b06c059 777 default:
0b06c059
GH
778 return -1;
779 }
780 /* done with EVPD */
82579390
PB
781 assert(buflen - start <= 255);
782 outbuf[start - 1] = buflen - start;
0b06c059
GH
783 return buflen;
784 }
785
786 /* Standard INQUIRY data */
787 if (req->cmd.buf[2] != 0) {
0b06c059
GH
788 return -1;
789 }
790
791 /* PAGE CODE == 0 */
0b06c059 792 buflen = req->cmd.xfer;
f01b5931 793 if (buflen > SCSI_MAX_INQUIRY_LEN) {
0b06c059 794 buflen = SCSI_MAX_INQUIRY_LEN;
f01b5931 795 }
0b06c059 796
f37bd73b 797 outbuf[0] = s->qdev.type & 0x1f;
bfe3d7ac 798 outbuf[1] = (s->features & (1 << SCSI_DISK_F_REMOVABLE)) ? 0x80 : 0;
353815aa
DF
799
800 strpadcpy((char *) &outbuf[16], 16, s->product, ' ');
801 strpadcpy((char *) &outbuf[8], 8, s->vendor, ' ');
802
314b1811 803 memset(&outbuf[32], 0, 4);
552fee93 804 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
99aba0c4
CH
805 /*
806 * We claim conformance to SPC-3, which is required for guests
807 * to ask for modern features like READ CAPACITY(16) or the
808 * block characteristics VPD page by default. Not all of SPC-3
809 * is actually implemented, but we're good enough.
810 */
ee3659e3 811 outbuf[2] = 5;
1109c894 812 outbuf[3] = 2 | 0x10; /* Format 2, HiSup */
ad3cea42
AT
813
814 if (buflen > 36) {
815 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
816 } else {
817 /* If the allocation length of CDB is too small,
818 the additional length is not adjusted */
819 outbuf[4] = 36 - 5;
820 }
821
0b06c059 822 /* Sync data transfer and TCQ. */
afd4030c 823 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
0b06c059
GH
824 return buflen;
825}
826
430ee2f2
PB
827static inline bool media_is_dvd(SCSIDiskState *s)
828{
829 uint64_t nb_sectors;
830 if (s->qdev.type != TYPE_ROM) {
831 return false;
832 }
cd723b85 833 if (!blk_is_available(s->qdev.conf.blk)) {
7d99f4c1
MR
834 return false;
835 }
4be74634 836 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
430ee2f2
PB
837 return nb_sectors > CD_MAX_SECTORS;
838}
839
ceb792ef
PB
840static inline bool media_is_cd(SCSIDiskState *s)
841{
842 uint64_t nb_sectors;
843 if (s->qdev.type != TYPE_ROM) {
844 return false;
845 }
cd723b85 846 if (!blk_is_available(s->qdev.conf.blk)) {
7d99f4c1
MR
847 return false;
848 }
4be74634 849 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
ceb792ef
PB
850 return nb_sectors <= CD_MAX_SECTORS;
851}
852
1a4f0c3a
PB
853static int scsi_read_disc_information(SCSIDiskState *s, SCSIDiskReq *r,
854 uint8_t *outbuf)
855{
856 uint8_t type = r->req.cmd.buf[1] & 7;
857
858 if (s->qdev.type != TYPE_ROM) {
859 return -1;
860 }
861
862 /* Types 1/2 are only defined for Blu-Ray. */
863 if (type != 0) {
864 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
865 return -1;
866 }
867
868 memset(outbuf, 0, 34);
869 outbuf[1] = 32;
870 outbuf[2] = 0xe; /* last session complete, disc finalized */
871 outbuf[3] = 1; /* first track on disc */
872 outbuf[4] = 1; /* # of sessions */
873 outbuf[5] = 1; /* first track of last session */
874 outbuf[6] = 1; /* last track of last session */
875 outbuf[7] = 0x20; /* unrestricted use */
876 outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
877 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
878 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
879 /* 24-31: disc bar code */
880 /* 32: disc application code */
881 /* 33: number of OPC tables */
882
883 return 34;
884}
885
b6c251ab
PB
886static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
887 uint8_t *outbuf)
888{
ceb792ef
PB
889 static const int rds_caps_size[5] = {
890 [0] = 2048 + 4,
891 [1] = 4 + 4,
892 [3] = 188 + 4,
893 [4] = 2048 + 4,
894 };
895
896 uint8_t media = r->req.cmd.buf[1];
897 uint8_t layer = r->req.cmd.buf[6];
898 uint8_t format = r->req.cmd.buf[7];
899 int size = -1;
900
901 if (s->qdev.type != TYPE_ROM) {
902 return -1;
903 }
904 if (media != 0) {
905 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
906 return -1;
907 }
908
909 if (format != 0xff) {
cd723b85 910 if (!blk_is_available(s->qdev.conf.blk)) {
ceb792ef
PB
911 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
912 return -1;
913 }
914 if (media_is_cd(s)) {
915 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
916 return -1;
917 }
918 if (format >= ARRAY_SIZE(rds_caps_size)) {
919 return -1;
920 }
921 size = rds_caps_size[format];
922 memset(outbuf, 0, size);
923 }
924
925 switch (format) {
926 case 0x00: {
927 /* Physical format information */
928 uint64_t nb_sectors;
929 if (layer != 0) {
930 goto fail;
931 }
4be74634 932 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
ceb792ef
PB
933
934 outbuf[4] = 1; /* DVD-ROM, part version 1 */
935 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
936 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
937 outbuf[7] = 0; /* default densities */
938
939 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
940 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
941 break;
942 }
943
944 case 0x01: /* DVD copyright information, all zeros */
945 break;
946
947 case 0x03: /* BCA information - invalid field for no BCA info */
948 return -1;
949
950 case 0x04: /* DVD disc manufacturing information, all zeros */
951 break;
952
953 case 0xff: { /* List capabilities */
954 int i;
955 size = 4;
956 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
957 if (!rds_caps_size[i]) {
958 continue;
959 }
960 outbuf[size] = i;
961 outbuf[size + 1] = 0x40; /* Not writable, readable */
962 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
963 size += 4;
964 }
965 break;
966 }
967
968 default:
969 return -1;
970 }
971
972 /* Size of buffer, not including 2 byte size field */
973 stw_be_p(outbuf, size - 2);
974 return size;
975
976fail:
b6c251ab
PB
977 return -1;
978}
979
3c2f7c12 980static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 981{
3c2f7c12
PB
982 uint8_t event_code, media_status;
983
984 media_status = 0;
985 if (s->tray_open) {
986 media_status = MS_TRAY_OPEN;
4be74634 987 } else if (blk_is_inserted(s->qdev.conf.blk)) {
3c2f7c12
PB
988 media_status = MS_MEDIA_PRESENT;
989 }
990
991 /* Event notification descriptor */
992 event_code = MEC_NO_CHANGE;
4480de19
PB
993 if (media_status != MS_TRAY_OPEN) {
994 if (s->media_event) {
995 event_code = MEC_NEW_MEDIA;
996 s->media_event = false;
997 } else if (s->eject_request) {
998 event_code = MEC_EJECT_REQUESTED;
999 s->eject_request = false;
1000 }
3c2f7c12
PB
1001 }
1002
1003 outbuf[0] = event_code;
1004 outbuf[1] = media_status;
1005
1006 /* These fields are reserved, just clear them. */
1007 outbuf[2] = 0;
1008 outbuf[3] = 0;
1009 return 4;
1010}
1011
1012static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
1013 uint8_t *outbuf)
1014{
1015 int size;
1016 uint8_t *buf = r->req.cmd.buf;
1017 uint8_t notification_class_request = buf[4];
1018 if (s->qdev.type != TYPE_ROM) {
1019 return -1;
1020 }
1021 if ((buf[1] & 1) == 0) {
1022 /* asynchronous */
1023 return -1;
1024 }
1025
1026 size = 4;
1027 outbuf[0] = outbuf[1] = 0;
1028 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
1029 if (notification_class_request & (1 << GESN_MEDIA)) {
1030 outbuf[2] = GESN_MEDIA;
1031 size += scsi_event_status_media(s, &outbuf[size]);
1032 } else {
1033 outbuf[2] = 0x80;
1034 }
1035 stw_be_p(outbuf, size - 4);
1036 return size;
b6c251ab
PB
1037}
1038
430ee2f2 1039static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 1040{
430ee2f2
PB
1041 int current;
1042
b6c251ab
PB
1043 if (s->qdev.type != TYPE_ROM) {
1044 return -1;
1045 }
7d99f4c1
MR
1046
1047 if (media_is_dvd(s)) {
1048 current = MMC_PROFILE_DVD_ROM;
1049 } else if (media_is_cd(s)) {
1050 current = MMC_PROFILE_CD_ROM;
1051 } else {
1052 current = MMC_PROFILE_NONE;
1053 }
1054
430ee2f2
PB
1055 memset(outbuf, 0, 40);
1056 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
1057 stw_be_p(&outbuf[6], current);
1058 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1059 outbuf[10] = 0x03; /* persistent, current */
1060 outbuf[11] = 8; /* two profiles */
1061 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
1062 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
1063 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
1064 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
1065 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1066 stw_be_p(&outbuf[20], 1);
1067 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
1068 outbuf[23] = 8;
1069 stl_be_p(&outbuf[24], 1); /* SCSI */
1070 outbuf[28] = 1; /* DBE = 1, mandatory */
1071 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1072 stw_be_p(&outbuf[32], 3);
1073 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
1074 outbuf[35] = 4;
1075 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1076 /* TODO: Random readable, CD read, DVD read, drive serial number,
1077 power management */
1078 return 40;
b6c251ab
PB
1079}
1080
1081static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
1082{
1083 if (s->qdev.type != TYPE_ROM) {
1084 return -1;
1085 }
1086 memset(outbuf, 0, 8);
1087 outbuf[5] = 1; /* CD-ROM */
1088 return 8;
1089}
1090
cfc606da 1091static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
282ab04e 1092 int page_control)
ebddfcbe 1093{
a8f4bbe2
PB
1094 static const int mode_sense_valid[0x3f] = {
1095 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
1096 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
1097 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
a07c7dcd
PB
1098 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
1099 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
a8f4bbe2
PB
1100 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
1101 };
ef405611
PB
1102
1103 uint8_t *p = *p_outbuf + 2;
1104 int length;
ebddfcbe 1105
a8f4bbe2
PB
1106 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
1107 return -1;
1108 }
1109
282ab04e
BK
1110 /*
1111 * If Changeable Values are requested, a mask denoting those mode parameters
1112 * that are changeable shall be returned. As we currently don't support
1113 * parameter changes via MODE_SELECT all bits are returned set to zero.
1114 * The buffer was already menset to zero by the caller of this function.
ef405611
PB
1115 *
1116 * The offsets here are off by two compared to the descriptions in the
1117 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1118 * but it is done so that offsets are consistent within our implementation
1119 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1120 * 2-byte and 4-byte headers.
282ab04e 1121 */
ebddfcbe 1122 switch (page) {
67cc61e4 1123 case MODE_PAGE_HD_GEOMETRY:
ef405611 1124 length = 0x16;
282ab04e 1125 if (page_control == 1) { /* Changeable Values */
cfc606da 1126 break;
282ab04e 1127 }
ebddfcbe 1128 /* if a geometry hint is available, use it */
ef405611
PB
1129 p[0] = (s->qdev.conf.cyls >> 16) & 0xff;
1130 p[1] = (s->qdev.conf.cyls >> 8) & 0xff;
1131 p[2] = s->qdev.conf.cyls & 0xff;
1132 p[3] = s->qdev.conf.heads & 0xff;
ebddfcbe 1133 /* Write precomp start cylinder, disabled */
ef405611
PB
1134 p[4] = (s->qdev.conf.cyls >> 16) & 0xff;
1135 p[5] = (s->qdev.conf.cyls >> 8) & 0xff;
1136 p[6] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1137 /* Reduced current start cylinder, disabled */
ef405611
PB
1138 p[7] = (s->qdev.conf.cyls >> 16) & 0xff;
1139 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1140 p[9] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1141 /* Device step rate [ns], 200ns */
ef405611
PB
1142 p[10] = 0;
1143 p[11] = 200;
ebddfcbe 1144 /* Landing zone cylinder */
ef405611
PB
1145 p[12] = 0xff;
1146 p[13] = 0xff;
ebddfcbe 1147 p[14] = 0xff;
ebddfcbe 1148 /* Medium rotation rate [rpm], 5400 rpm */
ef405611
PB
1149 p[18] = (5400 >> 8) & 0xff;
1150 p[19] = 5400 & 0xff;
cfc606da 1151 break;
ebddfcbe 1152
67cc61e4 1153 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
ef405611 1154 length = 0x1e;
282ab04e 1155 if (page_control == 1) { /* Changeable Values */
cfc606da 1156 break;
282ab04e 1157 }
ebddfcbe 1158 /* Transfer rate [kbit/s], 5Mbit/s */
ef405611
PB
1159 p[0] = 5000 >> 8;
1160 p[1] = 5000 & 0xff;
ebddfcbe 1161 /* if a geometry hint is available, use it */
ef405611
PB
1162 p[2] = s->qdev.conf.heads & 0xff;
1163 p[3] = s->qdev.conf.secs & 0xff;
1164 p[4] = s->qdev.blocksize >> 8;
1165 p[6] = (s->qdev.conf.cyls >> 8) & 0xff;
1166 p[7] = s->qdev.conf.cyls & 0xff;
1167 /* Write precomp start cylinder, disabled */
d252df48
MA
1168 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1169 p[9] = s->qdev.conf.cyls & 0xff;
ef405611 1170 /* Reduced current start cylinder, disabled */
d252df48
MA
1171 p[10] = (s->qdev.conf.cyls >> 8) & 0xff;
1172 p[11] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1173 /* Device step rate [100us], 100us */
ef405611
PB
1174 p[12] = 0;
1175 p[13] = 1;
ebddfcbe 1176 /* Device step pulse width [us], 1us */
ef405611 1177 p[14] = 1;
ebddfcbe 1178 /* Device head settle delay [100us], 100us */
ef405611
PB
1179 p[15] = 0;
1180 p[16] = 1;
ebddfcbe 1181 /* Motor on delay [0.1s], 0.1s */
ef405611 1182 p[17] = 1;
ebddfcbe 1183 /* Motor off delay [0.1s], 0.1s */
ef405611 1184 p[18] = 1;
ebddfcbe 1185 /* Medium rotation rate [rpm], 5400 rpm */
ef405611
PB
1186 p[26] = (5400 >> 8) & 0xff;
1187 p[27] = 5400 & 0xff;
cfc606da 1188 break;
ebddfcbe 1189
67cc61e4 1190 case MODE_PAGE_CACHING:
ef405611 1191 length = 0x12;
96c91bbf 1192 if (page_control == 1 || /* Changeable Values */
4be74634 1193 blk_enable_write_cache(s->qdev.conf.blk)) {
ef405611 1194 p[0] = 4; /* WCE */
ebddfcbe 1195 }
cfc606da 1196 break;
ebddfcbe 1197
a07c7dcd 1198 case MODE_PAGE_R_W_ERROR:
ef405611 1199 length = 10;
4f588b15
PB
1200 if (page_control == 1) { /* Changeable Values */
1201 break;
1202 }
ef405611 1203 p[0] = 0x80; /* Automatic Write Reallocation Enabled */
a07c7dcd 1204 if (s->qdev.type == TYPE_ROM) {
ef405611 1205 p[1] = 0x20; /* Read Retry Count */
a07c7dcd
PB
1206 }
1207 break;
1208
1209 case MODE_PAGE_AUDIO_CTL:
ef405611 1210 length = 14;
a07c7dcd
PB
1211 break;
1212
67cc61e4 1213 case MODE_PAGE_CAPABILITIES:
ef405611 1214 length = 0x14;
282ab04e 1215 if (page_control == 1) { /* Changeable Values */
cfc606da 1216 break;
282ab04e 1217 }
a07c7dcd 1218
ef405611
PB
1219 p[0] = 0x3b; /* CD-R & CD-RW read */
1220 p[1] = 0; /* Writing not supported */
1221 p[2] = 0x7f; /* Audio, composite, digital out,
ebddfcbe 1222 mode 2 form 1&2, multi session */
ef405611 1223 p[3] = 0xff; /* CD DA, DA accurate, RW supported,
ebddfcbe
GH
1224 RW corrected, C2 errors, ISRC,
1225 UPC, Bar code */
ef405611 1226 p[4] = 0x2d | (s->tray_locked ? 2 : 0);
ebddfcbe 1227 /* Locking supported, jumper present, eject, tray */
ef405611 1228 p[5] = 0; /* no volume & mute control, no
ebddfcbe 1229 changer */
ef405611
PB
1230 p[6] = (50 * 176) >> 8; /* 50x read speed */
1231 p[7] = (50 * 176) & 0xff;
1232 p[8] = 2 >> 8; /* Two volume levels */
1233 p[9] = 2 & 0xff;
1234 p[10] = 2048 >> 8; /* 2M buffer */
1235 p[11] = 2048 & 0xff;
1236 p[12] = (16 * 176) >> 8; /* 16x read speed current */
1237 p[13] = (16 * 176) & 0xff;
1238 p[16] = (16 * 176) >> 8; /* 16x write speed */
1239 p[17] = (16 * 176) & 0xff;
1240 p[18] = (16 * 176) >> 8; /* 16x write speed current */
ebddfcbe 1241 p[19] = (16 * 176) & 0xff;
cfc606da 1242 break;
ebddfcbe
GH
1243
1244 default:
cfc606da 1245 return -1;
ebddfcbe 1246 }
cfc606da 1247
ef405611
PB
1248 assert(length < 256);
1249 (*p_outbuf)[0] = page;
1250 (*p_outbuf)[1] = length;
1251 *p_outbuf += length + 2;
1252 return length + 2;
ebddfcbe
GH
1253}
1254
cfc606da 1255static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
ebddfcbe 1256{
cfc606da 1257 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ebddfcbe 1258 uint64_t nb_sectors;
e590ecbe
PB
1259 bool dbd;
1260 int page, buflen, ret, page_control;
ebddfcbe 1261 uint8_t *p;
ce512ee1 1262 uint8_t dev_specific_param;
ebddfcbe 1263
e590ecbe 1264 dbd = (r->req.cmd.buf[1] & 0x8) != 0;
cfc606da
PB
1265 page = r->req.cmd.buf[2] & 0x3f;
1266 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
aa2b1e89 1267 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
cfc606da
PB
1268 (r->req.cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, r->req.cmd.xfer, page_control);
1269 memset(outbuf, 0, r->req.cmd.xfer);
ebddfcbe
GH
1270 p = outbuf;
1271
e590ecbe 1272 if (s->qdev.type == TYPE_DISK) {
da8365db 1273 dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
4be74634 1274 if (blk_is_read_only(s->qdev.conf.blk)) {
e590ecbe
PB
1275 dev_specific_param |= 0x80; /* Readonly. */
1276 }
ce512ee1 1277 } else {
e590ecbe
PB
1278 /* MMC prescribes that CD/DVD drives have no block descriptors,
1279 * and defines no device-specific parameter. */
6a2de0f2 1280 dev_specific_param = 0x00;
e590ecbe 1281 dbd = true;
ce512ee1
BK
1282 }
1283
cfc606da 1284 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1285 p[1] = 0; /* Default media type. */
1286 p[2] = dev_specific_param;
1287 p[3] = 0; /* Block descriptor length. */
1288 p += 4;
1289 } else { /* MODE_SENSE_10 */
1290 p[2] = 0; /* Default media type. */
1291 p[3] = dev_specific_param;
1292 p[6] = p[7] = 0; /* Block descriptor length. */
1293 p += 8;
ebddfcbe 1294 }
ebddfcbe 1295
4be74634 1296 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
e590ecbe 1297 if (!dbd && nb_sectors) {
cfc606da 1298 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1299 outbuf[3] = 8; /* Block descriptor length */
1300 } else { /* MODE_SENSE_10 */
1301 outbuf[7] = 8; /* Block descriptor length */
1302 }
69377307 1303 nb_sectors /= (s->qdev.blocksize / 512);
f01b5931 1304 if (nb_sectors > 0xffffff) {
2488b740 1305 nb_sectors = 0;
f01b5931 1306 }
ebddfcbe
GH
1307 p[0] = 0; /* media density code */
1308 p[1] = (nb_sectors >> 16) & 0xff;
1309 p[2] = (nb_sectors >> 8) & 0xff;
1310 p[3] = nb_sectors & 0xff;
1311 p[4] = 0; /* reserved */
1312 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
69377307 1313 p[6] = s->qdev.blocksize >> 8;
ebddfcbe
GH
1314 p[7] = 0;
1315 p += 8;
1316 }
1317
cfc606da
PB
1318 if (page_control == 3) {
1319 /* Saved Values */
1320 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
1321 return -1;
282ab04e
BK
1322 }
1323
cfc606da
PB
1324 if (page == 0x3f) {
1325 for (page = 0; page <= 0x3e; page++) {
1326 mode_sense_page(s, page, &p, page_control);
1327 }
1328 } else {
1329 ret = mode_sense_page(s, page, &p, page_control);
1330 if (ret == -1) {
1331 return -1;
1332 }
ebddfcbe
GH
1333 }
1334
1335 buflen = p - outbuf;
ce512ee1
BK
1336 /*
1337 * The mode data length field specifies the length in bytes of the
1338 * following data that is available to be transferred. The mode data
1339 * length does not include itself.
1340 */
cfc606da 1341 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1342 outbuf[0] = buflen - 1;
1343 } else { /* MODE_SENSE_10 */
1344 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1345 outbuf[1] = (buflen - 2) & 0xff;
1346 }
ebddfcbe
GH
1347 return buflen;
1348}
1349
02880f43
GH
1350static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1351{
1352 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
02880f43
GH
1353 int start_track, format, msf, toclen;
1354 uint64_t nb_sectors;
1355
1356 msf = req->cmd.buf[1] & 2;
1357 format = req->cmd.buf[2] & 0xf;
1358 start_track = req->cmd.buf[6];
4be74634 1359 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
02880f43 1360 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
69377307 1361 nb_sectors /= s->qdev.blocksize / 512;
02880f43
GH
1362 switch (format) {
1363 case 0:
1364 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1365 break;
1366 case 1:
1367 /* multi session : only a single session defined */
1368 toclen = 12;
1369 memset(outbuf, 0, 12);
1370 outbuf[1] = 0x0a;
1371 outbuf[2] = 0x01;
1372 outbuf[3] = 0x01;
1373 break;
1374 case 2:
1375 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1376 break;
1377 default:
1378 return -1;
1379 }
02880f43
GH
1380 return toclen;
1381}
1382
68bb01f3 1383static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
bfd52647
MA
1384{
1385 SCSIRequest *req = &r->req;
1386 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1387 bool start = req->cmd.buf[4] & 1;
1388 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
ae5708b3
RS
1389 int pwrcnd = req->cmd.buf[4] & 0xf0;
1390
1391 if (pwrcnd) {
1392 /* eject/load only happens for power condition == 0 */
1393 return 0;
1394 }
bfd52647 1395
b456a71c 1396 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) {
68bb01f3
MA
1397 if (!start && !s->tray_open && s->tray_locked) {
1398 scsi_check_condition(r,
4be74634 1399 blk_is_inserted(s->qdev.conf.blk)
68bb01f3
MA
1400 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1401 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1402 return -1;
fdec4404 1403 }
d88b1819
LC
1404
1405 if (s->tray_open != !start) {
4be74634 1406 blk_eject(s->qdev.conf.blk, !start);
d88b1819
LC
1407 s->tray_open = !start;
1408 }
bfd52647 1409 }
68bb01f3 1410 return 0;
bfd52647
MA
1411}
1412
314a3299
PB
1413static void scsi_disk_emulate_read_data(SCSIRequest *req)
1414{
1415 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1416 int buflen = r->iov.iov_len;
1417
1418 if (buflen) {
79fb50bb 1419 DPRINTF("Read buf_len=%d\n", buflen);
314a3299
PB
1420 r->iov.iov_len = 0;
1421 r->started = true;
1422 scsi_req_data(&r->req, buflen);
1423 return;
1424 }
1425
1426 /* This also clears the sense buffer for REQUEST SENSE. */
1427 scsi_req_complete(&r->req, GOOD);
1428}
1429
380feaff
PB
1430static int scsi_disk_check_mode_select(SCSIDiskState *s, int page,
1431 uint8_t *inbuf, int inlen)
1432{
1433 uint8_t mode_current[SCSI_MAX_MODE_LEN];
1434 uint8_t mode_changeable[SCSI_MAX_MODE_LEN];
1435 uint8_t *p;
1436 int len, expected_len, changeable_len, i;
1437
1438 /* The input buffer does not include the page header, so it is
1439 * off by 2 bytes.
1440 */
1441 expected_len = inlen + 2;
1442 if (expected_len > SCSI_MAX_MODE_LEN) {
1443 return -1;
1444 }
1445
1446 p = mode_current;
1447 memset(mode_current, 0, inlen + 2);
1448 len = mode_sense_page(s, page, &p, 0);
1449 if (len < 0 || len != expected_len) {
1450 return -1;
1451 }
1452
1453 p = mode_changeable;
1454 memset(mode_changeable, 0, inlen + 2);
1455 changeable_len = mode_sense_page(s, page, &p, 1);
1456 assert(changeable_len == len);
1457
1458 /* Check that unchangeable bits are the same as what MODE SENSE
1459 * would return.
1460 */
1461 for (i = 2; i < len; i++) {
1462 if (((mode_current[i] ^ inbuf[i - 2]) & ~mode_changeable[i]) != 0) {
1463 return -1;
1464 }
1465 }
1466 return 0;
1467}
1468
1469static void scsi_disk_apply_mode_select(SCSIDiskState *s, int page, uint8_t *p)
1470{
96c91bbf
PB
1471 switch (page) {
1472 case MODE_PAGE_CACHING:
4be74634 1473 blk_set_enable_write_cache(s->qdev.conf.blk, (p[0] & 4) != 0);
96c91bbf
PB
1474 break;
1475
1476 default:
1477 break;
1478 }
380feaff
PB
1479}
1480
1481static int mode_select_pages(SCSIDiskReq *r, uint8_t *p, int len, bool change)
1482{
1483 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1484
1485 while (len > 0) {
1486 int page, subpage, page_len;
1487
1488 /* Parse both possible formats for the mode page headers. */
1489 page = p[0] & 0x3f;
1490 if (p[0] & 0x40) {
1491 if (len < 4) {
1492 goto invalid_param_len;
1493 }
1494 subpage = p[1];
1495 page_len = lduw_be_p(&p[2]);
1496 p += 4;
1497 len -= 4;
1498 } else {
1499 if (len < 2) {
1500 goto invalid_param_len;
1501 }
1502 subpage = 0;
1503 page_len = p[1];
1504 p += 2;
1505 len -= 2;
1506 }
1507
1508 if (subpage) {
1509 goto invalid_param;
1510 }
1511 if (page_len > len) {
1512 goto invalid_param_len;
1513 }
1514
1515 if (!change) {
1516 if (scsi_disk_check_mode_select(s, page, p, page_len) < 0) {
1517 goto invalid_param;
1518 }
1519 } else {
1520 scsi_disk_apply_mode_select(s, page, p);
1521 }
1522
1523 p += page_len;
1524 len -= page_len;
1525 }
1526 return 0;
1527
1528invalid_param:
1529 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1530 return -1;
1531
1532invalid_param_len:
1533 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1534 return -1;
1535}
1536
1537static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf)
1538{
accfeb2d 1539 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
380feaff
PB
1540 uint8_t *p = inbuf;
1541 int cmd = r->req.cmd.buf[0];
1542 int len = r->req.cmd.xfer;
1543 int hdr_len = (cmd == MODE_SELECT ? 4 : 8);
1544 int bd_len;
1545 int pass;
1546
1547 /* We only support PF=1, SP=0. */
1548 if ((r->req.cmd.buf[1] & 0x11) != 0x10) {
1549 goto invalid_field;
1550 }
1551
1552 if (len < hdr_len) {
1553 goto invalid_param_len;
1554 }
1555
1556 bd_len = (cmd == MODE_SELECT ? p[3] : lduw_be_p(&p[6]));
1557 len -= hdr_len;
1558 p += hdr_len;
1559 if (len < bd_len) {
1560 goto invalid_param_len;
1561 }
1562 if (bd_len != 0 && bd_len != 8) {
1563 goto invalid_param;
1564 }
1565
1566 len -= bd_len;
1567 p += bd_len;
1568
1569 /* Ensure no change is made if there is an error! */
1570 for (pass = 0; pass < 2; pass++) {
1571 if (mode_select_pages(r, p, len, pass == 1) < 0) {
1572 assert(pass == 0);
1573 return;
1574 }
1575 }
4be74634 1576 if (!blk_enable_write_cache(s->qdev.conf.blk)) {
accfeb2d
PB
1577 /* The request is used as the AIO opaque value, so add a ref. */
1578 scsi_req_ref(&r->req);
4be74634 1579 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 1580 BLOCK_ACCT_FLUSH);
4be74634 1581 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
accfeb2d
PB
1582 return;
1583 }
1584
380feaff
PB
1585 scsi_req_complete(&r->req, GOOD);
1586 return;
1587
1588invalid_param:
1589 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1590 return;
1591
1592invalid_param_len:
1593 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1594 return;
1595
1596invalid_field:
1597 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
380feaff
PB
1598}
1599
444bc908
PB
1600static inline bool check_lba_range(SCSIDiskState *s,
1601 uint64_t sector_num, uint32_t nb_sectors)
1602{
1603 /*
1604 * The first line tests that no overflow happens when computing the last
1605 * sector. The second line tests that the last accessed sector is in
1606 * range.
12ca76fc
PB
1607 *
1608 * Careful, the computations should not underflow for nb_sectors == 0,
1609 * and a 0-block read to the first LBA beyond the end of device is
1610 * valid.
444bc908
PB
1611 */
1612 return (sector_num <= sector_num + nb_sectors &&
12ca76fc 1613 sector_num + nb_sectors <= s->qdev.max_lba + 1);
444bc908
PB
1614}
1615
5222aaf2
PB
1616typedef struct UnmapCBData {
1617 SCSIDiskReq *r;
1618 uint8_t *inbuf;
1619 int count;
1620} UnmapCBData;
1621
5fd2b563
PB
1622static void scsi_unmap_complete(void *opaque, int ret);
1623
1624static void scsi_unmap_complete_noio(UnmapCBData *data, int ret)
5222aaf2 1625{
5222aaf2
PB
1626 SCSIDiskReq *r = data->r;
1627 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1628 uint64_t sector_num;
5bb0b62e 1629 uint32_t nb_sectors;
5222aaf2 1630
5fd2b563 1631 assert(r->req.aiocb == NULL);
5b956f41 1632 if (scsi_disk_req_check_error(r, ret, false)) {
d0242ead
PB
1633 goto done;
1634 }
1635
d0242ead 1636 if (data->count > 0) {
5222aaf2
PB
1637 sector_num = ldq_be_p(&data->inbuf[0]);
1638 nb_sectors = ldl_be_p(&data->inbuf[8]) & 0xffffffffULL;
444bc908 1639 if (!check_lba_range(s, sector_num, nb_sectors)) {
5222aaf2
PB
1640 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1641 goto done;
1642 }
1643
1c6c4bb7
EB
1644 r->req.aiocb = blk_aio_pdiscard(s->qdev.conf.blk,
1645 sector_num * s->qdev.blocksize,
1646 nb_sectors * s->qdev.blocksize,
1647 scsi_unmap_complete, data);
5222aaf2
PB
1648 data->count--;
1649 data->inbuf += 16;
1650 return;
1651 }
1652
d0242ead
PB
1653 scsi_req_complete(&r->req, GOOD);
1654
5222aaf2 1655done:
3df9caf8 1656 scsi_req_unref(&r->req);
5222aaf2
PB
1657 g_free(data);
1658}
1659
5fd2b563
PB
1660static void scsi_unmap_complete(void *opaque, int ret)
1661{
1662 UnmapCBData *data = opaque;
1663 SCSIDiskReq *r = data->r;
b9e413dd 1664 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
5fd2b563
PB
1665
1666 assert(r->req.aiocb != NULL);
1667 r->req.aiocb = NULL;
1668
b9e413dd 1669 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563 1670 scsi_unmap_complete_noio(data, ret);
b9e413dd 1671 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
1672}
1673
5222aaf2
PB
1674static void scsi_disk_emulate_unmap(SCSIDiskReq *r, uint8_t *inbuf)
1675{
c5fd1fb0 1676 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
5222aaf2
PB
1677 uint8_t *p = inbuf;
1678 int len = r->req.cmd.xfer;
1679 UnmapCBData *data;
1680
823bd739
PB
1681 /* Reject ANCHOR=1. */
1682 if (r->req.cmd.buf[1] & 0x1) {
1683 goto invalid_field;
1684 }
1685
5222aaf2
PB
1686 if (len < 8) {
1687 goto invalid_param_len;
1688 }
1689 if (len < lduw_be_p(&p[0]) + 2) {
1690 goto invalid_param_len;
1691 }
1692 if (len < lduw_be_p(&p[2]) + 8) {
1693 goto invalid_param_len;
1694 }
1695 if (lduw_be_p(&p[2]) & 15) {
1696 goto invalid_param_len;
1697 }
1698
4be74634 1699 if (blk_is_read_only(s->qdev.conf.blk)) {
c5fd1fb0
PB
1700 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1701 return;
1702 }
1703
5222aaf2
PB
1704 data = g_new0(UnmapCBData, 1);
1705 data->r = r;
1706 data->inbuf = &p[8];
1707 data->count = lduw_be_p(&p[2]) >> 4;
1708
1709 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1710 scsi_req_ref(&r->req);
5fd2b563 1711 scsi_unmap_complete_noio(data, 0);
5222aaf2
PB
1712 return;
1713
1714invalid_param_len:
1715 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
823bd739
PB
1716 return;
1717
1718invalid_field:
1719 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
5222aaf2
PB
1720}
1721
84f94a9a
PB
1722typedef struct WriteSameCBData {
1723 SCSIDiskReq *r;
1724 int64_t sector;
1725 int nb_sectors;
1726 QEMUIOVector qiov;
1727 struct iovec iov;
1728} WriteSameCBData;
1729
1730static void scsi_write_same_complete(void *opaque, int ret)
1731{
1732 WriteSameCBData *data = opaque;
1733 SCSIDiskReq *r = data->r;
1734 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1735
1736 assert(r->req.aiocb != NULL);
1737 r->req.aiocb = NULL;
b9e413dd 1738 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5b956f41 1739 if (scsi_disk_req_check_error(r, ret, true)) {
84f94a9a
PB
1740 goto done;
1741 }
1742
d7628080
AG
1743 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
1744
84f94a9a
PB
1745 data->nb_sectors -= data->iov.iov_len / 512;
1746 data->sector += data->iov.iov_len / 512;
1747 data->iov.iov_len = MIN(data->nb_sectors * 512, data->iov.iov_len);
1748 if (data->iov.iov_len) {
4be74634 1749 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8 1750 data->iov.iov_len, BLOCK_ACCT_WRITE);
03c90063
EB
1751 /* Reinitialize qiov, to handle unaligned WRITE SAME request
1752 * where final qiov may need smaller size */
a56537a1 1753 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
03c90063
EB
1754 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1755 data->sector << BDRV_SECTOR_BITS,
1756 &data->qiov, 0,
1757 scsi_write_same_complete, data);
84f94a9a
PB
1758 return;
1759 }
1760
1761 scsi_req_complete(&r->req, GOOD);
1762
1763done:
3df9caf8 1764 scsi_req_unref(&r->req);
84f94a9a
PB
1765 qemu_vfree(data->iov.iov_base);
1766 g_free(data);
b9e413dd 1767 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
84f94a9a
PB
1768}
1769
1770static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
1771{
1772 SCSIRequest *req = &r->req;
1773 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1894df02 1774 uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf);
84f94a9a
PB
1775 WriteSameCBData *data;
1776 uint8_t *buf;
1777 int i;
1778
1779 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1780 if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) {
1781 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1782 return;
1783 }
1784
4be74634 1785 if (blk_is_read_only(s->qdev.conf.blk)) {
84f94a9a
PB
1786 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1787 return;
1788 }
1789 if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) {
1790 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1791 return;
1792 }
1793
1794 if (buffer_is_zero(inbuf, s->qdev.blocksize)) {
1795 int flags = (req->cmd.buf[1] & 0x8) ? BDRV_REQ_MAY_UNMAP : 0;
1796
1797 /* The request is used as the AIO opaque value, so add a ref. */
1798 scsi_req_ref(&r->req);
4be74634 1799 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8
BC
1800 nb_sectors * s->qdev.blocksize,
1801 BLOCK_ACCT_WRITE);
d004bd52 1802 r->req.aiocb = blk_aio_pwrite_zeroes(s->qdev.conf.blk,
983a1600
EB
1803 r->req.cmd.lba * s->qdev.blocksize,
1804 nb_sectors * s->qdev.blocksize,
4be74634 1805 flags, scsi_aio_complete, r);
84f94a9a
PB
1806 return;
1807 }
1808
1809 data = g_new0(WriteSameCBData, 1);
1810 data->r = r;
1811 data->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1812 data->nb_sectors = nb_sectors * (s->qdev.blocksize / 512);
1813 data->iov.iov_len = MIN(data->nb_sectors * 512, SCSI_WRITE_SAME_MAX);
4be74634
MA
1814 data->iov.iov_base = buf = blk_blockalign(s->qdev.conf.blk,
1815 data->iov.iov_len);
84f94a9a
PB
1816 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
1817
1818 for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
1819 memcpy(&buf[i], inbuf, s->qdev.blocksize);
1820 }
1821
1822 scsi_req_ref(&r->req);
4be74634 1823 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8 1824 data->iov.iov_len, BLOCK_ACCT_WRITE);
03c90063
EB
1825 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1826 data->sector << BDRV_SECTOR_BITS,
1827 &data->qiov, 0,
1828 scsi_write_same_complete, data);
84f94a9a
PB
1829}
1830
314a3299
PB
1831static void scsi_disk_emulate_write_data(SCSIRequest *req)
1832{
af6d510d
PB
1833 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1834
1835 if (r->iov.iov_len) {
1836 int buflen = r->iov.iov_len;
79fb50bb 1837 DPRINTF("Write buf_len=%d\n", buflen);
af6d510d
PB
1838 r->iov.iov_len = 0;
1839 scsi_req_data(&r->req, buflen);
1840 return;
1841 }
1842
1843 switch (req->cmd.buf[0]) {
1844 case MODE_SELECT:
1845 case MODE_SELECT_10:
1846 /* This also clears the sense buffer for REQUEST SENSE. */
380feaff 1847 scsi_disk_emulate_mode_select(r, r->iov.iov_base);
af6d510d
PB
1848 break;
1849
5222aaf2
PB
1850 case UNMAP:
1851 scsi_disk_emulate_unmap(r, r->iov.iov_base);
1852 break;
1853
d97e7730
PB
1854 case VERIFY_10:
1855 case VERIFY_12:
1856 case VERIFY_16:
1857 if (r->req.status == -1) {
1858 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1859 }
1860 break;
1861
84f94a9a
PB
1862 case WRITE_SAME_10:
1863 case WRITE_SAME_16:
1864 scsi_disk_emulate_write_same(r, r->iov.iov_base);
1865 break;
d97e7730 1866
af6d510d
PB
1867 default:
1868 abort();
1869 }
314a3299
PB
1870}
1871
b08d0ea0 1872static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
aa5dbdc1 1873{
b08d0ea0 1874 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
e7e25e32 1875 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
e7e25e32 1876 uint64_t nb_sectors;
7285477a 1877 uint8_t *outbuf;
af6d510d 1878 int buflen;
aa5dbdc1 1879
b08d0ea0
PB
1880 switch (req->cmd.buf[0]) {
1881 case INQUIRY:
1882 case MODE_SENSE:
1883 case MODE_SENSE_10:
1884 case RESERVE:
1885 case RESERVE_10:
1886 case RELEASE:
1887 case RELEASE_10:
1888 case START_STOP:
1889 case ALLOW_MEDIUM_REMOVAL:
1890 case GET_CONFIGURATION:
1891 case GET_EVENT_STATUS_NOTIFICATION:
1892 case MECHANISM_STATUS:
1893 case REQUEST_SENSE:
1894 break;
1895
1896 default:
cd723b85 1897 if (!blk_is_available(s->qdev.conf.blk)) {
b08d0ea0
PB
1898 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1899 return 0;
1900 }
1901 break;
1902 }
1903
c8dcb531
PB
1904 /*
1905 * FIXME: we shouldn't return anything bigger than 4k, but the code
1906 * requires the buffer to be as big as req->cmd.xfer in several
1907 * places. So, do not allow CDBs with a very large ALLOCATION
1908 * LENGTH. The real fix would be to modify scsi_read_data and
1909 * dma_buf_read, so that they return data beyond the buflen
1910 * as all zeros.
1911 */
1912 if (req->cmd.xfer > 65536) {
1913 goto illegal_request;
1914 }
1915 r->buflen = MAX(4096, req->cmd.xfer);
1916
7285477a 1917 if (!r->iov.iov_base) {
4be74634 1918 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
7285477a
PB
1919 }
1920
af6d510d 1921 buflen = req->cmd.xfer;
7285477a 1922 outbuf = r->iov.iov_base;
c8dcb531 1923 memset(outbuf, 0, r->buflen);
aa5dbdc1
GH
1924 switch (req->cmd.buf[0]) {
1925 case TEST_UNIT_READY:
cd723b85 1926 assert(blk_is_available(s->qdev.conf.blk));
5f71d32f 1927 break;
0b06c059
GH
1928 case INQUIRY:
1929 buflen = scsi_disk_emulate_inquiry(req, outbuf);
f01b5931 1930 if (buflen < 0) {
0b06c059 1931 goto illegal_request;
f01b5931 1932 }
5f71d32f 1933 break;
ebddfcbe
GH
1934 case MODE_SENSE:
1935 case MODE_SENSE_10:
cfc606da 1936 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
f01b5931 1937 if (buflen < 0) {
ebddfcbe 1938 goto illegal_request;
f01b5931 1939 }
ebddfcbe 1940 break;
02880f43
GH
1941 case READ_TOC:
1942 buflen = scsi_disk_emulate_read_toc(req, outbuf);
f01b5931 1943 if (buflen < 0) {
02880f43 1944 goto illegal_request;
f01b5931 1945 }
02880f43 1946 break;
3d53ba18 1947 case RESERVE:
f01b5931 1948 if (req->cmd.buf[1] & 1) {
3d53ba18 1949 goto illegal_request;
f01b5931 1950 }
3d53ba18
GH
1951 break;
1952 case RESERVE_10:
f01b5931 1953 if (req->cmd.buf[1] & 3) {
3d53ba18 1954 goto illegal_request;
f01b5931 1955 }
3d53ba18
GH
1956 break;
1957 case RELEASE:
f01b5931 1958 if (req->cmd.buf[1] & 1) {
3d53ba18 1959 goto illegal_request;
f01b5931 1960 }
3d53ba18
GH
1961 break;
1962 case RELEASE_10:
f01b5931 1963 if (req->cmd.buf[1] & 3) {
3d53ba18 1964 goto illegal_request;
f01b5931 1965 }
3d53ba18 1966 break;
8d3628ff 1967 case START_STOP:
68bb01f3 1968 if (scsi_disk_emulate_start_stop(r) < 0) {
b08d0ea0 1969 return 0;
68bb01f3 1970 }
5f71d32f 1971 break;
c68b9f34 1972 case ALLOW_MEDIUM_REMOVAL:
81b1008d 1973 s->tray_locked = req->cmd.buf[4] & 1;
4be74634 1974 blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1);
5f71d32f 1975 break;
5e30a07d 1976 case READ_CAPACITY_10:
e7e25e32 1977 /* The normal LEN field for this command is zero. */
5f71d32f 1978 memset(outbuf, 0, 8);
4be74634 1979 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
f01b5931 1980 if (!nb_sectors) {
9bcaf4fe 1981 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
0369f06f 1982 return 0;
f01b5931 1983 }
7cec78b6
PB
1984 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1985 goto illegal_request;
1986 }
69377307 1987 nb_sectors /= s->qdev.blocksize / 512;
e7e25e32
GH
1988 /* Returned value is the address of the last sector. */
1989 nb_sectors--;
1990 /* Remember the new size for read/write sanity checking. */
7877903a 1991 s->qdev.max_lba = nb_sectors;
e7e25e32 1992 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
f01b5931 1993 if (nb_sectors > UINT32_MAX) {
e7e25e32 1994 nb_sectors = UINT32_MAX;
f01b5931 1995 }
e7e25e32
GH
1996 outbuf[0] = (nb_sectors >> 24) & 0xff;
1997 outbuf[1] = (nb_sectors >> 16) & 0xff;
1998 outbuf[2] = (nb_sectors >> 8) & 0xff;
1999 outbuf[3] = nb_sectors & 0xff;
2000 outbuf[4] = 0;
2001 outbuf[5] = 0;
69377307 2002 outbuf[6] = s->qdev.blocksize >> 8;
e7e25e32 2003 outbuf[7] = 0;
5f71d32f 2004 break;
f3b338ef
PB
2005 case REQUEST_SENSE:
2006 /* Just return "NO SENSE". */
37b6045c
PB
2007 buflen = scsi_convert_sense(NULL, 0, outbuf, r->buflen,
2008 (req->cmd.buf[1] & 1) == 0);
c8dcb531
PB
2009 if (buflen < 0) {
2010 goto illegal_request;
2011 }
f3b338ef 2012 break;
b6c251ab
PB
2013 case MECHANISM_STATUS:
2014 buflen = scsi_emulate_mechanism_status(s, outbuf);
2015 if (buflen < 0) {
2016 goto illegal_request;
2017 }
2018 break;
38215553 2019 case GET_CONFIGURATION:
430ee2f2 2020 buflen = scsi_get_configuration(s, outbuf);
b6c251ab
PB
2021 if (buflen < 0) {
2022 goto illegal_request;
2023 }
2024 break;
2025 case GET_EVENT_STATUS_NOTIFICATION:
2026 buflen = scsi_get_event_status_notification(s, r, outbuf);
2027 if (buflen < 0) {
2028 goto illegal_request;
2029 }
2030 break;
1a4f0c3a
PB
2031 case READ_DISC_INFORMATION:
2032 buflen = scsi_read_disc_information(s, r, outbuf);
2033 if (buflen < 0) {
2034 goto illegal_request;
2035 }
2036 break;
b6c251ab
PB
2037 case READ_DVD_STRUCTURE:
2038 buflen = scsi_read_dvd_structure(s, r, outbuf);
2039 if (buflen < 0) {
2040 goto illegal_request;
2041 }
38215553 2042 break;
f6515262 2043 case SERVICE_ACTION_IN_16:
5dd90e2a 2044 /* Service Action In subcommands. */
f6515262 2045 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
5dd90e2a
GH
2046 DPRINTF("SAI READ CAPACITY(16)\n");
2047 memset(outbuf, 0, req->cmd.xfer);
4be74634 2048 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
f01b5931 2049 if (!nb_sectors) {
9bcaf4fe 2050 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
0369f06f 2051 return 0;
f01b5931 2052 }
7cec78b6
PB
2053 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
2054 goto illegal_request;
2055 }
69377307 2056 nb_sectors /= s->qdev.blocksize / 512;
5dd90e2a
GH
2057 /* Returned value is the address of the last sector. */
2058 nb_sectors--;
2059 /* Remember the new size for read/write sanity checking. */
7877903a 2060 s->qdev.max_lba = nb_sectors;
5dd90e2a
GH
2061 outbuf[0] = (nb_sectors >> 56) & 0xff;
2062 outbuf[1] = (nb_sectors >> 48) & 0xff;
2063 outbuf[2] = (nb_sectors >> 40) & 0xff;
2064 outbuf[3] = (nb_sectors >> 32) & 0xff;
2065 outbuf[4] = (nb_sectors >> 24) & 0xff;
2066 outbuf[5] = (nb_sectors >> 16) & 0xff;
2067 outbuf[6] = (nb_sectors >> 8) & 0xff;
2068 outbuf[7] = nb_sectors & 0xff;
2069 outbuf[8] = 0;
2070 outbuf[9] = 0;
69377307 2071 outbuf[10] = s->qdev.blocksize >> 8;
5dd90e2a 2072 outbuf[11] = 0;
ee3659e3
CH
2073 outbuf[12] = 0;
2074 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
ea3bd56f
CH
2075
2076 /* set TPE bit if the format supports discard */
2077 if (s->qdev.conf.discard_granularity) {
2078 outbuf[14] = 0x80;
2079 }
2080
5dd90e2a 2081 /* Protection, exponent and lowest lba field left blank. */
5dd90e2a
GH
2082 break;
2083 }
2084 DPRINTF("Unsupported Service Action In\n");
2085 goto illegal_request;
101aa85f
PB
2086 case SYNCHRONIZE_CACHE:
2087 /* The request is used as the AIO opaque value, so add a ref. */
2088 scsi_req_ref(&r->req);
4be74634 2089 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 2090 BLOCK_ACCT_FLUSH);
4be74634 2091 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
101aa85f
PB
2092 return 0;
2093 case SEEK_10:
2094 DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
2095 if (r->req.cmd.lba > s->qdev.max_lba) {
2096 goto illegal_lba;
2097 }
2098 break;
101aa85f 2099 case MODE_SELECT:
142c2145 2100 DPRINTF("Mode Select(6) (len %lu)\n", (unsigned long)r->req.cmd.xfer);
101aa85f
PB
2101 break;
2102 case MODE_SELECT_10:
142c2145 2103 DPRINTF("Mode Select(10) (len %lu)\n", (unsigned long)r->req.cmd.xfer);
101aa85f 2104 break;
5222aaf2 2105 case UNMAP:
142c2145 2106 DPRINTF("Unmap (len %lu)\n", (unsigned long)r->req.cmd.xfer);
5222aaf2 2107 break;
d97e7730
PB
2108 case VERIFY_10:
2109 case VERIFY_12:
2110 case VERIFY_16:
4525c133 2111 DPRINTF("Verify (bytchk %d)\n", (req->cmd.buf[1] >> 1) & 3);
d97e7730
PB
2112 if (req->cmd.buf[1] & 6) {
2113 goto illegal_request;
2114 }
2115 break;
101aa85f 2116 case WRITE_SAME_10:
101aa85f 2117 case WRITE_SAME_16:
84f94a9a
PB
2118 DPRINTF("WRITE SAME %d (len %lu)\n",
2119 req->cmd.buf[0] == WRITE_SAME_10 ? 10 : 16,
142c2145 2120 (unsigned long)r->req.cmd.xfer);
84f94a9a 2121 break;
aa5dbdc1 2122 default:
b9e77bc7
AK
2123 DPRINTF("Unknown SCSI command (%2.2x=%s)\n", buf[0],
2124 scsi_command_name(buf[0]));
b45ef674 2125 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
b08d0ea0 2126 return 0;
aa5dbdc1 2127 }
314a3299 2128 assert(!r->req.aiocb);
c8dcb531 2129 r->iov.iov_len = MIN(r->buflen, req->cmd.xfer);
b08d0ea0
PB
2130 if (r->iov.iov_len == 0) {
2131 scsi_req_complete(&r->req, GOOD);
2132 }
af6d510d
PB
2133 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
2134 assert(r->iov.iov_len == req->cmd.xfer);
2135 return -r->iov.iov_len;
2136 } else {
2137 return r->iov.iov_len;
2138 }
aa5dbdc1 2139
aa5dbdc1 2140illegal_request:
cfc606da
PB
2141 if (r->req.status == -1) {
2142 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2143 }
b08d0ea0 2144 return 0;
101aa85f
PB
2145
2146illegal_lba:
2147 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
2148 return 0;
aa5dbdc1
GH
2149}
2150
2e5d83bb
PB
2151/* Execute a scsi command. Returns the length of the data expected by the
2152 command. This will be Positive for data transfers from the device
2153 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2154 and zero if the command does not transfer any data. */
2155
b08d0ea0 2156static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
2e5d83bb 2157{
5c6c0e51
HR
2158 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2159 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
94f8ba11 2160 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
e93176d5 2161 uint32_t len;
a917d384 2162 uint8_t command;
a917d384
PB
2163
2164 command = buf[0];
aa5dbdc1 2165
cd723b85 2166 if (!blk_is_available(s->qdev.conf.blk)) {
b08d0ea0
PB
2167 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
2168 return 0;
9bcaf4fe
PB
2169 }
2170
1894df02 2171 len = scsi_data_cdb_xfer(r->req.cmd.buf);
a917d384 2172 switch (command) {
ebf46023
GH
2173 case READ_6:
2174 case READ_10:
bd536cf3
GH
2175 case READ_12:
2176 case READ_16:
e93176d5 2177 DPRINTF("Read (sector %" PRId64 ", count %u)\n", r->req.cmd.lba, len);
96bdbbab
RS
2178 if (r->req.cmd.buf[1] & 0xe0) {
2179 goto illegal_request;
2180 }
444bc908 2181 if (!check_lba_range(s, r->req.cmd.lba, len)) {
274fb0e1 2182 goto illegal_lba;
f01b5931 2183 }
69377307
PB
2184 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
2185 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 2186 break;
ebf46023
GH
2187 case WRITE_6:
2188 case WRITE_10:
bd536cf3
GH
2189 case WRITE_12:
2190 case WRITE_16:
5e30a07d 2191 case WRITE_VERIFY_10:
ebef0bbb
BK
2192 case WRITE_VERIFY_12:
2193 case WRITE_VERIFY_16:
4be74634 2194 if (blk_is_read_only(s->qdev.conf.blk)) {
6a8a685c
RS
2195 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
2196 return 0;
2197 }
e93176d5 2198 DPRINTF("Write %s(sector %" PRId64 ", count %u)\n",
2dd791b6
HR
2199 (command & 0xe) == 0xe ? "And Verify " : "",
2200 r->req.cmd.lba, len);
4f04560b 2201 /* fall through */
166dbda7
PB
2202 case VERIFY_10:
2203 case VERIFY_12:
2204 case VERIFY_16:
2205 /* We get here only for BYTCHK == 0x01 and only for scsi-block.
2206 * As far as DMA is concerned, we can treat it the same as a write;
2207 * scsi_block_do_sgio will send VERIFY commands.
2208 */
96bdbbab
RS
2209 if (r->req.cmd.buf[1] & 0xe0) {
2210 goto illegal_request;
2211 }
444bc908 2212 if (!check_lba_range(s, r->req.cmd.lba, len)) {
274fb0e1 2213 goto illegal_lba;
f01b5931 2214 }
69377307
PB
2215 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
2216 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 2217 break;
101aa85f 2218 default:
b08d0ea0 2219 abort();
96bdbbab
RS
2220 illegal_request:
2221 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2222 return 0;
274fb0e1 2223 illegal_lba:
b45ef674 2224 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
274fb0e1 2225 return 0;
2e5d83bb 2226 }
94f8ba11 2227 r->need_fua_emulation = sdc->need_fua_emulation(&r->req.cmd);
b08d0ea0 2228 if (r->sector_count == 0) {
b45ef674 2229 scsi_req_complete(&r->req, GOOD);
a917d384 2230 }
b08d0ea0 2231 assert(r->iov.iov_len == 0);
efb9ee02 2232 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
b08d0ea0 2233 return -r->sector_count * 512;
a917d384 2234 } else {
b08d0ea0 2235 return r->sector_count * 512;
2e5d83bb 2236 }
2e5d83bb
PB
2237}
2238
e9447f35
JK
2239static void scsi_disk_reset(DeviceState *dev)
2240{
2241 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
2242 uint64_t nb_sectors;
2243
c7b48872 2244 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
e9447f35 2245
4be74634 2246 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
69377307 2247 nb_sectors /= s->qdev.blocksize / 512;
e9447f35
JK
2248 if (nb_sectors) {
2249 nb_sectors--;
2250 }
7877903a 2251 s->qdev.max_lba = nb_sectors;
7721c7f7
PH
2252 /* reset tray statuses */
2253 s->tray_locked = 0;
2254 s->tray_open = 0;
e9447f35
JK
2255}
2256
aaebacef
PB
2257static void scsi_disk_resize_cb(void *opaque)
2258{
2259 SCSIDiskState *s = opaque;
2260
2261 /* SPC lists this sense code as available only for
2262 * direct-access devices.
2263 */
2264 if (s->qdev.type == TYPE_DISK) {
53200fad 2265 scsi_device_report_change(&s->qdev, SENSE_CODE(CAPACITY_CHANGED));
aaebacef
PB
2266 }
2267}
2268
39829a01 2269static void scsi_cd_change_media_cb(void *opaque, bool load, Error **errp)
2c6942fa 2270{
8a9c16f6
PB
2271 SCSIDiskState *s = opaque;
2272
2273 /*
2274 * When a CD gets changed, we have to report an ejected state and
2275 * then a loaded state to guests so that they detect tray
2276 * open/close and media change events. Guests that do not use
2277 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2278 * states rely on this behavior.
2279 *
2280 * media_changed governs the state machine used for unit attention
2281 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2282 */
2283 s->media_changed = load;
2284 s->tray_open = !load;
e48e84ea 2285 scsi_device_set_ua(&s->qdev, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM));
3c2f7c12 2286 s->media_event = true;
4480de19
PB
2287 s->eject_request = false;
2288}
2289
2290static void scsi_cd_eject_request_cb(void *opaque, bool force)
2291{
2292 SCSIDiskState *s = opaque;
2293
2294 s->eject_request = true;
2295 if (force) {
2296 s->tray_locked = false;
2297 }
2c6942fa
MA
2298}
2299
e4def80b
MA
2300static bool scsi_cd_is_tray_open(void *opaque)
2301{
2302 return ((SCSIDiskState *)opaque)->tray_open;
2303}
2304
f107639a
MA
2305static bool scsi_cd_is_medium_locked(void *opaque)
2306{
2307 return ((SCSIDiskState *)opaque)->tray_locked;
2308}
2309
aaebacef 2310static const BlockDevOps scsi_disk_removable_block_ops = {
2c6942fa 2311 .change_media_cb = scsi_cd_change_media_cb,
4480de19 2312 .eject_request_cb = scsi_cd_eject_request_cb,
e4def80b 2313 .is_tray_open = scsi_cd_is_tray_open,
f107639a 2314 .is_medium_locked = scsi_cd_is_medium_locked,
aaebacef
PB
2315
2316 .resize_cb = scsi_disk_resize_cb,
2317};
2318
2319static const BlockDevOps scsi_disk_block_ops = {
2320 .resize_cb = scsi_disk_resize_cb,
f107639a
MA
2321};
2322
8a9c16f6
PB
2323static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
2324{
2325 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2326 if (s->media_changed) {
2327 s->media_changed = false;
e48e84ea 2328 scsi_device_set_ua(&s->qdev, SENSE_CODE(MEDIUM_CHANGED));
8a9c16f6
PB
2329 }
2330}
2331
a818a4b6 2332static void scsi_realize(SCSIDevice *dev, Error **errp)
2e5d83bb 2333{
d52affa7 2334 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2e5d83bb 2335
4be74634 2336 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2337 error_setg(errp, "drive property not set");
2338 return;
d52affa7
GH
2339 }
2340
bfe3d7ac 2341 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
4be74634 2342 !blk_is_inserted(s->qdev.conf.blk)) {
a818a4b6
FZ
2343 error_setg(errp, "Device needs media, but drive is empty");
2344 return;
98f28ad7
MA
2345 }
2346
911525db 2347 blkconf_serial(&s->qdev.conf, &s->serial);
0eb28a42 2348 blkconf_blocksizes(&s->qdev.conf);
3da023b5
MK
2349
2350 if (s->qdev.conf.logical_block_size >
2351 s->qdev.conf.physical_block_size) {
2352 error_setg(errp,
2353 "logical_block_size > physical_block_size not supported");
2354 return;
2355 }
2356
5ff5efb4 2357 if (dev->type == TYPE_DISK) {
ceff3e1f 2358 if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) {
a818a4b6 2359 return;
5ff5efb4 2360 }
b7eb0c9f 2361 }
ceff3e1f
MZ
2362 if (!blkconf_apply_backend_options(&dev->conf,
2363 blk_is_read_only(s->qdev.conf.blk),
2364 dev->type == TYPE_DISK, errp)) {
a17c17a2
KW
2365 return;
2366 }
a0fef654 2367
215e47b9
PB
2368 if (s->qdev.conf.discard_granularity == -1) {
2369 s->qdev.conf.discard_granularity =
2370 MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY);
2371 }
2372
552fee93 2373 if (!s->version) {
35c2c8dc 2374 s->version = g_strdup(qemu_hw_version());
552fee93 2375 }
353815aa
DF
2376 if (!s->vendor) {
2377 s->vendor = g_strdup("QEMU");
2378 }
552fee93 2379
4be74634 2380 if (blk_is_sg(s->qdev.conf.blk)) {
a818a4b6
FZ
2381 error_setg(errp, "unwanted /dev/sg*");
2382 return;
32bb404a
MA
2383 }
2384
18e673b8
PH
2385 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
2386 !(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
4be74634 2387 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s);
aaebacef 2388 } else {
4be74634 2389 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s);
2e5d83bb 2390 }
4be74634 2391 blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
8cfacf07 2392
4be74634 2393 blk_iostatus_enable(s->qdev.conf.blk);
d52affa7
GH
2394}
2395
a818a4b6 2396static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2397{
e39be482 2398 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
df1d4c34
ET
2399 /* can happen for devices without drive. The error message for missing
2400 * backend will be issued in scsi_realize
2401 */
2402 if (s->qdev.conf.blk) {
2403 blkconf_blocksizes(&s->qdev.conf);
2404 }
e39be482
PB
2405 s->qdev.blocksize = s->qdev.conf.logical_block_size;
2406 s->qdev.type = TYPE_DISK;
353815aa
DF
2407 if (!s->product) {
2408 s->product = g_strdup("QEMU HARDDISK");
2409 }
a818a4b6 2410 scsi_realize(&s->qdev, errp);
b443ae67
MA
2411}
2412
a818a4b6 2413static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2414{
e39be482 2415 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
83b4fe0e 2416 int ret;
9ef6e505
KW
2417
2418 if (!dev->conf.blk) {
83b4fe0e
KW
2419 /* Anonymous BlockBackend for an empty drive. As we put it into
2420 * dev->conf, qdev takes care of detaching on unplug. */
6d0eb64d 2421 dev->conf.blk = blk_new(0, BLK_PERM_ALL);
83b4fe0e
KW
2422 ret = blk_attach_dev(dev->conf.blk, &dev->qdev);
2423 assert(ret == 0);
9ef6e505
KW
2424 }
2425
e39be482
PB
2426 s->qdev.blocksize = 2048;
2427 s->qdev.type = TYPE_ROM;
bfe3d7ac 2428 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
353815aa
DF
2429 if (!s->product) {
2430 s->product = g_strdup("QEMU CD-ROM");
2431 }
a818a4b6 2432 scsi_realize(&s->qdev, errp);
b443ae67
MA
2433}
2434
a818a4b6 2435static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
b443ae67 2436{
95b5edcd 2437 DriveInfo *dinfo;
a818a4b6 2438 Error *local_err = NULL;
b443ae67 2439
4be74634 2440 if (!dev->conf.blk) {
a818a4b6
FZ
2441 scsi_realize(dev, &local_err);
2442 assert(local_err);
2443 error_propagate(errp, local_err);
2444 return;
b443ae67
MA
2445 }
2446
4be74634 2447 dinfo = blk_legacy_dinfo(dev->conf.blk);
26f8b3a8 2448 if (dinfo && dinfo->media_cd) {
a818a4b6 2449 scsi_cd_realize(dev, errp);
e39be482 2450 } else {
a818a4b6 2451 scsi_hd_realize(dev, errp);
e39be482 2452 }
b443ae67
MA
2453}
2454
b08d0ea0 2455static const SCSIReqOps scsi_disk_emulate_reqops = {
8dbd4574 2456 .size = sizeof(SCSIDiskReq),
12010e7b 2457 .free_req = scsi_free_request,
b08d0ea0 2458 .send_command = scsi_disk_emulate_command,
314a3299
PB
2459 .read_data = scsi_disk_emulate_read_data,
2460 .write_data = scsi_disk_emulate_write_data,
b08d0ea0
PB
2461 .get_buf = scsi_get_buf,
2462};
2463
2464static const SCSIReqOps scsi_disk_dma_reqops = {
2465 .size = sizeof(SCSIDiskReq),
2466 .free_req = scsi_free_request,
2467 .send_command = scsi_disk_dma_command,
12010e7b
PB
2468 .read_data = scsi_read_data,
2469 .write_data = scsi_write_data,
12010e7b 2470 .get_buf = scsi_get_buf,
43b978b9
PB
2471 .load_request = scsi_disk_load_request,
2472 .save_request = scsi_disk_save_request,
8dbd4574
PB
2473};
2474
b08d0ea0
PB
2475static const SCSIReqOps *const scsi_disk_reqops_dispatch[256] = {
2476 [TEST_UNIT_READY] = &scsi_disk_emulate_reqops,
2477 [INQUIRY] = &scsi_disk_emulate_reqops,
2478 [MODE_SENSE] = &scsi_disk_emulate_reqops,
2479 [MODE_SENSE_10] = &scsi_disk_emulate_reqops,
2480 [START_STOP] = &scsi_disk_emulate_reqops,
2481 [ALLOW_MEDIUM_REMOVAL] = &scsi_disk_emulate_reqops,
2482 [READ_CAPACITY_10] = &scsi_disk_emulate_reqops,
2483 [READ_TOC] = &scsi_disk_emulate_reqops,
2484 [READ_DVD_STRUCTURE] = &scsi_disk_emulate_reqops,
2485 [READ_DISC_INFORMATION] = &scsi_disk_emulate_reqops,
2486 [GET_CONFIGURATION] = &scsi_disk_emulate_reqops,
2487 [GET_EVENT_STATUS_NOTIFICATION] = &scsi_disk_emulate_reqops,
2488 [MECHANISM_STATUS] = &scsi_disk_emulate_reqops,
2489 [SERVICE_ACTION_IN_16] = &scsi_disk_emulate_reqops,
2490 [REQUEST_SENSE] = &scsi_disk_emulate_reqops,
2491 [SYNCHRONIZE_CACHE] = &scsi_disk_emulate_reqops,
2492 [SEEK_10] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2493 [MODE_SELECT] = &scsi_disk_emulate_reqops,
2494 [MODE_SELECT_10] = &scsi_disk_emulate_reqops,
5222aaf2 2495 [UNMAP] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2496 [WRITE_SAME_10] = &scsi_disk_emulate_reqops,
2497 [WRITE_SAME_16] = &scsi_disk_emulate_reqops,
d97e7730
PB
2498 [VERIFY_10] = &scsi_disk_emulate_reqops,
2499 [VERIFY_12] = &scsi_disk_emulate_reqops,
2500 [VERIFY_16] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2501
2502 [READ_6] = &scsi_disk_dma_reqops,
2503 [READ_10] = &scsi_disk_dma_reqops,
2504 [READ_12] = &scsi_disk_dma_reqops,
2505 [READ_16] = &scsi_disk_dma_reqops,
b08d0ea0
PB
2506 [WRITE_6] = &scsi_disk_dma_reqops,
2507 [WRITE_10] = &scsi_disk_dma_reqops,
2508 [WRITE_12] = &scsi_disk_dma_reqops,
2509 [WRITE_16] = &scsi_disk_dma_reqops,
2510 [WRITE_VERIFY_10] = &scsi_disk_dma_reqops,
2511 [WRITE_VERIFY_12] = &scsi_disk_dma_reqops,
2512 [WRITE_VERIFY_16] = &scsi_disk_dma_reqops,
2513};
2514
63db0f0e
PB
2515static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
2516 uint8_t *buf, void *hba_private)
8dbd4574
PB
2517{
2518 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2519 SCSIRequest *req;
b08d0ea0
PB
2520 const SCSIReqOps *ops;
2521 uint8_t command;
8dbd4574 2522
79fb50bb
PB
2523 command = buf[0];
2524 ops = scsi_disk_reqops_dispatch[command];
2525 if (!ops) {
2526 ops = &scsi_disk_emulate_reqops;
2527 }
2528 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private);
2529
b08d0ea0 2530#ifdef DEBUG_SCSI
79fb50bb 2531 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
b08d0ea0
PB
2532 {
2533 int i;
1894df02 2534 for (i = 1; i < scsi_cdb_length(buf); i++) {
b08d0ea0
PB
2535 printf(" 0x%02x", buf[i]);
2536 }
2537 printf("\n");
2538 }
2539#endif
2540
8dbd4574
PB
2541 return req;
2542}
2543
336a6915
PB
2544#ifdef __linux__
2545static int get_device_type(SCSIDiskState *s)
2546{
336a6915
PB
2547 uint8_t cmd[16];
2548 uint8_t buf[36];
2549 uint8_t sensebuf[8];
2550 sg_io_hdr_t io_header;
2551 int ret;
2552
2553 memset(cmd, 0, sizeof(cmd));
2554 memset(buf, 0, sizeof(buf));
2555 cmd[0] = INQUIRY;
2556 cmd[4] = sizeof(buf);
2557
2558 memset(&io_header, 0, sizeof(io_header));
2559 io_header.interface_id = 'S';
2560 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
2561 io_header.dxfer_len = sizeof(buf);
2562 io_header.dxferp = buf;
2563 io_header.cmdp = cmd;
2564 io_header.cmd_len = sizeof(cmd);
2565 io_header.mx_sb_len = sizeof(sensebuf);
2566 io_header.sbp = sensebuf;
2567 io_header.timeout = 6000; /* XXX */
2568
4be74634 2569 ret = blk_ioctl(s->qdev.conf.blk, SG_IO, &io_header);
336a6915
PB
2570 if (ret < 0 || io_header.driver_status || io_header.host_status) {
2571 return -1;
2572 }
2573 s->qdev.type = buf[0];
bfe3d7ac
PB
2574 if (buf[1] & 0x80) {
2575 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
2576 }
336a6915
PB
2577 return 0;
2578}
2579
a818a4b6 2580static void scsi_block_realize(SCSIDevice *dev, Error **errp)
336a6915
PB
2581{
2582 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2583 int sg_version;
2584 int rc;
2585
4be74634 2586 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2587 error_setg(errp, "drive property not set");
2588 return;
336a6915
PB
2589 }
2590
2591 /* check we are using a driver managing SG_IO (version 3 and after) */
4be74634 2592 rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version);
4bbeb8b1 2593 if (rc < 0) {
a818a4b6 2594 error_setg(errp, "cannot get SG_IO version number: %s. "
6ee143a0 2595 "Is this a SCSI device?",
4bbeb8b1 2596 strerror(-rc));
a818a4b6 2597 return;
4bbeb8b1
FZ
2598 }
2599 if (sg_version < 30000) {
a818a4b6
FZ
2600 error_setg(errp, "scsi generic interface too old");
2601 return;
336a6915
PB
2602 }
2603
2604 /* get device type from INQUIRY data */
2605 rc = get_device_type(s);
2606 if (rc < 0) {
a818a4b6
FZ
2607 error_setg(errp, "INQUIRY failed");
2608 return;
336a6915
PB
2609 }
2610
2611 /* Make a guess for the block size, we'll fix it when the guest sends.
2612 * READ CAPACITY. If they don't, they likely would assume these sizes
2613 * anyway. (TODO: check in /sys).
2614 */
2615 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
2616 s->qdev.blocksize = 2048;
2617 } else {
2618 s->qdev.blocksize = 512;
2619 }
18e673b8
PH
2620
2621 /* Makes the scsi-block device not removable by using HMP and QMP eject
2622 * command.
2623 */
2624 s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS);
2625
a818a4b6 2626 scsi_realize(&s->qdev, errp);
9fd7e859 2627 scsi_generic_read_device_identification(&s->qdev);
336a6915
PB
2628}
2629
8fdc7839
PB
2630typedef struct SCSIBlockReq {
2631 SCSIDiskReq req;
2632 sg_io_hdr_t io_header;
2633
2634 /* Selected bytes of the original CDB, copied into our own CDB. */
2635 uint8_t cmd, cdb1, group_number;
2636
2637 /* CDB passed to SG_IO. */
2638 uint8_t cdb[16];
2639} SCSIBlockReq;
2640
2641static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req,
2642 int64_t offset, QEMUIOVector *iov,
2643 int direction,
2644 BlockCompletionFunc *cb, void *opaque)
2645{
2646 sg_io_hdr_t *io_header = &req->io_header;
2647 SCSIDiskReq *r = &req->req;
2648 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2649 int nb_logical_blocks;
2650 uint64_t lba;
2651 BlockAIOCB *aiocb;
2652
2653 /* This is not supported yet. It can only happen if the guest does
2654 * reads and writes that are not aligned to one logical sectors
2655 * _and_ cover multiple MemoryRegions.
2656 */
2657 assert(offset % s->qdev.blocksize == 0);
2658 assert(iov->size % s->qdev.blocksize == 0);
2659
2660 io_header->interface_id = 'S';
2661
2662 /* The data transfer comes from the QEMUIOVector. */
2663 io_header->dxfer_direction = direction;
2664 io_header->dxfer_len = iov->size;
2665 io_header->dxferp = (void *)iov->iov;
2666 io_header->iovec_count = iov->niov;
2667 assert(io_header->iovec_count == iov->niov); /* no overflow! */
2668
2669 /* Build a new CDB with the LBA and length patched in, in case
2670 * DMA helpers split the transfer in multiple segments. Do not
2671 * build a CDB smaller than what the guest wanted, and only build
2672 * a larger one if strictly necessary.
2673 */
2674 io_header->cmdp = req->cdb;
2675 lba = offset / s->qdev.blocksize;
2676 nb_logical_blocks = io_header->dxfer_len / s->qdev.blocksize;
2677
2678 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) {
2679 /* 6-byte CDB */
2680 stl_be_p(&req->cdb[0], lba | (req->cmd << 24));
2681 req->cdb[4] = nb_logical_blocks;
2682 req->cdb[5] = 0;
2683 io_header->cmd_len = 6;
2684 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) {
2685 /* 10-byte CDB */
2686 req->cdb[0] = (req->cmd & 0x1f) | 0x20;
2687 req->cdb[1] = req->cdb1;
2688 stl_be_p(&req->cdb[2], lba);
2689 req->cdb[6] = req->group_number;
2690 stw_be_p(&req->cdb[7], nb_logical_blocks);
2691 req->cdb[9] = 0;
2692 io_header->cmd_len = 10;
2693 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) {
2694 /* 12-byte CDB */
2695 req->cdb[0] = (req->cmd & 0x1f) | 0xA0;
2696 req->cdb[1] = req->cdb1;
2697 stl_be_p(&req->cdb[2], lba);
2698 stl_be_p(&req->cdb[6], nb_logical_blocks);
2699 req->cdb[10] = req->group_number;
2700 req->cdb[11] = 0;
2701 io_header->cmd_len = 12;
2702 } else {
2703 /* 16-byte CDB */
2704 req->cdb[0] = (req->cmd & 0x1f) | 0x80;
2705 req->cdb[1] = req->cdb1;
2706 stq_be_p(&req->cdb[2], lba);
2707 stl_be_p(&req->cdb[10], nb_logical_blocks);
2708 req->cdb[14] = req->group_number;
2709 req->cdb[15] = 0;
2710 io_header->cmd_len = 16;
2711 }
2712
2713 /* The rest is as in scsi-generic.c. */
2714 io_header->mx_sb_len = sizeof(r->req.sense);
2715 io_header->sbp = r->req.sense;
2716 io_header->timeout = UINT_MAX;
2717 io_header->usr_ptr = r;
2718 io_header->flags |= SG_FLAG_DIRECT_IO;
2719
2720 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque);
2721 assert(aiocb != NULL);
2722 return aiocb;
2723}
2724
2725static bool scsi_block_no_fua(SCSICommand *cmd)
2726{
2727 return false;
2728}
2729
2730static BlockAIOCB *scsi_block_dma_readv(int64_t offset,
2731 QEMUIOVector *iov,
2732 BlockCompletionFunc *cb, void *cb_opaque,
2733 void *opaque)
2734{
2735 SCSIBlockReq *r = opaque;
2736 return scsi_block_do_sgio(r, offset, iov,
2737 SG_DXFER_FROM_DEV, cb, cb_opaque);
2738}
2739
2740static BlockAIOCB *scsi_block_dma_writev(int64_t offset,
2741 QEMUIOVector *iov,
2742 BlockCompletionFunc *cb, void *cb_opaque,
2743 void *opaque)
2744{
2745 SCSIBlockReq *r = opaque;
2746 return scsi_block_do_sgio(r, offset, iov,
2747 SG_DXFER_TO_DEV, cb, cb_opaque);
2748}
2749
592c3b28 2750static bool scsi_block_is_passthrough(SCSIDiskState *s, uint8_t *buf)
336a6915 2751{
336a6915 2752 switch (buf[0]) {
8fdc7839
PB
2753 case VERIFY_10:
2754 case VERIFY_12:
2755 case VERIFY_16:
2756 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2757 * for the number of logical blocks specified in the length
2758 * field). For other modes, do not use scatter/gather operation.
2759 */
1f8af0d1 2760 if ((buf[1] & 6) == 2) {
8fdc7839
PB
2761 return false;
2762 }
2763 break;
2764
336a6915
PB
2765 case READ_6:
2766 case READ_10:
2767 case READ_12:
2768 case READ_16:
2769 case WRITE_6:
2770 case WRITE_10:
2771 case WRITE_12:
2772 case WRITE_16:
2773 case WRITE_VERIFY_10:
2774 case WRITE_VERIFY_12:
2775 case WRITE_VERIFY_16:
8fdc7839 2776 /* MMC writing cannot be done via DMA helpers, because it sometimes
33ebad12 2777 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
166dbda7 2778 * We might use scsi_block_dma_reqops as long as no writing commands are
33ebad12
PB
2779 * seen, but performance usually isn't paramount on optical media. So,
2780 * just make scsi-block operate the same as scsi-generic for them.
2781 */
b08d0ea0 2782 if (s->qdev.type != TYPE_ROM) {
592c3b28 2783 return false;
b08d0ea0 2784 }
592c3b28
PB
2785 break;
2786
2787 default:
2788 break;
336a6915
PB
2789 }
2790
592c3b28
PB
2791 return true;
2792}
2793
2794
8fdc7839
PB
2795static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf)
2796{
2797 SCSIBlockReq *r = (SCSIBlockReq *)req;
2798 r->cmd = req->cmd.buf[0];
2799 switch (r->cmd >> 5) {
2800 case 0:
2801 /* 6-byte CDB. */
2802 r->cdb1 = r->group_number = 0;
2803 break;
2804 case 1:
2805 /* 10-byte CDB. */
2806 r->cdb1 = req->cmd.buf[1];
2807 r->group_number = req->cmd.buf[6];
ed45cae3 2808 break;
8fdc7839
PB
2809 case 4:
2810 /* 12-byte CDB. */
2811 r->cdb1 = req->cmd.buf[1];
2812 r->group_number = req->cmd.buf[10];
2813 break;
2814 case 5:
2815 /* 16-byte CDB. */
2816 r->cdb1 = req->cmd.buf[1];
2817 r->group_number = req->cmd.buf[14];
2818 break;
2819 default:
2820 abort();
2821 }
2822
2823 if (r->cdb1 & 0xe0) {
2824 /* Protection information is not supported. */
2825 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD));
2826 return 0;
2827 }
2828
2829 r->req.status = &r->io_header.status;
2830 return scsi_disk_dma_command(req, buf);
2831}
2832
2833static const SCSIReqOps scsi_block_dma_reqops = {
2834 .size = sizeof(SCSIBlockReq),
2835 .free_req = scsi_free_request,
2836 .send_command = scsi_block_dma_command,
2837 .read_data = scsi_read_data,
2838 .write_data = scsi_write_data,
2839 .get_buf = scsi_get_buf,
2840 .load_request = scsi_disk_load_request,
2841 .save_request = scsi_disk_save_request,
2842};
2843
592c3b28
PB
2844static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
2845 uint32_t lun, uint8_t *buf,
2846 void *hba_private)
2847{
2848 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2849
2850 if (scsi_block_is_passthrough(s, buf)) {
2851 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
2852 hba_private);
2853 } else {
8fdc7839 2854 return scsi_req_alloc(&scsi_block_dma_reqops, &s->qdev, tag, lun,
592c3b28
PB
2855 hba_private);
2856 }
336a6915 2857}
3e7e180a
PB
2858
2859static int scsi_block_parse_cdb(SCSIDevice *d, SCSICommand *cmd,
2860 uint8_t *buf, void *hba_private)
2861{
2862 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2863
2864 if (scsi_block_is_passthrough(s, buf)) {
2865 return scsi_bus_parse_cdb(&s->qdev, cmd, buf, hba_private);
2866 } else {
2867 return scsi_req_parse_cdb(&s->qdev, cmd, buf);
2868 }
2869}
2870
336a6915
PB
2871#endif
2872
fcaafb10
PB
2873static
2874BlockAIOCB *scsi_dma_readv(int64_t offset, QEMUIOVector *iov,
2875 BlockCompletionFunc *cb, void *cb_opaque,
2876 void *opaque)
2877{
2878 SCSIDiskReq *r = opaque;
2879 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2880 return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2881}
2882
2883static
2884BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
2885 BlockCompletionFunc *cb, void *cb_opaque,
2886 void *opaque)
2887{
2888 SCSIDiskReq *r = opaque;
2889 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2890 return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2891}
2892
993935f3
PB
2893static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
2894{
2895 DeviceClass *dc = DEVICE_CLASS(klass);
fcaafb10 2896 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
993935f3
PB
2897
2898 dc->fw_name = "disk";
2899 dc->reset = scsi_disk_reset;
fcaafb10
PB
2900 sdc->dma_readv = scsi_dma_readv;
2901 sdc->dma_writev = scsi_dma_writev;
94f8ba11 2902 sdc->need_fua_emulation = scsi_is_cmd_fua;
993935f3
PB
2903}
2904
2905static const TypeInfo scsi_disk_base_info = {
2906 .name = TYPE_SCSI_DISK_BASE,
2907 .parent = TYPE_SCSI_DEVICE,
2908 .class_init = scsi_disk_base_class_initfn,
2909 .instance_size = sizeof(SCSIDiskState),
fcaafb10 2910 .class_size = sizeof(SCSIDiskClass),
6214a11a 2911 .abstract = true,
993935f3
PB
2912};
2913
353815aa
DF
2914#define DEFINE_SCSI_DISK_PROPERTIES() \
2915 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
8c398252 2916 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
353815aa
DF
2917 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2918 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2919 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
2920 DEFINE_PROP_STRING("product", SCSIDiskState, product)
b443ae67 2921
39bffca2
AL
2922static Property scsi_hd_properties[] = {
2923 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
2924 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
2925 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
2926 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
2927 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
2928 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2929 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 2930 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
2931 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
2932 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
2933 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
2934 DEFAULT_MAX_IO_SIZE),
070f8009 2935 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
d252df48 2936 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
39bffca2
AL
2937 DEFINE_PROP_END_OF_LIST(),
2938};
2939
43b978b9
PB
2940static const VMStateDescription vmstate_scsi_disk_state = {
2941 .name = "scsi-disk",
2942 .version_id = 1,
2943 .minimum_version_id = 1,
43b978b9
PB
2944 .fields = (VMStateField[]) {
2945 VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
2946 VMSTATE_BOOL(media_changed, SCSIDiskState),
2947 VMSTATE_BOOL(media_event, SCSIDiskState),
2948 VMSTATE_BOOL(eject_request, SCSIDiskState),
2949 VMSTATE_BOOL(tray_open, SCSIDiskState),
2950 VMSTATE_BOOL(tray_locked, SCSIDiskState),
2951 VMSTATE_END_OF_LIST()
2952 }
2953};
2954
b9eea3e6
AL
2955static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
2956{
39bffca2 2957 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2958 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2959
a818a4b6 2960 sc->realize = scsi_hd_realize;
b9eea3e6
AL
2961 sc->alloc_req = scsi_new_request;
2962 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 2963 dc->desc = "virtual SCSI disk";
39bffca2 2964 dc->props = scsi_hd_properties;
43b978b9 2965 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2966}
2967
8c43a6f0 2968static const TypeInfo scsi_hd_info = {
39bffca2 2969 .name = "scsi-hd",
993935f3 2970 .parent = TYPE_SCSI_DISK_BASE,
39bffca2
AL
2971 .class_init = scsi_hd_class_initfn,
2972};
2973
2974static Property scsi_cd_properties[] = {
2975 DEFINE_SCSI_DISK_PROPERTIES(),
2ecab408
PB
2976 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2977 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 2978 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
f8e1f533
PB
2979 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
2980 DEFAULT_MAX_IO_SIZE),
39bffca2 2981 DEFINE_PROP_END_OF_LIST(),
b9eea3e6
AL
2982};
2983
2984static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
2985{
39bffca2 2986 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2987 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2988
a818a4b6 2989 sc->realize = scsi_cd_realize;
b9eea3e6
AL
2990 sc->alloc_req = scsi_new_request;
2991 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 2992 dc->desc = "virtual SCSI CD-ROM";
39bffca2 2993 dc->props = scsi_cd_properties;
43b978b9 2994 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2995}
2996
8c43a6f0 2997static const TypeInfo scsi_cd_info = {
39bffca2 2998 .name = "scsi-cd",
993935f3 2999 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3000 .class_init = scsi_cd_class_initfn,
b9eea3e6
AL
3001};
3002
336a6915 3003#ifdef __linux__
39bffca2 3004static Property scsi_block_properties[] = {
14b20748 3005 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
4be74634 3006 DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
070f8009 3007 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
39bffca2
AL
3008 DEFINE_PROP_END_OF_LIST(),
3009};
3010
b9eea3e6
AL
3011static void scsi_block_class_initfn(ObjectClass *klass, void *data)
3012{
39bffca2 3013 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6 3014 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
8fdc7839 3015 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
b9eea3e6 3016
a818a4b6 3017 sc->realize = scsi_block_realize;
b9eea3e6 3018 sc->alloc_req = scsi_block_new_request;
3e7e180a 3019 sc->parse_cdb = scsi_block_parse_cdb;
8fdc7839
PB
3020 sdc->dma_readv = scsi_block_dma_readv;
3021 sdc->dma_writev = scsi_block_dma_writev;
3022 sdc->need_fua_emulation = scsi_block_no_fua;
39bffca2 3023 dc->desc = "SCSI block device passthrough";
39bffca2 3024 dc->props = scsi_block_properties;
43b978b9 3025 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3026}
3027
8c43a6f0 3028static const TypeInfo scsi_block_info = {
39bffca2 3029 .name = "scsi-block",
993935f3 3030 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3031 .class_init = scsi_block_class_initfn,
b9eea3e6 3032};
336a6915 3033#endif
b9eea3e6 3034
39bffca2
AL
3035static Property scsi_disk_properties[] = {
3036 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
3037 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
3038 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
3039 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
3040 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
3041 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
3042 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 3043 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
3044 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3045 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
3046 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3047 DEFAULT_MAX_IO_SIZE),
39bffca2
AL
3048 DEFINE_PROP_END_OF_LIST(),
3049};
3050
b9eea3e6
AL
3051static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
3052{
39bffca2 3053 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
3054 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3055
a818a4b6 3056 sc->realize = scsi_disk_realize;
b9eea3e6
AL
3057 sc->alloc_req = scsi_new_request;
3058 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
3059 dc->fw_name = "disk";
3060 dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
3061 dc->reset = scsi_disk_reset;
3062 dc->props = scsi_disk_properties;
43b978b9 3063 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3064}
3065
8c43a6f0 3066static const TypeInfo scsi_disk_info = {
39bffca2 3067 .name = "scsi-disk",
993935f3 3068 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3069 .class_init = scsi_disk_class_initfn,
d52affa7
GH
3070};
3071
83f7d43a 3072static void scsi_disk_register_types(void)
d52affa7 3073{
993935f3 3074 type_register_static(&scsi_disk_base_info);
39bffca2
AL
3075 type_register_static(&scsi_hd_info);
3076 type_register_static(&scsi_cd_info);
b9eea3e6 3077#ifdef __linux__
39bffca2 3078 type_register_static(&scsi_block_info);
b9eea3e6 3079#endif
39bffca2 3080 type_register_static(&scsi_disk_info);
8ccc2ace 3081}
83f7d43a
AF
3082
3083type_init(scsi_disk_register_types)
This page took 1.459917 seconds and 4 git commands to generate.