xref: /openbmc/qemu/hw/scsi/scsi-generic.c (revision f6476697)
1 /*
2  * Generic SCSI Device support
3  *
4  * Copyright (c) 2007 Bull S.A.S.
5  * Based on code by Paul Brook
6  * Based on code by Fabrice Bellard
7  *
8  * Written by Laurent Vivier <Laurent.Vivier@bull.net>
9  *
10  * This code is licensed under the LGPL.
11  *
12  */
13 
14 #include "qemu/osdep.h"
15 #include "qapi/error.h"
16 #include "qemu/ctype.h"
17 #include "qemu/error-report.h"
18 #include "qemu/module.h"
19 #include "hw/scsi/scsi.h"
20 #include "migration/qemu-file-types.h"
21 #include "hw/qdev-properties.h"
22 #include "hw/qdev-properties-system.h"
23 #include "hw/scsi/emulation.h"
24 #include "sysemu/block-backend.h"
25 #include "trace.h"
26 
27 #ifdef __linux__
28 
29 #include <scsi/sg.h>
30 #include "scsi/constants.h"
31 
32 #ifndef MAX_UINT
33 #define MAX_UINT ((unsigned int)-1)
34 #endif
35 
36 typedef struct SCSIGenericReq {
37     SCSIRequest req;
38     uint8_t *buf;
39     int buflen;
40     int len;
41     sg_io_hdr_t io_header;
42 } SCSIGenericReq;
43 
44 static void scsi_generic_save_request(QEMUFile *f, SCSIRequest *req)
45 {
46     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
47 
48     qemu_put_sbe32s(f, &r->buflen);
49     if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
50         assert(!r->req.sg);
51         qemu_put_buffer(f, r->buf, r->req.cmd.xfer);
52     }
53 }
54 
55 static void scsi_generic_load_request(QEMUFile *f, SCSIRequest *req)
56 {
57     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
58 
59     qemu_get_sbe32s(f, &r->buflen);
60     if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
61         assert(!r->req.sg);
62         qemu_get_buffer(f, r->buf, r->req.cmd.xfer);
63     }
64 }
65 
66 static void scsi_free_request(SCSIRequest *req)
67 {
68     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
69 
70     g_free(r->buf);
71 }
72 
73 /* Helper function for command completion.  */
74 static void scsi_command_complete_noio(SCSIGenericReq *r, int ret)
75 {
76     int status;
77     SCSISense sense;
78     sg_io_hdr_t *io_hdr = &r->io_header;
79 
80     assert(r->req.aiocb == NULL);
81 
82     if (r->req.io_canceled) {
83         scsi_req_cancel_complete(&r->req);
84         goto done;
85     }
86     if (ret < 0) {
87         status = scsi_sense_from_errno(-ret, &sense);
88         if (status == CHECK_CONDITION) {
89             scsi_req_build_sense(&r->req, sense);
90         }
91     } else if (io_hdr->host_status != SCSI_HOST_OK) {
92         scsi_req_complete_failed(&r->req, io_hdr->host_status);
93         goto done;
94     } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) {
95         status = BUSY;
96     } else {
97         status = io_hdr->status;
98         if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) {
99             r->req.sense_len = io_hdr->sb_len_wr;
100         }
101     }
102     trace_scsi_generic_command_complete_noio(r, r->req.tag, status);
103 
104     scsi_req_complete(&r->req, status);
105 done:
106     scsi_req_unref(&r->req);
107 }
108 
109 static void scsi_command_complete(void *opaque, int ret)
110 {
111     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
112     SCSIDevice *s = r->req.dev;
113 
114     assert(r->req.aiocb != NULL);
115     r->req.aiocb = NULL;
116 
117     aio_context_acquire(blk_get_aio_context(s->conf.blk));
118     scsi_command_complete_noio(r, ret);
119     aio_context_release(blk_get_aio_context(s->conf.blk));
120 }
121 
122 static int execute_command(BlockBackend *blk,
123                            SCSIGenericReq *r, int direction,
124                            BlockCompletionFunc *complete)
125 {
126     SCSIDevice *s = r->req.dev;
127 
128     r->io_header.interface_id = 'S';
129     r->io_header.dxfer_direction = direction;
130     r->io_header.dxferp = r->buf;
131     r->io_header.dxfer_len = r->buflen;
132     r->io_header.cmdp = r->req.cmd.buf;
133     r->io_header.cmd_len = r->req.cmd.len;
134     r->io_header.mx_sb_len = sizeof(r->req.sense);
135     r->io_header.sbp = r->req.sense;
136     r->io_header.timeout = s->io_timeout * 1000;
137     r->io_header.usr_ptr = r;
138     r->io_header.flags |= SG_FLAG_DIRECT_IO;
139 
140     trace_scsi_generic_aio_sgio_command(r->req.tag, r->req.cmd.buf[0],
141                                         r->io_header.timeout);
142     r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
143     if (r->req.aiocb == NULL) {
144         return -EIO;
145     }
146 
147     return 0;
148 }
149 
150 static int scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s, int len)
151 {
152     uint8_t page, page_idx;
153 
154     /*
155      *  EVPD set to zero returns the standard INQUIRY data.
156      *
157      *  Check if scsi_version is unset (-1) to avoid re-defining it
158      *  each time an INQUIRY with standard data is received.
159      *  scsi_version is initialized with -1 in scsi_generic_reset
160      *  and scsi_disk_reset, making sure that we'll set the
161      *  scsi_version after a reset. If the version field of the
162      *  INQUIRY response somehow changes after a guest reboot,
163      *  we'll be able to keep track of it.
164      *
165      *  On SCSI-2 and older, first 3 bits of byte 2 is the
166      *  ANSI-approved version, while on later versions the
167      *  whole byte 2 contains the version. Check if we're dealing
168      *  with a newer version and, in that case, assign the
169      *  whole byte.
170      */
171     if (s->scsi_version == -1 && !(r->req.cmd.buf[1] & 0x01)) {
172         s->scsi_version = r->buf[2] & 0x07;
173         if (s->scsi_version > 2) {
174             s->scsi_version = r->buf[2];
175         }
176     }
177 
178     if ((s->type == TYPE_DISK || s->type == TYPE_ZBC) &&
179         (r->req.cmd.buf[1] & 0x01)) {
180         page = r->req.cmd.buf[2];
181         if (page == 0xb0) {
182             uint32_t max_transfer =
183                 blk_get_max_transfer(s->conf.blk) / s->blocksize;
184 
185             assert(max_transfer);
186             stl_be_p(&r->buf[8], max_transfer);
187             /* Also take care of the opt xfer len. */
188             stl_be_p(&r->buf[12],
189                     MIN_NON_ZERO(max_transfer, ldl_be_p(&r->buf[12])));
190         } else if (s->needs_vpd_bl_emulation && page == 0x00 && r->buflen >= 4) {
191             /*
192              * Now we're capable of supplying the VPD Block Limits
193              * response if the hardware can't. Add it in the INQUIRY
194              * Supported VPD pages response in case we are using the
195              * emulation for this device.
196              *
197              * This way, the guest kernel will be aware of the support
198              * and will use it to proper setup the SCSI device.
199              *
200              * VPD page numbers must be sorted, so insert 0xb0 at the
201              * right place with an in-place insert.  When the while loop
202              * begins the device response is at r[0] to r[page_idx - 1].
203              */
204             page_idx = lduw_be_p(r->buf + 2) + 4;
205             page_idx = MIN(page_idx, r->buflen);
206             while (page_idx > 4 && r->buf[page_idx - 1] >= 0xb0) {
207                 if (page_idx < r->buflen) {
208                     r->buf[page_idx] = r->buf[page_idx - 1];
209                 }
210                 page_idx--;
211             }
212             if (page_idx < r->buflen) {
213                 r->buf[page_idx] = 0xb0;
214             }
215             stw_be_p(r->buf + 2, lduw_be_p(r->buf + 2) + 1);
216 
217             if (len < r->buflen) {
218                 len++;
219             }
220         }
221     }
222     return len;
223 }
224 
225 static int scsi_generic_emulate_block_limits(SCSIGenericReq *r, SCSIDevice *s)
226 {
227     int len;
228     uint8_t buf[64];
229 
230     SCSIBlockLimits bl = {
231         .max_io_sectors = blk_get_max_transfer(s->conf.blk) / s->blocksize
232     };
233 
234     memset(r->buf, 0, r->buflen);
235     stb_p(buf, s->type);
236     stb_p(buf + 1, 0xb0);
237     len = scsi_emulate_block_limits(buf + 4, &bl);
238     assert(len <= sizeof(buf) - 4);
239     stw_be_p(buf + 2, len);
240 
241     memcpy(r->buf, buf, MIN(r->buflen, len + 4));
242 
243     r->io_header.sb_len_wr = 0;
244 
245     /*
246     * We have valid contents in the reply buffer but the
247     * io_header can report a sense error coming from
248     * the hardware in scsi_command_complete_noio. Clean
249     * up the io_header to avoid reporting it.
250     */
251     r->io_header.driver_status = 0;
252     r->io_header.status = 0;
253 
254     return r->buflen;
255 }
256 
257 static void scsi_read_complete(void * opaque, int ret)
258 {
259     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
260     SCSIDevice *s = r->req.dev;
261     int len;
262 
263     assert(r->req.aiocb != NULL);
264     r->req.aiocb = NULL;
265 
266     aio_context_acquire(blk_get_aio_context(s->conf.blk));
267 
268     if (ret || r->req.io_canceled) {
269         scsi_command_complete_noio(r, ret);
270         goto done;
271     }
272 
273     len = r->io_header.dxfer_len - r->io_header.resid;
274     trace_scsi_generic_read_complete(r->req.tag, len);
275 
276     r->len = -1;
277 
278     if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
279         SCSISense sense =
280             scsi_parse_sense_buf(r->req.sense, r->io_header.sb_len_wr);
281 
282         /*
283          * Check if this is a VPD Block Limits request that
284          * resulted in sense error but would need emulation.
285          * In this case, emulate a valid VPD response.
286          */
287         if (sense.key == ILLEGAL_REQUEST &&
288             s->needs_vpd_bl_emulation &&
289             r->req.cmd.buf[0] == INQUIRY &&
290             (r->req.cmd.buf[1] & 0x01) &&
291             r->req.cmd.buf[2] == 0xb0) {
292             len = scsi_generic_emulate_block_limits(r, s);
293             /*
294              * It's okay to jup to req_complete: no need to
295              * let scsi_handle_inquiry_reply handle an
296              * INQUIRY VPD BL request we created manually.
297              */
298         }
299         if (sense.key) {
300             goto req_complete;
301         }
302     }
303 
304     if (r->io_header.host_status != SCSI_HOST_OK ||
305         (r->io_header.driver_status & SG_ERR_DRIVER_TIMEOUT) ||
306         r->io_header.status != GOOD ||
307         len == 0) {
308         scsi_command_complete_noio(r, 0);
309         goto done;
310     }
311 
312     /* Snoop READ CAPACITY output to set the blocksize.  */
313     if (r->req.cmd.buf[0] == READ_CAPACITY_10 &&
314         (ldl_be_p(&r->buf[0]) != 0xffffffffU || s->max_lba == 0)) {
315         s->blocksize = ldl_be_p(&r->buf[4]);
316         s->max_lba = ldl_be_p(&r->buf[0]) & 0xffffffffULL;
317     } else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 &&
318                (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
319         s->blocksize = ldl_be_p(&r->buf[8]);
320         s->max_lba = ldq_be_p(&r->buf[0]);
321     }
322     blk_set_guest_block_size(s->conf.blk, s->blocksize);
323 
324     /*
325      * Patch MODE SENSE device specific parameters if the BDS is opened
326      * readonly.
327      */
328     if ((s->type == TYPE_DISK || s->type == TYPE_TAPE || s->type == TYPE_ZBC) &&
329         !blk_is_writable(s->conf.blk) &&
330         (r->req.cmd.buf[0] == MODE_SENSE ||
331          r->req.cmd.buf[0] == MODE_SENSE_10) &&
332         (r->req.cmd.buf[1] & 0x8) == 0) {
333         if (r->req.cmd.buf[0] == MODE_SENSE) {
334             r->buf[2] |= 0x80;
335         } else  {
336             r->buf[3] |= 0x80;
337         }
338     }
339     if (r->req.cmd.buf[0] == INQUIRY) {
340         len = scsi_handle_inquiry_reply(r, s, len);
341     }
342 
343 req_complete:
344     scsi_req_data(&r->req, len);
345     scsi_req_unref(&r->req);
346 
347 done:
348     aio_context_release(blk_get_aio_context(s->conf.blk));
349 }
350 
351 /* Read more data from scsi device into buffer.  */
352 static void scsi_read_data(SCSIRequest *req)
353 {
354     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
355     SCSIDevice *s = r->req.dev;
356     int ret;
357 
358     trace_scsi_generic_read_data(req->tag);
359 
360     /* The request is used as the AIO opaque value, so add a ref.  */
361     scsi_req_ref(&r->req);
362     if (r->len == -1) {
363         scsi_command_complete_noio(r, 0);
364         return;
365     }
366 
367     ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
368                           scsi_read_complete);
369     if (ret < 0) {
370         scsi_command_complete_noio(r, ret);
371     }
372 }
373 
374 static void scsi_write_complete(void * opaque, int ret)
375 {
376     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
377     SCSIDevice *s = r->req.dev;
378 
379     trace_scsi_generic_write_complete(ret);
380 
381     assert(r->req.aiocb != NULL);
382     r->req.aiocb = NULL;
383 
384     aio_context_acquire(blk_get_aio_context(s->conf.blk));
385 
386     if (ret || r->req.io_canceled) {
387         scsi_command_complete_noio(r, ret);
388         goto done;
389     }
390 
391     if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 &&
392         s->type == TYPE_TAPE) {
393         s->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
394         trace_scsi_generic_write_complete_blocksize(s->blocksize);
395     }
396 
397     scsi_command_complete_noio(r, ret);
398 
399 done:
400     aio_context_release(blk_get_aio_context(s->conf.blk));
401 }
402 
403 /* Write data to a scsi device.  Returns nonzero on failure.
404    The transfer may complete asynchronously.  */
405 static void scsi_write_data(SCSIRequest *req)
406 {
407     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
408     SCSIDevice *s = r->req.dev;
409     int ret;
410 
411     trace_scsi_generic_write_data(req->tag);
412     if (r->len == 0) {
413         r->len = r->buflen;
414         scsi_req_data(&r->req, r->len);
415         return;
416     }
417 
418     /* The request is used as the AIO opaque value, so add a ref.  */
419     scsi_req_ref(&r->req);
420     ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete);
421     if (ret < 0) {
422         scsi_command_complete_noio(r, ret);
423     }
424 }
425 
426 /* Return a pointer to the data buffer.  */
427 static uint8_t *scsi_get_buf(SCSIRequest *req)
428 {
429     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
430 
431     return r->buf;
432 }
433 
434 static void scsi_generic_command_dump(uint8_t *cmd, int len)
435 {
436     int i;
437     char *line_buffer, *p;
438 
439     line_buffer = g_malloc(len * 5 + 1);
440 
441     for (i = 0, p = line_buffer; i < len; i++) {
442         p += sprintf(p, " 0x%02x", cmd[i]);
443     }
444     trace_scsi_generic_send_command(line_buffer);
445 
446     g_free(line_buffer);
447 }
448 
449 /* Execute a scsi command.  Returns the length of the data expected by the
450    command.  This will be Positive for data transfers from the device
451    (eg. disk reads), negative for transfers to the device (eg. disk writes),
452    and zero if the command does not transfer any data.  */
453 
454 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
455 {
456     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
457     SCSIDevice *s = r->req.dev;
458     int ret;
459 
460     if (trace_event_get_state_backends(TRACE_SCSI_GENERIC_SEND_COMMAND)) {
461         scsi_generic_command_dump(cmd, r->req.cmd.len);
462     }
463 
464     if (r->req.cmd.xfer == 0) {
465         g_free(r->buf);
466         r->buflen = 0;
467         r->buf = NULL;
468         /* The request is used as the AIO opaque value, so add a ref.  */
469         scsi_req_ref(&r->req);
470         ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
471                               scsi_command_complete);
472         if (ret < 0) {
473             scsi_command_complete_noio(r, ret);
474             return 0;
475         }
476         return 0;
477     }
478 
479     if (r->buflen != r->req.cmd.xfer) {
480         g_free(r->buf);
481         r->buf = g_malloc(r->req.cmd.xfer);
482         r->buflen = r->req.cmd.xfer;
483     }
484 
485     memset(r->buf, 0, r->buflen);
486     r->len = r->req.cmd.xfer;
487     if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
488         r->len = 0;
489         return -r->req.cmd.xfer;
490     } else {
491         return r->req.cmd.xfer;
492     }
493 }
494 
495 static int read_naa_id(const uint8_t *p, uint64_t *p_wwn)
496 {
497     int i;
498 
499     if ((p[1] & 0xF) == 3) {
500         /* NAA designator type */
501         if (p[3] != 8) {
502             return -EINVAL;
503         }
504         *p_wwn = ldq_be_p(p + 4);
505         return 0;
506     }
507 
508     if ((p[1] & 0xF) == 8) {
509         /* SCSI name string designator type */
510         if (p[3] < 20 || memcmp(&p[4], "naa.", 4)) {
511             return -EINVAL;
512         }
513         if (p[3] > 20 && p[24] != ',') {
514             return -EINVAL;
515         }
516         *p_wwn = 0;
517         for (i = 8; i < 24; i++) {
518             char c = qemu_toupper(p[i]);
519             c -= (c >= '0' && c <= '9' ? '0' : 'A' - 10);
520             *p_wwn = (*p_wwn << 4) | c;
521         }
522         return 0;
523     }
524 
525     return -EINVAL;
526 }
527 
528 int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
529                         uint8_t *buf, uint8_t buf_size, uint32_t timeout)
530 {
531     sg_io_hdr_t io_header;
532     uint8_t sensebuf[8];
533     int ret;
534 
535     memset(&io_header, 0, sizeof(io_header));
536     io_header.interface_id = 'S';
537     io_header.dxfer_direction = SG_DXFER_FROM_DEV;
538     io_header.dxfer_len = buf_size;
539     io_header.dxferp = buf;
540     io_header.cmdp = cmd;
541     io_header.cmd_len = cmd_size;
542     io_header.mx_sb_len = sizeof(sensebuf);
543     io_header.sbp = sensebuf;
544     io_header.timeout = timeout * 1000;
545 
546     trace_scsi_generic_ioctl_sgio_command(cmd[0], io_header.timeout);
547     ret = blk_ioctl(blk, SG_IO, &io_header);
548     if (ret < 0 || io_header.status ||
549         io_header.driver_status || io_header.host_status) {
550         trace_scsi_generic_ioctl_sgio_done(cmd[0], ret, io_header.status,
551                                            io_header.host_status);
552         return -1;
553     }
554     return 0;
555 }
556 
557 /*
558  * Executes an INQUIRY request with EVPD set to retrieve the
559  * available VPD pages of the device. If the device does
560  * not support the Block Limits page (page 0xb0), set
561  * the needs_vpd_bl_emulation flag for future use.
562  */
563 static void scsi_generic_set_vpd_bl_emulation(SCSIDevice *s)
564 {
565     uint8_t cmd[6];
566     uint8_t buf[250];
567     uint8_t page_len;
568     int ret, i;
569 
570     memset(cmd, 0, sizeof(cmd));
571     memset(buf, 0, sizeof(buf));
572     cmd[0] = INQUIRY;
573     cmd[1] = 1;
574     cmd[2] = 0x00;
575     cmd[4] = sizeof(buf);
576 
577     ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
578                               buf, sizeof(buf), s->io_timeout);
579     if (ret < 0) {
580         /*
581          * Do not assume anything if we can't retrieve the
582          * INQUIRY response to assert the VPD Block Limits
583          * support.
584          */
585         s->needs_vpd_bl_emulation = false;
586         return;
587     }
588 
589     page_len = buf[3];
590     for (i = 4; i < MIN(sizeof(buf), page_len + 4); i++) {
591         if (buf[i] == 0xb0) {
592             s->needs_vpd_bl_emulation = false;
593             return;
594         }
595     }
596     s->needs_vpd_bl_emulation = true;
597 }
598 
599 static void scsi_generic_read_device_identification(SCSIDevice *s)
600 {
601     uint8_t cmd[6];
602     uint8_t buf[250];
603     int ret;
604     int i, len;
605 
606     memset(cmd, 0, sizeof(cmd));
607     memset(buf, 0, sizeof(buf));
608     cmd[0] = INQUIRY;
609     cmd[1] = 1;
610     cmd[2] = 0x83;
611     cmd[4] = sizeof(buf);
612 
613     ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
614                               buf, sizeof(buf), s->io_timeout);
615     if (ret < 0) {
616         return;
617     }
618 
619     len = MIN((buf[2] << 8) | buf[3], sizeof(buf) - 4);
620     for (i = 0; i + 3 <= len; ) {
621         const uint8_t *p = &buf[i + 4];
622         uint64_t wwn;
623 
624         if (i + (p[3] + 4) > len) {
625             break;
626         }
627 
628         if ((p[1] & 0x10) == 0) {
629             /* Associated with the logical unit */
630             if (read_naa_id(p, &wwn) == 0) {
631                 s->wwn = wwn;
632             }
633         } else if ((p[1] & 0x10) == 0x10) {
634             /* Associated with the target port */
635             if (read_naa_id(p, &wwn) == 0) {
636                 s->port_wwn = wwn;
637             }
638         }
639 
640         i += p[3] + 4;
641     }
642 }
643 
644 void scsi_generic_read_device_inquiry(SCSIDevice *s)
645 {
646     scsi_generic_read_device_identification(s);
647     if (s->type == TYPE_DISK || s->type == TYPE_ZBC) {
648         scsi_generic_set_vpd_bl_emulation(s);
649     } else {
650         s->needs_vpd_bl_emulation = false;
651     }
652 }
653 
654 static int get_stream_blocksize(BlockBackend *blk)
655 {
656     uint8_t cmd[6];
657     uint8_t buf[12];
658     int ret;
659 
660     memset(cmd, 0, sizeof(cmd));
661     memset(buf, 0, sizeof(buf));
662     cmd[0] = MODE_SENSE;
663     cmd[4] = sizeof(buf);
664 
665     ret = scsi_SG_IO_FROM_DEV(blk, cmd, sizeof(cmd), buf, sizeof(buf), 6);
666     if (ret < 0) {
667         return -1;
668     }
669 
670     return (buf[9] << 16) | (buf[10] << 8) | buf[11];
671 }
672 
673 static void scsi_generic_reset(DeviceState *dev)
674 {
675     SCSIDevice *s = SCSI_DEVICE(dev);
676 
677     s->scsi_version = s->default_scsi_version;
678     scsi_device_purge_requests(s, SENSE_CODE(RESET));
679 }
680 
681 static void scsi_generic_realize(SCSIDevice *s, Error **errp)
682 {
683     int rc;
684     int sg_version;
685     struct sg_scsi_id scsiid;
686 
687     if (!s->conf.blk) {
688         error_setg(errp, "drive property not set");
689         return;
690     }
691 
692     if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC &&
693         blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_REPORT) {
694         error_setg(errp, "Device doesn't support drive option werror");
695         return;
696     }
697     if (blk_get_on_error(s->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
698         error_setg(errp, "Device doesn't support drive option rerror");
699         return;
700     }
701 
702     /* check we are using a driver managing SG_IO (version 3 and after */
703     rc = blk_ioctl(s->conf.blk, SG_GET_VERSION_NUM, &sg_version);
704     if (rc < 0) {
705         error_setg_errno(errp, -rc, "cannot get SG_IO version number");
706         if (rc != -EPERM) {
707             error_append_hint(errp, "Is this a SCSI device?\n");
708         }
709         return;
710     }
711     if (sg_version < 30000) {
712         error_setg(errp, "scsi generic interface too old");
713         return;
714     }
715 
716     /* get LUN of the /dev/sg? */
717     if (blk_ioctl(s->conf.blk, SG_GET_SCSI_ID, &scsiid)) {
718         error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
719         return;
720     }
721     if (!blkconf_apply_backend_options(&s->conf,
722                                        !blk_supports_write_perm(s->conf.blk),
723                                        true, errp)) {
724         return;
725     }
726 
727     /* define device state */
728     s->type = scsiid.scsi_type;
729     trace_scsi_generic_realize_type(s->type);
730 
731     switch (s->type) {
732     case TYPE_TAPE:
733         s->blocksize = get_stream_blocksize(s->conf.blk);
734         if (s->blocksize == -1) {
735             s->blocksize = 0;
736         }
737         break;
738 
739         /* Make a guess for block devices, we'll fix it when the guest sends.
740          * READ CAPACITY.  If they don't, they likely would assume these sizes
741          * anyway. (TODO: they could also send MODE SENSE).
742          */
743     case TYPE_ROM:
744     case TYPE_WORM:
745         s->blocksize = 2048;
746         break;
747     default:
748         s->blocksize = 512;
749         break;
750     }
751 
752     trace_scsi_generic_realize_blocksize(s->blocksize);
753 
754     /* Only used by scsi-block, but initialize it nevertheless to be clean.  */
755     s->default_scsi_version = -1;
756     s->io_timeout = DEFAULT_IO_TIMEOUT;
757     scsi_generic_read_device_inquiry(s);
758 }
759 
760 const SCSIReqOps scsi_generic_req_ops = {
761     .size         = sizeof(SCSIGenericReq),
762     .free_req     = scsi_free_request,
763     .send_command = scsi_send_command,
764     .read_data    = scsi_read_data,
765     .write_data   = scsi_write_data,
766     .get_buf      = scsi_get_buf,
767     .load_request = scsi_generic_load_request,
768     .save_request = scsi_generic_save_request,
769 };
770 
771 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
772                                      uint8_t *buf, void *hba_private)
773 {
774     return scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
775 }
776 
777 static Property scsi_generic_properties[] = {
778     DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
779     DEFINE_PROP_BOOL("share-rw", SCSIDevice, conf.share_rw, false),
780     DEFINE_PROP_UINT32("io_timeout", SCSIDevice, io_timeout,
781                        DEFAULT_IO_TIMEOUT),
782     DEFINE_PROP_END_OF_LIST(),
783 };
784 
785 static int scsi_generic_parse_cdb(SCSIDevice *dev, SCSICommand *cmd,
786                                   uint8_t *buf, void *hba_private)
787 {
788     return scsi_bus_parse_cdb(dev, cmd, buf, hba_private);
789 }
790 
791 static void scsi_generic_class_initfn(ObjectClass *klass, void *data)
792 {
793     DeviceClass *dc = DEVICE_CLASS(klass);
794     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
795 
796     sc->realize      = scsi_generic_realize;
797     sc->alloc_req    = scsi_new_request;
798     sc->parse_cdb    = scsi_generic_parse_cdb;
799     dc->fw_name = "disk";
800     dc->desc = "pass through generic scsi device (/dev/sg*)";
801     dc->reset = scsi_generic_reset;
802     device_class_set_props(dc, scsi_generic_properties);
803     dc->vmsd  = &vmstate_scsi_device;
804 }
805 
806 static const TypeInfo scsi_generic_info = {
807     .name          = "scsi-generic",
808     .parent        = TYPE_SCSI_DEVICE,
809     .instance_size = sizeof(SCSIDevice),
810     .class_init    = scsi_generic_class_initfn,
811 };
812 
813 static void scsi_generic_register_types(void)
814 {
815     type_register_static(&scsi_generic_info);
816 }
817 
818 type_init(scsi_generic_register_types)
819 
820 #endif /* __linux__ */
821