• Tejun Heo's avatar
    [PATCH] libata: make sure IRQ is cleared after ata_bmdma_freeze() · 0f0a3ad3
    Tejun Heo authored
    Now that BMDMA status is recorded in irq handler.  ata_bmdma_freeze()
    is free to manipulate host status.  Under certain circumstances, some
    controllers (ICH7 in enhanced mode w/ IRQ shared) raise IRQ when CTL
    register is written to and ATA_NIEN doesn't mask it.
    
    This patch makes ata_bmdma_freeze() clear all pending IRQs after
    freezing a port.  This change makes explicit clearing in
    ata_device_add() unnecessary and thus kills it.  The removed code was
    SFF-specific and was in the wrong place.
    
    Note that ->freeze() handler is always called under ap->lock held and
    irq disabled.  Even if CTL manipulation causes stuck IRQ, it's cleared
    immediately.  This should be safe (enough) even in SMP environment.
    More correct solution is to mask the IRQ from IRQ controller but that
    would be an overkill.
    Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
    0f0a3ad3
libata-core.c 153 KB