mirror of
https://github.com/qemu/qemu.git
synced 2024-12-02 00:03:35 +08:00
scsi-disk: add SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED quirk for Macintosh
When A/UX configures the CDROM device it sends a truncated MODE SELECT request for page 1 (MODE_PAGE_R_W_ERROR) which is only 6 bytes in length rather than 10. This seems to be due to bug in Apple's code which calculates the CDB message length incorrectly. The work at [1] suggests that this truncated request is accepted on real hardware whereas in QEMU it generates an INVALID_PARAM_LEN sense code which causes A/UX to get stuck in a loop retrying the command in an attempt to succeed. Alter the mode page request length check so that truncated requests are allowed if the SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED quirk is enabled, whilst also adding a trace event to enable the condition to be detected. [1] https://68kmla.org/bb/index.php?threads/scsi2sd-project-anyone-interested.29040/page-7#post-316444 Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20220622105314.802852-10-mark.cave-ayland@ilande.co.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6ab717610f
commit
389e18eb9a
@ -1552,7 +1552,10 @@ static int mode_select_pages(SCSIDiskReq *r, uint8_t *p, int len, bool change)
|
||||
goto invalid_param;
|
||||
}
|
||||
if (page_len > len) {
|
||||
goto invalid_param_len;
|
||||
if (!(s->quirks & SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED)) {
|
||||
goto invalid_param_len;
|
||||
}
|
||||
trace_scsi_disk_mode_select_page_truncated(page, page_len, len);
|
||||
}
|
||||
|
||||
if (!change) {
|
||||
@ -3151,6 +3154,8 @@ static Property scsi_cd_properties[] = {
|
||||
DEFINE_PROP_BIT("quirk_mode_page_vendor_specific_apple", SCSIDiskState,
|
||||
quirks, SCSI_DISK_QUIRK_MODE_PAGE_VENDOR_SPECIFIC_APPLE,
|
||||
0),
|
||||
DEFINE_PROP_BIT("quirk_mode_page_truncated", SCSIDiskState, quirks,
|
||||
SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED, 0),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
@ -339,6 +339,7 @@ scsi_disk_dma_command_READ(uint64_t lba, uint32_t len) "Read (sector %" PRId64 "
|
||||
scsi_disk_dma_command_WRITE(const char *cmd, uint64_t lba, int len) "Write %s(sector %" PRId64 ", count %u)"
|
||||
scsi_disk_new_request(uint32_t lun, uint32_t tag, const char *line) "Command: lun=%d tag=0x%x data=%s"
|
||||
scsi_disk_aio_sgio_command(uint32_t tag, uint8_t cmd, uint64_t lba, int len, uint32_t timeout) "disk aio sgio: tag=0x%x cmd=0x%x (sector %" PRId64 ", count %d) timeout=%u"
|
||||
scsi_disk_mode_select_page_truncated(int page, int len, int page_len) "page %d expected length %d but received length %d"
|
||||
|
||||
# scsi-generic.c
|
||||
scsi_generic_command_complete_noio(void *req, uint32_t tag, int statuc) "Command complete %p tag=0x%x status=%d"
|
||||
|
@ -230,5 +230,6 @@ extern const SCSIReqOps scsi_generic_req_ops;
|
||||
#define SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR 0
|
||||
#define SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD 1
|
||||
#define SCSI_DISK_QUIRK_MODE_PAGE_VENDOR_SPECIFIC_APPLE 2
|
||||
#define SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED 3
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user