patch 2/8: Move ata_altstatus() out from ata_hsm_move() to the pio data xfer functions, like ata_pio_sectors() and atapi_pio_bytes() that know better if ata_altstatus() is needed. Signed-off-by: Albert Lee <albertcc@xxxxxxxxxx> --- atapi_send_cdb() already did ata_altstatus() in itself. This patch makes ata_pio_sector(), ata_pio_sectors() and atapi_pio_bytes() do the same. diff -Nrup 01_flush_fix/drivers/ata/libata-core.c 02_smart_flush/drivers/ata/libata-core.c --- 01_flush_fix/drivers/ata/libata-core.c 2007-05-15 10:05:33.000000000 +0800 +++ 02_smart_flush/drivers/ata/libata-core.c 2007-05-16 10:37:53.000000000 +0800 @@ -4435,6 +4435,7 @@ void ata_data_xfer_noirq(struct ata_devi /** * ata_pio_sector - Transfer a sector of data. * @qc: Command on going + * @drq_last: Last sector of pio DRQ transfer * * Transfer qc->sect_size bytes of data from/to the ATA device. * @@ -4442,7 +4443,7 @@ void ata_data_xfer_noirq(struct ata_devi * Inherited from caller. */ -static void ata_pio_sector(struct ata_queued_cmd *qc) +static void ata_pio_sector(struct ata_queued_cmd *qc, int drq_last) { int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); struct scatterlist *sg = qc->__sg; @@ -4480,6 +4481,9 @@ static void ata_pio_sector(struct ata_qu ap->ops->data_xfer(qc->dev, buf + offset, qc->sect_size, do_write); } + if (drq_last) + ata_altstatus(ap); /* flush */ + qc->curbytes += qc->sect_size; qc->cursg_ofs += qc->sect_size; @@ -4511,9 +4515,9 @@ static void ata_pio_sectors(struct ata_q nsect = min((qc->nbytes - qc->curbytes) / qc->sect_size, qc->dev->multi_count); while (nsect--) - ata_pio_sector(qc); + ata_pio_sector(qc, !nsect); } else - ata_pio_sector(qc); + ata_pio_sector(qc, 1); } /** @@ -4596,6 +4600,7 @@ next_sg: for (i = 0; i < words; i++) ap->ops->data_xfer(qc->dev, (unsigned char*)pad_buf, 2, do_write); + ata_altstatus(ap); /* flush */ ap->hsm_task_state = HSM_ST_LAST; return; } @@ -4645,6 +4650,8 @@ next_sg: if (bytes) goto next_sg; + + ata_altstatus(ap); /* flush */ } /** @@ -4861,7 +4868,6 @@ fsm_start: */ ap->hsm_task_state = HSM_ST; ata_pio_sectors(qc); - ata_altstatus(ap); /* flush */ } else /* send CDB */ atapi_send_cdb(ap, qc); @@ -4942,7 +4948,6 @@ fsm_start: if (!(qc->tf.flags & ATA_TFLAG_WRITE)) { ata_pio_sectors(qc); - ata_altstatus(ap); status = ata_wait_idle(ap); } @@ -4962,13 +4967,11 @@ fsm_start: if (ap->hsm_task_state == HSM_ST_LAST && (!(qc->tf.flags & ATA_TFLAG_WRITE))) { /* all data read */ - ata_altstatus(ap); status = ata_wait_idle(ap); goto fsm_start; } } - ata_altstatus(ap); /* flush */ poll_next = 1; break; - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html