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