[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: Albert Lee <albertcc@tw.ibm.com> ============= Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
parent
5a476deff3
commit
07506697d1
@ -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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
/* 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
*/
|
*/
|
||||||
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))
|
||||||
|
Loading…
Reference in New Issue
Block a user