diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-05-18 11:32:40 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-05-27 14:53:02 -0400 |
commit | c7f44fbda68a6b2d6ceb10e45c711750e779bace (patch) | |
tree | 3adfb3a9be24d38e0c7523323686c2ee9e3e09f1 /drivers/infiniband/hw/mlx5 | |
parent | 5c273b16771eaeb3957d365bb3695b92aff037cf (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.c | 9 |
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 | ||