diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2011-05-13 03:19:42 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-06-09 23:31:24 -0400 |
commit | d9b24135b972ccdd5f5174fba06c730e895e6daf (patch) | |
tree | ae5176a5b75cb8790d6411b5eb269edaaf31aec2 /drivers/net/e1000e | |
parent | e357964ee66723d0ced63ac1dbd1db4a6a1d417e (diff) |
e1000e: disable far-end loopback mode on ESB2
The ESB2 LAN includes a debug feature that enables far-end loopback (FELB)
of the SerDes/Kumeran interface. This feature is activated when receiving
a sequence of symbols that includes a reserved codeword. On a perfect
link, FELB would never be activated. In the presence of bit errors, there
is a very small, but non-zero, probability of FELB being activated.
If the FELB is activated, the SerDes link becomes non-functional and must
be reset. It could also corrupt the switching tables in the switch since
the ESB2 is transmitting packets with a different source MAC address.
This patch disables the FELB feature.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r-- | drivers/net/e1000e/es2lan.c | 8 | ||||
-rw-r--r-- | drivers/net/e1000e/hw.h | 1 |
2 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/e1000e/es2lan.c b/drivers/net/e1000e/es2lan.c index f4bbeb22f51f..c0ecb2d9fdb7 100644 --- a/drivers/net/e1000e/es2lan.c +++ b/drivers/net/e1000e/es2lan.c | |||
@@ -836,6 +836,7 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw) | |||
836 | struct e1000_mac_info *mac = &hw->mac; | 836 | struct e1000_mac_info *mac = &hw->mac; |
837 | u32 reg_data; | 837 | u32 reg_data; |
838 | s32 ret_val; | 838 | s32 ret_val; |
839 | u16 kum_reg_data; | ||
839 | u16 i; | 840 | u16 i; |
840 | 841 | ||
841 | e1000_initialize_hw_bits_80003es2lan(hw); | 842 | e1000_initialize_hw_bits_80003es2lan(hw); |
@@ -861,6 +862,13 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw) | |||
861 | /* Setup link and flow control */ | 862 | /* Setup link and flow control */ |
862 | ret_val = e1000e_setup_link(hw); | 863 | ret_val = e1000e_setup_link(hw); |
863 | 864 | ||
865 | /* Disable IBIST slave mode (far-end loopback) */ | ||
866 | e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, | ||
867 | &kum_reg_data); | ||
868 | kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE; | ||
869 | e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, | ||
870 | kum_reg_data); | ||
871 | |||
864 | /* Set the transmit descriptor write-back policy */ | 872 | /* Set the transmit descriptor write-back policy */ |
865 | reg_data = er32(TXDCTL(0)); | 873 | reg_data = er32(TXDCTL(0)); |
866 | reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | | 874 | reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | |
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index 6c2fa8327f5c..dde584f5ccc7 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
@@ -312,6 +312,7 @@ enum e1e_registers { | |||
312 | #define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ | 312 | #define E1000_KMRNCTRLSTA_DIAG_OFFSET 0x3 /* Kumeran Diagnostic */ |
313 | #define E1000_KMRNCTRLSTA_TIMEOUTS 0x4 /* Kumeran Timeouts */ | 313 | #define E1000_KMRNCTRLSTA_TIMEOUTS 0x4 /* Kumeran Timeouts */ |
314 | #define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */ | 314 | #define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */ |
315 | #define E1000_KMRNCTRLSTA_IBIST_DISABLE 0x0200 /* Kumeran IBIST Disable */ | ||
315 | #define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ | 316 | #define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ |
316 | #define E1000_KMRNCTRLSTA_K1_CONFIG 0x7 | 317 | #define E1000_KMRNCTRLSTA_K1_CONFIG 0x7 |
317 | #define E1000_KMRNCTRLSTA_K1_ENABLE 0x0002 | 318 | #define E1000_KMRNCTRLSTA_K1_ENABLE 0x0002 |