Skip to contentSkip to conversation

e100, e1000, ixgb fixes

PATCH In review Kok, Auke 2 participants 15 messages Aug 16, 2006 – Aug 24, 2006

Subsystems (2)
lore
Share & tools
lore

Kok, Auke

author
#0 lore raw

cover e100, e1000, ixgb fixes

Hi,

Here are updates targeted to branch #upstream-fixes from netdev-2.6, including fixes to e100, e1000 and ixgb.

Summary:
---

Manasi Deval
ixgb: Add CX4 PHY type detection and subdevice ID.

Jesse Brandeburg
e1000: Explicitly power up the PHY during loopback testing.
e1000: Explicit locking for two ethtool path functions
ixgb: Fix cache miss due to miscalculation

Jeff Kirsher
e1000: Remove 0x1000 as supported device
e1000: Allow NVM to setup LPLU for IGP2 and IGP3
e1000: Force full DMA clocking for 10/100 speed
e1000: Disable aggressive clocking on esb2 with SERDES port
e100: Remove auto-MDIO/MDIO-X workaround

Auke Kok

    e1000: Same ntohs/htons cosmetic fix as for ipv6
    e1000: Increment driver version to 7.1.9-k6
    e100:  Increment version to 3.5.10-k4
    ixgb:  Increment version to 1.0.109-k4

---

These changes are available through git.

git pull git://lost.foo-projects.org/~ahkok/git/netdev-2.6 upstream-fixes

these patches are against
netdev-2.6#upstream-fixes 09e590e5d5a93f2eaa748a89c623258e6bad1648

Cheers,

Auke

---
 drivers/net/e100.c                |   22 ++++++++------------
 drivers/net/e1000/e1000_ethtool.c |   40 ++++++++++++++++++++++++++++----------
 drivers/net/e1000/e1000_hw.c      |   24 ++++++++++++++++++----
 drivers/net/e1000/e1000_main.c    |    9 ++------
 drivers/net/ixgb/ixgb_hw.c        |   11 ++++++++++
 drivers/net/ixgb/ixgb_ids.h       |    1 
 drivers/net/ixgb/ixgb_main.c      |   14 ++++++-------
 7 files changed, 80 insertions(+), 41 deletions(-)

--
Auke Kok <[email protected]>

author
#1 lore raw

PATCH 1/13 e100: Fix MDIO/MDIO-X

MDIO/MDIO-X was broken due to a wrong errata. Removing the workaround code fixes for affected NICs.

---

 drivers/net/e100.c |   14 +++++---------
 1 files changed, 5 insertions(+), 9 deletions(-)
drivers/net/e100.c +5 -9
index 91ef5f2..5de9843 100644
@@ -1391,15 +1391,11 @@ static int e100_phy_init(struct nic *nic
 	}
 
 	if((nic->mac >= mac_82550_D102) || ((nic->flags & ich) &&
-	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000))) {
-		/* enable/disable MDI/MDI-X auto-switching.
-		   MDI/MDI-X auto-switching is disabled for 82551ER/QM chips */
-		if((nic->mac == mac_82551_E) || (nic->mac == mac_82551_F) ||
-		   (nic->mac == mac_82551_10) || (nic->mii.force_media) ||
-		   !(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))
-			mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG, 0);
-		else
-			mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG, NCONFIG_AUTO_SWITCH);
+	   (mdio_read(netdev, nic->mii.phy_id, MII_TPISTATUS) & 0x8000) &&
+		!(nic->eeprom[eeprom_cnfg_mdix] & eeprom_mdix_enabled))) {
+		/* enable/disable MDI/MDI-X auto-switching. */
+		mdio_write(netdev, nic->mii.phy_id, MII_NCONFIG,
+				nic->mii.force_media ? 0 : NCONFIG_AUTO_SWITCH);
 	}
 
 	return 0;

--
Auke Kok <[email protected]>

author
#2 lore raw

PATCH 2/13 e100: increment version to 3.5.10-k4

In reply to Kok, Auke

Increment the version of e100 to 3.5.10-k4, increment dates.

---

 drivers/net/e100.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/e100.c +4 -4
index 5de9843..e208c09 100644
@@ -1,7 +1,7 @@
 /*******************************************************************************
 
 
-  Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+  Copyright(c) 1999 - 2006 Intel Corporation. All rights reserved.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the Free
@@ -158,10 +158,10 @@
 
 
 #define DRV_NAME		"e100"
-#define DRV_EXT		"-NAPI"
-#define DRV_VERSION		"3.5.10-k2"DRV_EXT
+#define DRV_EXT			"-NAPI"
+#define DRV_VERSION		"3.5.10-k4"DRV_EXT
 #define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
-#define DRV_COPYRIGHT		"Copyright(c) 1999-2005 Intel Corporation"
+#define DRV_COPYRIGHT		"Copyright(c) 1999-2006 Intel Corporation"
 #define PFX			DRV_NAME ": "
 
 #define E100_WATCHDOG_PERIOD	(2 * HZ)

--
Auke Kok <[email protected]>

author
#3 lore raw

PATCH 3/13 e1000: Same cosmetic fix as earlier sent out for IPV4.

In reply to Kok, Auke

---

 drivers/net/e1000/e1000_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/e1000/e1000_main.c +1 -1
index 627f224..ea3d504 100644
@@ -2545,7 +2545,7 @@ e1000_tso(struct e1000_adapter *adapter,
 			cmd_length = E1000_TXD_CMD_IP;
 			ipcse = skb->h.raw - skb->data - 1;
 #ifdef NETIF_F_TSO_IPV6
-		} else if (skb->protocol == ntohs(ETH_P_IPV6)) {
+		} else if (skb->protocol == htons(ETH_P_IPV6)) {
 			skb->nh.ipv6h->payload_len = 0;
 			skb->h.th->check =
 				~csum_ipv6_magic(&skb->nh.ipv6h->saddr,

--
Auke Kok <[email protected]>

author
#4 lore raw

PATCH 4/13 e1000: Remove 0x1000 as supported device

In reply to Kok, Auke

Remove pci ID 8086:1000 from the list fo supported devices. This device has not functioned with the driver for very long (since v. 5.2.4!) and we lack the resources to come with a substantial fix. There are only few cards of this type out there.

---

 drivers/net/e1000/e1000_main.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/net/e1000/e1000_main.c +0 -1
index ea3d504..bd7770f 100644
@@ -48,7 +48,6 @@ static char e1000_copyright[] = "Copyrig
  *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
  */
 static struct pci_device_id e1000_pci_tbl[] = {
-	INTEL_E1000_ETHERNET_DEVICE(0x1000),
 	INTEL_E1000_ETHERNET_DEVICE(0x1001),
 	INTEL_E1000_ETHERNET_DEVICE(0x1004),
 	INTEL_E1000_ETHERNET_DEVICE(0x1008),

--
Auke Kok <[email protected]>

author
#5 lore raw

PATCH 5/13 e1000: Explicitly power up the PHY during loopback testing.

In reply to Kok, Auke

---

 drivers/net/e1000/e1000_ethtool.c |    7 +++++++
 drivers/net/e1000/e1000_main.c    |    2 +-
 2 files changed, 8 insertions(+), 1 deletions(-)
drivers/net/e1000/e1000_ethtool.c +7 -0
index 88a82ba..8edbc6b 100644
@@ -1590,6 +1590,8 @@ e1000_diag_test_count(struct net_device 
 	return E1000_TEST_LEN;
 }
 
+extern void e1000_power_up_phy(struct e1000_adapter *);
+
 static void
 e1000_diag_test(struct net_device *netdev,
 		   struct ethtool_test *eth_test, uint64_t *data)
@@ -1606,6 +1608,8 @@ e1000_diag_test(struct net_device *netde
 		uint8_t forced_speed_duplex = adapter->hw.forced_speed_duplex;
 		uint8_t autoneg = adapter->hw.autoneg;
 
+		DPRINTK(HW, INFO, "offline testing starting\n");
+
 		/* Link test performed before hardware reset so autoneg doesn't
 		 * interfere with test result */
 		if (e1000_link_test(adapter, &data[4]))
@@ -1629,6 +1633,8 @@ e1000_diag_test(struct net_device *netde
 			eth_test->flags |= ETH_TEST_FL_FAILED;
 
 		e1000_reset(adapter);
+		/* make sure the phy is powered up */
+		e1000_power_up_phy(adapter);
 		if (e1000_loopback_test(adapter, &data[3]))
 			eth_test->flags |= ETH_TEST_FL_FAILED;
 
@@ -1642,6 +1648,7 @@ e1000_diag_test(struct net_device *netde
 		if (if_running)
 			dev_open(netdev);
 	} else {
+		DPRINTK(HW, INFO, "online testing starting\n");
 		/* Online tests */
 		if (e1000_link_test(adapter, &data[4]))
 			eth_test->flags |= ETH_TEST_FL_FAILED;
drivers/net/e1000/e1000_main.c +1 -1
index bd7770f..b2caaa2 100644
@@ -484,7 +484,7 @@ e1000_up(struct e1000_adapter *adapter)
  *
  **/
 
-static void e1000_power_up_phy(struct e1000_adapter *adapter)
+void e1000_power_up_phy(struct e1000_adapter *adapter)
 {
 	uint16_t mii_reg = 0;
 

--
Auke Kok <[email protected]>

author
#6 lore raw

PATCH 6/13 e1000: explicit locking for two ethtool path functions

In reply to Kok, Auke

Explicitly lock two more ethtool entry points completely instead of the hardware reset only to prevent a race condition.

---

 drivers/net/e1000/e1000_ethtool.c |   33 +++++++++++++++++++++++----------
 1 files changed, 23 insertions(+), 10 deletions(-)
drivers/net/e1000/e1000_ethtool.c +23 -10
index 8edbc6b..2baccf8 100644
@@ -183,6 +183,9 @@ e1000_set_settings(struct net_device *ne
 		return -EINVAL;
 	}
 
+	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
+		msleep(1);
+
 	if (ecmd->autoneg == AUTONEG_ENABLE) {
 		hw->autoneg = 1;
 		if (hw->media_type == e1000_media_type_fiber)
@@ -199,16 +202,20 @@ e1000_set_settings(struct net_device *ne
 						  ADVERTISED_TP;
 		ecmd->advertising = hw->autoneg_advertised;
 	} else
-		if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex))
+		if (e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) {
+			clear_bit(__E1000_RESETTING, &adapter->flags);
 			return -EINVAL;
+		}
 
 	/* reset the link */
 
-	if (netif_running(adapter->netdev))
-		e1000_reinit_locked(adapter);
-	else
+	if (netif_running(adapter->netdev)) {
+		e1000_down(adapter);
+		e1000_up(adapter);
+	} else
 		e1000_reset(adapter);
 
+	clear_bit(__E1000_RESETTING, &adapter->flags);
 	return 0;
 }
 
@@ -238,9 +245,13 @@ e1000_set_pauseparam(struct net_device *
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
+	int retval = 0;
 
 	adapter->fc_autoneg = pause->autoneg;
 
+	while (test_and_set_bit(__E1000_RESETTING, &adapter->flags))
+		msleep(1);
+
 	if (pause->rx_pause && pause->tx_pause)
 		hw->fc = e1000_fc_full;
 	else if (pause->rx_pause && !pause->tx_pause)
@@ -253,15 +264,17 @@ e1000_set_pauseparam(struct net_device *
 	hw->original_fc = hw->fc;
 
 	if (adapter->fc_autoneg == AUTONEG_ENABLE) {
-		if (netif_running(adapter->netdev))
-			e1000_reinit_locked(adapter);
-		else
+		if (netif_running(adapter->netdev)) {
+			e1000_down(adapter);
+			e1000_up(adapter);
+		} else
 			e1000_reset(adapter);
 	} else
-		return ((hw->media_type == e1000_media_type_fiber) ?
-			e1000_setup_link(hw) : e1000_force_mac_fc(hw));
+		retval = ((hw->media_type == e1000_media_type_fiber) ?
+			   e1000_setup_link(hw) : e1000_force_mac_fc(hw));
 
-	return 0;
+	clear_bit(__E1000_RESETTING, &adapter->flags);
+	return retval;
 }
 
 static uint32_t

--
Auke Kok <[email protected]>

author
#7 lore raw

PATCH 7/13 e1000: Allow NVM to setup LPLU for IGP2 and IGP3

In reply to Kok, Auke

Allow NVM to setup LPLU for IGP2 and IGP3. Only IGP needs LPLU D3 disabled during init here.

---

 drivers/net/e1000/e1000_hw.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)
drivers/net/e1000/e1000_hw.c +8 -5
index 583518a..3728f33 100644
@@ -1324,11 +1324,14 @@ e1000_copper_link_igp_setup(struct e1000
     E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
     }
 
-    /* disable lplu d3 during driver init */
-    ret_val = e1000_set_d3_lplu_state(hw, FALSE);
-    if (ret_val) {
-        DEBUGOUT("Error Disabling LPLU D3\n");
-        return ret_val;
+    /* The NVM settings will configure LPLU in D3 for IGP2 and IGP3 PHYs */
+    if (hw->phy_type == e1000_phy_igp) {
+        /* disable lplu d3 during driver init */
+        ret_val = e1000_set_d3_lplu_state(hw, FALSE);
+        if (ret_val) {
+            DEBUGOUT("Error Disabling LPLU D3\n");
+            return ret_val;
+        }
     }
 
     /* disable lplu d0 during driver init */

--
Auke Kok <[email protected]>

author
#8 lore raw

PATCH 8/13 e1000: Force full DMA clocking for 10/100 speed

In reply to Kok, Auke

---

 drivers/net/e1000/e1000_hw.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
drivers/net/e1000/e1000_hw.c +11 -0
index 3728f33..8eddfdf 100644
@@ -718,6 +718,17 @@ e1000_init_hw(struct e1000_hw *hw)
 
     DEBUGFUNC("e1000_init_hw");
 
+    /* force full DMA clock frequency for 10/100 on ICH8 A0-B0 */
+    if (hw->mac_type == e1000_ich8lan) {
+        reg_data = E1000_READ_REG(hw, TARC0);
+        reg_data |= 0x30000000;
+        E1000_WRITE_REG(hw, TARC0, reg_data);
+
+        reg_data = E1000_READ_REG(hw, STATUS);
+        reg_data &= ~0x80000000;
+        E1000_WRITE_REG(hw, STATUS, reg_data);
+    }
+
     /* Initialize Identification LED */
     ret_val = e1000_id_led_init(hw);
     if(ret_val) {

--
Auke Kok <[email protected]>

author
#9 lore raw

PATCH 9/13 e1000: Disable aggressive clocking on esb2 with SERDES port

In reply to Kok, Auke

Disable aggressive clocking on esb2 with SERDES port as it causes hardware problems.

---

 drivers/net/e1000/e1000_main.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)
drivers/net/e1000/e1000_main.c +0 -2
index b2caaa2..978e3b7 100644
@@ -1498,8 +1498,6 @@ e1000_configure_tx(struct e1000_adapter 
 	} else if (hw->mac_type == e1000_80003es2lan) {
 		tarc = E1000_READ_REG(hw, TARC0);
 		tarc |= 1;
-		if (hw->media_type == e1000_media_type_internal_serdes)
-			tarc |= (1 << 20);
 		E1000_WRITE_REG(hw, TARC0, tarc);
 		tarc = E1000_READ_REG(hw, TARC1);
 		tarc |= 1;

--
Auke Kok <[email protected]>

author
#10 lore raw

PATCH 10/13 e1000: Increment driver version to 7.1.9-k6

In reply to Kok, Auke

---

 drivers/net/e1000/e1000_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/e1000/e1000_main.c +1 -1
index 978e3b7..815abe5 100644
@@ -36,7 +36,7 @@ static char e1000_driver_string[] = "Int
 #else
 #define DRIVERNAPI "-NAPI"
 #endif
-#define DRV_VERSION "7.1.9-k4"DRIVERNAPI
+#define DRV_VERSION "7.1.9-k6"DRIVERNAPI
 char e1000_driver_version[] = DRV_VERSION;
 static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
 

--
Auke Kok <[email protected]>

author
#11 lore raw

PATCH 11/13 ixgb: Add CX4 PHY type detection and subdevice ID.

In reply to Kok, Auke

---

 drivers/net/ixgb/ixgb_hw.c  |   11 +++++++++++
 drivers/net/ixgb/ixgb_ids.h |    1 +
 2 files changed, 12 insertions(+), 0 deletions(-)
drivers/net/ixgb/ixgb_hw.c +11 -0
index f7fa10e..2b15155 100644
@@ -236,6 +236,17 @@ ixgb_identify_phy(struct ixgb_hw *hw)
 		DEBUGOUT("Identified G6104 optics\n");
 		phy_type = ixgb_phy_type_g6104;
 		break;
+	case IXGB_DEVICE_ID_82597EX_CX4:
+		DEBUGOUT("Identified CX4\n");
+		xpak_vendor = ixgb_identify_xpak_vendor(hw);
+		if (xpak_vendor == ixgb_xpak_vendor_intel) {
+			DEBUGOUT("Identified TXN17201 optics\n");
+			phy_type = ixgb_phy_type_txn17201;
+		} else {
+			DEBUGOUT("Identified G6005 optics\n");
+			phy_type = ixgb_phy_type_g6005;
+		}
+		break;
 	default:
 		DEBUGOUT("Unknown physical layer module\n");
 		phy_type = ixgb_phy_type_unknown;
drivers/net/ixgb/ixgb_ids.h +1 -0
index 40a085f..9fd6118 100644
@@ -45,6 +45,7 @@
 
 #define IXGB_DEVICE_ID_82597EX_CX4   0x109E
 #define IXGB_SUBDEVICE_ID_A00C  0xA00C
+#define IXGB_SUBDEVICE_ID_A01C  0xA01C
 
 #endif /* #ifndef _IXGB_IDS_H_ */
 /* End of File */

--
Auke Kok <[email protected]>

author
#12 lore raw

PATCH 12/13 ixgb: fix cache miss due to miscalculation

In reply to Kok, Auke

Reduce writeback threshold by 1. We were instructing the hardware to wait until the 17th descriptor which went over the cache line limit.

---

 drivers/net/ixgb/ixgb_main.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/ixgb/ixgb_main.c +6 -6
index 7bbd447..770eef2 100644
@@ -140,12 +140,12 @@ module_param(debug, int, 0);
 MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
 
 /* some defines for controlling descriptor fetches in h/w */
-#define RXDCTL_WTHRESH_DEFAULT 16	/* chip writes back at this many or RXT0 */
-#define RXDCTL_PTHRESH_DEFAULT 0		/* chip considers prefech below
-						 * this */
-#define RXDCTL_HTHRESH_DEFAULT 0		/* chip will only prefetch if tail
-						 * is pushed this many descriptors
-						 * from head */
+#define RXDCTL_WTHRESH_DEFAULT 15  /* chip writes back at this many or RXT0 */
+#define RXDCTL_PTHRESH_DEFAULT 0   /* chip considers prefech below
+                                    * this */
+#define RXDCTL_HTHRESH_DEFAULT 0   /* chip will only prefetch if tail
+                                    * is pushed this many descriptors
+                                    * from head */
 
 /**
  * ixgb_init_module - Driver Registration Routine

--
Auke Kok <[email protected]>

author
#13 lore raw

PATCH 13/13 ixgb: Increment version to 1.0.109-k4

In reply to Kok, Auke

---

 drivers/net/ixgb/ixgb_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/ixgb/ixgb_main.c +1 -1
index 770eef2..b1cf852 100644
@@ -36,7 +36,7 @@ static char ixgb_driver_string[] = "Inte
 #else
 #define DRIVERNAPI "-NAPI"
 #endif
-#define DRV_VERSION		"1.0.109-k2"DRIVERNAPI
+#define DRV_VERSION		"1.0.109-k4"DRIVERNAPI
 char ixgb_driver_version[] = DRV_VERSION;
 static char ixgb_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
 

--
Auke Kok <[email protected]>