diff options
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/broadcom/cnic.c | 38 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/cnic_defs.h | 3 |
2 files changed, 36 insertions, 5 deletions
diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c index dd3a0a232ea0..7381460142e6 100644 --- a/drivers/net/ethernet/broadcom/cnic.c +++ b/drivers/net/ethernet/broadcom/cnic.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* cnic.c: Broadcom CNIC core network driver. | 1 | /* cnic.c: Broadcom CNIC core network driver. |
2 | * | 2 | * |
3 | * Copyright (c) 2006-2011 Broadcom Corporation | 3 | * Copyright (c) 2006-2012 Broadcom Corporation |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
@@ -2521,12 +2521,35 @@ static void cnic_bnx2x_kwqe_err(struct cnic_dev *dev, struct kwqe *kwqe) | |||
2521 | u32 cid; | 2521 | u32 cid; |
2522 | u32 opcode = KWQE_OPCODE(kwqe->kwqe_op_flag); | 2522 | u32 opcode = KWQE_OPCODE(kwqe->kwqe_op_flag); |
2523 | u32 layer_code = kwqe->kwqe_op_flag & KWQE_LAYER_MASK; | 2523 | u32 layer_code = kwqe->kwqe_op_flag & KWQE_LAYER_MASK; |
2524 | u32 kcqe_op; | ||
2524 | int ulp_type; | 2525 | int ulp_type; |
2525 | 2526 | ||
2526 | cid = kwqe->kwqe_info0; | 2527 | cid = kwqe->kwqe_info0; |
2527 | memset(&kcqe, 0, sizeof(kcqe)); | 2528 | memset(&kcqe, 0, sizeof(kcqe)); |
2528 | 2529 | ||
2529 | if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_ISCSI) { | 2530 | if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_FCOE) { |
2531 | u32 l5_cid = 0; | ||
2532 | |||
2533 | ulp_type = CNIC_ULP_FCOE; | ||
2534 | if (opcode == FCOE_KWQE_OPCODE_DISABLE_CONN) { | ||
2535 | struct fcoe_kwqe_conn_enable_disable *req; | ||
2536 | |||
2537 | req = (struct fcoe_kwqe_conn_enable_disable *) kwqe; | ||
2538 | kcqe_op = FCOE_KCQE_OPCODE_DISABLE_CONN; | ||
2539 | cid = req->context_id; | ||
2540 | l5_cid = req->conn_id; | ||
2541 | } else if (opcode == FCOE_KWQE_OPCODE_DESTROY) { | ||
2542 | kcqe_op = FCOE_KCQE_OPCODE_DESTROY_FUNC; | ||
2543 | } else { | ||
2544 | return; | ||
2545 | } | ||
2546 | kcqe.kcqe_op_flag = kcqe_op << KCQE_FLAGS_OPCODE_SHIFT; | ||
2547 | kcqe.kcqe_op_flag |= KCQE_FLAGS_LAYER_MASK_L5_FCOE; | ||
2548 | kcqe.kcqe_info1 = FCOE_KCQE_COMPLETION_STATUS_NIC_ERROR; | ||
2549 | kcqe.kcqe_info2 = cid; | ||
2550 | kcqe.kcqe_info0 = l5_cid; | ||
2551 | |||
2552 | } else if (layer_code == KWQE_FLAGS_LAYER_MASK_L5_ISCSI) { | ||
2530 | ulp_type = CNIC_ULP_ISCSI; | 2553 | ulp_type = CNIC_ULP_ISCSI; |
2531 | if (opcode == ISCSI_KWQE_OPCODE_UPDATE_CONN) | 2554 | if (opcode == ISCSI_KWQE_OPCODE_UPDATE_CONN) |
2532 | cid = kwqe->kwqe_info1; | 2555 | cid = kwqe->kwqe_info1; |
@@ -2539,7 +2562,6 @@ static void cnic_bnx2x_kwqe_err(struct cnic_dev *dev, struct kwqe *kwqe) | |||
2539 | 2562 | ||
2540 | } else if (layer_code == KWQE_FLAGS_LAYER_MASK_L4) { | 2563 | } else if (layer_code == KWQE_FLAGS_LAYER_MASK_L4) { |
2541 | struct l4_kcq *l4kcqe = (struct l4_kcq *) &kcqe; | 2564 | struct l4_kcq *l4kcqe = (struct l4_kcq *) &kcqe; |
2542 | u32 kcqe_op; | ||
2543 | 2565 | ||
2544 | ulp_type = CNIC_ULP_L4; | 2566 | ulp_type = CNIC_ULP_L4; |
2545 | if (opcode == L4_KWQE_OPCODE_VALUE_CONNECT1) | 2567 | if (opcode == L4_KWQE_OPCODE_VALUE_CONNECT1) |
@@ -2686,9 +2708,17 @@ static int cnic_submit_bnx2x_fcoe_kwqes(struct cnic_dev *dev, | |||
2686 | opcode); | 2708 | opcode); |
2687 | break; | 2709 | break; |
2688 | } | 2710 | } |
2689 | if (ret < 0) | 2711 | if (ret < 0) { |
2690 | netdev_err(dev->netdev, "KWQE(0x%x) failed\n", | 2712 | netdev_err(dev->netdev, "KWQE(0x%x) failed\n", |
2691 | opcode); | 2713 | opcode); |
2714 | |||
2715 | /* Possibly bnx2x parity error, send completion | ||
2716 | * to ulp drivers with error code to speed up | ||
2717 | * cleanup and reset recovery. | ||
2718 | */ | ||
2719 | if (ret == -EIO || ret == -EAGAIN) | ||
2720 | cnic_bnx2x_kwqe_err(dev, kwqe); | ||
2721 | } | ||
2692 | i += work; | 2722 | i += work; |
2693 | } | 2723 | } |
2694 | return 0; | 2724 | return 0; |
diff --git a/drivers/net/ethernet/broadcom/cnic_defs.h b/drivers/net/ethernet/broadcom/cnic_defs.h index 86936f6b6dbc..7271f14bda3b 100644 --- a/drivers/net/ethernet/broadcom/cnic_defs.h +++ b/drivers/net/ethernet/broadcom/cnic_defs.h | |||
@@ -1,7 +1,7 @@ | |||
1 | 1 | ||
2 | /* cnic.c: Broadcom CNIC core network driver. | 2 | /* cnic.c: Broadcom CNIC core network driver. |
3 | * | 3 | * |
4 | * Copyright (c) 2006-2009 Broadcom Corporation | 4 | * Copyright (c) 2006-2012 Broadcom Corporation |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
@@ -69,6 +69,7 @@ | |||
69 | 69 | ||
70 | #define FCOE_KCQE_COMPLETION_STATUS_ERROR (0x1) | 70 | #define FCOE_KCQE_COMPLETION_STATUS_ERROR (0x1) |
71 | #define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x3) | 71 | #define FCOE_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (0x3) |
72 | #define FCOE_KCQE_COMPLETION_STATUS_NIC_ERROR (0x5) | ||
72 | 73 | ||
73 | /* KCQ (kernel completion queue) response op codes */ | 74 | /* KCQ (kernel completion queue) response op codes */ |
74 | #define L4_KCQE_OPCODE_VALUE_CLOSE_COMP (53) | 75 | #define L4_KCQE_OPCODE_VALUE_CLOSE_COMP (53) |