mirror of
https://github.com/qemu/qemu.git
synced 2024-12-03 16:53:53 +08:00
scsi-disk: add SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD quirk for Macintosh
During SCSI bus enumeration A/UX sends a MODE SENSE command to the CDROM with the DBD bit unset and expects the response to include a block descriptor. As per the latest SCSI documentation, QEMU currently force-disables the block descriptor for CDROM devices but the A/UX driver expects the requested block descriptor to be returned. If the block descriptor is not returned in the response then A/UX becomes confused, since the block descriptor returned in the MODE SENSE response is used to generate a subsequent MODE SELECT command which is then invalid. Add a new SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD quirk to allow this behaviour to be enabled as required. Note that an additional workaround is required for the previous SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR quirk which must never return a block descriptor even though the DBD bit is left unset. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20220622105314.802852-5-mark.cave-ayland@ilande.co.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f358241029
commit
f43c2b94cd
@ -1279,10 +1279,27 @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
|
||||
dev_specific_param |= 0x80; /* Readonly. */
|
||||
}
|
||||
} else {
|
||||
/* MMC prescribes that CD/DVD drives have no block descriptors,
|
||||
* and defines no device-specific parameter. */
|
||||
dev_specific_param = 0x00;
|
||||
dbd = true;
|
||||
if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD)) {
|
||||
/* Use DBD from the request... */
|
||||
dev_specific_param = 0x00;
|
||||
|
||||
/*
|
||||
* ... unless we receive a request for MODE_PAGE_APPLE_VENDOR
|
||||
* which should never return a block descriptor even though DBD is
|
||||
* not set, otherwise CDROM detection fails in MacOS
|
||||
*/
|
||||
if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR) &&
|
||||
page == MODE_PAGE_APPLE_VENDOR) {
|
||||
dbd = true;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* MMC prescribes that CD/DVD drives have no block descriptors,
|
||||
* and defines no device-specific parameter.
|
||||
*/
|
||||
dev_specific_param = 0x00;
|
||||
dbd = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (r->req.cmd.buf[0] == MODE_SENSE) {
|
||||
@ -3102,6 +3119,8 @@ static Property scsi_cd_properties[] = {
|
||||
5),
|
||||
DEFINE_PROP_BIT("quirk_mode_page_apple_vendor", SCSIDiskState, quirks,
|
||||
SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR, 0),
|
||||
DEFINE_PROP_BIT("quirk_mode_sense_rom_use_dbd", SCSIDiskState, quirks,
|
||||
SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD, 0),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
@ -228,5 +228,6 @@ extern const SCSIReqOps scsi_generic_req_ops;
|
||||
|
||||
/* scsi-disk.c */
|
||||
#define SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR 0
|
||||
#define SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD 1
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user