disk: Improve algorithm to determine fastest transfer size
diff --git a/stage23/drivers/disk.s2.c b/stage23/drivers/disk.s2.c
index ebcc9788..bd53a30f 100644
--- a/stage23/drivers/disk.s2.c
+++ b/stage23/drivers/disk.s2.c
@@ -59,23 +59,24 @@ static size_t fastest_xfer_size(struct volume *volume) {
dap.offset = rm_off(xfer_buf);
dap.lba = 0;
- struct rm_regs r = {0};
- r.eax = 0x4200;
- r.edx = volume->drive;
- r.esi = (uint32_t)rm_off(&dap);
- r.ds = rm_seg(&dap);
-
uint64_t start_timestamp = rdtsc();
- rm_int(0x13, &r, &r);
- uint64_t end_timestamp = rdtsc();
-
- if (r.eflags & EFLAGS_CF) {
- int ah = (r.eax >> 8) & 0xff;
- printv("Disk error %x. Drive %x", ah, volume->drive);
- continue;
+ for (size_t j = 0; j < XFER_BUF_SIZE / 512; j += xfer_sizes[i]) {
+ struct rm_regs r = {0};
+ r.eax = 0x4200;
+ r.edx = volume->drive;
+ r.esi = (uint32_t)rm_off(&dap);
+ r.ds = rm_seg(&dap);
+ rm_int(0x13, &r, &r);
+ if (r.eflags & EFLAGS_CF) {
+ int ah = (r.eax >> 8) & 0xff;
+ printv("Disk error %x. Drive %x", ah, volume->drive);
+ return 8;
+ }
+ dap.lba += xfer_sizes[i];
}
+ uint64_t end_timestamp = rdtsc();
- uint64_t speed = (end_timestamp - start_timestamp) / xfer_sizes[i];
+ uint64_t speed = end_timestamp - start_timestamp;
if (speed < last_speed) {
last_speed = speed;
