Attempted fix for SCSI disk seek timings.
This commit is contained in:
@@ -159,8 +159,8 @@ typedef struct hard_disk_t {
|
|||||||
char fn[1024]; /* Name of current image file */
|
char fn[1024]; /* Name of current image file */
|
||||||
char vhd_parent[1041]; /* Differential VHD parent file */
|
char vhd_parent[1041]; /* Differential VHD parent file */
|
||||||
|
|
||||||
uint32_t res0;
|
uint32_t seek_pos;
|
||||||
uint32_t pad1;
|
uint32_t seek_len;
|
||||||
uint32_t base;
|
uint32_t base;
|
||||||
uint32_t spt;
|
uint32_t spt;
|
||||||
uint32_t hpc; /* Physical geometry parameters */
|
uint32_t hpc; /* Physical geometry parameters */
|
||||||
|
@@ -446,7 +446,7 @@ scsi_disk_command_common(scsi_disk_t *dev)
|
|||||||
case GPCMD_WRITE_AND_VERIFY_12:
|
case GPCMD_WRITE_AND_VERIFY_12:
|
||||||
case GPCMD_WRITE_SAME_10:
|
case GPCMD_WRITE_SAME_10:
|
||||||
/* Seek time is in us. */
|
/* Seek time is in us. */
|
||||||
period = hdd_timing_write(dev->drv, dev->sector_pos, dev->packet_len >> 9);
|
period = hdd_timing_write(dev->drv, dev->drv->seek_pos, dev->drv->seek_len);
|
||||||
scsi_disk_log("SCSI HD %i: Seek period: %" PRIu64 " us\n",
|
scsi_disk_log("SCSI HD %i: Seek period: %" PRIu64 " us\n",
|
||||||
dev->id, (uint64_t) period);
|
dev->id, (uint64_t) period);
|
||||||
dev->callback += period;
|
dev->callback += period;
|
||||||
@@ -482,7 +482,7 @@ scsi_disk_command_common(scsi_disk_t *dev)
|
|||||||
case 0x28:
|
case 0x28:
|
||||||
case 0xa8:
|
case 0xa8:
|
||||||
/* Seek time is in us. */
|
/* Seek time is in us. */
|
||||||
period = hdd_timing_read(dev->drv, dev->sector_pos, dev->packet_len >> 9);
|
period = hdd_timing_read(dev->drv, dev->drv->seek_pos, dev->drv->seek_len);
|
||||||
scsi_disk_log("SCSI HD %i: Seek period: %" PRIu64 " us\n",
|
scsi_disk_log("SCSI HD %i: Seek period: %" PRIu64 " us\n",
|
||||||
dev->id, (uint64_t) period);
|
dev->id, (uint64_t) period);
|
||||||
dev->callback += period;
|
dev->callback += period;
|
||||||
@@ -928,6 +928,10 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb)
|
|||||||
|
|
||||||
case GPCMD_REZERO_UNIT:
|
case GPCMD_REZERO_UNIT:
|
||||||
dev->sector_pos = dev->sector_len = 0;
|
dev->sector_pos = dev->sector_len = 0;
|
||||||
|
|
||||||
|
dev->drv->seek_pos = dev->sector_pos;
|
||||||
|
dev->drv->seek_len = dev->sector_len;
|
||||||
|
|
||||||
scsi_disk_seek(dev, 0);
|
scsi_disk_seek(dev, 0);
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
||||||
break;
|
break;
|
||||||
@@ -1031,6 +1035,9 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb)
|
|||||||
dev->packet_len = max_len * alloc_length;
|
dev->packet_len = max_len * alloc_length;
|
||||||
scsi_disk_buf_alloc(dev, dev->packet_len);
|
scsi_disk_buf_alloc(dev, dev->packet_len);
|
||||||
|
|
||||||
|
dev->drv->seek_pos = dev->sector_pos;
|
||||||
|
dev->drv->seek_len = dev->sector_len;
|
||||||
|
|
||||||
ret = scsi_disk_blocks(dev, &alloc_length, 1, 0);
|
ret = scsi_disk_blocks(dev, &alloc_length, 1, 0);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
||||||
@@ -1118,6 +1125,9 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->drv->seek_pos = dev->sector_pos;
|
||||||
|
dev->drv->seek_len = dev->sector_len;
|
||||||
|
|
||||||
max_len = dev->sector_len;
|
max_len = dev->sector_len;
|
||||||
/*
|
/*
|
||||||
If we're writing all blocks in one go for DMA, why not also for
|
If we're writing all blocks in one go for DMA, why not also for
|
||||||
@@ -1371,6 +1381,10 @@ atapi_out:
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->drv->seek_pos = dev->sector_pos;
|
||||||
|
dev->drv->seek_len = 0;
|
||||||
|
|
||||||
scsi_disk_seek(dev, pos);
|
scsi_disk_seek(dev, pos);
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
||||||
|
Reference in New Issue
Block a user