diff options
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_cxt.c | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_cxt.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_hsi.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 23 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_rdma.c | 178 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_rdma.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/qlogic/qed/qed_roce.c | 17 | ||||
| -rw-r--r-- | include/linux/qed/qed_rdma_if.h | 12 |
9 files changed, 234 insertions, 8 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c index 820b226d6ff8..7ed6aa0521e1 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include "qed_hsi.h" | 47 | #include "qed_hsi.h" |
| 48 | #include "qed_hw.h" | 48 | #include "qed_hw.h" |
| 49 | #include "qed_init_ops.h" | 49 | #include "qed_init_ops.h" |
| 50 | #include "qed_rdma.h" | ||
| 50 | #include "qed_reg_addr.h" | 51 | #include "qed_reg_addr.h" |
| 51 | #include "qed_sriov.h" | 52 | #include "qed_sriov.h" |
| 52 | 53 | ||
| @@ -426,7 +427,7 @@ static void qed_cxt_set_srq_count(struct qed_hwfn *p_hwfn, u32 num_srqs) | |||
| 426 | p_mgr->srq_count = num_srqs; | 427 | p_mgr->srq_count = num_srqs; |
| 427 | } | 428 | } |
| 428 | 429 | ||
| 429 | static u32 qed_cxt_get_srq_count(struct qed_hwfn *p_hwfn) | 430 | u32 qed_cxt_get_srq_count(struct qed_hwfn *p_hwfn) |
| 430 | { | 431 | { |
| 431 | struct qed_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr; | 432 | struct qed_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr; |
| 432 | 433 | ||
| @@ -2071,7 +2072,7 @@ static void qed_rdma_set_pf_params(struct qed_hwfn *p_hwfn, | |||
| 2071 | u32 num_cons, num_qps, num_srqs; | 2072 | u32 num_cons, num_qps, num_srqs; |
| 2072 | enum protocol_type proto; | 2073 | enum protocol_type proto; |
| 2073 | 2074 | ||
| 2074 | num_srqs = min_t(u32, 32 * 1024, p_params->num_srqs); | 2075 | num_srqs = min_t(u32, QED_RDMA_MAX_SRQS, p_params->num_srqs); |
| 2075 | 2076 | ||
| 2076 | if (p_hwfn->mcp_info->func_info.protocol == QED_PCI_ETH_RDMA) { | 2077 | if (p_hwfn->mcp_info->func_info.protocol == QED_PCI_ETH_RDMA) { |
| 2077 | DP_NOTICE(p_hwfn, | 2078 | DP_NOTICE(p_hwfn, |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.h b/drivers/net/ethernet/qlogic/qed/qed_cxt.h index a4e95869889f..758a8b4c0de8 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.h +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.h | |||
| @@ -235,6 +235,7 @@ u32 qed_cxt_get_proto_tid_count(struct qed_hwfn *p_hwfn, | |||
| 235 | enum protocol_type type); | 235 | enum protocol_type type); |
| 236 | u32 qed_cxt_get_proto_cid_start(struct qed_hwfn *p_hwfn, | 236 | u32 qed_cxt_get_proto_cid_start(struct qed_hwfn *p_hwfn, |
| 237 | enum protocol_type type); | 237 | enum protocol_type type); |
| 238 | u32 qed_cxt_get_srq_count(struct qed_hwfn *p_hwfn); | ||
| 238 | int qed_cxt_free_proto_ilt(struct qed_hwfn *p_hwfn, enum protocol_type proto); | 239 | int qed_cxt_free_proto_ilt(struct qed_hwfn *p_hwfn, enum protocol_type proto); |
| 239 | 240 | ||
| 240 | #define QED_CTX_WORKING_MEM 0 | 241 | #define QED_CTX_WORKING_MEM 0 |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_hsi.h b/drivers/net/ethernet/qlogic/qed/qed_hsi.h index beba9308011b..b9704be53537 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_hsi.h +++ b/drivers/net/ethernet/qlogic/qed/qed_hsi.h | |||
| @@ -9725,6 +9725,8 @@ enum iwarp_eqe_async_opcode { | |||
| 9725 | IWARP_EVENT_TYPE_ASYNC_EXCEPTION_DETECTED, | 9725 | IWARP_EVENT_TYPE_ASYNC_EXCEPTION_DETECTED, |
| 9726 | IWARP_EVENT_TYPE_ASYNC_QP_IN_ERROR_STATE, | 9726 | IWARP_EVENT_TYPE_ASYNC_QP_IN_ERROR_STATE, |
| 9727 | IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW, | 9727 | IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW, |
| 9728 | IWARP_EVENT_TYPE_ASYNC_SRQ_EMPTY, | ||
| 9729 | IWARP_EVENT_TYPE_ASYNC_SRQ_LIMIT, | ||
| 9728 | MAX_IWARP_EQE_ASYNC_OPCODE | 9730 | MAX_IWARP_EQE_ASYNC_OPCODE |
| 9729 | }; | 9731 | }; |
| 9730 | 9732 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c index 2a2b1018ed1d..474e6cff5b97 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c | |||
| @@ -271,6 +271,8 @@ int qed_iwarp_create_qp(struct qed_hwfn *p_hwfn, | |||
| 271 | p_ramrod->sq_num_pages = qp->sq_num_pages; | 271 | p_ramrod->sq_num_pages = qp->sq_num_pages; |
| 272 | p_ramrod->rq_num_pages = qp->rq_num_pages; | 272 | p_ramrod->rq_num_pages = qp->rq_num_pages; |
| 273 | 273 | ||
| 274 | p_ramrod->srq_id.srq_idx = cpu_to_le16(qp->srq_id); | ||
| 275 | p_ramrod->srq_id.opaque_fid = cpu_to_le16(p_hwfn->hw_info.opaque_fid); | ||
| 274 | p_ramrod->qp_handle_for_cqe.hi = cpu_to_le32(qp->qp_handle.hi); | 276 | p_ramrod->qp_handle_for_cqe.hi = cpu_to_le32(qp->qp_handle.hi); |
| 275 | p_ramrod->qp_handle_for_cqe.lo = cpu_to_le32(qp->qp_handle.lo); | 277 | p_ramrod->qp_handle_for_cqe.lo = cpu_to_le32(qp->qp_handle.lo); |
| 276 | 278 | ||
| @@ -3004,8 +3006,11 @@ static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, | |||
| 3004 | union event_ring_data *data, | 3006 | union event_ring_data *data, |
| 3005 | u8 fw_return_code) | 3007 | u8 fw_return_code) |
| 3006 | { | 3008 | { |
| 3009 | struct qed_rdma_events events = p_hwfn->p_rdma_info->events; | ||
| 3007 | struct regpair *fw_handle = &data->rdma_data.async_handle; | 3010 | struct regpair *fw_handle = &data->rdma_data.async_handle; |
| 3008 | struct qed_iwarp_ep *ep = NULL; | 3011 | struct qed_iwarp_ep *ep = NULL; |
| 3012 | u16 srq_offset; | ||
| 3013 | u16 srq_id; | ||
| 3009 | u16 cid; | 3014 | u16 cid; |
| 3010 | 3015 | ||
| 3011 | ep = (struct qed_iwarp_ep *)(uintptr_t)HILO_64(fw_handle->hi, | 3016 | ep = (struct qed_iwarp_ep *)(uintptr_t)HILO_64(fw_handle->hi, |
| @@ -3067,6 +3072,24 @@ static int qed_iwarp_async_event(struct qed_hwfn *p_hwfn, | |||
| 3067 | qed_iwarp_cid_cleaned(p_hwfn, cid); | 3072 | qed_iwarp_cid_cleaned(p_hwfn, cid); |
| 3068 | 3073 | ||
| 3069 | break; | 3074 | break; |
| 3075 | case IWARP_EVENT_TYPE_ASYNC_SRQ_EMPTY: | ||
| 3076 | DP_NOTICE(p_hwfn, "IWARP_EVENT_TYPE_ASYNC_SRQ_EMPTY\n"); | ||
| 3077 | srq_offset = p_hwfn->p_rdma_info->srq_id_offset; | ||
| 3078 | /* FW assigns value that is no greater than u16 */ | ||
| 3079 | srq_id = ((u16)le32_to_cpu(fw_handle->lo)) - srq_offset; | ||
| 3080 | events.affiliated_event(events.context, | ||
| 3081 | QED_IWARP_EVENT_SRQ_EMPTY, | ||
| 3082 | &srq_id); | ||
| 3083 | break; | ||
| 3084 | case IWARP_EVENT_TYPE_ASYNC_SRQ_LIMIT: | ||
| 3085 | DP_NOTICE(p_hwfn, "IWARP_EVENT_TYPE_ASYNC_SRQ_LIMIT\n"); | ||
| 3086 | srq_offset = p_hwfn->p_rdma_info->srq_id_offset; | ||
| 3087 | /* FW assigns value that is no greater than u16 */ | ||
| 3088 | srq_id = ((u16)le32_to_cpu(fw_handle->lo)) - srq_offset; | ||
| 3089 | events.affiliated_event(events.context, | ||
| 3090 | QED_IWARP_EVENT_SRQ_LIMIT, | ||
| 3091 | &srq_id); | ||
| 3092 | break; | ||
| 3070 | case IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW: | 3093 | case IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW: |
| 3071 | DP_NOTICE(p_hwfn, "IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW\n"); | 3094 | DP_NOTICE(p_hwfn, "IWARP_EVENT_TYPE_ASYNC_CQ_OVERFLOW\n"); |
| 3072 | 3095 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 68c4399ffd50..b04d57ca5176 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
| @@ -64,6 +64,7 @@ | |||
| 64 | 64 | ||
| 65 | #define QED_ROCE_QPS (8192) | 65 | #define QED_ROCE_QPS (8192) |
| 66 | #define QED_ROCE_DPIS (8) | 66 | #define QED_ROCE_DPIS (8) |
| 67 | #define QED_RDMA_SRQS QED_ROCE_QPS | ||
| 67 | 68 | ||
| 68 | static char version[] = | 69 | static char version[] = |
| 69 | "QLogic FastLinQ 4xxxx Core Module qed " DRV_MODULE_VERSION "\n"; | 70 | "QLogic FastLinQ 4xxxx Core Module qed " DRV_MODULE_VERSION "\n"; |
| @@ -922,6 +923,7 @@ static void qed_update_pf_params(struct qed_dev *cdev, | |||
| 922 | if (IS_ENABLED(CONFIG_QED_RDMA)) { | 923 | if (IS_ENABLED(CONFIG_QED_RDMA)) { |
| 923 | params->rdma_pf_params.num_qps = QED_ROCE_QPS; | 924 | params->rdma_pf_params.num_qps = QED_ROCE_QPS; |
| 924 | params->rdma_pf_params.min_dpis = QED_ROCE_DPIS; | 925 | params->rdma_pf_params.min_dpis = QED_ROCE_DPIS; |
| 926 | params->rdma_pf_params.num_srqs = QED_RDMA_SRQS; | ||
| 925 | /* divide by 3 the MRs to avoid MF ILT overflow */ | 927 | /* divide by 3 the MRs to avoid MF ILT overflow */ |
| 926 | params->rdma_pf_params.gl_pi = QED_ROCE_PROTOCOL_INDEX; | 928 | params->rdma_pf_params.gl_pi = QED_ROCE_PROTOCOL_INDEX; |
| 927 | } | 929 | } |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c index a411f9c702a1..b8705107a93a 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c +++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c | |||
| @@ -259,15 +259,29 @@ static int qed_rdma_alloc(struct qed_hwfn *p_hwfn, | |||
| 259 | goto free_cid_map; | 259 | goto free_cid_map; |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | /* Allocate bitmap for srqs */ | ||
| 263 | p_rdma_info->num_srqs = qed_cxt_get_srq_count(p_hwfn); | ||
| 264 | rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->srq_map, | ||
| 265 | p_rdma_info->num_srqs, "SRQ"); | ||
| 266 | if (rc) { | ||
| 267 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, | ||
| 268 | "Failed to allocate srq bitmap, rc = %d\n", rc); | ||
| 269 | goto free_real_cid_map; | ||
| 270 | } | ||
| 271 | |||
| 262 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) | 272 | if (QED_IS_IWARP_PERSONALITY(p_hwfn)) |
| 263 | rc = qed_iwarp_alloc(p_hwfn); | 273 | rc = qed_iwarp_alloc(p_hwfn); |
| 264 | 274 | ||
| 265 | if (rc) | 275 | if (rc) |
| 266 | goto free_cid_map; | 276 | goto free_srq_map; |
| 267 | 277 | ||
| 268 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocation successful\n"); | 278 | DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocation successful\n"); |
| 269 | return 0; | 279 | return 0; |
| 270 | 280 | ||
| 281 | free_srq_map: | ||
| 282 | kfree(p_rdma_info->srq_map.bitmap); | ||
| 283 | free_real_cid_map: | ||
| 284 | kfree(p_rdma_info->real_cid_map.bitmap); | ||
| 271 | free_cid_map: | 285 | free_cid_map: |
| 272 | kfree(p_rdma_info->cid_map.bitmap); | 286 | kfree(p_rdma_info->cid_map.bitmap); |
| 273 | free_tid_map: | 287 | free_tid_map: |
| @@ -351,6 +365,8 @@ static void qed_rdma_resc_free(struct qed_hwfn *p_hwfn) | |||
| 351 | qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->cq_map, 1); | ||
