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>
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)
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;
// 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);
{
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;
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;
}