]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
cdrom: Break up very large read requests into smaller requests
authorKevin O'Connor <kevin@koconnor.net>
Mon, 29 Dec 2014 15:15:57 +0000 (10:15 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Mon, 29 Dec 2014 15:15:57 +0000 (10:15 -0500)
A cdrom boot image could be over 64K in size, but the low level
drivers may not support very large reads.  If a large cdrom image is
found, issue multiple reads so that a read request over 64K is never
issued.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/cdrom.c

index de0e7defbd3cd55c203071868e8540f64345e853..92f34f42b5b0e535f4835158586224a33d67670a 100644 (file)
@@ -212,12 +212,21 @@ cdrom_boot(struct drive_s *drive)
     CDEmu.device_spec = drive->cntl_id % 2;
 
     // And we read the image in memory
+    nbsectors = DIV_ROUND_UP(nbsectors, 4);
     dop.lba = lba;
-    dop.count = DIV_ROUND_UP(nbsectors, 4);
     dop.buf_fl = MAKE_FLATPTR(boot_segment, 0);
-    ret = scsi_process_op(&dop);
-    if (ret)
-        return 12;
+    while (nbsectors) {
+        int count = nbsectors;
+        if (count > 64*1024/CDROM_SECTOR_SIZE)
+            count = 64*1024/CDROM_SECTOR_SIZE;
+        dop.count = count;
+        ret = scsi_process_op(&dop);
+        if (ret)
+            return 12;
+        nbsectors -= count;
+        dop.lba += count;
+        dop.buf_fl += count*CDROM_SECTOR_SIZE;
+    }
 
     if (media == 0) {
         // No emulation requested - return success.