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

Reply via email to