Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ 563e3c6e

History | View | Annotate | Download (25.2 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
//#define DEBUG_SCSI
17

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

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

    
28
#include "qemu-common.h"
29
#include "block.h"
30
#include "scsi-disk.h"
31

    
32
#define SENSE_NO_SENSE        0
33
#define SENSE_NOT_READY       2
34
#define SENSE_HARDWARE_ERROR  4
35
#define SENSE_ILLEGAL_REQUEST 5
36

    
37
#define SCSI_DMA_BUF_SIZE    65536
38

    
39
typedef struct SCSIRequest {
40
    SCSIDeviceState *dev;
41
    uint32_t tag;
42
    /* ??? We should probably keep track of whether the data trasfer is
43
       a read or a write.  Currently we rely on the host getting it right.  */
44
    /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
45
    int sector;
46
    int sector_count;
47
    /* The amounnt of data in the buffer.  */
48
    int buf_len;
49
    uint8_t *dma_buf;
50
    BlockDriverAIOCB *aiocb;
51
    struct SCSIRequest *next;
52
} SCSIRequest;
53

    
54
struct SCSIDeviceState
55
{
56
    BlockDriverState *bdrv;
57
    SCSIRequest *requests;
58
    /* The qemu block layer uses a fixed 512 byte sector size.
59
       This is the number of 512 byte blocks in a single scsi sector.  */
60
    int cluster_size;
61
    int sense;
62
    int tcq;
63
    /* Completion functions may be called from either scsi_{read,write}_data
64
       or from the AIO completion routines.  */
65
    scsi_completionfn completion;
66
    void *opaque;
67
};
68

    
69
/* Global pool of SCSIRequest structures.  */
70
static SCSIRequest *free_requests = NULL;
71

    
72
static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
73
{
74
    SCSIRequest *r;
75

    
76
    if (free_requests) {
77
        r = free_requests;
78
        free_requests = r->next;
79
    } else {
80
        r = qemu_malloc(sizeof(SCSIRequest));
81
        r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
82
    }
83
    r->dev = s;
84
    r->tag = tag;
85
    r->sector_count = 0;
86
    r->buf_len = 0;
87
    r->aiocb = NULL;
88

    
89
    r->next = s->requests;
90
    s->requests = r;
91
    return r;
92
}
93

    
94
static void scsi_remove_request(SCSIRequest *r)
95
{
96
    SCSIRequest *last;
97
    SCSIDeviceState *s = r->dev;
98

    
99
    if (s->requests == r) {
100
        s->requests = r->next;
101
    } else {
102
        last = s->requests;
103
        while (last && last->next != r)
104
            last = last->next;
105
        if (last) {
106
            last->next = r->next;
107
        } else {
108
            BADF("Orphaned request\n");
109
        }
110
    }
111
    r->next = free_requests;
112
    free_requests = r;
113
}
114

    
115
static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
116
{
117
    SCSIRequest *r;
118

    
119
    r = s->requests;
120
    while (r && r->tag != tag)
121
        r = r->next;
122

    
123
    return r;
124
}
125

    
126
/* Helper function for command completion.  */
127
static void scsi_command_complete(SCSIRequest *r, int sense)
128
{
129
    SCSIDeviceState *s = r->dev;
130
    uint32_t tag;
131
    DPRINTF("Command complete tag=0x%x sense=%d\n", r->tag, sense);
132
    s->sense = sense;
133
    tag = r->tag;
134
    scsi_remove_request(r);
135
    s->completion(s->opaque, SCSI_REASON_DONE, tag, sense);
136
}
137

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

    
153
static void scsi_read_complete(void * opaque, int ret)
154
{
155
    SCSIRequest *r = (SCSIRequest *)opaque;
156
    SCSIDeviceState *s = r->dev;
157

    
158
    if (ret) {
159
        DPRINTF("IO error\n");
160
        scsi_command_complete(r, SENSE_HARDWARE_ERROR);
161
        return;
162
    }
163
    DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len);
164

    
165
    s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
166
}
167

    
168
/* Read more data from scsi device into buffer.  */
169
static void scsi_read_data(SCSIDevice *d, uint32_t tag)
170
{
171
    SCSIDeviceState *s = d->state;
172
    SCSIRequest *r;
173
    uint32_t n;
174

    
175
    r = scsi_find_request(s, tag);
176
    if (!r) {
177
        BADF("Bad read tag 0x%x\n", tag);
178
        /* ??? This is the wrong error.  */
179
        scsi_command_complete(r, SENSE_HARDWARE_ERROR);
180
        return;
181
    }
182
    if (r->sector_count == (uint32_t)-1) {
183
        DPRINTF("Read buf_len=%d\n", r->buf_len);
184
        r->sector_count = 0;
185
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
186
        return;
187
    }
188
    DPRINTF("Read sector_count=%d\n", r->sector_count);
189
    if (r->sector_count == 0) {
190
        scsi_command_complete(r, SENSE_NO_SENSE);
191
        return;
192
    }
193

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

    
198
    r->buf_len = n * 512;
199
    r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,
200
                             scsi_read_complete, r);
201
    if (r->aiocb == NULL)
202
        scsi_command_complete(r, SENSE_HARDWARE_ERROR);
203
    r->sector += n;
204
    r->sector_count -= n;
205
}
206

    
207
static void scsi_write_complete(void * opaque, int ret)
208
{
209
    SCSIRequest *r = (SCSIRequest *)opaque;
210
    SCSIDeviceState *s = r->dev;
211
    uint32_t len;
212

    
213
    if (ret) {
214
        fprintf(stderr, "scsi-disc: IO write error\n");
215
        exit(1);
216
    }
217

    
218
    r->aiocb = NULL;
219
    if (r->sector_count == 0) {
220
        scsi_command_complete(r, SENSE_NO_SENSE);
221
    } else {
222
        len = r->sector_count * 512;
223
        if (len > SCSI_DMA_BUF_SIZE) {
224
            len = SCSI_DMA_BUF_SIZE;
225
        }
226
        r->buf_len = len;
227
        DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
228
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
229
    }
230
}
231

    
232
/* Write data to a scsi device.  Returns nonzero on failure.
233
   The transfer may complete asynchronously.  */
234
static int scsi_write_data(SCSIDevice *d, uint32_t tag)
235
{
236
    SCSIDeviceState *s = d->state;
237
    SCSIRequest *r;
238
    uint32_t n;
239

    
240
    DPRINTF("Write data tag=0x%x\n", tag);
241
    r = scsi_find_request(s, tag);
242
    if (!r) {
243
        BADF("Bad write tag 0x%x\n", tag);
244
        scsi_command_complete(r, SENSE_HARDWARE_ERROR);
245
        return 1;
246
    }
247
    if (r->aiocb)
248
        BADF("Data transfer already in progress\n");
249
    n = r->buf_len / 512;
250
    if (n) {
251
        r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,
252
                                  scsi_write_complete, r);
253
        if (r->aiocb == NULL)
254
            scsi_command_complete(r, SENSE_HARDWARE_ERROR);
255
        r->sector += n;
256
        r->sector_count -= n;
257
    } else {
258
        /* Invoke completion routine to fetch data from host.  */
259
        scsi_write_complete(r, 0);
260
    }
261

    
262
    return 0;
263
}
264

    
265
/* Return a pointer to the data buffer.  */
266
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
267
{
268
    SCSIDeviceState *s = d->state;
269
    SCSIRequest *r;
270

    
271
    r = scsi_find_request(s, tag);
272
    if (!r) {
273
        BADF("Bad buffer tag 0x%x\n", tag);
274
        return NULL;
275
    }
276
    return r->dma_buf;
277
}
278

    
279
/* Execute a scsi command.  Returns the length of the data expected by the
280
   command.  This will be Positive for data transfers from the device
281
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
282
   and zero if the command does not transfer any data.  */
283

    
284
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
285
                                 uint8_t *buf, int lun)
286
{
287
    SCSIDeviceState *s = d->state;
288
    uint64_t nb_sectors;
289
    uint32_t lba;
290
    uint32_t len;
291
    int cmdlen;
292
    int is_write;
293
    uint8_t command;
294
    uint8_t *outbuf;
295
    SCSIRequest *r;
296

    
297
    command = buf[0];
298
    r = scsi_find_request(s, tag);
299
    if (r) {
300
        BADF("Tag 0x%x already in use\n", tag);
301
        scsi_cancel_io(d, tag);
302
    }
303
    /* ??? Tags are not unique for different luns.  We only implement a
304
       single lun, so this should not matter.  */
305
    r = scsi_new_request(s, tag);
306
    outbuf = r->dma_buf;
307
    is_write = 0;
308
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
309
    switch (command >> 5) {
310
    case 0:
311
        lba = buf[3] | (buf[2] << 8) | ((buf[1] & 0x1f) << 16);
312
        len = buf[4];
313
        cmdlen = 6;
314
        break;
315
    case 1:
316
    case 2:
317
        lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
318
        len = buf[8] | (buf[7] << 8);
319
        cmdlen = 10;
320
        break;
321
    case 4:
322
        lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
323
        len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
324
        cmdlen = 16;
325
        break;
326
    case 5:
327
        lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
328
        len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
329
        cmdlen = 12;
330
        break;
331
    default:
332
        BADF("Unsupported command length, command %x\n", command);
333
        goto fail;
334
    }
335
#ifdef DEBUG_SCSI
336
    {
337
        int i;
338
        for (i = 1; i < cmdlen; i++) {
339
            printf(" 0x%02x", buf[i]);
340
        }
341
        printf("\n");
342
    }
343
#endif
344
    if (lun || buf[1] >> 5) {
345
        /* Only LUN 0 supported.  */
346
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
347
        goto fail;
348
    }
349
    switch (command) {
350
    case 0x0:
351
        DPRINTF("Test Unit Ready\n");
352
        break;
353
    case 0x03:
354
        DPRINTF("Request Sense (len %d)\n", len);
355
        if (len < 4)
356
            goto fail;
357
        memset(outbuf, 0, 4);
358
        outbuf[0] = 0xf0;
359
        outbuf[1] = 0;
360
        outbuf[2] = s->sense;
361
        r->buf_len = 4;
362
        break;
363
    case 0x12:
364
        DPRINTF("Inquiry (len %d)\n", len);
365
        if (buf[1] & 0x2) {
366
            /* Command support data - optional, not implemented */
367
            BADF("optional INQUIRY command support request not implemented\n");
368
            goto fail;
369
        }
370
        else if (buf[1] & 0x1) {
371
            /* Vital product data */
372
            uint8_t page_code = buf[2];
373
            if (len < 4) {
374
                BADF("Error: Inquiry (EVPD[%02X]) buffer size %d is "
375
                     "less than 4\n", page_code, len);
376
                goto fail;
377
            }
378

    
379
            switch (page_code) {
380
                case 0x00:
381
                    {
382
                        /* Supported page codes, mandatory */
383
                        DPRINTF("Inquiry EVPD[Supported pages] "
384
                                "buffer size %d\n", len);
385

    
386
                        r->buf_len = 0;
387

    
388
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
389
                            outbuf[r->buf_len++] = 5;
390
                        } else {
391
                            outbuf[r->buf_len++] = 0;
392
                        }
393

    
394
                        outbuf[r->buf_len++] = 0x00; // this page
395
                        outbuf[r->buf_len++] = 0x00;
396
                        outbuf[r->buf_len++] = 3;    // number of pages
397
                        outbuf[r->buf_len++] = 0x00; // list of supported pages (this page)
398
                        outbuf[r->buf_len++] = 0x80; // unit serial number
399
                        outbuf[r->buf_len++] = 0x83; // device identification
400
                    }
401
                    break;
402
                case 0x80:
403
                    {
404
                        /* Device serial number, optional */
405
                        if (len < 4) {
406
                            BADF("Error: EVPD[Serial number] Inquiry buffer "
407
                                 "size %d too small, %d needed\n", len, 4);
408
                            goto fail;
409
                        }
410

    
411
                        DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len);
412

    
413
                        r->buf_len = 0;
414

    
415
                        /* Supported page codes */
416
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
417
                            outbuf[r->buf_len++] = 5;
418
                        } else {
419
                            outbuf[r->buf_len++] = 0;
420
                        }
421

    
422
                        outbuf[r->buf_len++] = 0x80; // this page
423
                        outbuf[r->buf_len++] = 0x00;
424
                        outbuf[r->buf_len++] = 0x01; // 1 byte data follow
425

    
426
                        outbuf[r->buf_len++] = '0';  // 1 byte data follow 
427
                    }
428

    
429
                    break;
430
                case 0x83:
431
                    {
432
                        /* Device identification page, mandatory */
433
                        int max_len = 255 - 8;
434
                        int id_len = strlen(bdrv_get_device_name(s->bdrv));
435
                        if (id_len > max_len)
436
                            id_len = max_len;
437

    
438
                        DPRINTF("Inquiry EVPD[Device identification] "
439
                                "buffer size %d\n", len);
440
                        r->buf_len = 0;
441
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
442
                            outbuf[r->buf_len++] = 5;
443
                        } else {
444
                            outbuf[r->buf_len++] = 0;
445
                        }
446

    
447
                        outbuf[r->buf_len++] = 0x83; // this page
448
                        outbuf[r->buf_len++] = 0x00;
449
                        outbuf[r->buf_len++] = 3 + id_len;
450

    
451
                        outbuf[r->buf_len++] = 0x2; // ASCII
452
                        outbuf[r->buf_len++] = 0;   // not officially assigned
453
                        outbuf[r->buf_len++] = 0;   // reserved
454
                        outbuf[r->buf_len++] = id_len; // length of data following
455

    
456
                        memcpy(&outbuf[r->buf_len],
457
                               bdrv_get_device_name(s->bdrv), id_len);
458
                        r->buf_len += id_len;
459
                    }
460
                    break;
461
                default:
462
                    BADF("Error: unsupported Inquiry (EVPD[%02X]) "
463
                         "buffer size %d\n", page_code, len);
464
                    goto fail;
465
            }
466
            /* done with EVPD */
467
            break;
468
        }
469
        else {
470
            /* Standard INQUIRY data */
471
            if (buf[2] != 0) {
472
                BADF("Error: Inquiry (STANDARD) page or code "
473
                     "is non-zero [%02X]\n", buf[2]);
474
                goto fail;
475
            }
476

    
477
            /* PAGE CODE == 0 */
478
            if (len < 5) {
479
                BADF("Error: Inquiry (STANDARD) buffer size %d "
480
                     "is less than 5\n", len);
481
                goto fail;
482
            }
483

    
484
            if (len < 36) {
485
                BADF("Error: Inquiry (STANDARD) buffer size %d "
486
                     "is less than 36 (TODO: only 5 required)\n", len);
487
            }
488
        }
489
        memset(outbuf, 0, 36);
490
        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
491
            outbuf[0] = 5;
492
            outbuf[1] = 0x80;
493
            memcpy(&outbuf[16], "QEMU CD-ROM    ", 16);
494
        } else {
495
            outbuf[0] = 0;
496
            memcpy(&outbuf[16], "QEMU HARDDISK  ", 16);
497
        }
498
        memcpy(&outbuf[8], "QEMU   ", 8);
499
        memcpy(&outbuf[32], QEMU_VERSION, 4);
500
        /* Identify device as SCSI-3 rev 1.
501
           Some later commands are also implemented. */
502
        outbuf[2] = 3;
503
        outbuf[3] = 2; /* Format 2 */
504
        outbuf[4] = 31;
505
        /* Sync data transfer and TCQ.  */
506
        outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
507
        r->buf_len = 36;
508
        break;
509
    case 0x16:
510
        DPRINTF("Reserve(6)\n");
511
        if (buf[1] & 1)
512
            goto fail;
513
        break;
514
    case 0x17:
515
        DPRINTF("Release(6)\n");
516
        if (buf[1] & 1)
517
            goto fail;
518
        break;
519
    case 0x1a:
520
    case 0x5a:
521
        {
522
            uint8_t *p;
523
            int page;
524

    
525
            page = buf[2] & 0x3f;
526
            DPRINTF("Mode Sense (page %d, len %d)\n", page, len);
527
            p = outbuf;
528
            memset(p, 0, 4);
529
            outbuf[1] = 0; /* Default media type.  */
530
            outbuf[3] = 0; /* Block descriptor length.  */
531
            if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
532
                outbuf[2] = 0x80; /* Readonly.  */
533
            }
534
            p += 4;
535
            if (page == 4) {
536
                int cylinders, heads, secs;
537

    
538
                /* Rigid disk device geometry page. */
539
                p[0] = 4;
540
                p[1] = 0x16;
541
                /* if a geometry hint is available, use it */
542
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
543
                p[2] = (cylinders >> 16) & 0xff;
544
                p[3] = (cylinders >> 8) & 0xff;
545
                p[4] = cylinders & 0xff;
546
                p[5] = heads & 0xff;
547
                /* Write precomp start cylinder, disabled */
548
                p[6] = (cylinders >> 16) & 0xff;
549
                p[7] = (cylinders >> 8) & 0xff;
550
                p[8] = cylinders & 0xff;
551
                /* Reduced current start cylinder, disabled */
552
                p[9] = (cylinders >> 16) & 0xff;
553
                p[10] = (cylinders >> 8) & 0xff;
554
                p[11] = cylinders & 0xff;
555
                /* Device step rate [ns], 200ns */
556
                p[12] = 0;
557
                p[13] = 200;
558
                /* Landing zone cylinder */
559
                p[14] = 0xff;
560
                p[15] =  0xff;
561
                p[16] = 0xff;
562
                /* Medium rotation rate [rpm], 5400 rpm */
563
                p[20] = (5400 >> 8) & 0xff;
564
                p[21] = 5400 & 0xff;
565
                p += 0x16;
566
            } else if (page == 5) {
567
                int cylinders, heads, secs;
568

    
569
                /* Flexible disk device geometry page. */
570
                p[0] = 5;
571
                p[1] = 0x1e;
572
                /* Transfer rate [kbit/s], 5Mbit/s */
573
                p[2] = 5000 >> 8;
574
                p[3] = 5000 & 0xff;
575
                /* if a geometry hint is available, use it */
576
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
577
                p[4] = heads & 0xff;
578
                p[5] = secs & 0xff;
579
                p[6] = s->cluster_size * 2;
580
                p[8] = (cylinders >> 8) & 0xff;
581
                p[9] = cylinders & 0xff;
582
                /* Write precomp start cylinder, disabled */
583
                p[10] = (cylinders >> 8) & 0xff;
584
                p[11] = cylinders & 0xff;
585
                /* Reduced current start cylinder, disabled */
586
                p[12] = (cylinders >> 8) & 0xff;
587
                p[13] = cylinders & 0xff;
588
                /* Device step rate [100us], 100us */
589
                p[14] = 0;
590
                p[15] = 1;
591
                /* Device step pulse width [us], 1us */
592
                p[16] = 1;
593
                /* Device head settle delay [100us], 100us */
594
                p[17] = 0;
595
                p[18] = 1;
596
                /* Motor on delay [0.1s], 0.1s */
597
                p[19] = 1;
598
                /* Motor off delay [0.1s], 0.1s */
599
                p[20] = 1;
600
                /* Medium rotation rate [rpm], 5400 rpm */
601
                p[28] = (5400 >> 8) & 0xff;
602
                p[29] = 5400 & 0xff;
603
                p += 0x1e;
604
            } else if ((page == 8 || page == 0x3f)) {
605
                /* Caching page.  */
606
                memset(p,0,20);
607
                p[0] = 8;
608
                p[1] = 0x12;
609
                p[2] = 4; /* WCE */
610
                p += 20;
611
            }
612
            if ((page == 0x3f || page == 0x2a)
613
                    && (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM)) {
614
                /* CD Capabilities and Mechanical Status page. */
615
                p[0] = 0x2a;
616
                p[1] = 0x14;
617
                p[2] = 3; // CD-R & CD-RW read
618
                p[3] = 0; // Writing not supported
619
                p[4] = 0x7f; /* Audio, composite, digital out,
620
                                         mode 2 form 1&2, multi session */
621
                p[5] = 0xff; /* CD DA, DA accurate, RW supported,
622
                                         RW corrected, C2 errors, ISRC,
623
                                         UPC, Bar code */
624
                p[6] = 0x2d | (bdrv_is_locked(s->bdrv)? 2 : 0);
625
                /* Locking supported, jumper present, eject, tray */
626
                p[7] = 0; /* no volume & mute control, no
627
                                      changer */
628
                p[8] = (50 * 176) >> 8; // 50x read speed
629
                p[9] = (50 * 176) & 0xff;
630
                p[10] = 0 >> 8; // No volume
631
                p[11] = 0 & 0xff;
632
                p[12] = 2048 >> 8; // 2M buffer
633
                p[13] = 2048 & 0xff;
634
                p[14] = (16 * 176) >> 8; // 16x read speed current
635
                p[15] = (16 * 176) & 0xff;
636
                p[18] = (16 * 176) >> 8; // 16x write speed
637
                p[19] = (16 * 176) & 0xff;
638
                p[20] = (16 * 176) >> 8; // 16x write speed current
639
                p[21] = (16 * 176) & 0xff;
640
                p += 22;
641
            }
642
            r->buf_len = p - outbuf;
643
            outbuf[0] = r->buf_len - 4;
644
            if (r->buf_len > len)
645
                r->buf_len = len;
646
        }
647
        break;
648
    case 0x1b:
649
        DPRINTF("Start Stop Unit\n");
650
        break;
651
    case 0x1e:
652
        DPRINTF("Prevent Allow Medium Removal (prevent = %d)\n", buf[4] & 3);
653
        bdrv_set_locked(s->bdrv, buf[4] & 1);
654
        break;
655
    case 0x25:
656
        DPRINTF("Read Capacity\n");
657
        /* The normal LEN field for this command is zero.  */
658
        memset(outbuf, 0, 8);
659
        bdrv_get_geometry(s->bdrv, &nb_sectors);
660
        /* Returned value is the address of the last sector.  */
661
        if (nb_sectors) {
662
            nb_sectors--;
663
            outbuf[0] = (nb_sectors >> 24) & 0xff;
664
            outbuf[1] = (nb_sectors >> 16) & 0xff;
665
            outbuf[2] = (nb_sectors >> 8) & 0xff;
666
            outbuf[3] = nb_sectors & 0xff;
667
            outbuf[4] = 0;
668
            outbuf[5] = 0;
669
            outbuf[6] = s->cluster_size * 2;
670
            outbuf[7] = 0;
671
            r->buf_len = 8;
672
        } else {
673
            scsi_command_complete(r, SENSE_NOT_READY);
674
            return 0;
675
        }
676
        break;
677
    case 0x08:
678
    case 0x28:
679
        DPRINTF("Read (sector %d, count %d)\n", lba, len);
680
        r->sector = lba * s->cluster_size;
681
        r->sector_count = len * s->cluster_size;
682
        break;
683
    case 0x0a:
684
    case 0x2a:
685
        DPRINTF("Write (sector %d, count %d)\n", lba, len);
686
        r->sector = lba * s->cluster_size;
687
        r->sector_count = len * s->cluster_size;
688
        is_write = 1;
689
        break;
690
    case 0x35:
691
        DPRINTF("Synchronise cache (sector %d, count %d)\n", lba, len);
692
        bdrv_flush(s->bdrv);
693
        break;
694
    case 0x43:
695
        {
696
            int start_track, format, msf, toclen;
697

    
698
            msf = buf[1] & 2;
699
            format = buf[2] & 0xf;
700
            start_track = buf[6];
701
            bdrv_get_geometry(s->bdrv, &nb_sectors);
702
            DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
703
            switch(format) {
704
            case 0:
705
                toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
706
                break;
707
            case 1:
708
                /* multi session : only a single session defined */
709
                toclen = 12;
710
                memset(outbuf, 0, 12);
711
                outbuf[1] = 0x0a;
712
                outbuf[2] = 0x01;
713
                outbuf[3] = 0x01;
714
                break;
715
            case 2:
716
                toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
717
                break;
718
            default:
719
                goto error_cmd;
720
            }
721
            if (toclen > 0) {
722
                if (len > toclen)
723
                  len = toclen;
724
                r->buf_len = len;
725
                break;
726
            }
727
        error_cmd:
728
            DPRINTF("Read TOC error\n");
729
            goto fail;
730
        }
731
    case 0x46:
732
        DPRINTF("Get Configuration (rt %d, maxlen %d)\n", buf[1] & 3, len);
733
        memset(outbuf, 0, 8);
734
        /* ??? This should probably return much more information.  For now
735
           just return the basic header indicating the CD-ROM profile.  */
736
        outbuf[7] = 8; // CD-ROM
737
        r->buf_len = 8;
738
        break;
739
    case 0x56:
740
        DPRINTF("Reserve(10)\n");
741
        if (buf[1] & 3)
742
            goto fail;
743
        break;
744
    case 0x57:
745
        DPRINTF("Release(10)\n");
746
        if (buf[1] & 3)
747
            goto fail;
748
        break;
749
    case 0xa0:
750
        DPRINTF("Report LUNs (len %d)\n", len);
751
        if (len < 16)
752
            goto fail;
753
        memset(outbuf, 0, 16);
754
        outbuf[3] = 8;
755
        r->buf_len = 16;
756
        break;
757
    default:
758
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
759
    fail:
760
        scsi_command_complete(r, SENSE_ILLEGAL_REQUEST);
761
        return 0;
762
    }
763
    if (r->sector_count == 0 && r->buf_len == 0) {
764
        scsi_command_complete(r, SENSE_NO_SENSE);
765
    }
766
    len = r->sector_count * 512 + r->buf_len;
767
    if (is_write) {
768
        return -len;
769
    } else {
770
        if (!r->sector_count)
771
            r->sector_count = -1;
772
        return len;
773
    }
774
}
775

    
776
static void scsi_destroy(SCSIDevice *d)
777
{
778
    qemu_free(d->state);
779
    qemu_free(d);
780
}
781

    
782
SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq,
783
                           scsi_completionfn completion, void *opaque)
784
{
785
    SCSIDevice *d;
786
    SCSIDeviceState *s;
787

    
788
    s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
789
    s->bdrv = bdrv;
790
    s->tcq = tcq;
791
    s->completion = completion;
792
    s->opaque = opaque;
793
    if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
794
        s->cluster_size = 4;
795
    } else {
796
        s->cluster_size = 1;
797
    }
798

    
799
    d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
800
    d->state = s;
801
    d->destroy = scsi_destroy;
802
    d->send_command = scsi_send_command;
803
    d->read_data = scsi_read_data;
804
    d->write_data = scsi_write_data;
805
    d->cancel_io = scsi_cancel_io;
806
    d->get_buf = scsi_get_buf;
807

    
808
    return d;
809
}