diff options
-rw-r--r-- | drivers/infiniband/hw/mlx5/qp.c | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index 74ee4a474e68..00b5563acab7 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c | |||
@@ -2131,9 +2131,13 @@ static int set_sig_data_segment(struct ib_send_wr *wr, struct mlx5_ib_qp *qp, | |||
2131 | int ret; | 2131 | int ret; |
2132 | int wqe_size; | 2132 | int wqe_size; |
2133 | 2133 | ||
2134 | if (!wr->wr.sig_handover.prot) { | 2134 | if (!wr->wr.sig_handover.prot || |
2135 | (data_key == wr->wr.sig_handover.prot->lkey && | ||
2136 | data_va == wr->wr.sig_handover.prot->addr && | ||
2137 | data_len == wr->wr.sig_handover.prot->length)) { | ||
2135 | /** | 2138 | /** |
2136 | * Source domain doesn't contain signature information | 2139 | * Source domain doesn't contain signature information |
2140 | * or data and protection are interleaved in memory. | ||
2137 | * So need construct: | 2141 | * So need construct: |
2138 | * ------------------ | 2142 | * ------------------ |
2139 | * | data_klm | | 2143 | * | data_klm | |
@@ -2187,23 +2191,13 @@ static int set_sig_data_segment(struct ib_send_wr *wr, struct mlx5_ib_qp *qp, | |||
2187 | data_sentry->bcount = cpu_to_be16(block_size); | 2191 | data_sentry->bcount = cpu_to_be16(block_size); |
2188 | data_sentry->key = cpu_to_be32(data_key); | 2192 | data_sentry->key = cpu_to_be32(data_key); |
2189 | data_sentry->va = cpu_to_be64(data_va); | 2193 | data_sentry->va = cpu_to_be64(data_va); |
2194 | data_sentry->stride = cpu_to_be16(block_size); | ||
2195 | |||
2190 | prot_sentry->bcount = cpu_to_be16(prot_size); | 2196 | prot_sentry->bcount = cpu_to_be16(prot_size); |
2191 | prot_sentry->key = cpu_to_be32(prot_key); | 2197 | prot_sentry->key = cpu_to_be32(prot_key); |
2198 | prot_sentry->va = cpu_to_be64(prot_va); | ||
2199 | prot_sentry->stride = cpu_to_be16(prot_size); | ||
2192 | 2200 | ||
2193 | if (prot_key == data_key && prot_va == data_va) { | ||
2194 | /** | ||
2195 | * The data and protection are interleaved | ||
2196 | * in a single memory region | ||
2197 | **/ | ||
2198 | prot_sentry->va = cpu_to_be64(data_va + block_size); | ||
2199 | prot_sentry->stride = cpu_to_be16(block_size + prot_size); | ||
2200 | data_sentry->stride = prot_sentry->stride; | ||
2201 | } else { | ||
2202 | /* The data and protection are two different buffers */ | ||
2203 | prot_sentry->va = cpu_to_be64(prot_va); | ||
2204 | data_sentry->stride = cpu_to_be16(block_size); | ||
2205 | prot_sentry->stride = cpu_to_be16(prot_size); | ||
2206 | } | ||
2207 | wqe_size = ALIGN(sizeof(*sblock_ctrl) + sizeof(*data_sentry) + | 2201 | wqe_size = ALIGN(sizeof(*sblock_ctrl) + sizeof(*data_sentry) + |
2208 | sizeof(*prot_sentry), 64); | 2202 | sizeof(*prot_sentry), 64); |
2209 | } | 2203 | } |