Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- hw/scsi-bus.c | 20 ++++++++++---------- hw/scsi-disk.c | 24 ++++++------------------ hw/scsi-generic.c | 12 ++++++------ hw/scsi.h | 13 +++++++------ 4 files changed, 29 insertions(+), 40 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index 4709b19..be73f29 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -160,7 +160,7 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, uint8_t *scsi_req_get_buf(SCSIRequest *req) { - return req->dev->info->get_buf(req); + return req->ops->get_buf(req); } int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len) @@ -199,7 +199,7 @@ int32_t scsi_req_enqueue(SCSIRequest *req, uint8_t *buf) QTAILQ_INSERT_TAIL(&req->dev->requests, req, next); scsi_req_ref(req); - rc = req->dev->info->send_command(req, buf); + rc = req->ops->send_command(req, buf); scsi_req_unref(req); return rc; } @@ -663,8 +663,8 @@ SCSIRequest *scsi_req_ref(SCSIRequest *req) void scsi_req_unref(SCSIRequest *req) { if (--req->refcount == 0) { - if (req->dev->info->free_req) { - req->dev->info->free_req(req); + if (req->ops->free_req) { + req->ops->free_req(req); } qemu_free(req); } @@ -676,9 +676,9 @@ void scsi_req_continue(SCSIRequest *req) { trace_scsi_req_continue(req->dev->id, req->lun, req->tag); if (req->cmd.mode == SCSI_XFER_TO_DEV) { - req->dev->info->write_data(req); + req->ops->write_data(req); } else { - req->dev->info->read_data(req); + req->ops->read_data(req); } } @@ -742,8 +742,8 @@ void scsi_req_complete(SCSIRequest *req, int status) void scsi_req_cancel(SCSIRequest *req) { - if (req->dev && req->dev->info->cancel_io) { - req->dev->info->cancel_io(req); + if (req->ops->cancel_io) { + req->ops->cancel_io(req); } scsi_req_ref(req); scsi_req_dequeue(req); @@ -755,8 +755,8 @@ void scsi_req_cancel(SCSIRequest *req) void scsi_req_abort(SCSIRequest *req, int status) { - if (req->dev && req->dev->info->cancel_io) { - req->dev->info->cancel_io(req); + if (req->ops->cancel_io) { + req->ops->cancel_io(req); } scsi_req_complete(req, status); } diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 7483638..ceb0e0a 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1223,6 +1223,12 @@ static int scsi_disk_initfn(SCSIDevice *dev) static SCSIReqOps scsi_disk_reqops = { .size = sizeof(SCSIDiskReq), + .free_req = scsi_free_request, + .send_command = scsi_send_command, + .read_data = scsi_read_data, + .write_data = scsi_write_data, + .cancel_io = scsi_cancel_io, + .get_buf = scsi_get_buf, }; static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, @@ -1253,12 +1259,6 @@ static SCSIDeviceInfo scsi_disk_info[] = { .init = scsi_hd_initfn, .destroy = scsi_destroy, .alloc_req = scsi_new_request, - .free_req = scsi_free_request, - .send_command = scsi_send_command, - .read_data = scsi_read_data, - .write_data = scsi_write_data, - .cancel_io = scsi_cancel_io, - .get_buf = scsi_get_buf, .qdev.props = (Property[]) { DEFINE_SCSI_DISK_PROPERTIES(), DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false), @@ -1273,12 +1273,6 @@ static SCSIDeviceInfo scsi_disk_info[] = { .init = scsi_cd_initfn, .destroy = scsi_destroy, .alloc_req = scsi_new_request, - .free_req = scsi_free_request, - .send_command = scsi_send_command, - .read_data = scsi_read_data, - .write_data = scsi_write_data, - .cancel_io = scsi_cancel_io, - .get_buf = scsi_get_buf, .qdev.props = (Property[]) { DEFINE_SCSI_DISK_PROPERTIES(), DEFINE_PROP_END_OF_LIST(), @@ -1292,12 +1286,6 @@ static SCSIDeviceInfo scsi_disk_info[] = { .init = scsi_disk_initfn, .destroy = scsi_destroy, .alloc_req = scsi_new_request, - .free_req = scsi_free_request, - .send_command = scsi_send_command, - .read_data = scsi_read_data, - .write_data = scsi_write_data, - .cancel_io = scsi_cancel_io, - .get_buf = scsi_get_buf, .qdev.props = (Property[]) { DEFINE_SCSI_DISK_PROPERTIES(), DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false), diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c index 87fb6ab..453a295 100644 --- a/hw/scsi-generic.c +++ b/hw/scsi-generic.c @@ -491,6 +491,12 @@ static int scsi_generic_initfn(SCSIDevice *dev) static SCSIReqOps scsi_generic_req_ops = { .size = sizeof(SCSIGenericReq), + .free_req = scsi_free_request, + .send_command = scsi_send_command, + .read_data = scsi_read_data, + .write_data = scsi_write_data, + .cancel_io = scsi_cancel_io, + .get_buf = scsi_get_buf, }; static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun, @@ -510,12 +516,6 @@ static SCSIDeviceInfo scsi_generic_info = { .init = scsi_generic_initfn, .destroy = scsi_destroy, .alloc_req = scsi_new_request, - .free_req = scsi_free_request, - .send_command = scsi_send_command, - .read_data = scsi_read_data, - .write_data = scsi_write_data, - .cancel_io = scsi_cancel_io, - .get_buf = scsi_get_buf, .qdev.props = (Property[]) { DEFINE_BLOCK_PROPERTIES(SCSIGenericState, qdev.conf), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/scsi.h b/hw/scsi.h index ee76c64..5c0e076 100644 --- a/hw/scsi.h +++ b/hw/scsi.h @@ -73,6 +73,12 @@ int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num); /* scsi-bus.c */ struct SCSIReqOps { size_t size; + void (*free_req)(SCSIRequest *req); + int32_t (*send_command)(SCSIRequest *req, uint8_t *buf); + void (*read_data)(SCSIRequest *req); + void (*write_data)(SCSIRequest *req); + void (*cancel_io)(SCSIRequest *req); + uint8_t *(*get_buf)(SCSIRequest *req); }; typedef int (*scsi_qdev_initfn)(SCSIDevice *dev); @@ -82,12 +88,7 @@ struct SCSIDeviceInfo { void (*destroy)(SCSIDevice *s); SCSIRequest *(*alloc_req)(SCSIDevice *s, uint32_t tag, uint32_t lun, void *hba_private); - void (*free_req)(SCSIRequest *req); - int32_t (*send_command)(SCSIRequest *req, uint8_t *buf); - void (*read_data)(SCSIRequest *req); - void (*write_data)(SCSIRequest *req); - void (*cancel_io)(SCSIRequest *req); - uint8_t *(*get_buf)(SCSIRequest *req); + SCSIReqOps reqops; }; struct SCSIBusOps { -- 1.7.6