Signed-off-by: Howard Wang <[email protected]>
---
 drivers/net/r8169/base/rtl9151a.c     |  87 ++++++++++++++++++++
 drivers/net/r8169/base/rtl9151a.h     |  10 +++
 drivers/net/r8169/base/rtl9151a_mcu.c |  53 ++++++++++++
 drivers/net/r8169/meson.build         |   2 +
 drivers/net/r8169/r8169_compat.h      |   3 +
 drivers/net/r8169/r8169_ethdev.c      |   5 +-
 drivers/net/r8169/r8169_ethdev.h      |   3 +
 drivers/net/r8169/r8169_hw.c          | 112 +++++++++++++++++---------
 drivers/net/r8169/r8169_hw.h          |   4 +-
 drivers/net/r8169/r8169_phy.c         |  36 ++-------
 10 files changed, 246 insertions(+), 69 deletions(-)
 create mode 100644 drivers/net/r8169/base/rtl9151a.c
 create mode 100644 drivers/net/r8169/base/rtl9151a.h
 create mode 100644 drivers/net/r8169/base/rtl9151a_mcu.c

diff --git a/drivers/net/r8169/base/rtl9151a.c 
b/drivers/net/r8169/base/rtl9151a.c
new file mode 100644
index 0000000000..4eca5fb96b
--- /dev/null
+++ b/drivers/net/r8169/base/rtl9151a.c
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_ethdev.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl9151a.h"
+
+/* For RTL9151A, CFG_METHOD_60 */
+
+static void
+hw_init_rxcfg_9151a(struct rtl_hw *hw)
+{
+       RTL_W32(hw, RxConfig, Rx_Fetch_Number_8 | Rx_Close_Multiple |
+               RxCfg_pause_slot_en | (RX_DMA_BURST_512 << RxCfgDMAShift));
+}
+
+static void
+hw_ephy_config_9151a(struct rtl_hw *hw)
+{
+       switch (hw->mcfg) {
+       case CFG_METHOD_60:
+               /* nothing to do */
+               break;
+       }
+}
+
+static void
+rtl_hw_phy_config_9151a_1(struct rtl_hw *hw)
+{
+       rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11);
+
+       rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8079);
+       rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x4400);
+       rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAC16, 0x00FF, 0x0001);
+       rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAD0E, 0x007F, 0x000D);
+
+       rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x80B6);
+       rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0xB6C3);
+}
+
+static void
+hw_phy_config_9151a(struct rtl_hw *hw)
+{
+       switch (hw->mcfg) {
+       case CFG_METHOD_60:
+               rtl_hw_phy_config_9151a_1(hw);
+               break;
+       }
+}
+
+static void
+hw_mac_mcu_config_9151a(struct rtl_hw *hw)
+{
+       if (hw->NotWrMcuPatchCode)
+               return;
+
+       rtl_hw_disable_mac_mcu_bps(hw);
+
+       /* Get H/W mac mcu patch code version */
+       hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
+       switch (hw->mcfg) {
+       case CFG_METHOD_60:
+               /* no mac mcu patch code */
+               break;
+       }
+}
+
+static void
+hw_phy_mcu_config_9151a(struct rtl_hw *hw)
+{
+       switch (hw->mcfg) {
+       case CFG_METHOD_60:
+               rtl_set_phy_mcu_9151a_1(hw);
+               break;
+       }
+}
+
+const struct rtl_hw_ops rtl9151a_ops = {
+       .hw_init_rxcfg     = hw_init_rxcfg_9151a,
+       .hw_ephy_config    = hw_ephy_config_9151a,
+       .hw_phy_config     = hw_phy_config_9151a,
+       .hw_mac_mcu_config = hw_mac_mcu_config_9151a,
+       .hw_phy_mcu_config = hw_phy_mcu_config_9151a,
+};
diff --git a/drivers/net/r8169/base/rtl9151a.h 
b/drivers/net/r8169/base/rtl9151a.h
new file mode 100644
index 0000000000..bf0e2017d6
--- /dev/null
+++ b/drivers/net/r8169/base/rtl9151a.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef RTL9151A_H
+#define RTL9151A_H
+
+void rtl_set_phy_mcu_9151a_1(struct rtl_hw *hw);
+
+#endif /* RTL9151A_H */
diff --git a/drivers/net/r8169/base/rtl9151a_mcu.c 
b/drivers/net/r8169/base/rtl9151a_mcu.c
new file mode 100644
index 0000000000..50a2cd90e6
--- /dev/null
+++ b/drivers/net/r8169/base/rtl9151a_mcu.c
@@ -0,0 +1,53 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_ethdev.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl9151a.h"
+
+/* For RTL9151A, CFG_METHOD_60 */
+
+/* ------------------------------------MAC 
9151A------------------------------------- */
+
+/* ------------------------------------PHY 
9151A--------------------------------------- */
+
+static const u16 phy_mcu_ram_code_9151a_1_1[] = {
+       0xa436, 0x8023, 0xa438, 0x5100, 0xa436, 0xB82E, 0xa438, 0x0001,
+       0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012,
+       0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010,
+       0xa438, 0x1800, 0xa438, 0x8017, 0xa438, 0x1800, 0xa438, 0x8028,
+       0xa438, 0x1800, 0xa438, 0x8028, 0xa438, 0x1800, 0xa438, 0x8028,
+       0xa438, 0x1800, 0xa438, 0x8028, 0xa438, 0x1800, 0xa438, 0x8028,
+       0xa438, 0x1800, 0xa438, 0x8028, 0xa438, 0x8901, 0xa438, 0xd707,
+       0xa438, 0x4076, 0xa438, 0x1800, 0xa438, 0x1399, 0xa438, 0x1800,
+       0xa438, 0x139f, 0xa438, 0xa00a, 0xa438, 0x0c06, 0xa438, 0x0102,
+       0xa438, 0xa240, 0xa438, 0xa290, 0xa438, 0xa344, 0xa438, 0xab02,
+       0xa438, 0xa404, 0xa438, 0xd1c7, 0xa438, 0xd045, 0xa438, 0x1000,
+       0xa438, 0x125f, 0xa438, 0xd700, 0xa438, 0x5fbb, 0xa438, 0xa320,
+       0xa438, 0x1800, 0xa438, 0x0cc2, 0xa436, 0xA10E, 0xa438, 0xffff,
+       0xa436, 0xA10C, 0xa438, 0xffff, 0xa436, 0xA10A, 0xa438, 0xffff,
+       0xa436, 0xA108, 0xa438, 0xffff, 0xa436, 0xA106, 0xa438, 0xffff,
+       0xa436, 0xA104, 0xa438, 0xffff, 0xa436, 0xA102, 0xa438, 0x0cb4,
+       0xa436, 0xA100, 0xa438, 0x1398, 0xa436, 0xA110, 0xa438, 0x0003,
+       0xb820, 0x0010, 0xB82E, 0x0000, 0xa436, 0x8023, 0xa438, 0x0000,
+       0xB820, 0x0000, 0xFFFF, 0xFFFF
+};
+
+static void
+rtl_real_set_phy_mcu_9151a_1_1(struct rtl_hw *hw)
+{
+       rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_9151a_1_1,
+                                ARRAY_SIZE(phy_mcu_ram_code_9151a_1_1));
+}
+
+void
+rtl_set_phy_mcu_9151a_1(struct rtl_hw *hw)
+{
+       rtl_set_phy_mcu_patch_request(hw);
+
+       rtl_real_set_phy_mcu_9151a_1_1(hw);
+
+       rtl_clear_phy_mcu_patch_request(hw);
+}
diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build
index e0b3e88c3d..3747e198bc 100644
--- a/drivers/net/r8169/meson.build
+++ b/drivers/net/r8169/meson.build
@@ -32,4 +32,6 @@ sources = files(
         'base/rtl8168m.c',
         'base/rtl8127.c',
         'base/rtl8127_mcu.c',
+        'base/rtl9151a.c',
+        'base/rtl9151a_mcu.c',
 )
diff --git a/drivers/net/r8169/r8169_compat.h b/drivers/net/r8169/r8169_compat.h
index 673a1ca274..4339522f2d 100644
--- a/drivers/net/r8169/r8169_compat.h
+++ b/drivers/net/r8169/r8169_compat.h
@@ -271,6 +271,8 @@ enum RTL_registers {
        IB2SOC_DATA    = 0x0014,
        IB2SOC_CMD     = 0x0018,
        IB2SOC_IMR     = 0x001C,
+       /* 9151 */
+       TxConfigV2     = 0x60B0,
 };
 
 enum RTL_register_content {
@@ -526,6 +528,7 @@ enum RTL_chipset_name {
        RTL8125D,
        RTL8125CP,
        RTL8168KD,
+       RTL9151A,
        RTL8126A,
        RTL8168EP,
        RTL8168FP,
diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c
index 80e03dd53c..625f50853e 100644
--- a/drivers/net/r8169/r8169_ethdev.c
+++ b/drivers/net/r8169/r8169_ethdev.c
@@ -171,6 +171,7 @@ _rtl_setup_link(struct rte_eth_dev *dev)
                case RTL8125BP:
                case RTL8125D:
                case RTL8125CP:
+               case RTL9151A:
                        speed_mode = SPEED_2500;
                        break;
                case RTL8126A:
@@ -426,6 +427,7 @@ rtl_dev_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
        case CFG_METHOD_56:
        case CFG_METHOD_57:
        case CFG_METHOD_58:
+       case CFG_METHOD_60:
        case CFG_METHOD_70:
        case CFG_METHOD_71:
        case CFG_METHOD_91:
@@ -471,6 +473,7 @@ rtl_dev_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
        case RTL8125BP:
        case RTL8125D:
        case RTL8125CP:
+       case RTL9151A:
                dev_info->speed_capa |= RTE_ETH_LINK_SPEED_2_5G;
                break;
        }
@@ -931,7 +934,7 @@ rtl_dev_init(struct rte_eth_dev *dev)
 
        rtl_disable_intr(hw);
 
-       rtl_hw_initialize(hw);
+       rtl_hw_initialize(hw, pci_dev);
 
        /* Read the permanent MAC address out of ROM */
        rtl_get_mac_address(hw, perm_addr);
diff --git a/drivers/net/r8169/r8169_ethdev.h b/drivers/net/r8169/r8169_ethdev.h
index a7604df6c2..d3676ee7d2 100644
--- a/drivers/net/r8169/r8169_ethdev.h
+++ b/drivers/net/r8169/r8169_ethdev.h
@@ -117,6 +117,9 @@ struct rtl_hw {
 
        u16 mcu_pme_setting;
 
+       /* Device function */
+       u8 function;
+
        /* Enable Tx No Close */
        u8  HwSuppTxNoCloseVer;
        u8  EnableTxNoClose;
diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c
index 3f7e452132..ef2b0654a5 100644
--- a/drivers/net/r8169/r8169_hw.c
+++ b/drivers/net/r8169/r8169_hw.c
@@ -496,22 +496,7 @@ rtl_csi_other_fun_read(struct rtl_hw *hw, u8 
multi_fun_sel_bit, u32 addr)
 u32
 rtl_csi_read(struct rtl_hw *hw, u32 addr)
 {
-       u8 multi_fun_sel_bit;
-
-       switch (hw->mcfg) {
-       case CFG_METHOD_26:
-       case CFG_METHOD_31:
-       case CFG_METHOD_32:
-       case CFG_METHOD_33:
-       case CFG_METHOD_34:
-               multi_fun_sel_bit = 1;
-               break;
-       default:
-               multi_fun_sel_bit = 0;
-               break;
-       }
-
-       return rtl_csi_other_fun_read(hw, multi_fun_sel_bit, addr);
+       return rtl_csi_other_fun_read(hw, hw->function, addr);
 }
 
 void
@@ -546,22 +531,7 @@ rtl_csi_other_fun_write(struct rtl_hw *hw, u8 
multi_fun_sel_bit, u32 addr,
 void
 rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
 {
-       u8 multi_fun_sel_bit;
-
-       switch (hw->mcfg) {
-       case CFG_METHOD_26:
-       case CFG_METHOD_31:
-       case CFG_METHOD_32:
-       case CFG_METHOD_33:
-       case CFG_METHOD_34:
-               multi_fun_sel_bit = 1;
-               break;
-       default:
-               multi_fun_sel_bit = 0;
-               break;
-       }
-
-       rtl_csi_other_fun_write(hw, multi_fun_sel_bit, addr, value);
+       rtl_csi_other_fun_write(hw, hw->function, addr, value);
 }
 
 void
@@ -631,6 +601,7 @@ rtl_stop_all_request(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
        case CFG_METHOD_70:
        case CFG_METHOD_71:
        case CFG_METHOD_91:
@@ -688,6 +659,7 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
        case CFG_METHOD_70:
        case CFG_METHOD_71:
        case CFG_METHOD_91:
@@ -925,6 +897,7 @@ rtl8125_set_rx_desc_type(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
                RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~EnableRxDescV4_0);
                break;
        case CFG_METHOD_70:
@@ -1043,7 +1016,7 @@ rtl8125_hw_config(struct rtl_hw *hw)
        rtl_oob_mutex_lock(hw);
 
        if (hw->mcfg == CFG_METHOD_56 || hw->mcfg == CFG_METHOD_57 ||
-           hw->mcfg == CFG_METHOD_59)
+           hw->mcfg == CFG_METHOD_59 || hw->mcfg == CFG_METHOD_60)
                rtl_mac_ocp_write(hw, 0xE0C0, 0x4403);
        else
                rtl_mac_ocp_write(hw, 0xE0C0, 0x4000);
@@ -1259,6 +1232,10 @@ rtl_set_hw_ops(struct rtl_hw *hw)
        case CFG_METHOD_58:
                hw->hw_ops = rtl8125cp_ops;
                return 0;
+       /* 9151A */
+       case CFG_METHOD_60:
+               hw->hw_ops = rtl9151a_ops;
+               return 0;
        /* 8126A */
        case CFG_METHOD_70:
        case CFG_METHOD_71:
@@ -1486,7 +1463,7 @@ rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 
speed, u8 duplex,
 }
 
 static void
-rtl_init_software_variable(struct rtl_hw *hw)
+rtl_init_software_variable(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
 {
        int tx_no_close_enable = 1;
        unsigned int speed_mode;
@@ -1547,6 +1524,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case CFG_METHOD_59:
                hw->chipset_name = RTL8168KD;
                break;
+       case CFG_METHOD_60:
+               hw->chipset_name = RTL9151A;
+               break;
        case CFG_METHOD_70:
        case CFG_METHOD_71:
                hw->chipset_name = RTL8126A;
@@ -1566,6 +1546,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case RTL8125BP:
        case RTL8125D:
        case RTL8125CP:
+       case RTL9151A:
                speed_mode = SPEED_2500;
                break;
        case RTL8126A:
@@ -1697,6 +1678,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
        case CFG_METHOD_70:
        case CFG_METHOD_71:
        case CFG_METHOD_91:
@@ -1719,6 +1701,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
        case CFG_METHOD_91:
                hw->HwSuppTxNoCloseVer = 6;
                break;
@@ -1813,6 +1796,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case CFG_METHOD_58:
                hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_58;
                break;
+       case CFG_METHOD_60:
+               hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_60;
+               break;
        case CFG_METHOD_70:
                hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_70;
                break;
@@ -1863,6 +1849,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
        case CFG_METHOD_91:
                hw->HwSuppIntMitiVer = 6;
                break;
@@ -1894,6 +1881,8 @@ rtl_init_software_variable(struct rtl_hw *hw)
        rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, 
rtl_fc_full);
 
        hw->mtu = RTL_DEFAULT_MTU;
+
+       hw->function = pci_dev->addr.function;
 }
 
 static void
@@ -2104,9 +2093,9 @@ rtl_hw_init(struct rtl_hw *hw)
 }
 
 void
-rtl_hw_initialize(struct rtl_hw *hw)
+rtl_hw_initialize(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
 {
-       rtl_init_software_variable(hw);
+       rtl_init_software_variable(hw, pci_dev);
 
        rtl_exit_oob(hw);
 
@@ -2115,6 +2104,36 @@ rtl_hw_initialize(struct rtl_hw *hw)
        rtl_nic_reset(hw);
 }
 
+static void
+rtl8125_get_mac_version_v2(struct rtl_hw *hw)
+{
+       u32 reg, val32;
+       u32 ic_version_id;
+
+       val32 = RTL_R32(hw, TxConfigV2);
+       reg = val32 & 0x7fffffc0;
+       ic_version_id = val32 & 0x3f;
+
+       RTE_ASSERT(val32 != UINT_MAX &&
+                  (val32 & RTL_R32(hw, TxConfig) & 0x7c800000) == 0x7c800000);
+
+       if (val32 == UINT_MAX)
+               return;
+
+       switch (reg) {
+       case 0x00000000:
+               if (ic_version_id == 0x00000000) {
+                       hw->mcfg = CFG_METHOD_60;
+               } else {
+                       hw->mcfg = CFG_METHOD_60;
+                       hw->HwIcVerUnknown = TRUE;
+               }
+               break;
+       default:
+               break;
+       }
+}
+
 void
 rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
 {
@@ -2125,6 +2144,13 @@ rtl_get_mac_version(struct rtl_hw *hw, struct 
rte_pci_device *pci_dev)
        reg = val32 & 0x7c800000;
        ic_version_id = val32 & 0x00700000;
 
+       hw->mcfg = CFG_METHOD_DEFAULT;
+
+       RTE_ASSERT(val32 != UINT_MAX);
+
+       if (val32 == UINT_MAX)
+               goto exit;
+
        switch (reg) {
        case 0x30000000:
                hw->mcfg = CFG_METHOD_1;
@@ -2336,8 +2362,10 @@ rtl_get_mac_version(struct rtl_hw *hw, struct 
rte_pci_device *pci_dev)
                        hw->mcfg = CFG_METHOD_56;
                } else if (ic_version_id == 0x100000) {
                        hw->mcfg = CFG_METHOD_57;
+               } else if (ic_version_id == 0x300000) {
+                       hw->mcfg = CFG_METHOD_60;
                } else {
-                       hw->mcfg = CFG_METHOD_57;
+                       hw->mcfg = CFG_METHOD_61;
                        hw->HwIcVerUnknown = TRUE;
                }
                break;
@@ -2369,11 +2397,17 @@ rtl_get_mac_version(struct rtl_hw *hw, struct 
rte_pci_device *pci_dev)
                        hw->HwIcVerUnknown = TRUE;
                }
                break;
+       case 0x7C800000:
+               rtl8125_get_mac_version_v2(hw);
+               break;
        default:
+               break;
+       }
+
+exit:
+       if (hw->mcfg == CFG_METHOD_DEFAULT) {
                PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg);
-               hw->mcfg = CFG_METHOD_DEFAULT;
                hw->HwIcVerUnknown = TRUE;
-               break;
        }
 
        if (pci_dev->id.device_id == 0x8162) {
diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h
index 1bdc46bd17..65007c2a7e 100644
--- a/drivers/net/r8169/r8169_hw.h
+++ b/drivers/net/r8169/r8169_hw.h
@@ -45,7 +45,7 @@ void rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw);
 void rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry,
                                u16 entry_cnt);
 
-void rtl_hw_initialize(struct rtl_hw *hw);
+void rtl_hw_initialize(struct rtl_hw *hw, struct rte_pci_device *pci_dev);
 
 bool rtl_is_speed_mode_valid(struct rtl_hw *hw, u32 speed);
 
@@ -91,6 +91,7 @@ extern const struct rtl_hw_ops rtl8125a_ops;
 extern const struct rtl_hw_ops rtl8125b_ops;
 extern const struct rtl_hw_ops rtl8125bp_ops;
 extern const struct rtl_hw_ops rtl8125d_ops;
+extern const struct rtl_hw_ops rtl9151a_ops;
 extern const struct rtl_hw_ops rtl8126a_ops;
 extern const struct rtl_hw_ops rtl8168kb_ops;
 extern const struct rtl_hw_ops rtl8127_ops;
@@ -137,6 +138,7 @@ extern const struct rtl_hw_ops rtl8125cp_ops;
 #define NIC_RAMCODE_VERSION_CFG_METHOD_56  (0x0027)
 #define NIC_RAMCODE_VERSION_CFG_METHOD_57  (0x0034)
 #define NIC_RAMCODE_VERSION_CFG_METHOD_58  (0x0024)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_60  (0x0003)
 #define NIC_RAMCODE_VERSION_CFG_METHOD_70  (0x0033)
 #define NIC_RAMCODE_VERSION_CFG_METHOD_71  (0x0060)
 #define NIC_RAMCODE_VERSION_CFG_METHOD_91  (0x0051)
diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c
index 8988c6f288..de6e512375 100644
--- a/drivers/net/r8169/r8169_phy.c
+++ b/drivers/net/r8169/r8169_phy.c
@@ -551,7 +551,7 @@ rtl_powerdown_pll(struct rtl_hw *hw)
 
        if (!hw->HwIcVerUnknown) {
                if (!(hw->mcfg == CFG_METHOD_23 || hw->mcfg == CFG_METHOD_37 ||
-                     hw->mcfg == CFG_METHOD_91))
+                     hw->mcfg == CFG_METHOD_60 || hw->mcfg == CFG_METHOD_91))
                        RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7);
        }
 
@@ -964,21 +964,9 @@ _rtl_disable_adv_eee(struct rtl_hw *hw)
                rtl_mdio_write(hw, 0x11, data);
                rtl_mdio_write(hw, 0x1F, 0x0000);
                break;
-       case CFG_METHOD_48:
-       case CFG_METHOD_49:
-       case CFG_METHOD_50:
-       case CFG_METHOD_51:
-       case CFG_METHOD_52:
-       case CFG_METHOD_53:
-       case CFG_METHOD_54:
-       case CFG_METHOD_55:
-       case CFG_METHOD_56:
-       case CFG_METHOD_57:
-       case CFG_METHOD_58:
-       case CFG_METHOD_59:
-       case CFG_METHOD_70:
-       case CFG_METHOD_71:
-       case CFG_METHOD_91:
+       default:
+               if (!rtl_is_8125(hw))
+                       break;
                rtl_clear_mac_ocp_bit(hw, 0xE052, BIT_0);
                rtl_clear_eth_phy_ocp_bit(hw, 0xA442, (BIT_12 | BIT_13));
                rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_15);
@@ -1062,6 +1050,7 @@ rtl_disable_eee(struct rtl_hw *hw)
        case CFG_METHOD_57:
        case CFG_METHOD_58:
        case CFG_METHOD_59:
+       case CFG_METHOD_60:
                rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
 
                rtl_set_eth_phy_ocp_bit(hw, 0xA432, BIT_4);
@@ -1213,18 +1202,9 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 
speed, u8 duplex, u64 adv)
        case CFG_METHOD_71:
                mask |= BIT_1;
        /* Fall through */
-       case CFG_METHOD_48:
-       case CFG_METHOD_49:
-       case CFG_METHOD_50:
-       case CFG_METHOD_51:
-       case CFG_METHOD_52:
-       case CFG_METHOD_53:
-       case CFG_METHOD_54:
-       case CFG_METHOD_55:
-       case CFG_METHOD_56:
-       case CFG_METHOD_57:
-       case CFG_METHOD_58:
-       case CFG_METHOD_59:
+       default:
+               if (!rtl_is_8125(hw))
+                       break;
                mask |= BIT_0;
                rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9);
                rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, mask);
-- 
2.34.1

Reply via email to