aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Lord <liml@rtr.ca>2008-05-27 17:56:31 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-05-30 12:37:21 -0400
commit8c30a8b9b574cf6c51e207464b852a6f559da153 (patch)
tree7bb108b4a83746e9d9d0102df692152f43d7d257 /drivers
parent1f39847255a02c69190ae30c33b8ccf4c10840df (diff)
sata_mv: PHY_MODEx errata fixes
Fix and update the errata handling for the PHY_MODEx registers. This improves receiver noise tolerance, among other things. Signed-off-by: Mark Lord <mlord@pobox.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/sata_mv.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index f6a716ef5a16..a39779aed8f5 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -2546,7 +2546,7 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
2546 hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); 2546 hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0);
2547 int fix_phy_mode4 = 2547 int fix_phy_mode4 =
2548 hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); 2548 hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0);
2549 u32 m2, tmp; 2549 u32 m2, m3;
2550 2550
2551 if (fix_phy_mode2) { 2551 if (fix_phy_mode2) {
2552 m2 = readl(port_mmio + PHY_MODE2); 2552 m2 = readl(port_mmio + PHY_MODE2);
@@ -2563,27 +2563,27 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
2563 udelay(200); 2563 udelay(200);
2564 } 2564 }
2565 2565
2566 /* who knows what this magic does */ 2566 /*
2567 tmp = readl(port_mmio + PHY_MODE3); 2567 * Gen-II/IIe PHY_MODE3 errata RM#2:
2568 tmp &= ~0x7F800000; 2568 * Achieves better receiver noise performance than the h/w default:
2569 tmp |= 0x2A800000; 2569 */
2570 writel(tmp, port_mmio + PHY_MODE3); 2570 m3 = readl(port_mmio + PHY_MODE3);
2571 m3 = (m3 & 0x1f) | (0x5555601 << 5);
2572 writel(m3, port_mmio + PHY_MODE3);
2571 2573
2572 if (fix_phy_mode4) { 2574 if (fix_phy_mode4) {
2573 u32 m4; 2575 u32 m4;
2574 2576
2575 m4 = readl(port_mmio + PHY_MODE4); 2577 m4 = readl(port_mmio + PHY_MODE4);
2576 2578
2577 if (hp_flags & MV_HP_ERRATA_60X1B2)
2578 tmp = readl(port_mmio + PHY_MODE3);
2579
2580 /* workaround for errata FEr SATA#10 (part 1) */ 2579 /* workaround for errata FEr SATA#10 (part 1) */
2581 m4 = (m4 & ~(1 << 1)) | (1 << 0); 2580 m4 = (m4 & ~(1 << 1)) | (1 << 0);
2582 2581
2583 writel(m4, port_mmio + PHY_MODE4); 2582 /* enforce bit restrictions on GenIIe devices */
2583 if (IS_GEN_IIE(hpriv))
2584 m4 = (m4 & ~0x5DE3FFFC) | (1 << 2);
2584 2585
2585 if (hp_flags & MV_HP_ERRATA_60X1B2) 2586 writel(m4, port_mmio + PHY_MODE4);
2586 writel(tmp, port_mmio + PHY_MODE3);
2587 } 2587 }
2588 2588
2589 /* Revert values of pre-emphasis and signal amps to the saved ones */ 2589 /* Revert values of pre-emphasis and signal amps to the saved ones */