[kernel] r14241 - in dists/sid/linux-2.6/debian: . patches/bugfix/all patches/series

Ben Hutchings benh at alioth.debian.org
Tue Sep 15 13:04:20 UTC 2009


Author: benh
Date: Tue Sep 15 13:04:18 2009
New Revision: 14241

Log:
e1000, e1000e, igb, ixgb, ixgbe, sfc: Fix initial link state (Closes: #546041)

Added:
   dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-intel-fix-initial-link-state.patch
   dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-sfc-fix-initial-link-state.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/7

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Tue Sep 15 12:56:13 2009	(r14240)
+++ dists/sid/linux-2.6/debian/changelog	Tue Sep 15 13:04:18 2009	(r14241)
@@ -19,6 +19,8 @@
   * x86, pat: Allow ISA memory range uncacheable mapping requests
     (Closes: #538159)
   * proc: Fix idle time in /proc/uptime (Closes: #545981)
+  * e1000, e1000e, igb, ixgb, ixgbe, sfc: Fix initial link state
+    (Closes: #546041)
 
   [ Bastian Blank ]
   * Add stable release 2.6.30.5.

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-intel-fix-initial-link-state.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-intel-fix-initial-link-state.patch	Tue Sep 15 13:04:18 2009	(r14241)
@@ -0,0 +1,312 @@
+From eb62efd287fe6e12d18083287e38e4a811c28256 Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Date: Fri, 17 Apr 2009 20:44:36 +0000
+Subject: [PATCH] e1000: init link state correctly
+
+As reported by Andrew Lutomirski <amluto at gmail.com>
+
+All the intel wired ethernet drivers were calling netif_carrier_off
+and netif_stop_queue (or variants) before calling register_netdevice
+
+This is incorrect behavior as was pointed out by davem, and causes
+ifconfig and friends to report a strange state before first link
+after the driver was loaded.
+
+This apparently confused *some* versions of networkmanager.
+
+Andy tested this for e1000e and confirmed it was working for him.
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Reported-by: Andrew Lutomirski <amluto at gmail.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/e1000/e1000_main.c |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index ef12931..9bdcf4d 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -1234,15 +1234,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+ 	    !e1000_check_mng_mode(hw))
+ 		e1000_get_hw_control(adapter);
+ 
+-	/* tell the stack to leave us alone until e1000_open() is called */
+-	netif_carrier_off(netdev);
+-	netif_stop_queue(netdev);
+-
+ 	strcpy(netdev->name, "eth%d");
+ 	err = register_netdev(netdev);
+ 	if (err)
+ 		goto err_register;
+ 
++	/* carrier off reporting is important to ethtool even BEFORE open */
++	netif_carrier_off(netdev);
++
+ 	DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
+ 
+ 	cards_found++;
+@@ -1441,6 +1440,8 @@ static int e1000_open(struct net_device *netdev)
+ 	if (test_bit(__E1000_TESTING, &adapter->flags))
+ 		return -EBUSY;
+ 
++	netif_carrier_off(netdev);
++
+ 	/* allocate transmit descriptors */
+ 	err = e1000_setup_all_tx_resources(adapter);
+ 	if (err)
+-- 
+1.6.3.3
+
+From 9c563d20671e5fbe3045fd79c18b306ccb77b0b6 Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Date: Fri, 17 Apr 2009 20:44:34 +0000
+Subject: [PATCH] e1000e: indicate link down at load
+
+As reported by Andrew Lutomirski <amluto at gmail.com>
+
+All the intel wired ethernet drivers were calling netif_carrier_off
+and netif_stop_queue (or variants) before calling register_netdevice
+
+This is incorrect behavior as was pointed out by davem, and causes
+ifconfig and friends to report a strange state before first link
+after the driver was loaded, since without a netif_carrier_off, the stack
+assumes carrier_on, but before register_netdev, netlink messages are not
+sent out telling link state.
+
+This apparently confused *some* versions of networkmanager.
+
+Andy tested this for e1000e and confirmed it was working for him.
+
+see thread: http://marc.info/?l=linux-netdev&m=123946479705636&w=2
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Tested-by: Andy Lutomirski <amluto at gmail.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/e1000e/netdev.c |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index 1693ed1..c0ff550 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -3072,6 +3072,8 @@ static int e1000_open(struct net_device *netdev)
+ 	if (test_bit(__E1000_TESTING, &adapter->state))
+ 		return -EBUSY;
+ 
++	netif_carrier_off(netdev);
++
+ 	/* allocate transmit descriptors */
+ 	err = e1000e_setup_tx_resources(adapter);
+ 	if (err)
+@@ -5037,15 +5039,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+ 	if (!(adapter->flags & FLAG_HAS_AMT))
+ 		e1000_get_hw_control(adapter);
+ 
+-	/* tell the stack to leave us alone until e1000_open() is called */
+-	netif_carrier_off(netdev);
+-	netif_tx_stop_all_queues(netdev);
+-
+ 	strcpy(netdev->name, "eth%d");
+ 	err = register_netdev(netdev);
+ 	if (err)
+ 		goto err_register;
+ 
++	/* carrier off reporting is important to ethtool even BEFORE open */
++	netif_carrier_off(netdev);
++
+ 	e1000_print_device_info(adapter);
+ 
+ 	return 0;
+-- 
+1.6.3.3
+
+From b168dfc51604ec293db16dc4d558043585578a2d Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Date: Fri, 17 Apr 2009 20:44:32 +0000
+Subject: [PATCH] igb: fix link down inital state
+
+As reported by Andrew Lutomirski <amluto at gmail.com>
+
+All the intel wired ethernet drivers were calling netif_carrier_off
+and netif_stop_queue (or variants) before calling register_netdevice
+
+This is incorrect behavior as was pointed out by davem, and causes
+ifconfig and friends to report a strange state before first link
+after the driver was loaded, since without a netif_carrier_off, the stack
+assumes carrier_on, but before register_netdev, netlink messages are not
+sent out telling link state.
+
+This apparently confused *some* versions of networkmanager.
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Reported-by: Andrew Lutomirski <amluto at gmail.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/igb/igb_main.c |    9 +++++----
+ 1 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
+index 08c8014..ceaa585 100644
+--- a/drivers/net/igb/igb_main.c
++++ b/drivers/net/igb/igb_main.c
+@@ -1442,15 +1442,14 @@ static int __devinit igb_probe(struct pci_dev *pdev,
+ 	 * driver. */
+ 	igb_get_hw_control(adapter);
+ 
+-	/* tell the stack to leave us alone until igb_open() is called */
+-	netif_carrier_off(netdev);
+-	netif_tx_stop_all_queues(netdev);
+-
+ 	strcpy(netdev->name, "eth%d");
+ 	err = register_netdev(netdev);
+ 	if (err)
+ 		goto err_register;
+ 
++	/* carrier off reporting is important to ethtool even BEFORE open */
++	netif_carrier_off(netdev);
++
+ #ifdef CONFIG_IGB_DCA
+ 	if (dca_add_requester(&pdev->dev) == 0) {
+ 		adapter->flags |= IGB_FLAG_DCA_ENABLED;
+@@ -1699,6 +1698,8 @@ static int igb_open(struct net_device *netdev)
+ 	if (test_bit(__IGB_TESTING, &adapter->state))
+ 		return -EBUSY;
+ 
++	netif_carrier_off(netdev);
++
+ 	/* allocate transmit descriptors */
+ 	err = igb_setup_all_tx_resources(adapter);
+ 	if (err)
+-- 
+1.6.3.3
+
+From 3a6d1bc4163fee27c312184d5f1a9cc1e110d300 Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Date: Fri, 17 Apr 2009 20:44:29 +0000
+Subject: [PATCH] ixgb: fix link down initial state
+
+As reported by Andrew Lutomirski <amluto at gmail.com>
+
+All the intel wired ethernet drivers were calling netif_carrier_off
+and netif_stop_queue (or variants) before calling register_netdevice
+
+This is incorrect behavior as was pointed out by davem, and causes
+ifconfig and friends to report a strange state before first link
+after the driver was loaded, since without a netif_carrier_off, the stack
+assumes carrier_on, but before register_netdev, netlink messages are not
+sent out telling link state.
+
+This apparently confused *some* versions of networkmanager.
+
+in addition this driver appeared to need a netif_start_queue at
+the end of open.
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Reported-by: Andrew Lutomirski <amluto at gmail.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ixgb/ixgb_main.c |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
+index 4a0826b..ff741ca 100644
+--- a/drivers/net/ixgb/ixgb_main.c
++++ b/drivers/net/ixgb/ixgb_main.c
+@@ -471,10 +471,8 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	if (err)
+ 		goto err_register;
+ 
+-	/* we're going to reset, so assume we have no link for now */
+-
++	/* carrier off reporting is important to ethtool even BEFORE open */
+ 	netif_carrier_off(netdev);
+-	netif_stop_queue(netdev);
+ 
+ 	DPRINTK(PROBE, INFO, "Intel(R) PRO/10GbE Network Connection\n");
+ 	ixgb_check_options(adapter);
+@@ -592,6 +590,8 @@ ixgb_open(struct net_device *netdev)
+ 	if (err)
+ 		goto err_setup_tx;
+ 
++	netif_carrier_off(netdev);
++
+ 	/* allocate receive descriptors */
+ 
+ 	err = ixgb_setup_rx_resources(adapter);
+@@ -602,6 +602,8 @@ ixgb_open(struct net_device *netdev)
+ 	if (err)
+ 		goto err_up;
+ 
++	netif_start_queue(netdev);
++
+ 	return 0;
+ 
+ err_up:
+-- 
+1.6.3.3
+
+From 5438646724c34c2180664a57f862a1da8dd21db1 Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Date: Fri, 17 Apr 2009 20:44:27 +0000
+Subject: [PATCH] ixgbe: fix link down initial state
+
+As reported by Andrew Lutomirski <amluto at gmail.com>
+
+All the intel wired ethernet drivers were calling netif_carrier_off
+and netif_stop_queue (or variants) before calling register_netdevice
+
+This is incorrect behavior as was pointed out by davem, and causes
+ifconfig and friends to report a strange state before first link
+after the driver was loaded, since without a netif_carrier_off, the stack
+assumes carrier_on, but before register_netdev, netlink messages are not
+sent out telling link state.
+
+This apparently confused *some* versions of networkmanager.
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg at intel.com>
+Reported-by: Andrew Lutomirski <amluto at gmail.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ixgbe/ixgbe_main.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
+index 0d9a3ac..d5d9589 100644
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -3459,6 +3459,8 @@ static int ixgbe_open(struct net_device *netdev)
+ 	if (test_bit(__IXGBE_TESTING, &adapter->state))
+ 		return -EBUSY;
+ 
++	netif_carrier_off(netdev);
++
+ 	/* allocate transmit descriptors */
+ 	err = ixgbe_setup_all_tx_resources(adapter);
+ 	if (err)
+@@ -4772,13 +4774,14 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
+ 	/* reset the hardware with the new settings */
+ 	hw->mac.ops.start_hw(hw);
+ 
+-	netif_carrier_off(netdev);
+-
+ 	strcpy(netdev->name, "eth%d");
+ 	err = register_netdev(netdev);
+ 	if (err)
+ 		goto err_register;
+ 
++	/* carrier off reporting is important to ethtool even BEFORE open */
++	netif_carrier_off(netdev);
++
+ #ifdef CONFIG_IXGBE_DCA
+ 	if (dca_add_requester(&pdev->dev) == 0) {
+ 		adapter->flags |= IXGBE_FLAG_DCA_ENABLED;
+-- 
+1.6.3.3
+

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-sfc-fix-initial-link-state.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/drivers-net-sfc-fix-initial-link-state.patch	Tue Sep 15 13:04:18 2009	(r14241)
@@ -0,0 +1,72 @@
+From aed0628dae0c26b47d40d65f942abe30279b52a5 Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <bhutchings at solarflare.com>
+Date: Wed, 26 Aug 2009 08:16:27 +0000
+Subject: [PATCH] sfc: Fix ordering of device registration and initial netif_carrier_off()
+
+We must call netif_carrier_off() after the device is registered, not
+before, to set the operational state and user-space IFF_RUNNING flag
+correctly.
+
+Since we don't want observers to see an intermediate state, open-code
+register_netdev() and add efx_update_name() and netif_carrier_off()
+into the locked region.
+
+Signed-off-by: Ben Hutchings <bhutchings at solarflare.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/sfc/efx.c |   26 +++++++++++++++++---------
+ 1 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
+index 343e8da..d4dc920 100644
+--- a/drivers/net/sfc/efx.c
++++ b/drivers/net/sfc/efx.c
+@@ -1614,21 +1614,24 @@ static int efx_register_netdev(struct efx_nic *efx)
+ 	SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev);
+ 	SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops);
+ 
+-	/* Always start with carrier off; PHY events will detect the link */
+-	netif_carrier_off(efx->net_dev);
+-
+ 	/* Clear MAC statistics */
+ 	efx->mac_op->update_stats(efx);
+ 	memset(&efx->mac_stats, 0, sizeof(efx->mac_stats));
+ 
+-	rc = register_netdev(net_dev);
+-	if (rc) {
+-		EFX_ERR(efx, "could not register net dev\n");
+-		return rc;
+-	}
+-
+ 	rtnl_lock();
++
++	rc = dev_alloc_name(net_dev, net_dev->name);
++	if (rc < 0)
++		goto fail_locked;
+ 	efx_update_name(efx);
++
++	rc = register_netdevice(net_dev);
++	if (rc)
++		goto fail_locked;
++
++	/* Always start with carrier off; PHY events will detect the link */
++	netif_carrier_off(efx->net_dev);
++
+ 	rtnl_unlock();
+ 
+ 	rc = device_create_file(&efx->pci_dev->dev, &dev_attr_phy_type);
+@@ -1639,6 +1642,11 @@ static int efx_register_netdev(struct efx_nic *efx)
+ 
+ 	return 0;
+ 
++fail_locked:
++	rtnl_unlock();
++	EFX_ERR(efx, "could not register net dev\n");
++	return rc;
++
+ fail_registered:
+ 	unregister_netdev(net_dev);
+ 	return rc;
+-- 
+1.6.3.3
+

Modified: dists/sid/linux-2.6/debian/patches/series/7
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/7	Tue Sep 15 12:56:13 2009	(r14240)
+++ dists/sid/linux-2.6/debian/patches/series/7	Tue Sep 15 13:04:18 2009	(r14241)
@@ -19,3 +19,5 @@
 + bugfix/all/stable/2.6.30.6.patch
 + bugfix/x86/x86-pat-allow-isa-memory-uncacheable-mapping.patch
 + bugfix/all/fix-proc-uptime-idle-time.patch
++ bugfix/all/drivers-net-intel-fix-initial-link-state.patch
++ bugfix/all/drivers-net-sfc-fix-initial-link-state.patch



More information about the Kernel-svn-changes mailing list