diff options
author | Mark Lord <liml@rtr.ca> | 2008-02-21 15:52:25 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2008-02-24 00:28:23 -0500 |
commit | 39f25e70ca37b8a719e8274e6f3ec2ce2ea8df04 (patch) | |
tree | 5462aab37b324f239015ad025f443669014128ca /drivers | |
parent | 9116300634c5c76cfcd0d2af689846e04d172256 (diff) |
libata-pmp: clear hob for pmp register accesses
>> Mark Lord wrote:
>>> Tejun, I've added PMP to sata_mv, and am now trying to get it
>>> to work with a Marvell PM attached.
>>>
>>> And the behaviour I see is very bizarre.
>>>
>>> After hard+soft resets, the PM signature is found,
>>> and libata interrogates the PM registers.
>>>
>>> It successfully reads register 0, and then register 1.
>>> But all subsequent registers read out (incorrectly) as zeros.
...
This behavior has been confirmed by Marvell with a SATA analyzer.
The Marvell port-multiplier apparently likes to see clean HOB
information when accessing PMP registers.
Since sata_mv uses PIO shadow register access, this doesn't happen
automatically, as it might in a more purely FIS-based driver (eg. ahci).
One way to fix this is to flag these commands with ATA_TFLAG_LBA48,
forcing libata to write out the HOB fields with known (zero) values.
Signed-off-by: Saeed Bishara <saeed@marvell.com>
Acked-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/libata-pmp.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index caef2bbd4a8a..d91f5090ba9d 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -35,7 +35,7 @@ static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val) | |||
35 | ata_tf_init(pmp_dev, &tf); | 35 | ata_tf_init(pmp_dev, &tf); |
36 | tf.command = ATA_CMD_PMP_READ; | 36 | tf.command = ATA_CMD_PMP_READ; |
37 | tf.protocol = ATA_PROT_NODATA; | 37 | tf.protocol = ATA_PROT_NODATA; |
38 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 38 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48; |
39 | tf.feature = reg; | 39 | tf.feature = reg; |
40 | tf.device = link->pmp; | 40 | tf.device = link->pmp; |
41 | 41 | ||
@@ -71,7 +71,7 @@ static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val) | |||
71 | ata_tf_init(pmp_dev, &tf); | 71 | ata_tf_init(pmp_dev, &tf); |
72 | tf.command = ATA_CMD_PMP_WRITE; | 72 | tf.command = ATA_CMD_PMP_WRITE; |
73 | tf.protocol = ATA_PROT_NODATA; | 73 | tf.protocol = ATA_PROT_NODATA; |
74 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 74 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48; |
75 | tf.feature = reg; | 75 | tf.feature = reg; |
76 | tf.device = link->pmp; | 76 | tf.device = link->pmp; |
77 | tf.nsect = val & 0xff; | 77 | tf.nsect = val & 0xff; |