Re: [PATCH 03/15] scsi: qla2xxx: Use the proper SCSI midlayer interfaces for PI

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 8 Jun 2021, 8:39pm, Martin K. Petersen wrote:

> Use the SCSI midlayer interfaces to query protection interval,
> reference tag, and per-command DIX flags.
> 
> Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
> ---
>  drivers/scsi/qla2xxx/qla_iocb.c | 84 ++++++---------------------------
>  1 file changed, 15 insertions(+), 69 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
> index 38b5bdde2405..42a6fbba7529 100644
> --- a/drivers/scsi/qla2xxx/qla_iocb.c
> +++ b/drivers/scsi/qla2xxx/qla_iocb.c
> @@ -145,7 +145,6 @@ inline int
>  qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
>  {
>  	struct scsi_cmnd *cmd = GET_CMD_SP(sp);
> -	uint8_t	guard = scsi_host_get_guard(cmd->device->host);
>  
>  	/* We always use DIFF Bundling for best performance */
>  	*fw_prot_opts = 0;
> @@ -166,7 +165,7 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
>  		break;
>  	case SCSI_PROT_READ_PASS:
>  	case SCSI_PROT_WRITE_PASS:
> -		if (guard & SHOST_DIX_GUARD_IP)
> +		if (cmd->prot_flags & SCSI_PROT_IP_CHECKSUM)
>  			*fw_prot_opts |= PO_MODE_DIF_TCP_CKSUM;
>  		else
>  			*fw_prot_opts |= PO_MODE_DIF_PASS;
> @@ -176,6 +175,9 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
>  		break;
>  	}
>  
> +	if (!(cmd->prot_flags & SCSI_PROT_GUARD_CHECK))
> +		*fw_prot_opts |= PO_DISABLE_GUARD_CHECK;
> +
>  	return scsi_prot_sg_count(cmd);
>  }
>  
> @@ -772,74 +774,18 @@ qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt,
>  {
>  	struct scsi_cmnd *cmd = GET_CMD_SP(sp);
>  
> -	switch (scsi_get_prot_type(cmd)) {
> -	case SCSI_PROT_DIF_TYPE0:
> -		/*
> -		 * No check for ql2xenablehba_err_chk, as it would be an
> -		 * I/O error if hba tag generation is not done.
> -		 */
> -		pkt->ref_tag = cpu_to_le32((uint32_t)
> -		    (0xffffffff & scsi_get_lba(cmd)));
> -
> -		if (!qla2x00_hba_err_chk_enabled(sp))
> -			break;
> -
> -		pkt->ref_tag_mask[0] = 0xff;
> -		pkt->ref_tag_mask[1] = 0xff;
> -		pkt->ref_tag_mask[2] = 0xff;
> -		pkt->ref_tag_mask[3] = 0xff;
> -		break;
> -
> -	/*
> -	 * For TYPE 2 protection: 16 bit GUARD + 32 bit REF tag has to
> -	 * match LBA in CDB + N
> -	 */
> -	case SCSI_PROT_DIF_TYPE2:
> -		pkt->app_tag = cpu_to_le16(0);
> -		pkt->app_tag_mask[0] = 0x0;
> -		pkt->app_tag_mask[1] = 0x0;
> -
> -		pkt->ref_tag = cpu_to_le32((uint32_t)
> -		    (0xffffffff & scsi_get_lba(cmd)));
> +	pkt->ref_tag = cpu_to_le32(scsi_prot_ref_tag(cmd));
>  
> -		if (!qla2x00_hba_err_chk_enabled(sp))
> -			break;
> -
> -		/* enable ALL bytes of the ref tag */
> -		pkt->ref_tag_mask[0] = 0xff;
> -		pkt->ref_tag_mask[1] = 0xff;
> -		pkt->ref_tag_mask[2] = 0xff;
> -		pkt->ref_tag_mask[3] = 0xff;
> -		break;
> -
> -	/* For Type 3 protection: 16 bit GUARD only */
> -	case SCSI_PROT_DIF_TYPE3:
> -		pkt->ref_tag_mask[0] = pkt->ref_tag_mask[1] =
> -			pkt->ref_tag_mask[2] = pkt->ref_tag_mask[3] =
> -								0x00;
> -		break;
> -
> -	/*
> -	 * For TYpe 1 protection: 16 bit GUARD tag, 32 bit REF tag, and
> -	 * 16 bit app tag.
> -	 */
> -	case SCSI_PROT_DIF_TYPE1:
> -		pkt->ref_tag = cpu_to_le32((uint32_t)
> -		    (0xffffffff & scsi_get_lba(cmd)));
> -		pkt->app_tag = cpu_to_le16(0);
> -		pkt->app_tag_mask[0] = 0x0;
> -		pkt->app_tag_mask[1] = 0x0;
> -
> -		if (!qla2x00_hba_err_chk_enabled(sp))
> -			break;
> -
> -		/* enable ALL bytes of the ref tag */
> -		pkt->ref_tag_mask[0] = 0xff;
> -		pkt->ref_tag_mask[1] = 0xff;
> -		pkt->ref_tag_mask[2] = 0xff;
> -		pkt->ref_tag_mask[3] = 0xff;
> -		break;
> +	if (cmd->prot_flags & SCSI_PROT_REF_CHECK) {

I would also add a "&& qla2x00_hba_err_chk_enabled(sp)" to the above check 
to preserve the old semantics (which was helpful during testing).

With that:

Reviewed-by: Arun Easi <aeasi@xxxxxxxxxxx>

Regards,
-Arun


> +                pkt->ref_tag_mask[0] = 0xff;
> +                pkt->ref_tag_mask[1] = 0xff;
> +                pkt->ref_tag_mask[2] = 0xff;
> +                pkt->ref_tag_mask[3] = 0xff;
>  	}
> +
> +	pkt->app_tag = __constant_cpu_to_le16(0);
> +	pkt->app_tag_mask[0] = 0x0;
> +	pkt->app_tag_mask[1] = 0x0;
>  }
>  
>  int
> @@ -905,7 +851,7 @@ qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *ha, srb_t *sp,
>  	memset(&sgx, 0, sizeof(struct qla2_sgx));
>  	if (sp) {
>  		cmd = GET_CMD_SP(sp);
> -		prot_int = cmd->device->sector_size;
> +		prot_int = scsi_prot_interval(cmd);
>  
>  		sgx.tot_bytes = scsi_bufflen(cmd);
>  		sgx.cur_sg = scsi_sglist(cmd);
> 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux