aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2011-08-26 05:45:40 -0400
committerDavid S. Miller <davem@davemloft.net>2011-08-28 17:08:27 -0400
commitdcc7e3a6a2a2464cf96dee329f7c58fe8c230d97 (patch)
tree499e2bac1150905c0e0da9b7711cc9d373137c6b
parentdc219a2e4812eecdc5438d2a0e2434b03d3efbf2 (diff)
cnic: Add timeout for ramrod replies.
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>
-rw-r--r--drivers/net/ethernet/broadcom/cnic.c17
-rw-r--r--drivers/net/ethernet/broadcom/cnic.h2
-rw-r--r--drivers/net/ethernet/broadcom/cnic_defs.h1
3 files changed, 13 insertions, 7 deletions
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c
index 73060f4a2f5f..6f10c6939834 100644
--- a/drivers/net/ethernet/broadcom/cnic.c
+++ b/drivers/net/ethernet/broadcom/cnic.c
@@ -1875,12 +1875,12 @@ static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid)
1875 hw_cid, NONE_CONNECTION_TYPE, &l5_data); 1875 hw_cid, NONE_CONNECTION_TYPE, &l5_data);
1876 1876
1877 if (ret == 0) { 1877 if (ret == 0) {
1878 wait_event(ctx->waitq, ctx->wait_cond); 1878 wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
1879 if (unlikely(test_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags))) 1879 if (unlikely(test_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags)))
1880 return -EBUSY; 1880 return -EBUSY;
1881 } 1881 }
1882 1882
1883 return ret; 1883 return 0;
1884} 1884}
1885 1885
1886static int cnic_bnx2x_iscsi_destroy(struct cnic_dev *dev, struct kwqe *kwqe) 1886static 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)
2428 init_waitqueue_head(&ctx->waitq); 2428 init_waitqueue_head(&ctx->waitq);
2429 ctx->wait_cond = 0; 2429 ctx->wait_cond = 0;
2430 2430
2431 memset(&kcqe, 0, sizeof(kcqe));
2432 kcqe.completion_status = FCOE_KCQE_COMPLETION_STATUS_ERROR;
2431 memset(&l5_data, 0, sizeof(l5_data)); 2433 memset(&l5_data, 0, sizeof(l5_data));
2432 ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_TERMINATE_CONN, cid, 2434 ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_TERMINATE_CONN, cid,
2433 FCOE_CONNECTION_TYPE, &l5_data); 2435 FCOE_CONNECTION_TYPE, &l5_data);
2434 if (ret == 0) { 2436 if (ret == 0) {
2435 wait_event(ctx->waitq, ctx->wait_cond); 2437 wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
2436 set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags); 2438 if (ctx->wait_cond)
2437 queue_delayed_work(cnic_wq, &cp->delete_task, 2439 kcqe.completion_status = 0;
2438 msecs_to_jiffies(2000));
2439 } 2440 }
2440 2441
2441 memset(&kcqe, 0, sizeof(kcqe)); 2442 set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags);
2443 queue_delayed_work(cnic_wq, &cp->delete_task, msecs_to_jiffies(2000));
2444
2442 kcqe.op_code = FCOE_KCQE_OPCODE_DESTROY_CONN; 2445 kcqe.op_code = FCOE_KCQE_OPCODE_DESTROY_CONN;
2443 kcqe.fcoe_conn_id = req->conn_id; 2446 kcqe.fcoe_conn_id = req->conn_id;
2444 kcqe.fcoe_conn_context_id = cid; 2447 kcqe.fcoe_conn_context_id = cid;
diff --git a/drivers/net/ethernet/broadcom/cnic.h b/drivers/net/ethernet/broadcom/cnic.h
index 15b1c09f1d5c..30328097f516 100644
--- a/drivers/net/ethernet/broadcom/cnic.h
+++ b/drivers/net/ethernet/broadcom/cnic.h
@@ -474,5 +474,7 @@ struct bnx2x_bd_chain_next {
474 MAX_STAT_COUNTER_ID_E1)) 474 MAX_STAT_COUNTER_ID_E1))
475#endif 475#endif
476 476
477#define CNIC_RAMROD_TMO (HZ / 4)
478
477#endif 479#endif
478 480
diff --git a/drivers/net/ethernet/broadcom/cnic_defs.h b/drivers/net/ethernet/broadcom/cnic_defs.h
index e47d21076767..239de898f071 100644
--- a/drivers/net/ethernet/broadcom/cnic_defs.h
+++ b/drivers/net/ethernet/broadcom/cnic_defs.h
@@ -67,6 +67,7 @@
67#define FCOE_KWQE_OPCODE_DESTROY (10) 67#define FCOE_KWQE_OPCODE_DESTROY (10)
68#define FCOE_KWQE_OPCODE_STAT (11) 68#define FCOE_KWQE_OPCODE_STAT (11)
69 69
70#define FCOE_KCQE_COMPLETION_STATUS_ERROR (0x1)
70#define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x3) 71#define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x3)
71 72
72/* KCQ (kernel completion queue) response op codes */ 73/* KCQ (kernel completion queue) response op codes */