]> Git Repo - qemu.git/blame - hw/scsi/scsi-disk.c
hw/block: Fix the return type
[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);
5ff5efb4 2335 Error *err = NULL;
2e5d83bb 2336
4be74634 2337 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2338 error_setg(errp, "drive property not set");
2339 return;
d52affa7
GH
2340 }
2341
bfe3d7ac 2342 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
4be74634 2343 !blk_is_inserted(s->qdev.conf.blk)) {
a818a4b6
FZ
2344 error_setg(errp, "Device needs media, but drive is empty");
2345 return;
98f28ad7
MA
2346 }
2347
911525db 2348 blkconf_serial(&s->qdev.conf, &s->serial);
0eb28a42 2349 blkconf_blocksizes(&s->qdev.conf);
3da023b5
MK
2350
2351 if (s->qdev.conf.logical_block_size >
2352 s->qdev.conf.physical_block_size) {
2353 error_setg(errp,
2354 "logical_block_size > physical_block_size not supported");
2355 return;
2356 }
2357
5ff5efb4
FZ
2358 if (dev->type == TYPE_DISK) {
2359 blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, &err);
2360 if (err) {
a818a4b6
FZ
2361 error_propagate(errp, err);
2362 return;
5ff5efb4 2363 }
b7eb0c9f 2364 }
a17c17a2
KW
2365 blkconf_apply_backend_options(&dev->conf,
2366 blk_is_read_only(s->qdev.conf.blk),
2367 dev->type == TYPE_DISK, &err);
2368 if (err) {
2369 error_propagate(errp, err);
2370 return;
2371 }
a0fef654 2372
215e47b9
PB
2373 if (s->qdev.conf.discard_granularity == -1) {
2374 s->qdev.conf.discard_granularity =
2375 MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY);
2376 }
2377
552fee93 2378 if (!s->version) {
35c2c8dc 2379 s->version = g_strdup(qemu_hw_version());
552fee93 2380 }
353815aa
DF
2381 if (!s->vendor) {
2382 s->vendor = g_strdup("QEMU");
2383 }
552fee93 2384
4be74634 2385 if (blk_is_sg(s->qdev.conf.blk)) {
a818a4b6
FZ
2386 error_setg(errp, "unwanted /dev/sg*");
2387 return;
32bb404a
MA
2388 }
2389
18e673b8
PH
2390 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
2391 !(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
4be74634 2392 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s);
aaebacef 2393 } else {
4be74634 2394 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s);
2e5d83bb 2395 }
4be74634 2396 blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
8cfacf07 2397
4be74634 2398 blk_iostatus_enable(s->qdev.conf.blk);
d52affa7
GH
2399}
2400
a818a4b6 2401static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2402{
e39be482 2403 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
df1d4c34
ET
2404 /* can happen for devices without drive. The error message for missing
2405 * backend will be issued in scsi_realize
2406 */
2407 if (s->qdev.conf.blk) {
2408 blkconf_blocksizes(&s->qdev.conf);
2409 }
e39be482
PB
2410 s->qdev.blocksize = s->qdev.conf.logical_block_size;
2411 s->qdev.type = TYPE_DISK;
353815aa
DF
2412 if (!s->product) {
2413 s->product = g_strdup("QEMU HARDDISK");
2414 }
a818a4b6 2415 scsi_realize(&s->qdev, errp);
b443ae67
MA
2416}
2417
a818a4b6 2418static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2419{
e39be482 2420 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
83b4fe0e 2421 int ret;
9ef6e505
KW
2422
2423 if (!dev->conf.blk) {
83b4fe0e
KW
2424 /* Anonymous BlockBackend for an empty drive. As we put it into
2425 * dev->conf, qdev takes care of detaching on unplug. */
6d0eb64d 2426 dev->conf.blk = blk_new(0, BLK_PERM_ALL);
83b4fe0e
KW
2427 ret = blk_attach_dev(dev->conf.blk, &dev->qdev);
2428 assert(ret == 0);
9ef6e505
KW
2429 }
2430
e39be482
PB
2431 s->qdev.blocksize = 2048;
2432 s->qdev.type = TYPE_ROM;
bfe3d7ac 2433 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
353815aa
DF
2434 if (!s->product) {
2435 s->product = g_strdup("QEMU CD-ROM");
2436 }
a818a4b6 2437 scsi_realize(&s->qdev, errp);
b443ae67
MA
2438}
2439
a818a4b6 2440static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
b443ae67 2441{
95b5edcd 2442 DriveInfo *dinfo;
a818a4b6 2443 Error *local_err = NULL;
b443ae67 2444
4be74634 2445 if (!dev->conf.blk) {
a818a4b6
FZ
2446 scsi_realize(dev, &local_err);
2447 assert(local_err);
2448 error_propagate(errp, local_err);
2449 return;
b443ae67
MA
2450 }
2451
4be74634 2452 dinfo = blk_legacy_dinfo(dev->conf.blk);
26f8b3a8 2453 if (dinfo && dinfo->media_cd) {
a818a4b6 2454 scsi_cd_realize(dev, errp);
e39be482 2455 } else {
a818a4b6 2456 scsi_hd_realize(dev, errp);
e39be482 2457 }
b443ae67
MA
2458}
2459
b08d0ea0 2460static const SCSIReqOps scsi_disk_emulate_reqops = {
8dbd4574 2461 .size = sizeof(SCSIDiskReq),
12010e7b 2462 .free_req = scsi_free_request,
b08d0ea0 2463 .send_command = scsi_disk_emulate_command,
314a3299
PB
2464 .read_data = scsi_disk_emulate_read_data,
2465 .write_data = scsi_disk_emulate_write_data,
b08d0ea0
PB
2466 .get_buf = scsi_get_buf,
2467};
2468
2469static const SCSIReqOps scsi_disk_dma_reqops = {
2470 .size = sizeof(SCSIDiskReq),
2471 .free_req = scsi_free_request,
2472 .send_command = scsi_disk_dma_command,
12010e7b
PB
2473 .read_data = scsi_read_data,
2474 .write_data = scsi_write_data,
12010e7b 2475 .get_buf = scsi_get_buf,
43b978b9
PB
2476 .load_request = scsi_disk_load_request,
2477 .save_request = scsi_disk_save_request,
8dbd4574
PB
2478};
2479
b08d0ea0
PB
2480static const SCSIReqOps *const scsi_disk_reqops_dispatch[256] = {
2481 [TEST_UNIT_READY] = &scsi_disk_emulate_reqops,
2482 [INQUIRY] = &scsi_disk_emulate_reqops,
2483 [MODE_SENSE] = &scsi_disk_emulate_reqops,
2484 [MODE_SENSE_10] = &scsi_disk_emulate_reqops,
2485 [START_STOP] = &scsi_disk_emulate_reqops,
2486 [ALLOW_MEDIUM_REMOVAL] = &scsi_disk_emulate_reqops,
2487 [READ_CAPACITY_10] = &scsi_disk_emulate_reqops,
2488 [READ_TOC] = &scsi_disk_emulate_reqops,
2489 [READ_DVD_STRUCTURE] = &scsi_disk_emulate_reqops,
2490 [READ_DISC_INFORMATION] = &scsi_disk_emulate_reqops,
2491 [GET_CONFIGURATION] = &scsi_disk_emulate_reqops,
2492 [GET_EVENT_STATUS_NOTIFICATION] = &scsi_disk_emulate_reqops,
2493 [MECHANISM_STATUS] = &scsi_disk_emulate_reqops,
2494 [SERVICE_ACTION_IN_16] = &scsi_disk_emulate_reqops,
2495 [REQUEST_SENSE] = &scsi_disk_emulate_reqops,
2496 [SYNCHRONIZE_CACHE] = &scsi_disk_emulate_reqops,
2497 [SEEK_10] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2498 [MODE_SELECT] = &scsi_disk_emulate_reqops,
2499 [MODE_SELECT_10] = &scsi_disk_emulate_reqops,
5222aaf2 2500 [UNMAP] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2501 [WRITE_SAME_10] = &scsi_disk_emulate_reqops,
2502 [WRITE_SAME_16] = &scsi_disk_emulate_reqops,
d97e7730
PB
2503 [VERIFY_10] = &scsi_disk_emulate_reqops,
2504 [VERIFY_12] = &scsi_disk_emulate_reqops,
2505 [VERIFY_16] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2506
2507 [READ_6] = &scsi_disk_dma_reqops,
2508 [READ_10] = &scsi_disk_dma_reqops,
2509 [READ_12] = &scsi_disk_dma_reqops,
2510 [READ_16] = &scsi_disk_dma_reqops,
b08d0ea0
PB
2511 [WRITE_6] = &scsi_disk_dma_reqops,
2512 [WRITE_10] = &scsi_disk_dma_reqops,
2513 [WRITE_12] = &scsi_disk_dma_reqops,
2514 [WRITE_16] = &scsi_disk_dma_reqops,
2515 [WRITE_VERIFY_10] = &scsi_disk_dma_reqops,
2516 [WRITE_VERIFY_12] = &scsi_disk_dma_reqops,
2517 [WRITE_VERIFY_16] = &scsi_disk_dma_reqops,
2518};
2519
63db0f0e
PB
2520static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
2521 uint8_t *buf, void *hba_private)
8dbd4574
PB
2522{
2523 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2524 SCSIRequest *req;
b08d0ea0
PB
2525 const SCSIReqOps *ops;
2526 uint8_t command;
8dbd4574 2527
79fb50bb
PB
2528 command = buf[0];
2529 ops = scsi_disk_reqops_dispatch[command];
2530 if (!ops) {
2531 ops = &scsi_disk_emulate_reqops;
2532 }
2533 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private);
2534
b08d0ea0 2535#ifdef DEBUG_SCSI
79fb50bb 2536 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
b08d0ea0
PB
2537 {
2538 int i;
1894df02 2539 for (i = 1; i < scsi_cdb_length(buf); i++) {
b08d0ea0
PB
2540 printf(" 0x%02x", buf[i]);
2541 }
2542 printf("\n");
2543 }
2544#endif
2545
8dbd4574
PB
2546 return req;
2547}
2548
336a6915
PB
2549#ifdef __linux__
2550static int get_device_type(SCSIDiskState *s)
2551{
336a6915
PB
2552 uint8_t cmd[16];
2553 uint8_t buf[36];
2554 uint8_t sensebuf[8];
2555 sg_io_hdr_t io_header;
2556 int ret;
2557
2558 memset(cmd, 0, sizeof(cmd));
2559 memset(buf, 0, sizeof(buf));
2560 cmd[0] = INQUIRY;
2561 cmd[4] = sizeof(buf);
2562
2563 memset(&io_header, 0, sizeof(io_header));
2564 io_header.interface_id = 'S';
2565 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
2566 io_header.dxfer_len = sizeof(buf);
2567 io_header.dxferp = buf;
2568 io_header.cmdp = cmd;
2569 io_header.cmd_len = sizeof(cmd);
2570 io_header.mx_sb_len = sizeof(sensebuf);
2571 io_header.sbp = sensebuf;
2572 io_header.timeout = 6000; /* XXX */
2573
4be74634 2574 ret = blk_ioctl(s->qdev.conf.blk, SG_IO, &io_header);
336a6915
PB
2575 if (ret < 0 || io_header.driver_status || io_header.host_status) {
2576 return -1;
2577 }
2578 s->qdev.type = buf[0];
bfe3d7ac
PB
2579 if (buf[1] & 0x80) {
2580 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
2581 }
336a6915
PB
2582 return 0;
2583}
2584
a818a4b6 2585static void scsi_block_realize(SCSIDevice *dev, Error **errp)
336a6915
PB
2586{
2587 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2588 int sg_version;
2589 int rc;
2590
4be74634 2591 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2592 error_setg(errp, "drive property not set");
2593 return;
336a6915
PB
2594 }
2595
2596 /* check we are using a driver managing SG_IO (version 3 and after) */
4be74634 2597 rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version);
4bbeb8b1 2598 if (rc < 0) {
a818a4b6 2599 error_setg(errp, "cannot get SG_IO version number: %s. "
6ee143a0 2600 "Is this a SCSI device?",
4bbeb8b1 2601 strerror(-rc));
a818a4b6 2602 return;
4bbeb8b1
FZ
2603 }
2604 if (sg_version < 30000) {
a818a4b6
FZ
2605 error_setg(errp, "scsi generic interface too old");
2606 return;
336a6915
PB
2607 }
2608
2609 /* get device type from INQUIRY data */
2610 rc = get_device_type(s);
2611 if (rc < 0) {
a818a4b6
FZ
2612 error_setg(errp, "INQUIRY failed");
2613 return;
336a6915
PB
2614 }
2615
2616 /* Make a guess for the block size, we'll fix it when the guest sends.
2617 * READ CAPACITY. If they don't, they likely would assume these sizes
2618 * anyway. (TODO: check in /sys).
2619 */
2620 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
2621 s->qdev.blocksize = 2048;
2622 } else {
2623 s->qdev.blocksize = 512;
2624 }
18e673b8
PH
2625
2626 /* Makes the scsi-block device not removable by using HMP and QMP eject
2627 * command.
2628 */
2629 s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS);
2630
a818a4b6 2631 scsi_realize(&s->qdev, errp);
9fd7e859 2632 scsi_generic_read_device_identification(&s->qdev);
336a6915
PB
2633}
2634
8fdc7839
PB
2635typedef struct SCSIBlockReq {
2636 SCSIDiskReq req;
2637 sg_io_hdr_t io_header;
2638
2639 /* Selected bytes of the original CDB, copied into our own CDB. */
2640 uint8_t cmd, cdb1, group_number;
2641
2642 /* CDB passed to SG_IO. */
2643 uint8_t cdb[16];
2644} SCSIBlockReq;
2645
2646static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req,
2647 int64_t offset, QEMUIOVector *iov,
2648 int direction,
2649 BlockCompletionFunc *cb, void *opaque)
2650{
2651 sg_io_hdr_t *io_header = &req->io_header;
2652 SCSIDiskReq *r = &req->req;
2653 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2654 int nb_logical_blocks;
2655 uint64_t lba;
2656 BlockAIOCB *aiocb;
2657
2658 /* This is not supported yet. It can only happen if the guest does
2659 * reads and writes that are not aligned to one logical sectors
2660 * _and_ cover multiple MemoryRegions.
2661 */
2662 assert(offset % s->qdev.blocksize == 0);
2663 assert(iov->size % s->qdev.blocksize == 0);
2664
2665 io_header->interface_id = 'S';
2666
2667 /* The data transfer comes from the QEMUIOVector. */
2668 io_header->dxfer_direction = direction;
2669 io_header->dxfer_len = iov->size;
2670 io_header->dxferp = (void *)iov->iov;
2671 io_header->iovec_count = iov->niov;
2672 assert(io_header->iovec_count == iov->niov); /* no overflow! */
2673
2674 /* Build a new CDB with the LBA and length patched in, in case
2675 * DMA helpers split the transfer in multiple segments. Do not
2676 * build a CDB smaller than what the guest wanted, and only build
2677 * a larger one if strictly necessary.
2678 */
2679 io_header->cmdp = req->cdb;
2680 lba = offset / s->qdev.blocksize;
2681 nb_logical_blocks = io_header->dxfer_len / s->qdev.blocksize;
2682
2683 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) {
2684 /* 6-byte CDB */
2685 stl_be_p(&req->cdb[0], lba | (req->cmd << 24));
2686 req->cdb[4] = nb_logical_blocks;
2687 req->cdb[5] = 0;
2688 io_header->cmd_len = 6;
2689 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) {
2690 /* 10-byte CDB */
2691 req->cdb[0] = (req->cmd & 0x1f) | 0x20;
2692 req->cdb[1] = req->cdb1;
2693 stl_be_p(&req->cdb[2], lba);
2694 req->cdb[6] = req->group_number;
2695 stw_be_p(&req->cdb[7], nb_logical_blocks);
2696 req->cdb[9] = 0;
2697 io_header->cmd_len = 10;
2698 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) {
2699 /* 12-byte CDB */
2700 req->cdb[0] = (req->cmd & 0x1f) | 0xA0;
2701 req->cdb[1] = req->cdb1;
2702 stl_be_p(&req->cdb[2], lba);
2703 stl_be_p(&req->cdb[6], nb_logical_blocks);
2704 req->cdb[10] = req->group_number;
2705 req->cdb[11] = 0;
2706 io_header->cmd_len = 12;
2707 } else {
2708 /* 16-byte CDB */
2709 req->cdb[0] = (req->cmd & 0x1f) | 0x80;
2710 req->cdb[1] = req->cdb1;
2711 stq_be_p(&req->cdb[2], lba);
2712 stl_be_p(&req->cdb[10], nb_logical_blocks);
2713 req->cdb[14] = req->group_number;
2714 req->cdb[15] = 0;
2715 io_header->cmd_len = 16;
2716 }
2717
2718 /* The rest is as in scsi-generic.c. */
2719 io_header->mx_sb_len = sizeof(r->req.sense);
2720 io_header->sbp = r->req.sense;
2721 io_header->timeout = UINT_MAX;
2722 io_header->usr_ptr = r;
2723 io_header->flags |= SG_FLAG_DIRECT_IO;
2724
2725 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque);
2726 assert(aiocb != NULL);
2727 return aiocb;
2728}
2729
2730static bool scsi_block_no_fua(SCSICommand *cmd)
2731{
2732 return false;
2733}
2734
2735static BlockAIOCB *scsi_block_dma_readv(int64_t offset,
2736 QEMUIOVector *iov,
2737 BlockCompletionFunc *cb, void *cb_opaque,
2738 void *opaque)
2739{
2740 SCSIBlockReq *r = opaque;
2741 return scsi_block_do_sgio(r, offset, iov,
2742 SG_DXFER_FROM_DEV, cb, cb_opaque);
2743}
2744
2745static BlockAIOCB *scsi_block_dma_writev(int64_t offset,
2746 QEMUIOVector *iov,
2747 BlockCompletionFunc *cb, void *cb_opaque,
2748 void *opaque)
2749{
2750 SCSIBlockReq *r = opaque;
2751 return scsi_block_do_sgio(r, offset, iov,
2752 SG_DXFER_TO_DEV, cb, cb_opaque);
2753}
2754
592c3b28 2755static bool scsi_block_is_passthrough(SCSIDiskState *s, uint8_t *buf)
336a6915 2756{
336a6915 2757 switch (buf[0]) {
8fdc7839
PB
2758 case VERIFY_10:
2759 case VERIFY_12:
2760 case VERIFY_16:
2761 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2762 * for the number of logical blocks specified in the length
2763 * field). For other modes, do not use scatter/gather operation.
2764 */
1f8af0d1 2765 if ((buf[1] & 6) == 2) {
8fdc7839
PB
2766 return false;
2767 }
2768 break;
2769
336a6915
PB
2770 case READ_6:
2771 case READ_10:
2772 case READ_12:
2773 case READ_16:
2774 case WRITE_6:
2775 case WRITE_10:
2776 case WRITE_12:
2777 case WRITE_16:
2778 case WRITE_VERIFY_10:
2779 case WRITE_VERIFY_12:
2780 case WRITE_VERIFY_16:
8fdc7839 2781 /* MMC writing cannot be done via DMA helpers, because it sometimes
33ebad12 2782 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
166dbda7 2783 * We might use scsi_block_dma_reqops as long as no writing commands are
33ebad12
PB
2784 * seen, but performance usually isn't paramount on optical media. So,
2785 * just make scsi-block operate the same as scsi-generic for them.
2786 */
b08d0ea0 2787 if (s->qdev.type != TYPE_ROM) {
592c3b28 2788 return false;
b08d0ea0 2789 }
592c3b28
PB
2790 break;
2791
2792 default:
2793 break;
336a6915
PB
2794 }
2795
592c3b28
PB
2796 return true;
2797}
2798
2799
8fdc7839
PB
2800static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf)
2801{
2802 SCSIBlockReq *r = (SCSIBlockReq *)req;
2803 r->cmd = req->cmd.buf[0];
2804 switch (r->cmd >> 5) {
2805 case 0:
2806 /* 6-byte CDB. */
2807 r->cdb1 = r->group_number = 0;
2808 break;
2809 case 1:
2810 /* 10-byte CDB. */
2811 r->cdb1 = req->cmd.buf[1];
2812 r->group_number = req->cmd.buf[6];
ed45cae3 2813 break;
8fdc7839
PB
2814 case 4:
2815 /* 12-byte CDB. */
2816 r->cdb1 = req->cmd.buf[1];
2817 r->group_number = req->cmd.buf[10];
2818 break;
2819 case 5:
2820 /* 16-byte CDB. */
2821 r->cdb1 = req->cmd.buf[1];
2822 r->group_number = req->cmd.buf[14];
2823 break;
2824 default:
2825 abort();
2826 }
2827
2828 if (r->cdb1 & 0xe0) {
2829 /* Protection information is not supported. */
2830 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD));
2831 return 0;
2832 }
2833
2834 r->req.status = &r->io_header.status;
2835 return scsi_disk_dma_command(req, buf);
2836}
2837
2838static const SCSIReqOps scsi_block_dma_reqops = {
2839 .size = sizeof(SCSIBlockReq),
2840 .free_req = scsi_free_request,
2841 .send_command = scsi_block_dma_command,
2842 .read_data = scsi_read_data,
2843 .write_data = scsi_write_data,
2844 .get_buf = scsi_get_buf,
2845 .load_request = scsi_disk_load_request,
2846 .save_request = scsi_disk_save_request,
2847};
2848
592c3b28
PB
2849static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
2850 uint32_t lun, uint8_t *buf,
2851 void *hba_private)
2852{
2853 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2854
2855 if (scsi_block_is_passthrough(s, buf)) {
2856 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
2857 hba_private);
2858 } else {
8fdc7839 2859 return scsi_req_alloc(&scsi_block_dma_reqops, &s->qdev, tag, lun,
592c3b28
PB
2860 hba_private);
2861 }
336a6915 2862}
3e7e180a
PB
2863
2864static int scsi_block_parse_cdb(SCSIDevice *d, SCSICommand *cmd,
2865 uint8_t *buf, void *hba_private)
2866{
2867 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2868
2869 if (scsi_block_is_passthrough(s, buf)) {
2870 return scsi_bus_parse_cdb(&s->qdev, cmd, buf, hba_private);
2871 } else {
2872 return scsi_req_parse_cdb(&s->qdev, cmd, buf);
2873 }
2874}
2875
336a6915
PB
2876#endif
2877
fcaafb10
PB
2878static
2879BlockAIOCB *scsi_dma_readv(int64_t offset, QEMUIOVector *iov,
2880 BlockCompletionFunc *cb, void *cb_opaque,
2881 void *opaque)
2882{
2883 SCSIDiskReq *r = opaque;
2884 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2885 return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2886}
2887
2888static
2889BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
2890 BlockCompletionFunc *cb, void *cb_opaque,
2891 void *opaque)
2892{
2893 SCSIDiskReq *r = opaque;
2894 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2895 return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2896}
2897
993935f3
PB
2898static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
2899{
2900 DeviceClass *dc = DEVICE_CLASS(klass);
fcaafb10 2901 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
993935f3
PB
2902
2903 dc->fw_name = "disk";
2904 dc->reset = scsi_disk_reset;
fcaafb10
PB
2905 sdc->dma_readv = scsi_dma_readv;
2906 sdc->dma_writev = scsi_dma_writev;
94f8ba11 2907 sdc->need_fua_emulation = scsi_is_cmd_fua;
993935f3
PB
2908}
2909
2910static const TypeInfo scsi_disk_base_info = {
2911 .name = TYPE_SCSI_DISK_BASE,
2912 .parent = TYPE_SCSI_DEVICE,
2913 .class_init = scsi_disk_base_class_initfn,
2914 .instance_size = sizeof(SCSIDiskState),
fcaafb10 2915 .class_size = sizeof(SCSIDiskClass),
6214a11a 2916 .abstract = true,
993935f3
PB
2917};
2918
353815aa
DF
2919#define DEFINE_SCSI_DISK_PROPERTIES() \
2920 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
8c398252 2921 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
353815aa
DF
2922 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2923 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2924 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
2925 DEFINE_PROP_STRING("product", SCSIDiskState, product)
b443ae67 2926
39bffca2
AL
2927static Property scsi_hd_properties[] = {
2928 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
2929 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
2930 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
2931 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
2932 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
2933 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2934 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 2935 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
2936 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
2937 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
2938 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
2939 DEFAULT_MAX_IO_SIZE),
070f8009 2940 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
d252df48 2941 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
39bffca2
AL
2942 DEFINE_PROP_END_OF_LIST(),
2943};
2944
43b978b9
PB
2945static const VMStateDescription vmstate_scsi_disk_state = {
2946 .name = "scsi-disk",
2947 .version_id = 1,
2948 .minimum_version_id = 1,
43b978b9
PB
2949 .fields = (VMStateField[]) {
2950 VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
2951 VMSTATE_BOOL(media_changed, SCSIDiskState),
2952 VMSTATE_BOOL(media_event, SCSIDiskState),
2953 VMSTATE_BOOL(eject_request, SCSIDiskState),
2954 VMSTATE_BOOL(tray_open, SCSIDiskState),
2955 VMSTATE_BOOL(tray_locked, SCSIDiskState),
2956 VMSTATE_END_OF_LIST()
2957 }
2958};
2959
b9eea3e6
AL
2960static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
2961{
39bffca2 2962 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2963 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2964
a818a4b6 2965 sc->realize = scsi_hd_realize;
b9eea3e6
AL
2966 sc->alloc_req = scsi_new_request;
2967 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 2968 dc->desc = "virtual SCSI disk";
39bffca2 2969 dc->props = scsi_hd_properties;
43b978b9 2970 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2971}
2972
8c43a6f0 2973static const TypeInfo scsi_hd_info = {
39bffca2 2974 .name = "scsi-hd",
993935f3 2975 .parent = TYPE_SCSI_DISK_BASE,
39bffca2
AL
2976 .class_init = scsi_hd_class_initfn,
2977};
2978
2979static Property scsi_cd_properties[] = {
2980 DEFINE_SCSI_DISK_PROPERTIES(),
2ecab408
PB
2981 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2982 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 2983 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
f8e1f533
PB
2984 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
2985 DEFAULT_MAX_IO_SIZE),
39bffca2 2986 DEFINE_PROP_END_OF_LIST(),
b9eea3e6
AL
2987};
2988
2989static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
2990{
39bffca2 2991 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2992 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2993
a818a4b6 2994 sc->realize = scsi_cd_realize;
b9eea3e6
AL
2995 sc->alloc_req = scsi_new_request;
2996 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 2997 dc->desc = "virtual SCSI CD-ROM";
39bffca2 2998 dc->props = scsi_cd_properties;
43b978b9 2999 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3000}
3001
8c43a6f0 3002static const TypeInfo scsi_cd_info = {
39bffca2 3003 .name = "scsi-cd",
993935f3 3004 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3005 .class_init = scsi_cd_class_initfn,
b9eea3e6
AL
3006};
3007
336a6915 3008#ifdef __linux__
39bffca2 3009static Property scsi_block_properties[] = {
14b20748 3010 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
4be74634 3011 DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
070f8009 3012 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
39bffca2
AL
3013 DEFINE_PROP_END_OF_LIST(),
3014};
3015
b9eea3e6
AL
3016static void scsi_block_class_initfn(ObjectClass *klass, void *data)
3017{
39bffca2 3018 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6 3019 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
8fdc7839 3020 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
b9eea3e6 3021
a818a4b6 3022 sc->realize = scsi_block_realize;
b9eea3e6 3023 sc->alloc_req = scsi_block_new_request;
3e7e180a 3024 sc->parse_cdb = scsi_block_parse_cdb;
8fdc7839
PB
3025 sdc->dma_readv = scsi_block_dma_readv;
3026 sdc->dma_writev = scsi_block_dma_writev;
3027 sdc->need_fua_emulation = scsi_block_no_fua;
39bffca2 3028 dc->desc = "SCSI block device passthrough";
39bffca2 3029 dc->props = scsi_block_properties;
43b978b9 3030 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3031}
3032
8c43a6f0 3033static const TypeInfo scsi_block_info = {
39bffca2 3034 .name = "scsi-block",
993935f3 3035 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3036 .class_init = scsi_block_class_initfn,
b9eea3e6 3037};
336a6915 3038#endif
b9eea3e6 3039
39bffca2
AL
3040static Property scsi_disk_properties[] = {
3041 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
3042 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
3043 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
3044 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
3045 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
3046 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
3047 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 3048 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
3049 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3050 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
3051 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3052 DEFAULT_MAX_IO_SIZE),
39bffca2
AL
3053 DEFINE_PROP_END_OF_LIST(),
3054};
3055
b9eea3e6
AL
3056static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
3057{
39bffca2 3058 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
3059 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3060
a818a4b6 3061 sc->realize = scsi_disk_realize;
b9eea3e6
AL
3062 sc->alloc_req = scsi_new_request;
3063 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
3064 dc->fw_name = "disk";
3065 dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
3066 dc->reset = scsi_disk_reset;
3067 dc->props = scsi_disk_properties;
43b978b9 3068 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3069}
3070
8c43a6f0 3071static const TypeInfo scsi_disk_info = {
39bffca2 3072 .name = "scsi-disk",
993935f3 3073 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3074 .class_init = scsi_disk_class_initfn,
d52affa7
GH
3075};
3076
83f7d43a 3077static void scsi_disk_register_types(void)
d52affa7 3078{
993935f3 3079 type_register_static(&scsi_disk_base_info);
39bffca2
AL
3080 type_register_static(&scsi_hd_info);
3081 type_register_static(&scsi_cd_info);
b9eea3e6 3082#ifdef __linux__
39bffca2 3083 type_register_static(&scsi_block_info);
b9eea3e6 3084#endif
39bffca2 3085 type_register_static(&scsi_disk_info);
8ccc2ace 3086}
83f7d43a
AF
3087
3088type_init(scsi_disk_register_types)
This page took 1.505146 seconds and 4 git commands to generate.