Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbb9ab10 authored by David Ertman's avatar David Ertman Committed by Jeff Kirsher
Browse files

e1000e: Expand workaround for 10Mb HD throughput bug



In commit 772d05c5 "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: default avatarDave Ertman <davidx.m.ertman@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 77e61146
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -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);


+1 −0
Original line number Original line Diff line number Diff line
@@ -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 */