Merge commit 'origin/master' into dev-mini2440-staging
[qemu/mini2440.git] / hw / scsi-generic.c
blob53e895127088fc6cce08ac257fc66e1e76528365
1 /*
2 * Generic SCSI Device support
4 * Copyright (c) 2007 Bull S.A.S.
5 * Based on code by Paul Brook
6 * Based on code by Fabrice Bellard
8 * Written by Laurent Vivier <Laurent.Vivier@bull.net>
10 * This code is licenced under the LGPL.
14 #include "qemu-common.h"
15 #include "block.h"
16 #include "scsi-disk.h"
18 #ifndef __linux__
20 SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,
21 scsi_completionfn completion, void *opaque)
23 return NULL;
26 #else /* __linux__ */
28 //#define DEBUG_SCSI
30 #ifdef DEBUG_SCSI
31 #define DPRINTF(fmt, args...) \
32 do { printf("scsi-generic: " fmt , ##args); } while (0)
33 #else
34 #define DPRINTF(fmt, args...) do {} while(0)
35 #endif
37 #define BADF(fmt, args...) \
38 do { fprintf(stderr, "scsi-generic: " fmt , ##args); } while (0)
40 #include <stdio.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <unistd.h>
44 #include <scsi/sg.h>
45 #include <scsi/scsi.h>
47 #define REWIND 0x01
48 #define REPORT_DENSITY_SUPPORT 0x44
49 #define LOAD_UNLOAD 0xa6
50 #define SET_CD_SPEED 0xbb
51 #define BLANK 0xa1
53 #define SCSI_CMD_BUF_SIZE 16
54 #define SCSI_SENSE_BUF_SIZE 96
56 #define SG_ERR_DRIVER_TIMEOUT 0x06
57 #define SG_ERR_DRIVER_SENSE 0x08
59 #ifndef MAX_UINT
60 #define MAX_UINT ((unsigned int)-1)
61 #endif
63 typedef struct SCSIRequest {
64 BlockDriverAIOCB *aiocb;
65 struct SCSIRequest *next;
66 SCSIDeviceState *dev;
67 uint32_t tag;
68 uint8_t cmd[SCSI_CMD_BUF_SIZE];
69 int cmdlen;
70 uint8_t *buf;
71 int buflen;
72 int len;
73 sg_io_hdr_t io_header;
74 } SCSIRequest;
76 struct SCSIDeviceState
78 SCSIRequest *requests;
79 BlockDriverState *bdrv;
80 int type;
81 int blocksize;
82 int lun;
83 scsi_completionfn completion;
84 void *opaque;
85 int driver_status;
86 uint8_t sensebuf[SCSI_SENSE_BUF_SIZE];
87 uint8_t senselen;
90 /* Global pool of SCSIRequest structures. */
91 static SCSIRequest *free_requests = NULL;
93 static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
95 SCSIRequest *r;
97 if (free_requests) {
98 r = free_requests;
99 free_requests = r->next;
100 } else {
101 r = qemu_malloc(sizeof(SCSIRequest));
102 r->buf = NULL;
103 r->buflen = 0;
105 r->dev = s;
106 r->tag = tag;
107 memset(r->cmd, 0, sizeof(r->cmd));
108 memset(&r->io_header, 0, sizeof(r->io_header));
109 r->cmdlen = 0;
110 r->len = 0;
111 r->aiocb = NULL;
113 /* link */
115 r->next = s->requests;
116 s->requests = r;
117 return r;
120 static void scsi_remove_request(SCSIRequest *r)
122 SCSIRequest *last;
123 SCSIDeviceState *s = r->dev;
125 if (s->requests == r) {
126 s->requests = r->next;
127 } else {
128 last = s->requests;
129 while (last && last->next != r)
130 last = last->next;
131 if (last) {
132 last->next = r->next;
133 } else {
134 BADF("Orphaned request\n");
137 r->next = free_requests;
138 free_requests = r;
141 static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
143 SCSIRequest *r;
145 r = s->requests;
146 while (r && r->tag != tag)
147 r = r->next;
149 return r;
152 /* Helper function for command completion. */
153 static void scsi_command_complete(void *opaque, int ret)
155 SCSIRequest *r = (SCSIRequest *)opaque;
156 SCSIDeviceState *s = r->dev;
157 uint32_t tag;
158 int status;
160 s->driver_status = r->io_header.driver_status;
161 if (s->driver_status & SG_ERR_DRIVER_SENSE)
162 s->senselen = r->io_header.sb_len_wr;
164 if (ret != 0)
165 status = BUSY << 1;
166 else {
167 if (s->driver_status & SG_ERR_DRIVER_TIMEOUT) {
168 status = BUSY << 1;
169 BADF("Driver Timeout\n");
170 } else if (r->io_header.status)
171 status = r->io_header.status;
172 else if (s->driver_status & SG_ERR_DRIVER_SENSE)
173 status = CHECK_CONDITION << 1;
174 else
175 status = GOOD << 1;
177 DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
178 r, r->tag, status);
179 tag = r->tag;
180 scsi_remove_request(r);
181 s->completion(s->opaque, SCSI_REASON_DONE, tag, status);
184 /* Cancel a pending data transfer. */
185 static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
187 DPRINTF("scsi_cancel_io 0x%x\n", tag);
188 SCSIDeviceState *s = d->state;
189 SCSIRequest *r;
190 DPRINTF("Cancel tag=0x%x\n", tag);
191 r = scsi_find_request(s, tag);
192 if (r) {
193 if (r->aiocb)
194 bdrv_aio_cancel(r->aiocb);
195 r->aiocb = NULL;
196 scsi_remove_request(r);
200 static int execute_command(BlockDriverState *bdrv,
201 SCSIRequest *r, int direction,
202 BlockDriverCompletionFunc *complete)
204 int ret;
206 r->io_header.interface_id = 'S';
207 r->io_header.dxfer_direction = direction;
208 r->io_header.dxferp = r->buf;
209 r->io_header.dxfer_len = r->buflen;
210 r->io_header.cmdp = r->cmd;
211 r->io_header.cmd_len = r->cmdlen;
212 r->io_header.mx_sb_len = sizeof(r->dev->sensebuf);
213 r->io_header.sbp = r->dev->sensebuf;
214 r->io_header.timeout = MAX_UINT;
215 r->io_header.usr_ptr = r;
216 r->io_header.flags |= SG_FLAG_DIRECT_IO;
218 ret = bdrv_sg_send_command(bdrv, &r->io_header, sizeof(r->io_header));
219 if (ret < 0) {
220 BADF("execute_command: write failed ! (%d)\n", errno);
221 return -1;
223 if (complete == NULL) {
224 int ret;
225 r->aiocb = NULL;
226 while ((ret = bdrv_sg_recv_response(bdrv, &r->io_header,
227 sizeof(r->io_header))) < 0 &&
228 ret == -EINTR)
230 if (ret < 0) {
231 BADF("execute_command: read failed !\n");
232 return -1;
234 return 0;
237 r->aiocb = bdrv_sg_aio_read(bdrv, (uint8_t*)&r->io_header,
238 sizeof(r->io_header), complete, r);
239 if (r->aiocb == NULL) {
240 BADF("execute_command: read failed !\n");
241 return -1;
244 return 0;
247 static void scsi_read_complete(void * opaque, int ret)
249 SCSIRequest *r = (SCSIRequest *)opaque;
250 SCSIDeviceState *s = r->dev;
251 int len;
253 if (ret) {
254 DPRINTF("IO error\n");
255 scsi_command_complete(r, ret);
256 return;
258 len = r->io_header.dxfer_len - r->io_header.resid;
259 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, len);
261 r->len = -1;
262 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
263 if (len == 0)
264 scsi_command_complete(r, 0);
267 /* Read more data from scsi device into buffer. */
268 static void scsi_read_data(SCSIDevice *d, uint32_t tag)
270 SCSIDeviceState *s = d->state;
271 SCSIRequest *r;
272 int ret;
274 DPRINTF("scsi_read_data 0x%x\n", tag);
275 r = scsi_find_request(s, tag);
276 if (!r) {
277 BADF("Bad read tag 0x%x\n", tag);
278 /* ??? This is the wrong error. */
279 scsi_command_complete(r, -EINVAL);
280 return;
283 if (r->len == -1) {
284 scsi_command_complete(r, 0);
285 return;
288 if (r->cmd[0] == REQUEST_SENSE && s->driver_status & SG_ERR_DRIVER_SENSE)
290 s->senselen = MIN(r->len, s->senselen);
291 memcpy(r->buf, s->sensebuf, s->senselen);
292 r->io_header.driver_status = 0;
293 r->io_header.status = 0;
294 r->io_header.dxfer_len = s->senselen;
295 r->len = -1;
296 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, s->senselen);
297 DPRINTF("Sense: %d %d %d %d %d %d %d %d\n",
298 r->buf[0], r->buf[1], r->buf[2], r->buf[3],
299 r->buf[4], r->buf[5], r->buf[6], r->buf[7]);
300 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, s->senselen);
301 return;
304 ret = execute_command(s->bdrv, r, SG_DXFER_FROM_DEV, scsi_read_complete);
305 if (ret == -1) {
306 scsi_command_complete(r, -EINVAL);
307 return;
311 static void scsi_write_complete(void * opaque, int ret)
313 SCSIRequest *r = (SCSIRequest *)opaque;
315 DPRINTF("scsi_write_complete() ret = %d\n", ret);
316 if (ret) {
317 DPRINTF("IO error\n");
318 scsi_command_complete(r, ret);
319 return;
322 if (r->cmd[0] == MODE_SELECT && r->cmd[4] == 12 &&
323 r->dev->type == TYPE_TAPE) {
324 r->dev->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
325 DPRINTF("block size %d\n", r->dev->blocksize);
328 scsi_command_complete(r, ret);
331 /* Write data to a scsi device. Returns nonzero on failure.
332 The transfer may complete asynchronously. */
333 static int scsi_write_data(SCSIDevice *d, uint32_t tag)
335 SCSIDeviceState *s = d->state;
336 SCSIRequest *r;
337 int ret;
339 DPRINTF("scsi_write_data 0x%x\n", tag);
340 r = scsi_find_request(s, tag);
341 if (!r) {
342 BADF("Bad write tag 0x%x\n", tag);
343 /* ??? This is the wrong error. */
344 scsi_command_complete(r, -EINVAL);
345 return 0;
348 if (r->len == 0) {
349 r->len = r->buflen;
350 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->len);
351 return 0;
354 ret = execute_command(s->bdrv, r, SG_DXFER_TO_DEV, scsi_write_complete);
355 if (ret == -1) {
356 scsi_command_complete(r, -EINVAL);
357 return 1;
360 return 0;
363 /* Return a pointer to the data buffer. */
364 static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
366 SCSIDeviceState *s = d->state;
367 SCSIRequest *r;
368 r = scsi_find_request(s, tag);
369 if (!r) {
370 BADF("Bad buffer tag 0x%x\n", tag);
371 return NULL;
373 return r->buf;
376 static int scsi_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
378 switch (cmd[0] >> 5) {
379 case 0:
380 *len = cmd[4];
381 *cmdlen = 6;
382 /* length 0 means 256 blocks */
383 if (*len == 0)
384 *len = 256;
385 break;
386 case 1:
387 case 2:
388 *len = cmd[8] | (cmd[7] << 8);
389 *cmdlen = 10;
390 break;
391 case 4:
392 *len = cmd[13] | (cmd[12] << 8) | (cmd[11] << 16) | (cmd[10] << 24);
393 *cmdlen = 16;
394 break;
395 case 5:
396 *len = cmd[9] | (cmd[8] << 8) | (cmd[7] << 16) | (cmd[6] << 24);
397 *cmdlen = 12;
398 break;
399 default:
400 return -1;
403 switch(cmd[0]) {
404 case TEST_UNIT_READY:
405 case REZERO_UNIT:
406 case START_STOP:
407 case SEEK_6:
408 case WRITE_FILEMARKS:
409 case SPACE:
410 case ERASE:
411 case ALLOW_MEDIUM_REMOVAL:
412 case VERIFY:
413 case SEEK_10:
414 case SYNCHRONIZE_CACHE:
415 case LOCK_UNLOCK_CACHE:
416 case LOAD_UNLOAD:
417 case SET_CD_SPEED:
418 case SET_LIMITS:
419 case WRITE_LONG:
420 case MOVE_MEDIUM:
421 case UPDATE_BLOCK:
422 *len = 0;
423 break;
424 case MODE_SENSE:
425 break;
426 case WRITE_SAME:
427 *len = 1;
428 break;
429 case READ_CAPACITY:
430 *len = 8;
431 break;
432 case READ_BLOCK_LIMITS:
433 *len = 6;
434 break;
435 case READ_POSITION:
436 *len = 20;
437 break;
438 case SEND_VOLUME_TAG:
439 *len *= 40;
440 break;
441 case MEDIUM_SCAN:
442 *len *= 8;
443 break;
444 case WRITE_10:
445 cmd[1] &= ~0x08; /* disable FUA */
446 case WRITE_VERIFY:
447 case WRITE_6:
448 case WRITE_12:
449 case WRITE_VERIFY_12:
450 *len *= blocksize;
451 break;
452 case READ_10:
453 cmd[1] &= ~0x08; /* disable FUA */
454 case READ_6:
455 case READ_REVERSE:
456 case RECOVER_BUFFERED_DATA:
457 case READ_12:
458 *len *= blocksize;
459 break;
460 case INQUIRY:
461 *len = cmd[4] | (cmd[3] << 8);
462 break;
464 return 0;
467 static int scsi_stream_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
469 switch(cmd[0]) {
470 /* stream commands */
471 case READ_6:
472 case READ_REVERSE:
473 case RECOVER_BUFFERED_DATA:
474 case WRITE_6:
475 *cmdlen = 6;
476 *len = cmd[4] | (cmd[3] << 8) | (cmd[2] << 16);
477 if (cmd[1] & 0x01) /* fixed */
478 *len *= blocksize;
479 break;
480 case REWIND:
481 case START_STOP:
482 *cmdlen = 6;
483 *len = 0;
484 cmd[1] = 0x01; /* force IMMED, otherwise qemu waits end of command */
485 break;
486 /* generic commands */
487 default:
488 return scsi_length(cmd, blocksize, cmdlen, len);
490 return 0;
493 static int is_write(int command)
495 switch (command) {
496 case COPY:
497 case COPY_VERIFY:
498 case COMPARE:
499 case CHANGE_DEFINITION:
500 case LOG_SELECT:
501 case MODE_SELECT:
502 case MODE_SELECT_10:
503 case SEND_DIAGNOSTIC:
504 case WRITE_BUFFER:
505 case FORMAT_UNIT:
506 case REASSIGN_BLOCKS:
507 case RESERVE:
508 case SEARCH_EQUAL:
509 case SEARCH_HIGH:
510 case SEARCH_LOW:
511 case WRITE_6:
512 case WRITE_10:
513 case WRITE_VERIFY:
514 case UPDATE_BLOCK:
515 case WRITE_LONG:
516 case WRITE_SAME:
517 case SEARCH_HIGH_12:
518 case SEARCH_EQUAL_12:
519 case SEARCH_LOW_12:
520 case WRITE_12:
521 case WRITE_VERIFY_12:
522 case SET_WINDOW:
523 case MEDIUM_SCAN:
524 case SEND_VOLUME_TAG:
525 case WRITE_LONG_2:
526 return 1;
528 return 0;
531 /* Execute a scsi command. Returns the length of the data expected by the
532 command. This will be Positive for data transfers from the device
533 (eg. disk reads), negative for transfers to the device (eg. disk writes),
534 and zero if the command does not transfer any data. */
536 static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
537 uint8_t *cmd, int lun)
539 SCSIDeviceState *s = d->state;
540 uint32_t len=0;
541 int cmdlen=0;
542 SCSIRequest *r;
543 int ret;
545 if (s->type == TYPE_TAPE) {
546 if (scsi_stream_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
547 BADF("Unsupported command length, command %x\n", cmd[0]);
548 return 0;
550 } else {
551 if (scsi_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
552 BADF("Unsupported command length, command %x\n", cmd[0]);
553 return 0;
557 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x len %d\n", lun, tag,
558 cmd[0], len);
560 if (cmd[0] != REQUEST_SENSE &&
561 (lun != s->lun || (cmd[1] >> 5) != s->lun)) {
562 DPRINTF("Unimplemented LUN %d\n", lun ? lun : cmd[1] >> 5);
564 s->sensebuf[0] = 0x70;
565 s->sensebuf[1] = 0x00;
566 s->sensebuf[2] = ILLEGAL_REQUEST;
567 s->sensebuf[3] = 0x00;
568 s->sensebuf[4] = 0x00;
569 s->sensebuf[5] = 0x00;
570 s->sensebuf[6] = 0x00;
571 s->senselen = 7;
572 s->driver_status = SG_ERR_DRIVER_SENSE;
573 s->completion(s->opaque, SCSI_REASON_DONE, tag, CHECK_CONDITION << 1);
574 return 0;
577 r = scsi_find_request(s, tag);
578 if (r) {
579 BADF("Tag 0x%x already in use %p\n", tag, r);
580 scsi_cancel_io(d, tag);
582 r = scsi_new_request(s, tag);
584 memcpy(r->cmd, cmd, cmdlen);
585 r->cmdlen = cmdlen;
587 if (len == 0) {
588 if (r->buf != NULL)
589 free(r->buf);
590 r->buflen = 0;
591 r->buf = NULL;
592 ret = execute_command(s->bdrv, r, SG_DXFER_NONE, scsi_command_complete);
593 if (ret == -1) {
594 scsi_command_complete(r, -EINVAL);
595 return 0;
597 return 0;
600 if (r->buflen != len) {
601 if (r->buf != NULL)
602 free(r->buf);
603 r->buf = qemu_malloc(len);
604 r->buflen = len;
607 memset(r->buf, 0, r->buflen);
608 r->len = len;
609 if (is_write(cmd[0])) {
610 r->len = 0;
611 return -len;
614 return len;
617 static int get_blocksize(BlockDriverState *bdrv)
619 uint8_t cmd[10];
620 uint8_t buf[8];
621 uint8_t sensebuf[8];
622 sg_io_hdr_t io_header;
623 int ret;
625 memset(cmd, 0, sizeof(cmd));
626 memset(buf, 0, sizeof(buf));
627 cmd[0] = READ_CAPACITY;
629 memset(&io_header, 0, sizeof(io_header));
630 io_header.interface_id = 'S';
631 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
632 io_header.dxfer_len = sizeof(buf);
633 io_header.dxferp = buf;
634 io_header.cmdp = cmd;
635 io_header.cmd_len = sizeof(cmd);
636 io_header.mx_sb_len = sizeof(sensebuf);
637 io_header.sbp = sensebuf;
638 io_header.timeout = 6000; /* XXX */
640 ret = bdrv_sg_send_command(bdrv, &io_header, sizeof(io_header));
641 if (ret < 0)
642 return -1;
644 while ((ret = bdrv_sg_recv_response(bdrv, &io_header, sizeof(io_header))) < 0 &&
645 ret == -EINTR)
648 if (ret < 0)
649 return -1;
651 return (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
654 static int get_stream_blocksize(BlockDriverState *bdrv)
656 uint8_t cmd[6];
657 uint8_t buf[12];
658 uint8_t sensebuf[8];
659 sg_io_hdr_t io_header;
660 int ret;
662 memset(cmd, 0, sizeof(cmd));
663 memset(buf, 0, sizeof(buf));
664 cmd[0] = MODE_SENSE;
665 cmd[4] = sizeof(buf);
667 memset(&io_header, 0, sizeof(io_header));
668 io_header.interface_id = 'S';
669 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
670 io_header.dxfer_len = sizeof(buf);
671 io_header.dxferp = buf;
672 io_header.cmdp = cmd;
673 io_header.cmd_len = sizeof(cmd);
674 io_header.mx_sb_len = sizeof(sensebuf);
675 io_header.sbp = sensebuf;
676 io_header.timeout = 6000; /* XXX */
678 ret = bdrv_sg_send_command(bdrv, &io_header, sizeof(io_header));
679 if (ret < 0)
680 return -1;
682 while ((ret = bdrv_sg_recv_response(bdrv, &io_header, sizeof(io_header))) < 0 &&
683 ret == -EINTR)
686 if (ret < 0)
687 return -1;
689 return (buf[9] << 16) | (buf[10] << 8) | buf[11];
692 static void scsi_destroy(SCSIDevice *d)
694 SCSIRequest *r, *n;
696 r = d->state->requests;
697 while (r) {
698 n = r->next;
699 qemu_free(r);
700 r = n;
703 r = free_requests;
704 while (r) {
705 n = r->next;
706 qemu_free(r);
707 r = n;
710 qemu_free(d->state);
711 qemu_free(d);
714 SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,
715 scsi_completionfn completion, void *opaque)
717 int sg_version;
718 SCSIDevice *d;
719 SCSIDeviceState *s;
720 struct sg_scsi_id scsiid;
722 /* check we are really using a /dev/sg* file */
724 if (!bdrv_is_sg(bdrv))
725 return NULL;
727 /* check we are using a driver managing SG_IO (version 3 and after */
729 if (bdrv_ioctl(bdrv, SG_GET_VERSION_NUM, &sg_version) < 0 ||
730 sg_version < 30000)
731 return NULL;
733 /* get LUN of the /dev/sg? */
735 if (bdrv_ioctl(bdrv, SG_GET_SCSI_ID, &scsiid))
736 return NULL;
738 /* define device state */
740 s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
741 s->bdrv = bdrv;
742 s->requests = NULL;
743 s->completion = completion;
744 s->opaque = opaque;
745 s->lun = scsiid.lun;
746 DPRINTF("LUN %d\n", s->lun);
747 s->type = scsiid.scsi_type;
748 DPRINTF("device type %d\n", s->type);
749 if (s->type == TYPE_TAPE) {
750 s->blocksize = get_stream_blocksize(s->bdrv);
751 if (s->blocksize == -1)
752 s->blocksize = 0;
753 } else {
754 s->blocksize = get_blocksize(s->bdrv);
755 /* removable media returns 0 if not present */
756 if (s->blocksize <= 0) {
757 if (s->type == TYPE_ROM || s->type == TYPE_WORM)
758 s->blocksize = 2048;
759 else
760 s->blocksize = 512;
763 DPRINTF("block size %d\n", s->blocksize);
764 s->driver_status = 0;
765 memset(s->sensebuf, 0, sizeof(s->sensebuf));
767 /* define function to manage device */
769 d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
770 d->state = s;
771 d->destroy = scsi_destroy;
772 d->send_command = scsi_send_command;
773 d->read_data = scsi_read_data;
774 d->write_data = scsi_write_data;
775 d->cancel_io = scsi_cancel_io;
776 d->get_buf = scsi_get_buf;
778 return d;
780 #endif /* __linux__ */