--- linux-2.6/drivers/ata/sata_nv.c.completed +++ linux-2.6/drivers/ata/sata_nv.c @@ -1011,7 +1011,8 @@ static irqreturn_t nv_adma_interrupt(int } if (status & (NV_ADMA_STAT_DONE | - NV_ADMA_STAT_CPBERR)) { + NV_ADMA_STAT_CPBERR | + NV_ADMA_STAT_CMD_COMPLETE)) { u32 check_commands; int pos, error = 0; @@ -1023,8 +1024,8 @@ static irqreturn_t nv_adma_interrupt(int /** Check CPBs for completed commands */ while ((pos = ffs(check_commands)) && !error) { pos--; - error = nv_adma_check_cpb(ap, pos, - notifier_error & (1 << pos)); + if ((notifier_clears[i] & (1 << pos)) || (status & NV_ADMA_STAT_CPBERR)) + error = nv_adma_check_cpb(ap, pos, notifier_error & (1 << pos)); check_commands &= ~(1 << pos); } }