misc scsi disk/cdrom fixes/improvements 3/4
[qemu] / hw / scsi-disk.c
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 }