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

Commit c5e70991 authored by David S. Miller's avatar David S. Miller
Browse files


Jeff Kirsher says:

====================
1GbE Intel Wired LAN Driver Updates 2017-01-06

This series contains updates/fixes to igb and e1000e.

Joe fixes indentation and improper line wrapping in igb.

David Singleton fixes an issue in e1000e where in systemd, where things
are done in parallel and can create a condition where e1000_shutdown is
called after e1000_close, hitting BUG_ON assert in free_msi_irqs.

Cao Jin fixes a code comment on the wakeup status register.  Also fixes
a possible NULL pointer dereference by using igb_adapter->io_addr
instead of e1000_hw->hw_addr in igb_configure_tx_ring().

Chris Arges works around a firmware issue, which can cause probe of i210
NIC to fail, so zero the page select register during igb_get_phy_id() to
workaround the issue.  Aaron Sierra adds also a check for this issue
during the initialization of PHY parameters to ensure that this same
issue happens after probe.

Todd fixes a possible race condition in close/suspend by extending
the rtnl_lock() to protect the call to netif_device_detach() and
igb_clear_interrupt_scheme().  Also adds i211 to a known i210/i211
workaround.

Hannu Lounento fixes inverted logic on a debug statement.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c7b371e3 76ed5a8f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -6276,8 +6276,8 @@ static int e1000e_pm_freeze(struct device *dev)
		/* Quiesce the device without resetting the hardware */
		e1000e_down(adapter, false);
		e1000_free_irq(adapter);
	}
		e1000e_reset_interrupt_capability(adapter);
	}

	/* Allow time for pending master requests to run */
	e1000e_disable_pcie_master(&adapter->hw);
+11 −0
Original line number Diff line number Diff line
@@ -245,6 +245,17 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
	hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >>
			E1000_STATUS_FUNC_SHIFT;

	/* Make sure the PHY is in a good state. Several people have reported
	 * firmware leaving the PHY's page select register set to something
	 * other than the default of zero, which causes the PHY ID read to
	 * access something other than the intended register.
	 */
	ret_val = hw->phy.ops.reset(hw);
	if (ret_val) {
		hw_dbg("Error resetting the PHY.\n");
		goto out;
	}

	/* Set phy->phy_addr and phy->id. */
	ret_val = igb_get_phy_id_82575(hw);
	if (ret_val)
+2 −2
Original line number Diff line number Diff line
@@ -699,9 +699,9 @@ static s32 igb_update_flash_i210(struct e1000_hw *hw)

	ret_val = igb_pool_flash_update_done_i210(hw);
	if (ret_val)
		hw_dbg("Flash update complete\n");
	else
		hw_dbg("Flash update time out\n");
	else
		hw_dbg("Flash update complete\n");

out:
	return ret_val;
+6 −9
Original line number Diff line number Diff line
@@ -792,15 +792,13 @@ static s32 igb_set_default_fc(struct e1000_hw *hw)
	 * control setting, then the variable hw->fc will
	 * be initialized based on a value in the EEPROM.
	 */
	if (hw->mac.type == e1000_i350) {
	if (hw->mac.type == e1000_i350)
		lan_offset = NVM_82580_LAN_FUNC_OFFSET(hw->bus.func);
		ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG
					   + lan_offset, 1, &nvm_data);
	 } else {
		ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG,
					   1, &nvm_data);
	 }
	else
		lan_offset = 0;

	ret_val = hw->nvm.ops.read(hw, NVM_INIT_CONTROL2_REG + lan_offset,
				   1, &nvm_data);
	if (ret_val) {
		hw_dbg("NVM Read Error\n");
		goto out;
@@ -808,8 +806,7 @@ static s32 igb_set_default_fc(struct e1000_hw *hw)

	if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0)
		hw->fc.requested_mode = e1000_fc_none;
	else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) ==
		 NVM_WORD0F_ASM_DIR)
	else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == NVM_WORD0F_ASM_DIR)
		hw->fc.requested_mode = e1000_fc_tx_pause;
	else
		hw->fc.requested_mode = e1000_fc_full;
+4 −0
Original line number Diff line number Diff line
@@ -77,6 +77,10 @@ s32 igb_get_phy_id(struct e1000_hw *hw)
	s32 ret_val = 0;
	u16 phy_id;

	/* ensure PHY page selection to fix misconfigured i210 */
	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))
		phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0);

	ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id);
	if (ret_val)
		goto out;
Loading