Skip to content

Commit dcc7e3a

Browse files
Michael Chandavem330
authored andcommitted
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>
1 parent dc219a2 commit dcc7e3a

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

drivers/net/ethernet/broadcom/cnic.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,12 +1875,12 @@ static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid)
18751875
hw_cid, NONE_CONNECTION_TYPE, &l5_data);
18761876

18771877
if (ret == 0) {
1878-
wait_event(ctx->waitq, ctx->wait_cond);
1878+
wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
18791879
if (unlikely(test_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags)))
18801880
return -EBUSY;
18811881
}
18821882

1883-
return ret;
1883+
return 0;
18841884
}
18851885

18861886
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)
24282428
init_waitqueue_head(&ctx->waitq);
24292429
ctx->wait_cond = 0;
24302430

2431+
memset(&kcqe, 0, sizeof(kcqe));
2432+
kcqe.completion_status = FCOE_KCQE_COMPLETION_STATUS_ERROR;
24312433
memset(&l5_data, 0, sizeof(l5_data));
24322434
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_TERMINATE_CONN, cid,
24332435
FCOE_CONNECTION_TYPE, &l5_data);
24342436
if (ret == 0) {
2435-
wait_event(ctx->waitq, ctx->wait_cond);
2436-
set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags);
2437-
queue_delayed_work(cnic_wq, &cp->delete_task,
2438-
msecs_to_jiffies(2000));
2437+
wait_event_timeout(ctx->waitq, ctx->wait_cond, CNIC_RAMROD_TMO);
2438+
if (ctx->wait_cond)
2439+
kcqe.completion_status = 0;
24392440
}
24402441

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+
24422445
kcqe.op_code = FCOE_KCQE_OPCODE_DESTROY_CONN;
24432446
kcqe.fcoe_conn_id = req->conn_id;
24442447
kcqe.fcoe_conn_context_id = cid;

drivers/net/ethernet/broadcom/cnic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,5 +474,7 @@ struct bnx2x_bd_chain_next {
474474
MAX_STAT_COUNTER_ID_E1))
475475
#endif
476476

477+
#define CNIC_RAMROD_TMO (HZ / 4)
478+
477479
#endif
478480

drivers/net/ethernet/broadcom/cnic_defs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
#define FCOE_KWQE_OPCODE_DESTROY (10)
6868
#define FCOE_KWQE_OPCODE_STAT (11)
6969

70+
#define FCOE_KCQE_COMPLETION_STATUS_ERROR (0x1)
7071
#define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x3)
7172

7273
/* KCQ (kernel completion queue) response op codes */

0 commit comments

Comments
 (0)