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 "qemu-error.h"
24 #define DPRINTF(fmt, ...) \
25 do { printf("scsi-generic: " fmt , ## __VA_ARGS__); } while (0)
27 #define DPRINTF(fmt, ...) do {} while(0)
30 #define BADF(fmt, ...) \
31 do { fprintf(stderr, "scsi-generic: " fmt , ## __VA_ARGS__); } while (0)
34 #include <sys/types.h>
38 #include "scsi-defs.h"
40 #define SCSI_SENSE_BUF_SIZE 96
42 #define SG_ERR_DRIVER_TIMEOUT 0x06
43 #define SG_ERR_DRIVER_SENSE 0x08
46 #define MAX_UINT ((unsigned int)-1)
49 typedef struct SCSIGenericState SCSIGenericState
;
51 typedef struct SCSIGenericReq
{
56 sg_io_hdr_t io_header
;
59 struct SCSIGenericState
65 uint8_t sensebuf
[SCSI_SENSE_BUF_SIZE
];
69 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
)
73 req
= scsi_req_alloc(sizeof(SCSIGenericReq
), d
, tag
, lun
);
77 static void scsi_free_request(SCSIRequest
*req
)
79 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
84 /* Helper function for command completion. */
85 static void scsi_command_complete(void *opaque
, int ret
)
87 SCSIGenericReq
*r
= (SCSIGenericReq
*)opaque
;
88 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, r
->req
.dev
);
91 s
->driver_status
= r
->io_header
.driver_status
;
92 if (s
->driver_status
& SG_ERR_DRIVER_SENSE
)
93 s
->senselen
= r
->io_header
.sb_len_wr
;
98 if (s
->driver_status
& SG_ERR_DRIVER_TIMEOUT
) {
100 BADF("Driver Timeout\n");
101 } else if (r
->io_header
.status
)
102 r
->req
.status
= r
->io_header
.status
;
103 else if (s
->driver_status
& SG_ERR_DRIVER_SENSE
)
104 r
->req
.status
= CHECK_CONDITION
;
106 r
->req
.status
= GOOD
;
108 DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
109 r
, r
->req
.tag
, r
->req
.status
);
111 scsi_req_complete(&r
->req
);
114 /* Cancel a pending data transfer. */
115 static void scsi_cancel_io(SCSIRequest
*req
)
117 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
119 DPRINTF("Cancel tag=0x%x\n", req
->tag
);
121 bdrv_aio_cancel(r
->req
.aiocb
);
124 scsi_req_dequeue(&r
->req
);
127 static int execute_command(BlockDriverState
*bdrv
,
128 SCSIGenericReq
*r
, int direction
,
129 BlockDriverCompletionFunc
*complete
)
131 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, r
->req
.dev
);
133 r
->io_header
.interface_id
= 'S';
134 r
->io_header
.dxfer_direction
= direction
;
135 r
->io_header
.dxferp
= r
->buf
;
136 r
->io_header
.dxfer_len
= r
->buflen
;
137 r
->io_header
.cmdp
= r
->req
.cmd
.buf
;
138 r
->io_header
.cmd_len
= r
->req
.cmd
.len
;
139 r
->io_header
.mx_sb_len
= sizeof(s
->sensebuf
);
140 r
->io_header
.sbp
= s
->sensebuf
;
141 r
->io_header
.timeout
= MAX_UINT
;
142 r
->io_header
.usr_ptr
= r
;
143 r
->io_header
.flags
|= SG_FLAG_DIRECT_IO
;
145 r
->req
.aiocb
= bdrv_aio_ioctl(bdrv
, SG_IO
, &r
->io_header
, complete
, r
);
146 if (r
->req
.aiocb
== NULL
) {
147 BADF("execute_command: read failed !\n");
154 static void scsi_read_complete(void * opaque
, int ret
)
156 SCSIGenericReq
*r
= (SCSIGenericReq
*)opaque
;
161 DPRINTF("IO error ret %d\n", ret
);
162 scsi_command_complete(r
, ret
);
165 len
= r
->io_header
.dxfer_len
- r
->io_header
.resid
;
166 DPRINTF("Data ready tag=0x%x len=%d\n", r
->req
.tag
, len
);
170 scsi_command_complete(r
, 0);
172 scsi_req_data(&r
->req
, len
);
176 /* Read more data from scsi device into buffer. */
177 static void scsi_read_data(SCSIRequest
*req
)
179 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
180 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, r
->req
.dev
);
183 DPRINTF("scsi_read_data 0x%x\n", req
->tag
);
185 scsi_command_complete(r
, 0);
189 if (r
->req
.cmd
.buf
[0] == REQUEST_SENSE
&& s
->driver_status
& SG_ERR_DRIVER_SENSE
)
191 s
->senselen
= MIN(r
->len
, s
->senselen
);
192 memcpy(r
->buf
, s
->sensebuf
, s
->senselen
);
193 r
->io_header
.driver_status
= 0;
194 r
->io_header
.status
= 0;
195 r
->io_header
.dxfer_len
= s
->senselen
;
197 DPRINTF("Data ready tag=0x%x len=%d\n", r
->req
.tag
, s
->senselen
);
198 DPRINTF("Sense: %d %d %d %d %d %d %d %d\n",
199 r
->buf
[0], r
->buf
[1], r
->buf
[2], r
->buf
[3],
200 r
->buf
[4], r
->buf
[5], r
->buf
[6], r
->buf
[7]);
201 scsi_req_data(&r
->req
, s
->senselen
);
205 ret
= execute_command(s
->bs
, r
, SG_DXFER_FROM_DEV
, scsi_read_complete
);
207 scsi_command_complete(r
, -EINVAL
);
212 static void scsi_write_complete(void * opaque
, int ret
)
214 SCSIGenericReq
*r
= (SCSIGenericReq
*)opaque
;
215 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, r
->req
.dev
);
217 DPRINTF("scsi_write_complete() ret = %d\n", ret
);
220 DPRINTF("IO error\n");
221 scsi_command_complete(r
, ret
);
225 if (r
->req
.cmd
.buf
[0] == MODE_SELECT
&& r
->req
.cmd
.buf
[4] == 12 &&
226 s
->qdev
.type
== TYPE_TAPE
) {
227 s
->qdev
.blocksize
= (r
->buf
[9] << 16) | (r
->buf
[10] << 8) | r
->buf
[11];
228 DPRINTF("block size %d\n", s
->qdev
.blocksize
);
231 scsi_command_complete(r
, ret
);
234 /* Write data to a scsi device. Returns nonzero on failure.
235 The transfer may complete asynchronously. */
236 static int scsi_write_data(SCSIRequest
*req
)
238 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, req
->dev
);
239 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
242 DPRINTF("scsi_write_data 0x%x\n", req
->tag
);
245 scsi_req_data(&r
->req
, r
->len
);
249 ret
= execute_command(s
->bs
, r
, SG_DXFER_TO_DEV
, scsi_write_complete
);
251 scsi_command_complete(r
, -EINVAL
);
258 /* Return a pointer to the data buffer. */
259 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
261 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
266 static void scsi_req_fixup(SCSIRequest
*req
)
268 switch(req
->cmd
.buf
[0]) {
270 req
->cmd
.buf
[1] &= ~0x08; /* disable FUA */
273 req
->cmd
.buf
[1] &= ~0x08; /* disable FUA */
277 if (req
->dev
->type
== TYPE_TAPE
) {
278 /* force IMMED, otherwise qemu waits end of command */
279 req
->cmd
.buf
[1] = 0x01;
285 /* Execute a scsi command. Returns the length of the data expected by the
286 command. This will be Positive for data transfers from the device
287 (eg. disk reads), negative for transfers to the device (eg. disk writes),
288 and zero if the command does not transfer any data. */
290 static int32_t scsi_send_command(SCSIRequest
*req
, uint8_t *cmd
)
292 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, req
->dev
);
293 SCSIGenericReq
*r
= DO_UPCAST(SCSIGenericReq
, req
, req
);
297 scsi_req_enqueue(req
);
298 if (cmd
[0] != REQUEST_SENSE
&&
299 (req
->lun
!= s
->lun
|| (cmd
[1] >> 5) != s
->lun
)) {
300 DPRINTF("Unimplemented LUN %d\n", req
->lun
? req
->lun
: cmd
[1] >> 5);
302 s
->sensebuf
[0] = 0x70;
303 s
->sensebuf
[1] = 0x00;
304 s
->sensebuf
[2] = ILLEGAL_REQUEST
;
305 s
->sensebuf
[3] = 0x00;
306 s
->sensebuf
[4] = 0x00;
307 s
->sensebuf
[5] = 0x00;
308 s
->sensebuf
[6] = 0x00;
310 s
->driver_status
= SG_ERR_DRIVER_SENSE
;
311 bus
= scsi_bus_from_device(&s
->qdev
);
312 bus
->ops
->complete(req
, SCSI_REASON_DONE
, CHECK_CONDITION
);
316 if (-1 == scsi_req_parse(&r
->req
, cmd
)) {
317 BADF("Unsupported command length, command %x\n", cmd
[0]);
318 scsi_req_dequeue(&r
->req
);
319 scsi_req_unref(&r
->req
);
322 scsi_req_fixup(&r
->req
);
324 DPRINTF("Command: lun=%d tag=0x%x len %zd data=0x%02x", lun
, tag
,
325 r
->req
.cmd
.xfer
, cmd
[0]);
330 for (i
= 1; i
< r
->req
.cmd
.len
; i
++) {
331 printf(" 0x%02x", cmd
[i
]);
337 if (r
->req
.cmd
.xfer
== 0) {
342 ret
= execute_command(s
->bs
, r
, SG_DXFER_NONE
, scsi_command_complete
);
344 scsi_command_complete(r
, -EINVAL
);
349 if (r
->buflen
!= r
->req
.cmd
.xfer
) {
352 r
->buf
= qemu_malloc(r
->req
.cmd
.xfer
);
353 r
->buflen
= r
->req
.cmd
.xfer
;
356 memset(r
->buf
, 0, r
->buflen
);
357 r
->len
= r
->req
.cmd
.xfer
;
358 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
360 return -r
->req
.cmd
.xfer
;
362 return r
->req
.cmd
.xfer
;
366 static int get_blocksize(BlockDriverState
*bdrv
)
371 sg_io_hdr_t io_header
;
374 memset(cmd
, 0, sizeof(cmd
));
375 memset(buf
, 0, sizeof(buf
));
376 cmd
[0] = READ_CAPACITY
;
378 memset(&io_header
, 0, sizeof(io_header
));
379 io_header
.interface_id
= 'S';
380 io_header
.dxfer_direction
= SG_DXFER_FROM_DEV
;
381 io_header
.dxfer_len
= sizeof(buf
);
382 io_header
.dxferp
= buf
;
383 io_header
.cmdp
= cmd
;
384 io_header
.cmd_len
= sizeof(cmd
);
385 io_header
.mx_sb_len
= sizeof(sensebuf
);
386 io_header
.sbp
= sensebuf
;
387 io_header
.timeout
= 6000; /* XXX */
389 ret
= bdrv_ioctl(bdrv
, SG_IO
, &io_header
);
393 return (buf
[4] << 24) | (buf
[5] << 16) | (buf
[6] << 8) | buf
[7];
396 static int get_stream_blocksize(BlockDriverState
*bdrv
)
401 sg_io_hdr_t io_header
;
404 memset(cmd
, 0, sizeof(cmd
));
405 memset(buf
, 0, sizeof(buf
));
407 cmd
[4] = sizeof(buf
);
409 memset(&io_header
, 0, sizeof(io_header
));
410 io_header
.interface_id
= 'S';
411 io_header
.dxfer_direction
= SG_DXFER_FROM_DEV
;
412 io_header
.dxfer_len
= sizeof(buf
);
413 io_header
.dxferp
= buf
;
414 io_header
.cmdp
= cmd
;
415 io_header
.cmd_len
= sizeof(cmd
);
416 io_header
.mx_sb_len
= sizeof(sensebuf
);
417 io_header
.sbp
= sensebuf
;
418 io_header
.timeout
= 6000; /* XXX */
420 ret
= bdrv_ioctl(bdrv
, SG_IO
, &io_header
);
424 return (buf
[9] << 16) | (buf
[10] << 8) | buf
[11];
427 static void scsi_generic_purge_requests(SCSIGenericState
*s
)
431 while (!QTAILQ_EMPTY(&s
->qdev
.requests
)) {
432 r
= DO_UPCAST(SCSIGenericReq
, req
, QTAILQ_FIRST(&s
->qdev
.requests
));
434 bdrv_aio_cancel(r
->req
.aiocb
);
436 scsi_req_dequeue(&r
->req
);
437 scsi_req_unref(&r
->req
);
441 static void scsi_generic_reset(DeviceState
*dev
)
443 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
.qdev
, dev
);
445 scsi_generic_purge_requests(s
);
448 static void scsi_destroy(SCSIDevice
*d
)
450 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, d
);
452 scsi_generic_purge_requests(s
);
453 blockdev_mark_auto_del(s
->qdev
.conf
.bs
);
456 static int scsi_generic_initfn(SCSIDevice
*dev
)
458 SCSIGenericState
*s
= DO_UPCAST(SCSIGenericState
, qdev
, dev
);
460 struct sg_scsi_id scsiid
;
462 if (!s
->qdev
.conf
.bs
) {
463 error_report("scsi-generic: drive property not set");
466 s
->bs
= s
->qdev
.conf
.bs
;
468 /* check we are really using a /dev/sg* file */
469 if (!bdrv_is_sg(s
->bs
)) {
470 error_report("scsi-generic: not /dev/sg*");
474 if (bdrv_get_on_error(s
->bs
, 0) != BLOCK_ERR_STOP_ENOSPC
) {
475 error_report("Device doesn't support drive option werror");
478 if (bdrv_get_on_error(s
->bs
, 1) != BLOCK_ERR_REPORT
) {
479 error_report("Device doesn't support drive option rerror");
483 /* check we are using a driver managing SG_IO (version 3 and after */
484 if (bdrv_ioctl(s
->bs
, SG_GET_VERSION_NUM
, &sg_version
) < 0 ||
485 sg_version
< 30000) {
486 error_report("scsi-generic: scsi generic interface too old");
490 /* get LUN of the /dev/sg? */
491 if (bdrv_ioctl(s
->bs
, SG_GET_SCSI_ID
, &scsiid
)) {
492 error_report("scsi-generic: SG_GET_SCSI_ID ioctl failed");
496 /* define device state */
498 DPRINTF("LUN %d\n", s
->lun
);
499 s
->qdev
.type
= scsiid
.scsi_type
;
500 DPRINTF("device type %d\n", s
->qdev
.type
);
501 if (s
->qdev
.type
== TYPE_TAPE
) {
502 s
->qdev
.blocksize
= get_stream_blocksize(s
->bs
);
503 if (s
->qdev
.blocksize
== -1)
504 s
->qdev
.blocksize
= 0;
506 s
->qdev
.blocksize
= get_blocksize(s
->bs
);
507 /* removable media returns 0 if not present */
508 if (s
->qdev
.blocksize
<= 0) {
509 if (s
->qdev
.type
== TYPE_ROM
|| s
->qdev
.type
== TYPE_WORM
)
510 s
->qdev
.blocksize
= 2048;
512 s
->qdev
.blocksize
= 512;
515 DPRINTF("block size %d\n", s
->qdev
.blocksize
);
516 s
->driver_status
= 0;
517 memset(s
->sensebuf
, 0, sizeof(s
->sensebuf
));
518 bdrv_set_removable(s
->bs
, 0);
522 static SCSIDeviceInfo scsi_generic_info
= {
523 .qdev
.name
= "scsi-generic",
524 .qdev
.desc
= "pass through generic scsi device (/dev/sg*)",
525 .qdev
.size
= sizeof(SCSIGenericState
),
526 .qdev
.reset
= scsi_generic_reset
,
527 .init
= scsi_generic_initfn
,
528 .destroy
= scsi_destroy
,
529 .alloc_req
= scsi_new_request
,
530 .free_req
= scsi_free_request
,
531 .send_command
= scsi_send_command
,
532 .read_data
= scsi_read_data
,
533 .write_data
= scsi_write_data
,
534 .cancel_io
= scsi_cancel_io
,
535 .get_buf
= scsi_get_buf
,
536 .qdev
.props
= (Property
[]) {
537 DEFINE_BLOCK_PROPERTIES(SCSIGenericState
, qdev
.conf
),
538 DEFINE_PROP_END_OF_LIST(),
542 static void scsi_generic_register_devices(void)
544 scsi_qdev_register(&scsi_generic_info
);
546 device_init(scsi_generic_register_devices
)
548 #endif /* __linux__ */