IDE soft reset should also reset ATAPI devices. Should fix at least some 'Device failed to request command' errors.

This commit is contained in:
SarahW 2019-04-14 13:47:20 +01:00
commit 9a49a75eaf
8 changed files with 52 additions and 0 deletions

View file

@ -819,6 +819,7 @@ void callbackide(int ide_board)
{
ide->cylinder=0xEB14;
atapi->stop();
atapi_reset(&ide->atapi);
}
if (ide->type == IDE_NONE)
{
@ -829,6 +830,7 @@ void callbackide(int ide_board)
{
ide_other->cylinder=0xEB14;
atapi->stop();
atapi_reset(&ide_other->atapi);
}
if (ide_other->type == IDE_NONE)
{

View file

@ -563,3 +563,13 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
break;
}
}
void atapi_reset(atapi_device_t *atapi_dev)
{
pclog("atapi_reset\n");
atapi_dev->state = ATAPI_STATE_IDLE;
atapi_dev->command_pos = 0;
atapi_dev->data_read_pos = 0;
atapi_dev->data_write_pos = 0;
scsi_bus_reset(&atapi_dev->bus);
}

View file

@ -64,5 +64,6 @@ uint8_t atapi_read_iir(atapi_device_t *atapi_dev);
uint8_t atapi_read_drq(atapi_device_t *atapi_dev);
void atapi_process_packet(atapi_device_t *atapi_dev);
void atapi_set_transfer_granularity(atapi_device_t *atapi_dev, int size);
void atapi_reset(atapi_device_t *atapi_dev);
#endif

View file

@ -374,3 +374,21 @@ void scsi_bus_close(scsi_bus_t *bus)
bus->devices[c]->close(bus->device_data[c]);
}
}
void scsi_bus_reset(scsi_bus_t *bus)
{
int c;
bus->state = STATE_IDLE;
bus->clear_req = 0;
bus->change_state_delay = 0;
bus->new_req_delay = 0;
bus->bus_in = bus->bus_out = 0;
bus->command_pos = 0;
for (c = 0; c < 8; c++)
{
if (bus->device_data[c] && bus->devices[c]->reset)
bus->devices[c]->reset(bus->device_data[c]);
}
}

View file

@ -9,6 +9,7 @@ typedef struct scsi_device_t
void *(*init)(struct scsi_bus_t *bus, int id);
void *(*atapi_init)(struct scsi_bus_t *bus, int id, struct atapi_device_t *atapi_dev);
void (*close)(void *p);
void (*reset)(void *p);
void (*start_command)(void *p);
int (*command)(uint8_t *cdb, void *p);
@ -106,6 +107,7 @@ int scsi_bus_match(scsi_bus_t *bus, int bus_assert);
void scsi_bus_kick(scsi_bus_t *bus);
void scsi_bus_init(scsi_bus_t *bus);
void scsi_bus_close(scsi_bus_t *bus);
void scsi_bus_reset(scsi_bus_t *bus);
void scsi_bus_atapi_init(scsi_bus_t *bus, scsi_device_t *device, int id, struct atapi_device_t *atapi_dev);

View file

@ -420,6 +420,14 @@ static void scsi_cd_close(void *p)
free(data);
}
static void scsi_cd_reset(void *p)
{
scsi_cd_data_t *data = p;
timer_disable(&data->callback_timer);
data->cmd_pos = CMD_POS_IDLE;
}
static void scsi_cd_illegal(scsi_cd_data_t *data)
{
atapi_cmd_error(data, KEY_ILLEGAL_REQ, ASC_INVALID_LUN, 0);
@ -1546,6 +1554,7 @@ scsi_device_t scsi_cd =
scsi_cd_init,
scsi_cd_atapi_init,
scsi_cd_close,
scsi_cd_reset,
scsi_cd_start_command,
scsi_cd_command,

View file

@ -816,6 +816,7 @@ scsi_device_t scsi_hd =
scsi_hd_init,
NULL,
scsi_hd_close,
NULL,
scsi_hd_start_command,
scsi_hd_command,

View file

@ -218,6 +218,14 @@ static void scsi_zip_close(void *p)
zip_data = NULL;
}
static void scsi_zip_reset(void *p)
{
scsi_zip_data *data = p;
timer_disable(&data->callback_timer);
data->cmd_pos = CMD_POS_IDLE;
}
static int scsi_add_data(uint8_t val, void *p)
{
scsi_zip_data *data = p;
@ -1195,6 +1203,7 @@ scsi_device_t scsi_zip =
scsi_zip_init,
scsi_zip_atapi_init,
scsi_zip_close,
scsi_zip_reset,
scsi_zip_start_command,
scsi_zip_command,