buflen += sg[i].length;
 
                ata_sg_init(qc, sg, n_elem);
-               qc->nsect = buflen / ATA_SECT_SIZE;
                qc->nbytes = buflen;
        }
 
        unsigned int offset;
        unsigned char *buf;
 
-       if (qc->cursect == (qc->nsect - 1))
+       if (qc->curbytes == qc->nbytes - ATA_SECT_SIZE)
                ap->hsm_task_state = HSM_ST_LAST;
 
        page = sg[qc->cursg].page;
-       offset = sg[qc->cursg].offset + qc->cursg_ofs * ATA_SECT_SIZE;
+       offset = sg[qc->cursg].offset + qc->cursg_ofs;
 
        /* get the current page and offset */
        page = nth_page(page, (offset >> PAGE_SHIFT));
                ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write);
        }
 
-       qc->cursect++;
-       qc->cursg_ofs++;
+       qc->curbytes += ATA_SECT_SIZE;
+       qc->cursg_ofs += ATA_SECT_SIZE;
 
-       if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
+       if (qc->cursg_ofs == (&sg[qc->cursg])->length) {
                qc->cursg++;
                qc->cursg_ofs = 0;
        }
 
                WARN_ON(qc->dev->multi_count == 0);
 
-               nsect = min(qc->nsect - qc->cursect, qc->dev->multi_count);
+               nsect = min((qc->nbytes - qc->curbytes) / ATA_SECT_SIZE,
+                           qc->dev->multi_count);
                while (nsect--)
                        ata_pio_sector(qc);
        } else
 
                };
                struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
                struct ata_taskfile *cmd = &qc->tf, *res = &qc->result_tf;
-               unsigned int nbytes;
 
                if (!(qc->flags & ATA_QCFLAG_FAILED) || !qc->err_mask)
                        continue;
 
-               nbytes = qc->nbytes;
-               if (!nbytes)
-                       nbytes = qc->nsect << 9;
-
                ata_dev_printk(qc->dev, KERN_ERR,
                        "cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
                        "tag %d cdb 0x%x data %u %s\n         "
                        cmd->lbal, cmd->lbam, cmd->lbah,
                        cmd->hob_feature, cmd->hob_nsect,
                        cmd->hob_lbal, cmd->hob_lbam, cmd->hob_lbah,
-                       cmd->device, qc->tag, qc->cdb[0], nbytes,
+                       cmd->device, qc->tag, qc->cdb[0], qc->nbytes,
                        dma_str[qc->dma_dir],
                        res->command, res->feature, res->nsect,
                        res->lbal, res->lbam, res->lbah,
 
                goto nothing_to_do;
 
        qc->flags |= ATA_QCFLAG_IO;
-       qc->nsect = n_block;
+       qc->nbytes = n_block * ATA_SECT_SIZE;
 
        rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
                             qc->tag);
         * TODO: find out if we need to do more here to
         *       cover scatter/gather case.
         */
-       qc->nsect = scmd->request_bufflen / ATA_SECT_SIZE;
+       qc->nbytes = scmd->request_bufflen;
 
        /* request result TF */
        qc->flags |= ATA_QCFLAG_RESULT_TF;
 
        /* Cases the state machine will not complete correctly without help */
        if ((tf->flags & ATA_TFLAG_LBA48) ||  tf->protocol == ATA_PROT_ATAPI_DMA)
        {
-               if (tf->flags & ATA_TFLAG_LBA48)
-                       len = qc->nsect * 512;
-               else
-                       len = qc->nbytes;
+               len = qc->nbytes;
 
                if (tf->flags & ATA_TFLAG_WRITE)
                        len |= 0x06000000;
 
        /* host control block (HCB) */
        buf[ 0] = QS_HCB_HDR;
        buf[ 1] = hflags;
-       *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE);
+       *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nbytes);
        *(__le32 *)(&buf[ 8]) = cpu_to_le32(nelem);
        addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES;
        *(__le64 *)(&buf[16]) = cpu_to_le64(addr);
 
 
        unsigned int            pad_len;
 
-       unsigned int            nsect;
-       unsigned int            cursect;
-
        unsigned int            nbytes;
        unsigned int            curbytes;
 
        qc->dma_dir = DMA_NONE;
        qc->__sg = NULL;
        qc->flags = 0;
-       qc->cursect = qc->cursg = qc->cursg_ofs = 0;
-       qc->nsect = 0;
+       qc->cursg = qc->cursg_ofs = 0;
        qc->nbytes = qc->curbytes = 0;
        qc->n_elem = 0;
        qc->err_mask = 0;