Commit 07506697 authored by Albert Lee's avatar Albert Lee Committed by Jeff Garzik

[PATCH] libata CHS: move the initialization of taskfile LBA flags (revise #6)

   move the initialization of taskfile LBA flags
     "ATA_TFLAG_LBA" and "ATA_TFLAG_LBA48 flags"
   to the SCSI translation functions
Signed-off-by: default avatarAlbert Lee <albertcc@tw.ibm.com>

=============
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 5a476def
...@@ -3195,13 +3195,6 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, ...@@ -3195,13 +3195,6 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
qc->nbytes = qc->curbytes = 0; qc->nbytes = qc->curbytes = 0;
ata_tf_init(ap, &qc->tf, dev->devno); ata_tf_init(ap, &qc->tf, dev->devno);
if (dev->flags & ATA_DFLAG_LBA) {
qc->tf.flags |= ATA_TFLAG_LBA;
if (dev->flags & ATA_DFLAG_LBA48)
qc->tf.flags |= ATA_TFLAG_LBA48;
}
} }
return qc; return qc;
......
...@@ -492,7 +492,7 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -492,7 +492,7 @@ static unsigned int ata_scsi_flush_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
tf->flags |= ATA_TFLAG_DEVICE; tf->flags |= ATA_TFLAG_DEVICE;
tf->protocol = ATA_PROT_NODATA; tf->protocol = ATA_PROT_NODATA;
if ((tf->flags & ATA_TFLAG_LBA48) && if ((qc->dev->flags & ATA_DFLAG_LBA48) &&
(ata_id_has_flush_ext(qc->dev->id))) (ata_id_has_flush_ext(qc->dev->id)))
tf->command = ATA_CMD_FLUSH_EXT; tf->command = ATA_CMD_FLUSH_EXT;
else else
...@@ -612,8 +612,6 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -612,8 +612,6 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
{ {
struct ata_taskfile *tf = &qc->tf; struct ata_taskfile *tf = &qc->tf;
struct ata_device *dev = qc->dev; struct ata_device *dev = qc->dev;
unsigned int lba = tf->flags & ATA_TFLAG_LBA;
unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
u64 dev_sectors = qc->dev->n_sectors; u64 dev_sectors = qc->dev->n_sectors;
u64 block; u64 block;
u32 n_block; u32 n_block;
...@@ -634,16 +632,16 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -634,16 +632,16 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
goto out_of_range; goto out_of_range;
if ((block + n_block) > dev_sectors) if ((block + n_block) > dev_sectors)
goto out_of_range; goto out_of_range;
if (lba48) {
if (n_block > (64 * 1024))
goto invalid_fld;
} else {
if (n_block > 256)
goto invalid_fld;
}
if (lba) { if (dev->flags & ATA_DFLAG_LBA) {
if (lba48) { tf->flags |= ATA_TFLAG_LBA;
if (dev->flags & ATA_DFLAG_LBA48) {
if (n_block > (64 * 1024))
goto invalid_fld;
/* use LBA48 */
tf->flags |= ATA_TFLAG_LBA48;
tf->command = ATA_CMD_VERIFY_EXT; tf->command = ATA_CMD_VERIFY_EXT;
tf->hob_nsect = (n_block >> 8) & 0xff; 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,6 +650,10 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
tf->hob_lbam = (block >> 32) & 0xff; tf->hob_lbam = (block >> 32) & 0xff;
tf->hob_lbal = (block >> 24) & 0xff; tf->hob_lbal = (block >> 24) & 0xff;
} else { } else {
if (n_block > 256)
goto invalid_fld;
/* use LBA28 */
tf->command = ATA_CMD_VERIFY; tf->command = ATA_CMD_VERIFY;
tf->device |= (block >> 24) & 0xf; tf->device |= (block >> 24) & 0xf;
...@@ -668,6 +670,9 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -668,6 +670,9 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
/* CHS */ /* CHS */
u32 sect, head, cyl, track; u32 sect, head, cyl, track;
if (n_block > 256)
goto invalid_fld;
/* Convert LBA to CHS */ /* Convert LBA to CHS */
track = (u32)block / dev->sectors; track = (u32)block / dev->sectors;
cyl = track / dev->heads; cyl = track / dev->heads;
...@@ -733,8 +738,6 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -733,8 +738,6 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
{ {
struct ata_taskfile *tf = &qc->tf; struct ata_taskfile *tf = &qc->tf;
struct ata_device *dev = qc->dev; struct ata_device *dev = qc->dev;
unsigned int lba = tf->flags & ATA_TFLAG_LBA;
unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
u64 block; u64 block;
u32 n_block; u32 n_block;
...@@ -783,19 +786,24 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd) ...@@ -783,19 +786,24 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
*/ */
goto nothing_to_do; goto nothing_to_do;
if (lba) { if (dev->flags & ATA_DFLAG_LBA) {
if (lba48) { tf->flags |= ATA_TFLAG_LBA;
if (dev->flags & ATA_DFLAG_LBA48) {
/* The request -may- be too large for LBA48. */ /* The request -may- be too large for LBA48. */
if ((block >> 48) || (n_block > 65536)) if ((block >> 48) || (n_block > 65536))
goto out_of_range; goto out_of_range;
/* use LBA48 */
tf->flags |= ATA_TFLAG_LBA48;
tf->hob_nsect = (n_block >> 8) & 0xff; tf->hob_nsect = (n_block >> 8) & 0xff;
tf->hob_lbah = (block >> 40) & 0xff; tf->hob_lbah = (block >> 40) & 0xff;
tf->hob_lbam = (block >> 32) & 0xff; tf->hob_lbam = (block >> 32) & 0xff;
tf->hob_lbal = (block >> 24) & 0xff; tf->hob_lbal = (block >> 24) & 0xff;
} else { } else {
/* LBA28 */ /* use LBA28 */
/* The request -may- be too large for LBA28. */ /* The request -may- be too large for LBA28. */
if ((block >> 28) || (n_block > 256)) if ((block >> 28) || (n_block > 256))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment