Replace tabs by 8 spaces. No code change, by Herve Poussineau.
[qemu/dscho.git] / hw / scsi-disk.c
blob384c098a09f38d47ca2128f98197c0cdfdc48612
1 /*
2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
7 * Written by Paul Brook
9 * This code is licenced under the LGPL.
11 * Note that this file only handles the SCSI architecture model and device
12 * commands. Emultion of interface/link layer protocols is handled by
13 * the host adapter emulation.
16 //#define DEBUG_SCSI
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
25 #define BADF(fmt, args...) \
26 do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0)
28 #include "vl.h"
30 #define SENSE_NO_SENSE 0
31 #define SENSE_NOT_READY 2
32 #define SENSE_HARDWARE_ERROR 4
33 #define SENSE_ILLEGAL_REQUEST 5
35 #define SCSI_DMA_BUF_SIZE 65536
37 typedef struct SCSIRequest {
38 SCSIDevice *dev;
39 uint32_t tag;
40 /* ??? We should probably keep track of whether the data trasfer is
41 a read or a write. Currently we rely on the host getting it right. */
42 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
43 int sector;
44 int sector_count;
45 /* The amounnt of data in the buffer. */
46 int buf_len;
47 uint8_t dma_buf[SCSI_DMA_BUF_SIZE];
48 BlockDriverAIOCB *aiocb;
49 struct SCSIRequest *next;
50 } SCSIRequest;
52 struct SCSIDevice
54 BlockDriverState *bdrv;
55 SCSIRequest *requests;
56 /* The qemu block layer uses a fixed 512 byte sector size.
57 This is the number of 512 byte blocks in a single scsi sector. */
58 int cluster_size;
59 int sense;
60 int tcq;
61 /* Completion functions may be called from either scsi_{read,write}_data
62 or from the AIO completion routines. */
63 scsi_completionfn completion;
64 void *opaque;
67 /* Global pool of SCSIRequest structures. */
68 static SCSIRequest *free_requests = NULL;
70 static SCSIRequest *scsi_new_request(SCSIDevice *s, uint32_t tag)
72 SCSIRequest *r;
74 if (free_requests) {
75 r = free_requests;
76 free_requests = r->next;
77 } else {
78 r = qemu_malloc(sizeof(SCSIRequest));
80 r->dev = s;
81 r->tag = tag;
82 r->sector_count = 0;
83 r->buf_len = 0;
84 r->aiocb = NULL;
86 r->next = s->requests;
87 s->requests = r;
88 return r;
91 static void scsi_remove_request(SCSIRequest *r)
93 SCSIRequest *last;
94 SCSIDevice *s = r->dev;
96 if (s->requests == r) {
97 s->requests = r->next;
98 } else {
99 last = s->requests;
100 while (last && last->next != r)
101 last = last->next;
102 if (last) {
103 last->next = r->next;
104 } else {
105 BADF("Orphaned request\n");
108 r->next = free_requests;
109 free_requests = r;
112 static SCSIRequest *scsi_find_request(SCSIDevice *s, uint32_t tag)
114 SCSIRequest *r;
116 r = s->requests;
117 while (r && r->tag != tag)
118 r = r->next;
120 return r;
123 /* Helper function for command completion. */
124 static void scsi_command_complete(SCSIRequest *r, int sense)
126 SCSIDevice *s = r->dev;
127 uint32_t tag;
128 DPRINTF("Command complete tag=0x%x sense=%d\n", r->tag, sense);
129 s->sense = sense;
130 tag = r->tag;
131 scsi_remove_request(r);
132 s->completion(s->opaque, SCSI_REASON_DONE, tag, sense);
135 /* Cancel a pending data transfer. */
136 void scsi_cancel_io(SCSIDevice *s, uint32_t tag)
138 SCSIRequest *r;
139 DPRINTF("Cancel tag=0x%x\n", tag);
140 r = scsi_find_request(s, tag);
141 if (r) {
142 if (r->aiocb)
143 bdrv_aio_cancel(r->aiocb);
144 r->aiocb = NULL;
145 scsi_remove_request(r);
149 static void scsi_read_complete(void * opaque, int ret)
151 SCSIRequest *r = (SCSIRequest *)opaque;
152 SCSIDevice *s = r->dev;
154 if (ret) {
155 DPRINTF("IO error\n");
156 scsi_command_complete(r, SENSE_HARDWARE_ERROR);
157 return;
159 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len);
161 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
164 /* Read more data from scsi device into buffer. */
165 void scsi_read_data(SCSIDevice *s, uint32_t tag)
167 SCSIRequest *r;
168 uint32_t n;
170 r = scsi_find_request(s, tag);
171 if (!r) {
172 BADF("Bad read tag 0x%x\n", tag);
173 /* ??? This is the wrong error. */
174 scsi_command_complete(r, SENSE_HARDWARE_ERROR);
175 return;
177 if (r->sector_count == (uint32_t)-1) {
178 DPRINTF("Read buf_len=%d\n", r->buf_len);
179 r->sector_count = 0;
180 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
181 return;
183 DPRINTF("Read sector_count=%d\n", r->sector_count);
184 if (r->sector_count == 0) {
185 scsi_command_complete(r, SENSE_NO_SENSE);
186 return;
189 n = r->sector_count;
190 if (n > SCSI_DMA_BUF_SIZE / 512)
191 n = SCSI_DMA_BUF_SIZE / 512;
193 r->buf_len = n * 512;
194 r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,
195 scsi_read_complete, r);
196 if (r->aiocb == NULL)
197 scsi_command_complete(r, SENSE_HARDWARE_ERROR);
198 r->sector += n;
199 r->sector_count -= n;
202 static void scsi_write_complete(void * opaque, int ret)
204 SCSIRequest *r = (SCSIRequest *)opaque;
205 SCSIDevice *s = r->dev;
206 uint32_t len;
208 if (ret) {
209 fprintf(stderr, "scsi-disc: IO write error\n");
210 exit(1);
213 r->aiocb = NULL;
214 if (r->sector_count == 0) {
215 scsi_command_complete(r, SENSE_NO_SENSE);
216 } else {
217 len = r->sector_count * 512;
218 if (len > SCSI_DMA_BUF_SIZE) {
219 len = SCSI_DMA_BUF_SIZE;
221 r->buf_len = len;
222 DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
223 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
227 /* Write data to a scsi device. Returns nonzero on failure.
228 The transfer may complete asynchronously. */
229 int scsi_write_data(SCSIDevice *s, uint32_t tag)
231 SCSIRequest *r;
232 uint32_t n;
234 DPRINTF("Write data tag=0x%x\n", tag);
235 r = scsi_find_request(s, tag);
236 if (!r) {
237 BADF("Bad write tag 0x%x\n", tag);
238 scsi_command_complete(r, SENSE_HARDWARE_ERROR);
239 return 1;
241 if (r->aiocb)
242 BADF("Data transfer already in progress\n");
243 n = r->buf_len / 512;
244 if (n) {
245 r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,
246 scsi_write_complete, r);
247 if (r->aiocb == NULL)
248 scsi_command_complete(r, SENSE_HARDWARE_ERROR);
249 r->sector += n;
250 r->sector_count -= n;
251 } else {
252 /* Invoke completion routine to fetch data from host. */
253 scsi_write_complete(r, 0);
256 return 0;
259 /* Return a pointer to the data buffer. */
260 uint8_t *scsi_get_buf(SCSIDevice *s, uint32_t tag)
262 SCSIRequest *r;
264 r = scsi_find_request(s, tag);
265 if (!r) {
266 BADF("Bad buffer tag 0x%x\n", tag);
267 return NULL;
269 return r->dma_buf;
272 /* Execute a scsi command. Returns the length of the data expected by the
273 command. This will be Positive for data transfers from the device
274 (eg. disk reads), negative for transfers to the device (eg. disk writes),
275 and zero if the command does not transfer any data. */
277 int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun)
279 int64_t nb_sectors;
280 uint32_t lba;
281 uint32_t len;
282 int cmdlen;
283 int is_write;
284 uint8_t command;
285 uint8_t *outbuf;
286 SCSIRequest *r;
288 command = buf[0];
289 r = scsi_find_request(s, tag);
290 if (r) {
291 BADF("Tag 0x%x already in use\n", tag);
292 scsi_cancel_io(s, tag);
294 /* ??? Tags are not unique for different luns. We only implement a
295 single lun, so this should not matter. */
296 r = scsi_new_request(s, tag);
297 outbuf = r->dma_buf;
298 is_write = 0;
299 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
300 switch (command >> 5) {
301 case 0:
302 lba = buf[3] | (buf[2] << 8) | ((buf[1] & 0x1f) << 16);
303 len = buf[4];
304 cmdlen = 6;
305 break;
306 case 1:
307 case 2:
308 lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
309 len = buf[8] | (buf[7] << 8);
310 cmdlen = 10;
311 break;
312 case 4:
313 lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
314 len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
315 cmdlen = 16;
316 break;
317 case 5:
318 lba = buf[5] | (buf[4] << 8) | (buf[3] << 16) | (buf[2] << 24);
319 len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
320 cmdlen = 12;
321 break;
322 default:
323 BADF("Unsupported command length, command %x\n", command);
324 goto fail;
326 #ifdef DEBUG_SCSI
328 int i;
329 for (i = 1; i < cmdlen; i++) {
330 printf(" 0x%02x", buf[i]);
332 printf("\n");
334 #endif
335 if (lun || buf[1] >> 5) {
336 /* Only LUN 0 supported. */
337 DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
338 goto fail;
340 switch (command) {
341 case 0x0:
342 DPRINTF("Test Unit Ready\n");
343 break;
344 case 0x03:
345 DPRINTF("Request Sense (len %d)\n", len);
346 if (len < 4)
347 goto fail;
348 memset(outbuf, 0, 4);
349 outbuf[0] = 0xf0;
350 outbuf[1] = 0;
351 outbuf[2] = s->sense;
352 r->buf_len = 4;
353 break;
354 case 0x12:
355 DPRINTF("Inquiry (len %d)\n", len);
356 if (len < 36) {
357 BADF("Inquiry buffer too small (%d)\n", len);
359 memset(outbuf, 0, 36);
360 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
361 outbuf[0] = 5;
362 outbuf[1] = 0x80;
363 memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
364 } else {
365 outbuf[0] = 0;
366 memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
368 memcpy(&outbuf[8], "QEMU ", 8);
369 memcpy(&outbuf[32], QEMU_VERSION, 4);
370 /* Identify device as SCSI-3 rev 1.
371 Some later commands are also implemented. */
372 outbuf[2] = 3;
373 outbuf[3] = 2; /* Format 2 */
374 outbuf[4] = 31;
375 /* Sync data transfer and TCQ. */
376 outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
377 r->buf_len = 36;
378 break;
379 case 0x16:
380 DPRINTF("Reserve(6)\n");
381 if (buf[1] & 1)
382 goto fail;
383 break;
384 case 0x17:
385 DPRINTF("Release(6)\n");
386 if (buf[1] & 1)
387 goto fail;
388 break;
389 case 0x1a:
390 case 0x5a:
392 uint8_t *p;
393 int page;
395 page = buf[2] & 0x3f;
396 DPRINTF("Mode Sense (page %d, len %d)\n", page, len);
397 p = outbuf;
398 memset(p, 0, 4);
399 outbuf[1] = 0; /* Default media type. */
400 outbuf[3] = 0; /* Block descriptor length. */
401 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
402 outbuf[2] = 0x80; /* Readonly. */
404 p += 4;
405 if ((page == 8 || page == 0x3f)) {
406 /* Caching page. */
407 memset(p,0,20);
408 p[0] = 8;
409 p[1] = 0x12;
410 p[2] = 4; /* WCE */
411 p += 20;
413 if ((page == 0x3f || page == 0x2a)
414 && (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM)) {
415 /* CD Capabilities and Mechanical Status page. */
416 p[0] = 0x2a;
417 p[1] = 0x14;
418 p[2] = 3; // CD-R & CD-RW read
419 p[3] = 0; // Writing not supported
420 p[4] = 0x7f; /* Audio, composite, digital out,
421 mode 2 form 1&2, multi session */
422 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
423 RW corrected, C2 errors, ISRC,
424 UPC, Bar code */
425 p[6] = 0x2d | (bdrv_is_locked(s->bdrv)? 2 : 0);
426 /* Locking supported, jumper present, eject, tray */
427 p[7] = 0; /* no volume & mute control, no
428 changer */
429 p[8] = (50 * 176) >> 8; // 50x read speed
430 p[9] = (50 * 176) & 0xff;
431 p[10] = 0 >> 8; // No volume
432 p[11] = 0 & 0xff;
433 p[12] = 2048 >> 8; // 2M buffer
434 p[13] = 2048 & 0xff;
435 p[14] = (16 * 176) >> 8; // 16x read speed current
436 p[15] = (16 * 176) & 0xff;
437 p[18] = (16 * 176) >> 8; // 16x write speed
438 p[19] = (16 * 176) & 0xff;
439 p[20] = (16 * 176) >> 8; // 16x write speed current
440 p[21] = (16 * 176) & 0xff;
441 p += 22;
443 r->buf_len = p - outbuf;
444 outbuf[0] = r->buf_len - 4;
445 if (r->buf_len > len)
446 r->buf_len = len;
448 break;
449 case 0x1b:
450 DPRINTF("Start Stop Unit\n");
451 break;
452 case 0x1e:
453 DPRINTF("Prevent Allow Medium Removal (prevent = %d)\n", buf[4] & 3);
454 bdrv_set_locked(s->bdrv, buf[4] & 1);
455 break;
456 case 0x25:
457 DPRINTF("Read Capacity\n");
458 /* The normal LEN field for this command is zero. */
459 memset(outbuf, 0, 8);
460 bdrv_get_geometry(s->bdrv, &nb_sectors);
461 /* Returned value is the address of the last sector. */
462 if (nb_sectors) {
463 nb_sectors--;
464 outbuf[0] = (nb_sectors >> 24) & 0xff;
465 outbuf[1] = (nb_sectors >> 16) & 0xff;
466 outbuf[2] = (nb_sectors >> 8) & 0xff;
467 outbuf[3] = nb_sectors & 0xff;
468 outbuf[4] = 0;
469 outbuf[5] = 0;
470 outbuf[6] = s->cluster_size * 2;
471 outbuf[7] = 0;
472 r->buf_len = 8;
473 } else {
474 scsi_command_complete(r, SENSE_NOT_READY);
475 return 0;
477 break;
478 case 0x08:
479 case 0x28:
480 DPRINTF("Read (sector %d, count %d)\n", lba, len);
481 r->sector = lba * s->cluster_size;
482 r->sector_count = len * s->cluster_size;
483 break;
484 case 0x0a:
485 case 0x2a:
486 DPRINTF("Write (sector %d, count %d)\n", lba, len);
487 r->sector = lba * s->cluster_size;
488 r->sector_count = len * s->cluster_size;
489 is_write = 1;
490 break;
491 case 0x35:
492 DPRINTF("Synchronise cache (sector %d, count %d)\n", lba, len);
493 bdrv_flush(s->bdrv);
494 break;
495 case 0x43:
497 int start_track, format, msf, toclen;
499 msf = buf[1] & 2;
500 format = buf[2] & 0xf;
501 start_track = buf[6];
502 bdrv_get_geometry(s->bdrv, &nb_sectors);
503 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
504 switch(format) {
505 case 0:
506 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
507 break;
508 case 1:
509 /* multi session : only a single session defined */
510 toclen = 12;
511 memset(outbuf, 0, 12);
512 outbuf[1] = 0x0a;
513 outbuf[2] = 0x01;
514 outbuf[3] = 0x01;
515 break;
516 case 2:
517 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
518 break;
519 default:
520 goto error_cmd;
522 if (toclen > 0) {
523 if (len > toclen)
524 len = toclen;
525 r->buf_len = len;
526 break;
528 error_cmd:
529 DPRINTF("Read TOC error\n");
530 goto fail;
532 case 0x46:
533 DPRINTF("Get Configuration (rt %d, maxlen %d)\n", buf[1] & 3, len);
534 memset(outbuf, 0, 8);
535 /* ??? This shoud probably return much more information. For now
536 just return the basic header indicating the CD-ROM profile. */
537 outbuf[7] = 8; // CD-ROM
538 r->buf_len = 8;
539 break;
540 case 0x56:
541 DPRINTF("Reserve(10)\n");
542 if (buf[1] & 3)
543 goto fail;
544 break;
545 case 0x57:
546 DPRINTF("Release(10)\n");
547 if (buf[1] & 3)
548 goto fail;
549 break;
550 case 0xa0:
551 DPRINTF("Report LUNs (len %d)\n", len);
552 if (len < 16)
553 goto fail;
554 memset(outbuf, 0, 16);
555 outbuf[3] = 8;
556 r->buf_len = 16;
557 break;
558 default:
559 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
560 fail:
561 scsi_command_complete(r, SENSE_ILLEGAL_REQUEST);
562 return 0;
564 if (r->sector_count == 0 && r->buf_len == 0) {
565 scsi_command_complete(r, SENSE_NO_SENSE);
567 len = r->sector_count * 512 + r->buf_len;
568 if (is_write) {
569 return -len;
570 } else {
571 if (!r->sector_count)
572 r->sector_count = -1;
573 return len;
577 void scsi_disk_destroy(SCSIDevice *s)
579 qemu_free(s);
582 SCSIDevice *scsi_disk_init(BlockDriverState *bdrv,
583 int tcq,
584 scsi_completionfn completion,
585 void *opaque)
587 SCSIDevice *s;
589 s = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
590 s->bdrv = bdrv;
591 s->tcq = tcq;
592 s->completion = completion;
593 s->opaque = opaque;
594 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
595 s->cluster_size = 4;
596 } else {
597 s->cluster_size = 1;
600 return s;