[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