IB/hns: add self loopback for CM
authorLijun Ou <oulijun@huawei.com>
Wed, 23 Nov 2016 19:41:02 +0000 (19:41 +0000)
committerDoug Ledford <dledford@redhat.com>
Sat, 3 Dec 2016 19:20:42 +0000 (14:20 -0500)
This patch mainly adds self loopback support for CM.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Peter Chen <luck.chen@huawei.com>
Reviewed-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
drivers/infiniband/hw/hns/hns_roce_hw_v1.h

index 957f0de866cd272545da70b9b22aa4ee0c9350ef..48c71e839c6a769721df742939e43255a609b3e5 100644 (file)
@@ -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,
index 6004c7f395429ac52fdacb7ee2e7855d29841c3f..cf28f1b6492c86cd82055191eed89db98351e266 100644 (file)
@@ -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)