atapi.c (bc7c6c1fec2e9aa1ff6f2e018ed641db1429315c) atapi.c (5f81724d80a1492c73d329242663962139db739b)
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

--- 91 unchanged lines hidden (view full) ---

100 buf[3] = 0x01; /* mode 1 data */
101 buf += 4;
102 /* data */
103 buf += 2048;
104 /* XXX: ECC not computed */
105 memset(buf, 0, 288);
106}
107
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

--- 91 unchanged lines hidden (view full) ---

100 buf[3] = 0x01; /* mode 1 data */
101 buf += 4;
102 /* data */
103 buf += 2048;
104 /* XXX: ECC not computed */
105 memset(buf, 0, 288);
106}
107
108static int cd_read_sector(IDEState *s, int lba, uint8_t *buf, int sector_size)
108static int
109cd_read_sector_sync(IDEState *s)
109{
110 int ret;
111 block_acct_start(blk_get_stats(s->blk), &s->acct,
112 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
113
110{
111 int ret;
112 block_acct_start(blk_get_stats(s->blk), &s->acct,
113 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
114
114 switch(sector_size) {
115#ifdef DEBUG_IDE_ATAPI
116 printf("cd_read_sector_sync: lba=%d\n", s->lba);
117#endif
118
119 switch (s->cd_sector_size) {
115 case 2048:
120 case 2048:
116 ret = blk_read(s->blk, (int64_t)lba << 2, buf, 4);
121 ret = blk_read(s->blk, (int64_t)s->lba << 2,
122 s->io_buffer, 4);
117 break;
118 case 2352:
123 break;
124 case 2352:
119 ret = blk_read(s->blk, (int64_t)lba << 2, buf + 16, 4);
125 ret = blk_read(s->blk, (int64_t)s->lba << 2,
126 s->io_buffer + 16, 4);
120 if (ret >= 0) {
127 if (ret >= 0) {
121 cd_data_to_raw(buf, lba);
128 cd_data_to_raw(s->io_buffer, s->lba);
122 }
123 break;
124 default:
125 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ);
126 return -EIO;
127 }
128
129 if (ret < 0) {
130 block_acct_failed(blk_get_stats(s->blk), &s->acct);
131 } else {
132 block_acct_done(blk_get_stats(s->blk), &s->acct);
129 }
130 break;
131 default:
132 block_acct_invalid(blk_get_stats(s->blk), BLOCK_ACCT_READ);
133 return -EIO;
134 }
135
136 if (ret < 0) {
137 block_acct_failed(blk_get_stats(s->blk), &s->acct);
138 } else {
139 block_acct_done(blk_get_stats(s->blk), &s->acct);
140 s->lba++;
141 s->io_buffer_index = 0;
133 }
134
135 return ret;
136}
137
142 }
143
144 return ret;
145}
146
147static void cd_read_sector_cb(void *opaque, int ret)
148{
149 IDEState *s = opaque;
150
151 block_acct_done(blk_get_stats(s->blk), &s->acct);
152
153#ifdef DEBUG_IDE_ATAPI
154 printf("cd_read_sector_cb: lba=%d ret=%d\n", s->lba, ret);
155#endif
156
157 if (ret < 0) {
158 ide_atapi_io_error(s, ret);
159 return;
160 }
161
162 if (s->cd_sector_size == 2352) {
163 cd_data_to_raw(s->io_buffer, s->lba);
164 }
165
166 s->lba++;
167 s->io_buffer_index = 0;
168 s->status &= ~BUSY_STAT;
169
170 ide_atapi_cmd_reply_end(s);
171}
172
173static int cd_read_sector(IDEState *s)
174{
175 if (s->cd_sector_size != 2048 && s->cd_sector_size != 2352) {
176 return -EINVAL;
177 }
178
179 s->iov.iov_base = (s->cd_sector_size == 2352) ?
180 s->io_buffer + 16 : s->io_buffer;
181
182 s->iov.iov_len = 4 * BDRV_SECTOR_SIZE;
183 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
184
185#ifdef DEBUG_IDE_ATAPI
186 printf("cd_read_sector: lba=%d\n", s->lba);
187#endif
188
189 block_acct_start(blk_get_stats(s->blk), &s->acct,
190 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
191
192 blk_aio_readv(s->blk, (int64_t)s->lba << 2, &s->qiov, 4,
193 cd_read_sector_cb, s);
194
195 s->status |= BUSY_STAT;
196 return 0;
197}
198
138void ide_atapi_cmd_ok(IDEState *s)
139{
140 s->error = 0;
141 s->status = READY_STAT | SEEK_STAT;
142 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
143 ide_transfer_stop(s);
144 ide_set_irq(s->bus);
145}

--- 45 unchanged lines hidden (view full) ---

191 s->elementary_transfer_size,
192 s->io_buffer_index);
193#endif
194 if (s->packet_transfer_size <= 0) {
195 /* end of transfer */
196 ide_atapi_cmd_ok(s);
197 ide_set_irq(s->bus);
198#ifdef DEBUG_IDE_ATAPI
199void ide_atapi_cmd_ok(IDEState *s)
200{
201 s->error = 0;
202 s->status = READY_STAT | SEEK_STAT;
203 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
204 ide_transfer_stop(s);
205 ide_set_irq(s->bus);
206}

--- 45 unchanged lines hidden (view full) ---

252 s->elementary_transfer_size,
253 s->io_buffer_index);
254#endif
255 if (s->packet_transfer_size <= 0) {
256 /* end of transfer */
257 ide_atapi_cmd_ok(s);
258 ide_set_irq(s->bus);
259#ifdef DEBUG_IDE_ATAPI
199 printf("status=0x%x\n", s->status);
260 printf("end of transfer, status=0x%x\n", s->status);
200#endif
201 } else {
202 /* see if a new sector must be read */
203 if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
261#endif
262 } else {
263 /* see if a new sector must be read */
264 if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
204 ret = cd_read_sector(s, s->lba, s->io_buffer, s->cd_sector_size);
205 if (ret < 0) {
206 ide_atapi_io_error(s, ret);
265 if (!s->elementary_transfer_size) {
266 ret = cd_read_sector(s);
267 if (ret < 0) {
268 ide_atapi_io_error(s, ret);
269 }
207 return;
270 return;
271 } else {
272 /* rebuffering within an elementary transfer is
273 * only possible with a sync request because we
274 * end up with a race condition otherwise */
275 ret = cd_read_sector_sync(s);
276 if (ret < 0) {
277 ide_atapi_io_error(s, ret);
278 return;
279 }
208 }
280 }
209 s->lba++;
210 s->io_buffer_index = 0;
211 }
212 if (s->elementary_transfer_size > 0) {
213 /* there are some data left to transmit in this elementary
214 transfer */
215 size = s->cd_sector_size - s->io_buffer_index;
216 if (size > s->elementary_transfer_size)
217 size = s->elementary_transfer_size;
218 s->packet_transfer_size -= size;

--- 63 unchanged lines hidden (view full) ---

282 int sector_size)
283{
284 s->lba = lba;
285 s->packet_transfer_size = nb_sectors * sector_size;
286 s->elementary_transfer_size = 0;
287 s->io_buffer_index = sector_size;
288 s->cd_sector_size = sector_size;
289
281 }
282 if (s->elementary_transfer_size > 0) {
283 /* there are some data left to transmit in this elementary
284 transfer */
285 size = s->cd_sector_size - s->io_buffer_index;
286 if (size > s->elementary_transfer_size)
287 size = s->elementary_transfer_size;
288 s->packet_transfer_size -= size;

--- 63 unchanged lines hidden (view full) ---

352 int sector_size)
353{
354 s->lba = lba;
355 s->packet_transfer_size = nb_sectors * sector_size;
356 s->elementary_transfer_size = 0;
357 s->io_buffer_index = sector_size;
358 s->cd_sector_size = sector_size;
359
290 s->status = READY_STAT | SEEK_STAT;
291 ide_atapi_cmd_reply_end(s);
292}
293
294static void ide_atapi_cmd_check_status(IDEState *s)
295{
296#ifdef DEBUG_IDE_ATAPI
297 printf("atapi_cmd_check_status\n");
298#endif

--- 68 unchanged lines hidden (view full) ---

367 &s->bus->dma->qiov, n * 4,
368 ide_atapi_cmd_read_dma_cb, s);
369 return;
370
371eot:
372 if (ret < 0) {
373 block_acct_failed(blk_get_stats(s->blk), &s->acct);
374 } else {
360 ide_atapi_cmd_reply_end(s);
361}
362
363static void ide_atapi_cmd_check_status(IDEState *s)
364{
365#ifdef DEBUG_IDE_ATAPI
366 printf("atapi_cmd_check_status\n");
367#endif

--- 68 unchanged lines hidden (view full) ---

436 &s->bus->dma->qiov, n * 4,
437 ide_atapi_cmd_read_dma_cb, s);
438 return;
439
440eot:
441 if (ret < 0) {
442 block_acct_failed(blk_get_stats(s->blk), &s->acct);
443 } else {
375 block_acct_done(blk_get_stats(s->blk), &s->acct);
444 block_acct_done(blk_get_stats(s->blk), &s->acct);
376 }
377 ide_set_inactive(s, false);
378}
379
380/* start a CD-CDROM read command with DMA */
381/* XXX: test if DMA is available */
382static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
383 int sector_size)

--- 915 unchanged lines hidden ---
445 }
446 ide_set_inactive(s, false);
447}
448
449/* start a CD-CDROM read command with DMA */
450/* XXX: test if DMA is available */
451static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
452 int sector_size)

--- 915 unchanged lines hidden ---