libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr()
PATCH 1/1 libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr()
While separating out BMDMA irq handler from SFF, commit c3b28894 (libata-sff: separate out BMDMA irq handler) incorrectly made __ata_sff_port_intr() consider an IRQ to be an idle one if the host state was transitioned to HSM_ST_ERR by ata_bmdma_port_intr().
This makes BMDMA drivers ignore IRQs reporting host bus error which leads to timeouts instead of triggering EH immediately. Fix it by making __ata_sff_port_intr() consider the IRQ to be an idle one iff the state is HSM_ST_IDLE. This is equivalent to adding HSM_ST_ERR to the "break"ing case but less error-prone.
--- drivers/ata/libata-sff.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/ata/libata-sff.c +3 -4
@@ -1532,11 +1532,10 @@ static unsigned int __ata_sff_port_intr(struct ata_port *ap,if (!(qc->dev->flags &ATA_DFLAG_CDB_INTR ))return ata_sff_idle_irq (ap);break ; -case HSM_ST : -case HSM_ST_LAST : -break ; -default : +case HSM_ST_IDLE :return ata_sff_idle_irq (ap); +default : +break ; }/* check main status, clearing INTRQ if needed */
Quoted 11 lines · Tejun Heo
While separating out BMDMA irq handler from SFF, commit
c3b28894(libata-sff: separate out BMDMA irq handler) incorrectly made__ata_sff_port_intr()consider an IRQ to be an idle one if the host state was transitioned toHSM_ST_ERRbyata_bmdma_port_intr().This makes BMDMA drivers ignore IRQs reporting host bus error which leads to timeouts instead of triggering EH immediately. Fix it by making
__ata_sff_port_intr()consider the IRQ to be an idle one iff the state isHSM_ST_IDLE. This is equivalent to addingHSM_ST_ERRto the "break"ing case but less error-prone.
Quoted 3 lines
Signed-off-by Tejun Heo <[email protected]>Reported-by Antonio Toma <[email protected]>
Ping.
Signature · 1 line
tejun
Jeff Garzik
AppliedQuoted 11 lines · Tejun Heo
While separating out BMDMA irq handler from SFF, commit
c3b28894(libata-sff: separate out BMDMA irq handler) incorrectly made__ata_sff_port_intr()consider an IRQ to be an idle one if the host state was transitioned toHSM_ST_ERRbyata_bmdma_port_intr().This makes BMDMA drivers ignore IRQs reporting host bus error which leads to timeouts instead of triggering EH immediately. Fix it by making
__ata_sff_port_intr()consider the IRQ to be an idle one iff the state isHSM_ST_IDLE. This is equivalent to addingHSM_ST_ERRto the "break"ing case but less error-prone.
Quoted 6 lines
Signed-off-by Tejun Heo<[email protected]>Reported-by Antonio Toma<[email protected]>--- drivers/ata/libata-sff.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
applied