UPSTREAM: r8169: Config1 is read-only on 8168c and later.
authorFrancois Romieu <romieu@fr.zoreil.com>
Tue, 17 Apr 2012 09:10:11 +0000 (11:10 +0200)
committerGerrit <chrome-bot@google.com>
Mon, 5 Nov 2012 18:37:38 +0000 (10:37 -0800)
Suggested by Hayes.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: Hayes Wang <hayeswang@realtek.com>
(cherry picked from commit 851e60221926a53344b4227879858bef841b0477)

Signed-off-by: Shawn Nematbakhsh <shawnn@google.com>
BUG=chrome-os-partner:14994
TEST=suspend/resume, then check ethernet function on 8168c

Change-Id: If48adfd0f35b7727fd0d76764c53291a197963f2
Reviewed-on: https://gerrit.chromium.org/gerrit/37327
Tested-by: Shawn Nematbakhsh <shawnn@google.com>
Reviewed-by: Todd Broch <tbroch@chromium.org>
Commit-Ready: Shawn Nematbakhsh <shawnn@google.com>

drivers/net/ethernet/realtek/r8169.c

index 3fcc3a9..618cac6 100644 (file)
@@ -1405,7 +1405,6 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
                u16 reg;
                u8  mask;
        } cfg[] = {
-               { WAKE_ANY,   Config1, PMEnable },
                { WAKE_PHY,   Config3, LinkUp },
                { WAKE_MAGIC, Config3, MagicPacket },
                { WAKE_UCAST, Config5, UWF },
@@ -1413,16 +1412,28 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
                { WAKE_MCAST, Config5, MWF },
                { WAKE_ANY,   Config5, LanWake }
        };
+       u8 options;
 
        RTL_W8(Cfg9346, Cfg9346_Unlock);
 
        for (i = 0; i < ARRAY_SIZE(cfg); i++) {
-               u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
+               options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
                if (wolopts & cfg[i].opt)
                        options |= cfg[i].mask;
                RTL_W8(cfg[i].reg, options);
        }
 
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_17:
+               options = RTL_R8(Config1) & ~PMEnable;
+               if (wolopts)
+                       options |= PMEnable;
+               RTL_W8(Config1, options);
+               break;
+       default:
+               break;
+       }
+
        RTL_W8(Cfg9346, Cfg9346_Lock);
 }