Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ ed6a9b30

History | View | Annotate | Download (30.5 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
 *
9
 * This code is licenced under the LGPL.
10
 *
11
 * Note that this file only handles the SCSI architecture model and device
12
 * commands.  Emulation of interface/link layer protocols is handled by
13
 * the host adapter emulator.
14
 */
15

    
16
#include <qemu-common.h>
17
#include <sysemu.h>
18
//#define DEBUG_SCSI
19

    
20
#ifdef DEBUG_SCSI
21
#define DPRINTF(fmt, args...) \
22
do { printf("scsi-disk: " fmt , ##args); } while (0)
23
#else
24
#define DPRINTF(fmt, args...) do {} while(0)
25
#endif
26

    
27
#define BADF(fmt, args...) \
28
do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0)
29

    
30
#include "qemu-common.h"
31
#include "block.h"
32
#include "scsi-disk.h"
33

    
34
#define SENSE_NO_SENSE        0
35
#define SENSE_NOT_READY       2
36
#define SENSE_HARDWARE_ERROR  4
37
#define SENSE_ILLEGAL_REQUEST 5
38

    
39
#define STATUS_GOOD            0
40
#define STATUS_CHECK_CONDITION 2
41

    
42
#define SCSI_DMA_BUF_SIZE    131072
43
#define SCSI_MAX_INQUIRY_LEN 256
44

    
45
#define SCSI_REQ_STATUS_RETRY 0x01
46

    
47
typedef struct SCSIRequest {
48
    SCSIDeviceState *dev;
49
    uint32_t tag;
50
    /* ??? We should probably keep track of whether the data transfer is
51
       a read or a write.  Currently we rely on the host getting it right.  */
52
    /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
53
    uint64_t sector;
54
    uint32_t sector_count;
55
    /* The amounnt of data in the buffer.  */
56
    int buf_len;
57
    uint8_t *dma_buf;
58
    BlockDriverAIOCB *aiocb;
59
    struct SCSIRequest *next;
60
    uint32_t status;
61
} SCSIRequest;
62

    
63
struct SCSIDeviceState
64
{
65
    BlockDriverState *bdrv;
66
    SCSIRequest *requests;
67
    /* The qemu block layer uses a fixed 512 byte sector size.
68
       This is the number of 512 byte blocks in a single scsi sector.  */
69
    int cluster_size;
70
    uint64_t max_lba;
71
    int sense;
72
    int tcq;
73
    /* Completion functions may be called from either scsi_{read,write}_data
74
       or from the AIO completion routines.  */
75
    scsi_completionfn completion;
76
    void *opaque;
77
    char drive_serial_str[21];
78
};
79

    
80
/* Global pool of SCSIRequest structures.  */
81
static SCSIRequest *free_requests = NULL;
82

    
83
static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
84
{
85
    SCSIRequest *r;
86

    
87
    if (free_requests) {
88
        r = free_requests;
89
        free_requests = r->next;
90
    } else {
91
        r = qemu_malloc(sizeof(SCSIRequest));
92
        r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
93
    }
94
    r->dev = s;
95
    r->tag = tag;
96
    r->sector_count = 0;
97
    r->buf_len = 0;
98
    r->aiocb = NULL;
99
    r->status = 0;
100

    
101
    r->next = s->requests;
102
    s->requests = r;
103
    return r;
104
}
105

    
106
static void scsi_remove_request(SCSIRequest *r)
107
{
108
    SCSIRequest *last;
109
    SCSIDeviceState *s = r->dev;
110

    
111
    if (s->requests == r) {
112
        s->requests = r->next;
113
    } else {
114
        last = s->requests;
115
        while (last && last->next != r)
116
            last = last->next;
117
        if (last) {
118
            last->next = r->next;
119
        } else {
120
            BADF("Orphaned request\n");
121
        }
122
    }
123
    r->next = free_requests;
124
    free_requests = r;
125
}
126

    
127
static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
128
{
129
    SCSIRequest *r;
130

    
131
    r = s->requests;
132
    while (r && r->tag != tag)
133
        r = r->next;
134

    
135
    return r;
136
}
137

    
138
/* Helper function for command completion.  */
139
static void scsi_command_complete(SCSIRequest *r, int status, int sense)
140
{
141
    SCSIDeviceState *s = r->dev;
142
    uint32_t tag;
143
    DPRINTF("Command complete tag=0x%x status=%d sense=%d\n", r->tag, status, sense);
144
    s->sense = sense;
145
    tag = r->tag;
146
    scsi_remove_request(r);
147
    s->completion(s->opaque, SCSI_REASON_DONE, tag, status);
148
}
149

    
150
/* Cancel a pending data transfer.  */
151
static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
152
{
153
    SCSIDeviceState *s = d->state;
154
    SCSIRequest *r;
155
    DPRINTF("Cancel tag=0x%x\n", tag);
156
    r = scsi_find_request(s, tag);
157
    if (r) {
158
        if (r->aiocb)
159
            bdrv_aio_cancel(r->aiocb);
160
        r->aiocb = NULL;
161
        scsi_remove_request(r);
162
    }
163
}
164

    
165
static void scsi_read_complete(void * opaque, int ret)
166
{
167
    SCSIRequest *r = (SCSIRequest *)opaque;
168
    SCSIDeviceState *s = r->dev;
169

    
170
    if (ret) {
171
        DPRINTF("IO error\n");
172
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, 0);
173
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE);
174
        return;
175
    }
176
    DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len);
177

    
178
    s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
179
}
180

    
181
/* Read more data from scsi device into buffer.  */
182
static void scsi_read_data(SCSIDevice *d, uint32_t tag)
183
{
184
    SCSIDeviceState *s = d->state;
185
    SCSIRequest *r;
186
    uint32_t n;
187

    
188
    r = scsi_find_request(s, tag);
189
    if (!r) {
190
        BADF("Bad read tag 0x%x\n", tag);
191
        /* ??? This is the wrong error.  */
192
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
193
        return;
194
    }
195
    if (r->sector_count == (uint32_t)-1) {
196
        DPRINTF("Read buf_len=%d\n", r->buf_len);
197
        r->sector_count = 0;
198
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
199
        return;
200
    }
201
    DPRINTF("Read sector_count=%d\n", r->sector_count);
202
    if (r->sector_count == 0) {
203
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
204
        return;
205
    }
206

    
207
    n = r->sector_count;
208
    if (n > SCSI_DMA_BUF_SIZE / 512)
209
        n = SCSI_DMA_BUF_SIZE / 512;
210

    
211
    r->buf_len = n * 512;
212
    r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,
213
                             scsi_read_complete, r);
214
    if (r->aiocb == NULL)
215
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
216
    r->sector += n;
217
    r->sector_count -= n;
218
}
219

    
220
static int scsi_handle_write_error(SCSIRequest *r, int error)
221
{
222
    BlockInterfaceErrorAction action = drive_get_onerror(r->dev->bdrv);
223

    
224
    if (action == BLOCK_ERR_IGNORE)
225
        return 0;
226

    
227
    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
228
            || action == BLOCK_ERR_STOP_ANY) {
229
        r->status |= SCSI_REQ_STATUS_RETRY;
230
        vm_stop(0);
231
    } else {
232
        scsi_command_complete(r, STATUS_CHECK_CONDITION,
233
                SENSE_HARDWARE_ERROR);
234
    }
235

    
236
    return 1;
237
}
238

    
239
static void scsi_write_complete(void * opaque, int ret)
240
{
241
    SCSIRequest *r = (SCSIRequest *)opaque;
242
    SCSIDeviceState *s = r->dev;
243
    uint32_t len;
244
    uint32_t n;
245

    
246
    r->aiocb = NULL;
247

    
248
    if (ret) {
249
        if (scsi_handle_write_error(r, -ret))
250
            return;
251
    }
252

    
253
    n = r->buf_len / 512;
254
    r->sector += n;
255
    r->sector_count -= n;
256
    if (r->sector_count == 0) {
257
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
258
    } else {
259
        len = r->sector_count * 512;
260
        if (len > SCSI_DMA_BUF_SIZE) {
261
            len = SCSI_DMA_BUF_SIZE;
262
        }
263
        r->buf_len = len;
264
        DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
265
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
266
    }
267
}
268

    
269
static void scsi_write_request(SCSIRequest *r)
270
{
271
    SCSIDeviceState *s = r->dev;
272
    uint32_t n;
273

    
274
    n = r->buf_len / 512;
275
    if (n) {
276
        r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,
277
                                  scsi_write_complete, r);
278
        if (r->aiocb == NULL)
279
            scsi_command_complete(r, STATUS_CHECK_CONDITION,
280
                                  SENSE_HARDWARE_ERROR);
281
    } else {
282
        /* Invoke completion routine to fetch data from host.  */
283
        scsi_write_complete(r, 0);
284
    }
285
}
286

    
287
/* Write data to a scsi device.  Returns nonzero on failure.
288
   The transfer may complete asynchronously.  */
289
static int scsi_write_data(SCSIDevice *d, uint32_t tag)
290
{
291
    SCSIDeviceState *s = d->state;
292
    SCSIRequest *r;
293

    
294
    DPRINTF("Write data tag=0x%x\n", tag);
295
    r = scsi_find_request(s, tag);
296
    if (!r) {
297
        BADF("Bad write tag 0x%x\n", tag);
298
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
299
        return 1;
300
    }
301

    
302
    if (r->aiocb)
303
        BADF("Data transfer already in progress\n");
304

    
305
    scsi_write_request(r);
306

    
307
    return 0;
308
}
309

    
310
static void scsi_dma_restart_cb(void *opaque, int running, int reason)
311
{
312
    SCSIDeviceState *s = opaque;
313
    SCSIRequest *r = s->requests;
314
    if (!running)
315
        return;
316

    
317
    while (r) {
318
        if (r->status & SCSI_REQ_STATUS_RETRY) {
319
            r->status &= ~SCSI_REQ_STATUS_RETRY;
320
            scsi_write_request(r); 
321
        }
322
        r = r->next;
323
    }
324
}
325

    
326
/* Return a pointer to the data buffer.  */
327
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
328
{
329
    SCSIDeviceState *s = d->state;
330
    SCSIRequest *r;
331

    
332
    r = scsi_find_request(s, tag);
333
    if (!r) {
334
        BADF("Bad buffer tag 0x%x\n", tag);
335
        return NULL;
336
    }
337
    return r->dma_buf;
338
}
339

    
340
/* Execute a scsi command.  Returns the length of the data expected by the
341
   command.  This will be Positive for data transfers from the device
342
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
343
   and zero if the command does not transfer any data.  */
344

    
345
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
346
                                 uint8_t *buf, int lun)
347
{
348
    SCSIDeviceState *s = d->state;
349
    uint64_t nb_sectors;
350
    uint64_t lba;
351
    uint32_t len;
352
    int cmdlen;
353
    int is_write;
354
    uint8_t command;
355
    uint8_t *outbuf;
356
    SCSIRequest *r;
357

    
358
    command = buf[0];
359
    r = scsi_find_request(s, tag);
360
    if (r) {
361
        BADF("Tag 0x%x already in use\n", tag);
362
        scsi_cancel_io(d, tag);
363
    }
364
    /* ??? Tags are not unique for different luns.  We only implement a
365
       single lun, so this should not matter.  */
366
    r = scsi_new_request(s, tag);
367
    outbuf = r->dma_buf;
368
    is_write = 0;
369
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
370
    switch (command >> 5) {
371
    case 0:
372
        lba = (uint64_t) buf[3] | ((uint64_t) buf[2] << 8) |
373
              (((uint64_t) buf[1] & 0x1f) << 16);
374
        len = buf[4];
375
        cmdlen = 6;
376
        break;
377
    case 1:
378
    case 2:
379
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
380
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
381
        len = buf[8] | (buf[7] << 8);
382
        cmdlen = 10;
383
        break;
384
    case 4:
385
        lba = (uint64_t) buf[9] | ((uint64_t) buf[8] << 8) |
386
              ((uint64_t) buf[7] << 16) | ((uint64_t) buf[6] << 24) |
387
              ((uint64_t) buf[5] << 32) | ((uint64_t) buf[4] << 40) |
388
              ((uint64_t) buf[3] << 48) | ((uint64_t) buf[2] << 56);
389
        len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
390
        cmdlen = 16;
391
        break;
392
    case 5:
393
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
394
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
395
        len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
396
        cmdlen = 12;
397
        break;
398
    default:
399
        BADF("Unsupported command length, command %x\n", command);
400
        goto fail;
401
    }
402
#ifdef DEBUG_SCSI
403
    {
404
        int i;
405
        for (i = 1; i < cmdlen; i++) {
406
            printf(" 0x%02x", buf[i]);
407
        }
408
        printf("\n");
409
    }
410
#endif
411
    if (lun || buf[1] >> 5) {
412
        /* Only LUN 0 supported.  */
413
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
414
        if (command != 0x03 && command != 0x12) /* REQUEST SENSE and INQUIRY */
415
            goto fail;
416
    }
417
    switch (command) {
418
    case 0x0:
419
        DPRINTF("Test Unit Ready\n");
420
        break;
421
    case 0x03:
422
        DPRINTF("Request Sense (len %d)\n", len);
423
        if (len < 4)
424
            goto fail;
425
        memset(outbuf, 0, 4);
426
        r->buf_len = 4;
427
        if (s->sense == SENSE_NOT_READY && len >= 18) {
428
            memset(outbuf, 0, 18);
429
            r->buf_len = 18;
430
            outbuf[7] = 10;
431
            /* asc 0x3a, ascq 0: Medium not present */
432
            outbuf[12] = 0x3a;
433
            outbuf[13] = 0;
434
        }
435
        outbuf[0] = 0xf0;
436
        outbuf[1] = 0;
437
        outbuf[2] = s->sense;
438
        break;
439
    case 0x12:
440
        DPRINTF("Inquiry (len %d)\n", len);
441
        if (buf[1] & 0x2) {
442
            /* Command support data - optional, not implemented */
443
            BADF("optional INQUIRY command support request not implemented\n");
444
            goto fail;
445
        }
446
        else if (buf[1] & 0x1) {
447
            /* Vital product data */
448
            uint8_t page_code = buf[2];
449
            if (len < 4) {
450
                BADF("Error: Inquiry (EVPD[%02X]) buffer size %d is "
451
                     "less than 4\n", page_code, len);
452
                goto fail;
453
            }
454

    
455
            switch (page_code) {
456
                case 0x00:
457
                    {
458
                        /* Supported page codes, mandatory */
459
                        DPRINTF("Inquiry EVPD[Supported pages] "
460
                                "buffer size %d\n", len);
461

    
462
                        r->buf_len = 0;
463

    
464
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
465
                            outbuf[r->buf_len++] = 5;
466
                        } else {
467
                            outbuf[r->buf_len++] = 0;
468
                        }
469

    
470
                        outbuf[r->buf_len++] = 0x00; // this page
471
                        outbuf[r->buf_len++] = 0x00;
472
                        outbuf[r->buf_len++] = 3;    // number of pages
473
                        outbuf[r->buf_len++] = 0x00; // list of supported pages (this page)
474
                        outbuf[r->buf_len++] = 0x80; // unit serial number
475
                        outbuf[r->buf_len++] = 0x83; // device identification
476
                    }
477
                    break;
478
                case 0x80:
479
                    {
480
                        int l;
481

    
482
                        /* Device serial number, optional */
483
                        if (len < 4) {
484
                            BADF("Error: EVPD[Serial number] Inquiry buffer "
485
                                 "size %d too small, %d needed\n", len, 4);
486
                            goto fail;
487
                        }
488

    
489
                        DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len);
490
                        l = MIN(len, strlen(s->drive_serial_str));
491

    
492
                        r->buf_len = 0;
493

    
494
                        /* Supported page codes */
495
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
496
                            outbuf[r->buf_len++] = 5;
497
                        } else {
498
                            outbuf[r->buf_len++] = 0;
499
                        }
500

    
501
                        outbuf[r->buf_len++] = 0x80; // this page
502
                        outbuf[r->buf_len++] = 0x00;
503
                        outbuf[r->buf_len++] = l;
504
                        memcpy(&outbuf[r->buf_len], s->drive_serial_str, l);
505
                        r->buf_len += l;
506
                    }
507

    
508
                    break;
509
                case 0x83:
510
                    {
511
                        /* Device identification page, mandatory */
512
                        int max_len = 255 - 8;
513
                        int id_len = strlen(bdrv_get_device_name(s->bdrv));
514
                        if (id_len > max_len)
515
                            id_len = max_len;
516

    
517
                        DPRINTF("Inquiry EVPD[Device identification] "
518
                                "buffer size %d\n", len);
519
                        r->buf_len = 0;
520
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
521
                            outbuf[r->buf_len++] = 5;
522
                        } else {
523
                            outbuf[r->buf_len++] = 0;
524
                        }
525

    
526
                        outbuf[r->buf_len++] = 0x83; // this page
527
                        outbuf[r->buf_len++] = 0x00;
528
                        outbuf[r->buf_len++] = 3 + id_len;
529

    
530
                        outbuf[r->buf_len++] = 0x2; // ASCII
531
                        outbuf[r->buf_len++] = 0;   // not officially assigned
532
                        outbuf[r->buf_len++] = 0;   // reserved
533
                        outbuf[r->buf_len++] = id_len; // length of data following
534

    
535
                        memcpy(&outbuf[r->buf_len],
536
                               bdrv_get_device_name(s->bdrv), id_len);
537
                        r->buf_len += id_len;
538
                    }
539
                    break;
540
                default:
541
                    BADF("Error: unsupported Inquiry (EVPD[%02X]) "
542
                         "buffer size %d\n", page_code, len);
543
                    goto fail;
544
            }
545
            /* done with EVPD */
546
            break;
547
        }
548
        else {
549
            /* Standard INQUIRY data */
550
            if (buf[2] != 0) {
551
                BADF("Error: Inquiry (STANDARD) page or code "
552
                     "is non-zero [%02X]\n", buf[2]);
553
                goto fail;
554
            }
555

    
556
            /* PAGE CODE == 0 */
557
            if (len < 5) {
558
                BADF("Error: Inquiry (STANDARD) buffer size %d "
559
                     "is less than 5\n", len);
560
                goto fail;
561
            }
562

    
563
            if (len < 36) {
564
                BADF("Error: Inquiry (STANDARD) buffer size %d "
565
                     "is less than 36 (TODO: only 5 required)\n", len);
566
            }
567
        }
568

    
569
        if(len > SCSI_MAX_INQUIRY_LEN)
570
            len = SCSI_MAX_INQUIRY_LEN;
571

    
572
        memset(outbuf, 0, len);
573

    
574
        if (lun || buf[1] >> 5) {
575
            outbuf[0] = 0x7f;        /* LUN not supported */
576
        } else if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
577
            outbuf[0] = 5;
578
            outbuf[1] = 0x80;
579
            memcpy(&outbuf[16], "QEMU CD-ROM    ", 16);
580
        } else {
581
            outbuf[0] = 0;
582
            memcpy(&outbuf[16], "QEMU HARDDISK  ", 16);
583
        }
584
        memcpy(&outbuf[8], "QEMU   ", 8);
585
        memcpy(&outbuf[32], QEMU_VERSION, 4);
586
        /* Identify device as SCSI-3 rev 1.
587
           Some later commands are also implemented. */
588
        outbuf[2] = 3;
589
        outbuf[3] = 2; /* Format 2 */
590
        outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */
591
        /* Sync data transfer and TCQ.  */
592
        outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
593
        r->buf_len = len;
594
        break;
595
    case 0x16:
596
        DPRINTF("Reserve(6)\n");
597
        if (buf[1] & 1)
598
            goto fail;
599
        break;
600
    case 0x17:
601
        DPRINTF("Release(6)\n");
602
        if (buf[1] & 1)
603
            goto fail;
604
        break;
605
    case 0x1a:
606
    case 0x5a:
607
        {
608
            uint8_t *p;
609
            int page;
610

    
611
            page = buf[2] & 0x3f;
612
            DPRINTF("Mode Sense (page %d, len %d)\n", page, len);
613
            p = outbuf;
614
            memset(p, 0, 4);
615
            outbuf[1] = 0; /* Default media type.  */
616
            outbuf[3] = 0; /* Block descriptor length.  */
617
            if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
618
                outbuf[2] = 0x80; /* Readonly.  */
619
            }
620
            p += 4;
621
            if (page == 4) {
622
                int cylinders, heads, secs;
623

    
624
                /* Rigid disk device geometry page. */
625
                p[0] = 4;
626
                p[1] = 0x16;
627
                /* if a geometry hint is available, use it */
628
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
629
                p[2] = (cylinders >> 16) & 0xff;
630
                p[3] = (cylinders >> 8) & 0xff;
631
                p[4] = cylinders & 0xff;
632
                p[5] = heads & 0xff;
633
                /* Write precomp start cylinder, disabled */
634
                p[6] = (cylinders >> 16) & 0xff;
635
                p[7] = (cylinders >> 8) & 0xff;
636
                p[8] = cylinders & 0xff;
637
                /* Reduced current start cylinder, disabled */
638
                p[9] = (cylinders >> 16) & 0xff;
639
                p[10] = (cylinders >> 8) & 0xff;
640
                p[11] = cylinders & 0xff;
641
                /* Device step rate [ns], 200ns */
642
                p[12] = 0;
643
                p[13] = 200;
644
                /* Landing zone cylinder */
645
                p[14] = 0xff;
646
                p[15] =  0xff;
647
                p[16] = 0xff;
648
                /* Medium rotation rate [rpm], 5400 rpm */
649
                p[20] = (5400 >> 8) & 0xff;
650
                p[21] = 5400 & 0xff;
651
                p += 0x16;
652
            } else if (page == 5) {
653
                int cylinders, heads, secs;
654

    
655
                /* Flexible disk device geometry page. */
656
                p[0] = 5;
657
                p[1] = 0x1e;
658
                /* Transfer rate [kbit/s], 5Mbit/s */
659
                p[2] = 5000 >> 8;
660
                p[3] = 5000 & 0xff;
661
                /* if a geometry hint is available, use it */
662
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
663
                p[4] = heads & 0xff;
664
                p[5] = secs & 0xff;
665
                p[6] = s->cluster_size * 2;
666
                p[8] = (cylinders >> 8) & 0xff;
667
                p[9] = cylinders & 0xff;
668
                /* Write precomp start cylinder, disabled */
669
                p[10] = (cylinders >> 8) & 0xff;
670
                p[11] = cylinders & 0xff;
671
                /* Reduced current start cylinder, disabled */
672
                p[12] = (cylinders >> 8) & 0xff;
673
                p[13] = cylinders & 0xff;
674
                /* Device step rate [100us], 100us */
675
                p[14] = 0;
676
                p[15] = 1;
677
                /* Device step pulse width [us], 1us */
678
                p[16] = 1;
679
                /* Device head settle delay [100us], 100us */
680
                p[17] = 0;
681
                p[18] = 1;
682
                /* Motor on delay [0.1s], 0.1s */
683
                p[19] = 1;
684
                /* Motor off delay [0.1s], 0.1s */
685
                p[20] = 1;
686
                /* Medium rotation rate [rpm], 5400 rpm */
687
                p[28] = (5400 >> 8) & 0xff;
688
                p[29] = 5400 & 0xff;
689
                p += 0x1e;
690
            } else if ((page == 8 || page == 0x3f)) {
691
                /* Caching page.  */
692
                memset(p,0,20);
693
                p[0] = 8;
694
                p[1] = 0x12;
695
                p[2] = 4; /* WCE */
696
                p += 20;
697
            }
698
            if ((page == 0x3f || page == 0x2a)
699
                    && (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM)) {
700
                /* CD Capabilities and Mechanical Status page. */
701
                p[0] = 0x2a;
702
                p[1] = 0x14;
703
                p[2] = 3; // CD-R & CD-RW read
704
                p[3] = 0; // Writing not supported
705
                p[4] = 0x7f; /* Audio, composite, digital out,
706
                                         mode 2 form 1&2, multi session */
707
                p[5] = 0xff; /* CD DA, DA accurate, RW supported,
708
                                         RW corrected, C2 errors, ISRC,
709
                                         UPC, Bar code */
710
                p[6] = 0x2d | (bdrv_is_locked(s->bdrv)? 2 : 0);
711
                /* Locking supported, jumper present, eject, tray */
712
                p[7] = 0; /* no volume & mute control, no
713
                                      changer */
714
                p[8] = (50 * 176) >> 8; // 50x read speed
715
                p[9] = (50 * 176) & 0xff;
716
                p[10] = 0 >> 8; // No volume
717
                p[11] = 0 & 0xff;
718
                p[12] = 2048 >> 8; // 2M buffer
719
                p[13] = 2048 & 0xff;
720
                p[14] = (16 * 176) >> 8; // 16x read speed current
721
                p[15] = (16 * 176) & 0xff;
722
                p[18] = (16 * 176) >> 8; // 16x write speed
723
                p[19] = (16 * 176) & 0xff;
724
                p[20] = (16 * 176) >> 8; // 16x write speed current
725
                p[21] = (16 * 176) & 0xff;
726
                p += 22;
727
            }
728
            r->buf_len = p - outbuf;
729
            outbuf[0] = r->buf_len - 4;
730
            if (r->buf_len > len)
731
                r->buf_len = len;
732
        }
733
        break;
734
    case 0x1b:
735
        DPRINTF("Start Stop Unit\n");
736
        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM &&
737
            (buf[4] & 2))
738
            /* load/eject medium */
739
            bdrv_eject(s->bdrv, !(buf[4] & 1));
740
        break;
741
    case 0x1e:
742
        DPRINTF("Prevent Allow Medium Removal (prevent = %d)\n", buf[4] & 3);
743
        bdrv_set_locked(s->bdrv, buf[4] & 1);
744
        break;
745
    case 0x25:
746
        DPRINTF("Read Capacity\n");
747
        /* The normal LEN field for this command is zero.  */
748
        memset(outbuf, 0, 8);
749
        bdrv_get_geometry(s->bdrv, &nb_sectors);
750
        nb_sectors /= s->cluster_size;
751
        /* Returned value is the address of the last sector.  */
752
        if (nb_sectors) {
753
            nb_sectors--;
754
            /* Remember the new size for read/write sanity checking. */
755
            s->max_lba = nb_sectors;
756
            /* Clip to 2TB, instead of returning capacity modulo 2TB. */
757
            if (nb_sectors > UINT32_MAX)
758
                nb_sectors = UINT32_MAX;
759
            outbuf[0] = (nb_sectors >> 24) & 0xff;
760
            outbuf[1] = (nb_sectors >> 16) & 0xff;
761
            outbuf[2] = (nb_sectors >> 8) & 0xff;
762
            outbuf[3] = nb_sectors & 0xff;
763
            outbuf[4] = 0;
764
            outbuf[5] = 0;
765
            outbuf[6] = s->cluster_size * 2;
766
            outbuf[7] = 0;
767
            r->buf_len = 8;
768
        } else {
769
            scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
770
            return 0;
771
        }
772
        break;
773
    case 0x08:
774
    case 0x28:
775
    case 0x88:
776
        DPRINTF("Read (sector %lld, count %d)\n", lba, len);
777
        if (lba > s->max_lba)
778
            goto illegal_lba;
779
        r->sector = lba * s->cluster_size;
780
        r->sector_count = len * s->cluster_size;
781
        break;
782
    case 0x0a:
783
    case 0x2a:
784
    case 0x8a:
785
        DPRINTF("Write (sector %lld, count %d)\n", lba, len);
786
        if (lba > s->max_lba)
787
            goto illegal_lba;
788
        r->sector = lba * s->cluster_size;
789
        r->sector_count = len * s->cluster_size;
790
        is_write = 1;
791
        break;
792
    case 0x35:
793
        DPRINTF("Synchronise cache (sector %d, count %d)\n", lba, len);
794
        bdrv_flush(s->bdrv);
795
        break;
796
    case 0x43:
797
        {
798
            int start_track, format, msf, toclen;
799

    
800
            msf = buf[1] & 2;
801
            format = buf[2] & 0xf;
802
            start_track = buf[6];
803
            bdrv_get_geometry(s->bdrv, &nb_sectors);
804
            DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
805
            nb_sectors /= s->cluster_size;
806
            switch(format) {
807
            case 0:
808
                toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
809
                break;
810
            case 1:
811
                /* multi session : only a single session defined */
812
                toclen = 12;
813
                memset(outbuf, 0, 12);
814
                outbuf[1] = 0x0a;
815
                outbuf[2] = 0x01;
816
                outbuf[3] = 0x01;
817
                break;
818
            case 2:
819
                toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
820
                break;
821
            default:
822
                goto error_cmd;
823
            }
824
            if (toclen > 0) {
825
                if (len > toclen)
826
                  len = toclen;
827
                r->buf_len = len;
828
                break;
829
            }
830
        error_cmd:
831
            DPRINTF("Read TOC error\n");
832
            goto fail;
833
        }
834
    case 0x46:
835
        DPRINTF("Get Configuration (rt %d, maxlen %d)\n", buf[1] & 3, len);
836
        memset(outbuf, 0, 8);
837
        /* ??? This should probably return much more information.  For now
838
           just return the basic header indicating the CD-ROM profile.  */
839
        outbuf[7] = 8; // CD-ROM
840
        r->buf_len = 8;
841
        break;
842
    case 0x56:
843
        DPRINTF("Reserve(10)\n");
844
        if (buf[1] & 3)
845
            goto fail;
846
        break;
847
    case 0x57:
848
        DPRINTF("Release(10)\n");
849
        if (buf[1] & 3)
850
            goto fail;
851
        break;
852
    case 0x9e:
853
        /* Service Action In subcommands. */
854
        if ((buf[1] & 31) == 0x10) {
855
            DPRINTF("SAI READ CAPACITY(16)\n");
856
            memset(outbuf, 0, len);
857
            bdrv_get_geometry(s->bdrv, &nb_sectors);
858
            nb_sectors /= s->cluster_size;
859
            /* Returned value is the address of the last sector.  */
860
            if (nb_sectors) {
861
                nb_sectors--;
862
                /* Remember the new size for read/write sanity checking. */
863
                s->max_lba = nb_sectors;
864
                outbuf[0] = (nb_sectors >> 56) & 0xff;
865
                outbuf[1] = (nb_sectors >> 48) & 0xff;
866
                outbuf[2] = (nb_sectors >> 40) & 0xff;
867
                outbuf[3] = (nb_sectors >> 32) & 0xff;
868
                outbuf[4] = (nb_sectors >> 24) & 0xff;
869
                outbuf[5] = (nb_sectors >> 16) & 0xff;
870
                outbuf[6] = (nb_sectors >> 8) & 0xff;
871
                outbuf[7] = nb_sectors & 0xff;
872
                outbuf[8] = 0;
873
                outbuf[9] = 0;
874
                outbuf[10] = s->cluster_size * 2;
875
                outbuf[11] = 0;
876
                /* Protection, exponent and lowest lba field left blank. */
877
                r->buf_len = len;
878
            } else {
879
                scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
880
                return 0;
881
            }
882
            break;
883
        }
884
        DPRINTF("Unsupported Service Action In\n");
885
        goto fail;
886
    case 0xa0:
887
        DPRINTF("Report LUNs (len %d)\n", len);
888
        if (len < 16)
889
            goto fail;
890
        memset(outbuf, 0, 16);
891
        outbuf[3] = 8;
892
        r->buf_len = 16;
893
        break;
894
    case 0x2f:
895
        DPRINTF("Verify (sector %d, count %d)\n", lba, len);
896
        break;
897
    default:
898
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
899
    fail:
900
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_ILLEGAL_REQUEST);
901
        return 0;
902
    illegal_lba:
903
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
904
        return 0;
905
    }
906
    if (r->sector_count == 0 && r->buf_len == 0) {
907
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
908
    }
909
    len = r->sector_count * 512 + r->buf_len;
910
    if (is_write) {
911
        return -len;
912
    } else {
913
        if (!r->sector_count)
914
            r->sector_count = -1;
915
        return len;
916
    }
917
}
918

    
919
static void scsi_destroy(SCSIDevice *d)
920
{
921
    qemu_free(d->state);
922
    qemu_free(d);
923
}
924

    
925
SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq,
926
                           scsi_completionfn completion, void *opaque)
927
{
928
    SCSIDevice *d;
929
    SCSIDeviceState *s;
930
    uint64_t nb_sectors;
931

    
932
    s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
933
    s->bdrv = bdrv;
934
    s->tcq = tcq;
935
    s->completion = completion;
936
    s->opaque = opaque;
937
    if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
938
        s->cluster_size = 4;
939
    } else {
940
        s->cluster_size = 1;
941
    }
942
    bdrv_get_geometry(s->bdrv, &nb_sectors);
943
    nb_sectors /= s->cluster_size;
944
    if (nb_sectors)
945
        nb_sectors--;
946
    s->max_lba = nb_sectors;
947
    strncpy(s->drive_serial_str, drive_get_serial(s->bdrv),
948
            sizeof(s->drive_serial_str));
949
    if (strlen(s->drive_serial_str) == 0)
950
        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), "0");
951
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
952
    d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
953
    d->state = s;
954
    d->destroy = scsi_destroy;
955
    d->send_command = scsi_send_command;
956
    d->read_data = scsi_read_data;
957
    d->write_data = scsi_write_data;
958
    d->cancel_io = scsi_cancel_io;
959
    d->get_buf = scsi_get_buf;
960

    
961
    return d;
962
}