cdrom: use TEST UNIT READY to detect ready medium
[seabios.git] / src / cdrom.c
index 3769dfa6866d10c37ba3864b5f514fd5e56e38bd..b8179991da2f63211ab8cf259f1a64705f029437 100644 (file)
@@ -18,7 +18,6 @@
  ****************************************************************/
 
 struct drive_s *cdemu_drive_gf VAR16VISIBLE;
-u8 *cdemu_buf_fl VAR16VISIBLE;
 
 static int
 cdemu_read(struct disk_op_s *op)
@@ -33,7 +32,7 @@ cdemu_read(struct disk_op_s *op)
 
     int count = op->count;
     op->count = 0;
-    u8 *cdbuf_fl = GET_GLOBAL(cdemu_buf_fl);
+    u8 *cdbuf_fl = GET_GLOBAL(bounce_buf_fl);
 
     if (op->lba & 3) {
         // Partial read of first block.
@@ -111,17 +110,16 @@ cdemu_setup(void)
         return;
     if (!CDCount)
         return;
+    if (bounce_buf_init() < 0)
+        return;
 
     struct drive_s *drive_g = malloc_fseg(sizeof(*drive_g));
-    u8 *buf = malloc_low(CDROM_SECTOR_SIZE);
-    if (!drive_g || !buf) {
+    if (!drive_g) {
         warn_noalloc();
         free(drive_g);
-        free(buf);
         return;
     }
     cdemu_drive_gf = drive_g;
-    cdemu_buf_fl = buf;
     memset(drive_g, 0, sizeof(*drive_g));
     drive_g->type = DTYPE_CDEMU;
     drive_g->blksize = DISK_SECTOR_SIZE;
@@ -191,19 +189,18 @@ atapi_is_ready(struct disk_op_s *op)
 {
     dprintf(6, "atapi_is_ready (drive=%p)\n", op->drive_g);
 
-    /* Retry READ CAPACITY for 5 seconds unless MEDIUM NOT PRESENT is
+    /* Retry TEST UNIT READY for 5 seconds unless MEDIUM NOT PRESENT is
      * reported by the device.  If the device reports "IN PROGRESS",
      * 30 seconds is added. */
-    struct cdbres_read_capacity info;
     int in_progress = 0;
     u64 end = calc_future_tsc(5000);
     for (;;) {
         if (check_tsc(end)) {
-            dprintf(1, "read capacity failed\n");
+            dprintf(1, "test unit ready failed\n");
             return -1;
         }
 
-        int ret = cdb_read_capacity(op, &info);
+        int ret = cdb_test_unit_ready(op);
         if (!ret)
             // Success
             break;
@@ -228,15 +225,6 @@ atapi_is_ready(struct disk_op_s *op)
             in_progress = 1;
         }
     }
-
-    u32 blksize = ntohl(info.blksize), sectors = ntohl(info.sectors);
-    if (blksize != GET_GLOBAL(op->drive_g->blksize)) {
-        printf("Unsupported sector size %u\n", blksize);
-        return -1;
-    }
-
-    dprintf(6, "sectors=%u\n", sectors);
-    printf("%dMB medium detected\n", sectors>>(20-11));
     return 0;
 }