[PATCH] make ATAPI PIO work

If "BSY=0, DRQ=0" condition happens on ATAPI just
complete the command as this condition happens for:
* the end of the PIO transfer (ie. REQUEST_SENSE
  seems to return only 18 of 96 requested bytes)
* unsupported ATAPI commands (ie. REPORT_LUNS)
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent ce2c381d
......@@ -2297,19 +2297,30 @@ static void ata_pio_block(struct ata_port *ap)
}
}
qc = ata_qc_from_tag(ap, ap->active_tag);
assert(qc != NULL);
if (is_atapi_taskfile(&qc->tf)) {
/* no more data to transfer or unsupported ATAPI command */
if ((status & ATA_DRQ) == 0) {
ap->pio_task_state = PIO_ST_IDLE;
ata_irq_on(ap);
ata_qc_complete(qc, status);
return;
}
atapi_pio_bytes(qc);
} else {
/* handle BSY=0, DRQ=0 as error */
if ((status & ATA_DRQ) == 0) {
ap->pio_task_state = PIO_ST_ERR;
return;
}
qc = ata_qc_from_tag(ap, ap->active_tag);
assert(qc != NULL);
if (is_atapi_taskfile(&qc->tf))
atapi_pio_bytes(qc);
else
ata_pio_sector(qc);
}
}
static void ata_pio_error(struct ata_port *ap)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment