[SCSI] bnx2fc: No abort issued for REC when it times out
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Tue, 30 Aug 2011 22:54:49 +0000 (15:54 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 17 Sep 2011 14:02:27 +0000 (18:02 +0400)
ABTS was not issued for timed out REC, as REC completion handler exits out if
the IO completed. Check for timed out REC and issue ABTS before proceeding with
further processing in REC completion handler. Also, initialize rec_retry and
srr_retry before starting the IO.

Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bnx2fc/bnx2fc_els.c
drivers/scsi/bnx2fc/bnx2fc_hwi.c

index d66dcbd0df106d1a9912f90b6e50bbbcb9621e46..fd382fe33f6ef108362debbf0d8a5f872947c560 100644 (file)
@@ -391,18 +391,6 @@ void bnx2fc_rec_compl(struct bnx2fc_els_cb_arg *cb_arg)
        BNX2FC_IO_DBG(rec_req, "rec_compl: orig xid = 0x%x", orig_io_req->xid);
        tgt = orig_io_req->tgt;
 
-       if (test_bit(BNX2FC_FLAG_IO_COMPL, &orig_io_req->req_flags)) {
-               BNX2FC_IO_DBG(rec_req, "completed"
-                      "orig_io - 0x%x\n",
-                       orig_io_req->xid);
-               goto rec_compl_done;
-       }
-       if (test_bit(BNX2FC_FLAG_ISSUE_ABTS, &orig_io_req->req_flags)) {
-               BNX2FC_IO_DBG(rec_req, "abts in prog "
-                      "orig_io - 0x%x\n",
-                       orig_io_req->xid);
-               goto rec_compl_done;
-       }
        /* Handle REC timeout case */
        if (test_and_clear_bit(BNX2FC_FLAG_ELS_TIMEOUT, &rec_req->req_flags)) {
                BNX2FC_IO_DBG(rec_req, "timed out, abort "
@@ -433,6 +421,20 @@ void bnx2fc_rec_compl(struct bnx2fc_els_cb_arg *cb_arg)
                }
                goto rec_compl_done;
        }
+
+       if (test_bit(BNX2FC_FLAG_IO_COMPL, &orig_io_req->req_flags)) {
+               BNX2FC_IO_DBG(rec_req, "completed"
+                      "orig_io - 0x%x\n",
+                       orig_io_req->xid);
+               goto rec_compl_done;
+       }
+       if (test_bit(BNX2FC_FLAG_ISSUE_ABTS, &orig_io_req->req_flags)) {
+               BNX2FC_IO_DBG(rec_req, "abts in prog "
+                      "orig_io - 0x%x\n",
+                       orig_io_req->xid);
+               goto rec_compl_done;
+       }
+
        mp_req = &(rec_req->mp_req);
        fc_hdr = &(mp_req->resp_fc_hdr);
        resp_len = mp_req->resp_len;
index b241f3d33362d9cc782d8f2532b8dd68fc4ddbfc..1923a25cb6a22201bc45456cb06f2da9c7715f90 100644 (file)
@@ -1743,11 +1743,13 @@ void bnx2fc_init_task(struct bnx2fc_cmd *io_req,
        /* Init state to NORMAL */
        task->txwr_rxrd.const_ctx.init_flags |= task_type <<
                                FCOE_TCE_TX_WR_RX_RD_CONST_TASK_TYPE_SHIFT;
-       if (dev_type == TYPE_TAPE)
+       if (dev_type == TYPE_TAPE) {
                task->txwr_rxrd.const_ctx.init_flags |=
                                FCOE_TASK_DEV_TYPE_TAPE <<
                                FCOE_TCE_TX_WR_RX_RD_CONST_DEV_TYPE_SHIFT;
-       else
+               io_req->rec_retry = 0;
+               io_req->rec_retry = 0;
+       } else
                task->txwr_rxrd.const_ctx.init_flags |=
                                FCOE_TASK_DEV_TYPE_DISK <<
                                FCOE_TCE_TX_WR_RX_RD_CONST_DEV_TYPE_SHIFT;