e1000e: 82571 check for link fix on 82571 serdes

Check for link test does not work properly for 82571 parts in a blade
environment with an unterminated serdes link partner.  Make the test more
robust by checking the invalid bit.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Bruce Allan 2008-11-21 16:50:34 -08:00 committed by David S. Miller
parent 5aa49c8211
commit 63dcf3d353
1 changed files with 28 additions and 6 deletions

View File

@ -575,20 +575,42 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)
*/
/* SYNCH bit and IV bit are sticky. */
udelay(10);
if (E1000_RXCW_SYNCH & er32(RXCW)) {
rxcw = er32(RXCW);
if (rxcw & E1000_RXCW_SYNCH) {
if (!(rxcw & E1000_RXCW_IV)) {
mac->serdes_has_link = 1;
hw_dbg(hw, "SERDES: Link is up.\n");
mac->serdes_has_link = true;
hw_dbg(hw, "SERDES: Link up - forced.\n");
}
} else {
mac->serdes_has_link = 0;
hw_dbg(hw, "SERDES: Link is down.\n");
mac->serdes_has_link = false;
hw_dbg(hw, "SERDES: Link down - force failed.\n");
}
}
if (E1000_TXCW_ANE & er32(TXCW)) {
status = er32(STATUS);
mac->serdes_has_link = (status & E1000_STATUS_LU);
if (status & E1000_STATUS_LU) {
/* SYNCH bit and IV bit are sticky, so reread rxcw. */
udelay(10);
rxcw = er32(RXCW);
if (rxcw & E1000_RXCW_SYNCH) {
if (!(rxcw & E1000_RXCW_IV)) {
mac->serdes_has_link = true;
hw_dbg(hw, "SERDES: Link up - autoneg "
"completed sucessfully.\n");
} else {
mac->serdes_has_link = false;
hw_dbg(hw, "SERDES: Link down - invalid"
"codewords detected in autoneg.\n");
}
} else {
mac->serdes_has_link = false;
hw_dbg(hw, "SERDES: Link down - no sync.\n");
}
} else {
mac->serdes_has_link = false;
hw_dbg(hw, "SERDES: Link down - autoneg failed\n");
}
}
return 0;