diff options
author | Tobias Powalowski <tobias@T-POWA-LX.(none)> | 2008-11-08 10:47:55 +0100 |
---|---|---|
committer | Tobias Powalowski <tobias@T-POWA-LX.(none)> | 2008-11-08 10:47:55 +0100 |
commit | f1b2971fed21141634f4b8093686ca660172ec5a (patch) | |
tree | 54cb67a00a0c9d161cd82dbb069288cfe1862c24 /patches | |
parent | 138189f235c9c06af57259e0d6411a35881e62b7 (diff) |
'update to latest version + fixed #11758'
Diffstat (limited to 'patches')
-rw-r--r-- | patches/r8169-fix-RxMissed-register-access.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/patches/r8169-fix-RxMissed-register-access.patch b/patches/r8169-fix-RxMissed-register-access.patch new file mode 100644 index 0000000..9149785 --- /dev/null +++ b/patches/r8169-fix-RxMissed-register-access.patch @@ -0,0 +1,85 @@ +From 422f23adb15141fffbba4c2579b26c59fabc3537 Mon Sep 17 00:00:00 2001 +From: Francois Romieu <romieu@fr.zoreil.com> +Date: Thu, 21 Aug 2008 23:20:40 +0200 +Subject: [PATCH] r8169: fix RxMissed register access + +- the register location is defined for the 8169 chipset only +- only the lower 3 bytes of the register are valid + +Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> +Cc: Edward Hsu <edward_hsu@realtek.com.tw> +--- + drivers/net/r8169.c | 22 ++++++++++------------ + 1 files changed, 10 insertions(+), 12 deletions(-) + +diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c +index 0f6f974..4190ee7 100644 +--- a/drivers/net/r8169.c ++++ b/drivers/net/r8169.c +@@ -2099,8 +2099,6 @@ static void rtl_hw_start_8168(struct net_device *dev) + + RTL_R8(IntrMask); + +- RTL_W32(RxMissed, 0); +- + rtl_set_rx_mode(dev); + + RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); +@@ -2143,8 +2141,6 @@ static void rtl_hw_start_8101(struct net_device *dev) + + RTL_R8(IntrMask); + +- RTL_W32(RxMissed, 0); +- + rtl_set_rx_mode(dev); + + RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); +@@ -2922,6 +2918,17 @@ static int rtl8169_poll(struct napi_struct *napi, int budget) + return work_done; + } + ++static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr) ++{ ++ struct rtl8169_private *tp = netdev_priv(dev); ++ ++ if (tp->mac_version > RTL_GIGA_MAC_VER_06) ++ return; ++ ++ dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff); ++ RTL_W32(RxMissed, 0); ++} ++ + static void rtl8169_down(struct net_device *dev) + { + struct rtl8169_private *tp = netdev_priv(dev); +@@ -2939,9 +2946,7 @@ core_down: + + rtl8169_asic_down(ioaddr); + +- /* Update the error counts. */ +- dev->stats.rx_missed_errors += RTL_R32(RxMissed); +- RTL_W32(RxMissed, 0); ++ rtl8169_rx_missed(dev, ioaddr); + + spin_unlock_irq(&tp->lock); + +@@ -3063,8 +3068,7 @@ static struct net_device_stats *rtl8169_get_stats(struct net_device *dev) + + if (netif_running(dev)) { + spin_lock_irqsave(&tp->lock, flags); +- dev->stats.rx_missed_errors += RTL_R32(RxMissed); +- RTL_W32(RxMissed, 0); ++ rtl8169_rx_missed(dev, ioaddr); + spin_unlock_irqrestore(&tp->lock, flags); + } + +@@ -3089,8 +3093,7 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state) + + rtl8169_asic_down(ioaddr); + +- dev->stats.rx_missed_errors += RTL_R32(RxMissed); +- RTL_W32(RxMissed, 0); ++ rtl8169_rx_missed(dev, ioaddr); + + spin_unlock_irq(&tp->lock); + |