patch 1/7:
Set the state after "PIO data-in" to HSM_ST_IDLE instead of HSM_ST_LAST.
To prevent the irq handler from thinking "HSM is waiting for the last irq".
Needed later when part of the irq driven pio pushed out to workqueue.
---
diff -Nrup 00_linux-2.6.21.1/drivers/ata/libata-core.c
01_last_idle/drivers/ata/libata-core.c
--- 00_linux-2.6.21.1/drivers/ata/libata-core.c 2007-05-04 11:22:23.000000000
+0800
+++ 01_last_idle/drivers/ata/libata-core.c 2007-05-11 10:24:16.000000000
+0800
@@ -4041,7 +4041,7 @@ static void ata_pio_sector(struct ata_qu
unsigned char *buf;
if (qc->curbytes == qc->nbytes - ATA_SECT_SIZE)
- ap->hsm_task_state = HSM_ST_LAST;
+ ap->hsm_task_state = do_write ? HSM_ST_LAST : HSM_ST_IDLE;
page = sg[qc->cursg].page;
offset = sg[qc->cursg].offset + qc->cursg_ofs;
@@ -4389,6 +4389,8 @@ int ata_hsm_move(struct ata_port *ap, st
*/
WARN_ON(in_wq != ata_hsm_ok_in_wq(ap, qc));
+ WARN_ON(ap->hsm_task_state == HSM_ST_IDLE);
+
fsm_start:
DPRINTK("ata%u: protocol %d task_state %d (dev_stat 0x%X)\n",
ap->print_id, qc->tf.protocol, ap->hsm_task_state, status);
@@ -4548,8 +4550,7 @@ fsm_start:
ata_pio_sectors(qc);
- if (ap->hsm_task_state == HSM_ST_LAST &&
- (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
+ if (ap->hsm_task_state == HSM_ST_IDLE) {
/* all data read */
ata_altstatus(ap);
status = ata_wait_idle(ap);
@@ -4562,6 +4563,7 @@ fsm_start:
break;
case HSM_ST_LAST:
+ case HSM_ST_IDLE:
if (unlikely(!ata_ok(status))) {
qc->err_mask |= __ac_err_mask(status);
ap->hsm_task_state = HSM_ST_ERR;
-
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