summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTushar Dave <tushar.n.dave@intel.com>2012-07-12 08:56:56 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-07-19 08:58:21 -0700
commitc90dab38fe75c7a131a3db8d35aedaf155aede04 (patch)
tree7756a18b39ac2a3e30736c8d2ae47f43d8095b60 /drivers
parent16f1a5d495c4c8bd246c96052ab5a0fc4fd03646 (diff)
e1000e: Correct link check logic for 82571 serdes
commit d0efa8f23a644f7cb7d1f8e78dd9a223efa412a3 upstream. SYNCH bit and IV bit of RXCW register are sticky. Before examining these bits, RXCW should be read twice to filter out one-time false events and have correct values for these bits. Incorrect values of these bits in link check logic can cause weird link stability issues if auto-negotiation fails. Reported-by: Dean Nelson <dnelson@redhat.com> Signed-off-by: Tushar Dave <tushar.n.dave@intel.com> Reviewed-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/e1000e/82571.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c
index 8295f2192439..5278e8456b68 100644
--- a/drivers/net/e1000e/82571.c
+++ b/drivers/net/e1000e/82571.c
@@ -1573,6 +1573,9 @@ static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw)
ctrl = er32(CTRL);
status = er32(STATUS);
rxcw = er32(RXCW);
+ /* SYNCH bit and IV bit are sticky */
+ udelay(10);
+ rxcw = er32(RXCW);
if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) {