Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

r8169: fix RxMissed register access

- the register is defined for the 8169 chipset only and there is
no 8169 beyond RTL_GIGA_MAC_VER_06.
- only the lower 3 bytes of the register are valid

Fixes:
1. http://bugzilla.kernel.org/show_bug.cgi?id=10180
2. http://bugzilla.kernel.org/show_bug.cgi?id=11062 (bits of)

Tested by Hermann Gausterer and Adam Huffman.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: Edward Hsu <edward_hsu@realtek.com.tw>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

authored by

Francois Romieu and committed by
Jeff Garzik
523a6094 e93dcb11

+14 -11
+14 -11
drivers/net/r8169.c
··· 2286 2286 2287 2287 RTL_R8(IntrMask); 2288 2288 2289 - RTL_W32(RxMissed, 0); 2290 - 2291 2289 rtl_set_rx_mode(dev); 2292 2290 2293 2291 RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); ··· 2409 2411 RTL_W8(Cfg9346, Cfg9346_Lock); 2410 2412 2411 2413 RTL_R8(IntrMask); 2412 - 2413 - RTL_W32(RxMissed, 0); 2414 2414 2415 2415 rtl_set_rx_mode(dev); 2416 2416 ··· 3187 3191 return work_done; 3188 3192 } 3189 3193 3194 + static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr) 3195 + { 3196 + struct rtl8169_private *tp = netdev_priv(dev); 3197 + 3198 + if (tp->mac_version > RTL_GIGA_MAC_VER_06) 3199 + return; 3200 + 3201 + dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff); 3202 + RTL_W32(RxMissed, 0); 3203 + } 3204 + 3190 3205 static void rtl8169_down(struct net_device *dev) 3191 3206 { 3192 3207 struct rtl8169_private *tp = netdev_priv(dev); ··· 3215 3208 3216 3209 rtl8169_asic_down(ioaddr); 3217 3210 3218 - /* Update the error counts. */ 3219 - dev->stats.rx_missed_errors += RTL_R32(RxMissed); 3220 - RTL_W32(RxMissed, 0); 3211 + rtl8169_rx_missed(dev, ioaddr); 3221 3212 3222 3213 spin_unlock_irq(&tp->lock); 3223 3214 ··· 3337 3332 3338 3333 if (netif_running(dev)) { 3339 3334 spin_lock_irqsave(&tp->lock, flags); 3340 - dev->stats.rx_missed_errors += RTL_R32(RxMissed); 3341 - RTL_W32(RxMissed, 0); 3335 + rtl8169_rx_missed(dev, ioaddr); 3342 3336 spin_unlock_irqrestore(&tp->lock, flags); 3343 3337 } 3344 3338 ··· 3362 3358 3363 3359 rtl8169_asic_down(ioaddr); 3364 3360 3365 - dev->stats.rx_missed_errors += RTL_R32(RxMissed); 3366 - RTL_W32(RxMissed, 0); 3361 + rtl8169_rx_missed(dev, ioaddr); 3367 3362 3368 3363 spin_unlock_irq(&tp->lock); 3369 3364