diff options
Diffstat (limited to 'drivers/ide/scc_pata.c')
| -rw-r--r-- | drivers/ide/scc_pata.c | 50 | 
1 files changed, 28 insertions, 22 deletions
diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 55e48db7d1b..38a715e293d 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c @@ -649,34 +649,37 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)  {  	struct ide_io_ports *io_ports = &drive->hwif->io_ports;  	struct ide_taskfile *tf = &cmd->tf; +	u8 valid = cmd->valid.out.hob;  	u8 HIHI = (cmd->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF;  	if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)  		HIHI = 0xFF; -	if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) +	if (valid & IDE_VALID_FEATURE)  		scc_ide_outb(tf->hob_feature, io_ports->feature_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) +	if (valid & IDE_VALID_NSECT)  		scc_ide_outb(tf->hob_nsect, io_ports->nsect_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) +	if (valid & IDE_VALID_LBAL)  		scc_ide_outb(tf->hob_lbal, io_ports->lbal_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) +	if (valid & IDE_VALID_LBAM)  		scc_ide_outb(tf->hob_lbam, io_ports->lbam_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) +	if (valid & IDE_VALID_LBAH)  		scc_ide_outb(tf->hob_lbah, io_ports->lbah_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_FEATURE) +	valid = cmd->valid.out.tf; + +	if (valid & IDE_VALID_FEATURE)  		scc_ide_outb(tf->feature, io_ports->feature_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_NSECT) +	if (valid & IDE_VALID_NSECT)  		scc_ide_outb(tf->nsect, io_ports->nsect_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_LBAL) +	if (valid & IDE_VALID_LBAL)  		scc_ide_outb(tf->lbal, io_ports->lbal_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_LBAM) +	if (valid & IDE_VALID_LBAM)  		scc_ide_outb(tf->lbam, io_ports->lbam_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_LBAH) +	if (valid & IDE_VALID_LBAH)  		scc_ide_outb(tf->lbah, io_ports->lbah_addr); -	if (cmd->tf_flags & IDE_TFLAG_OUT_DEVICE) +	if (valid & IDE_VALID_DEVICE)  		scc_ide_outb((tf->device & HIHI) | drive->select,  			     io_ports->device_addr);  } @@ -685,35 +688,38 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)  {  	struct ide_io_ports *io_ports = &drive->hwif->io_ports;  	struct ide_taskfile *tf = &cmd->tf; +	u8 valid = cmd->valid.in.tf;  	/* be sure we're looking at the low order bits */  	scc_ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_ERROR) +	if (valid & IDE_VALID_ERROR)  		tf->error  = scc_ide_inb(io_ports->feature_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_NSECT) +	if (valid & IDE_VALID_NSECT)  		tf->nsect  = scc_ide_inb(io_ports->nsect_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_LBAL) +	if (valid & IDE_VALID_LBAL)  		tf->lbal   = scc_ide_inb(io_ports->lbal_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_LBAM) +	if (valid & IDE_VALID_LBAM)  		tf->lbam   = scc_ide_inb(io_ports->lbam_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_LBAH) +	if (valid & IDE_VALID_LBAH)  		tf->lbah   = scc_ide_inb(io_ports->lbah_addr); -	if (cmd->tf_flags & IDE_TFLAG_IN_DEVICE) +	if (valid & IDE_VALID_DEVICE)  		tf->device = scc_ide_inb(io_ports->device_addr);  	if (cmd->tf_flags & IDE_TFLAG_LBA48) {  		scc_ide_outb(ATA_HOB | ATA_DEVCTL_OBS, io_ports->ctl_addr); -		if (cmd->tf_flags & IDE_TFLAG_IN_HOB_ERROR) +		valid = cmd->valid.in.hob; + +		if (valid & IDE_VALID_ERROR)  			tf->hob_error = scc_ide_inb(io_ports->feature_addr); -		if (cmd->tf_flags & IDE_TFLAG_IN_HOB_NSECT) +		if (valid & IDE_VALID_NSECT)  			tf->hob_nsect = scc_ide_inb(io_ports->nsect_addr); -		if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAL) +		if (valid & IDE_VALID_LBAL)  			tf->hob_lbal  = scc_ide_inb(io_ports->lbal_addr); -		if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAM) +		if (valid & IDE_VALID_LBAM)  			tf->hob_lbam  = scc_ide_inb(io_ports->lbam_addr); -		if (cmd->tf_flags & IDE_TFLAG_IN_HOB_LBAH) +		if (valid & IDE_VALID_LBAH)  			tf->hob_lbah  = scc_ide_inb(io_ports->lbah_addr);  	}  }  |