From: Jens Axboe It's not trivial, here's a hack that should dump the offending opcode though. Signed-off-by: Andrew Morton --- 25-akpm/drivers/ide/ide.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+) diff -puN drivers/ide/ide.c~ide-print-failed-opcode drivers/ide/ide.c --- 25/drivers/ide/ide.c~ide-print-failed-opcode 2004-06-06 23:14:11.709818160 -0700 +++ 25-akpm/drivers/ide/ide.c 2004-06-06 23:14:11.714817400 -0700 @@ -437,6 +437,30 @@ u8 ide_dump_status (ide_drive_t *drive, #endif /* FANCY_STATUS_DUMPS */ printk("\n"); } + { + struct request *rq; + int opcode = 0x100; + + spin_lock(&ide_lock); + rq = HWGROUP(drive)->rq; + spin_unlock(&ide_lock); + if (!rq) + goto out; + if (rq->flags & (REQ_DRIVE_CMD | REQ_DRIVE_TASK)) { + char *args = rq->buffer; + if (args) + opcode = args[0]; + } else if (rq->flags & REQ_DRIVE_TASKFILE) { + ide_task_t *args = rq->special; + if (args) { + task_struct_t *tf = (task_struct_t *) args->tfRegister; + opcode = tf->command; + } + } + + printk("ide: failed opcode was %x\n", opcode); + } +out: local_irq_restore(flags); return err; } _