--- pio1/drivers/scsi/libata-core.c 2005-09-02 18:37:26.000000000 +0800 +++ pio2/drivers/scsi/libata-core.c 2005-09-02 18:37:19.000000000 +0800 @@ -2893,21 +2893,20 @@ { struct ata_port *ap = _data; unsigned long timeout = 0; + int has_next = 0; switch (ap->pio_task_state) { - case PIO_ST_IDLE: - return; - case PIO_ST: - ata_pio_block(ap); + has_next = ata_pio_block(ap); break; case PIO_ST_LAST: - ata_pio_complete(ap); + has_next = ata_pio_complete(ap); break; case PIO_ST_POLL: case PIO_ST_LAST_POLL: + has_next = 1; timeout = ata_pio_poll(ap); break; @@ -2915,13 +2914,18 @@ case PIO_ST_ERR: ata_pio_error(ap); return; + default: + printk(KERN_ERR "ata%u unknown PIO task state %u\n", + ap->id, ap->pio_task_state); + return; } - if (timeout) - queue_delayed_work(ata_wq, &ap->pio_task, - timeout); - else - queue_work(ata_wq, &ap->pio_task); + if (has_next) { + if (timeout) + queue_delayed_work(ata_wq, &ap->pio_task, timeout); + else + queue_work(ata_wq, &ap->pio_task); + } } static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,