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