aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libata-core.c7
-rw-r--r--drivers/scsi/libata-scsi.c42
2 files changed, 25 insertions, 24 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index d568914c4344..55d4dee133af 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -3195,13 +3195,6 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
3195 qc->nbytes = qc->curbytes = 0; 3195 qc->nbytes = qc->curbytes = 0;
3196 3196
3197 ata_tf_init(ap, &qc->tf, dev->devno); 3197 ata_tf_init(ap, &qc->tf, dev->devno);
3198
3199 if (dev->flags & ATA_DFLAG_LBA) {
3200 qc->tf.flags |= ATA_TFLAG_LBA;
3201
3202 if (dev->flags & ATA_DFLAG_LBA48)
3203 qc->tf.flags |= ATA_TFLAG_LBA48;
3204 }
3205 } 3198 }
3206 3199
3207 return qc; 3200 return qc;
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index c64169ca7ff0..ea7a4d8a6fc9 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -492,7 +492,7 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
492 tf->flags |= ATA_TFLAG_DEVICE; 492 tf->flags |= ATA_TFLAG_DEVICE;
493 tf->protocol = ATA_PROT_NODATA; 493 tf->protocol = ATA_PROT_NODATA;
494 494
495 if ((tf->flags & ATA_TFLAG_LBA48) && 495 if ((qc->dev->flags & ATA_DFLAG_LBA48) &&
496 (ata_id_has_flush_ext(qc->dev->id))) 496 (ata_id_has_flush_ext(qc->dev->id)))
497 tf->command = ATA_CMD_FLUSH_EXT; 497 tf->command = ATA_CMD_FLUSH_EXT;
498 else 498 else
@@ -612,8 +612,6 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
612{ 612{
613 struct ata_taskfile *tf = &qc->tf; 613 struct ata_taskfile *tf = &qc->tf;
614 struct ata_device *dev = qc->dev; 614 struct ata_device *dev = qc->dev;
615 unsigned int lba = tf->flags & ATA_TFLAG_LBA;
616 unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
617 u64 dev_sectors = qc->dev->n_sectors; 615 u64 dev_sectors = qc->dev->n_sectors;
618 u64 block; 616 u64 block;
619 u32 n_block; 617 u32 n_block;
@@ -634,16 +632,16 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
634 goto out_of_range; 632 goto out_of_range;
635 if ((block + n_block) > dev_sectors) 633 if ((block + n_block) > dev_sectors)
636 goto out_of_range; 634 goto out_of_range;
637 if (lba48) {
638 if (n_block > (64 * 1024))
639 goto invalid_fld;
640 } else {
641 if (n_block > 256)
642 goto invalid_fld;
643 }
644 635
645 if (lba) { 636 if (dev->flags & ATA_DFLAG_LBA) {
646 if (lba48) { 637 tf->flags |= ATA_TFLAG_LBA;
638
639 if (dev->flags & ATA_DFLAG_LBA48) {
640 if (n_block > (64 * 1024))
641 goto invalid_fld;
642
643 /* use LBA48 */
644 tf->flags |= ATA_TFLAG_LBA48;
647 tf->command = ATA_CMD_VERIFY_EXT; 645 tf->command = ATA_CMD_VERIFY_EXT;
648 646
649 tf->hob_nsect = (n_block >> 8) & 0xff; 647 tf->hob_nsect = (n_block >> 8) & 0xff;
@@ -652,6 +650,10 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
652 tf->hob_lbam = (block >> 32) & 0xff; 650 tf->hob_lbam = (block >> 32) & 0xff;
653 tf->hob_lbal = (block >> 24) & 0xff; 651 tf->hob_lbal = (block >> 24) & 0xff;
654 } else { 652 } else {
653 if (n_block > 256)
654 goto invalid_fld;
655
656 /* use LBA28 */
655 tf->command = ATA_CMD_VERIFY; 657 tf->command = ATA_CMD_VERIFY;
656 658
657 tf->device |= (block >> 24) & 0xf; 659 tf->device |= (block >> 24) & 0xf;
@@ -668,6 +670,9 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
668 /* CHS */ 670 /* CHS */
669 u32 sect, head, cyl, track; 671 u32 sect, head, cyl, track;
670 672
673 if (n_block > 256)
674 goto invalid_fld;
675
671 /* Convert LBA to CHS */ 676 /* Convert LBA to CHS */
672 track = (u32)block / dev->sectors; 677 track = (u32)block / dev->sectors;
673 cyl = track / dev->heads; 678 cyl = track / dev->heads;
@@ -733,8 +738,6 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
733{ 738{
734 struct ata_taskfile *tf = &qc->tf; 739 struct ata_taskfile *tf = &qc->tf;
735 struct ata_device *dev = qc->dev; 740 struct ata_device *dev = qc->dev;
736 unsigned int lba = tf->flags & ATA_TFLAG_LBA;
737 unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
738 u64 block; 741 u64 block;
739 u32 n_block; 742 u32 n_block;
740 743
@@ -783,19 +786,24 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
783 */ 786 */
784 goto nothing_to_do; 787 goto nothing_to_do;
785 788
786 if (lba) { 789 if (dev->flags & ATA_DFLAG_LBA) {
787 if (lba48) { 790 tf->flags |= ATA_TFLAG_LBA;
791
792 if (dev->flags & ATA_DFLAG_LBA48) {
788 /* The request -may- be too large for LBA48. */ 793 /* The request -may- be too large for LBA48. */
789 if ((block >> 48) || (n_block > 65536)) 794 if ((block >> 48) || (n_block > 65536))
790 goto out_of_range; 795 goto out_of_range;
791 796
797 /* use LBA48 */
798 tf->flags |= ATA_TFLAG_LBA48;
799
792 tf->hob_nsect = (n_block >> 8) & 0xff; 800 tf->hob_nsect = (n_block >> 8) & 0xff;
793 801
794 tf->hob_lbah = (block >> 40) & 0xff; 802 tf->hob_lbah = (block >> 40) & 0xff;
795 tf->hob_lbam = (block >> 32) & 0xff; 803 tf->hob_lbam = (block >> 32) & 0xff;
796 tf->hob_lbal = (block >> 24) & 0xff; 804 tf->hob_lbal = (block >> 24) & 0xff;
797 } else { 805 } else {
798 /* LBA28 */ 806 /* use LBA28 */
799 807
800 /* The request -may- be too large for LBA28. */ 808 /* The request -may- be too large for LBA28. */
801 if ((block >> 28) || (n_block > 256)) 809 if ((block >> 28) || (n_block > 256))