diff options
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 |