Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ ea3bd56f

History | View | Annotate | Download (38.7 kB)

1
/*
2
 * SCSI Device emulation
3
 *
4
 * Copyright (c) 2006 CodeSourcery.
5
 * Based on code by Fabrice Bellard
6
 *
7
 * Written by Paul Brook
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.
14
 *
15
 * This code is licenced under the LGPL.
16
 *
17
 * Note that this file only handles the SCSI architecture model and device
18
 * commands.  Emulation of interface/link layer protocols is handled by
19
 * the host adapter emulator.
20
 */
21

    
22
//#define DEBUG_SCSI
23

    
24
#ifdef DEBUG_SCSI
25
#define DPRINTF(fmt, ...) \
26
do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
27
#else
28
#define DPRINTF(fmt, ...) do {} while(0)
29
#endif
30

    
31
#define BADF(fmt, ...) \
32
do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
33

    
34
#include "qemu-common.h"
35
#include "qemu-error.h"
36
#include "scsi.h"
37
#include "scsi-defs.h"
38
#include "sysemu.h"
39
#include "blockdev.h"
40

    
41
#define SCSI_DMA_BUF_SIZE    131072
42
#define SCSI_MAX_INQUIRY_LEN 256
43

    
44
#define SCSI_REQ_STATUS_RETRY           0x01
45
#define SCSI_REQ_STATUS_RETRY_TYPE_MASK 0x06
46
#define SCSI_REQ_STATUS_RETRY_READ      0x00
47
#define SCSI_REQ_STATUS_RETRY_WRITE     0x02
48
#define SCSI_REQ_STATUS_RETRY_FLUSH     0x04
49

    
50
typedef struct SCSIDiskState SCSIDiskState;
51

    
52
typedef struct SCSISense {
53
    uint8_t key;
54
} SCSISense;
55

    
56
typedef struct SCSIDiskReq {
57
    SCSIRequest req;
58
    /* ??? We should probably keep track of whether the data transfer is
59
       a read or a write.  Currently we rely on the host getting it right.  */
60
    /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
61
    uint64_t sector;
62
    uint32_t sector_count;
63
    struct iovec iov;
64
    QEMUIOVector qiov;
65
    uint32_t status;
66
} SCSIDiskReq;
67

    
68
struct SCSIDiskState
69
{
70
    SCSIDevice qdev;
71
    BlockDriverState *bs;
72
    /* The qemu block layer uses a fixed 512 byte sector size.
73
       This is the number of 512 byte blocks in a single scsi sector.  */
74
    int cluster_size;
75
    uint64_t max_lba;
76
    QEMUBH *bh;
77
    char *version;
78
    char *serial;
79
    SCSISense sense;
80
};
81

    
82
static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type);
83
static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf);
84

    
85
static SCSIDiskReq *scsi_new_request(SCSIDiskState *s, uint32_t tag,
86
        uint32_t lun)
87
{
88
    SCSIRequest *req;
89
    SCSIDiskReq *r;
90

    
91
    req = scsi_req_alloc(sizeof(SCSIDiskReq), &s->qdev, tag, lun);
92
    r = DO_UPCAST(SCSIDiskReq, req, req);
93
    r->iov.iov_base = qemu_blockalign(s->bs, SCSI_DMA_BUF_SIZE);
94
    return r;
95
}
96

    
97
static void scsi_remove_request(SCSIDiskReq *r)
98
{
99
    qemu_vfree(r->iov.iov_base);
100
    scsi_req_free(&r->req);
101
}
102

    
103
static SCSIDiskReq *scsi_find_request(SCSIDiskState *s, uint32_t tag)
104
{
105
    return DO_UPCAST(SCSIDiskReq, req, scsi_req_find(&s->qdev, tag));
106
}
107

    
108
static void scsi_disk_clear_sense(SCSIDiskState *s)
109
{
110
    memset(&s->sense, 0, sizeof(s->sense));
111
}
112

    
113
static void scsi_disk_set_sense(SCSIDiskState *s, uint8_t key)
114
{
115
    s->sense.key = key;
116
}
117

    
118
static void scsi_req_set_status(SCSIDiskReq *r, int status, int sense_code)
119
{
120
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
121

    
122
    r->req.status = status;
123
    scsi_disk_set_sense(s, sense_code);
124
}
125

    
126
/* Helper function for command completion.  */
127
static void scsi_command_complete(SCSIDiskReq *r, int status, int sense)
128
{
129
    DPRINTF("Command complete tag=0x%x status=%d sense=%d\n",
130
            r->req.tag, status, sense);
131
    scsi_req_set_status(r, status, sense);
132
    scsi_req_complete(&r->req);
133
    scsi_remove_request(r);
134
}
135

    
136
/* Cancel a pending data transfer.  */
137
static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
138
{
139
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
140
    SCSIDiskReq *r;
141
    DPRINTF("Cancel tag=0x%x\n", tag);
142
    r = scsi_find_request(s, tag);
143
    if (r) {
144
        if (r->req.aiocb)
145
            bdrv_aio_cancel(r->req.aiocb);
146
        r->req.aiocb = NULL;
147
        scsi_remove_request(r);
148
    }
149
}
150

    
151
static void scsi_read_complete(void * opaque, int ret)
152
{
153
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
154
    int n;
155

    
156
    r->req.aiocb = NULL;
157

    
158
    if (ret) {
159
        if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_READ)) {
160
            return;
161
        }
162
    }
163

    
164
    DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->iov.iov_len);
165

    
166
    n = r->iov.iov_len / 512;
167
    r->sector += n;
168
    r->sector_count -= n;
169
    r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, r->iov.iov_len);
170
}
171

    
172

    
173
static void scsi_read_request(SCSIDiskReq *r)
174
{
175
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
176
    uint32_t n;
177

    
178
    if (r->sector_count == (uint32_t)-1) {
179
        DPRINTF("Read buf_len=%zd\n", r->iov.iov_len);
180
        r->sector_count = 0;
181
        r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, r->iov.iov_len);
182
        return;
183
    }
184
    DPRINTF("Read sector_count=%d\n", r->sector_count);
185
    if (r->sector_count == 0) {
186
        scsi_command_complete(r, GOOD, NO_SENSE);
187
        return;
188
    }
189

    
190
    /* No data transfer may already be in progress */
191
    assert(r->req.aiocb == NULL);
192

    
193
    n = r->sector_count;
194
    if (n > SCSI_DMA_BUF_SIZE / 512)
195
        n = SCSI_DMA_BUF_SIZE / 512;
196

    
197
    r->iov.iov_len = n * 512;
198
    qemu_iovec_init_external(&r->qiov, &r->iov, 1);
199
    r->req.aiocb = bdrv_aio_readv(s->bs, r->sector, &r->qiov, n,
200
                              scsi_read_complete, r);
201
    if (r->req.aiocb == NULL) {
202
        scsi_read_complete(r, -EIO);
203
    }
204
}
205

    
206
/* Read more data from scsi device into buffer.  */
207
static void scsi_read_data(SCSIDevice *d, uint32_t tag)
208
{
209
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
210
    SCSIDiskReq *r;
211

    
212
    r = scsi_find_request(s, tag);
213
    if (!r) {
214
        BADF("Bad read tag 0x%x\n", tag);
215
        /* ??? This is the wrong error.  */
216
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
217
        return;
218
    }
219

    
220
    scsi_read_request(r);
221
}
222

    
223
static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type)
224
{
225
    int is_read = (type == SCSI_REQ_STATUS_RETRY_READ);
226
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
227
    BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
228

    
229
    if (action == BLOCK_ERR_IGNORE) {
230
        bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
231
        return 0;
232
    }
233

    
234
    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
235
            || action == BLOCK_ERR_STOP_ANY) {
236

    
237
        type &= SCSI_REQ_STATUS_RETRY_TYPE_MASK;
238
        r->status |= SCSI_REQ_STATUS_RETRY | type;
239

    
240
        bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
241
        vm_stop(0);
242
    } else {
243
        if (type == SCSI_REQ_STATUS_RETRY_READ) {
244
            r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, 0);
245
        }
246
        scsi_command_complete(r, CHECK_CONDITION,
247
                HARDWARE_ERROR);
248
        bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
249
    }
250

    
251
    return 1;
252
}
253

    
254
static void scsi_write_complete(void * opaque, int ret)
255
{
256
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
257
    uint32_t len;
258
    uint32_t n;
259

    
260
    r->req.aiocb = NULL;
261

    
262
    if (ret) {
263
        if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_WRITE)) {
264
            return;
265
        }
266
    }
267

    
268
    n = r->iov.iov_len / 512;
269
    r->sector += n;
270
    r->sector_count -= n;
271
    if (r->sector_count == 0) {
272
        scsi_command_complete(r, GOOD, NO_SENSE);
273
    } else {
274
        len = r->sector_count * 512;
275
        if (len > SCSI_DMA_BUF_SIZE) {
276
            len = SCSI_DMA_BUF_SIZE;
277
        }
278
        r->iov.iov_len = len;
279
        DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, len);
280
        r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, len);
281
    }
282
}
283

    
284
static void scsi_write_request(SCSIDiskReq *r)
285
{
286
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
287
    uint32_t n;
288

    
289
    /* No data transfer may already be in progress */
290
    assert(r->req.aiocb == NULL);
291

    
292
    n = r->iov.iov_len / 512;
293
    if (n) {
294
        qemu_iovec_init_external(&r->qiov, &r->iov, 1);
295
        r->req.aiocb = bdrv_aio_writev(s->bs, r->sector, &r->qiov, n,
296
                                   scsi_write_complete, r);
297
        if (r->req.aiocb == NULL) {
298
            scsi_write_complete(r, -EIO);
299
        }
300
    } else {
301
        /* Invoke completion routine to fetch data from host.  */
302
        scsi_write_complete(r, 0);
303
    }
304
}
305

    
306
/* Write data to a scsi device.  Returns nonzero on failure.
307
   The transfer may complete asynchronously.  */
308
static int scsi_write_data(SCSIDevice *d, uint32_t tag)
309
{
310
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
311
    SCSIDiskReq *r;
312

    
313
    DPRINTF("Write data tag=0x%x\n", tag);
314
    r = scsi_find_request(s, tag);
315
    if (!r) {
316
        BADF("Bad write tag 0x%x\n", tag);
317
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
318
        return 1;
319
    }
320

    
321
    scsi_write_request(r);
322

    
323
    return 0;
324
}
325

    
326
static void scsi_dma_restart_bh(void *opaque)
327
{
328
    SCSIDiskState *s = opaque;
329
    SCSIRequest *req;
330
    SCSIDiskReq *r;
331

    
332
    qemu_bh_delete(s->bh);
333
    s->bh = NULL;
334

    
335
    QTAILQ_FOREACH(req, &s->qdev.requests, next) {
336
        r = DO_UPCAST(SCSIDiskReq, req, req);
337
        if (r->status & SCSI_REQ_STATUS_RETRY) {
338
            int status = r->status;
339
            int ret;
340

    
341
            r->status &=
342
                ~(SCSI_REQ_STATUS_RETRY | SCSI_REQ_STATUS_RETRY_TYPE_MASK);
343

    
344
            switch (status & SCSI_REQ_STATUS_RETRY_TYPE_MASK) {
345
            case SCSI_REQ_STATUS_RETRY_READ:
346
                scsi_read_request(r);
347
                break;
348
            case SCSI_REQ_STATUS_RETRY_WRITE:
349
                scsi_write_request(r);
350
                break;
351
            case SCSI_REQ_STATUS_RETRY_FLUSH:
352
                ret = scsi_disk_emulate_command(r, r->iov.iov_base);
353
                if (ret == 0) {
354
                    scsi_command_complete(r, GOOD, NO_SENSE);
355
                }
356
            }
357
        }
358
    }
359
}
360

    
361
static void scsi_dma_restart_cb(void *opaque, int running, int reason)
362
{
363
    SCSIDiskState *s = opaque;
364

    
365
    if (!running)
366
        return;
367

    
368
    if (!s->bh) {
369
        s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
370
        qemu_bh_schedule(s->bh);
371
    }
372
}
373

    
374
/* Return a pointer to the data buffer.  */
375
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
376
{
377
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
378
    SCSIDiskReq *r;
379

    
380
    r = scsi_find_request(s, tag);
381
    if (!r) {
382
        BADF("Bad buffer tag 0x%x\n", tag);
383
        return NULL;
384
    }
385
    return (uint8_t *)r->iov.iov_base;
386
}
387

    
388
static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
389
{
390
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
391
    int buflen = 0;
392

    
393
    if (req->cmd.buf[1] & 0x2) {
394
        /* Command support data - optional, not implemented */
395
        BADF("optional INQUIRY command support request not implemented\n");
396
        return -1;
397
    }
398

    
399
    if (req->cmd.buf[1] & 0x1) {
400
        /* Vital product data */
401
        uint8_t page_code = req->cmd.buf[2];
402
        if (req->cmd.xfer < 4) {
403
            BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
404
                 "less than 4\n", page_code, req->cmd.xfer);
405
            return -1;
406
        }
407

    
408
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
409
            outbuf[buflen++] = 5;
410
        } else {
411
            outbuf[buflen++] = 0;
412
        }
413
        outbuf[buflen++] = page_code ; // this page
414
        outbuf[buflen++] = 0x00;
415

    
416
        switch (page_code) {
417
        case 0x00: /* Supported page codes, mandatory */
418
        {
419
            int pages;
420
            DPRINTF("Inquiry EVPD[Supported pages] "
421
                    "buffer size %zd\n", req->cmd.xfer);
422
            pages = buflen++;
423
            outbuf[buflen++] = 0x00; // list of supported pages (this page)
424
            outbuf[buflen++] = 0x80; // unit serial number
425
            outbuf[buflen++] = 0x83; // device identification
426
            if (bdrv_get_type_hint(s->bs) != BDRV_TYPE_CDROM) {
427
                outbuf[buflen++] = 0xb0; // block limits
428
                outbuf[buflen++] = 0xb2; // thin provisioning
429
            }
430
            outbuf[pages] = buflen - pages - 1; // number of pages
431
            break;
432
        }
433
        case 0x80: /* Device serial number, optional */
434
        {
435
            int l = strlen(s->serial);
436

    
437
            if (l > req->cmd.xfer)
438
                l = req->cmd.xfer;
439
            if (l > 20)
440
                l = 20;
441

    
442
            DPRINTF("Inquiry EVPD[Serial number] "
443
                    "buffer size %zd\n", req->cmd.xfer);
444
            outbuf[buflen++] = l;
445
            memcpy(outbuf+buflen, s->serial, l);
446
            buflen += l;
447
            break;
448
        }
449

    
450
        case 0x83: /* Device identification page, mandatory */
451
        {
452
            int max_len = 255 - 8;
453
            int id_len = strlen(bdrv_get_device_name(s->bs));
454

    
455
            if (id_len > max_len)
456
                id_len = max_len;
457
            DPRINTF("Inquiry EVPD[Device identification] "
458
                    "buffer size %zd\n", req->cmd.xfer);
459

    
460
            outbuf[buflen++] = 4 + id_len;
461
            outbuf[buflen++] = 0x2; // ASCII
462
            outbuf[buflen++] = 0;   // not officially assigned
463
            outbuf[buflen++] = 0;   // reserved
464
            outbuf[buflen++] = id_len; // length of data following
465

    
466
            memcpy(outbuf+buflen, bdrv_get_device_name(s->bs), id_len);
467
            buflen += id_len;
468
            break;
469
        }
470
        case 0xb0: /* block limits */
471
        {
472
            unsigned int unmap_sectors =
473
                    s->qdev.conf.discard_granularity / s->qdev.blocksize;
474
            unsigned int min_io_size =
475
                    s->qdev.conf.min_io_size / s->qdev.blocksize;
476
            unsigned int opt_io_size =
477
                    s->qdev.conf.opt_io_size / s->qdev.blocksize;
478

    
479
            if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
480
                DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
481
                        page_code);
482
                return -1;
483
            }
484
            /* required VPD size with unmap support */
485
            outbuf[3] = buflen = 0x3c;
486

    
487
            memset(outbuf + 4, 0, buflen - 4);
488

    
489
            /* optimal transfer length granularity */
490
            outbuf[6] = (min_io_size >> 8) & 0xff;
491
            outbuf[7] = min_io_size & 0xff;
492

    
493
            /* optimal transfer length */
494
            outbuf[12] = (opt_io_size >> 24) & 0xff;
495
            outbuf[13] = (opt_io_size >> 16) & 0xff;
496
            outbuf[14] = (opt_io_size >> 8) & 0xff;
497
            outbuf[15] = opt_io_size & 0xff;
498

    
499
            /* optimal unmap granularity */
500
            outbuf[28] = (unmap_sectors >> 24) & 0xff;
501
            outbuf[29] = (unmap_sectors >> 16) & 0xff;
502
            outbuf[30] = (unmap_sectors >> 8) & 0xff;
503
            outbuf[31] = unmap_sectors & 0xff;
504
            break;
505
        }
506
        case 0xb2: /* thin provisioning */
507
        {
508
            outbuf[3] = buflen = 8;
509
            outbuf[4] = 0;
510
            outbuf[5] = 0x40; /* write same with unmap supported */
511
            outbuf[6] = 0;
512
            outbuf[7] = 0;
513
            break;
514
        }
515
        default:
516
            BADF("Error: unsupported Inquiry (EVPD[%02X]) "
517
                 "buffer size %zd\n", page_code, req->cmd.xfer);
518
            return -1;
519
        }
520
        /* done with EVPD */
521
        return buflen;
522
    }
523

    
524
    /* Standard INQUIRY data */
525
    if (req->cmd.buf[2] != 0) {
526
        BADF("Error: Inquiry (STANDARD) page or code "
527
             "is non-zero [%02X]\n", req->cmd.buf[2]);
528
        return -1;
529
    }
530

    
531
    /* PAGE CODE == 0 */
532
    if (req->cmd.xfer < 5) {
533
        BADF("Error: Inquiry (STANDARD) buffer size %zd "
534
             "is less than 5\n", req->cmd.xfer);
535
        return -1;
536
    }
537

    
538
    buflen = req->cmd.xfer;
539
    if (buflen > SCSI_MAX_INQUIRY_LEN)
540
        buflen = SCSI_MAX_INQUIRY_LEN;
541

    
542
    memset(outbuf, 0, buflen);
543

    
544
    if (req->lun || req->cmd.buf[1] >> 5) {
545
        outbuf[0] = 0x7f;        /* LUN not supported */
546
        return buflen;
547
    }
548

    
549
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
550
        outbuf[0] = 5;
551
        outbuf[1] = 0x80;
552
        memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
553
    } else {
554
        outbuf[0] = 0;
555
        memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
556
    }
557
    memcpy(&outbuf[8], "QEMU    ", 8);
558
    memset(&outbuf[32], 0, 4);
559
    memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
560
    /*
561
     * We claim conformance to SPC-3, which is required for guests
562
     * to ask for modern features like READ CAPACITY(16) or the
563
     * block characteristics VPD page by default.  Not all of SPC-3
564
     * is actually implemented, but we're good enough.
565
     */
566
    outbuf[2] = 5;
567
    outbuf[3] = 2; /* Format 2 */
568

    
569
    if (buflen > 36) {
570
        outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
571
    } else {
572
        /* If the allocation length of CDB is too small,
573
               the additional length is not adjusted */
574
        outbuf[4] = 36 - 5;
575
    }
576

    
577
    /* Sync data transfer and TCQ.  */
578
    outbuf[7] = 0x10 | (req->bus->tcq ? 0x02 : 0);
579
    return buflen;
580
}
581

    
582
static int mode_sense_page(SCSIRequest *req, int page, uint8_t *p,
583
                           int page_control)
584
{
585
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
586
    BlockDriverState *bdrv = s->bs;
587
    int cylinders, heads, secs;
588

    
589
    /*
590
     * If Changeable Values are requested, a mask denoting those mode parameters
591
     * that are changeable shall be returned. As we currently don't support
592
     * parameter changes via MODE_SELECT all bits are returned set to zero.
593
     * The buffer was already menset to zero by the caller of this function.
594
     */
595
    switch (page) {
596
    case 4: /* Rigid disk device geometry page. */
597
        p[0] = 4;
598
        p[1] = 0x16;
599
        if (page_control == 1) { /* Changeable Values */
600
            return p[1] + 2;
601
        }
602
        /* if a geometry hint is available, use it */
603
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
604
        p[2] = (cylinders >> 16) & 0xff;
605
        p[3] = (cylinders >> 8) & 0xff;
606
        p[4] = cylinders & 0xff;
607
        p[5] = heads & 0xff;
608
        /* Write precomp start cylinder, disabled */
609
        p[6] = (cylinders >> 16) & 0xff;
610
        p[7] = (cylinders >> 8) & 0xff;
611
        p[8] = cylinders & 0xff;
612
        /* Reduced current start cylinder, disabled */
613
        p[9] = (cylinders >> 16) & 0xff;
614
        p[10] = (cylinders >> 8) & 0xff;
615
        p[11] = cylinders & 0xff;
616
        /* Device step rate [ns], 200ns */
617
        p[12] = 0;
618
        p[13] = 200;
619
        /* Landing zone cylinder */
620
        p[14] = 0xff;
621
        p[15] =  0xff;
622
        p[16] = 0xff;
623
        /* Medium rotation rate [rpm], 5400 rpm */
624
        p[20] = (5400 >> 8) & 0xff;
625
        p[21] = 5400 & 0xff;
626
        return p[1] + 2;
627

    
628
    case 5: /* Flexible disk device geometry page. */
629
        p[0] = 5;
630
        p[1] = 0x1e;
631
        if (page_control == 1) { /* Changeable Values */
632
            return p[1] + 2;
633
        }
634
        /* Transfer rate [kbit/s], 5Mbit/s */
635
        p[2] = 5000 >> 8;
636
        p[3] = 5000 & 0xff;
637
        /* if a geometry hint is available, use it */
638
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
639
        p[4] = heads & 0xff;
640
        p[5] = secs & 0xff;
641
        p[6] = s->cluster_size * 2;
642
        p[8] = (cylinders >> 8) & 0xff;
643
        p[9] = cylinders & 0xff;
644
        /* Write precomp start cylinder, disabled */
645
        p[10] = (cylinders >> 8) & 0xff;
646
        p[11] = cylinders & 0xff;
647
        /* Reduced current start cylinder, disabled */
648
        p[12] = (cylinders >> 8) & 0xff;
649
        p[13] = cylinders & 0xff;
650
        /* Device step rate [100us], 100us */
651
        p[14] = 0;
652
        p[15] = 1;
653
        /* Device step pulse width [us], 1us */
654
        p[16] = 1;
655
        /* Device head settle delay [100us], 100us */
656
        p[17] = 0;
657
        p[18] = 1;
658
        /* Motor on delay [0.1s], 0.1s */
659
        p[19] = 1;
660
        /* Motor off delay [0.1s], 0.1s */
661
        p[20] = 1;
662
        /* Medium rotation rate [rpm], 5400 rpm */
663
        p[28] = (5400 >> 8) & 0xff;
664
        p[29] = 5400 & 0xff;
665
        return p[1] + 2;
666

    
667
    case 8: /* Caching page.  */
668
        p[0] = 8;
669
        p[1] = 0x12;
670
        if (page_control == 1) { /* Changeable Values */
671
            return p[1] + 2;
672
        }
673
        if (bdrv_enable_write_cache(s->bs)) {
674
            p[2] = 4; /* WCE */
675
        }
676
        return p[1] + 2;
677

    
678
    case 0x2a: /* CD Capabilities and Mechanical Status page. */
679
        if (bdrv_get_type_hint(bdrv) != BDRV_TYPE_CDROM)
680
            return 0;
681
        p[0] = 0x2a;
682
        p[1] = 0x14;
683
        if (page_control == 1) { /* Changeable Values */
684
            return p[1] + 2;
685
        }
686
        p[2] = 3; // CD-R & CD-RW read
687
        p[3] = 0; // Writing not supported
688
        p[4] = 0x7f; /* Audio, composite, digital out,
689
                        mode 2 form 1&2, multi session */
690
        p[5] = 0xff; /* CD DA, DA accurate, RW supported,
691
                        RW corrected, C2 errors, ISRC,
692
                        UPC, Bar code */
693
        p[6] = 0x2d | (bdrv_is_locked(s->bs)? 2 : 0);
694
        /* Locking supported, jumper present, eject, tray */
695
        p[7] = 0; /* no volume & mute control, no
696
                     changer */
697
        p[8] = (50 * 176) >> 8; // 50x read speed
698
        p[9] = (50 * 176) & 0xff;
699
        p[10] = 0 >> 8; // No volume
700
        p[11] = 0 & 0xff;
701
        p[12] = 2048 >> 8; // 2M buffer
702
        p[13] = 2048 & 0xff;
703
        p[14] = (16 * 176) >> 8; // 16x read speed current
704
        p[15] = (16 * 176) & 0xff;
705
        p[18] = (16 * 176) >> 8; // 16x write speed
706
        p[19] = (16 * 176) & 0xff;
707
        p[20] = (16 * 176) >> 8; // 16x write speed current
708
        p[21] = (16 * 176) & 0xff;
709
        return p[1] + 2;
710

    
711
    default:
712
        return 0;
713
    }
714
}
715

    
716
static int scsi_disk_emulate_mode_sense(SCSIRequest *req, uint8_t *outbuf)
717
{
718
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
719
    uint64_t nb_sectors;
720
    int page, dbd, buflen, page_control;
721
    uint8_t *p;
722
    uint8_t dev_specific_param;
723

    
724
    dbd = req->cmd.buf[1]  & 0x8;
725
    page = req->cmd.buf[2] & 0x3f;
726
    page_control = (req->cmd.buf[2] & 0xc0) >> 6;
727
    DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
728
        (req->cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, req->cmd.xfer, page_control);
729
    memset(outbuf, 0, req->cmd.xfer);
730
    p = outbuf;
731

    
732
    if (bdrv_is_read_only(s->bs)) {
733
        dev_specific_param = 0x80; /* Readonly.  */
734
    } else {
735
        dev_specific_param = 0x00;
736
    }
737

    
738
    if (req->cmd.buf[0] == MODE_SENSE) {
739
        p[1] = 0; /* Default media type.  */
740
        p[2] = dev_specific_param;
741
        p[3] = 0; /* Block descriptor length.  */
742
        p += 4;
743
    } else { /* MODE_SENSE_10 */
744
        p[2] = 0; /* Default media type.  */
745
        p[3] = dev_specific_param;
746
        p[6] = p[7] = 0; /* Block descriptor length.  */
747
        p += 8;
748
    }
749

    
750
    bdrv_get_geometry(s->bs, &nb_sectors);
751
    if (!dbd && nb_sectors) {
752
        if (req->cmd.buf[0] == MODE_SENSE) {
753
            outbuf[3] = 8; /* Block descriptor length  */
754
        } else { /* MODE_SENSE_10 */
755
            outbuf[7] = 8; /* Block descriptor length  */
756
        }
757
        nb_sectors /= s->cluster_size;
758
        if (nb_sectors > 0xffffff)
759
            nb_sectors = 0;
760
        p[0] = 0; /* media density code */
761
        p[1] = (nb_sectors >> 16) & 0xff;
762
        p[2] = (nb_sectors >> 8) & 0xff;
763
        p[3] = nb_sectors & 0xff;
764
        p[4] = 0; /* reserved */
765
        p[5] = 0; /* bytes 5-7 are the sector size in bytes */
766
        p[6] = s->cluster_size * 2;
767
        p[7] = 0;
768
        p += 8;
769
    }
770

    
771
    if (page_control == 3) { /* Saved Values */
772
        return -1; /* ILLEGAL_REQUEST */
773
    }
774

    
775
    switch (page) {
776
    case 0x04:
777
    case 0x05:
778
    case 0x08:
779
    case 0x2a:
780
        p += mode_sense_page(req, page, p, page_control);
781
        break;
782
    case 0x3f:
783
        p += mode_sense_page(req, 0x08, p, page_control);
784
        p += mode_sense_page(req, 0x2a, p, page_control);
785
        break;
786
    default:
787
        return -1; /* ILLEGAL_REQUEST */
788
    }
789

    
790
    buflen = p - outbuf;
791
    /*
792
     * The mode data length field specifies the length in bytes of the
793
     * following data that is available to be transferred. The mode data
794
     * length does not include itself.
795
     */
796
    if (req->cmd.buf[0] == MODE_SENSE) {
797
        outbuf[0] = buflen - 1;
798
    } else { /* MODE_SENSE_10 */
799
        outbuf[0] = ((buflen - 2) >> 8) & 0xff;
800
        outbuf[1] = (buflen - 2) & 0xff;
801
    }
802
    if (buflen > req->cmd.xfer)
803
        buflen = req->cmd.xfer;
804
    return buflen;
805
}
806

    
807
static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
808
{
809
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
810
    int start_track, format, msf, toclen;
811
    uint64_t nb_sectors;
812

    
813
    msf = req->cmd.buf[1] & 2;
814
    format = req->cmd.buf[2] & 0xf;
815
    start_track = req->cmd.buf[6];
816
    bdrv_get_geometry(s->bs, &nb_sectors);
817
    DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
818
    nb_sectors /= s->cluster_size;
819
    switch (format) {
820
    case 0:
821
        toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
822
        break;
823
    case 1:
824
        /* multi session : only a single session defined */
825
        toclen = 12;
826
        memset(outbuf, 0, 12);
827
        outbuf[1] = 0x0a;
828
        outbuf[2] = 0x01;
829
        outbuf[3] = 0x01;
830
        break;
831
    case 2:
832
        toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
833
        break;
834
    default:
835
        return -1;
836
    }
837
    if (toclen > req->cmd.xfer)
838
        toclen = req->cmd.xfer;
839
    return toclen;
840
}
841

    
842
static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
843
{
844
    SCSIRequest *req = &r->req;
845
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
846
    uint64_t nb_sectors;
847
    int buflen = 0;
848
    int ret;
849

    
850
    switch (req->cmd.buf[0]) {
851
    case TEST_UNIT_READY:
852
        if (!bdrv_is_inserted(s->bs))
853
            goto not_ready;
854
        break;
855
    case REQUEST_SENSE:
856
        if (req->cmd.xfer < 4)
857
            goto illegal_request;
858
        memset(outbuf, 0, 4);
859
        buflen = 4;
860
        if (s->sense.key == NOT_READY && req->cmd.xfer >= 18) {
861
            memset(outbuf, 0, 18);
862
            buflen = 18;
863
            outbuf[7] = 10;
864
            /* asc 0x3a, ascq 0: Medium not present */
865
            outbuf[12] = 0x3a;
866
            outbuf[13] = 0;
867
        }
868
        outbuf[0] = 0xf0;
869
        outbuf[1] = 0;
870
        outbuf[2] = s->sense.key;
871
        scsi_disk_clear_sense(s);
872
        break;
873
    case INQUIRY:
874
        buflen = scsi_disk_emulate_inquiry(req, outbuf);
875
        if (buflen < 0)
876
            goto illegal_request;
877
        break;
878
    case MODE_SENSE:
879
    case MODE_SENSE_10:
880
        buflen = scsi_disk_emulate_mode_sense(req, outbuf);
881
        if (buflen < 0)
882
            goto illegal_request;
883
        break;
884
    case READ_TOC:
885
        buflen = scsi_disk_emulate_read_toc(req, outbuf);
886
        if (buflen < 0)
887
            goto illegal_request;
888
        break;
889
    case RESERVE:
890
        if (req->cmd.buf[1] & 1)
891
            goto illegal_request;
892
        break;
893
    case RESERVE_10:
894
        if (req->cmd.buf[1] & 3)
895
            goto illegal_request;
896
        break;
897
    case RELEASE:
898
        if (req->cmd.buf[1] & 1)
899
            goto illegal_request;
900
        break;
901
    case RELEASE_10:
902
        if (req->cmd.buf[1] & 3)
903
            goto illegal_request;
904
        break;
905
    case START_STOP:
906
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM && (req->cmd.buf[4] & 2)) {
907
            /* load/eject medium */
908
            bdrv_eject(s->bs, !(req->cmd.buf[4] & 1));
909
        }
910
        break;
911
    case ALLOW_MEDIUM_REMOVAL:
912
        bdrv_set_locked(s->bs, req->cmd.buf[4] & 1);
913
        break;
914
    case READ_CAPACITY:
915
        /* The normal LEN field for this command is zero.  */
916
        memset(outbuf, 0, 8);
917
        bdrv_get_geometry(s->bs, &nb_sectors);
918
        if (!nb_sectors)
919
            goto not_ready;
920
        nb_sectors /= s->cluster_size;
921
        /* Returned value is the address of the last sector.  */
922
        nb_sectors--;
923
        /* Remember the new size for read/write sanity checking. */
924
        s->max_lba = nb_sectors;
925
        /* Clip to 2TB, instead of returning capacity modulo 2TB. */
926
        if (nb_sectors > UINT32_MAX)
927
            nb_sectors = UINT32_MAX;
928
        outbuf[0] = (nb_sectors >> 24) & 0xff;
929
        outbuf[1] = (nb_sectors >> 16) & 0xff;
930
        outbuf[2] = (nb_sectors >> 8) & 0xff;
931
        outbuf[3] = nb_sectors & 0xff;
932
        outbuf[4] = 0;
933
        outbuf[5] = 0;
934
        outbuf[6] = s->cluster_size * 2;
935
        outbuf[7] = 0;
936
        buflen = 8;
937
        break;
938
    case SYNCHRONIZE_CACHE:
939
        ret = bdrv_flush(s->bs);
940
        if (ret < 0) {
941
            if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_FLUSH)) {
942
                return -1;
943
            }
944
        }
945
        break;
946
    case GET_CONFIGURATION:
947
        memset(outbuf, 0, 8);
948
        /* ??? This should probably return much more information.  For now
949
           just return the basic header indicating the CD-ROM profile.  */
950
        outbuf[7] = 8; // CD-ROM
951
        buflen = 8;
952
        break;
953
    case SERVICE_ACTION_IN:
954
        /* Service Action In subcommands. */
955
        if ((req->cmd.buf[1] & 31) == 0x10) {
956
            DPRINTF("SAI READ CAPACITY(16)\n");
957
            memset(outbuf, 0, req->cmd.xfer);
958
            bdrv_get_geometry(s->bs, &nb_sectors);
959
            if (!nb_sectors)
960
                goto not_ready;
961
            nb_sectors /= s->cluster_size;
962
            /* Returned value is the address of the last sector.  */
963
            nb_sectors--;
964
            /* Remember the new size for read/write sanity checking. */
965
            s->max_lba = nb_sectors;
966
            outbuf[0] = (nb_sectors >> 56) & 0xff;
967
            outbuf[1] = (nb_sectors >> 48) & 0xff;
968
            outbuf[2] = (nb_sectors >> 40) & 0xff;
969
            outbuf[3] = (nb_sectors >> 32) & 0xff;
970
            outbuf[4] = (nb_sectors >> 24) & 0xff;
971
            outbuf[5] = (nb_sectors >> 16) & 0xff;
972
            outbuf[6] = (nb_sectors >> 8) & 0xff;
973
            outbuf[7] = nb_sectors & 0xff;
974
            outbuf[8] = 0;
975
            outbuf[9] = 0;
976
            outbuf[10] = s->cluster_size * 2;
977
            outbuf[11] = 0;
978
            outbuf[12] = 0;
979
            outbuf[13] = get_physical_block_exp(&s->qdev.conf);
980

    
981
            /* set TPE bit if the format supports discard */
982
            if (s->qdev.conf.discard_granularity) {
983
                outbuf[14] = 0x80;
984
            }
985

    
986
            /* Protection, exponent and lowest lba field left blank. */
987
            buflen = req->cmd.xfer;
988
            break;
989
        }
990
        DPRINTF("Unsupported Service Action In\n");
991
        goto illegal_request;
992
    case REPORT_LUNS:
993
        if (req->cmd.xfer < 16)
994
            goto illegal_request;
995
        memset(outbuf, 0, 16);
996
        outbuf[3] = 8;
997
        buflen = 16;
998
        break;
999
    case VERIFY:
1000
        break;
1001
    case REZERO_UNIT:
1002
        DPRINTF("Rezero Unit\n");
1003
        if (!bdrv_is_inserted(s->bs)) {
1004
            goto not_ready;
1005
        }
1006
        break;
1007
    default:
1008
        goto illegal_request;
1009
    }
1010
    scsi_req_set_status(r, GOOD, NO_SENSE);
1011
    return buflen;
1012

    
1013
not_ready:
1014
    scsi_command_complete(r, CHECK_CONDITION, NOT_READY);
1015
    return -1;
1016

    
1017
illegal_request:
1018
    scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
1019
    return -1;
1020
}
1021

    
1022
/* Execute a scsi command.  Returns the length of the data expected by the
1023
   command.  This will be Positive for data transfers from the device
1024
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
1025
   and zero if the command does not transfer any data.  */
1026

    
1027
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
1028
                                 uint8_t *buf, int lun)
1029
{
1030
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1031
    uint32_t len;
1032
    int is_write;
1033
    uint8_t command;
1034
    uint8_t *outbuf;
1035
    SCSIDiskReq *r;
1036
    int rc;
1037

    
1038
    command = buf[0];
1039
    r = scsi_find_request(s, tag);
1040
    if (r) {
1041
        BADF("Tag 0x%x already in use\n", tag);
1042
        scsi_cancel_io(d, tag);
1043
    }
1044
    /* ??? Tags are not unique for different luns.  We only implement a
1045
       single lun, so this should not matter.  */
1046
    r = scsi_new_request(s, tag, lun);
1047
    outbuf = (uint8_t *)r->iov.iov_base;
1048
    is_write = 0;
1049
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
1050

    
1051
    if (scsi_req_parse(&r->req, buf) != 0) {
1052
        BADF("Unsupported command length, command %x\n", command);
1053
        goto fail;
1054
    }
1055
#ifdef DEBUG_SCSI
1056
    {
1057
        int i;
1058
        for (i = 1; i < r->req.cmd.len; i++) {
1059
            printf(" 0x%02x", buf[i]);
1060
        }
1061
        printf("\n");
1062
    }
1063
#endif
1064

    
1065
    if (lun || buf[1] >> 5) {
1066
        /* Only LUN 0 supported.  */
1067
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
1068
        if (command != REQUEST_SENSE && command != INQUIRY)
1069
            goto fail;
1070
    }
1071
    switch (command) {
1072
    case TEST_UNIT_READY:
1073
    case REQUEST_SENSE:
1074
    case INQUIRY:
1075
    case MODE_SENSE:
1076
    case MODE_SENSE_10:
1077
    case RESERVE:
1078
    case RESERVE_10:
1079
    case RELEASE:
1080
    case RELEASE_10:
1081
    case START_STOP:
1082
    case ALLOW_MEDIUM_REMOVAL:
1083
    case READ_CAPACITY:
1084
    case SYNCHRONIZE_CACHE:
1085
    case READ_TOC:
1086
    case GET_CONFIGURATION:
1087
    case SERVICE_ACTION_IN:
1088
    case REPORT_LUNS:
1089
    case VERIFY:
1090
    case REZERO_UNIT:
1091
        rc = scsi_disk_emulate_command(r, outbuf);
1092
        if (rc < 0) {
1093
            return 0;
1094
        }
1095

    
1096
        r->iov.iov_len = rc;
1097
        break;
1098
    case READ_6:
1099
    case READ_10:
1100
    case READ_12:
1101
    case READ_16:
1102
        len = r->req.cmd.xfer / d->blocksize;
1103
        DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
1104
        if (r->req.cmd.lba > s->max_lba)
1105
            goto illegal_lba;
1106
        r->sector = r->req.cmd.lba * s->cluster_size;
1107
        r->sector_count = len * s->cluster_size;
1108
        break;
1109
    case WRITE_6:
1110
    case WRITE_10:
1111
    case WRITE_12:
1112
    case WRITE_16:
1113
    case WRITE_VERIFY:
1114
    case WRITE_VERIFY_12:
1115
    case WRITE_VERIFY_16:
1116
        len = r->req.cmd.xfer / d->blocksize;
1117
        DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
1118
                (command & 0xe) == 0xe ? "And Verify " : "",
1119
                r->req.cmd.lba, len);
1120
        if (r->req.cmd.lba > s->max_lba)
1121
            goto illegal_lba;
1122
        r->sector = r->req.cmd.lba * s->cluster_size;
1123
        r->sector_count = len * s->cluster_size;
1124
        is_write = 1;
1125
        break;
1126
    case MODE_SELECT:
1127
        DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
1128
        /* We don't support mode parameter changes.
1129
           Allow the mode parameter header + block descriptors only. */
1130
        if (r->req.cmd.xfer > 12) {
1131
            goto fail;
1132
        }
1133
        break;
1134
    case MODE_SELECT_10:
1135
        DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
1136
        /* We don't support mode parameter changes.
1137
           Allow the mode parameter header + block descriptors only. */
1138
        if (r->req.cmd.xfer > 16) {
1139
            goto fail;
1140
        }
1141
        break;
1142
    case SEEK_6:
1143
    case SEEK_10:
1144
        DPRINTF("Seek(%d) (sector %" PRId64 ")\n", command == SEEK_6 ? 6 : 10,
1145
                r->req.cmd.lba);
1146
        if (r->req.cmd.lba > s->max_lba) {
1147
            goto illegal_lba;
1148
        }
1149
        break;
1150
    case WRITE_SAME_16:
1151
        len = r->req.cmd.xfer / d->blocksize;
1152

    
1153
        DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
1154
                r->req.cmd.lba, len);
1155

    
1156
        if (r->req.cmd.lba > s->max_lba) {
1157
            goto illegal_lba;
1158
        }
1159

    
1160
        /*
1161
         * We only support WRITE SAME with the unmap bit set for now.
1162
         */
1163
        if (!(buf[1] & 0x8)) {
1164
            goto fail;
1165
        }
1166

    
1167
        rc = bdrv_discard(s->bs, r->req.cmd.lba * s->cluster_size,
1168
                          len * s->cluster_size);
1169
        if (rc < 0) {
1170
            /* XXX: better error code ?*/
1171
            goto fail;
1172
        }
1173

    
1174
        break;
1175
    default:
1176
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1177
    fail:
1178
        scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
1179
        return 0;
1180
    illegal_lba:
1181
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
1182
        return 0;
1183
    }
1184
    if (r->sector_count == 0 && r->iov.iov_len == 0) {
1185
        scsi_command_complete(r, GOOD, NO_SENSE);
1186
    }
1187
    len = r->sector_count * 512 + r->iov.iov_len;
1188
    if (is_write) {
1189
        return -len;
1190
    } else {
1191
        if (!r->sector_count)
1192
            r->sector_count = -1;
1193
        return len;
1194
    }
1195
}
1196

    
1197
static void scsi_disk_purge_requests(SCSIDiskState *s)
1198
{
1199
    SCSIDiskReq *r;
1200

    
1201
    while (!QTAILQ_EMPTY(&s->qdev.requests)) {
1202
        r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests));
1203
        if (r->req.aiocb) {
1204
            bdrv_aio_cancel(r->req.aiocb);
1205
        }
1206
        scsi_remove_request(r);
1207
    }
1208
}
1209

    
1210
static void scsi_disk_reset(DeviceState *dev)
1211
{
1212
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1213
    uint64_t nb_sectors;
1214

    
1215
    scsi_disk_purge_requests(s);
1216

    
1217
    bdrv_get_geometry(s->bs, &nb_sectors);
1218
    nb_sectors /= s->cluster_size;
1219
    if (nb_sectors) {
1220
        nb_sectors--;
1221
    }
1222
    s->max_lba = nb_sectors;
1223
}
1224

    
1225
static void scsi_destroy(SCSIDevice *dev)
1226
{
1227
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1228

    
1229
    scsi_disk_purge_requests(s);
1230
    blockdev_mark_auto_del(s->qdev.conf.bs);
1231
}
1232

    
1233
static int scsi_disk_initfn(SCSIDevice *dev)
1234
{
1235
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1236
    int is_cd;
1237
    DriveInfo *dinfo;
1238

    
1239
    if (!s->qdev.conf.bs) {
1240
        error_report("scsi-disk: drive property not set");
1241
        return -1;
1242
    }
1243
    s->bs = s->qdev.conf.bs;
1244
    is_cd = bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM;
1245

    
1246
    if (!is_cd && !bdrv_is_inserted(s->bs)) {
1247
        error_report("Device needs media, but drive is empty");
1248
        return -1;
1249
    }
1250

    
1251
    if (!s->serial) {
1252
        /* try to fall back to value set with legacy -drive serial=... */
1253
        dinfo = drive_get_by_blockdev(s->bs);
1254
        s->serial = qemu_strdup(*dinfo->serial ? dinfo->serial : "0");
1255
    }
1256

    
1257
    if (!s->version) {
1258
        s->version = qemu_strdup(QEMU_VERSION);
1259
    }
1260

    
1261
    if (bdrv_is_sg(s->bs)) {
1262
        error_report("scsi-disk: unwanted /dev/sg*");
1263
        return -1;
1264
    }
1265

    
1266
    if (is_cd) {
1267
        s->qdev.blocksize = 2048;
1268
    } else {
1269
        s->qdev.blocksize = s->qdev.conf.logical_block_size;
1270
    }
1271
    s->cluster_size = s->qdev.blocksize / 512;
1272
    s->bs->buffer_alignment = s->qdev.blocksize;
1273

    
1274
    s->qdev.type = TYPE_DISK;
1275
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1276
    bdrv_set_removable(s->bs, is_cd);
1277
    add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, ",0");
1278
    return 0;
1279
}
1280

    
1281
static SCSIDeviceInfo scsi_disk_info = {
1282
    .qdev.name    = "scsi-disk",
1283
    .qdev.fw_name = "disk",
1284
    .qdev.desc    = "virtual scsi disk or cdrom",
1285
    .qdev.size    = sizeof(SCSIDiskState),
1286
    .qdev.reset   = scsi_disk_reset,
1287
    .init         = scsi_disk_initfn,
1288
    .destroy      = scsi_destroy,
1289
    .send_command = scsi_send_command,
1290
    .read_data    = scsi_read_data,
1291
    .write_data   = scsi_write_data,
1292
    .cancel_io    = scsi_cancel_io,
1293
    .get_buf      = scsi_get_buf,
1294
    .qdev.props   = (Property[]) {
1295
        DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
1296
        DEFINE_PROP_STRING("ver",  SCSIDiskState, version),
1297
        DEFINE_PROP_STRING("serial",  SCSIDiskState, serial),
1298
        DEFINE_PROP_END_OF_LIST(),
1299
    },
1300
};
1301

    
1302
static void scsi_disk_register_devices(void)
1303
{
1304
    scsi_qdev_register(&scsi_disk_info);
1305
}
1306
device_init(scsi_disk_register_devices)