From: Michael Guralnik <michael...@mellanox.com>

Parsing DC initiator WQEs upon page fault requires skipping an address
vector segment, as in UD WQEs.

Signed-off-by: Michael Guralnik <michael...@mellanox.com>
Reviewed-by: Moni Shoua <mo...@mellanox.com>
Signed-off-by: Leon Romanovsky <leo...@mellanox.com>
---
 drivers/infiniband/hw/mlx5/odp.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c
index 5e87a5e25574..6f1de5edbe8e 100644
--- a/drivers/infiniband/hw/mlx5/odp.c
+++ b/drivers/infiniband/hw/mlx5/odp.c
@@ -1065,6 +1065,12 @@ static int mlx5_ib_mr_initiator_pfault_handler(
        case IB_QPT_UD:
                transport_caps = dev->odp_caps.per_transport_caps.ud_odp_caps;
                break;
+       case IB_QPT_DRIVER:
+               if (qp->qp_sub_type == MLX5_IB_QPT_DCI) {
+                       transport_caps = dev->dc_odp_caps;
+                       break;
+               }
+               /* fall through */
        default:
                mlx5_ib_err(dev, "ODP fault on QP of an unsupported transport 
0x%x\n",
                            qp->ibqp.qp_type);
@@ -1078,7 +1084,8 @@ static int mlx5_ib_mr_initiator_pfault_handler(
                return -EFAULT;
        }
 
-       if (qp->ibqp.qp_type == IB_QPT_UD) {
+       if (qp->ibqp.qp_type == IB_QPT_UD ||
+           qp->qp_sub_type == MLX5_IB_QPT_DCI) {
                av = *wqe;
                if (av->dqp_dct & cpu_to_be32(MLX5_EXTENDED_UD_AV))
                        *wqe += sizeof(struct mlx5_av);
-- 
2.20.1

Reply via email to