atapi: call ide_set_irq before ide_transfer_start
The ATAPI_INT_REASON_IO interrupt is raised when I/O starts, but in the AHCI case ide_set_irq was actually called at the end of a mutual recursion. Move it early, with the side effect that ide_transfer_start becomes a tail call in ide_atapi_cmd_reply_end. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20180606190955.20845-7-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
882941a568
commit
d02cea6437
@ -287,6 +287,7 @@ void ide_atapi_cmd_reply_end(IDEState *s)
|
||||
} else {
|
||||
/* a new transfer is needed */
|
||||
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
|
||||
ide_set_irq(s->bus);
|
||||
byte_count_limit = atapi_byte_count_limit(s);
|
||||
trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit);
|
||||
size = s->packet_transfer_size;
|
||||
@ -304,13 +305,12 @@ void ide_atapi_cmd_reply_end(IDEState *s)
|
||||
if (size > (s->cd_sector_size - s->io_buffer_index))
|
||||
size = (s->cd_sector_size - s->io_buffer_index);
|
||||
}
|
||||
trace_ide_atapi_cmd_reply_end_new(s, s->status);
|
||||
s->packet_transfer_size -= size;
|
||||
s->elementary_transfer_size -= size;
|
||||
s->io_buffer_index += size;
|
||||
ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
|
||||
size, ide_atapi_cmd_reply_end);
|
||||
ide_set_irq(s->bus);
|
||||
trace_ide_atapi_cmd_reply_end_new(s, s->status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user