01_atapi_update-ata_irq_on.patch
Update ata_irq_on for atapi_packet_task fix. Changes are
* IRQ is cleared _before_ unmasking interrupt. This is
necessary as unmasking could raise a pending interrupt
which should have been ignored.
* IRQ is cleared using both ata_chk_status and
ap->ops->irq_clear.
* ap->ctl value represents default ctl value and never gets
modified. ap->last_ctl is the currently loaded ctl value.
Don't turn off ATA_NIEN on ap->ctl as the bit never gets set
on it. Directly modify ap->last_ctl.
* Don't do ata_wait_idle. All current callers don't need it.
And it will always time out when used in atapi_packet_task.
Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
libata.h | 28 +++++++++++++++-------------
1 files changed, 15 insertions(+), 13 deletions(-)
Index: work/include/linux/libata.h
===================================================================
--- work.orig/include/linux/libata.h 2005-08-20 18:12:30.000000000 +0900
+++ work/include/linux/libata.h 2005-08-20 18:16:49.000000000 +0900
@@ -565,30 +565,32 @@ static inline void ata_tf_init(struct at
* ata_irq_on - Enable interrupts on a port.
* @ap: Port on which interrupts are enabled.
*
- * Enable interrupts on a legacy IDE device using MMIO or PIO,
- * wait for idle, clear any pending interrupts.
+ * Clear pending interrupts and enable interrupts on a legacy IDE
+ * device using MMIO or PIO.
*
* LOCKING:
* Inherited from caller.
*/
-static inline u8 ata_irq_on(struct ata_port *ap)
+static inline void ata_irq_on(struct ata_port *ap)
{
struct ata_ioports *ioaddr = &ap->ioaddr;
- u8 tmp;
- ap->ctl &= ~ATA_NIEN;
- ap->last_ctl = ap->ctl;
+ /* Clear pending interrupts. */
+ ata_chk_status(ap);
+ ap->ops->irq_clear(ap);
- if (ap->flags & ATA_FLAG_MMIO)
- writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
- else
- outb(ap->ctl, ioaddr->ctl_addr);
- tmp = ata_wait_idle(ap);
+ ap->last_ctl &= ATA_NIEN;
- ap->ops->irq_clear(ap);
+ /* smp_wmb() is here to make sure that other processors see
+ * ATA_NIEN cleared on receiving interrupts.
+ */
+ smp_wmb();
- return tmp;
+ if (ap->flags & ATA_FLAG_MMIO)
+ writeb(ap->last_ctl, (void __iomem *) ioaddr->ctl_addr);
+ else
+ outb(ap->last_ctl, ioaddr->ctl_addr);
}
-
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