#define FC_HRD_ERROR           9
 #define FC_CRC_ERROR           10
 #define FC_TIMED_OUT           11
+#define FC_TRANS_RESET         12
 
 /*
  * Error recovery timeout values.
  * fc_io_compl() will notify the SCSI-ml that the I/O is done.
  * The SCSI-ml will retry the command.
  */
-static void fc_fcp_retry_cmd(struct fc_fcp_pkt *fsp)
+static void fc_fcp_retry_cmd(struct fc_fcp_pkt *fsp, int status_code)
 {
        if (fsp->seq_ptr) {
                fsp->lp->tt.exch_done(fsp->seq_ptr);
 
        fsp->state &= ~FC_SRB_ABORT_PENDING;
        fsp->io_status = 0;
-       fsp->status_code = FC_ERROR;
+       fsp->status_code = status_code;
        fc_fcp_complete_locked(fsp);
 }
 
                return;
 
        if (error == -FC_EX_CLOSED) {
-               fc_fcp_retry_cmd(fsp);
+               fc_fcp_retry_cmd(fsp, FC_ERROR);
                goto unlock;
        }
 
                         */
                        if (rjt->er_explan == ELS_EXPL_OXID_RXID &&
                            fsp->xfer_len == 0) {
-                               fc_fcp_retry_cmd(fsp);
+                               fsp->state |= FC_SRB_ABORTED;
+                               fc_fcp_retry_cmd(fsp, FC_TRANS_RESET);
                                break;
                        }
-                       fc_fcp_recovery(fsp, FC_ERROR);
+                       fc_fcp_recovery(fsp, FC_TRANS_RESET);
                        break;
                }
        } else if (opcode == ELS_LS_ACC) {
        case -FC_EX_CLOSED:
                FC_FCP_DBG(fsp, "REC %p fid %6.6x exchange closed\n",
                           fsp, fsp->rport->port_id);
-               fc_fcp_retry_cmd(fsp);
+               fc_fcp_retry_cmd(fsp, FC_ERROR);
                break;
 
        default:
        fc_fcp_pkt_hold(fsp);           /* hold for outstanding SRR */
        return;
 retry:
-       fc_fcp_retry_cmd(fsp);
+       fc_fcp_retry_cmd(fsp, FC_TRANS_RESET);
 }
 
 /**
                FC_FCP_DBG(fsp, "SRR error, exchange closed\n");
                /* fall through */
        default:
-               fc_fcp_retry_cmd(fsp);
+               fc_fcp_retry_cmd(fsp, FC_ERROR);
                break;
        }
        fc_fcp_unlock_pkt(fsp);
                           "due to FC_CMD_RESET\n");
                sc_cmd->result = (DID_RESET << 16);
                break;
+       case FC_TRANS_RESET:
+               FC_FCP_DBG(fsp, "Returning DID_SOFT_ERROR to scsi-ml "
+                          "due to FC_TRANS_RESET\n");
+               sc_cmd->result = (DID_SOFT_ERROR << 16);
+               break;
        case FC_HRD_ERROR:
                FC_FCP_DBG(fsp, "Returning DID_NO_CONNECT to scsi-ml "
                           "due to FC_HRD_ERROR\n");