This patch let polling pio codes to use freeze()/thaw() for irq off/on. The reason is: some ATAPI devices raises INTRQ even of nIEN = 1. Using the host adapter irq mask mechanism, if available, is more reliable than the device nIEN bit. ata_qc_set_polling() is also removed since now unused. Signed-off-by: Albert Lee <albertcc@xxxxxxxxxx> --- Considerations: Polling PIO, the new user of freeze()/thaw(), might have higher calling frequency to freeze()/thaw() than EH. Can current implemention of freeze()/thaw() handle that? We might need more testing on sata_nv, sata_promise, sata_sil, sata_sil24, sata_via and sata_vsc. diff -Nrup 03_add_thaw_freeze/drivers/ata/libata-core.c 04_use_freeze_polling/drivers/ata/libata-core.c --- 03_add_thaw_freeze/drivers/ata/libata-core.c 2007-07-07 10:38:55.000000000 +0800 +++ 04_use_freeze_polling/drivers/ata/libata-core.c 2007-07-07 10:40:10.000000000 +0800 @@ -4753,7 +4753,7 @@ static void ata_hsm_qc_complete(struct a qc = ata_qc_from_tag(ap, qc->tag); if (qc) { if (likely(!(qc->err_mask & AC_ERR_HSM))) { - ap->ops->irq_on(ap); + ap->ops->thaw(ap); ata_qc_complete(qc); } else ata_port_freeze(ap); @@ -4769,7 +4769,7 @@ static void ata_hsm_qc_complete(struct a } else { if (in_wq) { spin_lock_irqsave(ap->lock, flags); - ap->ops->irq_on(ap); + ap->ops->thaw(ap); ata_qc_complete(qc); spin_unlock_irqrestore(ap->lock, flags); } else @@ -5411,7 +5411,7 @@ unsigned int ata_qc_issue_prot(struct at switch (qc->tf.protocol) { case ATA_PROT_NODATA: if (qc->tf.flags & ATA_TFLAG_POLLING) - ata_qc_set_polling(qc); + ap->ops->freeze(ap); ata_tf_to_host(ap, &qc->tf); ap->hsm_task_state = HSM_ST_LAST; @@ -5432,7 +5432,7 @@ unsigned int ata_qc_issue_prot(struct at case ATA_PROT_PIO: if (qc->tf.flags & ATA_TFLAG_POLLING) - ata_qc_set_polling(qc); + ap->ops->freeze(ap); ata_tf_to_host(ap, &qc->tf); @@ -5461,7 +5461,7 @@ unsigned int ata_qc_issue_prot(struct at case ATA_PROT_ATAPI: case ATA_PROT_ATAPI_NODATA: if (qc->tf.flags & ATA_TFLAG_POLLING) - ata_qc_set_polling(qc); + ap->ops->freeze(ap); ata_tf_to_host(ap, &qc->tf); diff -Nrup 03_add_thaw_freeze/include/linux/libata.h 04_use_freeze_polling/include/linux/libata.h --- 03_add_thaw_freeze/include/linux/libata.h 2007-07-07 09:59:42.000000000 +0800 +++ 04_use_freeze_polling/include/linux/libata.h 2007-07-07 10:40:10.000000000 +0800 @@ -1094,11 +1094,6 @@ static inline u8 ata_wait_idle(struct at return status; } -static inline void ata_qc_set_polling(struct ata_queued_cmd *qc) -{ - qc->tf.ctl |= ATA_NIEN; -} - static inline struct ata_queued_cmd *__ata_qc_from_tag(struct ata_port *ap, unsigned int tag) { - 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