On Sat, 2017-06-17 at 20:00 +0900, Minwoo Im wrote: 
> -     if ((tf->protocol = ata_scsi_map_proto(cdb[1])) == ATA_PROT_UNKNOWN) {
> +     /*
> +      * if SCSI operation code in cdb[0] is ATA_12 or ATA_16,
> +      * then cdb[1] will contain protocol of ATA PASS-THROUGH.
> +      * otherwise, Its operation code shall be ATA_32(7Fh).
> +      * in this case, cdb[10] will contain protocol of it.
> +      * we call this command as a variable-length cdb.
> +      */
> +     if (cdb[0] == ATA_12 || cdb[0] == ATA_16)
> +             tf->protocol = ata_scsi_map_proto(cdb[1]);
> +     else
> +             tf->protocol = ata_scsi_map_proto(cdb[10]);
> +
> +     if (tf->protocol == ATA_PROT_UNKNOWN) {
>               fp = 1;
>               goto invalid_fld;
>       }

Hello Minwoo,

Please consider introducing a variable (e.g. called "cdb_offset") in which the
value 9 is stored for 32-byte CDBs and 0 for 12-byte and 16-byte CDBs. That
will allow to rewrite the above code as follows:

        tf->protocol = ata_scsi_map_proto(cdb[1 + cdb_offset])

I think that will allow to remove most "if (cdb[0] == ATA_12 || cdb[0] == 
ATA_16)"
statements introduced by this patch.

> +             tf->auxiliary = (cdb[28] << 24) | (cdb[29] << 16)
> +                     | (cdb[30] << 8) | cdb[31];

Please use get_unaligned_be32() instead of open-coding it.

> +     const u16 sa = (cdb[8] >> 8) | cdb[9];  /* service action */

Please use get_unaligned_be16() instead of open-coding it.

> @@ -4385,7 +4463,12 @@ int ata_scsi_add_hosts(struct ata_host *host, struct 
> scsi_host_template *sht)
>               shost->max_id = 16;
>               shost->max_lun = 1;
>               shost->max_channel = 1;
> -             shost->max_cmd_len = 16;
> +             /*
> +              * SPC-3, SPC-4: Definition of CDB
> +              * A CDB may have a fixed length of up to 16 bytes or
> +              * variable length of between 12 and 260 bytes.
> +              */
> +             shost->max_cmd_len = 260;

Does ATA pass-through really support 260-byte CDBs or is the maximum CDB length
that is supported by ATA_32 perhaps 32 bytes?

Thanks,

Bart.

Reply via email to