| From fe36cb53cfd82f3c0796a0826e1c9caf198c8f97 Mon Sep 17 00:00:00 2001 |
| From: Petr Vandrovec <petr@vandrovec.name> |
| Date: Fri, 20 Jul 2007 07:44:44 -0400 |
| Subject: [PATCH] [libata] Fix reported task file values in sense data |
| |
| From: Petr Vandrovec <petr@vandrovec.name> |
| |
| ata_tf_read was setting HOB bit when lba48 command was submitted, but |
| was not clearing it before reading "normal" data. As it is only place |
| which sets HOB bit in control register, and register reads should not |
| be affected by other bits, let's just clear it when we are done with |
| reading upper bytes so non-48bit commands do not have to touch ctl |
| at all. |
| |
| pata_scc suffered from same problem... |
| |
| Signed-off-by: Petr Vandrovec <petr@vandrovec.name> |
| Signed-off-by: Jeff Garzik <jeff@garzik.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ata/libata-sff.c | 2 ++ |
| drivers/ata/pata_scc.c | 2 ++ |
| 2 files changed, 4 insertions(+) |
| |
| --- a/drivers/ata/libata-sff.c |
| +++ b/drivers/ata/libata-sff.c |
| @@ -211,6 +211,8 @@ void ata_tf_read(struct ata_port *ap, st |
| tf->hob_lbal = ioread8(ioaddr->lbal_addr); |
| tf->hob_lbam = ioread8(ioaddr->lbam_addr); |
| tf->hob_lbah = ioread8(ioaddr->lbah_addr); |
| + iowrite8(tf->ctl, ioaddr->ctl_addr); |
| + ap->last_ctl = tf->ctl; |
| } |
| } |
| |
| --- a/drivers/ata/pata_scc.c |
| +++ b/drivers/ata/pata_scc.c |
| @@ -352,6 +352,8 @@ static void scc_tf_read (struct ata_port |
| tf->hob_lbal = in_be32(ioaddr->lbal_addr); |
| tf->hob_lbam = in_be32(ioaddr->lbam_addr); |
| tf->hob_lbah = in_be32(ioaddr->lbah_addr); |
| + out_be32(ioaddr->ctl_addr, tf->ctl); |
| + ap->last_ctl = tf->ctl; |
| } |
| } |
| |