diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-08-31 14:24:04 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-09-09 14:57:19 -0500 |
commit | d52affa7f6b9df3c7d44da0effbdfc8339c43914 (patch) | |
tree | f846e1baed7d228519ba95bfd3d915529e7172f9 /hw/scsi-disk.h | |
parent | 5b19d9a247c47fe52c4f3d3e844009a689ee6b28 (diff) |
qdev/scsi: add scsi bus support to qdev, convert drivers.
* Add SCSIBus.
* Add SCSIDeviceInfo, move device callbacks here.
* add qdev/scsi helper functions.
* convert drivers.
Adding scsi disks via -device works now, i.e. you can do:
-drive id=sda,if=none,...
-device lsi
-device scsi-disk,drive=sda
legacy command lines (-drive if=scsi,...) continue to work.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/scsi-disk.h')
-rw-r--r-- | hw/scsi-disk.h | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/hw/scsi-disk.h b/hw/scsi-disk.h index f42212bc22..febde44a92 100644 --- a/hw/scsi-disk.h +++ b/hw/scsi-disk.h @@ -1,20 +1,36 @@ #ifndef SCSI_DISK_H #define SCSI_DISK_H +#include "qdev.h" + /* scsi-disk.c */ enum scsi_reason { SCSI_REASON_DONE, /* Command complete. */ SCSI_REASON_DATA /* Transfer complete, more data required. */ }; -typedef struct SCSIDeviceState SCSIDeviceState; +typedef struct SCSIBus SCSIBus; typedef struct SCSIDevice SCSIDevice; -typedef void (*scsi_completionfn)(void *opaque, int reason, uint32_t tag, +typedef struct SCSIDeviceInfo SCSIDeviceInfo; +typedef void (*scsi_completionfn)(SCSIBus *bus, int reason, uint32_t tag, uint32_t arg); struct SCSIDevice { - SCSIDeviceState *state; + DeviceState qdev; + uint32_t id; + SCSIDeviceInfo *info; +}; + +/* cdrom.c */ +int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track); +int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num); + +/* scsi-bus.c */ +typedef int (*scsi_qdev_initfn)(SCSIDevice *dev); +struct SCSIDeviceInfo { + DeviceInfo qdev; + scsi_qdev_initfn init; void (*destroy)(SCSIDevice *s); int32_t (*send_command)(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun); @@ -24,13 +40,28 @@ struct SCSIDevice uint8_t *(*get_buf)(SCSIDevice *s, uint32_t tag); }; -SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq, - scsi_completionfn completion, void *opaque); -SCSIDevice *scsi_generic_init(BlockDriverState *bdrv, int tcq, - scsi_completionfn completion, void *opaque); +typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv, + int unit); +struct SCSIBus { + BusState qbus; + int busnr; -/* cdrom.c */ -int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track); -int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num); + int tcq, ndev; + scsi_completionfn complete; + + SCSIDevice *devs[8]; +}; + +SCSIBus *scsi_bus_new(DeviceState *host, int tcq, int ndev, + scsi_completionfn complete); +void scsi_qdev_register(SCSIDeviceInfo *info); + +static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d) +{ + return DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus); +} + +SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int unit); +void scsi_bus_legacy_handle_cmdline(SCSIBus *bus); #endif |