ata: libata-core: Simplify ata_build_rw_tf()
authorDamien Le Moal <damien.lemoal@opensource.wdc.com>
Mon, 25 Jul 2022 01:01:27 +0000 (10:01 +0900)
committerDamien Le Moal <damien.lemoal@opensource.wdc.com>
Thu, 25 Aug 2022 22:46:08 +0000 (07:46 +0900)
Since ata_build_rw_tf() is only called from ata_scsi_rw_xlat() with the
tf, dev and tag arguments obtained from the queued command structure,
we can simplify the interface of ata_build_rw_tf() by passing directly
the qc structure as argument.

Furthermore, since ata_scsi_rw_xlat() is never used for internal
commands, we can also remove the internal tag check for the NCQ case.

Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
drivers/ata/libata-core.c
drivers/ata/libata-scsi.c
drivers/ata/libata.h

index a5c51da..0b62fa1 100644 (file)
@@ -665,33 +665,33 @@ u64 ata_tf_read_block(const struct ata_taskfile *tf, struct ata_device *dev)
 
 /**
  *     ata_build_rw_tf - Build ATA taskfile for given read/write request
- *     @tf: Target ATA taskfile
- *     @dev: ATA device @tf belongs to
+ *     @qc: Metadata associated with the taskfile to build
  *     @block: Block address
  *     @n_block: Number of blocks
  *     @tf_flags: RW/FUA etc...
- *     @tag: tag
  *     @class: IO priority class
  *
  *     LOCKING:
  *     None.
  *
- *     Build ATA taskfile @tf for read/write request described by
- *     @block, @n_block, @tf_flags and @tag on @dev.
+ *     Build ATA taskfile for the command @qc for read/write request described
+ *     by @block, @n_block, @tf_flags and @class.
  *
  *     RETURNS:
  *
  *     0 on success, -ERANGE if the request is too large for @dev,
  *     -EINVAL if the request is invalid.
  */
-int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
-                   u64 block, u32 n_block, unsigned int tf_flags,
-                   unsigned int tag, int class)
+int ata_build_rw_tf(struct ata_queued_cmd *qc, u64 block, u32 n_block,
+                   unsigned int tf_flags, int class)
 {
+       struct ata_taskfile *tf = &qc->tf;
+       struct ata_device *dev = qc->dev;
+
        tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
        tf->flags |= tf_flags;
 
-       if (ata_ncq_enabled(dev) && !ata_tag_internal(tag)) {
+       if (ata_ncq_enabled(dev)) {
                /* yay, NCQ */
                if (!lba_48_ok(block, n_block))
                        return -ERANGE;
@@ -704,7 +704,7 @@ int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
                else
                        tf->command = ATA_CMD_FPDMA_READ;
 
-               tf->nsect = tag << 3;
+               tf->nsect = qc->hw_tag << 3;
                tf->hob_feature = (n_block >> 8) & 0xff;
                tf->feature = n_block & 0xff;
 
index 29e2f55..f3c64e7 100644 (file)
@@ -1605,9 +1605,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
        qc->flags |= ATA_QCFLAG_IO;
        qc->nbytes = n_block * scmd->device->sector_size;
 
-       rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
-                            qc->hw_tag, class);
-
+       rc = ata_build_rw_tf(qc, block, n_block, tf_flags, class);
        if (likely(rc == 0))
                return 0;
 
index bc84fbb..2c5c827 100644 (file)
@@ -44,9 +44,8 @@ static inline void ata_force_cbl(struct ata_port *ap) { }
 #endif
 extern u64 ata_tf_to_lba(const struct ata_taskfile *tf);
 extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf);
-extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
-                          u64 block, u32 n_block, unsigned int tf_flags,
-                          unsigned int tag, int class);
+extern int ata_build_rw_tf(struct ata_queued_cmd *qc, u64 block, u32 n_block,
+                          unsigned int tf_flags, int class);
 extern u64 ata_tf_read_block(const struct ata_taskfile *tf,
                             struct ata_device *dev);
 extern unsigned ata_exec_internal(struct ata_device *dev,