]>
Commit | Line | Data |
---|---|---|
3d4a8bf0 PB |
1 | #include "qemu/osdep.h" |
2 | #include "qemu/units.h" | |
3 | #include "qemu/bswap.h" | |
4 | #include "hw/scsi/emulation.h" | |
5 | ||
6 | int scsi_emulate_block_limits(uint8_t *outbuf, const SCSIBlockLimits *bl) | |
7 | { | |
8 | /* required VPD size with unmap support */ | |
9 | memset(outbuf, 0, 0x3c); | |
10 | ||
11 | outbuf[0] = bl->wsnz; /* wsnz */ | |
12 | ||
13 | if (bl->max_io_sectors) { | |
14 | /* optimal transfer length granularity. This field and the optimal | |
15 | * transfer length can't be greater than maximum transfer length. | |
16 | */ | |
17 | stw_be_p(outbuf + 2, MIN(bl->min_io_size, bl->max_io_sectors)); | |
18 | ||
19 | /* maximum transfer length */ | |
20 | stl_be_p(outbuf + 4, bl->max_io_sectors); | |
21 | ||
22 | /* optimal transfer length */ | |
23 | stl_be_p(outbuf + 8, MIN(bl->opt_io_size, bl->max_io_sectors)); | |
24 | } else { | |
25 | stw_be_p(outbuf + 2, bl->min_io_size); | |
26 | stl_be_p(outbuf + 8, bl->opt_io_size); | |
27 | } | |
28 | ||
29 | /* max unmap LBA count */ | |
30 | stl_be_p(outbuf + 16, bl->max_unmap_sectors); | |
31 | ||
32 | /* max unmap descriptors */ | |
33 | stl_be_p(outbuf + 20, bl->max_unmap_descr); | |
34 | ||
35 | /* optimal unmap granularity; alignment is zero */ | |
36 | stl_be_p(outbuf + 24, bl->unmap_sectors); | |
37 | ||
38 | /* max write same size, make it the same as maximum transfer length */ | |
39 | stl_be_p(outbuf + 36, bl->max_io_sectors); | |
40 | ||
41 | return 0x3c; | |
42 | } |