summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorgnn <gnn@FreeBSD.org>2008-12-04 20:32:53 +0000
committergnn <gnn@FreeBSD.org>2008-12-04 20:32:53 +0000
commit886616b21131ba2533dd307fdd8459de46be616b (patch)
tree7d84349fd34d97e30c71a14e54c8698e104e5175 /sys
parent40f437cf7fe146b784e57ffdac3177c408dac285 (diff)
downloadFreeBSD-src-886616b21131ba2533dd307fdd8459de46be616b.zip
FreeBSD-src-886616b21131ba2533dd307fdd8459de46be616b.tar.gz
Fix a bug with the ael1006 PHY. The bug shows up as persistent but incomplete
packet loss, of between 10-30%. The fix is to put the PHY into and take it out of local loopback mode when resetting the interface. Obtained from: Chelsio Inc. MFC after: 3 days
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/cxgb/common/cxgb_ael1002.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/dev/cxgb/common/cxgb_ael1002.c b/sys/dev/cxgb/common/cxgb_ael1002.c
index 99bfb76..55c6421 100644
--- a/sys/dev/cxgb/common/cxgb_ael1002.c
+++ b/sys/dev/cxgb/common/cxgb_ael1002.c
@@ -205,6 +205,16 @@ static int ael1006_reset(struct cphy *phy, int wait)
t3_write_reg(phy->adapter, A_T3DBG_GPIO_EN, gpio_out);
msleep(125);
t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait);
+
+ /* Phy loopback work around for ael1006 */
+ /* Soft reset phy by toggling loopback */
+ msleep(125);
+ /* Put phy into local loopback */
+ t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 0, 1);
+ msleep(125);
+ /* Take phy out of local loopback */
+ t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, 1, 0);
+
return 0;
}
OpenPOWER on IntegriCloud