[PATCH 16/30] RDMA/ocrdma: changes to support RoCE-v2 in RC path

2015-02-18 Thread Somnath Kotur
From: Devesh Sharma devesh.sha...@emulex.com

To support RoCE-V2 this patch implements following changes
1. Get the GID-type for a given sgid.
2. Based on the gid type get IPv4 L3 address
   and give those to FW.
3. Provide l3-type to FW.

Signed-off-by: Somnath Kotur somnath.ko...@emulex.com
Signed-off-by: Devesh Sharma devesh.sha...@emulex.com
---
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c |   28 +++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c 
b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index cb98911..237b62c 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -2433,7 +2433,13 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
union ib_gid sgid, zgid;
struct ib_gid_attr sgid_attr;
u32 vlan_id = 0x;
-   u8 mac_addr[6];
+   u8 mac_addr[6], hdr_type;
+   union {
+   struct sockaddr _sockaddr;
+   struct sockaddr_in  _sockaddr_in;
+   struct sockaddr_in6 _sockaddr_in6;
+   } sgid_addr, dgid_addr;
+
struct ocrdma_dev *dev = get_ocrdma_dev(qp-ibqp.device);
 
if ((ah_attr-ah_flags  IB_AH_GRH) == 0)
@@ -2448,6 +2454,8 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
cmd-params.hop_lmt_rq_psn |=
(ah_attr-grh.hop_limit  OCRDMA_QP_PARAMS_HOP_LMT_SHIFT);
cmd-flags |= OCRDMA_QP_PARA_FLOW_LBL_VALID;
+
+   /* GIDs */
memcpy(cmd-params.dgid[0], ah_attr-grh.dgid.raw[0],
   sizeof(cmd-params.dgid));
 
@@ -2471,6 +2479,19 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
return status;
cmd-params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1]  8) |
(mac_addr[2]  16) | (mac_addr[3]  24);
+   hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, sgid);
+   if (hdr_type == RDMA_NETWORK_IPV4) {
+   status = rdma_gid2ip(sgid_addr._sockaddr, sgid);
+   if (status)
+   return status;
+   status = rdma_gid2ip(dgid_addr._sockaddr, ah_attr-grh.dgid);
+   if (status)
+   return status;
+   memcpy(cmd-params.dgid[0],
+  dgid_addr._sockaddr_in.sin_addr.s_addr, 4);
+   memcpy(cmd-params.sgid[0],
+  sgid_addr._sockaddr_in.sin_addr.s_addr, 4);
+   }
/* convert them to LE format. */
ocrdma_cpu_to_le32(cmd-params.dgid[0], sizeof(cmd-params.dgid));
ocrdma_cpu_to_le32(cmd-params.sgid[0], sizeof(cmd-params.sgid));
@@ -2482,6 +2503,11 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
cmd-params.rnt_rc_sl_fl |=
(dev-sl  0x07)  OCRDMA_QP_PARAMS_SL_SHIFT;
}
+
+   cmd-params.max_sge_recv_flags |=
+((hdr_type 
+OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_SHIFT) 
+OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_MASK);
return 0;
 }
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 16/30] RDMA/ocrdma: changes to support RoCE-v2 in RC path

2015-02-18 Thread Somnath Kotur
From: Devesh Sharma devesh.sha...@emulex.com

To support RoCE-V2 this patch implements following changes
1. Get the GID-type for a given sgid.
2. Based on the gid type get IPv4 L3 address
   and give those to FW.
3. Provide l3-type to FW.

Signed-off-by: Somnath Kotur somnath.ko...@emulex.com
Signed-off-by: Devesh Sharma devesh.sha...@emulex.com
---
 drivers/infiniband/hw/ocrdma/ocrdma_hw.c |   28 +++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c 
b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index cb98911..237b62c 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -2433,7 +2433,13 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
union ib_gid sgid, zgid;
struct ib_gid_attr sgid_attr;
u32 vlan_id = 0x;
-   u8 mac_addr[6];
+   u8 mac_addr[6], hdr_type;
+   union {
+   struct sockaddr _sockaddr;
+   struct sockaddr_in  _sockaddr_in;
+   struct sockaddr_in6 _sockaddr_in6;
+   } sgid_addr, dgid_addr;
+
struct ocrdma_dev *dev = get_ocrdma_dev(qp-ibqp.device);
 
if ((ah_attr-ah_flags  IB_AH_GRH) == 0)
@@ -2448,6 +2454,8 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
cmd-params.hop_lmt_rq_psn |=
(ah_attr-grh.hop_limit  OCRDMA_QP_PARAMS_HOP_LMT_SHIFT);
cmd-flags |= OCRDMA_QP_PARA_FLOW_LBL_VALID;
+
+   /* GIDs */
memcpy(cmd-params.dgid[0], ah_attr-grh.dgid.raw[0],
   sizeof(cmd-params.dgid));
 
@@ -2471,6 +2479,19 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
return status;
cmd-params.dmac_b0_to_b3 = mac_addr[0] | (mac_addr[1]  8) |
(mac_addr[2]  16) | (mac_addr[3]  24);
+   hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, sgid);
+   if (hdr_type == RDMA_NETWORK_IPV4) {
+   status = rdma_gid2ip(sgid_addr._sockaddr, sgid);
+   if (status)
+   return status;
+   status = rdma_gid2ip(dgid_addr._sockaddr, ah_attr-grh.dgid);
+   if (status)
+   return status;
+   memcpy(cmd-params.dgid[0],
+  dgid_addr._sockaddr_in.sin_addr.s_addr, 4);
+   memcpy(cmd-params.sgid[0],
+  sgid_addr._sockaddr_in.sin_addr.s_addr, 4);
+   }
/* convert them to LE format. */
ocrdma_cpu_to_le32(cmd-params.dgid[0], sizeof(cmd-params.dgid));
ocrdma_cpu_to_le32(cmd-params.sgid[0], sizeof(cmd-params.sgid));
@@ -2482,6 +2503,11 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
cmd-params.rnt_rc_sl_fl |=
(dev-sl  0x07)  OCRDMA_QP_PARAMS_SL_SHIFT;
}
+
+   cmd-params.max_sge_recv_flags |=
+((hdr_type 
+OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_SHIFT) 
+OCRDMA_QP_PARAMS_FLAGS_L3_TYPE_MASK);
return 0;
 }
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html