8 static struct BusInfo scsi_bus_info
= {
10 .size
= sizeof(SCSIBus
),
11 .props
= (Property
[]) {
12 DEFINE_PROP_UINT32("scsi-id", SCSIDevice
, id
, -1),
13 DEFINE_PROP_END_OF_LIST(),
16 static int next_scsi_bus
;
18 /* Create a scsi bus, and attach devices to it. */
19 void scsi_bus_new(SCSIBus
*bus
, DeviceState
*host
, int tcq
, int ndev
,
20 scsi_completionfn complete
)
22 qbus_create_inplace(&bus
->qbus
, &scsi_bus_info
, host
, NULL
);
23 bus
->busnr
= next_scsi_bus
++;
26 bus
->complete
= complete
;
27 bus
->qbus
.allow_hotplug
= 1;
30 static int scsi_qdev_init(DeviceState
*qdev
, DeviceInfo
*base
)
32 SCSIDevice
*dev
= DO_UPCAST(SCSIDevice
, qdev
, qdev
);
33 SCSIDeviceInfo
*info
= DO_UPCAST(SCSIDeviceInfo
, qdev
, base
);
34 SCSIBus
*bus
= DO_UPCAST(SCSIBus
, qbus
, dev
->qdev
.parent_bus
);
38 for (dev
->id
= 0; dev
->id
< bus
->ndev
; dev
->id
++) {
39 if (bus
->devs
[dev
->id
] == NULL
)
43 if (dev
->id
>= bus
->ndev
) {
44 qemu_error("bad scsi device id: %d\n", dev
->id
);
48 if (bus
->devs
[dev
->id
]) {
49 qdev_free(&bus
->devs
[dev
->id
]->qdev
);
51 bus
->devs
[dev
->id
] = dev
;
54 QTAILQ_INIT(&dev
->requests
);
55 rc
= dev
->info
->init(dev
);
57 bus
->devs
[dev
->id
] = NULL
;
64 static int scsi_qdev_exit(DeviceState
*qdev
)
66 SCSIDevice
*dev
= DO_UPCAST(SCSIDevice
, qdev
, qdev
);
67 SCSIBus
*bus
= DO_UPCAST(SCSIBus
, qbus
, dev
->qdev
.parent_bus
);
69 assert(bus
->devs
[dev
->id
] != NULL
);
70 if (bus
->devs
[dev
->id
]->info
->destroy
) {
71 bus
->devs
[dev
->id
]->info
->destroy(bus
->devs
[dev
->id
]);
73 bus
->devs
[dev
->id
] = NULL
;
77 void scsi_qdev_register(SCSIDeviceInfo
*info
)
79 info
->qdev
.bus_info
= &scsi_bus_info
;
80 info
->qdev
.init
= scsi_qdev_init
;
81 info
->qdev
.unplug
= qdev_simple_unplug_cb
;
82 info
->qdev
.exit
= scsi_qdev_exit
;
83 qdev_register(&info
->qdev
);
86 /* handle legacy '-drive if=scsi,...' cmd line args */
87 /* FIXME callers should check for failure, but don't */
88 SCSIDevice
*scsi_bus_legacy_add_drive(SCSIBus
*bus
, DriveInfo
*dinfo
, int unit
)
93 driver
= bdrv_is_sg(dinfo
->bdrv
) ? "scsi-generic" : "scsi-disk";
94 dev
= qdev_create(&bus
->qbus
, driver
);
95 qdev_prop_set_uint32(dev
, "scsi-id", unit
);
96 qdev_prop_set_drive(dev
, "drive", dinfo
);
97 if (qdev_init(dev
) < 0)
99 return DO_UPCAST(SCSIDevice
, qdev
, dev
);
102 void scsi_bus_legacy_handle_cmdline(SCSIBus
*bus
)
107 for (unit
= 0; unit
< MAX_SCSI_DEVS
; unit
++) {
108 dinfo
= drive_get(IF_SCSI
, bus
->busnr
, unit
);
112 scsi_bus_legacy_add_drive(bus
, dinfo
, unit
);
116 void scsi_dev_clear_sense(SCSIDevice
*dev
)
118 memset(&dev
->sense
, 0, sizeof(dev
->sense
));
121 void scsi_dev_set_sense(SCSIDevice
*dev
, uint8_t key
)
123 dev
->sense
.key
= key
;
126 SCSIRequest
*scsi_req_alloc(size_t size
, SCSIDevice
*d
, uint32_t tag
, uint32_t lun
)
130 req
= qemu_mallocz(size
);
131 req
->bus
= scsi_bus_from_device(d
);
135 QTAILQ_INSERT_TAIL(&d
->requests
, req
, next
);
139 SCSIRequest
*scsi_req_find(SCSIDevice
*d
, uint32_t tag
)
143 QTAILQ_FOREACH(req
, &d
->requests
, next
) {
144 if (req
->tag
== tag
) {
151 void scsi_req_free(SCSIRequest
*req
)
153 QTAILQ_REMOVE(&req
->dev
->requests
, req
, next
);
157 static int scsi_req_length(SCSIRequest
*req
, uint8_t *cmd
)
159 switch (cmd
[0] >> 5) {
161 req
->cmd
.xfer
= cmd
[4];
163 /* length 0 means 256 blocks */
164 if (req
->cmd
.xfer
== 0)
169 req
->cmd
.xfer
= cmd
[8] | (cmd
[7] << 8);
173 req
->cmd
.xfer
= cmd
[13] | (cmd
[12] << 8) | (cmd
[11] << 16) | (cmd
[10] << 24);
177 req
->cmd
.xfer
= cmd
[9] | (cmd
[8] << 8) | (cmd
[7] << 16) | (cmd
[6] << 24);
185 case TEST_UNIT_READY
:
189 case WRITE_FILEMARKS
:
192 case ALLOW_MEDIUM_REMOVAL
:
195 case SYNCHRONIZE_CACHE
:
196 case LOCK_UNLOCK_CACHE
:
213 case READ_BLOCK_LIMITS
:
219 case SEND_VOLUME_TAG
:
229 case WRITE_VERIFY_12
:
230 req
->cmd
.xfer
*= req
->dev
->blocksize
;
235 case RECOVER_BUFFERED_DATA
:
237 req
->cmd
.xfer
*= req
->dev
->blocksize
;
240 req
->cmd
.xfer
= cmd
[4] | (cmd
[3] << 8);
246 static int scsi_req_stream_length(SCSIRequest
*req
, uint8_t *cmd
)
249 /* stream commands */
252 case RECOVER_BUFFERED_DATA
:
255 req
->cmd
.xfer
= cmd
[4] | (cmd
[3] << 8) | (cmd
[2] << 16);
256 if (cmd
[1] & 0x01) /* fixed */
257 req
->cmd
.xfer
*= req
->dev
->blocksize
;
264 /* generic commands */
266 return scsi_req_length(req
, cmd
);
271 static void scsi_req_xfer_mode(SCSIRequest
*req
)
273 switch (req
->cmd
.buf
[0]) {
278 case WRITE_VERIFY_12
:
282 case CHANGE_DEFINITION
:
286 case SEND_DIAGNOSTIC
:
289 case REASSIGN_BLOCKS
:
298 case SEARCH_EQUAL_12
:
302 case SEND_VOLUME_TAG
:
304 req
->cmd
.mode
= SCSI_XFER_TO_DEV
;
308 req
->cmd
.mode
= SCSI_XFER_FROM_DEV
;
310 req
->cmd
.mode
= SCSI_XFER_NONE
;
316 static uint64_t scsi_req_lba(SCSIRequest
*req
)
318 uint8_t *buf
= req
->cmd
.buf
;
321 switch (buf
[0] >> 5) {
323 lba
= (uint64_t) buf
[3] | ((uint64_t) buf
[2] << 8) |
324 (((uint64_t) buf
[1] & 0x1f) << 16);
328 lba
= (uint64_t) buf
[5] | ((uint64_t) buf
[4] << 8) |
329 ((uint64_t) buf
[3] << 16) | ((uint64_t) buf
[2] << 24);
332 lba
= (uint64_t) buf
[9] | ((uint64_t) buf
[8] << 8) |
333 ((uint64_t) buf
[7] << 16) | ((uint64_t) buf
[6] << 24) |
334 ((uint64_t) buf
[5] << 32) | ((uint64_t) buf
[4] << 40) |
335 ((uint64_t) buf
[3] << 48) | ((uint64_t) buf
[2] << 56);
338 lba
= (uint64_t) buf
[5] | ((uint64_t) buf
[4] << 8) |
339 ((uint64_t) buf
[3] << 16) | ((uint64_t) buf
[2] << 24);
348 int scsi_req_parse(SCSIRequest
*req
, uint8_t *buf
)
352 if (req
->dev
->type
== TYPE_TAPE
) {
353 rc
= scsi_req_stream_length(req
, buf
);
355 rc
= scsi_req_length(req
, buf
);
360 memcpy(req
->cmd
.buf
, buf
, req
->cmd
.len
);
361 scsi_req_xfer_mode(req
);
362 req
->cmd
.lba
= scsi_req_lba(req
);