CD-ROM, ATAPI HDD, MO, and ZIP: correct bus speed arithmetic, makes especially MO and ZIP much faster.
This commit is contained in:
@@ -486,19 +486,16 @@ mo_bus_speed(mo_t *dev)
|
|||||||
{
|
{
|
||||||
double ret = -1.0;
|
double ret = -1.0;
|
||||||
|
|
||||||
if (dev && dev->drv && (dev->drv->bus_type == MO_BUS_SCSI)) {
|
|
||||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
|
||||||
return 0.0;
|
|
||||||
} else {
|
|
||||||
if (dev && dev->drv)
|
if (dev && dev->drv)
|
||||||
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
||||||
|
|
||||||
if (ret == -1.0) {
|
if (ret == -1.0) {
|
||||||
if (dev)
|
if (dev)
|
||||||
dev->callback = -1.0;
|
dev->callback = -1.0;
|
||||||
return 0.0;
|
ret = 0.0;
|
||||||
} else
|
|
||||||
return ret * 1000000.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -509,18 +506,10 @@ mo_command_common(mo_t *dev)
|
|||||||
dev->tf->pos = 0;
|
dev->tf->pos = 0;
|
||||||
if (dev->packet_status == PHASE_COMPLETE)
|
if (dev->packet_status == PHASE_COMPLETE)
|
||||||
dev->callback = 0.0;
|
dev->callback = 0.0;
|
||||||
else {
|
else if (dev->drv->bus_type == MO_BUS_SCSI)
|
||||||
double bytes_per_second;
|
|
||||||
|
|
||||||
if (dev->drv->bus_type == MO_BUS_SCSI) {
|
|
||||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
||||||
return;
|
else
|
||||||
} else
|
dev->callback = mo_bus_speed(dev) * (double) (dev->packet_len);
|
||||||
bytes_per_second = mo_bus_speed(dev);
|
|
||||||
|
|
||||||
const double period = 1000000.0 / bytes_per_second;
|
|
||||||
dev->callback = period * (double) (dev->packet_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
mo_set_callback(dev);
|
mo_set_callback(dev);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -567,19 +567,16 @@ zip_bus_speed(zip_t *dev)
|
|||||||
{
|
{
|
||||||
double ret = -1.0;
|
double ret = -1.0;
|
||||||
|
|
||||||
if (dev && dev->drv && (dev->drv->bus_type == ZIP_BUS_SCSI)) {
|
|
||||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
|
||||||
return 0.0;
|
|
||||||
} else {
|
|
||||||
if (dev && dev->drv)
|
if (dev && dev->drv)
|
||||||
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
ret = ide_atapi_get_period(dev->drv->ide_channel);
|
||||||
|
|
||||||
if (ret == -1.0) {
|
if (ret == -1.0) {
|
||||||
if (dev)
|
if (dev)
|
||||||
dev->callback = -1.0;
|
dev->callback = -1.0;
|
||||||
return 0.0;
|
ret = 0.0;
|
||||||
} else
|
|
||||||
return ret * 1000000.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -590,18 +587,10 @@ zip_command_common(zip_t *dev)
|
|||||||
dev->tf->pos = 0;
|
dev->tf->pos = 0;
|
||||||
if (dev->packet_status == PHASE_COMPLETE)
|
if (dev->packet_status == PHASE_COMPLETE)
|
||||||
dev->callback = 0.0;
|
dev->callback = 0.0;
|
||||||
else {
|
else if (dev->drv->bus_type == ZIP_BUS_SCSI)
|
||||||
double bytes_per_second;
|
|
||||||
|
|
||||||
if (dev->drv->bus_type == ZIP_BUS_SCSI) {
|
|
||||||
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
dev->callback = -1.0; /* Speed depends on SCSI controller */
|
||||||
return;
|
else
|
||||||
} else
|
dev->callback = zip_bus_speed(dev) * (double) (dev->packet_len);
|
||||||
bytes_per_second = zip_bus_speed(dev);
|
|
||||||
|
|
||||||
double period = 1000000.0 / bytes_per_second;
|
|
||||||
dev->callback = period * (double) (dev->packet_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
zip_set_callback(dev);
|
zip_set_callback(dev);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -656,7 +656,7 @@ scsi_cdrom_bus_speed(scsi_cdrom_t *dev)
|
|||||||
dev->callback = -1.0;
|
dev->callback = -1.0;
|
||||||
return 0.0;
|
return 0.0;
|
||||||
} else
|
} else
|
||||||
return ret * 1000000.0;
|
return 1000000.0 / ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,9 +1069,10 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, const int msf, const int type, const int
|
|||||||
dev->block_len = temp_len;
|
dev->block_len = temp_len;
|
||||||
|
|
||||||
if ((dev->drv->bus_type != CDROM_BUS_SCSI) &&
|
if ((dev->drv->bus_type != CDROM_BUS_SCSI) &&
|
||||||
(scsi_cdrom_current_mode(dev) != 2))
|
(scsi_cdrom_current_mode(dev) != 2)) {
|
||||||
num = (dev->packet_len / dev->block_len);
|
num = (dev->packet_len / dev->block_len);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dev->sector_pos++;
|
dev->sector_pos++;
|
||||||
dev->drv->seek_pos = dev->sector_pos;
|
dev->drv->seek_pos = dev->sector_pos;
|
||||||
@@ -1126,7 +1127,7 @@ scsi_cdrom_read_blocks(scsi_cdrom_t *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (!dev->sector_len) {
|
if (dev->sector_len == 0) {
|
||||||
scsi_cdrom_command_complete(dev);
|
scsi_cdrom_command_complete(dev);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -400,7 +400,8 @@ scsi_disk_bus_speed(scsi_disk_t *dev)
|
|||||||
dev->callback = -1.0;
|
dev->callback = -1.0;
|
||||||
return 0.0;
|
return 0.0;
|
||||||
} else
|
} else
|
||||||
return ret * 1000000.0;
|
/* We get bytes per µs, so divide 1000000.0 by it. */
|
||||||
|
return 1000000.0 / ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,6 +485,10 @@ scsi_disk_command_common(scsi_disk_t *dev)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
For ATAPI, this will be 1000000.0 / µs_per_byte, and this will
|
||||||
|
convert it back to µs_per_byte.
|
||||||
|
*/
|
||||||
period = 1000000.0 / bytes_per_second;
|
period = 1000000.0 / bytes_per_second;
|
||||||
scsi_disk_log(dev->log, "Byte transfer period: %" PRIu64 " us\n",
|
scsi_disk_log(dev->log, "Byte transfer period: %" PRIu64 " us\n",
|
||||||
(uint64_t) period);
|
(uint64_t) period);
|
||||||
|
|||||||
Reference in New Issue
Block a user