cdrom: use TEST UNIT READY to detect ready medium
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 16 Nov 2011 12:02:42 +0000 (13:02 +0100)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 18 Nov 2011 02:01:31 +0000 (21:01 -0500)
The READ CAPACITY output is not used except for some debugging messages.
In the future, we will use this code for USB sticks too, but those
already send READ CAPACITY.  To avoid code duplication, switch to TEST
UNIT READY for this task.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
src/blockcmd.c
src/blockcmd.h
src/cdrom.c

index c9c6845ae752540ca35f6887be2b9b3387e45e06..c12772909042d8910865301f3644ad87ae4b8b8b 100644 (file)
@@ -56,6 +56,18 @@ cdb_get_sense(struct disk_op_s *op, struct cdbres_request_sense *data)
     return cdb_cmd_data(op, &cmd, sizeof(*data));
 }
 
+// Test unit ready
+int
+cdb_test_unit_ready(struct disk_op_s *op)
+{
+    struct cdb_request_sense cmd;
+    memset(&cmd, 0, sizeof(cmd));
+    cmd.command = CDB_CMD_TEST_UNIT_READY;
+    op->count = 0;
+    op->buf_fl = NULL;
+    return cdb_cmd_data(op, &cmd, 0);
+}
+
 // Request capacity
 int
 cdb_read_capacity(struct disk_op_s *op, struct cdbres_read_capacity *data)
index 903c435f7b987f7ec1c2e235cf61f21c39f2c732..49921b05d86fdfc2006da4a45b55f2608bc61332 100644 (file)
@@ -32,8 +32,9 @@ struct cdbres_read_capacity {
     u32 blksize;
 } PACKED;
 
-#define CDB_CMD_INQUIRY 0x12
-#define CDB_CMD_REQUEST_SENSE 0x03
+#define CDB_CMD_TEST_UNIT_READY  0x00
+#define CDB_CMD_INQUIRY          0x12
+#define CDB_CMD_REQUEST_SENSE    0x03
 
 struct cdb_request_sense {
     u8 command;
@@ -70,6 +71,7 @@ struct cdbres_inquiry {
 // blockcmd.c
 int cdb_get_inquiry(struct disk_op_s *op, struct cdbres_inquiry *data);
 int cdb_get_sense(struct disk_op_s *op, struct cdbres_request_sense *data);
+int cdb_test_unit_ready(struct disk_op_s *op);
 int cdb_read_capacity(struct disk_op_s *op, struct cdbres_read_capacity *data);
 int cdb_inquiry(struct disk_op_s *op, struct cdbres_inquiry *data);
 int cdb_read(struct disk_op_s *op);
index 6351fec0f3ac6fa257989d6b4ba1dfaa957f4b39..b8179991da2f63211ab8cf259f1a64705f029437 100644 (file)
@@ -189,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;
@@ -226,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;
 }