Merge pull request #3463 from 86Box/tc1995
SCSI card and CD-ROM fixes (below).
This commit is contained in:
@@ -976,7 +976,9 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
|
|||||||
break;
|
break;
|
||||||
case 0xc6:
|
case 0xc6:
|
||||||
case 0xc7:
|
case 0xc7:
|
||||||
if ((!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433"))) {
|
if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_DRIVEXM_3433") ||
|
||||||
|
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-3301TA_0272") ||
|
||||||
|
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "TOSHIBA_CD-ROM_XM-5701TA_3136")) {
|
||||||
bytes_per_second = 176.0 * 1024.0;
|
bytes_per_second = 176.0 * 1024.0;
|
||||||
bytes_per_second *= (double) dev->drv->cur_speed;
|
bytes_per_second *= (double) dev->drv->cur_speed;
|
||||||
}
|
}
|
||||||
@@ -1000,7 +1002,15 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
|
|||||||
break;
|
break;
|
||||||
case 0xc3:
|
case 0xc3:
|
||||||
if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") ||
|
if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-541_1.0i") ||
|
||||||
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00")) {
|
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "SONY_CD-ROM_CDU-76S_1.00") ||
|
||||||
|
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "PIONEER_CD-ROM_DRM-604X_2403")) {
|
||||||
|
bytes_per_second = 176.0 * 1024.0;
|
||||||
|
bytes_per_second *= (double) dev->drv->cur_speed;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0xde:
|
||||||
|
if (!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE74_1.00") ||
|
||||||
|
!strcmp(cdrom_drive_types[dev->drv->type].internal_name, "NEC_CD-ROM_DRIVE464_1.05")) {
|
||||||
bytes_per_second = 176.0 * 1024.0;
|
bytes_per_second = 176.0 * 1024.0;
|
||||||
bytes_per_second *= (double) dev->drv->cur_speed;
|
bytes_per_second *= (double) dev->drv->cur_speed;
|
||||||
}
|
}
|
||||||
|
@@ -379,9 +379,9 @@ esp_get_cmd(esp_t *dev, uint32_t maxlen)
|
|||||||
dma_set_drq(dev->DmaChannel, 0);
|
dma_set_drq(dev->DmaChannel, 0);
|
||||||
} else {
|
} else {
|
||||||
esp_pci_dma_memory_rw(dev, buf, dmalen, WRITE_TO_DEVICE);
|
esp_pci_dma_memory_rw(dev, buf, dmalen, WRITE_TO_DEVICE);
|
||||||
dmalen = MIN(fifo8_num_free(&dev->cmdfifo), dmalen);
|
|
||||||
fifo8_push_all(&dev->cmdfifo, buf, dmalen);
|
|
||||||
}
|
}
|
||||||
|
dmalen = MIN(fifo8_num_free(&dev->cmdfifo), dmalen);
|
||||||
|
fifo8_push_all(&dev->cmdfifo, buf, dmalen);
|
||||||
} else {
|
} else {
|
||||||
dmalen = MIN(fifo8_num_used(&dev->fifo), maxlen);
|
dmalen = MIN(fifo8_num_used(&dev->fifo), maxlen);
|
||||||
esp_log("ESP Get command, dmalen = %i\n", dmalen);
|
esp_log("ESP Get command, dmalen = %i\n", dmalen);
|
||||||
@@ -545,6 +545,8 @@ esp_hard_reset(esp_t *dev)
|
|||||||
dev->do_cmd = 0;
|
dev->do_cmd = 0;
|
||||||
dev->rregs[ESP_CFG1] = dev->mca ? dev->HostID : 7;
|
dev->rregs[ESP_CFG1] = dev->mca ? dev->HostID : 7;
|
||||||
esp_log("ESP Reset\n");
|
esp_log("ESP Reset\n");
|
||||||
|
for (uint8_t i = 0; i < 16; i++)
|
||||||
|
scsi_device_reset(&scsi_devices[dev->bus][i]);
|
||||||
timer_stop(&dev->timer);
|
timer_stop(&dev->timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +571,6 @@ esp_do_nodma(esp_t *dev, scsi_device_t *sd)
|
|||||||
esp_do_cmd(dev);
|
esp_do_cmd(dev);
|
||||||
} else {
|
} else {
|
||||||
dev->cmdfifo_cdb_offset = fifo8_num_used(&dev->cmdfifo);
|
dev->cmdfifo_cdb_offset = fifo8_num_used(&dev->cmdfifo);
|
||||||
;
|
|
||||||
esp_log("CDB offset = %i used\n", dev->cmdfifo_cdb_offset);
|
esp_log("CDB offset = %i used\n", dev->cmdfifo_cdb_offset);
|
||||||
|
|
||||||
dev->rregs[ESP_RSTAT] = STAT_TC | STAT_CD;
|
dev->rregs[ESP_RSTAT] = STAT_TC | STAT_CD;
|
||||||
@@ -665,7 +666,7 @@ esp_do_dma(esp_t *dev, scsi_device_t *sd)
|
|||||||
|
|
||||||
count = tdbc = esp_get_tc(dev);
|
count = tdbc = esp_get_tc(dev);
|
||||||
|
|
||||||
if (dev->mca) { /*See the comment in the esp_do_busid_cmd() function.*/
|
if (dev->mca) {
|
||||||
if (sd->buffer_length < 0) {
|
if (sd->buffer_length < 0) {
|
||||||
if (dev->dma_enabled)
|
if (dev->dma_enabled)
|
||||||
goto done;
|
goto done;
|
||||||
@@ -713,7 +714,7 @@ esp_do_dma(esp_t *dev, scsi_device_t *sd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_log("ESP SCSI dmaleft = %d, async_len = %i, buffer length = %d\n", esp_get_tc(dev), sd->buffer_length);
|
esp_log("ESP SCSI dmaleft = %d, buffer length = %d\n", esp_get_tc(dev), sd->buffer_length);
|
||||||
|
|
||||||
/* Make sure count is never bigger than buffer_length. */
|
/* Make sure count is never bigger than buffer_length. */
|
||||||
if (count > dev->xfer_counter)
|
if (count > dev->xfer_counter)
|
||||||
@@ -1082,6 +1083,9 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val)
|
|||||||
esp_pci_soft_reset(dev);
|
esp_pci_soft_reset(dev);
|
||||||
break;
|
break;
|
||||||
case CMD_BUSRESET:
|
case CMD_BUSRESET:
|
||||||
|
for (uint8_t i = 0; i < 16; i++)
|
||||||
|
scsi_device_reset(&scsi_devices[dev->bus][i]);
|
||||||
|
|
||||||
if (!(dev->wregs[ESP_CFG1] & CFG1_RESREPT)) {
|
if (!(dev->wregs[ESP_CFG1] & CFG1_RESREPT)) {
|
||||||
dev->rregs[ESP_RINTR] |= INTR_RST;
|
dev->rregs[ESP_RINTR] |= INTR_RST;
|
||||||
esp_log("ESP Bus Reset with IRQ\n");
|
esp_log("ESP Bus Reset with IRQ\n");
|
||||||
|
Reference in New Issue
Block a user