123
124
return r->qiov.size / 512;
127
static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
129
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
131
qemu_put_be64s(f, &r->sector);
132
qemu_put_be32s(f, &r->sector_count);
133
qemu_put_be32s(f, &r->buflen);
134
if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
135
qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
139
static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
141
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
143
qemu_get_be64s(f, &r->sector);
144
qemu_get_be32s(f, &r->sector_count);
145
qemu_get_be32s(f, &r->buflen);
147
scsi_init_iovec(r, r->buflen);
148
if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
149
qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
153
qemu_iovec_init_external(&r->qiov, &r->iov, 1);
156
static void scsi_dma_complete(void *opaque, int ret)
158
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
159
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
161
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
164
if (scsi_handle_rw_error(r, -ret)) {
169
r->sector += r->sector_count;
171
scsi_req_complete(&r->req, GOOD);
174
scsi_req_unref(&r->req);
126
177
static void scsi_read_complete(void * opaque, int ret)
128
179
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
1712
1793
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1713
1794
DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1796
static Property scsi_hd_properties[] = {
1797
DEFINE_SCSI_DISK_PROPERTIES(),
1798
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1799
DEFINE_PROP_END_OF_LIST(),
1802
static const VMStateDescription vmstate_scsi_disk_state = {
1803
.name = "scsi-disk",
1805
.minimum_version_id = 1,
1806
.minimum_version_id_old = 1,
1807
.fields = (VMStateField[]) {
1808
VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
1809
VMSTATE_BOOL(media_changed, SCSIDiskState),
1810
VMSTATE_BOOL(media_event, SCSIDiskState),
1811
VMSTATE_BOOL(eject_request, SCSIDiskState),
1812
VMSTATE_BOOL(tray_open, SCSIDiskState),
1813
VMSTATE_BOOL(tray_locked, SCSIDiskState),
1814
VMSTATE_END_OF_LIST()
1715
1818
static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
1820
DeviceClass *dc = DEVICE_CLASS(klass);
1717
1821
SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1719
1823
sc->init = scsi_hd_initfn;
1720
1824
sc->destroy = scsi_destroy;
1721
1825
sc->alloc_req = scsi_new_request;
1722
1826
sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1827
dc->fw_name = "disk";
1828
dc->desc = "virtual SCSI disk";
1829
dc->reset = scsi_disk_reset;
1830
dc->props = scsi_hd_properties;
1831
dc->vmsd = &vmstate_scsi_disk_state;
1725
static DeviceInfo scsi_hd_info = {
1728
.desc = "virtual SCSI disk",
1729
.size = sizeof(SCSIDiskState),
1730
.reset = scsi_disk_reset,
1731
.class_init = scsi_hd_class_initfn,
1732
.props = (Property[]) {
1733
DEFINE_SCSI_DISK_PROPERTIES(),
1734
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1735
DEFINE_PROP_END_OF_LIST(),
1834
static TypeInfo scsi_hd_info = {
1836
.parent = TYPE_SCSI_DEVICE,
1837
.instance_size = sizeof(SCSIDiskState),
1838
.class_init = scsi_hd_class_initfn,
1841
static Property scsi_cd_properties[] = {
1842
DEFINE_SCSI_DISK_PROPERTIES(),
1843
DEFINE_PROP_END_OF_LIST(),
1739
1846
static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
1848
DeviceClass *dc = DEVICE_CLASS(klass);
1741
1849
SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1743
1851
sc->init = scsi_cd_initfn;
1744
1852
sc->destroy = scsi_destroy;
1745
1853
sc->alloc_req = scsi_new_request;
1746
1854
sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1855
dc->fw_name = "disk";
1856
dc->desc = "virtual SCSI CD-ROM";
1857
dc->reset = scsi_disk_reset;
1858
dc->props = scsi_cd_properties;
1859
dc->vmsd = &vmstate_scsi_disk_state;
1749
static DeviceInfo scsi_cd_info = {
1752
.desc = "virtual SCSI CD-ROM",
1753
.size = sizeof(SCSIDiskState),
1754
.reset = scsi_disk_reset,
1755
.class_init = scsi_cd_class_initfn,
1756
.props = (Property[]) {
1757
DEFINE_SCSI_DISK_PROPERTIES(),
1758
DEFINE_PROP_END_OF_LIST(),
1862
static TypeInfo scsi_cd_info = {
1864
.parent = TYPE_SCSI_DEVICE,
1865
.instance_size = sizeof(SCSIDiskState),
1866
.class_init = scsi_cd_class_initfn,
1762
1869
#ifdef __linux__
1870
static Property scsi_block_properties[] = {
1871
DEFINE_SCSI_DISK_PROPERTIES(),
1872
DEFINE_PROP_END_OF_LIST(),
1763
1875
static void scsi_block_class_initfn(ObjectClass *klass, void *data)
1877
DeviceClass *dc = DEVICE_CLASS(klass);
1765
1878
SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1767
1880
sc->init = scsi_block_initfn;
1768
1881
sc->destroy = scsi_destroy;
1769
1882
sc->alloc_req = scsi_block_new_request;
1883
dc->fw_name = "disk";
1884
dc->desc = "SCSI block device passthrough";
1885
dc->reset = scsi_disk_reset;
1886
dc->props = scsi_block_properties;
1887
dc->vmsd = &vmstate_scsi_disk_state;
1772
static DeviceInfo scsi_block_info = {
1773
.name = "scsi-block",
1775
.desc = "SCSI block device passthrough",
1776
.size = sizeof(SCSIDiskState),
1777
.reset = scsi_disk_reset,
1778
.class_init = scsi_block_class_initfn,
1779
.props = (Property[]) {
1780
DEFINE_SCSI_DISK_PROPERTIES(),
1781
DEFINE_PROP_END_OF_LIST(),
1890
static TypeInfo scsi_block_info = {
1891
.name = "scsi-block",
1892
.parent = TYPE_SCSI_DEVICE,
1893
.instance_size = sizeof(SCSIDiskState),
1894
.class_init = scsi_block_class_initfn,
1898
static Property scsi_disk_properties[] = {
1899
DEFINE_SCSI_DISK_PROPERTIES(),
1900
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1901
DEFINE_PROP_END_OF_LIST(),
1786
1904
static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
1906
DeviceClass *dc = DEVICE_CLASS(klass);
1788
1907
SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1790
1909
sc->init = scsi_disk_initfn;
1791
1910
sc->destroy = scsi_destroy;
1792
1911
sc->alloc_req = scsi_new_request;
1793
1912
sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1913
dc->fw_name = "disk";
1914
dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
1915
dc->reset = scsi_disk_reset;
1916
dc->props = scsi_disk_properties;
1917
dc->vmsd = &vmstate_scsi_disk_state;
1796
static DeviceInfo scsi_disk_info = {
1797
.name = "scsi-disk", /* legacy -device scsi-disk */
1799
.desc = "virtual SCSI disk or CD-ROM (legacy)",
1800
.size = sizeof(SCSIDiskState),
1801
.reset = scsi_disk_reset,
1802
.class_init = scsi_disk_class_initfn,
1803
.props = (Property[]) {
1804
DEFINE_SCSI_DISK_PROPERTIES(),
1805
DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1806
DEFINE_PROP_END_OF_LIST(),
1920
static TypeInfo scsi_disk_info = {
1921
.name = "scsi-disk",
1922
.parent = TYPE_SCSI_DEVICE,
1923
.instance_size = sizeof(SCSIDiskState),
1924
.class_init = scsi_disk_class_initfn,
1810
static void scsi_disk_register_devices(void)
1927
static void scsi_disk_register_types(void)
1812
scsi_qdev_register(&scsi_hd_info);
1813
scsi_qdev_register(&scsi_cd_info);
1929
type_register_static(&scsi_hd_info);
1930
type_register_static(&scsi_cd_info);
1814
1931
#ifdef __linux__
1815
scsi_qdev_register(&scsi_block_info);
1932
type_register_static(&scsi_block_info);
1817
scsi_qdev_register(&scsi_disk_info);
1934
type_register_static(&scsi_disk_info);
1819
device_init(scsi_disk_register_devices)
1937
type_init(scsi_disk_register_types)