5 #include "hw/block/block.h"
6 #include "hw/qdev-core.h"
7 #include "scsi/utils.h"
8 #include "qemu/notify.h"
9 #include "qom/object.h"
11 #define MAX_SCSI_DEVS 255
13 typedef struct SCSIBus SCSIBus
;
14 typedef struct SCSIBusInfo SCSIBusInfo
;
15 typedef struct SCSIDevice SCSIDevice
;
16 typedef struct SCSIRequest SCSIRequest
;
17 typedef struct SCSIReqOps SCSIReqOps
;
19 #define SCSI_SENSE_BUF_SIZE_OLD 96
20 #define SCSI_SENSE_BUF_SIZE 252
21 #define DEFAULT_IO_TIMEOUT 30
26 const SCSIReqOps
*ops
;
35 NotifierList cancel_notifiers
;
38 * - fields before sense are initialized by scsi_req_alloc;
39 * - sense[] is uninitialized;
40 * - fields after sense are memset to 0 by scsi_req_alloc.
43 uint8_t sense
[SCSI_SENSE_BUF_SIZE
];
51 QTAILQ_ENTRY(SCSIRequest
) next
;
54 #define TYPE_SCSI_DEVICE "scsi-device"
55 OBJECT_DECLARE_TYPE(SCSIDevice
, SCSIDeviceClass
, SCSI_DEVICE
)
57 struct SCSIDeviceClass
{
58 DeviceClass parent_class
;
59 void (*realize
)(SCSIDevice
*dev
, Error
**errp
);
60 void (*unrealize
)(SCSIDevice
*dev
);
61 int (*parse_cdb
)(SCSIDevice
*dev
, SCSICommand
*cmd
, uint8_t *buf
,
63 SCSIRequest
*(*alloc_req
)(SCSIDevice
*s
, uint32_t tag
, uint32_t lun
,
64 uint8_t *buf
, void *hba_private
);
65 void (*unit_attention_reported
)(SCSIDevice
*s
);
71 VMChangeStateEntry
*vmsentry
;
75 SCSISense unit_attention
;
77 uint8_t sense
[SCSI_SENSE_BUF_SIZE
];
79 QTAILQ_HEAD(, SCSIRequest
) requests
;
88 int default_scsi_version
;
90 bool needs_vpd_bl_emulation
;
91 bool hba_supports_iothread
;
94 extern const VMStateDescription vmstate_scsi_device
;
96 #define VMSTATE_SCSI_DEVICE(_field, _state) { \
97 .name = (stringify(_field)), \
98 .size = sizeof(SCSIDevice), \
99 .vmsd = &vmstate_scsi_device, \
100 .flags = VMS_STRUCT, \
101 .offset = vmstate_offset_value(_state, _field, SCSIDevice), \
105 int cdrom_read_toc(int nb_sectors
, uint8_t *buf
, int msf
, int start_track
);
106 int cdrom_read_toc_raw(int nb_sectors
, uint8_t *buf
, int msf
, int session_num
);
111 void (*free_req
)(SCSIRequest
*req
);
112 int32_t (*send_command
)(SCSIRequest
*req
, uint8_t *buf
);
113 void (*read_data
)(SCSIRequest
*req
);
114 void (*write_data
)(SCSIRequest
*req
);
115 uint8_t *(*get_buf
)(SCSIRequest
*req
);
117 void (*save_request
)(QEMUFile
*f
, SCSIRequest
*req
);
118 void (*load_request
)(QEMUFile
*f
, SCSIRequest
*req
);
123 int max_channel
, max_target
, max_lun
;
124 int (*parse_cdb
)(SCSIDevice
*dev
, SCSICommand
*cmd
, uint8_t *buf
,
126 void (*transfer_data
)(SCSIRequest
*req
, uint32_t arg
);
127 void (*fail
)(SCSIRequest
*req
);
128 void (*complete
)(SCSIRequest
*req
, size_t resid
);
129 void (*cancel
)(SCSIRequest
*req
);
130 void (*change
)(SCSIBus
*bus
, SCSIDevice
*dev
, SCSISense sense
);
131 QEMUSGList
*(*get_sg_list
)(SCSIRequest
*req
);
133 void (*save_request
)(QEMUFile
*f
, SCSIRequest
*req
);
134 void *(*load_request
)(QEMUFile
*f
, SCSIRequest
*req
);
135 void (*free_request
)(SCSIBus
*bus
, void *priv
);
138 #define TYPE_SCSI_BUS "SCSI"
139 OBJECT_DECLARE_SIMPLE_TYPE(SCSIBus
, SCSI_BUS
)
145 SCSISense unit_attention
;
146 const SCSIBusInfo
*info
;
150 * scsi_bus_init_named: Initialize a SCSI bus with the specified name
151 * @bus: SCSIBus object to initialize
152 * @bus_size: size of @bus object
153 * @host: Device which owns the bus (generally the SCSI controller)
154 * @info: structure defining callbacks etc for the controller
155 * @bus_name: Name to use for this bus
157 * This in-place initializes @bus as a new SCSI bus with a name
158 * provided by the caller. It is the caller's responsibility to make
159 * sure that name does not clash with the name of any other bus in the
160 * system. Unless you need the new bus to have a specific name, you
161 * should use scsi_bus_new() instead.
163 void scsi_bus_init_named(SCSIBus
*bus
, size_t bus_size
, DeviceState
*host
,
164 const SCSIBusInfo
*info
, const char *bus_name
);
167 * scsi_bus_init: Initialize a SCSI bus
169 * This in-place-initializes @bus as a new SCSI bus and gives it
170 * an automatically generated unique name.
172 static inline void scsi_bus_init(SCSIBus
*bus
, size_t bus_size
,
173 DeviceState
*host
, const SCSIBusInfo
*info
)
175 scsi_bus_init_named(bus
, bus_size
, host
, info
, NULL
);
178 static inline SCSIBus
*scsi_bus_from_device(SCSIDevice
*d
)
180 return DO_UPCAST(SCSIBus
, qbus
, d
->qdev
.parent_bus
);
183 SCSIDevice
*scsi_bus_legacy_add_drive(SCSIBus
*bus
, BlockBackend
*blk
,
184 int unit
, bool removable
, int bootindex
,
186 BlockdevOnError rerror
,
187 BlockdevOnError werror
,
188 const char *serial
, Error
**errp
);
189 void scsi_bus_legacy_handle_cmdline(SCSIBus
*bus
);
190 void scsi_legacy_handle_cmdline(void);
192 SCSIRequest
*scsi_req_alloc(const SCSIReqOps
*reqops
, SCSIDevice
*d
,
193 uint32_t tag
, uint32_t lun
, void *hba_private
);
194 SCSIRequest
*scsi_req_new(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
,
195 uint8_t *buf
, void *hba_private
);
196 int32_t scsi_req_enqueue(SCSIRequest
*req
);
197 SCSIRequest
*scsi_req_ref(SCSIRequest
*req
);
198 void scsi_req_unref(SCSIRequest
*req
);
200 int scsi_bus_parse_cdb(SCSIDevice
*dev
, SCSICommand
*cmd
, uint8_t *buf
,
202 int scsi_req_parse_cdb(SCSIDevice
*dev
, SCSICommand
*cmd
, uint8_t *buf
);
203 void scsi_req_build_sense(SCSIRequest
*req
, SCSISense sense
);
204 void scsi_req_print(SCSIRequest
*req
);
205 void scsi_req_continue(SCSIRequest
*req
);
206 void scsi_req_data(SCSIRequest
*req
, int len
);
207 void scsi_req_complete(SCSIRequest
*req
, int status
);
208 void scsi_req_complete_failed(SCSIRequest
*req
, int host_status
);
209 uint8_t *scsi_req_get_buf(SCSIRequest
*req
);
210 int scsi_req_get_sense(SCSIRequest
*req
, uint8_t *buf
, int len
);
211 void scsi_req_cancel_complete(SCSIRequest
*req
);
212 void scsi_req_cancel(SCSIRequest
*req
);
213 void scsi_req_cancel_async(SCSIRequest
*req
, Notifier
*notifier
);
214 void scsi_req_retry(SCSIRequest
*req
);
215 void scsi_device_purge_requests(SCSIDevice
*sdev
, SCSISense sense
);
216 void scsi_device_set_ua(SCSIDevice
*sdev
, SCSISense sense
);
217 void scsi_device_report_change(SCSIDevice
*dev
, SCSISense sense
);
218 void scsi_device_unit_attention_reported(SCSIDevice
*dev
);
219 void scsi_generic_read_device_inquiry(SCSIDevice
*dev
);
220 int scsi_device_get_sense(SCSIDevice
*dev
, uint8_t *buf
, int len
, bool fixed
);
221 int scsi_SG_IO_FROM_DEV(BlockBackend
*blk
, uint8_t *cmd
, uint8_t cmd_size
,
222 uint8_t *buf
, uint8_t buf_size
, uint32_t timeout
);
223 SCSIDevice
*scsi_device_find(SCSIBus
*bus
, int channel
, int target
, int lun
);
224 SCSIDevice
*scsi_device_get(SCSIBus
*bus
, int channel
, int target
, int lun
);
226 /* scsi-generic.c. */
227 extern const SCSIReqOps scsi_generic_req_ops
;