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

Ben Hutchings benh at alioth.debian.org
Mon Jan 24 01:19:05 UTC 2011


Author: benh
Date: Mon Jan 24 01:19:00 2011
New Revision: 16845

Log:
r8169: Keep firmware in memory (Closes: #609538)

Added:
   dists/sid/linux-2.6/debian/patches/bugfix/all/r8169-keep-firmware-in-memory.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/31

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Sun Jan 23 17:44:49 2011	(r16844)
+++ dists/sid/linux-2.6/debian/changelog	Mon Jan 24 01:19:00 2011	(r16845)
@@ -11,6 +11,7 @@
     CVE-2010-4076, CVE-2010-4077)
   * bonding: Ensure that we unshare skbs prior to calling pskb_may_pull
     (Closes: #610838)
+  * r8169: Keep firmware in memory (Closes: #609538)
 
   [ dann frazier ]
   * xfs: fix information leak using stale NFS handle (CVE-2010-2943)

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/r8169-keep-firmware-in-memory.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/r8169-keep-firmware-in-memory.patch	Mon Jan 24 01:19:00 2011	(r16845)
@@ -0,0 +1,130 @@
+From 3d96276b0f98c0d0bb329c4278ce9e3df98dedce Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?fran=C3=A7ois=20romieu?= <romieu at fr.zoreil.com>
+Date: Thu, 13 Jan 2011 13:07:53 +0000
+Subject: [PATCH] r8169: keep firmware in memory.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit f1e02ed109df5f99abf942b8ccc99960cb09dd38 upstream.
+
+The firmware agent is not available during resume. Loading the firmware
+during open() (see eee3a96c6368f47df8df5bd4ed1843600652b337) is not
+enough.
+
+close() is run during resume through rtl8169_reset_task(), whence the
+mildly natural release of firmware in the driver removal method instead.
+
+It will help with http://bugs.debian.org/609538. It will not avoid
+the 60 seconds delay when:
+- there is no firmware
+- the driver is loaded and the device is not up before a suspend/resume
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Tested-by: Jarek Kamiński <jarek at vilo.eu.org>
+Cc: Hayes <hayeswang at realtek.com>
+Cc: Ben Hutchings <benh at debian.org>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/r8169.c |   43 +++++++++++++++++++++++++++++++------------
+ 1 files changed, 31 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 71d0708..0c3327b 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -513,6 +513,8 @@ struct rtl8169_private {
+ 
+ 	struct mii_if_info mii;
+ 	struct rtl8169_counters counters;
++
++	const struct firmware *fw;
+ };
+ 
+ MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev at vger.kernel.org>");
+@@ -1443,6 +1445,29 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
+ 	}
+ }
+ 
++static void rtl_release_firmware(struct rtl8169_private *tp)
++{
++	release_firmware(tp->fw);
++	tp->fw = NULL;
++}
++
++static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name)
++{
++	const struct firmware **fw = &tp->fw;
++	int rc = !*fw;
++
++	if (rc) {
++		rc = request_firmware(fw, fw_name, &tp->pci_dev->dev);
++		if (rc < 0)
++			goto out;
++	}
++
++	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
++	rtl_phy_write_fw(tp, *fw);
++out:
++	return rc;
++}
++
+ static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
+ {
+ 	struct phy_reg phy_reg_init[] = {
+@@ -1818,7 +1843,6 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
+ 		{ 0x0d, 0xf880 }
+ 	};
+ 	void __iomem *ioaddr = tp->mmio_addr;
+-	const struct firmware *fw;
+ 
+ 	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
+ 
+@@ -1882,11 +1906,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 	mdio_write(ioaddr, 0x1f, 0x0005);
+ 	mdio_write(ioaddr, 0x05, 0x001b);
+-	if (mdio_read(ioaddr, 0x06) == 0xbf00 &&
+-	    request_firmware(&fw, FIRMWARE_8168D_1, &tp->pci_dev->dev) == 0) {
+-		rtl_phy_write_fw(tp, fw);
+-		release_firmware(fw);
+-	} else {
++	if ((mdio_read(tp, 0x06) != 0xbf00) ||
++	    (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) {
+ 		if (netif_msg_probe(tp))
+ 			printk(KERN_WARNING "%s: unable to apply firmware patch\n",
+ 			       tp->dev->name);
+@@ -1938,7 +1959,6 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
+ 		{ 0x0d, 0xf880 }
+ 	};
+ 	void __iomem *ioaddr = tp->mmio_addr;
+-	const struct firmware *fw;
+ 
+ 	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
+ 
+@@ -1993,11 +2013,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 	mdio_write(ioaddr, 0x1f, 0x0005);
+ 	mdio_write(ioaddr, 0x05, 0x001b);
+-	if (mdio_read(ioaddr, 0x06) == 0xb300 &&
+-	    request_firmware(&fw, FIRMWARE_8168D_2, &tp->pci_dev->dev) == 0) {
+-		rtl_phy_write_fw(tp, fw);
+-		release_firmware(fw);
+-	} else {
++	if ((mdio_read(tp, 0x06) != 0xb300) ||
++	    (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) {
+ 		if (netif_msg_probe(tp))
+ 			printk(KERN_WARNING "%s: unable to apply firmware patch\n",
+ 			       tp->dev->name);
+@@ -2716,6 +2733,8 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 
+ 	flush_scheduled_work();
+ 
++	rtl_release_firmware(tp);
++
+ 	unregister_netdev(dev);
+ 
+ 	/* restore original MAC address */
+-- 
+1.7.2.3
+

Modified: dists/sid/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/31	Sun Jan 23 17:44:49 2011	(r16844)
+++ dists/sid/linux-2.6/debian/patches/series/31	Mon Jan 24 01:19:00 2011	(r16845)
@@ -9,3 +9,4 @@
 + bugfix/all/xfs-rename-XFS_IGET_BULKSTAT-to-XFS_IGET_UNTRUSTED.patch
 + bugfix/all/xfs-remove-block-number-from-inode-lookup-code.patch
 + bugfix/all/xfs-fix-untrusted-inode-number-lookup.patch
++ bugfix/all/r8169-keep-firmware-in-memory.patch



More information about the Kernel-svn-changes mailing list