Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7f44fbd authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Roland Dreier
Browse files

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: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 5c273b16
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -2078,6 +2078,7 @@ static int mlx5_set_bsf(struct ib_mr *sig_mr,
	struct ib_sig_domain *wire = &sig_attrs->wire;
	struct ib_sig_domain *wire = &sig_attrs->wire;
	int ret, selector;
	int ret, selector;


	memset(bsf, 0, sizeof(*bsf));
	switch (sig_attrs->mem.sig_type) {
	switch (sig_attrs->mem.sig_type) {
	case IB_SIG_TYPE_T10_DIF:
	case IB_SIG_TYPE_T10_DIF:
		if (sig_attrs->wire.sig_type != IB_SIG_TYPE_T10_DIF)
		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,
			/* Same block structure */
			/* Same block structure */
			basic->bsf_size_sbs = 1 << 4;
			basic->bsf_size_sbs = 1 << 4;
			if (mem->sig.dif.bg_type == wire->sig.dif.bg_type)
			if (mem->sig.dif.bg_type == wire->sig.dif.bg_type)
				basic->wire.copy_byte_mask = 0xff;
				basic->wire.copy_byte_mask |= 0xc0;
			else
			if (mem->sig.dif.app_tag == wire->sig.dif.app_tag)
				basic->wire.copy_byte_mask = 0x3f;
				basic->wire.copy_byte_mask |= 0x30;
			if (mem->sig.dif.ref_tag == wire->sig.dif.ref_tag)
				basic->wire.copy_byte_mask |= 0x0f;
		} else
		} else
			basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval);
			basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval);