Fixed the CD-ROM GET EVENT STATUS NOTIFICATION command.
This commit is contained in:
@@ -2017,47 +2017,6 @@ static int cdrom_read_dvd_structure(uint8_t id, int format, const uint8_t *packe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*SCSI Get Event Status Notification*/
|
|
||||||
static uint32_t cdrom_get_event_status(uint8_t id, uint8_t *buffer)
|
|
||||||
{
|
|
||||||
uint8_t event_code, media_status = 0;
|
|
||||||
|
|
||||||
if (buffer[5])
|
|
||||||
{
|
|
||||||
media_status = MS_TRAY_OPEN;
|
|
||||||
if (cdrom_drives[id].handler->stop)
|
|
||||||
{
|
|
||||||
cdrom_drives[id].handler->stop(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
media_status = MS_MEDIA_PRESENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
event_code = MEC_NO_CHANGE;
|
|
||||||
if (media_status != MS_TRAY_OPEN)
|
|
||||||
{
|
|
||||||
if (!buffer[4])
|
|
||||||
{
|
|
||||||
event_code = MEC_NEW_MEDIA;
|
|
||||||
cdrom_drives[id].handler->load(id);
|
|
||||||
}
|
|
||||||
else if (buffer[4]==2)
|
|
||||||
{
|
|
||||||
event_code = MEC_EJECT_REQUESTED;
|
|
||||||
cdrom_drives[id].handler->eject(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer[4] = event_code;
|
|
||||||
buffer[5] = media_status;
|
|
||||||
buffer[6] = 0;
|
|
||||||
buffer[7] = 0;
|
|
||||||
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cdrom_insert(uint8_t id)
|
void cdrom_insert(uint8_t id)
|
||||||
{
|
{
|
||||||
cdrom[id].unit_attention = 1;
|
cdrom[id].unit_attention = 1;
|
||||||
@@ -2161,6 +2120,15 @@ skip_ready_check:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Next it's time for NOT READY. */
|
/* Next it's time for NOT READY. */
|
||||||
|
if (!ready)
|
||||||
|
{
|
||||||
|
cdrom[id].media_status = MEC_MEDIA_REMOVAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cdrom[id].media_status = (cdrom[id].unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
|
||||||
|
}
|
||||||
|
|
||||||
if ((cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready)
|
if ((cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready)
|
||||||
{
|
{
|
||||||
cdrom_log("CD-ROM %i: Not ready (%02X)\n", id, cdb[0]);
|
cdrom_log("CD-ROM %i: Not ready (%02X)\n", id, cdb[0]);
|
||||||
@@ -2865,7 +2833,12 @@ cdrom_readtoc_fallback:
|
|||||||
if (gesn_cdb->class & (1 << GESN_MEDIA))
|
if (gesn_cdb->class & (1 << GESN_MEDIA))
|
||||||
{
|
{
|
||||||
gesn_event_header->notification_class |= GESN_MEDIA;
|
gesn_event_header->notification_class |= GESN_MEDIA;
|
||||||
used_len = cdrom_get_event_status(id, cdbufferb);
|
|
||||||
|
cdbufferb[4] = cdrom[id].media_status; /* Bits 7-4 = Reserved, Bits 4-1 = Media Status */
|
||||||
|
cdbufferb[5] = 1; /* Power Status (1 = Active) */
|
||||||
|
cdbufferb[6] = 0;
|
||||||
|
cdbufferb[7] = 0;
|
||||||
|
used_len = 8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2874,6 +2847,8 @@ cdrom_readtoc_fallback:
|
|||||||
}
|
}
|
||||||
gesn_event_header->len = used_len - sizeof(*gesn_event_header);
|
gesn_event_header->len = used_len - sizeof(*gesn_event_header);
|
||||||
|
|
||||||
|
memcpy(cdbufferb, gesn_event_header, 4);
|
||||||
|
|
||||||
if (SCSI_BufferLength == -1)
|
if (SCSI_BufferLength == -1)
|
||||||
{
|
{
|
||||||
SCSI_BufferLength = used_len;
|
SCSI_BufferLength = used_len;
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ typedef struct {
|
|||||||
#pragma pack(push,1)
|
#pragma pack(push,1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t previous_command;
|
uint8_t previous_command;
|
||||||
|
|
||||||
int toctimes;
|
int toctimes;
|
||||||
|
int media_status;
|
||||||
|
|
||||||
int is_dma;
|
int is_dma;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user