scsi_disk: Report image read/write errors

This commit is contained in:
RichardG867
2024-10-29 12:13:04 -03:00
parent 94e5fded31
commit 7b786a98fa
2 changed files with 33 additions and 6 deletions

View File

@@ -197,6 +197,7 @@
#define ASC_NONE 0x00
#define ASC_AUDIO_PLAY_OPERATION 0x00
#define ASC_NOT_READY 0x04
#define ASC_WRITE_ERROR 0x0c
#define ASC_UNRECOVERED_READ_ERROR 0x11
#define ASC_ILLEGAL_OPCODE 0x20
#define ASC_LBA_OUT_OF_RANGE 0x21

View File

@@ -647,6 +647,24 @@ scsi_disk_bus_master_error(scsi_common_t *sc)
scsi_disk_cmd_error(dev);
}
static void
scsi_disk_write_error(scsi_disk_t *dev)
{
scsi_disk_sense_key = SENSE_MEDIUM_ERROR;
scsi_disk_asc = ASC_WRITE_ERROR;
scsi_disk_ascq = 0;
scsi_disk_cmd_error(dev);
}
static void
scsi_disk_read_error(scsi_disk_t *dev)
{
scsi_disk_sense_key = SENSE_MEDIUM_ERROR;
scsi_disk_asc = ASC_UNRECOVERED_READ_ERROR;
scsi_disk_ascq = 0;
scsi_disk_cmd_error(dev);
}
static void
scsi_disk_invalid_lun(scsi_disk_t *dev)
{
@@ -727,10 +745,17 @@ scsi_disk_blocks(scsi_disk_t *dev, int32_t *len, UNUSED(int first_batch), int ou
*len = dev->requested_blocks << 9;
for (int i = 0; i < dev->requested_blocks; i++) {
if (out)
hdd_image_write(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9));
else
hdd_image_read(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9));
if (out) {
if (hdd_image_write(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)) < 0) {
scsi_disk_write_error(dev);
return -1;
}
} else {
if (hdd_image_read(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)) < 0) {
scsi_disk_read_error(dev);
return -1;
}
}
}
scsi_disk_log("%s %i bytes of blocks...\n", out ? "Written" : "Read", *len);
@@ -1040,7 +1065,7 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb)
ret = scsi_disk_blocks(dev, &alloc_length, 1, 0);
if (ret <= 0) {
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
dev->packet_status = PHASE_COMPLETE;
dev->packet_status = (ret < 0) ? PHASE_ERROR : PHASE_COMPLETE;
dev->callback = 20.0 * SCSI_TIME;
scsi_disk_set_callback(dev);
scsi_disk_buf_free(dev);
@@ -1501,7 +1526,8 @@ scsi_disk_phase_data_out(scsi_common_t *sc)
dev->temp_buffer[6] = (s >> 8) & 0xff;
dev->temp_buffer[7] = s & 0xff;
}
hdd_image_write(dev->id, i, 1, dev->temp_buffer);
if (hdd_image_write(dev->id, i, 1, dev->temp_buffer) < 0)
scsi_disk_write_error(dev);
}
break;
case GPCMD_MODE_SELECT_6: