Added three NCR5380-based SCSI controllers (in dev branch);

Two-phases SCSI disk write direction commands (needed for the NCR5380);
Renamed cdrom_ioctl.c/h to win_cdrom_ioctl.c/h and moved them to win/;
Moved some CD-ROM and floppy initialization blocks to the appropriate files.
This commit is contained in:
OBattler
2017-10-08 05:04:38 +02:00
parent ffa22a216c
commit 05e3dbbb48
22 changed files with 2626 additions and 233 deletions

View File

@@ -8,7 +8,7 @@
*
* The generic SCSI device command handler.
*
* Version: @(#)scsi_device.c 1.0.5 2017/10/04
* Version: @(#)scsi_device.c 1.0.6 2017/10/07
*
* Authors: Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
@@ -277,7 +277,7 @@ int scsi_device_block_shift(uint8_t scsi_id, uint8_t scsi_lun)
}
void scsi_device_command(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len, uint8_t *cdb)
void scsi_device_command_common(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len, uint8_t *cdb, int multi_phase)
{
uint8_t phase = 0;
uint8_t lun_type = SCSIDevices[scsi_id][scsi_lun].LunType;
@@ -321,13 +321,51 @@ void scsi_device_command(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len, uint8_t
scsi_device_target_phase_callback(lun_type, id);
} else {
/* Command first phase complete - call the callback to execute the second phase. */
scsi_device_target_phase_callback(lun_type, id);
SCSIStatus = scsi_device_target_err_stat_to_scsi(lun_type, id);
/* Command second phase complete - call the callback to complete the command. */
scsi_device_target_phase_callback(lun_type, id);
if (multi_phase || (SCSIPhase != SCSI_PHASE_DATA_OUT))
{
scsi_device_target_phase_callback(lun_type, id);
SCSIStatus = scsi_device_target_err_stat_to_scsi(lun_type, id);
/* Command second phase complete - call the callback to complete the command. */
scsi_device_target_phase_callback(lun_type, id);
}
}
} else {
/* Error (Check Condition) - call the phase callback to complete the command. */
scsi_device_target_phase_callback(lun_type, id);
}
}
void scsi_device_command(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len, uint8_t *cdb)
{
scsi_device_command_common(scsi_id, scsi_lun, cdb_len, cdb, 1);
}
void scsi_device_command_phase0(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len, uint8_t *cdb)
{
scsi_device_command_common(scsi_id, scsi_lun, cdb_len, cdb, 0);
}
void scsi_device_command_phase1(uint8_t scsi_id, uint8_t scsi_lun)
{
uint8_t lun_type = SCSIDevices[scsi_id][scsi_lun].LunType;
uint8_t id = 0;
switch (lun_type)
{
case SCSI_DISK:
id = scsi_hard_disks[scsi_id][scsi_lun];
break;
case SCSI_CDROM:
id = scsi_cdrom_drives[scsi_id][scsi_lun];
break;
default:
id = 0;
break;
}
scsi_device_target_phase_callback(lun_type, id);
SCSIStatus = scsi_device_target_err_stat_to_scsi(lun_type, id);
/* Command second phase complete - call the callback to complete the command. */
scsi_device_target_phase_callback(lun_type, id);
}