{
        struct completion *waiting = qc->private_data;
 
-       qc->ap->ops->tf_read(qc->ap, &qc->tf);
        complete(waiting);
 }
 
        qc->tf = *tf;
        if (cdb)
                memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
+       qc->flags |= ATA_QCFLAG_RESULT_TF;
        qc->dma_dir = dma_dir;
        if (dma_dir != DMA_NONE) {
                ata_sg_init_one(qc, buf, buflen);
        /* finish up */
        spin_lock_irqsave(&ap->host_set->lock, flags);
 
-       *tf = qc->tf;
+       *tf = qc->result_tf;
        err_mask = qc->err_mask;
 
        ata_qc_free(qc);
 
 void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc)
 {
        struct scsi_cmnd *cmd = qc->scsicmd;
-       struct ata_taskfile *tf = &qc->tf;
+       struct ata_taskfile *tf = &qc->result_tf;
        unsigned char *sb = cmd->sense_buffer;
        unsigned char *desc = sb + 8;
 
 void ata_gen_fixed_sense(struct ata_queued_cmd *qc)
 {
        struct scsi_cmnd *cmd = qc->scsicmd;
-       struct ata_taskfile *tf = &qc->tf;
+       struct ata_taskfile *tf = &qc->result_tf;
        unsigned char *sb = cmd->sense_buffer;
 
        memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
         */
        if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
            ((cdb[2] & 0x20) || need_sense)) {
-               qc->ap->ops->tf_read(qc->ap, &qc->tf);
                ata_gen_ata_desc_sense(qc);
        } else {
                if (!need_sense) {
                        cmd->result = SAM_STAT_GOOD;
                } else {
-                       qc->ap->ops->tf_read(qc->ap, &qc->tf);
-
                        /* TODO: decide which descriptor format to use
                         * for 48b LBA devices and call that here
                         * instead of the fixed desc, which is only
                }
        }
 
-       if (need_sense) {
-               /* The ata_gen_..._sense routines fill in tf */
-               ata_dump_status(qc->ap->id, &qc->tf);
-       }
+       if (need_sense)
+               ata_dump_status(qc->ap->id, &qc->result_tf);
 
        qc->scsidone(cmd);
 
                 * a sense descriptors, since that's only
                 * correct for ATA, not ATAPI
                 */
-               qc->ap->ops->tf_read(qc->ap, &qc->tf);
                ata_gen_ata_desc_sense(qc);
        }
 
                 * a sense descriptors, since that's only
                 * correct for ATA, not ATAPI
                 */
-               qc->ap->ops->tf_read(qc->ap, &qc->tf);
                ata_gen_ata_desc_sense(qc);
        } else {
                u8 *scsicmd = cmd->cmnd;
         */
        qc->nsect = cmd->bufflen / ATA_SECT_SIZE;
 
+       /* request result TF */
+       qc->flags |= ATA_QCFLAG_RESULT_TF;
+
        return 0;
 
  invalid_fld:
 
        ATA_QCFLAG_SINGLE       = (1 << 2), /* no s/g, just a single buffer */
        ATA_QCFLAG_DMAMAP       = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE,
        ATA_QCFLAG_IO           = (1 << 3), /* standard IO command */
-       ATA_QCFLAG_EH_SCHEDULED = (1 << 4), /* EH scheduled */
+       ATA_QCFLAG_RESULT_TF    = (1 << 4), /* result TF requested */
+
+       ATA_QCFLAG_EH_SCHEDULED = (1 << 16), /* EH scheduled */
 
        /* host set flags */
        ATA_HOST_SIMPLEX        = (1 << 0),     /* Host is simplex, one DMA channel per host_set only */
        struct scatterlist      *__sg;
 
        unsigned int            err_mask;
-
+       struct ata_taskfile     result_tf;
        ata_qc_cb_t             complete_fn;
 
        void                    *private_data;
        qc->err_mask = 0;
 
        ata_tf_init(qc->ap, &qc->tf, qc->dev->devno);
+
+       /* init result_tf such that it indicates normal completion */
+       qc->result_tf.command = ATA_DRDY;
+       qc->result_tf.feature = 0;
 }
 
 /**
  */
 static inline void ata_qc_complete(struct ata_queued_cmd *qc)
 {
+       struct ata_port *ap = qc->ap;
+
        if (unlikely(qc->flags & ATA_QCFLAG_EH_SCHEDULED))
                return;
 
+       /* read result TF if failed or requested */
+       if (qc->err_mask || qc->flags & ATA_QCFLAG_RESULT_TF)
+               ap->ops->tf_read(ap, &qc->result_tf);
+
        __ata_qc_complete(qc);
 }