Add retries to atapi autosense

This commit is contained in:
Matt Harlum 2024-05-24 22:42:38 +00:00 committed by Matt Harlum
parent 655ae7e9ea
commit 7843cf2855
3 changed files with 28 additions and 13 deletions

22
atapi.c
View File

@ -1224,4 +1224,26 @@ BYTE atapi_translate_play_audio_index(struct SCSICmd *cmd, struct IDEUnit *unit)
cmd->scsi_Status = (ret == 0) ? 0 : SCSI_CHECK_CONDITION;
return ret;
}
BYTE atapi_autosense(struct SCSICmd *scsi_command, struct IDEUnit *unit) {
UBYTE ret = 0;
struct SCSICmd *cmd = MakeSCSICmd(SZ_CDB_12);
if (cmd != NULL) {
cmd->scsi_Command[0] = SCSI_CMD_REQUEST_SENSE;
cmd->scsi_Command[4] = scsi_command->scsi_SenseLength & 0xFF;
cmd->scsi_Data = (UWORD *)scsi_command->scsi_SenseData;
cmd->scsi_Length = scsi_command->scsi_SenseLength;
cmd->scsi_Flags = SCSIF_READ;
cmd->scsi_CmdLength = 12;
ret = atapi_packet(cmd,unit);
scsi_command->scsi_SenseActual = cmd->scsi_Actual;
DeleteSCSICmd(cmd);
return ret;
} else {
return TDERR_NoMem;
}
}

View File

@ -55,4 +55,5 @@ BOOL atapi_get_track_msf(struct SCSI_CD_TOC *toc, int trackNum, struct SCSI_TRAC
BYTE atapi_play_track_index(struct IDEUnit *unit, UBYTE start, UBYTE end);
BYTE atapi_play_audio_msf(struct IDEUnit *unit, struct SCSI_TRACK_MSF *start, struct SCSI_TRACK_MSF *end);
BYTE atapi_translate_play_audio_index(struct SCSICmd *cmd, struct IDEUnit *unit);
BYTE atapi_autosense(struct SCSICmd *scsi_command, struct IDEUnit *unit);
#endif

View File

@ -306,20 +306,12 @@ static BYTE handle_scsi_command(struct IOStdReq *ioreq) {
if (scsi_command->scsi_Flags & (SCSIF_AUTOSENSE)) {
Trace("Auto sense requested\n");
// Request sense with retries
for (int retry = 0; retry < 3; retry++) {
if ((atapi_autosense(scsi_command,unit)) == 0)
break;
struct SCSICmd *cmd = MakeSCSICmd(SZ_CDB_12);
if (cmd != NULL) {
cmd->scsi_Command[0] = SCSI_CMD_REQUEST_SENSE;
cmd->scsi_Command[4] = scsi_command->scsi_SenseLength & 0xFF;
cmd->scsi_Data = (UWORD *)scsi_command->scsi_SenseData;
cmd->scsi_Length = scsi_command->scsi_SenseLength;
cmd->scsi_Flags = SCSIF_READ;
cmd->scsi_CmdLength = 12;
atapi_packet(cmd,unit);
scsi_command->scsi_SenseActual = cmd->scsi_Actual;
DeleteSCSICmd(cmd);
wait_us(unit->itask->tr,250000); // Wait 250ms before retrying
}
}
}