status, tag, scp);
        switch (status) {
        case IO_SUCCESS:
-               pm8001_dbg(pm8001_ha, EH, "IO_SUCCESS\n");
+               pm8001_dbg(pm8001_ha, FAIL, "ABORT IO_SUCCESS for tag %#x\n",
+                          tag);
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_SAM_STAT_GOOD;
                break;
        case IO_NOT_VALID:
-               pm8001_dbg(pm8001_ha, EH, "IO_NOT_VALID\n");
+               pm8001_dbg(pm8001_ha, FAIL, "IO_NOT_VALID for tag %#x\n", tag);
                ts->resp = TMF_RESP_FUNC_FAILED;
                break;
        }
 
        return 0;
 }
 
+static void pm80xx_get_tag_opcodes(struct sas_task *task, int *ata_op,
+                                                                  int *ata_tag, bool *task_aborted)
+{
+       unsigned long flags;
+       struct ata_queued_cmd *qc = NULL;
+
+       *ata_op = 0;
+       *ata_tag = -1;
+       *task_aborted = false;
+
+       if (!task)
+               return;
+
+       spin_lock_irqsave(&task->task_state_lock, flags);
+       if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED)))
+               *task_aborted = true;
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
+
+       if (task->task_proto == SAS_PROTOCOL_STP) {
+               // sas_ata_qc_issue path uses SAS_PROTOCOL_STP.
+               // This only works for scsi + libsas + libata users.
+               qc = task->uldd_task;
+               if (qc) {
+                       *ata_op = qc->tf.command;
+                       *ata_tag = qc->tag;
+               }
+       }
+}
+
+void pm80xx_show_pending_commands(struct pm8001_hba_info *pm8001_ha,
+                                 struct pm8001_device *target_pm8001_dev)
+{
+       int i = 0, ata_op = 0, ata_tag = -1;
+       struct pm8001_ccb_info *ccb = NULL;
+       struct sas_task *task = NULL;
+       struct pm8001_device *pm8001_dev = NULL;
+       bool task_aborted;
+
+       for (i = 0; i < pm8001_ha->ccb_count; i++) {
+               ccb = &pm8001_ha->ccb_info[i];
+               if (ccb->ccb_tag == PM8001_INVALID_TAG)
+                       continue;
+               pm8001_dev = ccb->device;
+               if (target_pm8001_dev && pm8001_dev &&
+                   target_pm8001_dev != pm8001_dev)
+                       continue;
+               task = ccb->task;
+               pm80xx_get_tag_opcodes(task, &ata_op, &ata_tag, &task_aborted);
+               pm8001_dbg(pm8001_ha, FAIL,
+                       "tag %#x, device %#x task %p task aborted %d ata opcode %#x ata tag %d\n",
+                       ccb->ccb_tag,
+                       (pm8001_dev ? pm8001_dev->device_id : 0),
+                       task, task_aborted,
+                       ata_op, ata_tag);
+       }
+}
+
 /**
  * pm8001_mem_alloc - allocate memory for pm8001.
  * @pdev: pci device.
 
 }
 void pm8001_setds_completion(struct domain_device *dev);
 void pm8001_tmf_aborted(struct sas_task *task);
+void pm80xx_show_pending_commands(struct pm8001_hba_info *pm8001_ha,
+                                 struct pm8001_device *dev);
 
 #endif
 
 
        u32 param;
        u32 status;
        u32 tag;
-       int i, j;
+       int i, j, ata_tag = -1;
        u8 sata_addr_low[4];
        u32 temp_sata_addr_low, temp_sata_addr_hi;
        u8 sata_addr_hi[4];
        u32 *sata_resp;
        struct pm8001_device *pm8001_dev;
        unsigned long flags;
+       struct ata_queued_cmd *qc;
 
        psataPayload = (struct sata_completion_resp *)(piomb + 4);
        status = le32_to_cpu(psataPayload->status);
        pm8001_dev = ccb->device;
 
        if (t) {
-               if (t->dev && (t->dev->lldd_dev))
+               if (t->dev && (t->dev->lldd_dev)) {
                        pm8001_dev = t->dev->lldd_dev;
+                       qc = t->uldd_task;
+                       ata_tag = qc ? qc->tag : -1;
+               }
        } else {
                pm8001_dbg(pm8001_ha, FAIL, "task null, freeing CCB tag %d\n",
                           ccb->ccb_tag);
                return;
        }
 
-
        if (pm8001_dev && unlikely(!t->lldd_task || !t->dev))
                return;
 
        ts = &t->task_status;
-
        if (status != IO_SUCCESS) {
                pm8001_dbg(pm8001_ha, FAIL,
-                       "IO failed device_id %u status 0x%x tag %d\n",
-                       pm8001_dev->device_id, status, tag);
+                       "IO failed status %#x pm80xx tag %#x ata tag %d\n",
+                       status, tag, ata_tag);
        }
 
        /* Print sas address of IO failed device */
 
        /* Check if this is NCQ error */
        if (event == IO_XFER_ERROR_ABORTED_NCQ_MODE) {
+               /* tag value is invalid with this event */
+               pm8001_dbg(pm8001_ha, FAIL, "NCQ ERROR for device %#x tag %#x\n",
+                       dev_id, tag);
+
                /* find device using device id */
                pm8001_dev = pm8001_find_dev(pm8001_ha, dev_id);
                /* send read log extension by aborting the link - libata does what we want */
-               if (pm8001_dev)
+               if (pm8001_dev) {
+                       pm80xx_show_pending_commands(pm8001_ha, pm8001_dev);
                        pm8001_handle_event(pm8001_ha,
                                pm8001_dev,
                                IO_XFER_ERROR_ABORTED_NCQ_MODE);
+               }
                return;
        }