patch 3/7:
move ata_altstatus() out from ata_hsm_move() to the pio data xfer functions.
Functions like ata_pio_sectors() and atapi_pio_bytes() know better if the
flush is needed.
Signed-off-by: Albert Lee <[EMAIL PROTECTED]>
---
diff -Nrup 02_flush_fix/drivers/ata/libata-core.c
03_smart_flush/drivers/ata/libata-core.c
--- 02_flush_fix/drivers/ata/libata-core.c 2007-05-11 11:14:04.000000000
+0800
+++ 03_smart_flush/drivers/ata/libata-core.c 2007-05-11 10:24:19.000000000
+0800
@@ -4031,7 +4031,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 last)
{
int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
struct scatterlist *sg = qc->__sg;
@@ -4069,6 +4069,9 @@ static void ata_pio_sector(struct ata_qu
ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE,
do_write);
}
+ if (last)
+ ata_altstatus(ap); /* flush */
+
qc->curbytes += ATA_SECT_SIZE;
qc->cursg_ofs += ATA_SECT_SIZE;
@@ -4100,9 +4103,9 @@ static void ata_pio_sectors(struct ata_q
nsect = min((qc->nbytes - qc->curbytes) / ATA_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);
}
/**
@@ -4185,6 +4188,8 @@ 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;
}
@@ -4234,6 +4239,8 @@ next_sg:
if (bytes)
goto next_sg;
+
+ ata_altstatus(ap); /* flush */
}
/**
@@ -4452,7 +4459,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);
@@ -4533,7 +4539,6 @@ fsm_start:
if (!(qc->tf.flags & ATA_TFLAG_WRITE)) {
ata_pio_sectors(qc);
- ata_altstatus(ap);
status = ata_wait_idle(ap);
}
@@ -4552,13 +4557,11 @@ fsm_start:
if (ap->hsm_task_state == HSM_ST_IDLE) {
/* 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 [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html