Add mode pages for the Yamaha drive.

This commit is contained in:
2025-09-23 20:48:51 +01:00
parent c33e98d7e0
commit 49f462c3cf
2 changed files with 82 additions and 15 deletions

View File

@@ -163,21 +163,22 @@
#define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12_MATSUSHITA 0xe9 /* Matsushita Vendor Unique command */
/* Mode page codes for mode sense/set */
#define GPMODE_UNIT_ATN_PAGE 0x00
#define GPMODE_R_W_ERROR_PAGE 0x01
#define GPMODE_DISCONNECT_PAGE 0x02 /* Disconnect/reconnect page */
#define GPMODE_FORMAT_DEVICE_PAGE 0x03
#define GPMODE_RIGID_DISK_PAGE 0x04 /* Rigid disk geometry page */
#define GPMODE_FLEXIBLE_DISK_PAGE 0x05
#define GPMODE_CACHING_PAGE 0x08
#define GPMODE_CDROM_PAGE_SONY 0x08
#define GPMODE_CDROM_AUDIO_PAGE_SONY 0x09
#define GPMODE_CDROM_PAGE 0x0d
#define GPMODE_CDROM_AUDIO_PAGE 0x0e
#define GPMODE_CAPABILITIES_PAGE 0x2a
#define GPMODE_IOMEGA_PAGE 0x2f
#define GPMODE_UNK_VENDOR_PAGE 0x30
#define GPMODE_ALL_PAGES 0x3f
#define GPMODE_UNIT_ATN_PAGE 0x00
#define GPMODE_R_W_ERROR_PAGE 0x01
#define GPMODE_DISCONNECT_PAGE 0x02 /* Disconnect/reconnect page */
#define GPMODE_FORMAT_DEVICE_PAGE 0x03
#define GPMODE_RIGID_DISK_PAGE 0x04 /* Rigid disk geometry page */
#define GPMODE_FLEXIBLE_DISK_PAGE 0x05
#define GPMODE_CDROM_WRITE_PARAMETERS_PAGE 0x05
#define GPMODE_CACHING_PAGE 0x08
#define GPMODE_CDROM_PAGE_SONY 0x08
#define GPMODE_CDROM_AUDIO_PAGE_SONY 0x09
#define GPMODE_CDROM_PAGE 0x0d
#define GPMODE_CDROM_AUDIO_PAGE 0x0e
#define GPMODE_CAPABILITIES_PAGE 0x2a
#define GPMODE_IOMEGA_PAGE 0x2f
#define GPMODE_UNK_VENDOR_PAGE 0x30
#define GPMODE_ALL_PAGES 0x3f
/* Mode page codes for presence */
#define GPMODEP_UNIT_ATN_PAGE 0x0000000000000001LL

View File

@@ -131,6 +131,12 @@ static uint64_t scsi_cdrom_ms_page_flags_sony_scsi = (GPMODEP_R_W_ERROR_PAGE | G
(1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE |
GPMODEP_ALL_PAGES);
static uint64_t scsi_cdrom_ms_page_flags_yamaha = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE |
GPMODEP_FLEXIBLE_DISK_PAGE | GPMODEP_CACHING_PAGE |
GPMODEP_CDROM_PAGE_SONY | GPMODEP_CDROM_AUDIO_PAGE_SONY |
GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES);
static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) |
(1ULL << 0x0fULL) | GPMODEP_ALL_PAGES);
@@ -241,6 +247,56 @@ static const mode_sense_pages_t scsi_cdrom_ms_pages_changeable_sony_scsi = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 } }
};
static const mode_sense_pages_t scsi_cdrom_ms_pages_default_yamaha = {
{ [0x01] = { GPMODE_R_W_ERROR_PAGE, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 },
[0x02] = { GPMODE_DISCONNECT_PAGE, 0x0e, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00 },
[0x05] = { GPMODE_CDROM_WRITE_PARAMETERS_PAGE, 0x36, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x96, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20,
0x20, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x00, 0x00 },
[0x08] = { GPMODE_CACHING_PAGE, 0x0a, 0x04, 0x00, 0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff },
[0x0d] = { GPMODE_CDROM_PAGE, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4b },
[0x0e] = { GPMODE_CDROM_AUDIO_PAGE, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x4b,
0x01, 0xff, 0x02, 0xff, 0x00, 0x00, 0x00,
0x00 },
[0x2a] = { GPMODE_CAPABILITIES_PAGE, 0x14, 0x07, 0x07, 0x71, 0x6f, 0x29, 0x03,
0x0b, 0x06, 0x01, 0x00, 0x10, 0x00, 0x10,
0x8a, 0x00, 0x00, 0x05, 0x83, 0x05, 0x83 } }
};
// Not true values, need to check real hardware
static const mode_sense_pages_t scsi_cdrom_ms_pages_changeable_yamaha = {
{
[0x01] = { GPMODE_R_W_ERROR_PAGE, 0x06, 0x85, 0xff, 0x00, 0x00, 0x00, 0x00 },
[0x02] = { GPMODE_DISCONNECT_PAGE, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00 },
[0x05] = { GPMODE_CDROM_WRITE_PARAMETERS_PAGE, 0x36, 0x5f, 0xff, 0x0f, 0x00, 0x00, 0x3f,
0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00 },
[0x08] = { GPMODE_CACHING_PAGE, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 },
[0x0d] = { GPMODE_CDROM_PAGE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
[0x0e] = { GPMODE_CDROM_AUDIO_PAGE, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00,
0x00 },
[0x2a] = { GPMODE_CAPABILITIES_PAGE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
};
// clang-format on
static gesn_cdb_t *gesn_cdb;
@@ -3973,6 +4029,10 @@ scsi_cdrom_drive_reset(const int c)
dev->ven_cmd_is_data[0xc6] = 1;
dev->ven_cmd_is_data[0xc7] = 1;
dev->use_cdb_9 = 1;
} else if (dev->drv->is_yamaha) {
dev->ms_page_flags = scsi_cdrom_ms_page_flags_yamaha;
dev->ms_pages_default = scsi_cdrom_ms_pages_default_yamaha;
dev->ms_pages_changeable = scsi_cdrom_ms_pages_changeable_yamaha;
}
if (dev->tf == NULL)
@@ -4025,6 +4085,12 @@ scsi_cdrom_drive_reset(const int c)
id->write = NULL;
id->interrupt_drq = dev->drv->is_early;
if (dev->drv->is_yamaha) {
dev->ms_page_flags = scsi_cdrom_ms_page_flags_yamaha;
dev->ms_pages_default = scsi_cdrom_ms_pages_default_yamaha;
dev->ms_pages_changeable = scsi_cdrom_ms_pages_changeable_yamaha;
}
valid = 1;
ide_atapi_attach(id);