atapi.c (c0bc0fa352ffc7f0a89038ef594b0df8b6bfcf1b) | atapi.c (26a122d3d47205969ca9e4cdba13adc2b2929d8c) |
---|---|
1/* 2 * QEMU ATAPI Emulation 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * Copyright (c) 2006 Openedhand Ltd. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal --- 14 unchanged lines hidden (view full) --- 23 * THE SOFTWARE. 24 */ 25 26#include "qemu/osdep.h" 27#include "hw/ide/internal.h" 28#include "hw/scsi/scsi.h" 29#include "sysemu/block-backend.h" 30 | 1/* 2 * QEMU ATAPI Emulation 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * Copyright (c) 2006 Openedhand Ltd. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal --- 14 unchanged lines hidden (view full) --- 23 * THE SOFTWARE. 24 */ 25 26#include "qemu/osdep.h" 27#include "hw/ide/internal.h" 28#include "hw/scsi/scsi.h" 29#include "sysemu/block-backend.h" 30 |
31#define ATAPI_SECTOR_BITS (2 + BDRV_SECTOR_BITS) 32#define ATAPI_SECTOR_SIZE (1 << ATAPI_SECTOR_BITS) 33 |
|
31static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret); 32 33static void padstr8(uint8_t *buf, int buf_size, const char *src) 34{ 35 int i; 36 for(i = 0; i < buf_size; i++) { 37 if (*src) 38 buf[i] = *src++; --- 67 unchanged lines hidden (view full) --- 106 memset(buf, 0, 288); 107} 108 109static int 110cd_read_sector_sync(IDEState *s) 111{ 112 int ret; 113 block_acct_start(blk_get_stats(s->blk), &s->acct, | 34static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret); 35 36static void padstr8(uint8_t *buf, int buf_size, const char *src) 37{ 38 int i; 39 for(i = 0; i < buf_size; i++) { 40 if (*src) 41 buf[i] = *src++; --- 67 unchanged lines hidden (view full) --- 109 memset(buf, 0, 288); 110} 111 112static int 113cd_read_sector_sync(IDEState *s) 114{ 115 int ret; 116 block_acct_start(blk_get_stats(s->blk), &s->acct, |
114 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); | 117 ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); |
115 116#ifdef DEBUG_IDE_ATAPI 117 printf("cd_read_sector_sync: lba=%d\n", s->lba); 118#endif 119 120 switch (s->cd_sector_size) { 121 case 2048: | 118 119#ifdef DEBUG_IDE_ATAPI 120 printf("cd_read_sector_sync: lba=%d\n", s->lba); 121#endif 122 123 switch (s->cd_sector_size) { 124 case 2048: |
122 ret = blk_read(s->blk, (int64_t)s->lba << 2, 123 s->io_buffer, 4); | 125 ret = blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, 126 s->io_buffer, ATAPI_SECTOR_SIZE); |
124 break; 125 case 2352: | 127 break; 128 case 2352: |
126 ret = blk_read(s->blk, (int64_t)s->lba << 2, 127 s->io_buffer + 16, 4); | 129 ret = blk_pread(s->blk, (int64_t)s->lba << ATAPI_SECTOR_BITS, 130 s->io_buffer + 16, ATAPI_SECTOR_SIZE); |
128 if (ret >= 0) { 129 cd_data_to_raw(s->io_buffer, s->lba); 130 } 131 break; 132 default: 133 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); 134 return -EIO; 135 } --- 41 unchanged lines hidden (view full) --- 177 if (s->cd_sector_size != 2048 && s->cd_sector_size != 2352) { 178 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); 179 return -EINVAL; 180 } 181 182 s->iov.iov_base = (s->cd_sector_size == 2352) ? 183 s->io_buffer + 16 : s->io_buffer; 184 | 131 if (ret >= 0) { 132 cd_data_to_raw(s->io_buffer, s->lba); 133 } 134 break; 135 default: 136 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); 137 return -EIO; 138 } --- 41 unchanged lines hidden (view full) --- 180 if (s->cd_sector_size != 2048 && s->cd_sector_size != 2352) { 181 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ); 182 return -EINVAL; 183 } 184 185 s->iov.iov_base = (s->cd_sector_size == 2352) ? 186 s->io_buffer + 16 : s->io_buffer; 187 |
185 s->iov.iov_len = 4 * BDRV_SECTOR_SIZE; | 188 s->iov.iov_len = ATAPI_SECTOR_SIZE; |
186 qemu_iovec_init_external(&s->qiov, &s->iov, 1); 187 188#ifdef DEBUG_IDE_ATAPI 189 printf("cd_read_sector: lba=%d\n", s->lba); 190#endif 191 192 block_acct_start(blk_get_stats(s->blk), &s->acct, | 189 qemu_iovec_init_external(&s->qiov, &s->iov, 1); 190 191#ifdef DEBUG_IDE_ATAPI 192 printf("cd_read_sector: lba=%d\n", s->lba); 193#endif 194 195 block_acct_start(blk_get_stats(s->blk), &s->acct, |
193 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); | 196 ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ); |
194 195 ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, 4, 196 cd_read_sector_cb, s); 197 198 s->status |= BUSY_STAT; 199 return 0; 200} 201 --- 228 unchanged lines hidden (view full) --- 430 s->io_buffer_size = n * 2048; 431 data_offset = 0; 432 } 433#ifdef DEBUG_AIO 434 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n); 435#endif 436 437 s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset); | 197 198 ide_buffered_readv(s, (int64_t)s->lba << 2, &s->qiov, 4, 199 cd_read_sector_cb, s); 200 201 s->status |= BUSY_STAT; 202 return 0; 203} 204 --- 228 unchanged lines hidden (view full) --- 433 s->io_buffer_size = n * 2048; 434 data_offset = 0; 435 } 436#ifdef DEBUG_AIO 437 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n); 438#endif 439 440 s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset); |
438 s->bus->dma->iov.iov_len = n * 4 * 512; | 441 s->bus->dma->iov.iov_len = n * ATAPI_SECTOR_SIZE; |
439 qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1); 440 441 s->bus->dma->aiocb = ide_buffered_readv(s, (int64_t)s->lba << 2, 442 &s->bus->dma->qiov, n * 4, 443 ide_atapi_cmd_read_dma_cb, s); 444 return; 445 446eot: --- 921 unchanged lines hidden --- | 442 qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1); 443 444 s->bus->dma->aiocb = ide_buffered_readv(s, (int64_t)s->lba << 2, 445 &s->bus->dma->qiov, n * 4, 446 ide_atapi_cmd_read_dma_cb, s); 447 return; 448 449eot: --- 921 unchanged lines hidden --- |