xref: /openbmc/qemu/hw/scsi/scsi-generic.c (revision 835fde4a)
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 void scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s)
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     }
218 }
219 
220 static int scsi_generic_emulate_block_limits(SCSIGenericReq *r, SCSIDevice *s)
221 {
222     int len;
223     uint8_t buf[64];
224 
225     SCSIBlockLimits bl = {
226         .max_io_sectors = blk_get_max_transfer(s->conf.blk) / s->blocksize
227     };
228 
229     memset(r->buf, 0, r->buflen);
230     stb_p(buf, s->type);
231     stb_p(buf + 1, 0xb0);
232     len = scsi_emulate_block_limits(buf + 4, &bl);
233     assert(len <= sizeof(buf) - 4);
234     stw_be_p(buf + 2, len);
235 
236     memcpy(r->buf, buf, MIN(r->buflen, len + 4));
237 
238     r->io_header.sb_len_wr = 0;
239 
240     /*
241     * We have valid contents in the reply buffer but the
242     * io_header can report a sense error coming from
243     * the hardware in scsi_command_complete_noio. Clean
244     * up the io_header to avoid reporting it.
245     */
246     r->io_header.driver_status = 0;
247     r->io_header.status = 0;
248 
249     return r->buflen;
250 }
251 
252 static void scsi_read_complete(void * opaque, int ret)
253 {
254     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
255     SCSIDevice *s = r->req.dev;
256     int len;
257 
258     assert(r->req.aiocb != NULL);
259     r->req.aiocb = NULL;
260 
261     aio_context_acquire(blk_get_aio_context(s->conf.blk));
262 
263     if (ret || r->req.io_canceled) {
264         scsi_command_complete_noio(r, ret);
265         goto done;
266     }
267 
268     len = r->io_header.dxfer_len - r->io_header.resid;
269     trace_scsi_generic_read_complete(r->req.tag, len);
270 
271     r->len = -1;
272 
273     if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
274         SCSISense sense =
275             scsi_parse_sense_buf(r->req.sense, r->io_header.sb_len_wr);
276 
277         /*
278          * Check if this is a VPD Block Limits request that
279          * resulted in sense error but would need emulation.
280          * In this case, emulate a valid VPD response.
281          */
282         if (sense.key == ILLEGAL_REQUEST &&
283             s->needs_vpd_bl_emulation &&
284             r->req.cmd.buf[0] == INQUIRY &&
285             (r->req.cmd.buf[1] & 0x01) &&
286             r->req.cmd.buf[2] == 0xb0) {
287             len = scsi_generic_emulate_block_limits(r, s);
288             /*
289              * It's okay to jup to req_complete: no need to
290              * let scsi_handle_inquiry_reply handle an
291              * INQUIRY VPD BL request we created manually.
292              */
293         }
294         if (sense.key) {
295             goto req_complete;
296         }
297     }
298 
299     if (r->io_header.host_status != SCSI_HOST_OK ||
300         (r->io_header.driver_status & SG_ERR_DRIVER_TIMEOUT) ||
301         r->io_header.status != GOOD ||
302         len == 0) {
303         scsi_command_complete_noio(r, 0);
304         goto done;
305     }
306 
307     /* Snoop READ CAPACITY output to set the blocksize.  */
308     if (r->req.cmd.buf[0] == READ_CAPACITY_10 &&
309         (ldl_be_p(&r->buf[0]) != 0xffffffffU || s->max_lba == 0)) {
310         s->blocksize = ldl_be_p(&r->buf[4]);
311         s->max_lba = ldl_be_p(&r->buf[0]) & 0xffffffffULL;
312     } else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 &&
313                (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
314         s->blocksize = ldl_be_p(&r->buf[8]);
315         s->max_lba = ldq_be_p(&r->buf[0]);
316     }
317     blk_set_guest_block_size(s->conf.blk, s->blocksize);
318 
319     /*
320      * Patch MODE SENSE device specific parameters if the BDS is opened
321      * readonly.
322      */
323     if ((s->type == TYPE_DISK || s->type == TYPE_TAPE || s->type == TYPE_ZBC) &&
324         !blk_is_writable(s->conf.blk) &&
325         (r->req.cmd.buf[0] == MODE_SENSE ||
326          r->req.cmd.buf[0] == MODE_SENSE_10) &&
327         (r->req.cmd.buf[1] & 0x8) == 0) {
328         if (r->req.cmd.buf[0] == MODE_SENSE) {
329             r->buf[2] |= 0x80;
330         } else  {
331             r->buf[3] |= 0x80;
332         }
333     }
334     if (r->req.cmd.buf[0] == INQUIRY) {
335         scsi_handle_inquiry_reply(r, s);
336     }
337 
338 req_complete:
339     scsi_req_data(&r->req, len);
340     scsi_req_unref(&r->req);
341 
342 done:
343     aio_context_release(blk_get_aio_context(s->conf.blk));
344 }
345 
346 /* Read more data from scsi device into buffer.  */
347 static void scsi_read_data(SCSIRequest *req)
348 {
349     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
350     SCSIDevice *s = r->req.dev;
351     int ret;
352 
353     trace_scsi_generic_read_data(req->tag);
354 
355     /* The request is used as the AIO opaque value, so add a ref.  */
356     scsi_req_ref(&r->req);
357     if (r->len == -1) {
358         scsi_command_complete_noio(r, 0);
359         return;
360     }
361 
362     ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
363                           scsi_read_complete);
364     if (ret < 0) {
365         scsi_command_complete_noio(r, ret);
366     }
367 }
368 
369 static void scsi_write_complete(void * opaque, int ret)
370 {
371     SCSIGenericReq *r = (SCSIGenericReq *)opaque;
372     SCSIDevice *s = r->req.dev;
373 
374     trace_scsi_generic_write_complete(ret);
375 
376     assert(r->req.aiocb != NULL);
377     r->req.aiocb = NULL;
378 
379     aio_context_acquire(blk_get_aio_context(s->conf.blk));
380 
381     if (ret || r->req.io_canceled) {
382         scsi_command_complete_noio(r, ret);
383         goto done;
384     }
385 
386     if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 &&
387         s->type == TYPE_TAPE) {
388         s->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
389         trace_scsi_generic_write_complete_blocksize(s->blocksize);
390     }
391 
392     scsi_command_complete_noio(r, ret);
393 
394 done:
395     aio_context_release(blk_get_aio_context(s->conf.blk));
396 }
397 
398 /* Write data to a scsi device.  Returns nonzero on failure.
399    The transfer may complete asynchronously.  */
400 static void scsi_write_data(SCSIRequest *req)
401 {
402     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
403     SCSIDevice *s = r->req.dev;
404     int ret;
405 
406     trace_scsi_generic_write_data(req->tag);
407     if (r->len == 0) {
408         r->len = r->buflen;
409         scsi_req_data(&r->req, r->len);
410         return;
411     }
412 
413     /* The request is used as the AIO opaque value, so add a ref.  */
414     scsi_req_ref(&r->req);
415     ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete);
416     if (ret < 0) {
417         scsi_command_complete_noio(r, ret);
418     }
419 }
420 
421 /* Return a pointer to the data buffer.  */
422 static uint8_t *scsi_get_buf(SCSIRequest *req)
423 {
424     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
425 
426     return r->buf;
427 }
428 
429 static void scsi_generic_command_dump(uint8_t *cmd, int len)
430 {
431     int i;
432     char *line_buffer, *p;
433 
434     line_buffer = g_malloc(len * 5 + 1);
435 
436     for (i = 0, p = line_buffer; i < len; i++) {
437         p += sprintf(p, " 0x%02x", cmd[i]);
438     }
439     trace_scsi_generic_send_command(line_buffer);
440 
441     g_free(line_buffer);
442 }
443 
444 /* Execute a scsi command.  Returns the length of the data expected by the
445    command.  This will be Positive for data transfers from the device
446    (eg. disk reads), negative for transfers to the device (eg. disk writes),
447    and zero if the command does not transfer any data.  */
448 
449 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
450 {
451     SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
452     SCSIDevice *s = r->req.dev;
453     int ret;
454 
455     if (trace_event_get_state_backends(TRACE_SCSI_GENERIC_SEND_COMMAND)) {
456         scsi_generic_command_dump(cmd, r->req.cmd.len);
457     }
458 
459     if (r->req.cmd.xfer == 0) {
460         g_free(r->buf);
461         r->buflen = 0;
462         r->buf = NULL;
463         /* The request is used as the AIO opaque value, so add a ref.  */
464         scsi_req_ref(&r->req);
465         ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
466                               scsi_command_complete);
467         if (ret < 0) {
468             scsi_command_complete_noio(r, ret);
469             return 0;
470         }
471         return 0;
472     }
473 
474     if (r->buflen != r->req.cmd.xfer) {
475         g_free(r->buf);
476         r->buf = g_malloc(r->req.cmd.xfer);
477         r->buflen = r->req.cmd.xfer;
478     }
479 
480     memset(r->buf, 0, r->buflen);
481     r->len = r->req.cmd.xfer;
482     if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
483         r->len = 0;
484         return -r->req.cmd.xfer;
485     } else {
486         return r->req.cmd.xfer;
487     }
488 }
489 
490 static int read_naa_id(const uint8_t *p, uint64_t *p_wwn)
491 {
492     int i;
493 
494     if ((p[1] & 0xF) == 3) {
495         /* NAA designator type */
496         if (p[3] != 8) {
497             return -EINVAL;
498         }
499         *p_wwn = ldq_be_p(p + 4);
500         return 0;
501     }
502 
503     if ((p[1] & 0xF) == 8) {
504         /* SCSI name string designator type */
505         if (p[3] < 20 || memcmp(&p[4], "naa.", 4)) {
506             return -EINVAL;
507         }
508         if (p[3] > 20 && p[24] != ',') {
509             return -EINVAL;
510         }
511         *p_wwn = 0;
512         for (i = 8; i < 24; i++) {
513             char c = qemu_toupper(p[i]);
514             c -= (c >= '0' && c <= '9' ? '0' : 'A' - 10);
515             *p_wwn = (*p_wwn << 4) | c;
516         }
517         return 0;
518     }
519 
520     return -EINVAL;
521 }
522 
523 int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
524                         uint8_t *buf, uint8_t buf_size, uint32_t timeout)
525 {
526     sg_io_hdr_t io_header;
527     uint8_t sensebuf[8];
528     int ret;
529 
530     memset(&io_header, 0, sizeof(io_header));
531     io_header.interface_id = 'S';
532     io_header.dxfer_direction = SG_DXFER_FROM_DEV;
533     io_header.dxfer_len = buf_size;
534     io_header.dxferp = buf;
535     io_header.cmdp = cmd;
536     io_header.cmd_len = cmd_size;
537     io_header.mx_sb_len = sizeof(sensebuf);
538     io_header.sbp = sensebuf;
539     io_header.timeout = timeout * 1000;
540 
541     trace_scsi_generic_ioctl_sgio_command(cmd[0], io_header.timeout);
542     ret = blk_ioctl(blk, SG_IO, &io_header);
543     if (ret < 0 || io_header.status ||
544         io_header.driver_status || io_header.host_status) {
545         trace_scsi_generic_ioctl_sgio_done(cmd[0], ret, io_header.status,
546                                            io_header.host_status);
547         return -1;
548     }
549     return 0;
550 }
551 
552 /*
553  * Executes an INQUIRY request with EVPD set to retrieve the
554  * available VPD pages of the device. If the device does
555  * not support the Block Limits page (page 0xb0), set
556  * the needs_vpd_bl_emulation flag for future use.
557  */
558 static void scsi_generic_set_vpd_bl_emulation(SCSIDevice *s)
559 {
560     uint8_t cmd[6];
561     uint8_t buf[250];
562     uint8_t page_len;
563     int ret, i;
564 
565     memset(cmd, 0, sizeof(cmd));
566     memset(buf, 0, sizeof(buf));
567     cmd[0] = INQUIRY;
568     cmd[1] = 1;
569     cmd[2] = 0x00;
570     cmd[4] = sizeof(buf);
571 
572     ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
573                               buf, sizeof(buf), s->io_timeout);
574     if (ret < 0) {
575         /*
576          * Do not assume anything if we can't retrieve the
577          * INQUIRY response to assert the VPD Block Limits
578          * support.
579          */
580         s->needs_vpd_bl_emulation = false;
581         return;
582     }
583 
584     page_len = buf[3];
585     for (i = 4; i < MIN(sizeof(buf), page_len + 4); i++) {
586         if (buf[i] == 0xb0) {
587             s->needs_vpd_bl_emulation = false;
588             return;
589         }
590     }
591     s->needs_vpd_bl_emulation = true;
592 }
593 
594 static void scsi_generic_read_device_identification(SCSIDevice *s)
595 {
596     uint8_t cmd[6];
597     uint8_t buf[250];
598     int ret;
599     int i, len;
600 
601     memset(cmd, 0, sizeof(cmd));
602     memset(buf, 0, sizeof(buf));
603     cmd[0] = INQUIRY;
604     cmd[1] = 1;
605     cmd[2] = 0x83;
606     cmd[4] = sizeof(buf);
607 
608     ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
609                               buf, sizeof(buf), s->io_timeout);
610     if (ret < 0) {
611         return;
612     }
613 
614     len = MIN((buf[2] << 8) | buf[3], sizeof(buf) - 4);
615     for (i = 0; i + 3 <= len; ) {
616         const uint8_t *p = &buf[i + 4];
617         uint64_t wwn;
618 
619         if (i + (p[3] + 4) > len) {
620             break;
621         }
622 
623         if ((p[1] & 0x10) == 0) {
624             /* Associated with the logical unit */
625             if (read_naa_id(p, &wwn) == 0) {
626                 s->wwn = wwn;
627             }
628         } else if ((p[1] & 0x10) == 0x10) {
629             /* Associated with the target port */
630             if (read_naa_id(p, &wwn) == 0) {
631                 s->port_wwn = wwn;
632             }
633         }
634 
635         i += p[3] + 4;
636     }
637 }
638 
639 void scsi_generic_read_device_inquiry(SCSIDevice *s)
640 {
641     scsi_generic_read_device_identification(s);
642     if (s->type == TYPE_DISK || s->type == TYPE_ZBC) {
643         scsi_generic_set_vpd_bl_emulation(s);
644     } else {
645         s->needs_vpd_bl_emulation = false;
646     }
647 }
648 
649 static int get_stream_blocksize(BlockBackend *blk)
650 {
651     uint8_t cmd[6];
652     uint8_t buf[12];
653     int ret;
654 
655     memset(cmd, 0, sizeof(cmd));
656     memset(buf, 0, sizeof(buf));
657     cmd[0] = MODE_SENSE;
658     cmd[4] = sizeof(buf);
659 
660     ret = scsi_SG_IO_FROM_DEV(blk, cmd, sizeof(cmd), buf, sizeof(buf), 6);
661     if (ret < 0) {
662         return -1;
663     }
664 
665     return (buf[9] << 16) | (buf[10] << 8) | buf[11];
666 }
667 
668 static void scsi_generic_reset(DeviceState *dev)
669 {
670     SCSIDevice *s = SCSI_DEVICE(dev);
671 
672     s->scsi_version = s->default_scsi_version;
673     scsi_device_purge_requests(s, SENSE_CODE(RESET));
674 }
675 
676 static void scsi_generic_realize(SCSIDevice *s, Error **errp)
677 {
678     int rc;
679     int sg_version;
680     struct sg_scsi_id scsiid;
681 
682     if (!s->conf.blk) {
683         error_setg(errp, "drive property not set");
684         return;
685     }
686 
687     if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC &&
688         blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_REPORT) {
689         error_setg(errp, "Device doesn't support drive option werror");
690         return;
691     }
692     if (blk_get_on_error(s->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
693         error_setg(errp, "Device doesn't support drive option rerror");
694         return;
695     }
696 
697     /* check we are using a driver managing SG_IO (version 3 and after */
698     rc = blk_ioctl(s->conf.blk, SG_GET_VERSION_NUM, &sg_version);
699     if (rc < 0) {
700         error_setg_errno(errp, -rc, "cannot get SG_IO version number");
701         if (rc != -EPERM) {
702             error_append_hint(errp, "Is this a SCSI device?\n");
703         }
704         return;
705     }
706     if (sg_version < 30000) {
707         error_setg(errp, "scsi generic interface too old");
708         return;
709     }
710 
711     /* get LUN of the /dev/sg? */
712     if (blk_ioctl(s->conf.blk, SG_GET_SCSI_ID, &scsiid)) {
713         error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
714         return;
715     }
716     if (!blkconf_apply_backend_options(&s->conf,
717                                        !blk_supports_write_perm(s->conf.blk),
718                                        true, errp)) {
719         return;
720     }
721 
722     /* define device state */
723     s->type = scsiid.scsi_type;
724     trace_scsi_generic_realize_type(s->type);
725 
726     switch (s->type) {
727     case TYPE_TAPE:
728         s->blocksize = get_stream_blocksize(s->conf.blk);
729         if (s->blocksize == -1) {
730             s->blocksize = 0;
731         }
732         break;
733 
734         /* Make a guess for block devices, we'll fix it when the guest sends.
735          * READ CAPACITY.  If they don't, they likely would assume these sizes
736          * anyway. (TODO: they could also send MODE SENSE).
737          */
738     case TYPE_ROM:
739     case TYPE_WORM:
740         s->blocksize = 2048;
741         break;
742     default:
743         s->blocksize = 512;
744         break;
745     }
746 
747     trace_scsi_generic_realize_blocksize(s->blocksize);
748 
749     /* Only used by scsi-block, but initialize it nevertheless to be clean.  */
750     s->default_scsi_version = -1;
751     s->io_timeout = DEFAULT_IO_TIMEOUT;
752     scsi_generic_read_device_inquiry(s);
753 }
754 
755 const SCSIReqOps scsi_generic_req_ops = {
756     .size         = sizeof(SCSIGenericReq),
757     .free_req     = scsi_free_request,
758     .send_command = scsi_send_command,
759     .read_data    = scsi_read_data,
760     .write_data   = scsi_write_data,
761     .get_buf      = scsi_get_buf,
762     .load_request = scsi_generic_load_request,
763     .save_request = scsi_generic_save_request,
764 };
765 
766 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
767                                      uint8_t *buf, void *hba_private)
768 {
769     return scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
770 }
771 
772 static Property scsi_generic_properties[] = {
773     DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
774     DEFINE_PROP_BOOL("share-rw", SCSIDevice, conf.share_rw, false),
775     DEFINE_PROP_UINT32("io_timeout", SCSIDevice, io_timeout,
776                        DEFAULT_IO_TIMEOUT),
777     DEFINE_PROP_END_OF_LIST(),
778 };
779 
780 static int scsi_generic_parse_cdb(SCSIDevice *dev, SCSICommand *cmd,
781                                   uint8_t *buf, void *hba_private)
782 {
783     return scsi_bus_parse_cdb(dev, cmd, buf, hba_private);
784 }
785 
786 static void scsi_generic_class_initfn(ObjectClass *klass, void *data)
787 {
788     DeviceClass *dc = DEVICE_CLASS(klass);
789     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
790 
791     sc->realize      = scsi_generic_realize;
792     sc->alloc_req    = scsi_new_request;
793     sc->parse_cdb    = scsi_generic_parse_cdb;
794     dc->fw_name = "disk";
795     dc->desc = "pass through generic scsi device (/dev/sg*)";
796     dc->reset = scsi_generic_reset;
797     device_class_set_props(dc, scsi_generic_properties);
798     dc->vmsd  = &vmstate_scsi_device;
799 }
800 
801 static const TypeInfo scsi_generic_info = {
802     .name          = "scsi-generic",
803     .parent        = TYPE_SCSI_DEVICE,
804     .instance_size = sizeof(SCSIDevice),
805     .class_init    = scsi_generic_class_initfn,
806 };
807 
808 static void scsi_generic_register_types(void)
809 {
810     type_register_static(&scsi_generic_info);
811 }
812 
813 type_init(scsi_generic_register_types)
814 
815 #endif /* __linux__ */
816