From: Robert Hancock Some debug output in the ADMA error_handler function was removed recently, but it may be useful in certain cases, like NCQ commands timing out. Add it back in, but make it a bit more intelligent so that it only prints if command(s) are active and only prints the CPBs for those commands. That way it won't spew at inappropriate times like suspend/resume. [akpm@osdl.org: cleanup] Signed-off-by: Robert Hancock Cc: Jeff Garzik Cc: Tejun Heo Signed-off-by: Andrew Morton --- drivers/ata/sata_nv.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff -puN drivers/ata/sata_nv.c~sata_nv-add-back-some-verbosity-into-adma-error_handler drivers/ata/sata_nv.c --- a/drivers/ata/sata_nv.c~sata_nv-add-back-some-verbosity-into-adma-error_handler +++ a/drivers/ata/sata_nv.c @@ -1447,11 +1447,38 @@ static void nv_adma_error_handler(struct } } + if (ata_tag_valid(ap->active_tag) || ap->sactive) { + u32 notifier = readl(mmio + NV_ADMA_NOTIFIER); + u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR); + u32 gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL); + u32 status = readw(mmio + NV_ADMA_STAT); + + ata_port_printk(ap, KERN_ERR, "EH in ADMA mode, " + "notifier 0x%X notifier_error 0x%X gen_ctl " + "0x%X status 0x%X\n", + notifier, notifier_error, gen_ctl, status); + + for (i = 0; i < NV_ADMA_MAX_CPBS; i++) { + struct nv_adma_cpb *cpb = &pp->cpb[i]; + if ((ata_tag_valid(ap->active_tag) && + i == ap->active_tag) || + ap->sactive & (1 << i)) + ata_port_printk(ap, KERN_ERR, "CPB %d: " + "ctl_flags 0x%x, resp_flags " + "0x%x\n", + i, cpb->ctl_flags, + cpb->resp_flags); + } + } + /* Push us back into port register mode for error handling. */ nv_adma_register_mode(ap); - /* Mark all of the CPBs as invalid to prevent them from being executed */ - for( i=0;icpb[i].ctl_flags &= ~NV_CPB_CTL_CPB_VALID; /* clear CPB fetch count */ _