aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_cxt.c5
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_cxt.h1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_hsi.h2
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_iwarp.c23
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_main.c2
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_rdma.c178
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_rdma.h2
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_roce.c17
-rw-r--r--include/linux/qed/qed_rdma_if.h12
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
429static u32 qed_cxt_get_srq_count(struct qed_hwfn *p_hwfn) 430u32 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);
236u32 qed_cxt_get_proto_cid_start(struct qed_hwfn *p_hwfn, 236u32 qed_cxt_get_proto_cid_start(struct qed_hwfn *p_hwfn,
237 enum protocol_type type); 237 enum protocol_type type);
238u32 qed_cxt_get_srq_count(struct qed_hwfn *p_hwfn);
238int qed_cxt_free_proto_ilt(struct qed_hwfn *p_hwfn, enum protocol_type proto); 239int 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
68static char version[] = 69static 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
281free_srq_map:
282 kfree(p_rdma_info->srq_map.bitmap);
283free_real_cid_map:
284 kfree(p_rdma_info->real_cid_map.bitmap);
271free_cid_map: 285free_cid_map:
272 kfree(p_rdma_info->cid_map.bitmap); 286 kfree(p_rdma_info->cid_map.bitmap);
273free_tid_map: 287free_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);