From: Lijun Ou <ouli...@huawei.com>

This patch mainly adds self loopback support for CM.

Signed-off-by: Lijun Ou <ouli...@huawei.com>
Signed-off-by: Peter Chen <luck.c...@huawei.com>
Reviewed-by: Wei Hu (Xavier) <xavier.hu...@huawei.com>
Signed-off-by: Salil Mehta  <salil.me...@huawei.com>
---
 drivers/infiniband/hw/hns/hns_roce_hw_v1.c |   11 +++++++++++
 drivers/infiniband/hw/hns/hns_roce_hw_v1.h |    2 ++
 2 files changed, 13 insertions(+)

diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c 
b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
index 959d5ca..e080dd6 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
@@ -32,6 +32,7 @@
 
 #include <linux/platform_device.h>
 #include <linux/acpi.h>
+#include <linux/etherdevice.h>
 #include <rdma/ib_umem.h>
 #include "hns_roce_common.h"
 #include "hns_roce_device.h"
@@ -72,6 +73,8 @@ int hns_roce_v1_post_send(struct ib_qp *ibqp, struct 
ib_send_wr *wr,
        int nreq = 0;
        u32 ind = 0;
        int ret = 0;
+       u8 *smac;
+       int loopback;
 
        if (unlikely(ibqp->qp_type != IB_QPT_GSI &&
                ibqp->qp_type != IB_QPT_RC)) {
@@ -129,6 +132,14 @@ int hns_roce_v1_post_send(struct ib_qp *ibqp, struct 
ib_send_wr *wr,
                                       UD_SEND_WQE_U32_8_DMAC_5_M,
                                       UD_SEND_WQE_U32_8_DMAC_5_S,
                                       ah->av.mac[5]);
+
+                       smac = (u8 *)hr_dev->dev_addr[qp->port];
+                       loopback = ether_addr_equal_unaligned(ah->av.mac,
+                                                             smac) ? 1 : 0;
+                       roce_set_bit(ud_sq_wqe->u32_8,
+                                    UD_SEND_WQE_U32_8_LOOPBACK_INDICATOR_S,
+                                    loopback);
+
                        roce_set_field(ud_sq_wqe->u32_8,
                                       UD_SEND_WQE_U32_8_OPERATION_TYPE_M,
                                       UD_SEND_WQE_U32_8_OPERATION_TYPE_S,
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.h 
b/drivers/infiniband/hw/hns/hns_roce_hw_v1.h
index 6004c7f..cf28f1b 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.h
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.h
@@ -440,6 +440,8 @@ struct hns_roce_ud_send_wqe {
 #define UD_SEND_WQE_U32_8_DMAC_5_M   \
        (((1UL << 8) - 1) << UD_SEND_WQE_U32_8_DMAC_5_S)
 
+#define UD_SEND_WQE_U32_8_LOOPBACK_INDICATOR_S 22
+
 #define UD_SEND_WQE_U32_8_OPERATION_TYPE_S 16
 #define UD_SEND_WQE_U32_8_OPERATION_TYPE_M   \
        (((1UL << 4) - 1) << UD_SEND_WQE_U32_8_OPERATION_TYPE_S)
-- 
1.7.9.5


Reply via email to