mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
scsi: introduce SCSIBusOps
There are more operations than a SCSI bus can handle, besides completing commands. One example, which this series will introduce, is cleaning up after a request is cancelled. More long term, a "SCSI bus" can represent the LUNs attached to a target; in this case, while all commands will ultimately reach a logical unit, it is the target who is in charge of answering REPORT LUNs. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Cc: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
ab9adc88c8
commit
cfdc1bb06e
7 changed files with 34 additions and 17 deletions
13
hw/scsi.h
13
hw/scsi.h
|
@ -16,10 +16,9 @@ enum scsi_reason {
|
|||
};
|
||||
|
||||
typedef struct SCSIBus SCSIBus;
|
||||
typedef struct SCSIBusOps SCSIBusOps;
|
||||
typedef struct SCSIDevice SCSIDevice;
|
||||
typedef struct SCSIDeviceInfo SCSIDeviceInfo;
|
||||
typedef void (*scsi_completionfn)(SCSIBus *bus, int reason, uint32_t tag,
|
||||
uint32_t arg);
|
||||
|
||||
enum SCSIXferMode {
|
||||
SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */
|
||||
|
@ -74,20 +73,22 @@ struct SCSIDeviceInfo {
|
|||
uint8_t *(*get_buf)(SCSIDevice *s, uint32_t tag);
|
||||
};
|
||||
|
||||
typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
|
||||
int unit);
|
||||
struct SCSIBusOps {
|
||||
void (*complete)(SCSIBus *bus, int reason, uint32_t tag, uint32_t arg);
|
||||
};
|
||||
|
||||
struct SCSIBus {
|
||||
BusState qbus;
|
||||
int busnr;
|
||||
|
||||
int tcq, ndev;
|
||||
scsi_completionfn complete;
|
||||
const SCSIBusOps *ops;
|
||||
|
||||
SCSIDevice *devs[MAX_SCSI_DEVS];
|
||||
};
|
||||
|
||||
void scsi_bus_new(SCSIBus *bus, DeviceState *host, int tcq, int ndev,
|
||||
scsi_completionfn complete);
|
||||
const SCSIBusOps *ops);
|
||||
void scsi_qdev_register(SCSIDeviceInfo *info);
|
||||
|
||||
static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue