cnic: Add timeout for ramrod replies.
authorMichael Chan <mchan@broadcom.com>
Fri, 26 Aug 2011 09:45:40 +0000 (09:45 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 28 Aug 2011 21:08:27 +0000 (17:08 -0400)
If the bnx2x device has encountered parity errors, the chip will not DMA
any replies.  Using wait_event_timeout() will allow us to make forward
progress and let bnx2x reset the chip.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Reviewed-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/cnic.c
drivers/net/ethernet/broadcom/cnic.h
drivers/net/ethernet/broadcom/cnic_defs.h

index 73060f4..6f10c69 100644 (file)
@@ -1875,12 +1875,12 @@ static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid)
                                  hw_cid, NONE_CONNECTION_TYPE, &l5_data);
 
        if (ret == 0) {
-               wait_event(ctx->waitq, ctx->wait_cond);
+               wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
                if (unlikely(test_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags)))
                        return -EBUSY;
        }
 
-       return ret;
+       return 0;
 }
 
 static int cnic_bnx2x_iscsi_destroy(struct cnic_dev *dev, struct kwqe *kwqe)
@@ -2428,17 +2428,20 @@ static int cnic_bnx2x_fcoe_destroy(struct cnic_dev *dev, struct kwqe *kwqe)
        init_waitqueue_head(&ctx->waitq);
        ctx->wait_cond = 0;
 
+       memset(&kcqe, 0, sizeof(kcqe));
+       kcqe.completion_status = FCOE_KCQE_COMPLETION_STATUS_ERROR;
        memset(&l5_data, 0, sizeof(l5_data));
        ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_TERMINATE_CONN, cid,
                                  FCOE_CONNECTION_TYPE, &l5_data);
        if (ret == 0) {
-               wait_event(ctx->waitq, ctx->wait_cond);
-               set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags);
-               queue_delayed_work(cnic_wq, &cp->delete_task,
-                                  msecs_to_jiffies(2000));
+               wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
+               if (ctx->wait_cond)
+                       kcqe.completion_status = 0;
        }
 
-       memset(&kcqe, 0, sizeof(kcqe));
+       set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags);
+       queue_delayed_work(cnic_wq, &cp->delete_task, msecs_to_jiffies(2000));
+
        kcqe.op_code = FCOE_KCQE_OPCODE_DESTROY_CONN;
        kcqe.fcoe_conn_id = req->conn_id;
        kcqe.fcoe_conn_context_id = cid;
index 15b1c09..3032809 100644 (file)
@@ -474,5 +474,7 @@ struct bnx2x_bd_chain_next {
          MAX_STAT_COUNTER_ID_E1))
 #endif
 
+#define CNIC_RAMROD_TMO                        (HZ / 4)
+
 #endif
 
index e47d210..239de89 100644 (file)
@@ -67,6 +67,7 @@
 #define FCOE_KWQE_OPCODE_DESTROY               (10)
 #define FCOE_KWQE_OPCODE_STAT                  (11)
 
+#define FCOE_KCQE_COMPLETION_STATUS_ERROR      (0x1)
 #define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE  (0x3)
 
 /* KCQ (kernel completion queue) response op codes */