]> git.proxmox.com Git - qemu.git/blame - hw/scsi-disk.c
cutils: add strpadcpy()
[qemu.git] / hw / 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"
2f792016 32#include "qemu-error.h"
43b443b6 33#include "scsi.h"
0d65e1f8 34#include "scsi-defs.h"
666daa68 35#include "sysemu.h"
2446333c 36#include "blockdev.h"
9db1c0f7 37#include "hw/block-common.h"
5d0d2467 38#include "dma.h"
22864256 39
336a6915
PB
40#ifdef __linux
41#include <scsi/sg.h>
42#endif
43
f0f72ffe 44#define SCSI_DMA_BUF_SIZE 131072
57575058 45#define SCSI_MAX_INQUIRY_LEN 256
a917d384 46
d52affa7
GH
47typedef struct SCSIDiskState SCSIDiskState;
48
4c41d2ef
GH
49typedef struct SCSIDiskReq {
50 SCSIRequest req;
a917d384 51 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
e035b43d
AL
52 uint64_t sector;
53 uint32_t sector_count;
7285477a 54 uint32_t buflen;
a0e66a69 55 bool started;
c87c0672
AL
56 struct iovec iov;
57 QEMUIOVector qiov;
a597e79c 58 BlockAcctCookie acct;
4c41d2ef 59} SCSIDiskReq;
a917d384 60
bfe3d7ac 61#define SCSI_DISK_F_REMOVABLE 0
da8365db 62#define SCSI_DISK_F_DPOFUA 1
bfe3d7ac 63
d52affa7 64struct SCSIDiskState
a917d384 65{
d52affa7 66 SCSIDevice qdev;
bfe3d7ac 67 uint32_t features;
8a9c16f6 68 bool media_changed;
3c2f7c12 69 bool media_event;
4480de19 70 bool eject_request;
27395add 71 uint64_t wwn;
213189ab 72 QEMUBH *bh;
383b4d9b 73 char *version;
a0fef654 74 char *serial;
ece0d5e9 75 bool tray_open;
81b1008d 76 bool tray_locked;
2e5d83bb
PB
77};
78
71544d30 79static int scsi_handle_rw_error(SCSIDiskReq *r, int error);
5dba48a8 80
ad2d30f7 81static void scsi_free_request(SCSIRequest *req)
4d611c9a 82{
ad2d30f7
PB
83 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
84
7285477a
PB
85 if (r->iov.iov_base) {
86 qemu_vfree(r->iov.iov_base);
87 }
4d611c9a
PB
88}
89
b45ef674
PB
90/* Helper function for command completion with sense. */
91static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
ed3a34a3 92{
02fa69b6
BS
93 DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
94 r->req.tag, sense.key, sense.asc, sense.ascq);
b45ef674
PB
95 scsi_req_build_sense(&r->req, sense);
96 scsi_req_complete(&r->req, CHECK_CONDITION);
4d611c9a
PB
97}
98
99/* Cancel a pending data transfer. */
5c6c0e51 100static void scsi_cancel_io(SCSIRequest *req)
4d611c9a 101{
5c6c0e51
HR
102 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
103
104 DPRINTF("Cancel tag=0x%x\n", req->tag);
105 if (r->req.aiocb) {
106 bdrv_aio_cancel(r->req.aiocb);
c7bae6a7
PB
107
108 /* This reference was left in by scsi_*_data. We take ownership of
109 * it the moment scsi_req_cancel is called, independent of whether
110 * bdrv_aio_cancel completes the request or not. */
111 scsi_req_unref(&r->req);
a917d384 112 }
5c6c0e51 113 r->req.aiocb = NULL;
a917d384
PB
114}
115
43b978b9 116static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
103b40f5 117{
7285477a
PB
118 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
119
120 if (!r->iov.iov_base) {
43b978b9 121 r->buflen = size;
44740c38 122 r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
7285477a
PB
123 }
124 r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
103b40f5
PB
125 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
126 return r->qiov.size / 512;
127}
128
43b978b9
PB
129static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
130{
131 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
132
133 qemu_put_be64s(f, &r->sector);
134 qemu_put_be32s(f, &r->sector_count);
135 qemu_put_be32s(f, &r->buflen);
18eef3bc
GH
136 if (r->buflen) {
137 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
138 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
139 } else if (!req->retry) {
140 uint32_t len = r->iov.iov_len;
141 qemu_put_be32s(f, &len);
142 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
143 }
43b978b9
PB
144 }
145}
146
147static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
148{
149 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
150
151 qemu_get_be64s(f, &r->sector);
152 qemu_get_be32s(f, &r->sector_count);
153 qemu_get_be32s(f, &r->buflen);
154 if (r->buflen) {
155 scsi_init_iovec(r, r->buflen);
156 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
157 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
18eef3bc
GH
158 } else if (!r->req.retry) {
159 uint32_t len;
160 qemu_get_be32s(f, &len);
161 r->iov.iov_len = len;
162 assert(r->iov.iov_len <= r->buflen);
163 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
43b978b9
PB
164 }
165 }
166
167 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
168}
169
b77912a7 170static void scsi_flush_complete(void * opaque, int ret)
5d0d2467
PB
171{
172 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
173 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
174
175 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
176
80624c93 177 if (ret < 0) {
5d0d2467
PB
178 if (scsi_handle_rw_error(r, -ret)) {
179 goto done;
180 }
181 }
182
5d0d2467
PB
183 scsi_req_complete(&r->req, GOOD);
184
185done:
b8aba8d7
PB
186 if (!r->req.io_canceled) {
187 scsi_req_unref(&r->req);
188 }
5d0d2467
PB
189}
190
7e8c49c5
PB
191static bool scsi_is_cmd_fua(SCSICommand *cmd)
192{
193 switch (cmd->buf[0]) {
194 case READ_10:
195 case READ_12:
196 case READ_16:
197 case WRITE_10:
198 case WRITE_12:
199 case WRITE_16:
200 return (cmd->buf[1] & 8) != 0;
201
7f64f8e2
PB
202 case VERIFY_10:
203 case VERIFY_12:
204 case VERIFY_16:
7e8c49c5
PB
205 case WRITE_VERIFY_10:
206 case WRITE_VERIFY_12:
207 case WRITE_VERIFY_16:
208 return true;
209
210 case READ_6:
211 case WRITE_6:
212 default:
213 return false;
214 }
215}
216
217static void scsi_write_do_fua(SCSIDiskReq *r)
218{
219 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
220
221 if (scsi_is_cmd_fua(&r->req.cmd)) {
222 bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
223 r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
224 return;
225 }
226
227 scsi_req_complete(&r->req, GOOD);
228 if (!r->req.io_canceled) {
229 scsi_req_unref(&r->req);
230 }
231}
232
b77912a7 233static void scsi_dma_complete(void *opaque, int ret)
a917d384 234{
4c41d2ef 235 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
a597e79c 236 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
a917d384 237
7f64f8e2
PB
238 if (r->req.aiocb != NULL) {
239 r->req.aiocb = NULL;
240 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
241 }
a597e79c 242
80624c93 243 if (ret < 0) {
71544d30 244 if (scsi_handle_rw_error(r, -ret)) {
c7bae6a7 245 goto done;
5dba48a8 246 }
4d611c9a 247 }
5dba48a8 248
b77912a7
PB
249 r->sector += r->sector_count;
250 r->sector_count = 0;
7e8c49c5
PB
251 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
252 scsi_write_do_fua(r);
253 return;
254 } else {
255 scsi_req_complete(&r->req, GOOD);
256 }
c7bae6a7
PB
257
258done:
259 if (!r->req.io_canceled) {
260 scsi_req_unref(&r->req);
261 }
4d611c9a
PB
262}
263
b77912a7 264static void scsi_read_complete(void * opaque, int ret)
0a4ac106
PB
265{
266 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
267 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
b77912a7 268 int n;
0a4ac106 269
b77912a7
PB
270 if (r->req.aiocb != NULL) {
271 r->req.aiocb = NULL;
272 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
273 }
0a4ac106
PB
274
275 if (ret < 0) {
71544d30 276 if (scsi_handle_rw_error(r, -ret)) {
c7bae6a7 277 goto done;
0a4ac106
PB
278 }
279 }
280
b77912a7
PB
281 DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->qiov.size);
282
283 n = r->qiov.size / 512;
284 r->sector += n;
285 r->sector_count -= n;
286 scsi_req_data(&r->req, r->qiov.size);
c7bae6a7
PB
287
288done:
289 if (!r->req.io_canceled) {
290 scsi_req_unref(&r->req);
291 }
0a4ac106 292}
5dba48a8 293
ac668426
PB
294/* Actually issue a read to the block device. */
295static void scsi_do_read(void *opaque, int ret)
296{
297 SCSIDiskReq *r = opaque;
298 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
299 uint32_t n;
300
301 if (r->req.aiocb != NULL) {
302 r->req.aiocb = NULL;
303 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
304 }
305
306 if (ret < 0) {
307 if (scsi_handle_rw_error(r, -ret)) {
308 goto done;
309 }
310 }
311
31e8fd86
PB
312 if (r->req.io_canceled) {
313 return;
314 }
315
316 /* The request is used as the AIO opaque value, so add a ref. */
317 scsi_req_ref(&r->req);
318
ac668426
PB
319 if (r->req.sg) {
320 dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BDRV_ACCT_READ);
321 r->req.resid -= r->req.sg->size;
322 r->req.aiocb = dma_bdrv_read(s->qdev.conf.bs, r->req.sg, r->sector,
323 scsi_dma_complete, r);
324 } else {
325 n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
326 bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
327 r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
328 scsi_read_complete, r);
329 }
330
331done:
332 if (!r->req.io_canceled) {
333 scsi_req_unref(&r->req);
334 }
335}
336
5c6c0e51
HR
337/* Read more data from scsi device into buffer. */
338static void scsi_read_data(SCSIRequest *req)
2e5d83bb 339{
5c6c0e51 340 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
5dba48a8 341 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ac668426 342 bool first;
2e5d83bb 343
a917d384 344 if (r->sector_count == (uint32_t)-1) {
aa2b1e89 345 DPRINTF("Read buf_len=%zd\n", r->iov.iov_len);
a917d384 346 r->sector_count = 0;
a0e66a69 347 r->started = true;
ab9adc88 348 scsi_req_data(&r->req, r->iov.iov_len);
a917d384 349 return;
2e5d83bb 350 }
a917d384
PB
351 DPRINTF("Read sector_count=%d\n", r->sector_count);
352 if (r->sector_count == 0) {
b45ef674
PB
353 /* This also clears the sense buffer for REQUEST SENSE. */
354 scsi_req_complete(&r->req, GOOD);
a917d384 355 return;
2e5d83bb
PB
356 }
357
6fa2c95f
SH
358 /* No data transfer may already be in progress */
359 assert(r->req.aiocb == NULL);
360
c7bae6a7
PB
361 /* The request is used as the AIO opaque value, so add a ref. */
362 scsi_req_ref(&r->req);
efb9ee02
HR
363 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
364 DPRINTF("Data transfer direction invalid\n");
365 scsi_read_complete(r, -EINVAL);
366 return;
367 }
368
a1aff5bf
MA
369 if (s->tray_open) {
370 scsi_read_complete(r, -ENOMEDIUM);
c7bae6a7 371 return;
a1aff5bf 372 }
c7bae6a7 373
ac668426 374 first = !r->started;
a0e66a69 375 r->started = true;
ac668426
PB
376 if (first && scsi_is_cmd_fua(&r->req.cmd)) {
377 bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
378 r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_do_read, r);
5d0d2467 379 } else {
ac668426 380 scsi_do_read(r, 0);
5d0d2467 381 }
2e5d83bb
PB
382}
383
c7bae6a7
PB
384/*
385 * scsi_handle_rw_error has two return values. 0 means that the error
386 * must be ignored, 1 means that the error has been processed and the
387 * caller should not do anything else for this request. Note that
388 * scsi_handle_rw_error always manages its reference counts, independent
389 * of the return value.
390 */
71544d30 391static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
5dba48a8 392{
71544d30 393 int is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
4c41d2ef 394 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
44740c38 395 BlockErrorAction action = bdrv_get_on_error(s->qdev.conf.bs, is_read);
ea8a5d7f 396
380f640f 397 if (action == BLOCK_ERR_IGNORE) {
329c0a48 398 bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_IGNORE, is_read);
ea8a5d7f 399 return 0;
380f640f 400 }
ea8a5d7f
AL
401
402 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
403 || action == BLOCK_ERR_STOP_ANY) {
5dba48a8 404
329c0a48 405 bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_STOP, is_read);
0461d5a6 406 vm_stop(RUN_STATE_IO_ERROR);
44740c38 407 bdrv_iostatus_set_err(s->qdev.conf.bs, error);
71544d30 408 scsi_req_retry(&r->req);
ea8a5d7f 409 } else {
efb9ee02 410 switch (error) {
7e218df5
PB
411 case ENOMEDIUM:
412 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
413 break;
efb9ee02 414 case ENOMEM:
b45ef674 415 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
efb9ee02
HR
416 break;
417 case EINVAL:
b45ef674 418 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
efb9ee02
HR
419 break;
420 default:
b45ef674 421 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
efb9ee02 422 break;
a1f0cce2 423 }
329c0a48 424 bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_REPORT, is_read);
ea8a5d7f 425 }
ea8a5d7f
AL
426 return 1;
427}
428
4d611c9a
PB
429static void scsi_write_complete(void * opaque, int ret)
430{
4c41d2ef 431 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
a597e79c 432 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ea8a5d7f
AL
433 uint32_t n;
434
8e321cc6
PB
435 if (r->req.aiocb != NULL) {
436 r->req.aiocb = NULL;
44740c38 437 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
8e321cc6 438 }
a597e79c 439
80624c93 440 if (ret < 0) {
71544d30 441 if (scsi_handle_rw_error(r, -ret)) {
c7bae6a7 442 goto done;
5dba48a8 443 }
4d611c9a
PB
444 }
445
103b40f5 446 n = r->qiov.size / 512;
ea8a5d7f
AL
447 r->sector += n;
448 r->sector_count -= n;
a917d384 449 if (r->sector_count == 0) {
7e8c49c5
PB
450 scsi_write_do_fua(r);
451 return;
a917d384 452 } else {
43b978b9 453 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
103b40f5
PB
454 DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
455 scsi_req_data(&r->req, r->qiov.size);
4d611c9a 456 }
c7bae6a7
PB
457
458done:
459 if (!r->req.io_canceled) {
460 scsi_req_unref(&r->req);
461 }
4d611c9a
PB
462}
463
42741212 464static void scsi_write_data(SCSIRequest *req)
ea8a5d7f 465{
5c6c0e51 466 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
4c41d2ef 467 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ea8a5d7f
AL
468 uint32_t n;
469
6fa2c95f
SH
470 /* No data transfer may already be in progress */
471 assert(r->req.aiocb == NULL);
472
c7bae6a7
PB
473 /* The request is used as the AIO opaque value, so add a ref. */
474 scsi_req_ref(&r->req);
efb9ee02
HR
475 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
476 DPRINTF("Data transfer direction invalid\n");
477 scsi_write_complete(r, -EINVAL);
42741212 478 return;
efb9ee02
HR
479 }
480
5d0d2467
PB
481 if (!r->req.sg && !r->qiov.size) {
482 /* Called for the first time. Ask the driver to send us more data. */
a0e66a69 483 r->started = true;
5d0d2467
PB
484 scsi_write_complete(r, 0);
485 return;
486 }
487 if (s->tray_open) {
488 scsi_write_complete(r, -ENOMEDIUM);
489 return;
490 }
491
7f64f8e2
PB
492 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 ||
493 r->req.cmd.buf[0] == VERIFY_16) {
494 if (r->req.sg) {
495 scsi_dma_complete(r, 0);
496 } else {
497 scsi_write_complete(r, 0);
498 }
499 return;
500 }
501
5d0d2467
PB
502 if (r->req.sg) {
503 dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BDRV_ACCT_WRITE);
504 r->req.resid -= r->req.sg->size;
505 r->req.aiocb = dma_bdrv_write(s->qdev.conf.bs, r->req.sg, r->sector,
506 scsi_dma_complete, r);
507 } else {
508 n = r->qiov.size / 512;
44740c38
PB
509 bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
510 r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
103b40f5 511 scsi_write_complete, r);
ea8a5d7f 512 }
a917d384 513}
2e5d83bb 514
a917d384 515/* Return a pointer to the data buffer. */
5c6c0e51 516static uint8_t *scsi_get_buf(SCSIRequest *req)
a917d384 517{
5c6c0e51 518 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2e5d83bb 519
3f4cb3d3 520 return (uint8_t *)r->iov.iov_base;
2e5d83bb
PB
521}
522
0b06c059
GH
523static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
524{
383b4d9b 525 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
0b06c059 526 int buflen = 0;
82579390 527 int start;
0b06c059 528
0b06c059
GH
529 if (req->cmd.buf[1] & 0x1) {
530 /* Vital product data */
531 uint8_t page_code = req->cmd.buf[2];
0b06c059 532
e39be482 533 outbuf[buflen++] = s->qdev.type & 0x1f;
0b06c059
GH
534 outbuf[buflen++] = page_code ; // this page
535 outbuf[buflen++] = 0x00;
82579390
PB
536 outbuf[buflen++] = 0x00;
537 start = buflen;
0b06c059
GH
538
539 switch (page_code) {
540 case 0x00: /* Supported page codes, mandatory */
39d98982 541 {
0b06c059
GH
542 DPRINTF("Inquiry EVPD[Supported pages] "
543 "buffer size %zd\n", req->cmd.xfer);
0b06c059 544 outbuf[buflen++] = 0x00; // list of supported pages (this page)
f01b5931 545 if (s->serial) {
3e1c0c9a 546 outbuf[buflen++] = 0x80; // unit serial number
f01b5931 547 }
0b06c059 548 outbuf[buflen++] = 0x83; // device identification
f37bd73b 549 if (s->qdev.type == TYPE_DISK) {
ea3bd56f
CH
550 outbuf[buflen++] = 0xb0; // block limits
551 outbuf[buflen++] = 0xb2; // thin provisioning
39d98982 552 }
0b06c059 553 break;
39d98982 554 }
0b06c059
GH
555 case 0x80: /* Device serial number, optional */
556 {
3e1c0c9a 557 int l;
0b06c059 558
3e1c0c9a
HR
559 if (!s->serial) {
560 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
561 return -1;
562 }
563
564 l = strlen(s->serial);
f01b5931 565 if (l > 20) {
0b06c059 566 l = 20;
f01b5931 567 }
0b06c059
GH
568
569 DPRINTF("Inquiry EVPD[Serial number] "
570 "buffer size %zd\n", req->cmd.xfer);
a0fef654 571 memcpy(outbuf+buflen, s->serial, l);
0b06c059
GH
572 buflen += l;
573 break;
574 }
575
576 case 0x83: /* Device identification page, mandatory */
577 {
fd930791
PB
578 const char *str = s->serial ?: bdrv_get_device_name(s->qdev.conf.bs);
579 int max_len = s->serial ? 20 : 255 - 8;
580 int id_len = strlen(str);
0b06c059 581
f01b5931 582 if (id_len > max_len) {
0b06c059 583 id_len = max_len;
f01b5931 584 }
0b06c059
GH
585 DPRINTF("Inquiry EVPD[Device identification] "
586 "buffer size %zd\n", req->cmd.xfer);
587
0b06c059
GH
588 outbuf[buflen++] = 0x2; // ASCII
589 outbuf[buflen++] = 0; // not officially assigned
590 outbuf[buflen++] = 0; // reserved
591 outbuf[buflen++] = id_len; // length of data following
fd930791 592 memcpy(outbuf+buflen, str, id_len);
0b06c059 593 buflen += id_len;
27395add
PB
594
595 if (s->wwn) {
596 outbuf[buflen++] = 0x1; // Binary
597 outbuf[buflen++] = 0x3; // NAA
598 outbuf[buflen++] = 0; // reserved
599 outbuf[buflen++] = 8;
600 stq_be_p(&outbuf[buflen], s->wwn);
601 buflen += 8;
602 }
0b06c059
GH
603 break;
604 }
ea3bd56f 605 case 0xb0: /* block limits */
ee3659e3 606 {
ea3bd56f
CH
607 unsigned int unmap_sectors =
608 s->qdev.conf.discard_granularity / s->qdev.blocksize;
8cfacf07
CH
609 unsigned int min_io_size =
610 s->qdev.conf.min_io_size / s->qdev.blocksize;
611 unsigned int opt_io_size =
612 s->qdev.conf.opt_io_size / s->qdev.blocksize;
ee3659e3 613
f37bd73b 614 if (s->qdev.type == TYPE_ROM) {
39d98982
HR
615 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
616 page_code);
617 return -1;
618 }
ee3659e3 619 /* required VPD size with unmap support */
82579390 620 buflen = 0x40;
ee3659e3
CH
621 memset(outbuf + 4, 0, buflen - 4);
622
623 /* optimal transfer length granularity */
624 outbuf[6] = (min_io_size >> 8) & 0xff;
625 outbuf[7] = min_io_size & 0xff;
626
627 /* optimal transfer length */
628 outbuf[12] = (opt_io_size >> 24) & 0xff;
629 outbuf[13] = (opt_io_size >> 16) & 0xff;
630 outbuf[14] = (opt_io_size >> 8) & 0xff;
631 outbuf[15] = opt_io_size & 0xff;
ea3bd56f
CH
632
633 /* optimal unmap granularity */
634 outbuf[28] = (unmap_sectors >> 24) & 0xff;
635 outbuf[29] = (unmap_sectors >> 16) & 0xff;
636 outbuf[30] = (unmap_sectors >> 8) & 0xff;
637 outbuf[31] = unmap_sectors & 0xff;
638 break;
639 }
640 case 0xb2: /* thin provisioning */
641 {
82579390 642 buflen = 8;
ea3bd56f 643 outbuf[4] = 0;
c9e4d828 644 outbuf[5] = 0x60; /* write_same 10/16 supported */
f644a290 645 outbuf[6] = s->qdev.conf.discard_granularity ? 2 : 1;
ea3bd56f 646 outbuf[7] = 0;
ee3659e3
CH
647 break;
648 }
0b06c059 649 default:
0b06c059
GH
650 return -1;
651 }
652 /* done with EVPD */
82579390
PB
653 assert(buflen - start <= 255);
654 outbuf[start - 1] = buflen - start;
0b06c059
GH
655 return buflen;
656 }
657
658 /* Standard INQUIRY data */
659 if (req->cmd.buf[2] != 0) {
0b06c059
GH
660 return -1;
661 }
662
663 /* PAGE CODE == 0 */
0b06c059 664 buflen = req->cmd.xfer;
f01b5931 665 if (buflen > SCSI_MAX_INQUIRY_LEN) {
0b06c059 666 buflen = SCSI_MAX_INQUIRY_LEN;
f01b5931 667 }
0b06c059
GH
668 memset(outbuf, 0, buflen);
669
f37bd73b 670 outbuf[0] = s->qdev.type & 0x1f;
bfe3d7ac 671 outbuf[1] = (s->features & (1 << SCSI_DISK_F_REMOVABLE)) ? 0x80 : 0;
f37bd73b 672 if (s->qdev.type == TYPE_ROM) {
550fe6c6 673 memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
0b06c059 674 } else {
550fe6c6 675 memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
0b06c059 676 }
550fe6c6 677 memcpy(&outbuf[8], "QEMU ", 8);
314b1811 678 memset(&outbuf[32], 0, 4);
552fee93 679 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
99aba0c4
CH
680 /*
681 * We claim conformance to SPC-3, which is required for guests
682 * to ask for modern features like READ CAPACITY(16) or the
683 * block characteristics VPD page by default. Not all of SPC-3
684 * is actually implemented, but we're good enough.
685 */
ee3659e3 686 outbuf[2] = 5;
0b06c059 687 outbuf[3] = 2; /* Format 2 */
ad3cea42
AT
688
689 if (buflen > 36) {
690 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
691 } else {
692 /* If the allocation length of CDB is too small,
693 the additional length is not adjusted */
694 outbuf[4] = 36 - 5;
695 }
696
0b06c059 697 /* Sync data transfer and TCQ. */
afd4030c 698 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
0b06c059
GH
699 return buflen;
700}
701
430ee2f2
PB
702static inline bool media_is_dvd(SCSIDiskState *s)
703{
704 uint64_t nb_sectors;
705 if (s->qdev.type != TYPE_ROM) {
706 return false;
707 }
44740c38 708 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
430ee2f2
PB
709 return false;
710 }
44740c38 711 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
430ee2f2
PB
712 return nb_sectors > CD_MAX_SECTORS;
713}
714
ceb792ef
PB
715static inline bool media_is_cd(SCSIDiskState *s)
716{
717 uint64_t nb_sectors;
718 if (s->qdev.type != TYPE_ROM) {
719 return false;
720 }
44740c38 721 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
ceb792ef
PB
722 return false;
723 }
44740c38 724 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
ceb792ef
PB
725 return nb_sectors <= CD_MAX_SECTORS;
726}
727
1a4f0c3a
PB
728static int scsi_read_disc_information(SCSIDiskState *s, SCSIDiskReq *r,
729 uint8_t *outbuf)
730{
731 uint8_t type = r->req.cmd.buf[1] & 7;
732
733 if (s->qdev.type != TYPE_ROM) {
734 return -1;
735 }
736
737 /* Types 1/2 are only defined for Blu-Ray. */
738 if (type != 0) {
739 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
740 return -1;
741 }
742
743 memset(outbuf, 0, 34);
744 outbuf[1] = 32;
745 outbuf[2] = 0xe; /* last session complete, disc finalized */
746 outbuf[3] = 1; /* first track on disc */
747 outbuf[4] = 1; /* # of sessions */
748 outbuf[5] = 1; /* first track of last session */
749 outbuf[6] = 1; /* last track of last session */
750 outbuf[7] = 0x20; /* unrestricted use */
751 outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
752 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
753 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
754 /* 24-31: disc bar code */
755 /* 32: disc application code */
756 /* 33: number of OPC tables */
757
758 return 34;
759}
760
b6c251ab
PB
761static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
762 uint8_t *outbuf)
763{
ceb792ef
PB
764 static const int rds_caps_size[5] = {
765 [0] = 2048 + 4,
766 [1] = 4 + 4,
767 [3] = 188 + 4,
768 [4] = 2048 + 4,
769 };
770
771 uint8_t media = r->req.cmd.buf[1];
772 uint8_t layer = r->req.cmd.buf[6];
773 uint8_t format = r->req.cmd.buf[7];
774 int size = -1;
775
776 if (s->qdev.type != TYPE_ROM) {
777 return -1;
778 }
779 if (media != 0) {
780 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
781 return -1;
782 }
783
784 if (format != 0xff) {
44740c38 785 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
ceb792ef
PB
786 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
787 return -1;
788 }
789 if (media_is_cd(s)) {
790 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
791 return -1;
792 }
793 if (format >= ARRAY_SIZE(rds_caps_size)) {
794 return -1;
795 }
796 size = rds_caps_size[format];
797 memset(outbuf, 0, size);
798 }
799
800 switch (format) {
801 case 0x00: {
802 /* Physical format information */
803 uint64_t nb_sectors;
804 if (layer != 0) {
805 goto fail;
806 }
44740c38 807 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
ceb792ef
PB
808
809 outbuf[4] = 1; /* DVD-ROM, part version 1 */
810 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
811 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
812 outbuf[7] = 0; /* default densities */
813
814 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
815 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
816 break;
817 }
818
819 case 0x01: /* DVD copyright information, all zeros */
820 break;
821
822 case 0x03: /* BCA information - invalid field for no BCA info */
823 return -1;
824
825 case 0x04: /* DVD disc manufacturing information, all zeros */
826 break;
827
828 case 0xff: { /* List capabilities */
829 int i;
830 size = 4;
831 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
832 if (!rds_caps_size[i]) {
833 continue;
834 }
835 outbuf[size] = i;
836 outbuf[size + 1] = 0x40; /* Not writable, readable */
837 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
838 size += 4;
839 }
840 break;
841 }
842
843 default:
844 return -1;
845 }
846
847 /* Size of buffer, not including 2 byte size field */
848 stw_be_p(outbuf, size - 2);
849 return size;
850
851fail:
b6c251ab
PB
852 return -1;
853}
854
3c2f7c12 855static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 856{
3c2f7c12
PB
857 uint8_t event_code, media_status;
858
859 media_status = 0;
860 if (s->tray_open) {
861 media_status = MS_TRAY_OPEN;
44740c38 862 } else if (bdrv_is_inserted(s->qdev.conf.bs)) {
3c2f7c12
PB
863 media_status = MS_MEDIA_PRESENT;
864 }
865
866 /* Event notification descriptor */
867 event_code = MEC_NO_CHANGE;
4480de19
PB
868 if (media_status != MS_TRAY_OPEN) {
869 if (s->media_event) {
870 event_code = MEC_NEW_MEDIA;
871 s->media_event = false;
872 } else if (s->eject_request) {
873 event_code = MEC_EJECT_REQUESTED;
874 s->eject_request = false;
875 }
3c2f7c12
PB
876 }
877
878 outbuf[0] = event_code;
879 outbuf[1] = media_status;
880
881 /* These fields are reserved, just clear them. */
882 outbuf[2] = 0;
883 outbuf[3] = 0;
884 return 4;
885}
886
887static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
888 uint8_t *outbuf)
889{
890 int size;
891 uint8_t *buf = r->req.cmd.buf;
892 uint8_t notification_class_request = buf[4];
893 if (s->qdev.type != TYPE_ROM) {
894 return -1;
895 }
896 if ((buf[1] & 1) == 0) {
897 /* asynchronous */
898 return -1;
899 }
900
901 size = 4;
902 outbuf[0] = outbuf[1] = 0;
903 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
904 if (notification_class_request & (1 << GESN_MEDIA)) {
905 outbuf[2] = GESN_MEDIA;
906 size += scsi_event_status_media(s, &outbuf[size]);
907 } else {
908 outbuf[2] = 0x80;
909 }
910 stw_be_p(outbuf, size - 4);
911 return size;
b6c251ab
PB
912}
913
430ee2f2 914static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 915{
430ee2f2
PB
916 int current;
917
b6c251ab
PB
918 if (s->qdev.type != TYPE_ROM) {
919 return -1;
920 }
430ee2f2
PB
921 current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM;
922 memset(outbuf, 0, 40);
923 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
924 stw_be_p(&outbuf[6], current);
925 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
926 outbuf[10] = 0x03; /* persistent, current */
927 outbuf[11] = 8; /* two profiles */
928 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
929 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
930 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
931 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
932 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
933 stw_be_p(&outbuf[20], 1);
934 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
935 outbuf[23] = 8;
936 stl_be_p(&outbuf[24], 1); /* SCSI */
937 outbuf[28] = 1; /* DBE = 1, mandatory */
938 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
939 stw_be_p(&outbuf[32], 3);
940 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
941 outbuf[35] = 4;
942 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
943 /* TODO: Random readable, CD read, DVD read, drive serial number,
944 power management */
945 return 40;
b6c251ab
PB
946}
947
948static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
949{
950 if (s->qdev.type != TYPE_ROM) {
951 return -1;
952 }
953 memset(outbuf, 0, 8);
954 outbuf[5] = 1; /* CD-ROM */
955 return 8;
956}
957
cfc606da 958static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
282ab04e 959 int page_control)
ebddfcbe 960{
a8f4bbe2
PB
961 static const int mode_sense_valid[0x3f] = {
962 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
963 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
964 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
a07c7dcd
PB
965 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
966 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
a8f4bbe2
PB
967 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
968 };
cfc606da 969 uint8_t *p = *p_outbuf;
ebddfcbe 970
a8f4bbe2
PB
971 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
972 return -1;
973 }
974
975 p[0] = page;
976
282ab04e
BK
977 /*
978 * If Changeable Values are requested, a mask denoting those mode parameters
979 * that are changeable shall be returned. As we currently don't support
980 * parameter changes via MODE_SELECT all bits are returned set to zero.
981 * The buffer was already menset to zero by the caller of this function.
982 */
ebddfcbe 983 switch (page) {
67cc61e4 984 case MODE_PAGE_HD_GEOMETRY:
ebddfcbe 985 p[1] = 0x16;
282ab04e 986 if (page_control == 1) { /* Changeable Values */
cfc606da 987 break;
282ab04e 988 }
ebddfcbe 989 /* if a geometry hint is available, use it */
d252df48
MA
990 p[2] = (s->qdev.conf.cyls >> 16) & 0xff;
991 p[3] = (s->qdev.conf.cyls >> 8) & 0xff;
992 p[4] = s->qdev.conf.cyls & 0xff;
993 p[5] = s->qdev.conf.heads & 0xff;
ebddfcbe 994 /* Write precomp start cylinder, disabled */
d252df48
MA
995 p[6] = (s->qdev.conf.cyls >> 16) & 0xff;
996 p[7] = (s->qdev.conf.cyls >> 8) & 0xff;
997 p[8] = s->qdev.conf.cyls & 0xff;
ebddfcbe 998 /* Reduced current start cylinder, disabled */
d252df48
MA
999 p[9] = (s->qdev.conf.cyls >> 16) & 0xff;
1000 p[10] = (s->qdev.conf.cyls >> 8) & 0xff;
1001 p[11] = s->qdev.conf.cyls & 0xff;
ebddfcbe
GH
1002 /* Device step rate [ns], 200ns */
1003 p[12] = 0;
1004 p[13] = 200;
1005 /* Landing zone cylinder */
1006 p[14] = 0xff;
1007 p[15] = 0xff;
1008 p[16] = 0xff;
1009 /* Medium rotation rate [rpm], 5400 rpm */
1010 p[20] = (5400 >> 8) & 0xff;
1011 p[21] = 5400 & 0xff;
cfc606da 1012 break;
ebddfcbe 1013
67cc61e4 1014 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
ebddfcbe 1015 p[1] = 0x1e;
282ab04e 1016 if (page_control == 1) { /* Changeable Values */
cfc606da 1017 break;
282ab04e 1018 }
ebddfcbe
GH
1019 /* Transfer rate [kbit/s], 5Mbit/s */
1020 p[2] = 5000 >> 8;
1021 p[3] = 5000 & 0xff;
1022 /* if a geometry hint is available, use it */
d252df48
MA
1023 p[4] = s->qdev.conf.heads & 0xff;
1024 p[5] = s->qdev.conf.secs & 0xff;
69377307 1025 p[6] = s->qdev.blocksize >> 8;
d252df48
MA
1026 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1027 p[9] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1028 /* Write precomp start cylinder, disabled */
d252df48
MA
1029 p[10] = (s->qdev.conf.cyls >> 8) & 0xff;
1030 p[11] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1031 /* Reduced current start cylinder, disabled */
d252df48
MA
1032 p[12] = (s->qdev.conf.cyls >> 8) & 0xff;
1033 p[13] = s->qdev.conf.cyls & 0xff;
ebddfcbe
GH
1034 /* Device step rate [100us], 100us */
1035 p[14] = 0;
1036 p[15] = 1;
1037 /* Device step pulse width [us], 1us */
1038 p[16] = 1;
1039 /* Device head settle delay [100us], 100us */
1040 p[17] = 0;
1041 p[18] = 1;
1042 /* Motor on delay [0.1s], 0.1s */
1043 p[19] = 1;
1044 /* Motor off delay [0.1s], 0.1s */
1045 p[20] = 1;
1046 /* Medium rotation rate [rpm], 5400 rpm */
1047 p[28] = (5400 >> 8) & 0xff;
1048 p[29] = 5400 & 0xff;
cfc606da 1049 break;
ebddfcbe 1050
67cc61e4 1051 case MODE_PAGE_CACHING:
ebddfcbe
GH
1052 p[0] = 8;
1053 p[1] = 0x12;
282ab04e 1054 if (page_control == 1) { /* Changeable Values */
cfc606da 1055 break;
282ab04e 1056 }
44740c38 1057 if (bdrv_enable_write_cache(s->qdev.conf.bs)) {
ebddfcbe
GH
1058 p[2] = 4; /* WCE */
1059 }
cfc606da 1060 break;
ebddfcbe 1061
a07c7dcd
PB
1062 case MODE_PAGE_R_W_ERROR:
1063 p[1] = 10;
1064 p[2] = 0x80; /* Automatic Write Reallocation Enabled */
1065 if (s->qdev.type == TYPE_ROM) {
1066 p[3] = 0x20; /* Read Retry Count */
1067 }
1068 break;
1069
1070 case MODE_PAGE_AUDIO_CTL:
1071 p[1] = 14;
1072 break;
1073
67cc61e4 1074 case MODE_PAGE_CAPABILITIES:
ebddfcbe 1075 p[1] = 0x14;
282ab04e 1076 if (page_control == 1) { /* Changeable Values */
cfc606da 1077 break;
282ab04e 1078 }
a07c7dcd
PB
1079
1080 p[2] = 0x3b; /* CD-R & CD-RW read */
1081 p[3] = 0; /* Writing not supported */
ebddfcbe
GH
1082 p[4] = 0x7f; /* Audio, composite, digital out,
1083 mode 2 form 1&2, multi session */
1084 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
1085 RW corrected, C2 errors, ISRC,
1086 UPC, Bar code */
81b1008d 1087 p[6] = 0x2d | (s->tray_locked ? 2 : 0);
ebddfcbe
GH
1088 /* Locking supported, jumper present, eject, tray */
1089 p[7] = 0; /* no volume & mute control, no
1090 changer */
a07c7dcd 1091 p[8] = (50 * 176) >> 8; /* 50x read speed */
ebddfcbe 1092 p[9] = (50 * 176) & 0xff;
a07c7dcd
PB
1093 p[10] = 2 >> 8; /* Two volume levels */
1094 p[11] = 2 & 0xff;
1095 p[12] = 2048 >> 8; /* 2M buffer */
ebddfcbe 1096 p[13] = 2048 & 0xff;
a07c7dcd 1097 p[14] = (16 * 176) >> 8; /* 16x read speed current */
ebddfcbe 1098 p[15] = (16 * 176) & 0xff;
a07c7dcd 1099 p[18] = (16 * 176) >> 8; /* 16x write speed */
ebddfcbe 1100 p[19] = (16 * 176) & 0xff;
a07c7dcd 1101 p[20] = (16 * 176) >> 8; /* 16x write speed current */
ebddfcbe 1102 p[21] = (16 * 176) & 0xff;
cfc606da 1103 break;
ebddfcbe
GH
1104
1105 default:
cfc606da 1106 return -1;
ebddfcbe 1107 }
cfc606da
PB
1108
1109 *p_outbuf += p[1] + 2;
1110 return p[1] + 2;
ebddfcbe
GH
1111}
1112
cfc606da 1113static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
ebddfcbe 1114{
cfc606da 1115 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ebddfcbe 1116 uint64_t nb_sectors;
e590ecbe
PB
1117 bool dbd;
1118 int page, buflen, ret, page_control;
ebddfcbe 1119 uint8_t *p;
ce512ee1 1120 uint8_t dev_specific_param;
ebddfcbe 1121
e590ecbe 1122 dbd = (r->req.cmd.buf[1] & 0x8) != 0;
cfc606da
PB
1123 page = r->req.cmd.buf[2] & 0x3f;
1124 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
aa2b1e89 1125 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
cfc606da
PB
1126 (r->req.cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, r->req.cmd.xfer, page_control);
1127 memset(outbuf, 0, r->req.cmd.xfer);
ebddfcbe
GH
1128 p = outbuf;
1129
e590ecbe 1130 if (s->qdev.type == TYPE_DISK) {
da8365db 1131 dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
e590ecbe
PB
1132 if (bdrv_is_read_only(s->qdev.conf.bs)) {
1133 dev_specific_param |= 0x80; /* Readonly. */
1134 }
ce512ee1 1135 } else {
e590ecbe
PB
1136 /* MMC prescribes that CD/DVD drives have no block descriptors,
1137 * and defines no device-specific parameter. */
6a2de0f2 1138 dev_specific_param = 0x00;
e590ecbe 1139 dbd = true;
ce512ee1
BK
1140 }
1141
cfc606da 1142 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1143 p[1] = 0; /* Default media type. */
1144 p[2] = dev_specific_param;
1145 p[3] = 0; /* Block descriptor length. */
1146 p += 4;
1147 } else { /* MODE_SENSE_10 */
1148 p[2] = 0; /* Default media type. */
1149 p[3] = dev_specific_param;
1150 p[6] = p[7] = 0; /* Block descriptor length. */
1151 p += 8;
ebddfcbe 1152 }
ebddfcbe 1153
44740c38 1154 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
e590ecbe 1155 if (!dbd && nb_sectors) {
cfc606da 1156 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1157 outbuf[3] = 8; /* Block descriptor length */
1158 } else { /* MODE_SENSE_10 */
1159 outbuf[7] = 8; /* Block descriptor length */
1160 }
69377307 1161 nb_sectors /= (s->qdev.blocksize / 512);
f01b5931 1162 if (nb_sectors > 0xffffff) {
2488b740 1163 nb_sectors = 0;
f01b5931 1164 }
ebddfcbe
GH
1165 p[0] = 0; /* media density code */
1166 p[1] = (nb_sectors >> 16) & 0xff;
1167 p[2] = (nb_sectors >> 8) & 0xff;
1168 p[3] = nb_sectors & 0xff;
1169 p[4] = 0; /* reserved */
1170 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
69377307 1171 p[6] = s->qdev.blocksize >> 8;
ebddfcbe
GH
1172 p[7] = 0;
1173 p += 8;
1174 }
1175
cfc606da
PB
1176 if (page_control == 3) {
1177 /* Saved Values */
1178 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
1179 return -1;
282ab04e
BK
1180 }
1181
cfc606da
PB
1182 if (page == 0x3f) {
1183 for (page = 0; page <= 0x3e; page++) {
1184 mode_sense_page(s, page, &p, page_control);
1185 }
1186 } else {
1187 ret = mode_sense_page(s, page, &p, page_control);
1188 if (ret == -1) {
1189 return -1;
1190 }
ebddfcbe
GH
1191 }
1192
1193 buflen = p - outbuf;
ce512ee1
BK
1194 /*
1195 * The mode data length field specifies the length in bytes of the
1196 * following data that is available to be transferred. The mode data
1197 * length does not include itself.
1198 */
cfc606da 1199 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1200 outbuf[0] = buflen - 1;
1201 } else { /* MODE_SENSE_10 */
1202 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1203 outbuf[1] = (buflen - 2) & 0xff;
1204 }
ebddfcbe
GH
1205 return buflen;
1206}
1207
02880f43
GH
1208static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1209{
1210 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
02880f43
GH
1211 int start_track, format, msf, toclen;
1212 uint64_t nb_sectors;
1213
1214 msf = req->cmd.buf[1] & 2;
1215 format = req->cmd.buf[2] & 0xf;
1216 start_track = req->cmd.buf[6];
44740c38 1217 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
02880f43 1218 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
69377307 1219 nb_sectors /= s->qdev.blocksize / 512;
02880f43
GH
1220 switch (format) {
1221 case 0:
1222 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1223 break;
1224 case 1:
1225 /* multi session : only a single session defined */
1226 toclen = 12;
1227 memset(outbuf, 0, 12);
1228 outbuf[1] = 0x0a;
1229 outbuf[2] = 0x01;
1230 outbuf[3] = 0x01;
1231 break;
1232 case 2:
1233 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1234 break;
1235 default:
1236 return -1;
1237 }
02880f43
GH
1238 return toclen;
1239}
1240
68bb01f3 1241static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
bfd52647
MA
1242{
1243 SCSIRequest *req = &r->req;
1244 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1245 bool start = req->cmd.buf[4] & 1;
1246 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
1247
1248 if (s->qdev.type == TYPE_ROM && loej) {
68bb01f3
MA
1249 if (!start && !s->tray_open && s->tray_locked) {
1250 scsi_check_condition(r,
44740c38 1251 bdrv_is_inserted(s->qdev.conf.bs)
68bb01f3
MA
1252 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1253 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1254 return -1;
fdec4404 1255 }
d88b1819
LC
1256
1257 if (s->tray_open != !start) {
1258 bdrv_eject(s->qdev.conf.bs, !start);
1259 s->tray_open = !start;
1260 }
bfd52647 1261 }
68bb01f3 1262 return 0;
bfd52647
MA
1263}
1264
7285477a 1265static int scsi_disk_emulate_command(SCSIDiskReq *r)
aa5dbdc1 1266{
8af7a3ab 1267 SCSIRequest *req = &r->req;
e7e25e32 1268 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
e7e25e32 1269 uint64_t nb_sectors;
7285477a 1270 uint8_t *outbuf;
aa5dbdc1
GH
1271 int buflen = 0;
1272
7285477a
PB
1273 if (!r->iov.iov_base) {
1274 /*
1275 * FIXME: we shouldn't return anything bigger than 4k, but the code
1276 * requires the buffer to be as big as req->cmd.xfer in several
1277 * places. So, do not allow CDBs with a very large ALLOCATION
1278 * LENGTH. The real fix would be to modify scsi_read_data and
1279 * dma_buf_read, so that they return data beyond the buflen
1280 * as all zeros.
1281 */
1282 if (req->cmd.xfer > 65536) {
1283 goto illegal_request;
1284 }
1285 r->buflen = MAX(4096, req->cmd.xfer);
44740c38 1286 r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
7285477a
PB
1287 }
1288
1289 outbuf = r->iov.iov_base;
aa5dbdc1
GH
1290 switch (req->cmd.buf[0]) {
1291 case TEST_UNIT_READY:
9bcaf4fe 1292 assert(!s->tray_open && bdrv_is_inserted(s->qdev.conf.bs));
5f71d32f 1293 break;
0b06c059
GH
1294 case INQUIRY:
1295 buflen = scsi_disk_emulate_inquiry(req, outbuf);
f01b5931 1296 if (buflen < 0) {
0b06c059 1297 goto illegal_request;
f01b5931 1298 }
5f71d32f 1299 break;
ebddfcbe
GH
1300 case MODE_SENSE:
1301 case MODE_SENSE_10:
cfc606da 1302 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
f01b5931 1303 if (buflen < 0) {
ebddfcbe 1304 goto illegal_request;
f01b5931 1305 }
ebddfcbe 1306 break;
02880f43
GH
1307 case READ_TOC:
1308 buflen = scsi_disk_emulate_read_toc(req, outbuf);
f01b5931 1309 if (buflen < 0) {
02880f43 1310 goto illegal_request;
f01b5931 1311 }
02880f43 1312 break;
3d53ba18 1313 case RESERVE:
f01b5931 1314 if (req->cmd.buf[1] & 1) {
3d53ba18 1315 goto illegal_request;
f01b5931 1316 }
3d53ba18
GH
1317 break;
1318 case RESERVE_10:
f01b5931 1319 if (req->cmd.buf[1] & 3) {
3d53ba18 1320 goto illegal_request;
f01b5931 1321 }
3d53ba18
GH
1322 break;
1323 case RELEASE:
f01b5931 1324 if (req->cmd.buf[1] & 1) {
3d53ba18 1325 goto illegal_request;
f01b5931 1326 }
3d53ba18
GH
1327 break;
1328 case RELEASE_10:
f01b5931 1329 if (req->cmd.buf[1] & 3) {
3d53ba18 1330 goto illegal_request;
f01b5931 1331 }
3d53ba18 1332 break;
8d3628ff 1333 case START_STOP:
68bb01f3
MA
1334 if (scsi_disk_emulate_start_stop(r) < 0) {
1335 return -1;
1336 }
5f71d32f 1337 break;
c68b9f34 1338 case ALLOW_MEDIUM_REMOVAL:
81b1008d 1339 s->tray_locked = req->cmd.buf[4] & 1;
44740c38 1340 bdrv_lock_medium(s->qdev.conf.bs, req->cmd.buf[4] & 1);
5f71d32f 1341 break;
5e30a07d 1342 case READ_CAPACITY_10:
e7e25e32 1343 /* The normal LEN field for this command is zero. */
5f71d32f 1344 memset(outbuf, 0, 8);
44740c38 1345 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
f01b5931 1346 if (!nb_sectors) {
9bcaf4fe
PB
1347 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1348 return -1;
f01b5931 1349 }
7cec78b6
PB
1350 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1351 goto illegal_request;
1352 }
69377307 1353 nb_sectors /= s->qdev.blocksize / 512;
e7e25e32
GH
1354 /* Returned value is the address of the last sector. */
1355 nb_sectors--;
1356 /* Remember the new size for read/write sanity checking. */
7877903a 1357 s->qdev.max_lba = nb_sectors;
e7e25e32 1358 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
f01b5931 1359 if (nb_sectors > UINT32_MAX) {
e7e25e32 1360 nb_sectors = UINT32_MAX;
f01b5931 1361 }
e7e25e32
GH
1362 outbuf[0] = (nb_sectors >> 24) & 0xff;
1363 outbuf[1] = (nb_sectors >> 16) & 0xff;
1364 outbuf[2] = (nb_sectors >> 8) & 0xff;
1365 outbuf[3] = nb_sectors & 0xff;
1366 outbuf[4] = 0;
1367 outbuf[5] = 0;
69377307 1368 outbuf[6] = s->qdev.blocksize >> 8;
e7e25e32
GH
1369 outbuf[7] = 0;
1370 buflen = 8;
5f71d32f 1371 break;
f3b338ef
PB
1372 case REQUEST_SENSE:
1373 /* Just return "NO SENSE". */
1374 buflen = scsi_build_sense(NULL, 0, outbuf, r->buflen,
1375 (req->cmd.buf[1] & 1) == 0);
1376 break;
b6c251ab
PB
1377 case MECHANISM_STATUS:
1378 buflen = scsi_emulate_mechanism_status(s, outbuf);
1379 if (buflen < 0) {
1380 goto illegal_request;
1381 }
1382 break;
38215553 1383 case GET_CONFIGURATION:
430ee2f2 1384 buflen = scsi_get_configuration(s, outbuf);
b6c251ab
PB
1385 if (buflen < 0) {
1386 goto illegal_request;
1387 }
1388 break;
1389 case GET_EVENT_STATUS_NOTIFICATION:
1390 buflen = scsi_get_event_status_notification(s, r, outbuf);
1391 if (buflen < 0) {
1392 goto illegal_request;
1393 }
1394 break;
1a4f0c3a
PB
1395 case READ_DISC_INFORMATION:
1396 buflen = scsi_read_disc_information(s, r, outbuf);
1397 if (buflen < 0) {
1398 goto illegal_request;
1399 }
1400 break;
b6c251ab
PB
1401 case READ_DVD_STRUCTURE:
1402 buflen = scsi_read_dvd_structure(s, r, outbuf);
1403 if (buflen < 0) {
1404 goto illegal_request;
1405 }
38215553 1406 break;
f6515262 1407 case SERVICE_ACTION_IN_16:
5dd90e2a 1408 /* Service Action In subcommands. */
f6515262 1409 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
5dd90e2a
GH
1410 DPRINTF("SAI READ CAPACITY(16)\n");
1411 memset(outbuf, 0, req->cmd.xfer);
44740c38 1412 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
f01b5931 1413 if (!nb_sectors) {
9bcaf4fe
PB
1414 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1415 return -1;
f01b5931 1416 }
7cec78b6
PB
1417 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
1418 goto illegal_request;
1419 }
69377307 1420 nb_sectors /= s->qdev.blocksize / 512;
5dd90e2a
GH
1421 /* Returned value is the address of the last sector. */
1422 nb_sectors--;
1423 /* Remember the new size for read/write sanity checking. */
7877903a 1424 s->qdev.max_lba = nb_sectors;
5dd90e2a
GH
1425 outbuf[0] = (nb_sectors >> 56) & 0xff;
1426 outbuf[1] = (nb_sectors >> 48) & 0xff;
1427 outbuf[2] = (nb_sectors >> 40) & 0xff;
1428 outbuf[3] = (nb_sectors >> 32) & 0xff;
1429 outbuf[4] = (nb_sectors >> 24) & 0xff;
1430 outbuf[5] = (nb_sectors >> 16) & 0xff;
1431 outbuf[6] = (nb_sectors >> 8) & 0xff;
1432 outbuf[7] = nb_sectors & 0xff;
1433 outbuf[8] = 0;
1434 outbuf[9] = 0;
69377307 1435 outbuf[10] = s->qdev.blocksize >> 8;
5dd90e2a 1436 outbuf[11] = 0;
ee3659e3
CH
1437 outbuf[12] = 0;
1438 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
ea3bd56f
CH
1439
1440 /* set TPE bit if the format supports discard */
1441 if (s->qdev.conf.discard_granularity) {
1442 outbuf[14] = 0x80;
1443 }
1444
5dd90e2a
GH
1445 /* Protection, exponent and lowest lba field left blank. */
1446 buflen = req->cmd.xfer;
1447 break;
1448 }
1449 DPRINTF("Unsupported Service Action In\n");
1450 goto illegal_request;
aa5dbdc1 1451 default:
b45ef674 1452 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
a1f0cce2 1453 return -1;
aa5dbdc1 1454 }
e2f0c49f 1455 buflen = MIN(buflen, req->cmd.xfer);
aa5dbdc1
GH
1456 return buflen;
1457
aa5dbdc1 1458illegal_request:
cfc606da
PB
1459 if (r->req.status == -1) {
1460 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1461 }
8af7a3ab 1462 return -1;
aa5dbdc1
GH
1463}
1464
2e5d83bb
PB
1465/* Execute a scsi command. Returns the length of the data expected by the
1466 command. This will be Positive for data transfers from the device
1467 (eg. disk reads), negative for transfers to the device (eg. disk writes),
1468 and zero if the command does not transfer any data. */
1469
5c6c0e51 1470static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
2e5d83bb 1471{
5c6c0e51
HR
1472 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1473 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
ad2d30f7 1474 int32_t len;
a917d384 1475 uint8_t command;
aa5dbdc1 1476 int rc;
a917d384
PB
1477
1478 command = buf[0];
653c1c3f 1479 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req->lun, req->tag, buf[0]);
2dd791b6 1480
2e5d83bb
PB
1481#ifdef DEBUG_SCSI
1482 {
1483 int i;
2dd791b6 1484 for (i = 1; i < r->req.cmd.len; i++) {
2e5d83bb
PB
1485 printf(" 0x%02x", buf[i]);
1486 }
1487 printf("\n");
1488 }
1489#endif
aa5dbdc1 1490
9bcaf4fe
PB
1491 switch (command) {
1492 case INQUIRY:
1493 case MODE_SENSE:
1494 case MODE_SENSE_10:
1495 case RESERVE:
1496 case RESERVE_10:
1497 case RELEASE:
1498 case RELEASE_10:
1499 case START_STOP:
1500 case ALLOW_MEDIUM_REMOVAL:
1501 case GET_CONFIGURATION:
1502 case GET_EVENT_STATUS_NOTIFICATION:
1503 case MECHANISM_STATUS:
1504 case REQUEST_SENSE:
1505 break;
1506
1507 default:
1508 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1509 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1510 return 0;
1511 }
1512 break;
1513 }
1514
a917d384 1515 switch (command) {
ebf46023 1516 case TEST_UNIT_READY:
0b06c059 1517 case INQUIRY:
ebddfcbe
GH
1518 case MODE_SENSE:
1519 case MODE_SENSE_10:
3d53ba18
GH
1520 case RESERVE:
1521 case RESERVE_10:
1522 case RELEASE:
1523 case RELEASE_10:
8d3628ff 1524 case START_STOP:
c68b9f34 1525 case ALLOW_MEDIUM_REMOVAL:
5e30a07d 1526 case READ_CAPACITY_10:
02880f43 1527 case READ_TOC:
1a4f0c3a 1528 case READ_DISC_INFORMATION:
b6c251ab 1529 case READ_DVD_STRUCTURE:
38215553 1530 case GET_CONFIGURATION:
b6c251ab
PB
1531 case GET_EVENT_STATUS_NOTIFICATION:
1532 case MECHANISM_STATUS:
f6515262 1533 case SERVICE_ACTION_IN_16:
f3b338ef 1534 case REQUEST_SENSE:
7285477a 1535 rc = scsi_disk_emulate_command(r);
8af7a3ab 1536 if (rc < 0) {
0b06c059 1537 return 0;
aa5dbdc1 1538 }
8af7a3ab
KW
1539
1540 r->iov.iov_len = rc;
0b06c059 1541 break;
0a4ac106 1542 case SYNCHRONIZE_CACHE:
c7bae6a7
PB
1543 /* The request is used as the AIO opaque value, so add a ref. */
1544 scsi_req_ref(&r->req);
44740c38
PB
1545 bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
1546 r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
0a4ac106 1547 return 0;
ebf46023
GH
1548 case READ_6:
1549 case READ_10:
bd536cf3
GH
1550 case READ_12:
1551 case READ_16:
5c6c0e51 1552 len = r->req.cmd.xfer / s->qdev.blocksize;
2dd791b6 1553 DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
7877903a 1554 if (r->req.cmd.lba > s->qdev.max_lba) {
274fb0e1 1555 goto illegal_lba;
f01b5931 1556 }
69377307
PB
1557 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1558 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 1559 break;
7f64f8e2
PB
1560 case VERIFY_10:
1561 case VERIFY_12:
1562 case VERIFY_16:
ebf46023
GH
1563 case WRITE_6:
1564 case WRITE_10:
bd536cf3
GH
1565 case WRITE_12:
1566 case WRITE_16:
5e30a07d 1567 case WRITE_VERIFY_10:
ebef0bbb
BK
1568 case WRITE_VERIFY_12:
1569 case WRITE_VERIFY_16:
5c6c0e51 1570 len = r->req.cmd.xfer / s->qdev.blocksize;
ebef0bbb 1571 DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
2dd791b6
HR
1572 (command & 0xe) == 0xe ? "And Verify " : "",
1573 r->req.cmd.lba, len);
7877903a 1574 if (r->req.cmd.lba > s->qdev.max_lba) {
274fb0e1 1575 goto illegal_lba;
f01b5931 1576 }
69377307
PB
1577 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1578 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 1579 break;
ebef0bbb 1580 case MODE_SELECT:
2dd791b6 1581 DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
ebef0bbb
BK
1582 /* We don't support mode parameter changes.
1583 Allow the mode parameter header + block descriptors only. */
2dd791b6 1584 if (r->req.cmd.xfer > 12) {
ebef0bbb
BK
1585 goto fail;
1586 }
1587 break;
1588 case MODE_SELECT_10:
2dd791b6 1589 DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
ebef0bbb
BK
1590 /* We don't support mode parameter changes.
1591 Allow the mode parameter header + block descriptors only. */
2dd791b6 1592 if (r->req.cmd.xfer > 16) {
ebef0bbb
BK
1593 goto fail;
1594 }
1595 break;
ebef0bbb 1596 case SEEK_10:
00a01ad4 1597 DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
7877903a 1598 if (r->req.cmd.lba > s->qdev.max_lba) {
ebef0bbb
BK
1599 goto illegal_lba;
1600 }
ea3bd56f 1601 break;
c9e4d828 1602 case WRITE_SAME_10:
a5ee9085
PB
1603 len = lduw_be_p(&buf[7]);
1604 goto write_same;
ea3bd56f 1605 case WRITE_SAME_16:
a5ee9085
PB
1606 len = ldl_be_p(&buf[10]) & 0xffffffffULL;
1607 write_same:
ea3bd56f 1608
c9e4d828 1609 DPRINTF("WRITE SAME() (sector %" PRId64 ", count %d)\n",
ea3bd56f
CH
1610 r->req.cmd.lba, len);
1611
7877903a 1612 if (r->req.cmd.lba > s->qdev.max_lba) {
ea3bd56f
CH
1613 goto illegal_lba;
1614 }
1615
1616 /*
1617 * We only support WRITE SAME with the unmap bit set for now.
1618 */
1619 if (!(buf[1] & 0x8)) {
1620 goto fail;
1621 }
1622
69377307
PB
1623 rc = bdrv_discard(s->qdev.conf.bs,
1624 r->req.cmd.lba * (s->qdev.blocksize / 512),
1625 len * (s->qdev.blocksize / 512));
ea3bd56f
CH
1626 if (rc < 0) {
1627 /* XXX: better error code ?*/
1628 goto fail;
1629 }
1630
ebef0bbb 1631 break;
2e5d83bb 1632 default:
2dd791b6 1633 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
b45ef674 1634 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
a1f0cce2 1635 return 0;
2e5d83bb 1636 fail:
b45ef674 1637 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2dd791b6 1638 return 0;
274fb0e1 1639 illegal_lba:
b45ef674 1640 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
274fb0e1 1641 return 0;
2e5d83bb 1642 }
c87c0672 1643 if (r->sector_count == 0 && r->iov.iov_len == 0) {
b45ef674 1644 scsi_req_complete(&r->req, GOOD);
a917d384 1645 }
c87c0672 1646 len = r->sector_count * 512 + r->iov.iov_len;
efb9ee02
HR
1647 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
1648 return -len;
a917d384 1649 } else {
f01b5931 1650 if (!r->sector_count) {
a917d384 1651 r->sector_count = -1;
f01b5931 1652 }
efb9ee02 1653 return len;
2e5d83bb 1654 }
2e5d83bb
PB
1655}
1656
e9447f35
JK
1657static void scsi_disk_reset(DeviceState *dev)
1658{
1659 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1660 uint64_t nb_sectors;
1661
c7b48872 1662 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
e9447f35 1663
44740c38 1664 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
69377307 1665 nb_sectors /= s->qdev.blocksize / 512;
e9447f35
JK
1666 if (nb_sectors) {
1667 nb_sectors--;
1668 }
7877903a 1669 s->qdev.max_lba = nb_sectors;
e9447f35
JK
1670}
1671
1672static void scsi_destroy(SCSIDevice *dev)
1673{
1674 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1675
c7b48872 1676 scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
f8b6cc00 1677 blockdev_mark_auto_del(s->qdev.conf.bs);
56a14938
GH
1678}
1679
7d4b4ba5 1680static void scsi_cd_change_media_cb(void *opaque, bool load)
2c6942fa 1681{
8a9c16f6
PB
1682 SCSIDiskState *s = opaque;
1683
1684 /*
1685 * When a CD gets changed, we have to report an ejected state and
1686 * then a loaded state to guests so that they detect tray
1687 * open/close and media change events. Guests that do not use
1688 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1689 * states rely on this behavior.
1690 *
1691 * media_changed governs the state machine used for unit attention
1692 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
1693 */
1694 s->media_changed = load;
1695 s->tray_open = !load;
1696 s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
3c2f7c12 1697 s->media_event = true;
4480de19
PB
1698 s->eject_request = false;
1699}
1700
1701static void scsi_cd_eject_request_cb(void *opaque, bool force)
1702{
1703 SCSIDiskState *s = opaque;
1704
1705 s->eject_request = true;
1706 if (force) {
1707 s->tray_locked = false;
1708 }
2c6942fa
MA
1709}
1710
e4def80b
MA
1711static bool scsi_cd_is_tray_open(void *opaque)
1712{
1713 return ((SCSIDiskState *)opaque)->tray_open;
1714}
1715
f107639a
MA
1716static bool scsi_cd_is_medium_locked(void *opaque)
1717{
1718 return ((SCSIDiskState *)opaque)->tray_locked;
1719}
1720
1721static const BlockDevOps scsi_cd_block_ops = {
2c6942fa 1722 .change_media_cb = scsi_cd_change_media_cb,
4480de19 1723 .eject_request_cb = scsi_cd_eject_request_cb,
e4def80b 1724 .is_tray_open = scsi_cd_is_tray_open,
f107639a
MA
1725 .is_medium_locked = scsi_cd_is_medium_locked,
1726};
1727
8a9c16f6
PB
1728static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
1729{
1730 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1731 if (s->media_changed) {
1732 s->media_changed = false;
1733 s->qdev.unit_attention = SENSE_CODE(MEDIUM_CHANGED);
1734 }
1735}
1736
e39be482 1737static int scsi_initfn(SCSIDevice *dev)
2e5d83bb 1738{
d52affa7 1739 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2e5d83bb 1740
f8b6cc00 1741 if (!s->qdev.conf.bs) {
6a84cb1f 1742 error_report("drive property not set");
d52affa7
GH
1743 return -1;
1744 }
1745
bfe3d7ac
PB
1746 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
1747 !bdrv_is_inserted(s->qdev.conf.bs)) {
98f28ad7
MA
1748 error_report("Device needs media, but drive is empty");
1749 return -1;
1750 }
1751
911525db 1752 blkconf_serial(&s->qdev.conf, &s->serial);
b7eb0c9f
MA
1753 if (blkconf_geometry(&dev->conf, NULL, 65535, 255, 255) < 0) {
1754 return -1;
1755 }
a0fef654 1756
552fee93 1757 if (!s->version) {
93bfef4c 1758 s->version = g_strdup(qemu_get_version());
552fee93
MA
1759 }
1760
44740c38 1761 if (bdrv_is_sg(s->qdev.conf.bs)) {
6a84cb1f 1762 error_report("unwanted /dev/sg*");
32bb404a
MA
1763 return -1;
1764 }
1765
bfe3d7ac 1766 if (s->features & (1 << SCSI_DISK_F_REMOVABLE)) {
44740c38 1767 bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_cd_block_ops, s);
2e5d83bb 1768 }
44740c38 1769 bdrv_set_buffer_alignment(s->qdev.conf.bs, s->qdev.blocksize);
8cfacf07 1770
44740c38 1771 bdrv_iostatus_enable(s->qdev.conf.bs);
7082826e 1772 add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, NULL);
d52affa7
GH
1773 return 0;
1774}
1775
b443ae67
MA
1776static int scsi_hd_initfn(SCSIDevice *dev)
1777{
e39be482
PB
1778 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1779 s->qdev.blocksize = s->qdev.conf.logical_block_size;
1780 s->qdev.type = TYPE_DISK;
1781 return scsi_initfn(&s->qdev);
b443ae67
MA
1782}
1783
1784static int scsi_cd_initfn(SCSIDevice *dev)
1785{
e39be482
PB
1786 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1787 s->qdev.blocksize = 2048;
1788 s->qdev.type = TYPE_ROM;
bfe3d7ac 1789 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
e39be482 1790 return scsi_initfn(&s->qdev);
b443ae67
MA
1791}
1792
1793static int scsi_disk_initfn(SCSIDevice *dev)
1794{
95b5edcd 1795 DriveInfo *dinfo;
b443ae67
MA
1796
1797 if (!dev->conf.bs) {
e39be482 1798 return scsi_initfn(dev); /* ... and die there */
b443ae67
MA
1799 }
1800
e39be482
PB
1801 dinfo = drive_get_by_blockdev(dev->conf.bs);
1802 if (dinfo->media_cd) {
1803 return scsi_cd_initfn(dev);
1804 } else {
1805 return scsi_hd_initfn(dev);
1806 }
b443ae67
MA
1807}
1808
adcf2754 1809static const SCSIReqOps scsi_disk_reqops = {
8dbd4574 1810 .size = sizeof(SCSIDiskReq),
12010e7b
PB
1811 .free_req = scsi_free_request,
1812 .send_command = scsi_send_command,
1813 .read_data = scsi_read_data,
1814 .write_data = scsi_write_data,
1815 .cancel_io = scsi_cancel_io,
1816 .get_buf = scsi_get_buf,
43b978b9
PB
1817 .load_request = scsi_disk_load_request,
1818 .save_request = scsi_disk_save_request,
8dbd4574
PB
1819};
1820
63db0f0e
PB
1821static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
1822 uint8_t *buf, void *hba_private)
8dbd4574
PB
1823{
1824 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1825 SCSIRequest *req;
8dbd4574
PB
1826
1827 req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
8dbd4574
PB
1828 return req;
1829}
1830
336a6915
PB
1831#ifdef __linux__
1832static int get_device_type(SCSIDiskState *s)
1833{
1834 BlockDriverState *bdrv = s->qdev.conf.bs;
1835 uint8_t cmd[16];
1836 uint8_t buf[36];
1837 uint8_t sensebuf[8];
1838 sg_io_hdr_t io_header;
1839 int ret;
1840
1841 memset(cmd, 0, sizeof(cmd));
1842 memset(buf, 0, sizeof(buf));
1843 cmd[0] = INQUIRY;
1844 cmd[4] = sizeof(buf);
1845
1846 memset(&io_header, 0, sizeof(io_header));
1847 io_header.interface_id = 'S';
1848 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
1849 io_header.dxfer_len = sizeof(buf);
1850 io_header.dxferp = buf;
1851 io_header.cmdp = cmd;
1852 io_header.cmd_len = sizeof(cmd);
1853 io_header.mx_sb_len = sizeof(sensebuf);
1854 io_header.sbp = sensebuf;
1855 io_header.timeout = 6000; /* XXX */
1856
1857 ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
1858 if (ret < 0 || io_header.driver_status || io_header.host_status) {
1859 return -1;
1860 }
1861 s->qdev.type = buf[0];
bfe3d7ac
PB
1862 if (buf[1] & 0x80) {
1863 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
1864 }
336a6915
PB
1865 return 0;
1866}
1867
1868static int scsi_block_initfn(SCSIDevice *dev)
1869{
1870 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1871 int sg_version;
1872 int rc;
1873
1874 if (!s->qdev.conf.bs) {
1875 error_report("scsi-block: drive property not set");
1876 return -1;
1877 }
1878
1879 /* check we are using a driver managing SG_IO (version 3 and after) */
1880 if (bdrv_ioctl(s->qdev.conf.bs, SG_GET_VERSION_NUM, &sg_version) < 0 ||
1881 sg_version < 30000) {
1882 error_report("scsi-block: scsi generic interface too old");
1883 return -1;
1884 }
1885
1886 /* get device type from INQUIRY data */
1887 rc = get_device_type(s);
1888 if (rc < 0) {
1889 error_report("scsi-block: INQUIRY failed");
1890 return -1;
1891 }
1892
1893 /* Make a guess for the block size, we'll fix it when the guest sends.
1894 * READ CAPACITY. If they don't, they likely would assume these sizes
1895 * anyway. (TODO: check in /sys).
1896 */
1897 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
1898 s->qdev.blocksize = 2048;
1899 } else {
1900 s->qdev.blocksize = 512;
1901 }
1902 return scsi_initfn(&s->qdev);
1903}
1904
1905static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
1906 uint32_t lun, uint8_t *buf,
1907 void *hba_private)
1908{
1909 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1910
1911 switch (buf[0]) {
1912 case READ_6:
1913 case READ_10:
1914 case READ_12:
1915 case READ_16:
7f64f8e2
PB
1916 case VERIFY_10:
1917 case VERIFY_12:
1918 case VERIFY_16:
336a6915
PB
1919 case WRITE_6:
1920 case WRITE_10:
1921 case WRITE_12:
1922 case WRITE_16:
1923 case WRITE_VERIFY_10:
1924 case WRITE_VERIFY_12:
1925 case WRITE_VERIFY_16:
eaccf49e
PB
1926 /* If we are not using O_DIRECT, we might read stale data from the
1927 * host cache if writes were made using other commands than these
1928 * ones (such as WRITE SAME or EXTENDED COPY, etc.). So, without
1929 * O_DIRECT everything must go through SG_IO.
1930 */
137745c5 1931 if (bdrv_get_flags(s->qdev.conf.bs) & BDRV_O_NOCACHE) {
eaccf49e
PB
1932 break;
1933 }
1934
33ebad12
PB
1935 /* MMC writing cannot be done via pread/pwrite, because it sometimes
1936 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
1937 * And once you do these writes, reading from the block device is
1938 * unreliable, too. It is even possible that reads deliver random data
1939 * from the host page cache (this is probably a Linux bug).
1940 *
1941 * We might use scsi_disk_reqops as long as no writing commands are
1942 * seen, but performance usually isn't paramount on optical media. So,
1943 * just make scsi-block operate the same as scsi-generic for them.
1944 */
eaccf49e
PB
1945 if (s->qdev.type == TYPE_ROM) {
1946 break;
1947 }
1948 return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun,
1949 hba_private);
336a6915
PB
1950 }
1951
1952 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
1953 hba_private);
1954}
1955#endif
1956
b443ae67
MA
1957#define DEFINE_SCSI_DISK_PROPERTIES() \
1958 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1959 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1960 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1961
39bffca2
AL
1962static Property scsi_hd_properties[] = {
1963 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
1964 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
1965 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
1966 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
1967 SCSI_DISK_F_DPOFUA, false),
27395add 1968 DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0),
d252df48 1969 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
39bffca2
AL
1970 DEFINE_PROP_END_OF_LIST(),
1971};
1972
43b978b9
PB
1973static const VMStateDescription vmstate_scsi_disk_state = {
1974 .name = "scsi-disk",
1975 .version_id = 1,
1976 .minimum_version_id = 1,
1977 .minimum_version_id_old = 1,
1978 .fields = (VMStateField[]) {
1979 VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
1980 VMSTATE_BOOL(media_changed, SCSIDiskState),
1981 VMSTATE_BOOL(media_event, SCSIDiskState),
1982 VMSTATE_BOOL(eject_request, SCSIDiskState),
1983 VMSTATE_BOOL(tray_open, SCSIDiskState),
1984 VMSTATE_BOOL(tray_locked, SCSIDiskState),
1985 VMSTATE_END_OF_LIST()
1986 }
1987};
1988
b9eea3e6
AL
1989static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
1990{
39bffca2 1991 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
1992 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1993
1994 sc->init = scsi_hd_initfn;
1995 sc->destroy = scsi_destroy;
1996 sc->alloc_req = scsi_new_request;
1997 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
1998 dc->fw_name = "disk";
1999 dc->desc = "virtual SCSI disk";
2000 dc->reset = scsi_disk_reset;
2001 dc->props = scsi_hd_properties;
43b978b9 2002 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2003}
2004
39bffca2
AL
2005static TypeInfo scsi_hd_info = {
2006 .name = "scsi-hd",
2007 .parent = TYPE_SCSI_DEVICE,
2008 .instance_size = sizeof(SCSIDiskState),
2009 .class_init = scsi_hd_class_initfn,
2010};
2011
2012static Property scsi_cd_properties[] = {
2013 DEFINE_SCSI_DISK_PROPERTIES(),
27395add 2014 DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0),
39bffca2 2015 DEFINE_PROP_END_OF_LIST(),
b9eea3e6
AL
2016};
2017
2018static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
2019{
39bffca2 2020 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2021 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2022
2023 sc->init = scsi_cd_initfn;
2024 sc->destroy = scsi_destroy;
2025 sc->alloc_req = scsi_new_request;
2026 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
2027 dc->fw_name = "disk";
2028 dc->desc = "virtual SCSI CD-ROM";
2029 dc->reset = scsi_disk_reset;
2030 dc->props = scsi_cd_properties;
43b978b9 2031 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2032}
2033
39bffca2
AL
2034static TypeInfo scsi_cd_info = {
2035 .name = "scsi-cd",
2036 .parent = TYPE_SCSI_DEVICE,
2037 .instance_size = sizeof(SCSIDiskState),
2038 .class_init = scsi_cd_class_initfn,
b9eea3e6
AL
2039};
2040
336a6915 2041#ifdef __linux__
39bffca2 2042static Property scsi_block_properties[] = {
03847837 2043 DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.bs),
39bffca2
AL
2044 DEFINE_PROP_END_OF_LIST(),
2045};
2046
b9eea3e6
AL
2047static void scsi_block_class_initfn(ObjectClass *klass, void *data)
2048{
39bffca2 2049 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2050 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2051
2052 sc->init = scsi_block_initfn;
2053 sc->destroy = scsi_destroy;
2054 sc->alloc_req = scsi_block_new_request;
39bffca2
AL
2055 dc->fw_name = "disk";
2056 dc->desc = "SCSI block device passthrough";
2057 dc->reset = scsi_disk_reset;
2058 dc->props = scsi_block_properties;
43b978b9 2059 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2060}
2061
39bffca2
AL
2062static TypeInfo scsi_block_info = {
2063 .name = "scsi-block",
2064 .parent = TYPE_SCSI_DEVICE,
2065 .instance_size = sizeof(SCSIDiskState),
2066 .class_init = scsi_block_class_initfn,
b9eea3e6 2067};
336a6915 2068#endif
b9eea3e6 2069
39bffca2
AL
2070static Property scsi_disk_properties[] = {
2071 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
2072 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
2073 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
2074 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
2075 SCSI_DISK_F_DPOFUA, false),
27395add 2076 DEFINE_PROP_HEX64("wwn", SCSIDiskState, wwn, 0),
39bffca2
AL
2077 DEFINE_PROP_END_OF_LIST(),
2078};
2079
b9eea3e6
AL
2080static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
2081{
39bffca2 2082 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2083 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2084
2085 sc->init = scsi_disk_initfn;
2086 sc->destroy = scsi_destroy;
2087 sc->alloc_req = scsi_new_request;
2088 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
2089 dc->fw_name = "disk";
2090 dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
2091 dc->reset = scsi_disk_reset;
2092 dc->props = scsi_disk_properties;
43b978b9 2093 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2094}
2095
39bffca2
AL
2096static TypeInfo scsi_disk_info = {
2097 .name = "scsi-disk",
2098 .parent = TYPE_SCSI_DEVICE,
2099 .instance_size = sizeof(SCSIDiskState),
2100 .class_init = scsi_disk_class_initfn,
d52affa7
GH
2101};
2102
83f7d43a 2103static void scsi_disk_register_types(void)
d52affa7 2104{
39bffca2
AL
2105 type_register_static(&scsi_hd_info);
2106 type_register_static(&scsi_cd_info);
b9eea3e6 2107#ifdef __linux__
39bffca2 2108 type_register_static(&scsi_block_info);
b9eea3e6 2109#endif
39bffca2 2110 type_register_static(&scsi_disk_info);
8ccc2ace 2111}
83f7d43a
AF
2112
2113type_init(scsi_disk_register_types)