diff options
author | Devesh Sharma <devesh.sharma@avagotech.com> | 2016-01-28 08:59:58 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-02-29 17:12:10 -0500 |
commit | bcf117e2cf6f451b46780e0660e9ae7ab33a33ea (patch) | |
tree | 15e742febea9836d3e9991c04a3986b9b3de656b | |
parent | 6b0626679d81626eac47cba7940f1435ec480b2e (diff) |
RDMA/ocrdma: Support RoCE-v2 in the RC path
This patch implements following changes to support RoCE-v2
in the RC path:
* Get the GID-type for a given sgid.
* Based on the GID-type get IPv4/IPv6 L3-address
and give those to underlying device.
* Resolve and provide network header type to device.
Signed-off-by: Somnath Kotur <somnath.kotur@avagotech.com>
Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 23 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 2 |
2 files changed, 23 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index aea7f1761907..2cfbf15962c6 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c | |||
@@ -2504,7 +2504,12 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, | |||
2504 | union ib_gid sgid, zgid; | 2504 | union ib_gid sgid, zgid; |
2505 | struct ib_gid_attr sgid_attr; | 2505 | struct ib_gid_attr sgid_attr; |
2506 | u32 vlan_id = 0xFFFF; | 2506 | u32 vlan_id = 0xFFFF; |
2507 | u8 mac_addr[6]; | 2507 | u8 mac_addr[6], hdr_type; |
2508 | union { | ||
2509 | struct sockaddr _sockaddr; | ||
2510 | struct sockaddr_in _sockaddr_in; | ||
2511 | struct sockaddr_in6 _sockaddr_in6; | ||
2512 | } sgid_addr, dgid_addr; | ||
2508 | struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device); | 2513 | struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device); |
2509 | 2514 | ||
2510 | if ((ah_attr->ah_flags & IB_AH_GRH) == 0) | 2515 | if ((ah_attr->ah_flags & IB_AH_GRH) == 0) |
@@ -2519,6 +2524,8 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, | |||
2519 | cmd->params.hop_lmt_rq_psn |= | 2524 | cmd->params.hop_lmt_rq_psn |= |
2520 | (ah_attr->grh.hop_limit << OCRDMA_QP_PARAMS_HOP_LMT_SHIFT); | 2525 | (ah_attr->grh.hop_limit << OCRDMA_QP_PARAMS_HOP_LMT_SHIFT); |
2521 | cmd->flags |= OCRDMA_QP_PARA_FLOW_LBL_VALID; | 2526 | cmd->flags |= OCRDMA_QP_PARA_FLOW_LBL_VALID; |
2527 | |||
2528 | /* GIDs */ | ||
2522 | memcpy(&cmd->params.dgid[0], &ah_attr->grh.dgid.raw[0], | 2529 | memcpy(&cmd->params.dgid[0], &ah_attr->grh.dgid.raw[0], |
2523 | sizeof(cmd->params.dgid)); | 2530 | sizeof(cmd->params.dgid)); |
2524 | 2531 | ||
@@ -2541,6 +2548,16 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, | |||
2541 | return status; | 2548 | return status; |
2542 | cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) | | 2549 | cmd->params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1] << 8) | |
2543 | (mac_addr[2] << 16) | (mac_addr[3] << 24); | 2550 | (mac_addr[2] << 16) | (mac_addr[3] << 24); |
2551 | |||
2552 | hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); | ||
2553 | if (hdr_type == RDMA_NETWORK_IPV4) { | ||
2554 | rdma_gid2ip(&sgid_addr._sockaddr, &sgid); | ||
2555 | rdma_gid2ip(&dgid_addr._sockaddr, &ah_attr->grh.dgid); | ||
2556 | memcpy(&cmd->params.dgid[0], | ||
2557 | &dgid_addr._sockaddr_in.sin_addr.s_addr, 4); | ||
2558 | memcpy(&cmd->params.sgid[0], | ||
2559 | &sgid_addr._sockaddr_in.sin_addr.s_addr, 4); | ||
2560 | } | ||
2544 | /* convert them to LE format. */ | 2561 | /* convert them to LE format. */ |
2545 | ocrdma_cpu_to_le32(&cmd->params.dgid[0], sizeof(cmd->params.dgid)); | 2562 | ocrdma_cpu_to_le32(&cmd->params.dgid[0], sizeof(cmd->params.dgid)); |
2546 | ocrdma_cpu_to_le32(&cmd->params.sgid[0], sizeof(cmd->params.sgid)); | 2563 | ocrdma_cpu_to_le32(&cmd->params.sgid[0], sizeof(cmd->params.sgid)); |
@@ -2561,7 +2578,9 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp, | |||
2561 | cmd->params.rnt_rc_sl_fl |= | 2578 | cmd->params.rnt_rc_sl_fl |= |
2562 | (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT; | 2579 | (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT; |
2563 | } | 2580 | } |
2564 | 2581 | cmd->params.max_sge_recv_flags |= ((hdr_type << | |
2582 | OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_SHIFT) & | ||
2583 | OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_MASK); | ||
2565 | return 0; | 2584 | return 0; |
2566 | } | 2585 | } |
2567 | 2586 | ||
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h index 3d15948cbf7c..0efc9662c6d8 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h | |||
@@ -1112,6 +1112,8 @@ enum { | |||
1112 | OCRDMA_QP_PARAMS_STATE_MASK = BIT(5) | BIT(6) | BIT(7), | 1112 | OCRDMA_QP_PARAMS_STATE_MASK = BIT(5) | BIT(6) | BIT(7), |
1113 | OCRDMA_QP_PARAMS_FLAGS_SQD_ASYNC = BIT(8), | 1113 | OCRDMA_QP_PARAMS_FLAGS_SQD_ASYNC = BIT(8), |
1114 | OCRDMA_QP_PARAMS_FLAGS_INB_ATEN = BIT(9), | 1114 | OCRDMA_QP_PARAMS_FLAGS_INB_ATEN = BIT(9), |
1115 | OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_SHIFT = 11, | ||
1116 | OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_MASK = BIT(11) | BIT(12) | BIT(13), | ||
1115 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_SHIFT = 16, | 1117 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_SHIFT = 16, |
1116 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_MASK = 0xFFFF << | 1118 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_MASK = 0xFFFF << |
1117 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_SHIFT, | 1119 | OCRDMA_QP_PARAMS_MAX_SGE_RECV_SHIFT, |