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 ---