aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx5
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-05-18 11:32:40 -0400
committerRoland Dreier <roland@purestorage.com>2014-05-27 14:53:02 -0400
commitc7f44fbda68a6b2d6ceb10e45c711750e779bace (patch)
tree3adfb3a9be24d38e0c7523323686c2ee9e3e09f1 /drivers/infiniband/hw/mlx5
parent5c273b16771eaeb3957d365bb3695b92aff037cf (diff)
mlx5_core: Copy DIF fields only when input and output space values match
Some DIF implementations (SCSI initiator/target) may want to use different input/output values for application tag and/or reference tag. So in case memory/wire domain values don't match HW must not copy them. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx5')
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 00b5563acab7..a89f70473fb7 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -2078,6 +2078,7 @@ static int mlx5_set_bsf(struct ib_mr *sig_mr,
2078 struct ib_sig_domain *wire = &sig_attrs->wire; 2078 struct ib_sig_domain *wire = &sig_attrs->wire;
2079 int ret, selector; 2079 int ret, selector;
2080 2080
2081 memset(bsf, 0, sizeof(*bsf));
2081 switch (sig_attrs->mem.sig_type) { 2082 switch (sig_attrs->mem.sig_type) {
2082 case IB_SIG_TYPE_T10_DIF: 2083 case IB_SIG_TYPE_T10_DIF:
2083 if (sig_attrs->wire.sig_type != IB_SIG_TYPE_T10_DIF) 2084 if (sig_attrs->wire.sig_type != IB_SIG_TYPE_T10_DIF)
@@ -2090,9 +2091,11 @@ static int mlx5_set_bsf(struct ib_mr *sig_mr,
2090 /* Same block structure */ 2091 /* Same block structure */
2091 basic->bsf_size_sbs = 1 << 4; 2092 basic->bsf_size_sbs = 1 << 4;
2092 if (mem->sig.dif.bg_type == wire->sig.dif.bg_type) 2093 if (mem->sig.dif.bg_type == wire->sig.dif.bg_type)
2093 basic->wire.copy_byte_mask = 0xff; 2094 basic->wire.copy_byte_mask |= 0xc0;
2094 else 2095 if (mem->sig.dif.app_tag == wire->sig.dif.app_tag)
2095 basic->wire.copy_byte_mask = 0x3f; 2096 basic->wire.copy_byte_mask |= 0x30;
2097 if (mem->sig.dif.ref_tag == wire->sig.dif.ref_tag)
2098 basic->wire.copy_byte_mask |= 0x0f;
2096 } else 2099 } else
2097 basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval); 2100 basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval);
2098 2101