From 2584fbc3a61897de5eddd56b39a4fa9cd074eca2 Mon Sep 17 00:00:00 2001 From: Roger So Date: Tue, 31 Jul 2007 23:52:42 +0200 Subject: r8169: PHY power-on fix Fix extracted from Realtek's driver (8.002.00/20070713) for the PHY attached to 8111/8168b chipsets. The check against mac_version is just usual paranoia during the bugfix period of the kernel cycle. -- FR Tested on Asus M2A-VM motherboard by Roger So. No regression on my Asrock 945G DVI either (built-in 8168 + 2x8169). Signed-off-by: Roger So Signed-off-by: Francois Romieu Cc: Edward Hsu diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index bb6896a..ec4f545 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -725,6 +725,12 @@ static int rtl8169_set_speed_xmii(struct net_device *dev, auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + if (tp->mac_version == RTL_GIGA_MAC_VER_12) { + /* Vendor specific (0x1f) and reserved (0x0e) MII registers. */ + mdio_write(ioaddr, 0x1f, 0x0000); + mdio_write(ioaddr, 0x0e, 0x0000); + } + tp->phy_auto_nego_reg = auto_nego; tp->phy_1000_ctrl_reg = giga_ctrl; -- cgit v0.10.2 From 313b0305b5a1e7e0fb39383befbf79558ce68a9c Mon Sep 17 00:00:00 2001 From: Francois Romieu Date: Thu, 2 Aug 2007 00:00:48 +0200 Subject: r8169: avoid needless NAPI poll scheduling Theory : though needless, it should not have hurt. Practice: it does not play nice with DEBUG_SHIRQ + LOCKDEP + UP (see https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=242572). The patch makes sense in itself but I should dig why it has an effect on #242572 (assuming that NAPI do not change in a near future). Signed-off-by: Francois Romieu Cc: Edward Hsu diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index ec4f545..631e55d 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -2767,14 +2767,16 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) rtl8169_check_link_status(dev, tp, ioaddr); #ifdef CONFIG_R8169_NAPI - RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event); - tp->intr_mask = ~tp->napi_event; - - if (likely(netif_rx_schedule_prep(dev))) - __netif_rx_schedule(dev); - else if (netif_msg_intr(tp)) { - printk(KERN_INFO "%s: interrupt %04x taken in poll\n", - dev->name, status); + if (status & tp->napi_event) { + RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event); + tp->intr_mask = ~tp->napi_event; + + if (likely(netif_rx_schedule_prep(dev))) + __netif_rx_schedule(dev); + else if (netif_msg_intr(tp)) { + printk(KERN_INFO "%s: interrupt %04x in poll\n", + dev->name, status); + } } break; #else -- cgit v0.10.2