[kernel] r17925 - in dists/squeeze/linux-2.6/debian: . config patches/features/all patches/features/all/r8169 patches/series

Ben Hutchings benh at alioth.debian.org
Mon Aug 15 01:35:30 UTC 2011


Author: benh
Date: Mon Aug 15 01:35:28 2011
New Revision: 17925

Log:
Backport r8169 changes up to 3.0.2

Added:
   dists/squeeze/linux-2.6/debian/patches/features/all/err.h-add-helper-function-to-simplify-pointer-error-.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0048-r8169-adjust-rtl8169_set_speed_xmii-function.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0049-r8169-support-the-new-chips-for-RTL8105E.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0050-r8169-support-control-of-advertising.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0051-r8169-fix-a-bug-in-rtl8169_init_phy.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0052-net-r8169-add-a-new-chip-for-RTL8105.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0053-net-r8169-add-a-new-chip-for-RTL8168DP.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0054-net-r8169-support-RTL8168E.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0055-r8169-TSO-fixes.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0056-r8169-don-t-request-firmware-when-there-s-no-userspa.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0057-r8169-fix-merge-conflict-fix.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0058-ethtool-Use-full-32-bit-speed-range-in-ethtool-s-set.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0059-ethtool-cosmetic-Use-ethtool-ethtool_cmd_speed-API.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0060-r8169-style-cleanups.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0061-r8169-remove-some-code-duplication.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0062-r8169-rtl8169_set_speed_xmii-cleanup.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0063-r8169-link-speed-selection-timer-rework.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0064-r8169-remove-non-NAPI-context-invocation-of-rtl8169_.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0065-r8169-provide-some-firmware-information-via-ethtool.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0066-r8169-merge-firmware-information-into-the-chipset-de.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0067-r8169-avoid-late-chip-identifier-initialisation.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0068-Add-appropriate-linux-prefetch.h-include-for-prefetc.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0069-r8169-fix-static-initializers.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0070-r8169-fix-wrong-register-use.patch
   dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0071-r8169-Add-support-for-D-Link-530T-rev-C1-Kernel-Bug-.patch
Modified:
   dists/squeeze/linux-2.6/debian/changelog
   dists/squeeze/linux-2.6/debian/config/defines
   dists/squeeze/linux-2.6/debian/patches/series/36

Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog	Mon Aug 15 00:16:47 2011	(r17924)
+++ dists/squeeze/linux-2.6/debian/changelog	Mon Aug 15 01:35:28 2011	(r17925)
@@ -44,8 +44,10 @@
     (regression in 2.6.34)
   * igb,igbvf: Backport changes up to Linux 3.0 (Closes: #627702)
     - Add support for i82576-ET2, i82580, DH89xxCC, i340 and i350
-  * r8169: Backport changes up to Linux 2.6.38 (Closes: #627704)
+  * r8169: Backport changes up to Linux 3.0.2 (Closes: #627704)
     - Fix support for RTL8102E and RTL8168DP
+    - Add support for RTL8105E, RTL8168E and another variant of RTL8168DP
+    - Add support for D-Link DGE-530T rev C1
   * tg3,broadcom: Backport changes up to Linux 2.6.38 (Closes: #627705)
     - Add support for BCM5717, BCM5719, BCM57765
     - Add support for BCM50610M and BCM5241 PHYs

Modified: dists/squeeze/linux-2.6/debian/config/defines
==============================================================================
--- dists/squeeze/linux-2.6/debian/config/defines	Mon Aug 15 00:16:47 2011	(r17924)
+++ dists/squeeze/linux-2.6/debian/config/defines	Mon Aug 15 01:35:28 2011	(r17925)
@@ -77,7 +77,7 @@
 drivers/net/igb/: 3.0
 drivers/net/igbvf/: 3.0
 drivers/net/macvtap.c: 2.6.34
-drivers/net/r8169.c: 2.6.38
+drivers/net/r8169.c: 3.0
 drivers/net/sky2.c: 2.6.35
 drivers/net/sky2.h: 2.6.35
 drivers/net/tg3.c: 2.6.38

Added: dists/squeeze/linux-2.6/debian/patches/features/all/err.h-add-helper-function-to-simplify-pointer-error-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/err.h-add-helper-function-to-simplify-pointer-error-.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,38 @@
+From: Phil Carmody <ext-phil.2.carmody at nokia.com>
+Date: Mon, 14 Dec 2009 18:00:29 -0800
+Subject: [PATCH] err.h: add helper function to simplify pointer error
+ checking
+
+commit 603c4ba96be998a8dd7a6f9b23681c49acdf4b64 upstream.
+
+There are quite a few instances in the kernel of checks of pointers both
+against NULL and against the errno range, handling both cases identically.
+This additional helper function would simplify such code.
+
+[akpm at linux-foundation.org: build fix]
+Signed-off-by: Phil Carmody <ext-phil.2.carmody at nokia.com>
+Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
+---
+ include/linux/err.h |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/include/linux/err.h b/include/linux/err.h
+index ec87f31..1b12642 100644
+--- a/include/linux/err.h
++++ b/include/linux/err.h
+@@ -34,6 +34,11 @@ static inline long IS_ERR(const void *ptr)
+ 	return IS_ERR_VALUE((unsigned long)ptr);
+ }
+ 
++static inline long IS_ERR_OR_NULL(const void *ptr)
++{
++	return !ptr || IS_ERR_VALUE((unsigned long)ptr);
++}
++
+ /**
+  * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type
+  * @ptr: The pointer to cast.
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0048-r8169-adjust-rtl8169_set_speed_xmii-function.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0048-r8169-adjust-rtl8169_set_speed_xmii-function.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,60 @@
+From: Hayes Wang <hayeswang at realtek.com>
+Date: Tue, 22 Feb 2011 17:26:18 +0800
+Subject: [PATCH 48/71] r8169: adjust rtl8169_set_speed_xmii function.
+
+commit 716b50a31fb237c480e67ad66dc23feb35d40772 upstream.
+
+- adjust code of rtl8169_set_speed_xmii function
+- remove parts of code which are done in rtl_pll_power_up
+  function (8168 only)
+
+Signed-off-by: Hayes Wang <hayeswang at realtek.com>
+Acked-by: Francois Romieu <romieu at fr.zoreil.com>
+---
+ drivers/net/r8169.c |   16 ++--------------
+ 1 files changed, 2 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index ebc696d..66f739b 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1126,6 +1126,8 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	int giga_ctrl, bmcr;
+ 
++	rtl_writephy(tp, 0x1f, 0x0000);
++
+ 	if (autoneg == AUTONEG_ENABLE) {
+ 		int auto_nego;
+ 
+@@ -1154,18 +1156,6 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 
+ 		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
+ 
+-		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
+-		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
+-		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
+-			/*
+-			 * Wake up the PHY.
+-			 * Vendor specific (0x1f) and reserved (0x0e) MII
+-			 * registers.
+-			 */
+-			rtl_writephy(tp, 0x1f, 0x0000);
+-			rtl_writephy(tp, 0x0e, 0x0000);
+-		}
+-
+ 		rtl_writephy(tp, MII_ADVERTISE, auto_nego);
+ 		rtl_writephy(tp, MII_CTRL1000, giga_ctrl);
+ 	} else {
+@@ -1180,8 +1170,6 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 
+ 		if (duplex == DUPLEX_FULL)
+ 			bmcr |= BMCR_FULLDPLX;
+-
+-		rtl_writephy(tp, 0x1f, 0x0000);
+ 	}
+ 
+ 	tp->phy_1000_ctrl_reg = giga_ctrl;
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0049-r8169-support-the-new-chips-for-RTL8105E.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0049-r8169-support-the-new-chips-for-RTL8105E.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,198 @@
+From: Hayes Wang <hayeswang at realtek.com>
+Date: Tue, 22 Feb 2011 17:26:21 +0800
+Subject: [PATCH 49/71] r8169: support the new chips for RTL8105E.
+
+commit 5a5e4443150713347a7a7e4d0880b343348f5811 upstream.
+
+Signed-off-by: Hayes Wang <hayeswang at realtek.com>
+Acked-by: Francois Romieu <romieu at fr.zoreil.com>
+---
+ drivers/net/r8169.c |   92 +++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 files changed, 90 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 66f739b..cbe8a37 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -37,6 +37,7 @@
+ 
+ #define FIRMWARE_8168D_1	"rtl_nic/rtl8168d-1.fw"
+ #define FIRMWARE_8168D_2	"rtl_nic/rtl8168d-2.fw"
++#define FIRMWARE_8105E_1	"rtl_nic/rtl8105e-1.fw"
+ 
+ #ifdef RTL8169_DEBUG
+ #define assert(expr) \
+@@ -124,6 +125,8 @@ enum mac_version {
+ 	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
+ 	RTL_GIGA_MAC_VER_27 = 0x1b, // 8168DP
+ 	RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP
++	RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
++	RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
+ };
+ 
+ #define _R(NAME,MAC,MASK) \
+@@ -161,7 +164,9 @@ static const struct {
+ 	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
+ 	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
+ 	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, 0xff7e1880)  // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
++	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
++	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, 0xff7e1880)  // PCI-E
+ };
+ #undef _R
+ 
+@@ -268,9 +273,15 @@ enum rtl8168_8101_registers {
+ #define	EPHYAR_REG_MASK			0x1f
+ #define	EPHYAR_REG_SHIFT		16
+ #define	EPHYAR_DATA_MASK		0xffff
++	DLLPR			= 0xd0,
++#define	PM_SWITCH			(1 << 6)
+ 	DBG_REG			= 0xd1,
+ #define	FIX_NAK_1			(1 << 4)
+ #define	FIX_NAK_2			(1 << 3)
++	TWSI			= 0xd2,
++	MCU			= 0xd3,
++#define	EN_NDP				(1 << 3)
++#define	EN_OOB_RESET			(1 << 2)
+ 	EFUSEAR			= 0xdc,
+ #define	EFUSEAR_FLAG			0x80000000
+ #define	EFUSEAR_WRITE_CMD		0x80000000
+@@ -569,6 +580,7 @@ MODULE_LICENSE("GPL");
+ MODULE_VERSION(RTL8169_VERSION);
+ MODULE_FIRMWARE(FIRMWARE_8168D_1);
+ MODULE_FIRMWARE(FIRMWARE_8168D_2);
++MODULE_FIRMWARE(FIRMWARE_8105E_1);
+ 
+ static int rtl8169_open(struct net_device *dev);
+ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+@@ -1147,7 +1159,9 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
++		    (tp->mac_version != RTL_GIGA_MAC_VER_16) &&
++		    (tp->mac_version != RTL_GIGA_MAC_VER_29) &&
++		    (tp->mac_version != RTL_GIGA_MAC_VER_30)) {
+ 			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
+ 		} else {
+ 			netif_info(tp, link, dev,
+@@ -1549,6 +1563,9 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
+ 
+ 		/* 8101 family. */
++		{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
++		{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
++		{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
+ 		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
+ 		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
+ 		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
+@@ -2425,6 +2442,33 @@ static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
+ 	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
+ }
+ 
++static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
++{
++	static const struct phy_reg phy_reg_init[] = {
++		{ 0x1f, 0x0005 },
++		{ 0x1a, 0x0000 },
++		{ 0x1f, 0x0000 },
++
++		{ 0x1f, 0x0004 },
++		{ 0x1c, 0x0000 },
++		{ 0x1f, 0x0000 },
++
++		{ 0x1f, 0x0001 },
++		{ 0x15, 0x7701 },
++		{ 0x1f, 0x0000 }
++	};
++
++	/* Disable ALDPS before ram code */
++	rtl_writephy(tp, 0x1f, 0x0000);
++	rtl_writephy(tp, 0x18, 0x0310);
++	msleep(100);
++
++	if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0)
++		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
++
++	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
++}
++
+ static void rtl_hw_phy_config(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+@@ -2492,6 +2536,10 @@ static void rtl_hw_phy_config(struct net_device *dev)
+ 	case RTL_GIGA_MAC_VER_28:
+ 		rtl8168d_4_hw_phy_config(tp);
+ 		break;
++	case RTL_GIGA_MAC_VER_29:
++	case RTL_GIGA_MAC_VER_30:
++		rtl8105e_hw_phy_config(tp);
++		break;
+ 
+ 	default:
+ 		break;
+@@ -2940,6 +2988,8 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_09:
+ 	case RTL_GIGA_MAC_VER_10:
+ 	case RTL_GIGA_MAC_VER_16:
++	case RTL_GIGA_MAC_VER_29:
++	case RTL_GIGA_MAC_VER_30:
+ 		ops->down	= r810x_pll_power_down;
+ 		ops->up		= r810x_pll_power_up;
+ 		break;
+@@ -3911,6 +3961,37 @@ static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
+ 	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
+ }
+ 
++static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
++{
++	static const struct ephy_info e_info_8105e_1[] = {
++		{ 0x07,	0, 0x4000 },
++		{ 0x19,	0, 0x0200 },
++		{ 0x19,	0, 0x0020 },
++		{ 0x1e,	0, 0x2000 },
++		{ 0x03,	0, 0x0001 },
++		{ 0x19,	0, 0x0100 },
++		{ 0x19,	0, 0x0004 },
++		{ 0x0a,	0, 0x0020 }
++	};
++
++	/* Force LAN exit from ASPM if Rx/Tx are not idel */
++	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
++
++	/* disable Early Tally Counter */
++	RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
++
++	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
++	RTL_W8(DLLPR, RTL_R8(DLLPR) | PM_SWITCH);
++
++	rtl_ephy_init(ioaddr, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
++}
++
++static void rtl_hw_start_8105e_2(void __iomem *ioaddr, struct pci_dev *pdev)
++{
++	rtl_hw_start_8105e_1(ioaddr, pdev);
++	rtl_ephy_write(ioaddr, 0x1e, rtl_ephy_read(ioaddr, 0x1e) | 0x8000);
++}
++
+ static void rtl_hw_start_8101(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+@@ -3941,6 +4022,13 @@ static void rtl_hw_start_8101(struct net_device *dev)
+ 	case RTL_GIGA_MAC_VER_09:
+ 		rtl_hw_start_8102e_2(ioaddr, pdev);
+ 		break;
++
++	case RTL_GIGA_MAC_VER_29:
++		rtl_hw_start_8105e_1(ioaddr, pdev);
++		break;
++	case RTL_GIGA_MAC_VER_30:
++		rtl_hw_start_8105e_2(ioaddr, pdev);
++		break;
+ 	}
+ 
+ 	RTL_W8(Cfg9346, Cfg9346_Lock);
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0050-r8169-support-control-of-advertising.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0050-r8169-support-control-of-advertising.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,151 @@
+From: Oliver Neukum <oneukum at suse.de>
+Date: Thu, 6 Jan 2011 21:55:13 +0100
+Subject: [PATCH 50/71] r8169: support control of advertising.
+
+commit 54405cde762408b00a445466a40da4f7f33a8479 upstream.
+
+This allows "ethtool advertise" to control the speed and duplex
+features the device offers the switch.
+
+Signed-off-by: Oliver Neukum <oneukum at suse.de>
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+---
+ drivers/net/r8169.c |   54 ++++++++++++++++++++++++++++++++++----------------
+ 1 files changed, 37 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index cbe8a37..7135356 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -552,7 +552,7 @@ struct rtl8169_private {
+ 		void (*up)(struct rtl8169_private *);
+ 	} pll_power_ops;
+ 
+-	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
++	int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
+ 	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
+ 	void (*phy_reset_enable)(struct rtl8169_private *tp);
+ 	void (*hw_start)(struct net_device *);
+@@ -1110,7 +1110,7 @@ static int rtl8169_get_regs_len(struct net_device *dev)
+ }
+ 
+ static int rtl8169_set_speed_tbi(struct net_device *dev,
+-				 u8 autoneg, u16 speed, u8 duplex)
++				 u8 autoneg, u16 speed, u8 duplex, u32 ignored)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	void __iomem *ioaddr = tp->mmio_addr;
+@@ -1133,10 +1133,11 @@ static int rtl8169_set_speed_tbi(struct net_device *dev,
+ }
+ 
+ static int rtl8169_set_speed_xmii(struct net_device *dev,
+-				  u8 autoneg, u16 speed, u8 duplex)
++				  u8 autoneg, u16 speed, u8 duplex, u32 adv)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	int giga_ctrl, bmcr;
++	int rc = -EINVAL;
+ 
+ 	rtl_writephy(tp, 0x1f, 0x0000);
+ 
+@@ -1144,8 +1145,18 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		int auto_nego;
+ 
+ 		auto_nego = rtl_readphy(tp, MII_ADVERTISE);
+-		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
+-			      ADVERTISE_100HALF | ADVERTISE_100FULL);
++		auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
++				ADVERTISE_100HALF | ADVERTISE_100FULL);
++
++		if (adv & ADVERTISED_10baseT_Half)
++			auto_nego |= ADVERTISE_10HALF;
++		if (adv & ADVERTISED_10baseT_Full)
++			auto_nego |= ADVERTISE_10FULL;
++		if (adv & ADVERTISED_100baseT_Half)
++			auto_nego |= ADVERTISE_100HALF;
++		if (adv & ADVERTISED_100baseT_Full)
++			auto_nego |= ADVERTISE_100FULL;
++
+ 		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+ 
+ 		giga_ctrl = rtl_readphy(tp, MII_CTRL1000);
+@@ -1162,10 +1173,15 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_16) &&
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_29) &&
+ 		    (tp->mac_version != RTL_GIGA_MAC_VER_30)) {
+-			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
+-		} else {
++			if (adv & ADVERTISED_1000baseT_Half)
++				giga_ctrl |= ADVERTISE_1000HALF;
++			if (adv & ADVERTISED_1000baseT_Full)
++				giga_ctrl |= ADVERTISE_1000FULL;
++		} else if (adv & (ADVERTISED_1000baseT_Half |
++				  ADVERTISED_1000baseT_Full)) {
+ 			netif_info(tp, link, dev,
+ 				   "PHY does not support 1000Mbps\n");
++			goto out;
+ 		}
+ 
+ 		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
+@@ -1180,7 +1196,7 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		else if (speed == SPEED_100)
+ 			bmcr = BMCR_SPEED100;
+ 		else
+-			return -EINVAL;
++			goto out;
+ 
+ 		if (duplex == DUPLEX_FULL)
+ 			bmcr |= BMCR_FULLDPLX;
+@@ -1201,16 +1217,18 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		}
+ 	}
+ 
+-	return 0;
++	rc = 0;
++out:
++	return rc;
+ }
+ 
+ static int rtl8169_set_speed(struct net_device *dev,
+-			     u8 autoneg, u16 speed, u8 duplex)
++			     u8 autoneg, u16 speed, u8 duplex, u32 advertising)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	int ret;
+ 
+-	ret = tp->set_speed(dev, autoneg, speed, duplex);
++	ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
+ 
+ 	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
+ 		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
+@@ -1225,7 +1243,8 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ 	int ret;
+ 
+ 	spin_lock_irqsave(&tp->lock, flags);
+-	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
++	ret = rtl8169_set_speed(dev,
++		cmd->autoneg, cmd->speed, cmd->duplex, cmd->advertising);
+ 	spin_unlock_irqrestore(&tp->lock, flags);
+ 
+ 	return ret;
+@@ -2671,11 +2690,12 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
+ 
+ 	rtl8169_phy_reset(dev, tp);
+ 
+-	/*
+-	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
+-	 * only 8101. Don't panic.
+-	 */
+-	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
++	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
++		ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
++		ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
++		tp->mii.supports_gmii ?
++			ADVERTISED_1000baseT_Half |
++			ADVERTISED_1000baseT_Full : 0);
+ 
+ 	if (RTL_R8(PHYstatus) & TBI_Enable)
+ 		netif_info(tp, link, dev, "TBI auto-negotiating\n");
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0051-r8169-fix-a-bug-in-rtl8169_init_phy.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0051-r8169-fix-a-bug-in-rtl8169_init_phy.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,39 @@
+From: Eric Dumazet <eric.dumazet at gmail.com>
+Date: Sat, 19 Mar 2011 16:39:11 +0100
+Subject: [PATCH 51/71] r8169: fix a bug in rtl8169_init_phy()
+
+commit db552b3331766e16c35550a4b83c3a42671ba73e upstream.
+
+commit 54405cde7624 (r8169: support control of advertising.)
+introduced a bug in rtl8169_init_phy()
+
+Reported-and-tested-by: Piotr Hosowicz <piotr at hosowicz.com>
+Reported-and-tested-by: Linus Torvalds <torvalds at linux-foundation.org>
+Signed-off-by: Eric Dumazet <eric.dumazet at gmail.com>
+Acked-by:: Oliver Neukum <oliver at neukum.org>
+Cc: Francois Romieu <romieu at fr.zoreil.com>
+Tested-by: Anca Emanuel <anca.emanuel at gmail.com>
+Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
+---
+ drivers/net/r8169.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 7135356..156afee 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -2693,9 +2693,9 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
+ 	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
+ 		ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
+ 		ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
+-		tp->mii.supports_gmii ?
++		(tp->mii.supports_gmii ?
+ 			ADVERTISED_1000baseT_Half |
+-			ADVERTISED_1000baseT_Full : 0);
++			ADVERTISED_1000baseT_Full : 0));
+ 
+ 	if (RTL_R8(PHYstatus) & TBI_Enable)
+ 		netif_info(tp, link, dev, "TBI auto-negotiating\n");
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0052-net-r8169-add-a-new-chip-for-RTL8105.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0052-net-r8169-add-a-new-chip-for-RTL8105.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,29 @@
+From: hayeswang <hayeswang at realtek.com>
+Date: Mon, 21 Mar 2011 01:50:30 +0000
+Subject: [PATCH 52/71] net/r8169: add a new chip for RTL8105
+
+commit 36a0e6c2d6f3eb59b7a5ddfda63d252a42dba189 upstream.
+
+Add a new chip for RTL8105 whose settings are the same with RTL_GIGA_MAC_VER_30.
+
+Signed-off-by: Hayes Wang <hayeswang at realtek.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/r8169.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 156afee..29080e6 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1582,6 +1582,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
+ 
+ 		/* 8101 family. */
++		{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
+ 		{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
+ 		{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
+ 		{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0053-net-r8169-add-a-new-chip-for-RTL8168DP.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0053-net-r8169-add-a-new-chip-for-RTL8168DP.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,289 @@
+From: hayeswang <hayeswang at realtek.com>
+Date: Mon, 21 Mar 2011 01:50:29 +0000
+Subject: [PATCH 53/71] net/r8169: add a new chip for RTL8168DP
+
+commit 4804b3b3aec163b59328140d6c858c3ed1c85992 upstream.
+
+Add a new chip for RTL8168DP.
+
+Signed-off-by: Hayes Wang <hayeswang at realtek.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/r8169.c |   98 +++++++++++++++++++++++++++++++++++++++-----------
+ 1 files changed, 76 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 29080e6..d755d5c 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -127,6 +127,7 @@ enum mac_version {
+ 	RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP
+ 	RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
+ 	RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
++	RTL_GIGA_MAC_VER_31 = 0x1f, // 8168DP
+ };
+ 
+ #define _R(NAME,MAC,MASK) \
+@@ -166,7 +167,8 @@ static const struct {
+ 	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E
+ 	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
+ 	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
+-	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, 0xff7e1880)  // PCI-E
++	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, 0xff7e1880), // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, 0xff7e1880)  // PCI-E
+ };
+ #undef _R
+ 
+@@ -654,12 +656,18 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
+ static void rtl8168_driver_start(struct rtl8169_private *tp)
+ {
+ 	int i;
++	u32 reg;
+ 
+ 	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
+ 
++	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
++		reg = 0xb8;
++	else
++		reg = 0x10;
++
+ 	for (i = 0; i < 10; i++) {
+ 		msleep(10);
+-		if (ocp_read(tp, 0x0f, 0x0010) & 0x00000800)
++		if (ocp_read(tp, 0x0f, reg) & 0x00000800)
+ 			break;
+ 	}
+ }
+@@ -667,16 +675,36 @@ static void rtl8168_driver_start(struct rtl8169_private *tp)
+ static void rtl8168_driver_stop(struct rtl8169_private *tp)
+ {
+ 	int i;
++	u32 reg;
+ 
+ 	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
+ 
++	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
++		reg = 0xb8;
++	else
++		reg = 0x10;
++
+ 	for (i = 0; i < 10; i++) {
+ 		msleep(10);
+-		if ((ocp_read(tp, 0x0f, 0x0010) & 0x00000800) == 0)
++		if ((ocp_read(tp, 0x0f, reg) & 0x00000800) == 0)
+ 			break;
+ 	}
+ }
+ 
++static int r8168dp_check_dash(struct rtl8169_private *tp)
++{
++	u32 reg;
++
++	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
++		reg = 0xb8;
++	else
++		reg = 0x10;
++
++	if (ocp_read(tp, 0xF, reg) & 0x00008000)
++		return 1;
++	else
++		return 0;
++}
+ 
+ static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
+ {
+@@ -1563,6 +1591,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 		/* 8168DP family. */
+ 		{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
+ 		{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
++		{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
+ 
+ 		/* 8168C family. */
+ 		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
+@@ -2871,6 +2900,7 @@ static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp)
+ 		ops->read	= r8168dp_1_mdio_read;
+ 		break;
+ 	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
+ 		ops->write	= r8168dp_2_mdio_write;
+ 		ops->read	= r8168dp_2_mdio_read;
+ 		break;
+@@ -2928,8 +2958,9 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 
+ 	if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_28)) &&
+-	    (ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) {
++	     (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
++	     (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
++	    r8168dp_check_dash(tp)) {
+ 		return;
+ 	}
+ 
+@@ -2955,6 +2986,7 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_26:
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
+ 		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
+ 		break;
+ 	}
+@@ -2965,8 +2997,9 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 
+ 	if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_28)) &&
+-	    (ocp_read(tp, 0x0f, 0x0010) & 0x00008000)) {
++	     (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
++	     (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
++	    r8168dp_check_dash(tp)) {
+ 		return;
+ 	}
+ 
+@@ -2975,6 +3008,7 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_26:
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
+ 		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
+ 		break;
+ 	}
+@@ -3029,6 +3063,7 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_26:
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
+ 		ops->down	= r8168_pll_power_down;
+ 		ops->up		= r8168_pll_power_up;
+ 		break;
+@@ -3257,7 +3292,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
+ 
+ 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_28)) {
++	    (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
++	    (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
+ 		rtl8168_driver_start(tp);
+ 	}
+ 
+@@ -3295,7 +3331,8 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 	pm_runtime_get_sync(&pdev->dev);
+ 
+ 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_28)) {
++	    (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
++	    (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
+ 		rtl8168_driver_stop(tp);
+ 	}
+ 
+@@ -3403,7 +3440,8 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
+ 	rtl8169_irq_mask_and_ack(ioaddr);
+ 
+ 	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
+-	    tp->mac_version == RTL_GIGA_MAC_VER_28) {
++	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
+ 		while (RTL_R8(TxPoll) & NPQ)
+ 			udelay(20);
+ 
+@@ -3800,6 +3838,17 @@ static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
+ 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ }
+ 
++static void rtl_hw_start_8168dp(void __iomem *ioaddr, struct pci_dev *pdev)
++{
++	rtl_csi_access_enable_1(ioaddr);
++
++	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
++
++	RTL_W8(MaxTxPacketSize, TxPacketMax);
++
++	rtl_disable_clock_request(pdev);
++}
++
+ static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
+ {
+ 	static const struct ephy_info e_info_8168d_4[] = {
+@@ -3863,55 +3912,59 @@ static void rtl_hw_start_8168(struct net_device *dev)
+ 	switch (tp->mac_version) {
+ 	case RTL_GIGA_MAC_VER_11:
+ 		rtl_hw_start_8168bb(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_12:
+ 	case RTL_GIGA_MAC_VER_17:
+ 		rtl_hw_start_8168bef(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_18:
+ 		rtl_hw_start_8168cp_1(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_19:
+ 		rtl_hw_start_8168c_1(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_20:
+ 		rtl_hw_start_8168c_2(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_21:
+ 		rtl_hw_start_8168c_3(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_22:
+ 		rtl_hw_start_8168c_4(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_23:
+ 		rtl_hw_start_8168cp_2(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_24:
+ 		rtl_hw_start_8168cp_3(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_25:
+ 	case RTL_GIGA_MAC_VER_26:
+ 	case RTL_GIGA_MAC_VER_27:
+ 		rtl_hw_start_8168d(ioaddr, pdev);
+-	break;
++		break;
+ 
+ 	case RTL_GIGA_MAC_VER_28:
+ 		rtl_hw_start_8168d_4(ioaddr, pdev);
+-	break;
++		break;
++	case RTL_GIGA_MAC_VER_31:
++		rtl_hw_start_8168dp(ioaddr, pdev);
++		break;
++
+ 
+ 	default:
+ 		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
+ 			dev->name, tp->mac_version);
+-	break;
++		break;
+ 	}
+ 
+ 	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+@@ -4776,6 +4829,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
+ 			case RTL_GIGA_MAC_VER_24:
+ 			case RTL_GIGA_MAC_VER_27:
+ 			case RTL_GIGA_MAC_VER_28:
++			case RTL_GIGA_MAC_VER_31:
+ 			/* Experimental science. Pktgen proof. */
+ 			case RTL_GIGA_MAC_VER_12:
+ 			case RTL_GIGA_MAC_VER_25:
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0054-net-r8169-support-RTL8168E.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0054-net-r8169-support-RTL8168E.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,351 @@
+From: hayeswang <hayeswang at realtek.com>
+Date: Mon, 21 Mar 2011 01:50:28 +0000
+Subject: [PATCH 54/71] net/r8169: support RTL8168E
+
+commit 01dc7fec4025f6bb72b6b98ec88b375346b6dbbb upstream.
+
+Support RTL8168E/RTL8111E.
+
+Signed-off-by: Hayes Wang <hayeswang at realtek.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/r8169.c |  212 +++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 files changed, 207 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index d755d5c..4cc6263 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -37,6 +37,8 @@
+ 
+ #define FIRMWARE_8168D_1	"rtl_nic/rtl8168d-1.fw"
+ #define FIRMWARE_8168D_2	"rtl_nic/rtl8168d-2.fw"
++#define FIRMWARE_8168E_1	"rtl_nic/rtl8168e-1.fw"
++#define FIRMWARE_8168E_2	"rtl_nic/rtl8168e-2.fw"
+ #define FIRMWARE_8105E_1	"rtl_nic/rtl8105e-1.fw"
+ 
+ #ifdef RTL8169_DEBUG
+@@ -128,6 +130,8 @@ enum mac_version {
+ 	RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
+ 	RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
+ 	RTL_GIGA_MAC_VER_31 = 0x1f, // 8168DP
++	RTL_GIGA_MAC_VER_32 = 0x20, // 8168E
++	RTL_GIGA_MAC_VER_33 = 0x21, // 8168E
+ };
+ 
+ #define _R(NAME,MAC,MASK) \
+@@ -168,7 +172,9 @@ static const struct {
+ 	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
+ 	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
+ 	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, 0xff7e1880), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, 0xff7e1880)  // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, 0xff7e1880), // PCI-E
++	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_32, 0xff7e1880), // PCI-E
++	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_33, 0xff7e1880)  // PCI-E
+ };
+ #undef _R
+ 
+@@ -317,7 +323,9 @@ enum rtl8168_registers {
+ #define OCPAR_FLAG			0x80000000
+ #define OCPAR_GPHY_WRITE_CMD		0x8000f060
+ #define OCPAR_GPHY_READ_CMD		0x0000f060
+-	RDSAR1			= 0xd0	/* 8168c only. Undocumented on 8168dp */
++	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
++	MISC			= 0xf0,	/* 8168e only. */
++	txpla_rst			= (1 << 29)
+ };
+ 
+ enum rtl_register_content {
+@@ -395,6 +403,7 @@ enum rtl_register_content {
+ 	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
+ 	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
+ 	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
++	spi_en		= (1 << 3),
+ 	LanWake		= (1 << 1),	/* LanWake enable/disable */
+ 	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
+ 
+@@ -582,6 +591,8 @@ MODULE_LICENSE("GPL");
+ MODULE_VERSION(RTL8169_VERSION);
+ MODULE_FIRMWARE(FIRMWARE_8168D_1);
+ MODULE_FIRMWARE(FIRMWARE_8168D_2);
++MODULE_FIRMWARE(FIRMWARE_8168E_1);
++MODULE_FIRMWARE(FIRMWARE_8168E_2);
+ MODULE_FIRMWARE(FIRMWARE_8105E_1);
+ 
+ static int rtl8169_open(struct net_device *dev);
+@@ -1583,6 +1594,11 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 		u32 val;
+ 		int mac_version;
+ 	} mac_info[] = {
++		/* 8168E family. */
++		{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
++		{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
++		{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },
++
+ 		/* 8168D family. */
+ 		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
+ 		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
+@@ -2474,6 +2490,93 @@ static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp)
+ 	rtl_patchphy(tp, 0x0d, 1 << 5);
+ }
+ 
++static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
++{
++	static const struct phy_reg phy_reg_init[] = {
++		/* Enable Delay cap */
++		{ 0x1f, 0x0005 },
++		{ 0x05, 0x8b80 },
++		{ 0x06, 0xc896 },
++		{ 0x1f, 0x0000 },
++
++		/* Channel estimation fine tune */
++		{ 0x1f, 0x0001 },
++		{ 0x0b, 0x6c20 },
++		{ 0x07, 0x2872 },
++		{ 0x1c, 0xefff },
++		{ 0x1f, 0x0003 },
++		{ 0x14, 0x6420 },
++		{ 0x1f, 0x0000 },
++
++		/* Update PFM & 10M TX idle timer */
++		{ 0x1f, 0x0007 },
++		{ 0x1e, 0x002f },
++		{ 0x15, 0x1919 },
++		{ 0x1f, 0x0000 },
++
++		{ 0x1f, 0x0007 },
++		{ 0x1e, 0x00ac },
++		{ 0x18, 0x0006 },
++		{ 0x1f, 0x0000 }
++	};
++
++	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
++
++	/* DCO enable for 10M IDLE Power */
++	rtl_writephy(tp, 0x1f, 0x0007);
++	rtl_writephy(tp, 0x1e, 0x0023);
++	rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
++	rtl_writephy(tp, 0x1f, 0x0000);
++
++	/* For impedance matching */
++	rtl_writephy(tp, 0x1f, 0x0002);
++	rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00);
++	rtl_writephy(tp, 0x1F, 0x0000);
++
++	/* PHY auto speed down */
++	rtl_writephy(tp, 0x1f, 0x0007);
++	rtl_writephy(tp, 0x1e, 0x002d);
++	rtl_w1w0_phy(tp, 0x18, 0x0050, 0x0000);
++	rtl_writephy(tp, 0x1f, 0x0000);
++	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
++
++	rtl_writephy(tp, 0x1f, 0x0005);
++	rtl_writephy(tp, 0x05, 0x8b86);
++	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
++	rtl_writephy(tp, 0x1f, 0x0000);
++
++	rtl_writephy(tp, 0x1f, 0x0005);
++	rtl_writephy(tp, 0x05, 0x8b85);
++	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
++	rtl_writephy(tp, 0x1f, 0x0007);
++	rtl_writephy(tp, 0x1e, 0x0020);
++	rtl_w1w0_phy(tp, 0x15, 0x0000, 0x1100);
++	rtl_writephy(tp, 0x1f, 0x0006);
++	rtl_writephy(tp, 0x00, 0x5a00);
++	rtl_writephy(tp, 0x1f, 0x0000);
++	rtl_writephy(tp, 0x0d, 0x0007);
++	rtl_writephy(tp, 0x0e, 0x003c);
++	rtl_writephy(tp, 0x0d, 0x4007);
++	rtl_writephy(tp, 0x0e, 0x0000);
++	rtl_writephy(tp, 0x0d, 0x0000);
++}
++
++static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
++{
++	if (rtl_apply_firmware(tp, FIRMWARE_8168E_1) < 0)
++		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
++
++	rtl8168e_hw_phy_config(tp);
++}
++
++static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
++{
++	if (rtl_apply_firmware(tp, FIRMWARE_8168E_2) < 0)
++		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
++
++	rtl8168e_hw_phy_config(tp);
++}
++
+ static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
+ {
+ 	static const struct phy_reg phy_reg_init[] = {
+@@ -2589,6 +2692,12 @@ static void rtl_hw_phy_config(struct net_device *dev)
+ 	case RTL_GIGA_MAC_VER_30:
+ 		rtl8105e_hw_phy_config(tp);
+ 		break;
++	case RTL_GIGA_MAC_VER_32:
++		rtl8168e_1_hw_phy_config(tp);
++		break;
++	case RTL_GIGA_MAC_VER_33:
++		rtl8168e_2_hw_phy_config(tp);
++		break;
+ 
+ 	default:
+ 		break;
+@@ -2942,15 +3051,59 @@ static void r810x_pll_power_up(struct rtl8169_private *tp)
+ static void r8168_phy_power_up(struct rtl8169_private *tp)
+ {
+ 	rtl_writephy(tp, 0x1f, 0x0000);
+-	rtl_writephy(tp, 0x0e, 0x0000);
++	switch (tp->mac_version) {
++	case RTL_GIGA_MAC_VER_11:
++	case RTL_GIGA_MAC_VER_12:
++	case RTL_GIGA_MAC_VER_17:
++	case RTL_GIGA_MAC_VER_18:
++	case RTL_GIGA_MAC_VER_19:
++	case RTL_GIGA_MAC_VER_20:
++	case RTL_GIGA_MAC_VER_21:
++	case RTL_GIGA_MAC_VER_22:
++	case RTL_GIGA_MAC_VER_23:
++	case RTL_GIGA_MAC_VER_24:
++	case RTL_GIGA_MAC_VER_25:
++	case RTL_GIGA_MAC_VER_26:
++	case RTL_GIGA_MAC_VER_27:
++	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
++		rtl_writephy(tp, 0x0e, 0x0000);
++		break;
++	default:
++		break;
++	}
+ 	rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
+ }
+ 
+ static void r8168_phy_power_down(struct rtl8169_private *tp)
+ {
+ 	rtl_writephy(tp, 0x1f, 0x0000);
+-	rtl_writephy(tp, 0x0e, 0x0200);
+-	rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
++	switch (tp->mac_version) {
++	case RTL_GIGA_MAC_VER_32:
++	case RTL_GIGA_MAC_VER_33:
++		rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
++		break;
++
++	case RTL_GIGA_MAC_VER_11:
++	case RTL_GIGA_MAC_VER_12:
++	case RTL_GIGA_MAC_VER_17:
++	case RTL_GIGA_MAC_VER_18:
++	case RTL_GIGA_MAC_VER_19:
++	case RTL_GIGA_MAC_VER_20:
++	case RTL_GIGA_MAC_VER_21:
++	case RTL_GIGA_MAC_VER_22:
++	case RTL_GIGA_MAC_VER_23:
++	case RTL_GIGA_MAC_VER_24:
++	case RTL_GIGA_MAC_VER_25:
++	case RTL_GIGA_MAC_VER_26:
++	case RTL_GIGA_MAC_VER_27:
++	case RTL_GIGA_MAC_VER_28:
++	case RTL_GIGA_MAC_VER_31:
++		rtl_writephy(tp, 0x0e, 0x0200);
++	default:
++		rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
++		break;
++	}
+ }
+ 
+ static void r8168_pll_power_down(struct rtl8169_private *tp)
+@@ -2970,6 +3123,10 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
+ 		return;
+ 	}
+ 
++	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_33)
++		rtl_ephy_write(ioaddr, 0x19, 0xff64);
++
+ 	if (__rtl8169_get_wol(tp) & WAKE_ANY) {
+ 		rtl_writephy(tp, 0x1f, 0x0000);
+ 		rtl_writephy(tp, MII_BMCR, 0x0000);
+@@ -2987,6 +3144,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
+ 	case RTL_GIGA_MAC_VER_31:
++	case RTL_GIGA_MAC_VER_32:
++	case RTL_GIGA_MAC_VER_33:
+ 		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
+ 		break;
+ 	}
+@@ -3009,6 +3168,8 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
+ 	case RTL_GIGA_MAC_VER_31:
++	case RTL_GIGA_MAC_VER_32:
++	case RTL_GIGA_MAC_VER_33:
+ 		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
+ 		break;
+ 	}
+@@ -3064,6 +3225,8 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
+ 	case RTL_GIGA_MAC_VER_27:
+ 	case RTL_GIGA_MAC_VER_28:
+ 	case RTL_GIGA_MAC_VER_31:
++	case RTL_GIGA_MAC_VER_32:
++	case RTL_GIGA_MAC_VER_33:
+ 		ops->down	= r8168_pll_power_down;
+ 		ops->up		= r8168_pll_power_up;
+ 		break;
+@@ -3875,6 +4038,41 @@ static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
+ 	rtl_enable_clock_request(pdev);
+ }
+ 
++static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
++{
++	static const struct ephy_info e_info_8168e[] = {
++		{ 0x00, 0x0200,	0x0100 },
++		{ 0x00, 0x0000,	0x0004 },
++		{ 0x06, 0x0002,	0x0001 },
++		{ 0x06, 0x0000,	0x0030 },
++		{ 0x07, 0x0000,	0x2000 },
++		{ 0x00, 0x0000,	0x0020 },
++		{ 0x03, 0x5800,	0x2000 },
++		{ 0x03, 0x0000,	0x0001 },
++		{ 0x01, 0x0800,	0x1000 },
++		{ 0x07, 0x0000,	0x4000 },
++		{ 0x1e, 0x0000,	0x2000 },
++		{ 0x19, 0xffff,	0xfe6c },
++		{ 0x0a, 0x0000,	0x0040 }
++	};
++
++	rtl_csi_access_enable_2(ioaddr);
++
++	rtl_ephy_init(ioaddr, e_info_8168e, ARRAY_SIZE(e_info_8168e));
++
++	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
++
++	RTL_W8(MaxTxPacketSize, TxPacketMax);
++
++	rtl_disable_clock_request(pdev);
++
++	/* Reset tx FIFO pointer */
++	RTL_W32(MISC, RTL_R32(MISC) | txpla_rst);
++	RTL_W32(MISC, RTL_R32(MISC) & ~txpla_rst);
++
++	RTL_W8(Config5, RTL_R8(Config5) & ~spi_en);
++}
++
+ static void rtl_hw_start_8168(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+@@ -3960,6 +4158,10 @@ static void rtl_hw_start_8168(struct net_device *dev)
+ 		rtl_hw_start_8168dp(ioaddr, pdev);
+ 		break;
+ 
++	case RTL_GIGA_MAC_VER_32:
++	case RTL_GIGA_MAC_VER_33:
++		rtl_hw_start_8168e(ioaddr, pdev);
++		break;
+ 
+ 	default:
+ 		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0055-r8169-TSO-fixes.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0055-r8169-TSO-fixes.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,413 @@
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Mon, 15 Aug 2011 01:36:39 +0100
+Subject: [PATCH 55/71] r8169: TSO fixes.
+
+commit 2b7b431858c284b62c18baaf2cea571be2797d5a upstream.
+
+- the MSS value is actually contained in a 11 bits wide (0x7ff) field.
+  The extra bit in the former MSSMask did encompass the TSO command
+  bit ("LargeSend") as well (0xfff). Oops.
+
+- the Tx descriptor layout is not the same through the whole chipset
+  family. The 8169 documentation, the 8168c documentation and Realtek's
+  drivers (8.020.00, 1.019.00, 6.014.00) highlight two layouts:
+  1. 8169, 8168 up to 8168b (included) and 8101
+  2. {8102e, 8168c} and beyond
+
+- notwithstanding the "first descriptor" and "last descriptor" bits, the
+  same Tx descriptor content is enforced when a packet consists of several
+  descriptors. The chipsets are documented to require it.
+
+Credits go to David Dillow <dave at thedillows.org> for the original patch.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek <nic_swsd at realtek.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Add the TSO vs MTU check added in commit
+ 350fb32ae45ec74ea9cc117c728c48b8e840f0f9 upstream.  Adjust for the
+ omission of the netdev features API changes.]
+---
+ drivers/net/r8169.c |  223 ++++++++++++++++++++++++++++++++++-----------------
+ 1 files changed, 149 insertions(+), 74 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 4cc6263..f196469 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -134,47 +134,52 @@ enum mac_version {
+ 	RTL_GIGA_MAC_VER_33 = 0x21, // 8168E
+ };
+ 
+-#define _R(NAME,MAC,MASK) \
+-	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
++enum rtl_tx_desc_version {
++	RTL_TD_0	= 0,
++	RTL_TD_1	= 1,
++};
++
++#define _R(NAME,MAC,TD) \
++	{ .name = NAME, .mac_version = MAC, .txd_version = TD }
+ 
+ static const struct {
+ 	const char *name;
+ 	u8 mac_version;
+-	u32 RxConfigMask;	/* Clears the bits supported by this chip */
++	enum rtl_tx_desc_version txd_version;
+ } rtl_chip_info[] = {
+-	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
+-	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
+-	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
+-	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
+-	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
+-	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
+-	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
+-	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
+-	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
+-	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, 0xff7e1880), // PCI-E
+-	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, 0xff7e1880), // PCI-E
+-	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, 0xff7e1880), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, 0xff7e1880), // PCI-E
+-	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_32, 0xff7e1880), // PCI-E
+-	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_33, 0xff7e1880)  // PCI-E
++	_R("RTL8169",		RTL_GIGA_MAC_VER_01, RTL_TD_0), // 8169
++	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, RTL_TD_0), // 8169S
++	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, RTL_TD_0), // 8110S
++	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, RTL_TD_0), // 8169SB
++	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, RTL_TD_0), // 8110SCd
++	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, RTL_TD_0), // 8110SCe
++	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, RTL_TD_1), // PCI-E
++	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, RTL_TD_1), // PCI-E
++	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, RTL_TD_1), // PCI-E
++	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, RTL_TD_0), // PCI-E
++	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, RTL_TD_0), // PCI-E
++	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, RTL_TD_0), // PCI-E
++	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, RTL_TD_0), // PCI-E 8139
++	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, RTL_TD_0), // PCI-E 8139
++	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, RTL_TD_0), // PCI-E 8139
++	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, RTL_TD_0), // PCI-E
++	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, RTL_TD_0), // PCI-E
++	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, RTL_TD_1), // PCI-E
++	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, RTL_TD_1), // PCI-E
++	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, RTL_TD_1), // PCI-E
++	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, RTL_TD_1), // PCI-E
++	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, RTL_TD_1), // PCI-E
++	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, RTL_TD_1), // PCI-E
++	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, RTL_TD_1), // PCI-E
++	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, RTL_TD_1), // PCI-E
++	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, RTL_TD_1), // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, RTL_TD_1), // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, RTL_TD_1), // PCI-E
++	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, RTL_TD_1), // PCI-E
++	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, RTL_TD_1), // PCI-E
++	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, RTL_TD_1), // PCI-E
++	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_32, RTL_TD_1), // PCI-E
++	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_33, RTL_TD_1)  // PCI-E
+ };
+ #undef _R
+ 
+@@ -230,6 +235,9 @@ enum rtl_registers {
+ 	IntrStatus	= 0x3e,
+ 	TxConfig	= 0x40,
+ 	RxConfig	= 0x44,
++
++#define RTL_RX_CONFIG_MASK		0xff7e1880u
++
+ 	RxMissed	= 0x4c,
+ 	Cfg9346		= 0x50,
+ 	Config0		= 0x51,
+@@ -452,21 +460,69 @@ enum rtl_register_content {
+ 	CounterDump	= 0x8,
+ };
+ 
+-enum desc_status_bit {
++enum rtl_desc_bit {
++	/* First doubleword. */
+ 	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
+ 	RingEnd		= (1 << 30), /* End of descriptor ring */
+ 	FirstFrag	= (1 << 29), /* First segment of a packet */
+ 	LastFrag	= (1 << 28), /* Final segment of a packet */
++};
++
++/* Generic case. */
++enum rtl_tx_desc_bit {
++	/* First doubleword. */
++	TD_LSO		= (1 << 27),		/* Large Send Offload */
++#define TD_MSS_MAX			0x07ffu	/* MSS value */
++
++	/* Second doubleword. */
++	TxVlanTag	= (1 << 17),		/* Add VLAN tag */
++};
++
++/* 8169, 8168b and 810x except 8102e. */
++enum rtl_tx_desc_bit_0 {
++	/* First doubleword. */
++#define TD0_MSS_SHIFT			16	/* MSS position (11 bits) */
++	TD0_TCP_CS	= (1 << 16),		/* Calculate TCP/IP checksum */
++	TD0_UDP_CS	= (1 << 17),		/* Calculate UDP/IP checksum */
++	TD0_IP_CS	= (1 << 18),		/* Calculate IP checksum */
++};
+ 
+-	/* Tx private */
+-	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
+-	MSSShift	= 16,        /* MSS value position */
+-	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
+-	IPCS		= (1 << 18), /* Calculate IP checksum */
+-	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
+-	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
+-	TxVlanTag	= (1 << 17), /* Add VLAN tag */
++/* 8102e, 8168c and beyond. */
++enum rtl_tx_desc_bit_1 {
++	/* Second doubleword. */
++#define TD1_MSS_SHIFT			18	/* MSS position (11 bits) */
++	TD1_IP_CS	= (1 << 29),		/* Calculate IP checksum */
++	TD1_TCP_CS	= (1 << 30),		/* Calculate TCP/IP checksum */
++	TD1_UDP_CS	= (1 << 31),		/* Calculate UDP/IP checksum */
++};
+ 
++static const struct rtl_tx_desc_info {
++	struct {
++		u32 udp;
++		u32 tcp;
++	} checksum;
++	u16 mss_shift;
++	u16 opts_offset;
++} tx_desc_info [] = {
++	[RTL_TD_0] = {
++		.checksum = {
++			.udp	= TD0_IP_CS | TD0_UDP_CS,
++			.tcp	= TD0_IP_CS | TD0_TCP_CS
++		},
++		.mss_shift	= TD0_MSS_SHIFT,
++		.opts_offset	= 0
++	},
++	[RTL_TD_1] = {
++		.checksum = {
++			.udp	= TD1_IP_CS | TD1_UDP_CS,
++			.tcp	= TD1_IP_CS | TD1_TCP_CS
++		},
++		.mss_shift	= TD1_MSS_SHIFT,
++		.opts_offset	= 1
++	}
++};
++
++enum rtl_rx_desc_bit {
+ 	/* Rx private */
+ 	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
+ 	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
+@@ -531,8 +587,8 @@ struct rtl8169_private {
+ 	struct napi_struct napi;
+ 	spinlock_t lock;		/* spin lock flag */
+ 	u32 msg_enable;
+-	int chipset;
+-	int mac_version;
++	u16 txd_version;
++	u16 mac_version;
+ 	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
+ 	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
+ 	u32 dirty_rx;
+@@ -1317,6 +1373,14 @@ static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
+ 	return 0;
+ }
+ 
++static int rtl8169_set_tso(struct net_device *dev, u32 data)
++{
++	if (dev->mtu > TD_MSS_MAX && data)
++		return -EINVAL;
++
++	return ethtool_op_set_tso(dev, data);
++}
++
+ #ifdef CONFIG_R8169_VLAN
+ 
+ static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
+@@ -1566,7 +1630,7 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
+ 	.set_rx_csum		= rtl8169_set_rx_csum,
+ 	.set_tx_csum		= ethtool_op_set_tx_csum,
+ 	.set_sg			= ethtool_op_set_sg,
+-	.set_tso		= ethtool_op_set_tso,
++	.set_tso		= rtl8169_set_tso,
+ 	.get_regs		= rtl8169_get_regs,
+ 	.get_wol		= rtl8169_get_wol,
+ 	.set_wol		= rtl8169_set_wol,
+@@ -3247,7 +3311,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	struct mii_if_info *mii;
+ 	struct net_device *dev;
+ 	void __iomem *ioaddr;
+-	unsigned int i;
++	int chipset, i;
+ 	int rc;
+ 
+ 	if (netif_msg_drv(&debug)) {
+@@ -3382,7 +3446,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 			"driver bug, MAC version not found in rtl_chip_info\n");
+ 		goto err_out_msi_4;
+ 	}
+-	tp->chipset = i;
++	chipset = i;
++	tp->txd_version = rtl_chip_info[chipset].txd_version;
+ 
+ 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
+@@ -3450,8 +3515,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	pci_set_drvdata(pdev, dev);
+ 
+ 	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
+-		   rtl_chip_info[tp->chipset].name,
+-		   dev->base_addr, dev->dev_addr,
++		   rtl_chip_info[chipset].name, dev->base_addr, dev->dev_addr,
+ 		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
+ 
+ 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+@@ -3622,7 +3686,7 @@ static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 	u32 cfg = rtl8169_rx_config;
+ 
+-	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
++	cfg |= (RTL_R32(RxConfig) & RTL_RX_CONFIG_MASK);
+ 	RTL_W32(RxConfig, cfg);
+ 
+ 	/* Set DMA burst size and Interframe Gap Time */
+@@ -4338,6 +4402,9 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
+ 		return -EINVAL;
+ 
+ 	dev->mtu = new_mtu;
++	if (dev->mtu > TD_MSS_MAX)
++		dev->features &= ~NETIF_F_TSO;
++
+ 	return 0;
+ }
+ 
+@@ -4612,7 +4679,7 @@ static void rtl8169_tx_timeout(struct net_device *dev)
+ }
+ 
+ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
+-			      u32 opts1)
++			      u32 *opts)
+ {
+ 	struct skb_shared_info *info = skb_shinfo(skb);
+ 	unsigned int cur_frag, entry;
+@@ -4640,9 +4707,11 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
+ 		}
+ 
+ 		/* anti gcc 2.95.3 bugware (sic) */
+-		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
++		status = opts[0] | len |
++			(RingEnd * !((entry + 1) % NUM_TX_DESC));
+ 
+ 		txd->opts1 = cpu_to_le32(status);
++		txd->opts2 = cpu_to_le32(opts[1]);
+ 		txd->addr = cpu_to_le64(mapping);
+ 
+ 		tp->tx_skb[entry].len = len;
+@@ -4660,24 +4729,26 @@ err_out:
+ 	return -EIO;
+ }
+ 
+-static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
++static inline void rtl8169_tso_csum(struct rtl8169_private *tp,
++				    struct sk_buff *skb, u32 *opts)
+ {
+-	if (dev->features & NETIF_F_TSO) {
+-		u32 mss = skb_shinfo(skb)->gso_size;
++	const struct rtl_tx_desc_info *info = tx_desc_info + tp->txd_version;
++	u32 mss = skb_shinfo(skb)->gso_size;
++	int offset = info->opts_offset;
+ 
+-		if (mss)
+-			return LargeSend | ((mss & MSSMask) << MSSShift);
+-	}
+-	if (skb->ip_summed == CHECKSUM_PARTIAL) {
++	if (mss) {
++		opts[0] |= TD_LSO;
++		opts[offset] |= min(mss, TD_MSS_MAX) << info->mss_shift;
++	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ 		const struct iphdr *ip = ip_hdr(skb);
+ 
+ 		if (ip->protocol == IPPROTO_TCP)
+-			return IPCS | TCPCS;
++			opts[offset] |= info->checksum.tcp;
+ 		else if (ip->protocol == IPPROTO_UDP)
+-			return IPCS | UDPCS;
+-		WARN_ON(1);	/* we need a WARN() */
++			opts[offset] |= info->checksum.udp;
++		else
++			WARN_ON_ONCE(1);
+ 	}
+-	return 0;
+ }
+ 
+ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+@@ -4690,7 +4761,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ 	struct device *d = &tp->pci_dev->dev;
+ 	dma_addr_t mapping;
+ 	u32 status, len;
+-	u32 opts1;
++	u32 opts[2];
+ 	int frags;
+ 
+ 	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
+@@ -4711,24 +4782,28 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ 
+ 	tp->tx_skb[entry].len = len;
+ 	txd->addr = cpu_to_le64(mapping);
+-	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
+ 
+-	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
++	opts[1] = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
++	opts[0] = DescOwn;
++
++	rtl8169_tso_csum(tp, skb, opts);
+ 
+-	frags = rtl8169_xmit_frags(tp, skb, opts1);
++	frags = rtl8169_xmit_frags(tp, skb, opts);
+ 	if (frags < 0)
+ 		goto err_dma_1;
+ 	else if (frags)
+-		opts1 |= FirstFrag;
++		opts[0] |= FirstFrag;
+ 	else {
+-		opts1 |= FirstFrag | LastFrag;
++		opts[0] |= FirstFrag | LastFrag;
+ 		tp->tx_skb[entry].skb = skb;
+ 	}
+ 
++	txd->opts2 = cpu_to_le32(opts[1]);
++
+ 	wmb();
+ 
+ 	/* anti gcc 2.95.3 bugware (sic) */
+-	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
++	status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
+ 	txd->opts1 = cpu_to_le32(status);
+ 
+ 	tp->cur_tx += frags + 1;
+@@ -5216,7 +5291,7 @@ static void rtl_set_rx_mode(struct net_device *dev)
+ 	spin_lock_irqsave(&tp->lock, flags);
+ 
+ 	tmp = rtl8169_rx_config | rx_mode |
+-	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
++	      (RTL_R32(RxConfig) & RTL_RX_CONFIG_MASK);
+ 
+ 	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
+ 		u32 data = mc_filter[0];
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0056-r8169-don-t-request-firmware-when-there-s-no-userspa.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0056-r8169-don-t-request-firmware-when-there-s-no-userspa.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,218 @@
+From: =?UTF-8?q?Fran=C3=A7ois=20Romieu?= <romieu at fr.zoreil.com>
+Date: Sun, 24 Apr 2011 17:38:48 +0200
+Subject: [PATCH 56/71] r8169: don't request firmware when there's no
+ userspace.
+
+commit 953a12cc2889d1be92e80a2d0bab5ffef4942300 upstream.
+
+The firmware is cached during the first successfull call to open() and
+released once the network device is unregistered. The driver uses the
+cached firmware between open() and unregister_netdev().
+
+So far the firmware is optional : a failure to load the firmware does
+not prevent open() to success. It is thus necessary to 1) unregister
+all 816x / 810[23] devices and 2) force a driver probe to issue a new
+firmware load.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Fixed-by: Ciprian Docan <docan at eden.rutgers.edu>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+[bwh: Adjust context for omitted runtime PM changes]
+---
+ drivers/net/r8169.c |   99 ++++++++++++++++++++++++++++++++++++--------------
+ 1 files changed, 71 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index f196469..128b80a 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -183,6 +183,16 @@ static const struct {
+ };
+ #undef _R
+ 
++static const struct rtl_firmware_info {
++	int mac_version;
++	const char *fw_name;
++} rtl_firmware_infos[] = {
++	{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 },
++	{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 },
++	{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 },
++	{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 }
++};
++
+ enum cfg_version {
+ 	RTL_CFG_0 = 0x00,
+ 	RTL_CFG_1,
+@@ -635,6 +645,7 @@ struct rtl8169_private {
+ 	u32 saved_wolopts;
+ 
+ 	const struct firmware *fw;
++#define RTL_FIRMWARE_UNKNOWN	ERR_PTR(-EAGAIN);
+ };
+ 
+ MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev at vger.kernel.org>");
+@@ -1907,25 +1918,26 @@ 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;
++	if (!IS_ERR_OR_NULL(tp->fw))
++		release_firmware(tp->fw);
++	tp->fw = RTL_FIRMWARE_UNKNOWN;
+ }
+ 
+-static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name)
++static void rtl_apply_firmware(struct rtl8169_private *tp)
+ {
+-	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;
+-	}
++	const struct firmware *fw = tp->fw;
+ 
+ 	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
+-	rtl_phy_write_fw(tp, *fw);
+-out:
+-	return rc;
++	if (!IS_ERR_OR_NULL(fw))
++		rtl_phy_write_fw(tp, fw);
++}
++
++static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
++{
++	if (rtl_readphy(tp, reg) != val)
++		netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n");
++	else
++		rtl_apply_firmware(tp);
+ }
+ 
+ static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
+@@ -2364,10 +2376,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 	rtl_writephy(tp, 0x1f, 0x0005);
+ 	rtl_writephy(tp, 0x05, 0x001b);
+-	if ((rtl_readphy(tp, 0x06) != 0xbf00) ||
+-	    (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) {
+-		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
+-	}
++
++	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
+ 
+ 	rtl_writephy(tp, 0x1f, 0x0000);
+ }
+@@ -2469,10 +2479,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 	rtl_writephy(tp, 0x1f, 0x0005);
+ 	rtl_writephy(tp, 0x05, 0x001b);
+-	if ((rtl_readphy(tp, 0x06) != 0xb300) ||
+-	    (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) {
+-		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
+-	}
++
++	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
+ 
+ 	rtl_writephy(tp, 0x1f, 0x0000);
+ }
+@@ -2679,8 +2687,7 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
+ 	rtl_writephy(tp, 0x18, 0x0310);
+ 	msleep(100);
+ 
+-	if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0)
+-		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
++	rtl_apply_firmware(tp);
+ 
+ 	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
+ }
+@@ -3508,6 +3515,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	tp->timer.data = (unsigned long) dev;
+ 	tp->timer.function = rtl8169_phy_timer;
+ 
++	tp->fw = RTL_FIRMWARE_UNKNOWN;
++
+ 	rc = register_netdev(dev);
+ 	if (rc < 0)
+ 		goto err_out_msi_4;
+@@ -3565,10 +3574,10 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 
+ 	flush_scheduled_work();
+ 
+-	rtl_release_firmware(tp);
+-
+ 	unregister_netdev(dev);
+ 
++	rtl_release_firmware(tp);
++
+ 	if (pci_dev_run_wake(pdev)) {
+ 		pm_runtime_disable(&pdev->dev);
+ 		pm_runtime_set_suspended(&pdev->dev);
+@@ -3583,6 +3592,37 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 	pci_set_drvdata(pdev, NULL);
+ }
+ 
++static void rtl_request_firmware(struct rtl8169_private *tp)
++{
++	int i;
++
++	/* Return early if the firmware is already loaded / cached. */
++	if (!IS_ERR(tp->fw))
++		goto out;
++
++	for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
++		const struct rtl_firmware_info *info = rtl_firmware_infos + i;
++
++		if (info->mac_version == tp->mac_version) {
++			const char *name = info->fw_name;
++			int rc;
++
++			rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev);
++			if (rc < 0) {
++				netif_warn(tp, ifup, tp->dev, "unable to load "
++					"firmware patch %s (%d)\n", name, rc);
++				goto out_disable_request_firmware;
++			}
++			goto out;
++		}
++	}
++
++out_disable_request_firmware:
++	tp->fw = NULL;
++out:
++	return;
++}
++
+ static int rtl8169_open(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+@@ -3614,11 +3654,13 @@ static int rtl8169_open(struct net_device *dev)
+ 
+ 	smp_mb();
+ 
++	rtl_request_firmware(tp);
++
+ 	retval = request_irq(dev->irq, rtl8169_interrupt,
+ 			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
+ 			     dev->name, dev);
+ 	if (retval < 0)
+-		goto err_release_ring_2;
++		goto err_release_fw_2;
+ 
+ 	napi_enable(&tp->napi);
+ 
+@@ -3644,7 +3686,8 @@ static int rtl8169_open(struct net_device *dev)
+ out:
+ 	return retval;
+ 
+-err_release_ring_2:
++err_release_fw_2:
++	rtl_release_firmware(tp);
+ 	rtl8169_rx_clear(tp);
+ err_free_rx_1:
+ 	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0057-r8169-fix-merge-conflict-fix.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0057-r8169-fix-merge-conflict-fix.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,81 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Wed, 27 Apr 2011 13:52:22 -0700
+Subject: [PATCH 57/71] r8169: fix merge conflict fix.
+
+commit 15ecd039b7182d725f4294e01f2fb12c3a88db17 upstream.
+
+- use adequate MAC_VER id
+  (see 01dc7fec4025f6bb72b6b98ec88b375346b6dbbb)
+- remove duplicate rtl_firmware_info record
+- remove duplicate functions
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Drop inapplicable changes]
+---
+ drivers/net/r8169.c |   26 ++++++--------------------
+ 1 files changed, 6 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 128b80a..64c5ea0 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -190,7 +190,9 @@ static const struct rtl_firmware_info {
+ 	{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 },
+ 	{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 },
+ 	{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 }
++	{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 },
++	{ .mac_version = RTL_GIGA_MAC_VER_32, .fw_name = FIRMWARE_8168E_1 },
++	{ .mac_version = RTL_GIGA_MAC_VER_33, .fw_name = FIRMWARE_8168E_2 }
+ };
+ 
+ enum cfg_version {
+@@ -2592,6 +2594,8 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
+ 		{ 0x1f, 0x0000 }
+ 	};
+ 
++	rtl_apply_firmware(tp);
++
+ 	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
+ 
+ 	/* DCO enable for 10M IDLE Power */
+@@ -2633,22 +2637,6 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
+ 	rtl_writephy(tp, 0x0d, 0x0000);
+ }
+ 
+-static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
+-{
+-	if (rtl_apply_firmware(tp, FIRMWARE_8168E_1) < 0)
+-		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
+-
+-	rtl8168e_hw_phy_config(tp);
+-}
+-
+-static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
+-{
+-	if (rtl_apply_firmware(tp, FIRMWARE_8168E_2) < 0)
+-		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
+-
+-	rtl8168e_hw_phy_config(tp);
+-}
+-
+ static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
+ {
+ 	static const struct phy_reg phy_reg_init[] = {
+@@ -2764,10 +2752,8 @@ static void rtl_hw_phy_config(struct net_device *dev)
+ 		rtl8105e_hw_phy_config(tp);
+ 		break;
+ 	case RTL_GIGA_MAC_VER_32:
+-		rtl8168e_1_hw_phy_config(tp);
+-		break;
+ 	case RTL_GIGA_MAC_VER_33:
+-		rtl8168e_2_hw_phy_config(tp);
++		rtl8168e_hw_phy_config(tp);
+ 		break;
+ 
+ 	default:
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0058-ethtool-Use-full-32-bit-speed-range-in-ethtool-s-set.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0058-ethtool-Use-full-32-bit-speed-range-in-ethtool-s-set.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,38 @@
+From: David Decotigny <decot at google.com>
+Date: Wed, 27 Apr 2011 18:32:39 +0000
+Subject: [PATCH 58/71] ethtool: Use full 32 bit speed range in ethtool's
+ set_settings
+
+commit 25db0338813a8915457636b1f6abe6a28fa73f8d upstream.
+
+This makes sure the ethtool's set_settings() callback of network
+drivers don't ignore the 16 most significant bits when ethtool calls
+their set_settings().
+
+All drivers compiled with make allyesconfig on x86_64 have been
+updated.
+
+Signed-off-by: David Decotigny <decot at google.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Restricted to drivers/net/r8169.c]
+---
+ drivers/net/r8169.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 64c5ea0..77370c0 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1352,7 +1352,8 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ 
+ 	spin_lock_irqsave(&tp->lock, flags);
+ 	ret = rtl8169_set_speed(dev,
+-		cmd->autoneg, cmd->speed, cmd->duplex, cmd->advertising);
++				cmd->autoneg, ethtool_cmd_speed(cmd),
++				cmd->duplex, cmd->advertising);
+ 	spin_unlock_irqrestore(&tp->lock, flags);
+ 
+ 	return ret;
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0059-ethtool-cosmetic-Use-ethtool-ethtool_cmd_speed-API.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0059-ethtool-cosmetic-Use-ethtool-ethtool_cmd_speed-API.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,44 @@
+From: David Decotigny <decot at google.com>
+Date: Wed, 27 Apr 2011 18:32:40 +0000
+Subject: [PATCH 59/71] ethtool: cosmetic: Use ethtool ethtool_cmd_speed API
+
+commit 707394972093e2056e1e8cc39be19cf9bcb3e7b3 upstream.
+
+This updates the network drivers so that they don't access the
+ethtool_cmd::speed field directly, but use ethtool_cmd_speed()
+instead.
+
+For most of the drivers, these changes are purely cosmetic and don't
+fix any problem, such as for those 1GbE/10GbE drivers that indirectly
+call their own ethtool get_settings()/mii_ethtool_gset(). The changes
+are meant to enforce code consistency and provide robustness with
+future larger throughputs, at the expense of a few CPU cycles for each
+ethtool operation.
+
+All drivers compiled with make allyesconfig ion x86_64 have been
+updated.
+
+Tested: make allyesconfig on x86_64 + e1000e/bnx2x work
+Signed-off-by: David Decotigny <decot at google.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Restricted to drivers/net/r8169.c]
+---
+ drivers/net/r8169.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 77370c0..31503a1 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1477,7 +1477,7 @@ static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
+ 	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
+ 	cmd->autoneg = !!(status & TBINwEnable);
+ 
+-	cmd->speed = SPEED_1000;
++	ethtool_cmd_speed_set(cmd, SPEED_1000);
+ 	cmd->duplex = DUPLEX_FULL; /* Always set */
+ 
+ 	return 0;
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0060-r8169-style-cleanups.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0060-r8169-style-cleanups.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,525 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 1 Apr 2011 10:21:07 +0200
+Subject: [PATCH 60/71] r8169: style cleanups.
+
+commit cecb5fd7c277c1bba161980bb41792a60b56df4a upstream.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+[bwh: Adjust context for omitted runtime PM changes]
+---
+ drivers/net/r8169.c |  206 ++++++++++++++++++++++++---------------------------
+ 1 files changed, 98 insertions(+), 108 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 31503a1..5c18152 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -345,7 +345,7 @@ enum rtl8168_registers {
+ #define OCPAR_GPHY_READ_CMD		0x0000f060
+ 	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
+ 	MISC			= 0xf0,	/* 8168e only. */
+-	txpla_rst			= (1 << 29)
++#define TXPLA_RST			(1 << 29)
+ };
+ 
+ enum rtl_register_content {
+@@ -423,7 +423,7 @@ enum rtl_register_content {
+ 	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
+ 	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
+ 	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
+-	spi_en		= (1 << 3),
++	Spi_en		= (1 << 3),
+ 	LanWake		= (1 << 1),	/* LanWake enable/disable */
+ 	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
+ 
+@@ -594,10 +594,10 @@ struct rtl8169_counters {
+ 
+ struct rtl8169_private {
+ 	void __iomem *mmio_addr;	/* memory map physical address */
+-	struct pci_dev *pci_dev;	/* Index of PCI device */
++	struct pci_dev *pci_dev;
+ 	struct net_device *dev;
+ 	struct napi_struct napi;
+-	spinlock_t lock;		/* spin lock flag */
++	spinlock_t lock;
+ 	u32 msg_enable;
+ 	u16 txd_version;
+ 	u16 mac_version;
+@@ -733,17 +733,19 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
+ #define OOB_CMD_DRIVER_START	0x05
+ #define OOB_CMD_DRIVER_STOP	0x06
+ 
++static u16 rtl8168_get_ocp_reg(struct rtl8169_private *tp)
++{
++	return (tp->mac_version == RTL_GIGA_MAC_VER_31) ? 0xb8 : 0x10;
++}
++
+ static void rtl8168_driver_start(struct rtl8169_private *tp)
+ {
++	u16 reg;
+ 	int i;
+-	u32 reg;
+ 
+ 	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
+ 
+-	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
+-		reg = 0xb8;
+-	else
+-		reg = 0x10;
++	reg = rtl8168_get_ocp_reg(tp);
+ 
+ 	for (i = 0; i < 10; i++) {
+ 		msleep(10);
+@@ -754,15 +756,12 @@ static void rtl8168_driver_start(struct rtl8169_private *tp)
+ 
+ static void rtl8168_driver_stop(struct rtl8169_private *tp)
+ {
++	u16 reg;
+ 	int i;
+-	u32 reg;
+ 
+ 	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
+ 
+-	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
+-		reg = 0xb8;
+-	else
+-		reg = 0x10;
++	reg = rtl8168_get_ocp_reg(tp);
+ 
+ 	for (i = 0; i < 10; i++) {
+ 		msleep(10);
+@@ -773,17 +772,9 @@ static void rtl8168_driver_stop(struct rtl8169_private *tp)
+ 
+ static int r8168dp_check_dash(struct rtl8169_private *tp)
+ {
+-	u32 reg;
+-
+-	if (tp->mac_version == RTL_GIGA_MAC_VER_31)
+-		reg = 0xb8;
+-	else
+-		reg = 0x10;
++	u16 reg = rtl8168_get_ocp_reg(tp);
+ 
+-	if (ocp_read(tp, 0xF, reg) & 0x00008000)
+-		return 1;
+-	else
+-		return 0;
++	return (ocp_read(tp, 0x0f, reg) & 0x00008000) ? 1 : 0;
+ }
+ 
+ static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
+@@ -1083,9 +1074,8 @@ static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
+ }
+ 
+ static void __rtl8169_check_link_status(struct net_device *dev,
+-				      struct rtl8169_private *tp,
+-				      void __iomem *ioaddr,
+-				      bool pm)
++					struct rtl8169_private *tp,
++					void __iomem *ioaddr, bool pm)
+ {
+ 	unsigned long flags;
+ 
+@@ -1271,16 +1261,16 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
+ 
+ 		/* The 8100e/8101e/8102e do Fast Ethernet only. */
+-		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_16) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_29) &&
+-		    (tp->mac_version != RTL_GIGA_MAC_VER_30)) {
++		if (tp->mac_version != RTL_GIGA_MAC_VER_07 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_08 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_09 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_10 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_13 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_14 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_15 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_16 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_29 &&
++		    tp->mac_version != RTL_GIGA_MAC_VER_30) {
+ 			if (adv & ADVERTISED_1000baseT_Half)
+ 				giga_ctrl |= ADVERTISE_1000HALF;
+ 			if (adv & ADVERTISED_1000baseT_Full)
+@@ -1314,8 +1304,8 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 
+ 	rtl_writephy(tp, MII_BMCR, bmcr);
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
++	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
+ 		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
+ 			rtl_writephy(tp, 0x17, 0x2138);
+ 			rtl_writephy(tp, 0x0e, 0x0260);
+@@ -1351,8 +1341,7 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ 	int ret;
+ 
+ 	spin_lock_irqsave(&tp->lock, flags);
+-	ret = rtl8169_set_speed(dev,
+-				cmd->autoneg, ethtool_cmd_speed(cmd),
++	ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
+ 				cmd->duplex, cmd->advertising);
+ 	spin_unlock_irqrestore(&tp->lock, flags);
+ 
+@@ -1562,11 +1551,11 @@ static void rtl8169_update_counters(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	void __iomem *ioaddr = tp->mmio_addr;
++	struct device *d = &tp->pci_dev->dev;
+ 	struct rtl8169_counters *counters;
+ 	dma_addr_t paddr;
+ 	u32 cmd;
+ 	int wait = 1000;
+-	struct device *d = &tp->pci_dev->dev;
+ 
+ 	/*
+ 	 * Some chips are unable to dump tally counters when the receiver
+@@ -1586,7 +1575,6 @@ static void rtl8169_update_counters(struct net_device *dev)
+ 
+ 	while (wait--) {
+ 		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
+-			/* copy updated counters */
+ 			memcpy(&tp->counters, counters, sizeof(*counters));
+ 			break;
+ 		}
+@@ -1811,14 +1799,14 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
+ 		case PHY_BJMPN:
+ 			if (regno > index) {
+ 				netif_err(tp, probe, tp->dev,
+-					"Out of range of firmware\n");
++					  "Out of range of firmware\n");
+ 				return;
+ 			}
+ 			break;
+ 		case PHY_READCOUNT_EQ_SKIP:
+ 			if (index + 2 >= fw_size) {
+ 				netif_err(tp, probe, tp->dev,
+-					"Out of range of firmware\n");
++					  "Out of range of firmware\n");
+ 				return;
+ 			}
+ 			break;
+@@ -1827,7 +1815,7 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
+ 		case PHY_SKIPN:
+ 			if (index + 1 + regno >= fw_size) {
+ 				netif_err(tp, probe, tp->dev,
+-					"Out of range of firmware\n");
++					  "Out of range of firmware\n");
+ 				return;
+ 			}
+ 			break;
+@@ -1883,10 +1871,7 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
+ 			index++;
+ 			break;
+ 		case PHY_READCOUNT_EQ_SKIP:
+-			if (count == data)
+-				index += 2;
+-			else
+-				index += 1;
++			index += (count == data) ? 2 : 1;
+ 			break;
+ 		case PHY_COMP_EQ_SKIPN:
+ 			if (predata == data)
+@@ -2297,7 +2282,7 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 		/*
+ 		 * Tx Error Issue
+-		 * enhance line driver power
++		 * Enhance line driver power
+ 		 */
+ 		{ 0x1f, 0x0002 },
+ 		{ 0x06, 0x5561 },
+@@ -2409,7 +2394,7 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
+ 
+ 		/*
+ 		 * Tx Error Issue
+-		 * enhance line driver power
++		 * Enhance line driver power
+ 		 */
+ 		{ 0x1f, 0x0002 },
+ 		{ 0x06, 0x5561 },
+@@ -2608,7 +2593,7 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
+ 	/* For impedance matching */
+ 	rtl_writephy(tp, 0x1f, 0x0002);
+ 	rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00);
+-	rtl_writephy(tp, 0x1F, 0x0000);
++	rtl_writephy(tp, 0x1f, 0x0000);
+ 
+ 	/* PHY auto speed down */
+ 	rtl_writephy(tp, 0x1f, 0x0007);
+@@ -2752,6 +2737,9 @@ static void rtl_hw_phy_config(struct net_device *dev)
+ 	case RTL_GIGA_MAC_VER_30:
+ 		rtl8105e_hw_phy_config(tp);
+ 		break;
++	case RTL_GIGA_MAC_VER_31:
++		/* None. */
++		break;
+ 	case RTL_GIGA_MAC_VER_32:
+ 	case RTL_GIGA_MAC_VER_33:
+ 		rtl8168e_hw_phy_config(tp);
+@@ -2888,11 +2876,11 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
+ 	rtl8169_phy_reset(dev, tp);
+ 
+ 	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
+-		ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
+-		ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
+-		(tp->mii.supports_gmii ?
+-			ADVERTISED_1000baseT_Half |
+-			ADVERTISED_1000baseT_Full : 0));
++			  ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
++			  ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
++			  (tp->mii.supports_gmii ?
++			   ADVERTISED_1000baseT_Half |
++			   ADVERTISED_1000baseT_Full : 0));
+ 
+ 	if (RTL_R8(PHYstatus) & TBI_Enable)
+ 		netif_info(tp, link, dev, "TBI auto-negotiating\n");
+@@ -2945,7 +2933,8 @@ static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+ 	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
+ }
+ 
+-static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
++static int rtl_xmii_ioctl(struct rtl8169_private *tp,
++			  struct mii_ioctl_data *data, int cmd)
+ {
+ 	switch (cmd) {
+ 	case SIOCGMIIPHY:
+@@ -3168,15 +3157,15 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
+ {
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 
+-	if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
++	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
++	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
++	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
+ 	    r8168dp_check_dash(tp)) {
+ 		return;
+ 	}
+ 
+-	if (((tp->mac_version == RTL_GIGA_MAC_VER_23) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_24)) &&
++	if ((tp->mac_version == RTL_GIGA_MAC_VER_23 ||
++	     tp->mac_version == RTL_GIGA_MAC_VER_24) &&
+ 	    (RTL_R16(CPlusCmd) & ASF)) {
+ 		return;
+ 	}
+@@ -3213,9 +3202,9 @@ static void r8168_pll_power_up(struct rtl8169_private *tp)
+ {
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 
+-	if (((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
+-	     (tp->mac_version == RTL_GIGA_MAC_VER_31)) &&
++	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
++	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
++	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
+ 	    r8168dp_check_dash(tp)) {
+ 		return;
+ 	}
+@@ -3514,9 +3503,9 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 		   rtl_chip_info[chipset].name, dev->base_addr, dev->dev_addr,
+ 		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
++	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
+ 		rtl8168_driver_start(tp);
+ 	}
+ 
+@@ -3553,9 +3542,9 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 
+ 	pm_runtime_get_sync(&pdev->dev);
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_27) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_28) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_31)) {
++	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
+ 		rtl8168_driver_stop(tp);
+ 	}
+ 
+@@ -3811,26 +3800,26 @@ static void rtl_hw_start_8169(struct net_device *dev)
+ 	}
+ 
+ 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
++	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_04)
+ 		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 
+ 	RTL_W8(EarlyTxThres, NoEarlyTx);
+ 
+ 	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
++	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_04)
+ 		rtl_set_rx_tx_config_registers(tp);
+ 
+ 	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
++	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
+ 		dprintk("Set MAC Reg C+CR Offset 0xE0. "
+ 			"Bit-3 and bit-14 MUST be 1\n");
+ 		tp->cp_cmd |= (1 << 14);
+@@ -3848,10 +3837,10 @@ static void rtl_hw_start_8169(struct net_device *dev)
+ 
+ 	rtl_set_rx_tx_desc_registers(tp, ioaddr);
+ 
+-	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
+-	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
+-	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
+-	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
++	if (tp->mac_version != RTL_GIGA_MAC_VER_01 &&
++	    tp->mac_version != RTL_GIGA_MAC_VER_02 &&
++	    tp->mac_version != RTL_GIGA_MAC_VER_03 &&
++	    tp->mac_version != RTL_GIGA_MAC_VER_04) {
+ 		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 		rtl_set_rx_tx_config_registers(tp);
+ 	}
+@@ -4161,10 +4150,10 @@ static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
+ 	rtl_disable_clock_request(pdev);
+ 
+ 	/* Reset tx FIFO pointer */
+-	RTL_W32(MISC, RTL_R32(MISC) | txpla_rst);
+-	RTL_W32(MISC, RTL_R32(MISC) & ~txpla_rst);
++	RTL_W32(MISC, RTL_R32(MISC) | TXPLA_RST);
++	RTL_W32(MISC, RTL_R32(MISC) & ~TXPLA_RST);
+ 
+-	RTL_W8(Config5, RTL_R8(Config5) & ~spi_en);
++	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
+ }
+ 
+ static void rtl_hw_start_8168(struct net_device *dev)
+@@ -4248,6 +4237,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
+ 	case RTL_GIGA_MAC_VER_28:
+ 		rtl_hw_start_8168d_4(ioaddr, pdev);
+ 		break;
++
+ 	case RTL_GIGA_MAC_VER_31:
+ 		rtl_hw_start_8168dp(ioaddr, pdev);
+ 		break;
+@@ -4344,10 +4334,10 @@ static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
+ 		{ 0x0a,	0, 0x0020 }
+ 	};
+ 
+-	/* Force LAN exit from ASPM if Rx/Tx are not idel */
++	/* Force LAN exit from ASPM if Rx/Tx are not idle */
+ 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
+ 
+-	/* disable Early Tally Counter */
++	/* Disable Early Tally Counter */
+ 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
+ 
+ 	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
+@@ -4368,8 +4358,8 @@ static void rtl_hw_start_8101(struct net_device *dev)
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 	struct pci_dev *pdev = tp->pci_dev;
+ 
+-	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
+-	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
++	if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
++	    tp->mac_version == RTL_GIGA_MAC_VER_16) {
+ 		int cap = tp->pcie_cap;
+ 
+ 		if (cap) {
+@@ -4736,7 +4726,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
+ 			goto err_out;
+ 		}
+ 
+-		/* anti gcc 2.95.3 bugware (sic) */
++		/* Anti gcc 2.95.3 bugware (sic) */
+ 		status = opts[0] | len |
+ 			(RingEnd * !((entry + 1) % NUM_TX_DESC));
+ 
+@@ -4832,7 +4822,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ 
+ 	wmb();
+ 
+-	/* anti gcc 2.95.3 bugware (sic) */
++	/* Anti gcc 2.95.3 bugware (sic) */
+ 	status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
+ 	txd->opts1 = cpu_to_le32(status);
+ 
+@@ -4840,7 +4830,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ 
+ 	wmb();
+ 
+-	RTL_W8(TxPoll, NPQ);	/* set polling bit */
++	RTL_W8(TxPoll, NPQ);
+ 
+ 	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
+ 		netif_stop_queue(dev);
+@@ -5266,7 +5256,7 @@ static int rtl8169_close(struct net_device *dev)
+ 
+ 	pm_runtime_get_sync(&pdev->dev);
+ 
+-	/* update counters before going down */
++	/* Update counters before going down */
+ 	rtl8169_update_counters(dev);
+ 
+ 	rtl8169_down(dev);
+@@ -5459,15 +5449,15 @@ static int rtl8169_runtime_idle(struct device *device)
+ }
+ 
+ static const struct dev_pm_ops rtl8169_pm_ops = {
+-	.suspend = rtl8169_suspend,
+-	.resume = rtl8169_resume,
+-	.freeze = rtl8169_suspend,
+-	.thaw = rtl8169_resume,
+-	.poweroff = rtl8169_suspend,
+-	.restore = rtl8169_resume,
+-	.runtime_suspend = rtl8169_runtime_suspend,
+-	.runtime_resume = rtl8169_runtime_resume,
+-	.runtime_idle = rtl8169_runtime_idle,
++	.suspend		= rtl8169_suspend,
++	.resume			= rtl8169_resume,
++	.freeze			= rtl8169_suspend,
++	.thaw			= rtl8169_resume,
++	.poweroff		= rtl8169_suspend,
++	.restore		= rtl8169_resume,
++	.runtime_suspend	= rtl8169_runtime_suspend,
++	.runtime_resume		= rtl8169_runtime_resume,
++	.runtime_idle		= rtl8169_runtime_idle,
+ };
+ 
+ #define RTL8169_PM_OPS	(&rtl8169_pm_ops)
+@@ -5486,7 +5476,7 @@ static void rtl_shutdown(struct pci_dev *pdev)
+ 
+ 	rtl8169_net_suspend(dev);
+ 
+-	/* restore original MAC address */
++	/* Restore original MAC address */
+ 	rtl_rar_set(tp, dev->perm_addr);
+ 
+ 	spin_lock_irq(&tp->lock);
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0061-r8169-remove-some-code-duplication.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0061-r8169-remove-some-code-duplication.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,103 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 29 Apr 2011 15:05:51 +0200
+Subject: [PATCH 61/71] r8169: remove some code duplication.
+
+commit 6f43adc88f49cb8164fbd665e968de4de380dc35 upstream.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+---
+ drivers/net/r8169.c |   42 +++++++++++++++++++-----------------------
+ 1 files changed, 19 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 5c18152..ed8cf86 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -3285,6 +3285,22 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
+ 	}
+ }
+ 
++static void rtl_hw_reset(struct rtl8169_private *tp)
++{
++	void __iomem *ioaddr = tp->mmio_addr;
++	int i;
++
++	/* Soft reset the chip. */
++	RTL_W8(ChipCmd, CmdReset);
++
++	/* Check that the chip has finished the reset. */
++	for (i = 0; i < 100; i++) {
++		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
++			break;
++		msleep_interruptible(1);
++	}
++}
++
+ static int __devinit
+ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ {
+@@ -3384,6 +3400,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 		rc = -EIO;
+ 		goto err_out_free_res_3;
+ 	}
++	tp->mmio_addr = ioaddr;
+ 
+ 	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
+ 	if (!tp->pcie_cap)
+@@ -3391,15 +3408,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 
+ 	RTL_W16(IntrMask, 0x0000);
+ 
+-	/* Soft reset the chip. */
+-	RTL_W8(ChipCmd, CmdReset);
+-
+-	/* Check that the chip has finished the reset. */
+-	for (i = 0; i < 100; i++) {
+-		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
+-			break;
+-		msleep_interruptible(1);
+-	}
++	rtl_hw_reset(tp);
+ 
+ 	RTL_W16(IntrStatus, 0xffff);
+ 
+@@ -3463,8 +3472,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 
+ 	spin_lock_init(&tp->lock);
+ 
+-	tp->mmio_addr = ioaddr;
+-
+ 	/* Get MAC address */
+ 	for (i = 0; i < MAC_ADDR_LEN; i++)
+ 		dev->dev_addr[i] = RTL_R8(MAC0 + i);
+@@ -3716,25 +3723,14 @@ static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
+ static void rtl_hw_start(struct net_device *dev)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+-	void __iomem *ioaddr = tp->mmio_addr;
+-	unsigned int i;
+ 
+-	/* Soft reset the chip. */
+-	RTL_W8(ChipCmd, CmdReset);
+-
+-	/* Check that the chip has finished the reset. */
+-	for (i = 0; i < 100; i++) {
+-		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
+-			break;
+-		msleep_interruptible(1);
+-	}
++	rtl_hw_reset(tp);
+ 
+ 	tp->hw_start(dev);
+ 
+ 	netif_start_queue(dev);
+ }
+ 
+-
+ static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
+ 					 void __iomem *ioaddr)
+ {
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0062-r8169-rtl8169_set_speed_xmii-cleanup.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0062-r8169-rtl8169_set_speed_xmii-cleanup.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,48 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 11 Mar 2011 20:30:24 +0100
+Subject: [PATCH 62/71] r8169: rtl8169_set_speed_xmii cleanup.
+
+commit 826e6cbdadfa51495c7189641df2514cc48e23da upstream.
+
+Shorten chipset version test.
+
+No functional change.
+
+Careful readers will notice that the 'supports_gmii' flag is deduced
+from the device PCI id. Though less specific than the chipset related
+RTL_GIGA_MAC_VER_XY, it is good enough to detect a GMII deprieved 810x.
+Some features push for a device specific configuration (improved jumbo
+frame support for instance). 'supports_gmii' will follow this path
+if / when the device PCI id test stops working.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+---
+ drivers/net/r8169.c |   11 +----------
+ 1 files changed, 1 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index ed8cf86..4ad6ba3 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1261,16 +1261,7 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
+ 
+ 		/* The 8100e/8101e/8102e do Fast Ethernet only. */
+-		if (tp->mac_version != RTL_GIGA_MAC_VER_07 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_08 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_09 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_10 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_13 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_14 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_15 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_16 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_29 &&
+-		    tp->mac_version != RTL_GIGA_MAC_VER_30) {
++		if (tp->mii.supports_gmii) {
+ 			if (adv & ADVERTISED_1000baseT_Half)
+ 				giga_ctrl |= ADVERTISE_1000HALF;
+ 			if (adv & ADVERTISED_1000baseT_Full)
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0063-r8169-link-speed-selection-timer-rework.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0063-r8169-link-speed-selection-timer-rework.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,165 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 11 Mar 2011 21:07:11 +0100
+Subject: [PATCH 63/71] r8169: link speed selection timer rework.
+
+commit 4876cc1e49efac03827a51a2422cfbbb7f6335de upstream.
+
+The implementation was a bit krusty.
+
+The 10s rtl8169_phy_timer timer has been (was ?) required with older
+8169 for adequate phy operation when full gigabit is advertised in
+autonegotiated mode. The timer does nothing if the link is up.
+Otherwise it keeps resetting the phy until things improve.
+
+- the device private data field phy_1000_ctrl_reg was used to
+  schedule the timer. Avoid it and save a few bytes.
+
+- rtl8169_set_settings
+  pending timer is disabled before changing the link settings as
+  rtl8169_phy_timer is not always needed (see the removed test in
+  rtl8169_phy_timer).
+
+- rtl8169_set_speed
+  the requested link parameters may not match the chipset : bail out
+  early on failure.
+
+- rtl8169_open
+  Calling rtl8169_request_timer is redundant with
+  -> rtl8169_open
+     -> rtl8169_init_phy
+        -> rtl8169_set_speed
+           -> mod_timer
+  The latter always enables the phy timer whereas the former did not
+  for RTL_GIGA_MAC_VER_01. It should not make things worse but only
+  time will tell if reality agrees.
+
+- rtl8169_request_timer : unused yet. Removed.
+
+- rtl8169_delete_timer : useless. Bloat. Removed.
+
+Side effect : the timer may kick in if the TBI is enabled. I do not
+know if the TBI has ever been used in real life.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+[bwh: Adjust context for omitted VLAN changes]
+---
+ drivers/net/r8169.c |   44 +++++++++-----------------------------------
+ 1 files changed, 9 insertions(+), 35 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 4ad6ba3..436dbc7 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -616,7 +616,6 @@ struct rtl8169_private {
+ 	u16 intr_event;
+ 	u16 napi_event;
+ 	u16 intr_mask;
+-	int phy_1000_ctrl_reg;
+ #ifdef CONFIG_R8169_VLAN
+ 	struct vlan_group *vlgrp;
+ #endif
+@@ -1291,8 +1290,6 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+ 			bmcr |= BMCR_FULLDPLX;
+ 	}
+ 
+-	tp->phy_1000_ctrl_reg = giga_ctrl;
+-
+ 	rtl_writephy(tp, MII_BMCR, bmcr);
+ 
+ 	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
+@@ -1318,10 +1315,14 @@ static int rtl8169_set_speed(struct net_device *dev,
+ 	int ret;
+ 
+ 	ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
++	if (ret < 0)
++		goto out;
+ 
+-	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
++	if (netif_running(dev) && (autoneg == AUTONEG_ENABLE) &&
++	    (advertising & ADVERTISED_1000baseT_Full)) {
+ 		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
+-
++	}
++out:
+ 	return ret;
+ }
+ 
+@@ -1331,6 +1332,8 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ 	unsigned long flags;
+ 	int ret;
+ 
++	del_timer_sync(&tp->timer);
++
+ 	spin_lock_irqsave(&tp->lock, flags);
+ 	ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
+ 				cmd->duplex, cmd->advertising);
+@@ -2751,9 +2754,6 @@ static void rtl8169_phy_timer(unsigned long __opaque)
+ 
+ 	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
+ 
+-	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
+-		return;
+-
+ 	spin_lock_irq(&tp->lock);
+ 
+ 	if (tp->phy_reset_pending(tp)) {
+@@ -2778,28 +2778,6 @@ out_unlock:
+ 	spin_unlock_irq(&tp->lock);
+ }
+ 
+-static inline void rtl8169_delete_timer(struct net_device *dev)
+-{
+-	struct rtl8169_private *tp = netdev_priv(dev);
+-	struct timer_list *timer = &tp->timer;
+-
+-	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
+-		return;
+-
+-	del_timer_sync(timer);
+-}
+-
+-static inline void rtl8169_request_timer(struct net_device *dev)
+-{
+-	struct rtl8169_private *tp = netdev_priv(dev);
+-	struct timer_list *timer = &tp->timer;
+-
+-	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
+-		return;
+-
+-	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
+-}
+-
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+ /*
+  * Polling 'interrupt' - used by things like netconsole to send skbs
+@@ -3450,8 +3428,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
+ 		tp->link_ok = rtl8169_tbi_link_ok;
+ 		tp->do_ioctl = rtl_tbi_ioctl;
+-
+-		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
+ 	} else {
+ 		tp->set_speed = rtl8169_set_speed_xmii;
+ 		tp->get_settings = rtl8169_gset_xmii;
+@@ -3651,8 +3627,6 @@ static int rtl8169_open(struct net_device *dev)
+ 
+ 	rtl_hw_start(dev);
+ 
+-	rtl8169_request_timer(dev);
+-
+ 	tp->saved_wolopts = 0;
+ 	pm_runtime_put_noidle(&pdev->dev);
+ 
+@@ -5206,7 +5180,7 @@ static void rtl8169_down(struct net_device *dev)
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 	void __iomem *ioaddr = tp->mmio_addr;
+ 
+-	rtl8169_delete_timer(dev);
++	del_timer_sync(&tp->timer);
+ 
+ 	netif_stop_queue(dev);
+ 
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0064-r8169-remove-non-NAPI-context-invocation-of-rtl8169_.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0064-r8169-remove-non-NAPI-context-invocation-of-rtl8169_.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,134 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Tue, 15 Mar 2011 17:29:31 +0100
+Subject: [PATCH 64/71] r8169: remove non-NAPI context invocation of
+ rtl8169_rx_interrupt.
+
+commit 56de414c0c7333f1e1adedc23057e131ce84233e upstream.
+
+Invocation of rtl8169_rx_interrupt from rtl8169_reset_task was originally
+intended to retrieve as much packets as possible from the rx ring when a
+reset was needed. Nowadays rtl8169_reset_task is only scheduled, with
+some delay
+a. from the tx timeout watchdog
+b. when resuming
+c. from rtl8169_rx_interrupt itself
+
+It's dubious that the loss of outdated packets will matter much for a)
+and b). c) does not need to call itself again.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+[bwh: Adjust for omitted VLAN changes: remove polling flag from
+ rtl8169_rx_vlan_skb() as well as rx_interrupt()]
+---
+ drivers/net/r8169.c |   44 +++++++++++++-------------------------------
+ 1 files changed, 13 insertions(+), 31 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 436dbc7..f915100 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1409,7 +1409,7 @@ static void rtl8169_vlan_rx_register(struct net_device *dev,
+ }
+ 
+ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
+-			       struct sk_buff *skb, int polling)
++			       struct sk_buff *skb)
+ {
+ 	u32 opts2 = le32_to_cpu(desc->opts2);
+ 	struct vlan_group *vlgrp = tp->vlgrp;
+@@ -1418,10 +1418,7 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
+ 	if (vlgrp && (opts2 & RxVlanTag)) {
+ 		u16 vtag = swab16(opts2 & 0xffff);
+ 
+-		if (likely(polling))
+-			vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
+-		else
+-			__vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
++		vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
+ 		ret = 0;
+ 	} else
+ 		ret = -1;
+@@ -1438,7 +1435,7 @@ static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
+ }
+ 
+ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
+-			       struct sk_buff *skb, int polling)
++			       struct sk_buff *skb)
+ {
+ 	return -1;
+ }
+@@ -4623,6 +4620,7 @@ static void rtl8169_reset_task(struct work_struct *work)
+ 	struct rtl8169_private *tp =
+ 		container_of(work, struct rtl8169_private, task.work);
+ 	struct net_device *dev = tp->dev;
++	int i;
+ 
+ 	rtnl_lock();
+ 
+@@ -4631,19 +4629,15 @@ static void rtl8169_reset_task(struct work_struct *work)
+ 
+ 	rtl8169_wait_for_quiescence(dev);
+ 
+-	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
++	for (i = 0; i < NUM_RX_DESC; i++)
++		rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);
++
+ 	rtl8169_tx_clear(tp);
+ 
+-	if (tp->dirty_rx == tp->cur_rx) {
+-		rtl8169_init_ring_indexes(tp);
+-		rtl_hw_start(dev);
+-		netif_wake_queue(dev);
+-		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
+-	} else {
+-		if (net_ratelimit())
+-			netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
+-		rtl8169_schedule_work(dev, rtl8169_reset_task);
+-	}
++	rtl8169_init_ring_indexes(tp);
++	rtl_hw_start(dev);
++	netif_wake_queue(dev);
++	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
+ 
+ out_unlock:
+ 	rtnl_unlock();
+@@ -4948,20 +4942,12 @@ static struct sk_buff *rtl8169_try_rx_copy(void *data,
+ 	return skb;
+ }
+ 
+-/*
+- * Warning : rtl8169_rx_interrupt() might be called :
+- * 1) from NAPI (softirq) context
+- *	(polling = 1 : we should call netif_receive_skb())
+- * 2) from process context (rtl8169_reset_task())
+- *	(polling = 0 : we must call netif_rx() instead)
+- */
+ static int rtl8169_rx_interrupt(struct net_device *dev,
+ 				struct rtl8169_private *tp,
+ 				void __iomem *ioaddr, u32 budget)
+ {
+ 	unsigned int cur_rx, rx_left;
+ 	unsigned int count;
+-	int polling = (budget != ~(u32)0) ? 1 : 0;
+ 
+ 	cur_rx = tp->cur_rx;
+ 	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
+@@ -5019,12 +5005,8 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
+ 			skb_put(skb, pkt_size);
+ 			skb->protocol = eth_type_trans(skb, dev);
+ 
+-			if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
+-				if (likely(polling))
+-					napi_gro_receive(&tp->napi, skb);
+-				else
+-					netif_rx(skb);
+-			}
++			if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
++				napi_gro_receive(&tp->napi, skb);
+ 
+ 			dev->stats.rx_bytes += pkt_size;
+ 			dev->stats.rx_packets++;
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0065-r8169-provide-some-firmware-information-via-ethtool.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0065-r8169-provide-some-firmware-information-via-ethtool.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,126 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Tue, 26 Apr 2011 18:58:59 +0200
+Subject: [PATCH 65/71] r8169: provide some firmware information via ethtool.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 31bd204f97e3796c5cfcfc582a93a10e45b99946 upstream.
+
+There is no real firmware version yet but the manpage of ethtool
+is rather terse about the driver information.
+
+Former output:
+$ ethtool -i eth1
+driver: r8169
+version: 2.3LK-NAPI
+firmware-version:
+bus-info: 0000:01:00.0
+$ ethtool -i eth0
+driver: r8169
+version: 2.3LK-NAPI
+firmware-version:
+bus-info: 0000:03:00.0
+
+Current output:
+$ ethtool -i eth1
+driver: r8169
+version: 2.3LK-NAPI
+firmware-version: N/A
+bus-info: 0000:01:00.0
+
+$ ethtool -i eth0
+driver: r8169
+version: 2.3LK-NAPI
+firmware-version: rtl_nic/rtl8168d-1.fw
+bus-info: 0000:03:00.0
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Fixed-by Ciprian Docan <docan at eden.rutgers.edu>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+Cc: Fejes József <fejes at joco.name>
+Cc: Borislav Petkov <borislav.petkov at amd.com>
+---
+ drivers/net/r8169.c |   45 +++++++++++++++++++++++++--------------------
+ 1 files changed, 25 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index f915100..f8037db 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1191,6 +1191,19 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+ 	return 0;
+ }
+ 
++static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
++{
++	int i;
++
++	for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
++		const struct rtl_firmware_info *info = rtl_firmware_infos + i;
++
++		if (info->mac_version == tp->mac_version)
++			return info->fw_name;
++	}
++	return NULL;
++}
++
+ static void rtl8169_get_drvinfo(struct net_device *dev,
+ 				struct ethtool_drvinfo *info)
+ {
+@@ -1199,6 +1212,8 @@ static void rtl8169_get_drvinfo(struct net_device *dev,
+ 	strcpy(info->driver, MODULENAME);
+ 	strcpy(info->version, RTL8169_VERSION);
+ 	strcpy(info->bus_info, pci_name(tp->pci_dev));
++	strncpy(info->fw_version, IS_ERR_OR_NULL(tp->fw) ? "N/A" :
++		rtl_lookup_firmware_name(tp), sizeof(info->fw_version) - 1);
+ }
+ 
+ static int rtl8169_get_regs_len(struct net_device *dev)
+@@ -3541,33 +3556,23 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
+ 
+ static void rtl_request_firmware(struct rtl8169_private *tp)
+ {
+-	int i;
+-
+ 	/* Return early if the firmware is already loaded / cached. */
+-	if (!IS_ERR(tp->fw))
+-		goto out;
+-
+-	for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
+-		const struct rtl_firmware_info *info = rtl_firmware_infos + i;
++	if (IS_ERR(tp->fw)) {
++		const char *name;
+ 
+-		if (info->mac_version == tp->mac_version) {
+-			const char *name = info->fw_name;
++		name = rtl_lookup_firmware_name(tp);
++		if (name) {
+ 			int rc;
+ 
+ 			rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev);
+-			if (rc < 0) {
+-				netif_warn(tp, ifup, tp->dev, "unable to load "
+-					"firmware patch %s (%d)\n", name, rc);
+-				goto out_disable_request_firmware;
+-			}
+-			goto out;
++			if (rc >= 0)
++				return;
++
++			netif_warn(tp, ifup, tp->dev, "unable to load "
++				"firmware patch %s (%d)\n", name, rc);
+ 		}
++		tp->fw = NULL;
+ 	}
+-
+-out_disable_request_firmware:
+-	tp->fw = NULL;
+-out:
+-	return;
+ }
+ 
+ static int rtl8169_open(struct net_device *dev)
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0066-r8169-merge-firmware-information-into-the-chipset-de.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0066-r8169-merge-firmware-information-into-the-chipset-de.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,283 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Wed, 27 Apr 2011 08:22:39 +0200
+Subject: [PATCH 66/71] r8169: merge firmware information into the chipset
+ description data.
+
+commit 85bffe6ca2e2d7e9510c115aa4f11c3d4209051f upstream.
+
+- RTL_GIGA_MAC_NONE is a fake index so put it at the end of the
+  enumeration and shift everybody.
+- RTL_GIGA_MAC_VER_17 / RTL_GIGA_MAC_VER_16 ordering fixed. Though
+  not wrong it was confusing enough to wonder if things were right.
+
+Renaming rtl_chip_info was not strictly necessary. It allows to
+check the patch for the correct use of the indexes though.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+---
+ drivers/net/r8169.c |  214 ++++++++++++++++++++++++++-------------------------
+ 1 files changed, 110 insertions(+), 104 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index f8037db..e34f3cc 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -98,40 +98,40 @@ static const int multicast_filter_limit = 32;
+ #define RTL_R32(reg)		readl (ioaddr + (reg))
+ 
+ enum mac_version {
+-	RTL_GIGA_MAC_NONE   = 0x00,
+-	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
+-	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
+-	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
+-	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
+-	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
+-	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
+-	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
+-	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
+-	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
+-	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
+-	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
+-	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
+-	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
+-	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
+-	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
+-	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
+-	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
+-	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
+-	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
+-	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
+-	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
+-	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
+-	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
+-	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
+-	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
+-	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
+-	RTL_GIGA_MAC_VER_27 = 0x1b, // 8168DP
+-	RTL_GIGA_MAC_VER_28 = 0x1c, // 8168DP
+-	RTL_GIGA_MAC_VER_29 = 0x1d, // 8105E
+-	RTL_GIGA_MAC_VER_30 = 0x1e, // 8105E
+-	RTL_GIGA_MAC_VER_31 = 0x1f, // 8168DP
+-	RTL_GIGA_MAC_VER_32 = 0x20, // 8168E
+-	RTL_GIGA_MAC_VER_33 = 0x21, // 8168E
++	RTL_GIGA_MAC_VER_01 = 0,
++	RTL_GIGA_MAC_VER_02,
++	RTL_GIGA_MAC_VER_03,
++	RTL_GIGA_MAC_VER_04,
++	RTL_GIGA_MAC_VER_05,
++	RTL_GIGA_MAC_VER_06,
++	RTL_GIGA_MAC_VER_07,
++	RTL_GIGA_MAC_VER_08,
++	RTL_GIGA_MAC_VER_09,
++	RTL_GIGA_MAC_VER_10,
++	RTL_GIGA_MAC_VER_11,
++	RTL_GIGA_MAC_VER_12,
++	RTL_GIGA_MAC_VER_13,
++	RTL_GIGA_MAC_VER_14,
++	RTL_GIGA_MAC_VER_15,
++	RTL_GIGA_MAC_VER_16,
++	RTL_GIGA_MAC_VER_17,
++	RTL_GIGA_MAC_VER_18,
++	RTL_GIGA_MAC_VER_19,
++	RTL_GIGA_MAC_VER_20,
++	RTL_GIGA_MAC_VER_21,
++	RTL_GIGA_MAC_VER_22,
++	RTL_GIGA_MAC_VER_23,
++	RTL_GIGA_MAC_VER_24,
++	RTL_GIGA_MAC_VER_25,
++	RTL_GIGA_MAC_VER_26,
++	RTL_GIGA_MAC_VER_27,
++	RTL_GIGA_MAC_VER_28,
++	RTL_GIGA_MAC_VER_29,
++	RTL_GIGA_MAC_VER_30,
++	RTL_GIGA_MAC_VER_31,
++	RTL_GIGA_MAC_VER_32,
++	RTL_GIGA_MAC_VER_33,
++	RTL_GIGA_MAC_NONE   = 0xff,
+ };
+ 
+ enum rtl_tx_desc_version {
+@@ -139,61 +139,84 @@ enum rtl_tx_desc_version {
+ 	RTL_TD_1	= 1,
+ };
+ 
+-#define _R(NAME,MAC,TD) \
+-	{ .name = NAME, .mac_version = MAC, .txd_version = TD }
++#define _R(NAME,TD,FW) \
++	{ .name = NAME, .txd_version = TD, .fw_name = FW }
+ 
+ static const struct {
+ 	const char *name;
+-	u8 mac_version;
+ 	enum rtl_tx_desc_version txd_version;
+-} rtl_chip_info[] = {
+-	_R("RTL8169",		RTL_GIGA_MAC_VER_01, RTL_TD_0), // 8169
+-	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, RTL_TD_0), // 8169S
+-	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, RTL_TD_0), // 8110S
+-	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, RTL_TD_0), // 8169SB
+-	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, RTL_TD_0), // 8110SCd
+-	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, RTL_TD_0), // 8110SCe
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, RTL_TD_1), // PCI-E
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, RTL_TD_1), // PCI-E
+-	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, RTL_TD_1), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, RTL_TD_0), // PCI-E
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, RTL_TD_0), // PCI-E
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, RTL_TD_0), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, RTL_TD_0), // PCI-E 8139
+-	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, RTL_TD_0), // PCI-E 8139
+-	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, RTL_TD_0), // PCI-E 8139
+-	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, RTL_TD_0), // PCI-E
+-	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, RTL_TD_0), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, RTL_TD_1), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, RTL_TD_1), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, RTL_TD_1), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, RTL_TD_1), // PCI-E
+-	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, RTL_TD_1), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, RTL_TD_1), // PCI-E
+-	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, RTL_TD_1), // PCI-E
+-	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, RTL_TD_1), // PCI-E
+-	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, RTL_TD_1), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, RTL_TD_1), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_28, RTL_TD_1), // PCI-E
+-	_R("RTL8105e",		RTL_GIGA_MAC_VER_29, RTL_TD_1), // PCI-E
+-	_R("RTL8105e",		RTL_GIGA_MAC_VER_30, RTL_TD_1), // PCI-E
+-	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_31, RTL_TD_1), // PCI-E
+-	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_32, RTL_TD_1), // PCI-E
+-	_R("RTL8168e/8111e",	RTL_GIGA_MAC_VER_33, RTL_TD_1)  // PCI-E
+-};
+-#undef _R
+-
+-static const struct rtl_firmware_info {
+-	int mac_version;
+ 	const char *fw_name;
+-} rtl_firmware_infos[] = {
+-	{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_32, .fw_name = FIRMWARE_8168E_1 },
+-	{ .mac_version = RTL_GIGA_MAC_VER_33, .fw_name = FIRMWARE_8168E_2 }
++} rtl_chip_infos[] = {
++	/* PCI devices. */
++	[RTL_GIGA_MAC_VER_01] =
++		_R("RTL8169",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_02] =
++		_R("RTL8169s",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_03] =
++		_R("RTL8110s",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_04] =
++		_R("RTL8169sb/8110sb",	RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_05] =
++		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_06] =
++		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL),
++	/* PCI-E devices. */
++	[RTL_GIGA_MAC_VER_07] =
++		_R("RTL8102e",		RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_08] =
++		_R("RTL8102e",		RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_09] =
++		_R("RTL8102e",		RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_10] =
++		_R("RTL8101e",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_11] =
++		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_12] =
++		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_13] =
++		_R("RTL8101e",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_14] =
++		_R("RTL8100e",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_15] =
++		_R("RTL8100e",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_16] =
++		_R("RTL8101e",		RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_17] =
++		_R("RTL8168b/8111b",	RTL_TD_0, NULL),
++	[RTL_GIGA_MAC_VER_18] =
++		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_19] =
++		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_20] =
++		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_21] =
++		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_22] =
++		_R("RTL8168c/8111c",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_23] =
++		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_24] =
++		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_25] =
++		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_1),
++	[RTL_GIGA_MAC_VER_26] =
++		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_2),
++	[RTL_GIGA_MAC_VER_27] =
++		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_28] =
++		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_29] =
++		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1),
++	[RTL_GIGA_MAC_VER_30] =
++		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1),
++	[RTL_GIGA_MAC_VER_31] =
++		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL),
++	[RTL_GIGA_MAC_VER_32] =
++		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_1),
++	[RTL_GIGA_MAC_VER_33] =
++		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_2)
+ };
++#undef _R
+ 
+ enum cfg_version {
+ 	RTL_CFG_0 = 0x00,
+@@ -1193,15 +1216,7 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+ 
+ static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
+ {
+-	int i;
+-
+-	for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
+-		const struct rtl_firmware_info *info = rtl_firmware_infos + i;
+-
+-		if (info->mac_version == tp->mac_version)
+-			return info->fw_name;
+-	}
+-	return NULL;
++	return rtl_chip_infos[tp->mac_version].fw_name;
+ }
+ 
+ static void rtl8169_get_drvinfo(struct net_device *dev,
+@@ -3410,17 +3425,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 
+ 	rtl8169_print_mac_version(tp);
+ 
+-	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
+-		if (tp->mac_version == rtl_chip_info[i].mac_version)
+-			break;
+-	}
+-	if (i == ARRAY_SIZE(rtl_chip_info)) {
+-		dev_err(&pdev->dev,
+-			"driver bug, MAC version not found in rtl_chip_info\n");
+-		goto err_out_msi_4;
+-	}
+-	chipset = i;
+-	tp->txd_version = rtl_chip_info[chipset].txd_version;
++	chipset = tp->mac_version;
++	tp->txd_version = rtl_chip_infos[chipset].txd_version;
+ 
+ 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
+@@ -3486,7 +3492,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	pci_set_drvdata(pdev, dev);
+ 
+ 	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
+-		   rtl_chip_info[chipset].name, dev->base_addr, dev->dev_addr,
++		   rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr,
+ 		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
+ 
+ 	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0067-r8169-avoid-late-chip-identifier-initialisation.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0067-r8169-avoid-late-chip-identifier-initialisation.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,67 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Sun, 8 May 2011 17:47:36 +0200
+Subject: [PATCH 67/71] r8169: avoid late chip identifier initialisation.
+
+commit 5d320a205de277774962782a4b1923e4f8cdf781 upstream.
+
+Unknown 8168 chips did not have any PLL power method set as they
+did not inherit a default family soon enough. Fix it.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+[bwh: Adjust context for omitted VLAN changes]
+---
+ drivers/net/r8169.c |   18 +++++++++---------
+ 1 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index e34f3cc..6a19ace 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1663,8 +1663,9 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
+ };
+ 
+ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+-				    void __iomem *ioaddr)
++				    struct net_device *dev, u8 default_version)
+ {
++	void __iomem *ioaddr = tp->mmio_addr;
+ 	/*
+ 	 * The driver currently handles the 8168Bf and the 8168Be identically
+ 	 * but they can be identified more specifically through the test below
+@@ -1751,6 +1752,12 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 	while ((reg & p->mask) != p->val)
+ 		p++;
+ 	tp->mac_version = p->mac_version;
++
++	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
++		netif_notice(tp, probe, dev,
++			     "unknown MAC, using family default\n");
++		tp->mac_version = default_version;
++	}
+ }
+ 
+ static void rtl8169_print_mac_version(struct rtl8169_private *tp)
+@@ -3411,18 +3418,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	pci_set_master(pdev);
+ 
+ 	/* Identify chip attached to board */
+-	rtl8169_get_mac_version(tp, ioaddr);
++	rtl8169_get_mac_version(tp, dev, cfg->default_ver);
+ 
+ 	rtl_init_mdio_ops(tp);
+ 	rtl_init_pll_power_ops(tp);
+ 
+-	/* Use appropriate default if unknown */
+-	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
+-		netif_notice(tp, probe, dev,
+-			     "unknown MAC, using family default\n");
+-		tp->mac_version = cfg->default_ver;
+-	}
+-
+ 	rtl8169_print_mac_version(tp);
+ 
+ 	chipset = tp->mac_version;
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0068-Add-appropriate-linux-prefetch.h-include-for-prefetc.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0068-Add-appropriate-linux-prefetch.h-include-for-prefetc.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,61 @@
+From: Paul Gortmaker <paul.gortmaker at windriver.com>
+Date: Sun, 22 May 2011 16:47:17 -0400
+Subject: [PATCH 68/71] Add appropriate <linux/prefetch.h> include for
+ prefetch users
+
+commit 70c71606190e9115e5f8363bfcd164c582eb314a upstream.
+
+After discovering that wide use of prefetch on modern CPUs
+could be a net loss instead of a win, net drivers which were
+relying on the implicit inclusion of prefetch.h via the list
+headers showed up in the resulting cleanup fallout.  Give
+them an explicit include via the following $0.02 script.
+
+ =========================================
+ #!/bin/bash
+ MANUAL=""
+ for i in `git grep -l 'prefetch(.*)' .` ; do
+ 	grep -q '<linux/prefetch.h>' $i
+ 	if [ $? = 0 ] ; then
+ 		continue
+ 	fi
+
+ 	(	echo '?^#include <linux/?a'
+ 		echo '#include <linux/prefetch.h>'
+ 		echo .
+ 		echo w
+ 		echo q
+ 	) | ed -s $i > /dev/null 2>&1
+ 	if [ $? != 0 ]; then
+ 		echo $i needs manual fixup
+ 		MANUAL="$i $MANUAL"
+ 	fi
+ done
+ echo ------------------- 8\<----------------------
+ echo vi $MANUAL
+ =========================================
+
+Signed-off-by: Paul <paul.gortmaker at windriver.com>
+[ Fixed up some incorrect #include placements, and added some
+  non-network drivers and the fib_trie.c case    - Linus ]
+Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
+[bwh: Restricted to drivers/net/r8169.c]
+---
+ drivers/net/r8169.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 6a19ace..da4d9e0 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -26,6 +26,7 @@
+ #include <linux/pm_runtime.h>
+ #include <linux/firmware.h>
+ #include <linux/pci-aspm.h>
++#include <linux/prefetch.h>
+ 
+ #include <asm/system.h>
+ #include <asm/io.h>
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0069-r8169-fix-static-initializers.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0069-r8169-fix-static-initializers.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,56 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 17 Jun 2011 22:58:54 +0200
+Subject: [PATCH 69/71] r8169: fix static initializers.
+
+commit 3744100e05c4e403ed21c99cd389c7e784664e4b upstream.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+---
+ drivers/net/r8169.c |   10 ++++++----
+ 1 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index da4d9e0..cf8c1e8 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1678,7 +1678,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 	 *
+ 	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
+ 	 */
+-	static const struct {
++	static const struct rtl_mac_info {
+ 		u32 mask;
+ 		u32 val;
+ 		int mac_version;
+@@ -1746,7 +1746,8 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
+ 
+ 		/* Catch-all */
+ 		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
+-	}, *p = mac_info;
++	};
++	const struct rtl_mac_info *p = mac_info;
+ 	u32 reg;
+ 
+ 	reg = RTL_R32(TxConfig);
+@@ -3736,7 +3737,7 @@ static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
+ 
+ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
+ {
+-	static const struct {
++	static const struct rtl_cfg2_info {
+ 		u32 mac_version;
+ 		u32 clk;
+ 		u32 val;
+@@ -3745,7 +3746,8 @@ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
+ 		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
+ 		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
+ 		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
+-	}, *p = cfg2_info;
++	};
++	const struct rtl_cfg2_info *p = cfg2_info;
+ 	unsigned int i;
+ 	u32 clk;
+ 
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0070-r8169-fix-wrong-register-use.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0070-r8169-fix-wrong-register-use.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,28 @@
+From: Francois Romieu <romieu at fr.zoreil.com>
+Date: Fri, 24 Jun 2011 19:52:13 +0200
+Subject: [PATCH 70/71] r8169: fix wrong register use.
+
+commit 1e4e82baee8c2a8d753cbf6aa1a77326b71e59f0 upstream.
+
+Signed-off-by: Francois Romieu <romieu at fr.zoreil.com>
+Cc: Realtek linux nic maintainers <nic_swsd at realtek.com>
+---
+ drivers/net/r8169.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index cf8c1e8..14d8ce9 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -745,7 +745,7 @@ static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
+ 	msleep(2);
+ 	for (i = 0; i < 5; i++) {
+ 		udelay(100);
+-		if (!(RTL_R32(ERIDR) & ERIAR_FLAG))
++		if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
+ 			break;
+ 	}
+ 
+-- 
+1.7.5.4
+

Added: dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0071-r8169-Add-support-for-D-Link-530T-rev-C1-Kernel-Bug-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/features/all/r8169/0071-r8169-Add-support-for-D-Link-530T-rev-C1-Kernel-Bug-.patch	Mon Aug 15 01:35:28 2011	(r17925)
@@ -0,0 +1,39 @@
+From: Lennart Sorensen <lsorense at csclub.uwaterloo.ca>
+Date: Thu, 28 Jul 2011 13:18:11 +0000
+Subject: [PATCH 71/71] r8169: Add support for D-Link 530T rev C1 (Kernel Bug
+ 38862)
+
+commit 93a3aa25933461d76141179fc94aa32d5f9d954a upstream.
+
+The D-Link DGE-530T rev C1 is a re-badged Realtek 8169 named DLG10028C,
+unlike the previous revisions which were skge based.  It is probably
+the same as the discontinued DGE-528T (0x4300) other than the PCI ID.
+
+The PCI ID is 0x1186:0x4302.
+
+Adding it to r8169.c where 0x1186:0x4300 is already found makes the card
+be detected and work.
+
+This fixes https://bugzilla.kernel.org/show_bug.cgi?id=38862
+
+Signed-off-by: Len Sorensen <lsorense at csclub.uwaterloo.ca>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/r8169.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 14d8ce9..0e2bf4b 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -236,6 +236,7 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4302), 0, 0, RTL_CFG_0 },
+ 	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
+ 	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
+ 	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
+-- 
+1.7.5.4
+

Modified: dists/squeeze/linux-2.6/debian/patches/series/36
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/36	Mon Aug 15 00:16:47 2011	(r17924)
+++ dists/squeeze/linux-2.6/debian/patches/series/36	Mon Aug 15 01:35:28 2011	(r17925)
@@ -24,6 +24,7 @@
 + features/all/dma-mapping-dma-mapping.h-add-dma_set_coherent_mask.patch
 + features/all/dma-mapping.h-add-the-dma_unmap-state-API.patch
 + features/all/etherdevice-Dummy-implementation-of-dev_hw_addr_rand.patch
++ features/all/err.h-add-helper-function-to-simplify-pointer-error-.patch
 + features/all/e1000e/0001-e1000e-Use-the-instance-of-net_device_stats-from-net.patch
 + features/all/e1000e/0002-net-Use-netdev_alloc_skb_ip_align.patch
 + features/all/e1000e/0003-e1000e-Fix-erroneous-display-of-stats-by-ethtool-S.patch
@@ -431,6 +432,30 @@
 + features/all/r8169/0045-r8169-fix-incorrect-args-to-oob-notify.patch
 + features/all/r8169/0046-r8169-correct-settings-of-rtl8102e.patch
 + features/all/r8169/0047-r8169-fix-RTL8168DP-power-off-issue.patch
++ features/all/r8169/0048-r8169-adjust-rtl8169_set_speed_xmii-function.patch
++ features/all/r8169/0049-r8169-support-the-new-chips-for-RTL8105E.patch
++ features/all/r8169/0050-r8169-support-control-of-advertising.patch
++ features/all/r8169/0051-r8169-fix-a-bug-in-rtl8169_init_phy.patch
++ features/all/r8169/0052-net-r8169-add-a-new-chip-for-RTL8105.patch
++ features/all/r8169/0053-net-r8169-add-a-new-chip-for-RTL8168DP.patch
++ features/all/r8169/0054-net-r8169-support-RTL8168E.patch
++ features/all/r8169/0055-r8169-TSO-fixes.patch
++ features/all/r8169/0056-r8169-don-t-request-firmware-when-there-s-no-userspa.patch
++ features/all/r8169/0057-r8169-fix-merge-conflict-fix.patch
++ features/all/r8169/0058-ethtool-Use-full-32-bit-speed-range-in-ethtool-s-set.patch
++ features/all/r8169/0059-ethtool-cosmetic-Use-ethtool-ethtool_cmd_speed-API.patch
++ features/all/r8169/0060-r8169-style-cleanups.patch
++ features/all/r8169/0061-r8169-remove-some-code-duplication.patch
++ features/all/r8169/0062-r8169-rtl8169_set_speed_xmii-cleanup.patch
++ features/all/r8169/0063-r8169-link-speed-selection-timer-rework.patch
++ features/all/r8169/0064-r8169-remove-non-NAPI-context-invocation-of-rtl8169_.patch
++ features/all/r8169/0065-r8169-provide-some-firmware-information-via-ethtool.patch
++ features/all/r8169/0066-r8169-merge-firmware-information-into-the-chipset-de.patch
++ features/all/r8169/0067-r8169-avoid-late-chip-identifier-initialisation.patch
++ features/all/r8169/0068-Add-appropriate-linux-prefetch.h-include-for-prefetc.patch
++ features/all/r8169/0069-r8169-fix-static-initializers.patch
++ features/all/r8169/0070-r8169-fix-wrong-register-use.patch
++ features/all/r8169/0071-r8169-Add-support-for-D-Link-530T-rev-C1-Kernel-Bug-.patch
 + features/all/tg3/0001-Revert-tg3-Fix-5906-transmit-hangs.patch
 + features/all/tg3/0002-tg3-Assign-flags-to-fixes-in-start_xmit_dma_bug.patch
 + features/all/tg3/0003-tg3-Fix-5906-transmit-hangs.patch



More information about the Kernel-svn-changes mailing list