From afa386d79e960dff6430ee8ffcfec4bff2a464fa Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Mon, 18 Oct 2004 09:49:29 -0400 Subject: [PATCH] [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: Bartlomiej Zolnierkiewicz --- drivers/scsi/libata-core.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 92ee0ab2f3676..cc18aa14c71b0 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -2297,19 +2297,30 @@ static void ata_pio_block(struct ata_port *ap) } } - /* 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)) + 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 + } else { + /* handle BSY=0, DRQ=0 as error */ + if ((status & ATA_DRQ) == 0) { + ap->pio_task_state = PIO_ST_ERR; + return; + } + ata_pio_sector(qc); + } } static void ata_pio_error(struct ata_port *ap) -- 2.53.0