瀏覽代碼

e1000: workaround for the ESB2 NIC RX unit issue

In rare occasions, ESB2 systems would end up started without the RX
unit being turned on. Add a check that runs post-init to work around
this issue.

Originally from Jesse Brandeburg <jesse.brandeburg@intel.com>,
rewritten to use feature flags by me.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Jeff Garzik 18 年之前
父節點
當前提交
bb8e3311ef
共有 3 個文件被更改,包括 14 次插入0 次删除
  1. 6 0
      drivers/net/e1000/e1000_hw.c
  2. 1 0
      drivers/net/e1000/e1000_hw.h
  3. 7 0
      drivers/net/e1000/e1000_main.c

+ 6 - 0
drivers/net/e1000/e1000_hw.c

@@ -452,6 +452,12 @@ e1000_set_mac_type(struct e1000_hw *hw)
 	if (hw->mac_type >= e1000_82571)
 		hw->has_manc2h = TRUE;
 
+	/* In rare occasions, ESB2 systems would end up started without
+	 * the RX unit being turned on.
+	 */
+	if (hw->mac_type == e1000_80003es2lan)
+		hw->rx_needs_kicking = TRUE;
+
 	return E1000_SUCCESS;
 }
 

+ 1 - 0
drivers/net/e1000/e1000_hw.h

@@ -1463,6 +1463,7 @@ struct e1000_hw {
 	boolean_t		kmrn_lock_loss_workaround_disabled;
 	boolean_t		bad_tx_carr_stats_fd;
 	boolean_t		has_manc2h;
+	boolean_t		rx_needs_kicking;
 };
 
 

+ 7 - 0
drivers/net/e1000/e1000_main.c

@@ -2579,6 +2579,13 @@ e1000_watchdog(unsigned long data)
 			netif_wake_queue(netdev);
 			mod_timer(&adapter->phy_info_timer, jiffies + 2 * HZ);
 			adapter->smartspeed = 0;
+		} else {
+			/* make sure the receive unit is started */
+			if (adapter->hw.rx_needs_kicking) {
+				struct e1000_hw *hw = &adapter->hw;
+				uint32_t rctl = E1000_READ_REG(hw, RCTL);
+				E1000_WRITE_REG(hw, RCTL, rctl | E1000_RCTL_EN);
+			}
 		}
 	} else {
 		if (netif_carrier_ok(netdev)) {