****************************************************************/
struct drive_s *cdemu_drive_gf VAR16VISIBLE;
-u8 *cdemu_buf_fl VAR16VISIBLE;
static int
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.
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;
{
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;
}