Merge branch 'master' of ssh://repo.or.cz/srv/git/qemu
[qemu/hppa.git] / hw / scsi-generic.c
blobc827c04a198c9f2c99606ecd7d9748262c377b97
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, ...) \
32 do { printf("scsi-generic: " fmt , ## __VA_ARGS__); } while (0)
33 #else
34 #define DPRINTF(fmt, ...) do {} while(0)
35 #endif
37 #define BADF(fmt, ...) \
38 do { fprintf(stderr, "scsi-generic: " fmt , ## __VA_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 r->io_header.interface_id = 'S';
205 r->io_header.dxfer_direction = direction;
206 r->io_header.dxferp = r->buf;
207 r->io_header.dxfer_len = r->buflen;
208 r->io_header.cmdp = r->cmd;
209 r->io_header.cmd_len = r->cmdlen;
210 r->io_header.mx_sb_len = sizeof(r->dev->sensebuf);
211 r->io_header.sbp = r->dev->sensebuf;
212 r->io_header.timeout = MAX_UINT;
213 r->io_header.usr_ptr = r;
214 r->io_header.flags |= SG_FLAG_DIRECT_IO;
216 r->aiocb = bdrv_aio_ioctl(bdrv, SG_IO, &r->io_header, complete, r);
217 if (r->aiocb == NULL) {
218 BADF("execute_command: read failed !\n");
219 return -1;
222 return 0;
225 static void scsi_read_complete(void * opaque, int ret)
227 SCSIRequest *r = (SCSIRequest *)opaque;
228 SCSIDeviceState *s = r->dev;
229 int len;
231 if (ret) {
232 DPRINTF("IO error\n");
233 scsi_command_complete(r, ret);
234 return;
236 len = r->io_header.dxfer_len - r->io_header.resid;
237 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, len);
239 r->len = -1;
240 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
241 if (len == 0)
242 scsi_command_complete(r, 0);
245 /* Read more data from scsi device into buffer. */
246 static void scsi_read_data(SCSIDevice *d, uint32_t tag)
248 SCSIDeviceState *s = d->state;
249 SCSIRequest *r;
250 int ret;
252 DPRINTF("scsi_read_data 0x%x\n", tag);
253 r = scsi_find_request(s, tag);
254 if (!r) {
255 BADF("Bad read tag 0x%x\n", tag);
256 /* ??? This is the wrong error. */
257 scsi_command_complete(r, -EINVAL);
258 return;
261 if (r->len == -1) {
262 scsi_command_complete(r, 0);
263 return;
266 if (r->cmd[0] == REQUEST_SENSE && s->driver_status & SG_ERR_DRIVER_SENSE)
268 s->senselen = MIN(r->len, s->senselen);
269 memcpy(r->buf, s->sensebuf, s->senselen);
270 r->io_header.driver_status = 0;
271 r->io_header.status = 0;
272 r->io_header.dxfer_len = s->senselen;
273 r->len = -1;
274 DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, s->senselen);
275 DPRINTF("Sense: %d %d %d %d %d %d %d %d\n",
276 r->buf[0], r->buf[1], r->buf[2], r->buf[3],
277 r->buf[4], r->buf[5], r->buf[6], r->buf[7]);
278 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, s->senselen);
279 return;
282 ret = execute_command(s->bdrv, r, SG_DXFER_FROM_DEV, scsi_read_complete);
283 if (ret == -1) {
284 scsi_command_complete(r, -EINVAL);
285 return;
289 static void scsi_write_complete(void * opaque, int ret)
291 SCSIRequest *r = (SCSIRequest *)opaque;
293 DPRINTF("scsi_write_complete() ret = %d\n", ret);
294 if (ret) {
295 DPRINTF("IO error\n");
296 scsi_command_complete(r, ret);
297 return;
300 if (r->cmd[0] == MODE_SELECT && r->cmd[4] == 12 &&
301 r->dev->type == TYPE_TAPE) {
302 r->dev->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
303 DPRINTF("block size %d\n", r->dev->blocksize);
306 scsi_command_complete(r, ret);
309 /* Write data to a scsi device. Returns nonzero on failure.
310 The transfer may complete asynchronously. */
311 static int scsi_write_data(SCSIDevice *d, uint32_t tag)
313 SCSIDeviceState *s = d->state;
314 SCSIRequest *r;
315 int ret;
317 DPRINTF("scsi_write_data 0x%x\n", tag);
318 r = scsi_find_request(s, tag);
319 if (!r) {
320 BADF("Bad write tag 0x%x\n", tag);
321 /* ??? This is the wrong error. */
322 scsi_command_complete(r, -EINVAL);
323 return 0;
326 if (r->len == 0) {
327 r->len = r->buflen;
328 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->len);
329 return 0;
332 ret = execute_command(s->bdrv, r, SG_DXFER_TO_DEV, scsi_write_complete);
333 if (ret == -1) {
334 scsi_command_complete(r, -EINVAL);
335 return 1;
338 return 0;
341 /* Return a pointer to the data buffer. */
342 static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
344 SCSIDeviceState *s = d->state;
345 SCSIRequest *r;
346 r = scsi_find_request(s, tag);
347 if (!r) {
348 BADF("Bad buffer tag 0x%x\n", tag);
349 return NULL;
351 return r->buf;
354 static int scsi_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
356 switch (cmd[0] >> 5) {
357 case 0:
358 *len = cmd[4];
359 *cmdlen = 6;
360 /* length 0 means 256 blocks */
361 if (*len == 0)
362 *len = 256;
363 break;
364 case 1:
365 case 2:
366 *len = cmd[8] | (cmd[7] << 8);
367 *cmdlen = 10;
368 break;
369 case 4:
370 *len = cmd[13] | (cmd[12] << 8) | (cmd[11] << 16) | (cmd[10] << 24);
371 *cmdlen = 16;
372 break;
373 case 5:
374 *len = cmd[9] | (cmd[8] << 8) | (cmd[7] << 16) | (cmd[6] << 24);
375 *cmdlen = 12;
376 break;
377 default:
378 return -1;
381 switch(cmd[0]) {
382 case TEST_UNIT_READY:
383 case REZERO_UNIT:
384 case START_STOP:
385 case SEEK_6:
386 case WRITE_FILEMARKS:
387 case SPACE:
388 case ERASE:
389 case ALLOW_MEDIUM_REMOVAL:
390 case VERIFY:
391 case SEEK_10:
392 case SYNCHRONIZE_CACHE:
393 case LOCK_UNLOCK_CACHE:
394 case LOAD_UNLOAD:
395 case SET_CD_SPEED:
396 case SET_LIMITS:
397 case WRITE_LONG:
398 case MOVE_MEDIUM:
399 case UPDATE_BLOCK:
400 *len = 0;
401 break;
402 case MODE_SENSE:
403 break;
404 case WRITE_SAME:
405 *len = 1;
406 break;
407 case READ_CAPACITY:
408 *len = 8;
409 break;
410 case READ_BLOCK_LIMITS:
411 *len = 6;
412 break;
413 case READ_POSITION:
414 *len = 20;
415 break;
416 case SEND_VOLUME_TAG:
417 *len *= 40;
418 break;
419 case MEDIUM_SCAN:
420 *len *= 8;
421 break;
422 case WRITE_10:
423 cmd[1] &= ~0x08; /* disable FUA */
424 case WRITE_VERIFY:
425 case WRITE_6:
426 case WRITE_12:
427 case WRITE_VERIFY_12:
428 *len *= blocksize;
429 break;
430 case READ_10:
431 cmd[1] &= ~0x08; /* disable FUA */
432 case READ_6:
433 case READ_REVERSE:
434 case RECOVER_BUFFERED_DATA:
435 case READ_12:
436 *len *= blocksize;
437 break;
438 case INQUIRY:
439 *len = cmd[4] | (cmd[3] << 8);
440 break;
442 return 0;
445 static int scsi_stream_length(uint8_t *cmd, int blocksize, int *cmdlen, uint32_t *len)
447 switch(cmd[0]) {
448 /* stream commands */
449 case READ_6:
450 case READ_REVERSE:
451 case RECOVER_BUFFERED_DATA:
452 case WRITE_6:
453 *cmdlen = 6;
454 *len = cmd[4] | (cmd[3] << 8) | (cmd[2] << 16);
455 if (cmd[1] & 0x01) /* fixed */
456 *len *= blocksize;
457 break;
458 case REWIND:
459 case START_STOP:
460 *cmdlen = 6;
461 *len = 0;
462 cmd[1] = 0x01; /* force IMMED, otherwise qemu waits end of command */
463 break;
464 /* generic commands */
465 default:
466 return scsi_length(cmd, blocksize, cmdlen, len);
468 return 0;
471 static int is_write(int command)
473 switch (command) {
474 case COPY:
475 case COPY_VERIFY:
476 case COMPARE:
477 case CHANGE_DEFINITION:
478 case LOG_SELECT:
479 case MODE_SELECT:
480 case MODE_SELECT_10:
481 case SEND_DIAGNOSTIC:
482 case WRITE_BUFFER:
483 case FORMAT_UNIT:
484 case REASSIGN_BLOCKS:
485 case RESERVE:
486 case SEARCH_EQUAL:
487 case SEARCH_HIGH:
488 case SEARCH_LOW:
489 case WRITE_6:
490 case WRITE_10:
491 case WRITE_VERIFY:
492 case UPDATE_BLOCK:
493 case WRITE_LONG:
494 case WRITE_SAME:
495 case SEARCH_HIGH_12:
496 case SEARCH_EQUAL_12:
497 case SEARCH_LOW_12:
498 case WRITE_12:
499 case WRITE_VERIFY_12:
500 case SET_WINDOW:
501 case MEDIUM_SCAN:
502 case SEND_VOLUME_TAG:
503 case WRITE_LONG_2:
504 return 1;
506 return 0;
509 /* Execute a scsi command. Returns the length of the data expected by the
510 command. This will be Positive for data transfers from the device
511 (eg. disk reads), negative for transfers to the device (eg. disk writes),
512 and zero if the command does not transfer any data. */
514 static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
515 uint8_t *cmd, int lun)
517 SCSIDeviceState *s = d->state;
518 uint32_t len=0;
519 int cmdlen=0;
520 SCSIRequest *r;
521 int ret;
523 if (s->type == TYPE_TAPE) {
524 if (scsi_stream_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
525 BADF("Unsupported command length, command %x\n", cmd[0]);
526 return 0;
528 } else {
529 if (scsi_length(cmd, s->blocksize, &cmdlen, &len) == -1) {
530 BADF("Unsupported command length, command %x\n", cmd[0]);
531 return 0;
535 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x len %d\n", lun, tag,
536 cmd[0], len);
538 if (cmd[0] != REQUEST_SENSE &&
539 (lun != s->lun || (cmd[1] >> 5) != s->lun)) {
540 DPRINTF("Unimplemented LUN %d\n", lun ? lun : cmd[1] >> 5);
542 s->sensebuf[0] = 0x70;
543 s->sensebuf[1] = 0x00;
544 s->sensebuf[2] = ILLEGAL_REQUEST;
545 s->sensebuf[3] = 0x00;
546 s->sensebuf[4] = 0x00;
547 s->sensebuf[5] = 0x00;
548 s->sensebuf[6] = 0x00;
549 s->senselen = 7;
550 s->driver_status = SG_ERR_DRIVER_SENSE;
551 s->completion(s->opaque, SCSI_REASON_DONE, tag, CHECK_CONDITION << 1);
552 return 0;
555 r = scsi_find_request(s, tag);
556 if (r) {
557 BADF("Tag 0x%x already in use %p\n", tag, r);
558 scsi_cancel_io(d, tag);
560 r = scsi_new_request(s, tag);
562 memcpy(r->cmd, cmd, cmdlen);
563 r->cmdlen = cmdlen;
565 if (len == 0) {
566 if (r->buf != NULL)
567 free(r->buf);
568 r->buflen = 0;
569 r->buf = NULL;
570 ret = execute_command(s->bdrv, r, SG_DXFER_NONE, scsi_command_complete);
571 if (ret == -1) {
572 scsi_command_complete(r, -EINVAL);
573 return 0;
575 return 0;
578 if (r->buflen != len) {
579 if (r->buf != NULL)
580 free(r->buf);
581 r->buf = qemu_malloc(len);
582 r->buflen = len;
585 memset(r->buf, 0, r->buflen);
586 r->len = len;
587 if (is_write(cmd[0])) {
588 r->len = 0;
589 return -len;
592 return len;
595 static int get_blocksize(BlockDriverState *bdrv)
597 uint8_t cmd[10];
598 uint8_t buf[8];
599 uint8_t sensebuf[8];
600 sg_io_hdr_t io_header;
601 int ret;
603 memset(cmd, 0, sizeof(cmd));
604 memset(buf, 0, sizeof(buf));
605 cmd[0] = READ_CAPACITY;
607 memset(&io_header, 0, sizeof(io_header));
608 io_header.interface_id = 'S';
609 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
610 io_header.dxfer_len = sizeof(buf);
611 io_header.dxferp = buf;
612 io_header.cmdp = cmd;
613 io_header.cmd_len = sizeof(cmd);
614 io_header.mx_sb_len = sizeof(sensebuf);
615 io_header.sbp = sensebuf;
616 io_header.timeout = 6000; /* XXX */
618 ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
619 if (ret < 0)
620 return -1;
622 return (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
625 static int get_stream_blocksize(BlockDriverState *bdrv)
627 uint8_t cmd[6];
628 uint8_t buf[12];
629 uint8_t sensebuf[8];
630 sg_io_hdr_t io_header;
631 int ret;
633 memset(cmd, 0, sizeof(cmd));
634 memset(buf, 0, sizeof(buf));
635 cmd[0] = MODE_SENSE;
636 cmd[4] = sizeof(buf);
638 memset(&io_header, 0, sizeof(io_header));
639 io_header.interface_id = 'S';
640 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
641 io_header.dxfer_len = sizeof(buf);
642 io_header.dxferp = buf;
643 io_header.cmdp = cmd;
644 io_header.cmd_len = sizeof(cmd);
645 io_header.mx_sb_len = sizeof(sensebuf);
646 io_header.sbp = sensebuf;
647 io_header.timeout = 6000; /* XXX */
649 ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
650 if (ret < 0)
651 return -1;
653 return (buf[9] << 16) | (buf[10] << 8) | buf[11];
656 static void scsi_destroy(SCSIDevice *d)
658 SCSIRequest *r, *n;
660 r = d->state->requests;
661 while (r) {
662 n = r->next;
663 qemu_free(r);
664 r = n;
667 r = free_requests;
668 while (r) {
669 n = r->next;
670 qemu_free(r);
671 r = n;
674 qemu_free(d->state);
675 qemu_free(d);
678 SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq,
679 scsi_completionfn completion, void *opaque)
681 int sg_version;
682 SCSIDevice *d;
683 SCSIDeviceState *s;
684 struct sg_scsi_id scsiid;
686 /* check we are really using a /dev/sg* file */
688 if (!bdrv_is_sg(bdrv))
689 return NULL;
691 /* check we are using a driver managing SG_IO (version 3 and after */
693 if (bdrv_ioctl(bdrv, SG_GET_VERSION_NUM, &sg_version) < 0 ||
694 sg_version < 30000)
695 return NULL;
697 /* get LUN of the /dev/sg? */
699 if (bdrv_ioctl(bdrv, SG_GET_SCSI_ID, &scsiid))
700 return NULL;
702 /* define device state */
704 s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
705 s->bdrv = bdrv;
706 s->requests = NULL;
707 s->completion = completion;
708 s->opaque = opaque;
709 s->lun = scsiid.lun;
710 DPRINTF("LUN %d\n", s->lun);
711 s->type = scsiid.scsi_type;
712 DPRINTF("device type %d\n", s->type);
713 if (s->type == TYPE_TAPE) {
714 s->blocksize = get_stream_blocksize(s->bdrv);
715 if (s->blocksize == -1)
716 s->blocksize = 0;
717 } else {
718 s->blocksize = get_blocksize(s->bdrv);
719 /* removable media returns 0 if not present */
720 if (s->blocksize <= 0) {
721 if (s->type == TYPE_ROM || s->type == TYPE_WORM)
722 s->blocksize = 2048;
723 else
724 s->blocksize = 512;
727 DPRINTF("block size %d\n", s->blocksize);
728 s->driver_status = 0;
729 memset(s->sensebuf, 0, sizeof(s->sensebuf));
731 /* define function to manage device */
733 d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
734 d->state = s;
735 d->destroy = scsi_destroy;
736 d->send_command = scsi_send_command;
737 d->read_data = scsi_read_data;
738 d->write_data = scsi_write_data;
739 d->cancel_io = scsi_cancel_io;
740 d->get_buf = scsi_get_buf;
742 return d;
744 #endif /* __linux__ */