mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
e1000e: Expand workaround for 10Mb HD throughput bug
In commit 772d05c51c
"e1000e: slow performance
between two 82579 connected via 10Mbit hub", a workaround was put into place
to address the overaggressive transmit behavior of 82579 parts when connecting
at 10Mbs half-duplex.
This same behavior is seen on i217 and i218 parts as well. This patch expands
the original workaround to encompass these parts.
Signed-off-by: Dave Ertman <davidx.m.ertman@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
77e61146c6
commit
fbb9ab10a2
2 changed files with 12 additions and 4 deletions
|
@ -1314,14 +1314,17 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When connected at 10Mbps half-duplex, 82579 parts are excessively
|
/* When connected at 10Mbps half-duplex, some parts are excessively
|
||||||
* aggressive resulting in many collisions. To avoid this, increase
|
* aggressive resulting in many collisions. To avoid this, increase
|
||||||
* the IPG and reduce Rx latency in the PHY.
|
* the IPG and reduce Rx latency in the PHY.
|
||||||
*/
|
*/
|
||||||
if ((hw->mac.type == e1000_pch2lan) && link) {
|
if (((hw->mac.type == e1000_pch2lan) ||
|
||||||
|
(hw->mac.type == e1000_pch_lpt)) && link) {
|
||||||
u32 reg;
|
u32 reg;
|
||||||
reg = er32(STATUS);
|
reg = er32(STATUS);
|
||||||
if (!(reg & (E1000_STATUS_FD | E1000_STATUS_SPEED_MASK))) {
|
if (!(reg & (E1000_STATUS_FD | E1000_STATUS_SPEED_MASK))) {
|
||||||
|
u16 emi_addr;
|
||||||
|
|
||||||
reg = er32(TIPG);
|
reg = er32(TIPG);
|
||||||
reg &= ~E1000_TIPG_IPGT_MASK;
|
reg &= ~E1000_TIPG_IPGT_MASK;
|
||||||
reg |= 0xFF;
|
reg |= 0xFF;
|
||||||
|
@ -1332,8 +1335,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
|
||||||
if (ret_val)
|
if (ret_val)
|
||||||
return ret_val;
|
return ret_val;
|
||||||
|
|
||||||
ret_val =
|
if (hw->mac.type == e1000_pch2lan)
|
||||||
e1000_write_emi_reg_locked(hw, I82579_RX_CONFIG, 0);
|
emi_addr = I82579_RX_CONFIG;
|
||||||
|
else
|
||||||
|
emi_addr = I217_RX_CONFIG;
|
||||||
|
|
||||||
|
ret_val = e1000_write_emi_reg_locked(hw, emi_addr, 0);
|
||||||
|
|
||||||
hw->phy.ops.release(hw);
|
hw->phy.ops.release(hw);
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,7 @@
|
||||||
#define I217_EEE_CAPABILITY 0x8000 /* IEEE MMD Register 3.20 */
|
#define I217_EEE_CAPABILITY 0x8000 /* IEEE MMD Register 3.20 */
|
||||||
#define I217_EEE_ADVERTISEMENT 0x8001 /* IEEE MMD Register 7.60 */
|
#define I217_EEE_ADVERTISEMENT 0x8001 /* IEEE MMD Register 7.60 */
|
||||||
#define I217_EEE_LP_ABILITY 0x8002 /* IEEE MMD Register 7.61 */
|
#define I217_EEE_LP_ABILITY 0x8002 /* IEEE MMD Register 7.61 */
|
||||||
|
#define I217_RX_CONFIG 0xB20C /* Receive configuration */
|
||||||
|
|
||||||
#define E1000_EEE_RX_LPI_RCVD 0x0400 /* Tx LP idle received */
|
#define E1000_EEE_RX_LPI_RCVD 0x0400 /* Tx LP idle received */
|
||||||
#define E1000_EEE_TX_LPI_RCVD 0x0800 /* Rx LP idle received */
|
#define E1000_EEE_TX_LPI_RCVD 0x0800 /* Rx LP idle received */
|
||||||
|
|
Loading…
Add table
Reference in a new issue