r8169: add generic rtl_set_eee_txidle_timer function
[linux-2.6-microblaze.git] / drivers / net / ethernet / realtek / r8169_main.c
index dd73df6..f6ed740 100644 (file)
@@ -55,6 +55,7 @@
 #define FIRMWARE_8107E_2       "rtl_nic/rtl8107e-2.fw"
 #define FIRMWARE_8125A_3       "rtl_nic/rtl8125a-3.fw"
 #define FIRMWARE_8125B_2       "rtl_nic/rtl8125b-2.fw"
+#define FIRMWARE_8126A_2       "rtl_nic/rtl8126a-2.fw"
 
 #define TX_DMA_BURST   7       /* Maximum PCI burst, '7' is unlimited */
 #define InterFrameGap  0x03    /* 3 means InterFrameGap = the shortest one */
@@ -136,6 +137,7 @@ static const struct {
        [RTL_GIGA_MAC_VER_61] = {"RTL8125A",            FIRMWARE_8125A_3},
        /* reserve 62 for CFG_METHOD_4 in the vendor driver */
        [RTL_GIGA_MAC_VER_63] = {"RTL8125B",            FIRMWARE_8125B_2},
+       [RTL_GIGA_MAC_VER_65] = {"RTL8126A",            FIRMWARE_8126A_2},
 };
 
 static const struct pci_device_id rtl8169_pci_tbl[] = {
@@ -158,6 +160,7 @@ static const struct pci_device_id rtl8169_pci_tbl[] = {
        { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024 },
        { 0x0001, 0x8168, PCI_ANY_ID, 0x2410 },
        { PCI_VDEVICE(REALTEK,  0x8125) },
+       { PCI_VDEVICE(REALTEK,  0x8126) },
        { PCI_VDEVICE(REALTEK,  0x3000) },
        {}
 };
@@ -327,13 +330,23 @@ enum rtl8168_registers {
 };
 
 enum rtl8125_registers {
+       LEDSEL0                 = 0x18,
+       INT_CFG0_8125           = 0x34,
+#define INT_CFG0_ENABLE_8125           BIT(0)
+#define INT_CFG0_CLKREQEN              BIT(3)
        IntrMask_8125           = 0x38,
        IntrStatus_8125         = 0x3c,
+       INT_CFG1_8125           = 0x7a,
+       LEDSEL2                 = 0x84,
+       LEDSEL1                 = 0x86,
        TxPoll_8125             = 0x90,
+       LEDSEL3                 = 0x96,
        MAC0_BKP                = 0x19e0,
        EEE_TXIDLE_TIMER_8125   = 0x6048,
 };
 
+#define LEDSEL_MASK_8125       0x23f
+
 #define RX_VLAN_INNER_8125     BIT(22)
 #define RX_VLAN_OUTER_8125     BIT(23)
 #define RX_VLAN_8125           (RX_VLAN_INNER_8125 | RX_VLAN_OUTER_8125)
@@ -606,6 +619,7 @@ struct rtl8169_private {
        struct page *Rx_databuff[NUM_RX_DESC];  /* Rx data buffers */
        struct ring_info tx_skb[NUM_TX_DESC];   /* Tx data buffers */
        u16 cp_cmd;
+       u16 tx_lpi_timer;
        u32 irq_mask;
        int irq;
        struct clk *clk;
@@ -629,7 +643,6 @@ struct rtl8169_private {
        struct rtl8169_counters *counters;
        struct rtl8169_tc_offsets tc_offset;
        u32 saved_wolopts;
-       int eee_adv;
 
        const char *fw_name;
        struct rtl_fw *rtl_fw;
@@ -824,6 +837,51 @@ int rtl8168_get_led_mode(struct rtl8169_private *tp)
        return ret;
 }
 
+static int rtl8125_get_led_reg(int index)
+{
+       static const int led_regs[] = { LEDSEL0, LEDSEL1, LEDSEL2, LEDSEL3 };
+
+       return led_regs[index];
+}
+
+int rtl8125_set_led_mode(struct rtl8169_private *tp, int index, u16 mode)
+{
+       int reg = rtl8125_get_led_reg(index);
+       struct device *dev = tp_to_dev(tp);
+       int ret;
+       u16 val;
+
+       ret = pm_runtime_resume_and_get(dev);
+       if (ret < 0)
+               return ret;
+
+       mutex_lock(&tp->led_lock);
+       val = RTL_R16(tp, reg) & ~LEDSEL_MASK_8125;
+       RTL_W16(tp, reg, val | mode);
+       mutex_unlock(&tp->led_lock);
+
+       pm_runtime_put_sync(dev);
+
+       return 0;
+}
+
+int rtl8125_get_led_mode(struct rtl8169_private *tp, int index)
+{
+       int reg = rtl8125_get_led_reg(index);
+       struct device *dev = tp_to_dev(tp);
+       int ret;
+
+       ret = pm_runtime_resume_and_get(dev);
+       if (ret < 0)
+               return ret;
+
+       ret = RTL_R16(tp, reg);
+
+       pm_runtime_put_sync(dev);
+
+       return ret;
+}
+
 void r8169_get_led_name(struct rtl8169_private *tp, int idx,
                        char *buf, int buf_len)
 {
@@ -1140,7 +1198,7 @@ static void rtl_writephy(struct rtl8169_private *tp, int location, int val)
        case RTL_GIGA_MAC_VER_31:
                r8168dp_2_mdio_write(tp, location, val);
                break;
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65:
                r8168g_mdio_write(tp, location, val);
                break;
        default:
@@ -1155,7 +1213,7 @@ static int rtl_readphy(struct rtl8169_private *tp, int location)
        case RTL_GIGA_MAC_VER_28:
        case RTL_GIGA_MAC_VER_31:
                return r8168dp_2_mdio_read(tp, location);
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65:
                return r8168g_mdio_read(tp, location);
        default:
                return r8169_mdio_read(tp, location);
@@ -1341,7 +1399,7 @@ static void rtl_set_d3_pll_down(struct rtl8169_private *tp, bool enable)
        case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
        case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
        case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_37:
-       case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_65:
                if (enable)
                        RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~D3_NO_PLL_DOWN);
                else
@@ -1508,7 +1566,7 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
                break;
        case RTL_GIGA_MAC_VER_34:
        case RTL_GIGA_MAC_VER_37:
-       case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_65:
                if (wolopts)
                        rtl_mod_config2(tp, 0, PME_SIGNAL);
                else
@@ -1974,7 +2032,23 @@ static int rtl_set_coalesce(struct net_device *dev,
        return 0;
 }
 
-static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
+static void rtl_set_eee_txidle_timer(struct rtl8169_private *tp)
+{
+       unsigned int timer_val = READ_ONCE(tp->dev->mtu) + ETH_HLEN + 0x20;
+
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_61:
+       case RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_65:
+               tp->tx_lpi_timer = timer_val;
+               RTL_W16(tp, EEE_TXIDLE_TIMER_8125, timer_val);
+               break;
+       default:
+               break;
+       }
+}
+
+static int rtl8169_get_eee(struct net_device *dev, struct ethtool_keee *data)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
 
@@ -1984,20 +2058,14 @@ static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
        return phy_ethtool_get_eee(tp->phydev, data);
 }
 
-static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
+static int rtl8169_set_eee(struct net_device *dev, struct ethtool_keee *data)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       int ret;
 
        if (!rtl_supports_eee(tp))
                return -EOPNOTSUPP;
 
-       ret = phy_ethtool_set_eee(tp->phydev, data);
-
-       if (!ret)
-               tp->eee_adv = phy_read_mmd(dev->phydev, MDIO_MMD_AN,
-                                          MDIO_AN_EEE_ADV);
-       return ret;
+       return phy_ethtool_set_eee(tp->phydev, data);
 }
 
 static void rtl8169_get_ringparam(struct net_device *dev,
@@ -2062,21 +2130,6 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
        .set_pauseparam         = rtl8169_set_pauseparam,
 };
 
-static void rtl_enable_eee(struct rtl8169_private *tp)
-{
-       struct phy_device *phydev = tp->phydev;
-       int adv;
-
-       /* respect EEE advertisement the user may have set */
-       if (tp->eee_adv >= 0)
-               adv = tp->eee_adv;
-       else
-               adv = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
-
-       if (adv >= 0)
-               phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
-}
-
 static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
 {
        /*
@@ -2095,6 +2148,9 @@ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
                u16 val;
                enum mac_version ver;
        } mac_info[] = {
+               /* 8126A family. */
+               { 0x7cf, 0x649, RTL_GIGA_MAC_VER_65 },
+
                /* 8125B family. */
                { 0x7cf, 0x641, RTL_GIGA_MAC_VER_63 },
 
@@ -2250,14 +2306,8 @@ static void rtl8125a_config_eee_mac(struct rtl8169_private *tp)
        r8168_mac_ocp_modify(tp, 0xeb62, 0, BIT(2) | BIT(1));
 }
 
-static void rtl8125_set_eee_txidle_timer(struct rtl8169_private *tp)
-{
-       RTL_W16(tp, EEE_TXIDLE_TIMER_8125, tp->dev->mtu + ETH_HLEN + 0x20);
-}
-
 static void rtl8125b_config_eee_mac(struct rtl8169_private *tp)
 {
-       rtl8125_set_eee_txidle_timer(tp);
        r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0));
 }
 
@@ -2313,9 +2363,6 @@ static void rtl8169_init_phy(struct rtl8169_private *tp)
        /* We may have called phy_speed_down before */
        phy_speed_up(tp->phydev);
 
-       if (rtl_supports_eee(tp))
-               rtl_enable_eee(tp);
-
        genphy_soft_reset(tp->phydev);
 }
 
@@ -2368,6 +2415,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
                RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST);
                break;
        case RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_65:
                RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST |
                        RX_PAUSE_SLOT_ON);
                break;
@@ -2554,7 +2602,7 @@ static void rtl_wait_txrx_fifo_empty(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_61:
                rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
                break;
-       case RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_63 ... RTL_GIGA_MAC_VER_65:
                RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
                rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
                rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond_2, 100, 42);
@@ -2797,7 +2845,7 @@ static void rtl_enable_exit_l1(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38:
                rtl_eri_set_bits(tp, 0xd4, 0x0c00);
                break;
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65:
                r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80);
                break;
        default:
@@ -2811,7 +2859,7 @@ static void rtl_disable_exit_l1(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
                rtl_eri_clear_bits(tp, 0xd4, 0x1f00);
                break;
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65:
                r8168_mac_ocp_modify(tp, 0xc0ac, 0x1f80, 0);
                break;
        default:
@@ -2821,6 +2869,8 @@ static void rtl_disable_exit_l1(struct rtl8169_private *tp)
 
 static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
 {
+       u8 val8;
+
        if (tp->mac_version < RTL_GIGA_MAC_VER_32)
                return;
 
@@ -2834,11 +2884,19 @@ static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
                        return;
 
                rtl_mod_config5(tp, 0, ASPM_en);
-               rtl_mod_config2(tp, 0, ClkReqEn);
+               switch (tp->mac_version) {
+               case RTL_GIGA_MAC_VER_65:
+                       val8 = RTL_R8(tp, INT_CFG0_8125) | INT_CFG0_CLKREQEN;
+                       RTL_W8(tp, INT_CFG0_8125, val8);
+                       break;
+               default:
+                       rtl_mod_config2(tp, 0, ClkReqEn);
+                       break;
+               }
 
                switch (tp->mac_version) {
                case RTL_GIGA_MAC_VER_46 ... RTL_GIGA_MAC_VER_48:
-               case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63:
+               case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65:
                        /* reset ephy tx/rx disable timer */
                        r8168_mac_ocp_modify(tp, 0xe094, 0xff00, 0);
                        /* chip can trigger L1.2 */
@@ -2850,14 +2908,22 @@ static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
        } else {
                switch (tp->mac_version) {
                case RTL_GIGA_MAC_VER_46 ... RTL_GIGA_MAC_VER_48:
-               case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63:
+               case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65:
                        r8168_mac_ocp_modify(tp, 0xe092, 0x00ff, 0);
                        break;
                default:
                        break;
                }
 
-               rtl_mod_config2(tp, ClkReqEn, 0);
+               switch (tp->mac_version) {
+               case RTL_GIGA_MAC_VER_65:
+                       val8 = RTL_R8(tp, INT_CFG0_8125) & ~INT_CFG0_CLKREQEN;
+                       RTL_W8(tp, INT_CFG0_8125, val8);
+                       break;
+               default:
+                       rtl_mod_config2(tp, ClkReqEn, 0);
+                       break;
+               }
                rtl_mod_config5(tp, ASPM_en, 0);
        }
 }
@@ -3570,10 +3636,15 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
        /* disable new tx descriptor format */
        r8168_mac_ocp_modify(tp, 0xeb58, 0x0001, 0x0000);
 
-       if (tp->mac_version == RTL_GIGA_MAC_VER_63)
+       if (tp->mac_version == RTL_GIGA_MAC_VER_65)
+               RTL_W8(tp, 0xD8, RTL_R8(tp, 0xD8) & ~0x02);
+
+       if (tp->mac_version == RTL_GIGA_MAC_VER_65)
+               r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400);
+       else if (tp->mac_version == RTL_GIGA_MAC_VER_63)
                r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0200);
        else
-               r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400);
+               r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0300);
 
        if (tp->mac_version == RTL_GIGA_MAC_VER_63)
                r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0000);
@@ -3586,6 +3657,10 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
        r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0030);
        r8168_mac_ocp_modify(tp, 0xe040, 0x1000, 0x0000);
        r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001);
+       if (tp->mac_version == RTL_GIGA_MAC_VER_65)
+               r8168_mac_ocp_modify(tp, 0xea1c, 0x0300, 0x0000);
+       else
+               r8168_mac_ocp_modify(tp, 0xea1c, 0x0004, 0x0000);
        r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403);
        r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068);
        r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f);
@@ -3600,10 +3675,10 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
 
        rtl_loop_wait_low(tp, &rtl_mac_ocp_e00e_cond, 1000, 10);
 
-       if (tp->mac_version == RTL_GIGA_MAC_VER_63)
-               rtl8125b_config_eee_mac(tp);
-       else
+       if (tp->mac_version == RTL_GIGA_MAC_VER_61)
                rtl8125a_config_eee_mac(tp);
+       else
+               rtl8125b_config_eee_mac(tp);
 
        rtl_disable_rxdvgate(tp);
 }
@@ -3647,6 +3722,12 @@ static void rtl_hw_start_8125b(struct rtl8169_private *tp)
        rtl_hw_start_8125_common(tp);
 }
 
+static void rtl_hw_start_8126a(struct rtl8169_private *tp)
+{
+       rtl_set_def_aspm_entry_latency(tp);
+       rtl_hw_start_8125_common(tp);
+}
+
 static void rtl_hw_config(struct rtl8169_private *tp)
 {
        static const rtl_generic_fct hw_configs[] = {
@@ -3689,6 +3770,7 @@ static void rtl_hw_config(struct rtl8169_private *tp)
                [RTL_GIGA_MAC_VER_53] = rtl_hw_start_8117,
                [RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2,
                [RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b,
+               [RTL_GIGA_MAC_VER_65] = rtl_hw_start_8126a,
        };
 
        if (hw_configs[tp->mac_version])
@@ -3699,9 +3781,23 @@ static void rtl_hw_start_8125(struct rtl8169_private *tp)
 {
        int i;
 
+       RTL_W8(tp, INT_CFG0_8125, 0x00);
+
        /* disable interrupt coalescing */
-       for (i = 0xa00; i < 0xb00; i += 4)
-               RTL_W32(tp, i, 0);
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_61:
+               for (i = 0xa00; i < 0xb00; i += 4)
+                       RTL_W32(tp, i, 0);
+               break;
+       case RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_65:
+               for (i = 0xa00; i < 0xa80; i += 4)
+                       RTL_W32(tp, i, 0);
+               RTL_W16(tp, INT_CFG1_8125, 0x0000);
+               break;
+       default:
+               break;
+       }
 
        rtl_hw_config(tp);
 }
@@ -3744,6 +3840,8 @@ static void rtl_hw_start(struct  rtl8169_private *tp)
        rtl_hw_aspm_clkreq_enable(tp, false);
        RTL_W16(tp, CPlusCmd, tp->cp_cmd);
 
+       rtl_set_eee_txidle_timer(tp);
+
        if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
                rtl_hw_start_8169(tp);
        else if (rtl_is_8125(tp))
@@ -3777,15 +3875,7 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
        dev->mtu = new_mtu;
        netdev_update_features(dev);
        rtl_jumbo_config(tp);
-
-       switch (tp->mac_version) {
-       case RTL_GIGA_MAC_VER_61:
-       case RTL_GIGA_MAC_VER_63:
-               rtl8125_set_eee_txidle_timer(tp);
-               break;
-       default:
-               break;
-       }
+       rtl_set_eee_txidle_timer(tp);
 
        return 0;
 }
@@ -3929,7 +4019,7 @@ static void rtl8169_cleanup(struct rtl8169_private *tp)
                RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
                rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
                break;
-       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65:
                rtl_enable_rxdvgate(tp);
                fsleep(2000);
                break;
@@ -4080,8 +4170,7 @@ static unsigned int rtl_quirk_packet_padto(struct rtl8169_private *tp,
 
        switch (tp->mac_version) {
        case RTL_GIGA_MAC_VER_34:
-       case RTL_GIGA_MAC_VER_61:
-       case RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65:
                padto = max_t(unsigned int, padto, ETH_ZLEN);
                break;
        default:
@@ -5058,7 +5147,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
        }
 
        tp->phydev->mac_managed_pm = true;
-
+       if (rtl_supports_eee(tp))
+               phy_advertise_eee_all(tp->phydev);
        phy_support_asym_pause(tp->phydev);
 
        /* PHY will be woken up in rtl_open() */
@@ -5108,7 +5198,7 @@ static void rtl_hw_initialize(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48:
                rtl_hw_init_8168g(tp);
                break;
-       case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63:
+       case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65:
                rtl_hw_init_8125(tp);
                break;
        default:
@@ -5193,7 +5283,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        tp->dev = dev;
        tp->pci_dev = pdev;
        tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
-       tp->eee_adv = -1;
        tp->ocp_base = OCP_STD_PHY_BASE;
 
        raw_spin_lock_init(&tp->cfg9346_usage_lock);
@@ -5201,11 +5290,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        raw_spin_lock_init(&tp->mac_ocp_lock);
        mutex_init(&tp->led_lock);
 
-       dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
-                                                  struct pcpu_sw_netstats);
-       if (!dev->tstats)
-               return -ENOMEM;
-
        /* Get the *optional* external "ether_clk" used on some boards */
        tp->clk = devm_clk_get_optional_enabled(&pdev->dev, "ether_clk");
        if (IS_ERR(tp->clk))
@@ -5320,6 +5404,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->hw_features |= NETIF_F_RXALL;
        dev->hw_features |= NETIF_F_RXFCS;
 
+       dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
+
        netdev_sw_irq_coalesce_default_on(dev);
 
        /* configure chip for default features */
@@ -5356,10 +5442,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (rc)
                return rc;
 
-       if (IS_ENABLED(CONFIG_R8169_LEDS) &&
-           tp->mac_version > RTL_GIGA_MAC_VER_06 &&
-           tp->mac_version < RTL_GIGA_MAC_VER_61)
-               rtl8168_init_leds(dev);
+       if (IS_ENABLED(CONFIG_R8169_LEDS)) {
+               if (rtl_is_8125(tp))
+                       rtl8125_init_leds(dev);
+               else if (tp->mac_version > RTL_GIGA_MAC_VER_06)
+                       rtl8168_init_leds(dev);
+       }
 
        netdev_info(dev, "%s, %pM, XID %03x, IRQ %d\n",
                    rtl_chip_infos[chipset].name, dev->dev_addr, xid, tp->irq);