esp: determine transfer direction directly from SCSI phase
The transfer direction is currently determined by checking the sign of ti_size but as this series progresses ti_size can be zero at the end of the transfer. Use the SCSI phase to determine the transfer direction as used in other SCSI controller implementations. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20210304221103.6369-9-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
960ebfd94e
commit
4ca2ba6fb0
@ -356,7 +356,7 @@ static void esp_dma_done(ESPState *s)
|
|||||||
|
|
||||||
static void do_dma_pdma_cb(ESPState *s)
|
static void do_dma_pdma_cb(ESPState *s)
|
||||||
{
|
{
|
||||||
int to_device = (s->ti_size < 0);
|
int to_device = ((s->rregs[ESP_RSTAT] & 7) == STAT_DO);
|
||||||
int len = s->pdma_cur - s->pdma_start;
|
int len = s->pdma_cur - s->pdma_start;
|
||||||
if (s->do_cmd) {
|
if (s->do_cmd) {
|
||||||
s->ti_size = 0;
|
s->ti_size = 0;
|
||||||
@ -392,7 +392,7 @@ static void do_dma_pdma_cb(ESPState *s)
|
|||||||
static void esp_do_dma(ESPState *s)
|
static void esp_do_dma(ESPState *s)
|
||||||
{
|
{
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
int to_device;
|
int to_device = ((s->rregs[ESP_RSTAT] & 7) == STAT_DO);
|
||||||
|
|
||||||
len = s->dma_left;
|
len = s->dma_left;
|
||||||
if (s->do_cmd) {
|
if (s->do_cmd) {
|
||||||
@ -425,7 +425,6 @@ static void esp_do_dma(ESPState *s)
|
|||||||
if (len > s->async_len) {
|
if (len > s->async_len) {
|
||||||
len = s->async_len;
|
len = s->async_len;
|
||||||
}
|
}
|
||||||
to_device = (s->ti_size < 0);
|
|
||||||
if (to_device) {
|
if (to_device) {
|
||||||
if (s->dma_memory_read) {
|
if (s->dma_memory_read) {
|
||||||
s->dma_memory_read(s->dma_opaque, s->async_buf, len);
|
s->dma_memory_read(s->dma_opaque, s->async_buf, len);
|
||||||
|
Loading…
Reference in New Issue
Block a user