mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-11 16:00:50 -07:00
ide: really restart pending and in-flight atapi dma
Restart of ATAPI DMA used to be unreachable, because the request to do so wasn't indicated in bus->error_status due to the lack of spare bits, and ide_restart_bh() would return early doing nothing. This patch makes use of the observation that not all bit combinations were possible in ->error_status. In particular, IDE_RETRY_READ only made sense together with IDE_RETRY_DMA or IDE_RETRY_PIO. This allows to re-use IDE_RETRY_READ alone as an indicator of ATAPI DMA restart request. To makes things more uniform, ATAPI DMA gets its own value for ->dma_cmd. As a means against confusion, macros are added to test the state of ->error_status. The patch fixes the restart of both in-flight and pending ATAPI DMA, following the scheme similar to that of IDE DMA. [Including a fixup patch: Message-id: 1460465594-15777-1-git-send-email-pbutsykin@virtuozzo.com --js] Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com> Reviewed-by: John Snow <jsnow@redhat.com> Message-id: 1459924806-306-4-git-send-email-den@openvz.org Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
9a41826f38
commit
502356eeeb
4 changed files with 43 additions and 22 deletions
|
|
@ -375,15 +375,18 @@ static void ide_atapi_cmd_check_status(IDEState *s)
|
|||
}
|
||||
/* ATAPI DMA support */
|
||||
|
||||
/* XXX: handle read errors */
|
||||
static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
|
||||
{
|
||||
IDEState *s = opaque;
|
||||
int data_offset, n;
|
||||
|
||||
if (ret < 0) {
|
||||
ide_atapi_io_error(s, ret);
|
||||
goto eot;
|
||||
if (ide_handle_rw_error(s, -ret, ide_dma_cmd_to_retry(s->dma_cmd))) {
|
||||
if (s->bus->error_status) {
|
||||
return;
|
||||
}
|
||||
goto eot;
|
||||
}
|
||||
}
|
||||
|
||||
if (s->io_buffer_size > 0) {
|
||||
|
|
@ -481,10 +484,6 @@ static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Called by *_restart_bh when the transfer function points
|
||||
* to ide_atapi_cmd
|
||||
*/
|
||||
void ide_atapi_dma_restart(IDEState *s)
|
||||
{
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue