From: Howard Wang <howard_wang@realsil.com.cn>
To: <dev@dpdk.org>
Cc: <pro_nic_dpdk@realtek.com>, Howard Wang <howard_wang@realsil.com.cn>
Subject: [PATCH v1 1/8] net/r8169: add support for RTL8168 series
Date: Tue, 10 Jun 2025 14:22:34 +0800 [thread overview]
Message-ID: <20250610062241.4517-2-howard_wang@realsil.com.cn> (raw)
In-Reply-To: <20250610062241.4517-1-howard_wang@realsil.com.cn>
This patch adds support for RTL8168EP, RTL8168FP, RTL8168G, RTL8168H
and RTL8168M.
Signed-off-by: Howard Wang <howard_wang@realsil.com.cn>
---
doc/guides/nics/r8169.rst | 4 +
drivers/net/r8169/base/rtl8125a_mcu.c | 7 +-
drivers/net/r8169/base/rtl8126a.c | 4 +-
drivers/net/r8169/base/rtl8168ep.c | 221 +++
drivers/net/r8169/base/rtl8168ep.h | 15 +
drivers/net/r8169/base/rtl8168ep_mcu.c | 177 +++
drivers/net/r8169/base/rtl8168fp.c | 195 +++
drivers/net/r8169/base/rtl8168fp.h | 14 +
drivers/net/r8169/base/rtl8168fp_mcu.c | 270 ++++
drivers/net/r8169/base/rtl8168g.c | 297 ++++
drivers/net/r8169/base/rtl8168g.h | 15 +
drivers/net/r8169/base/rtl8168g_mcu.c | 1936 ++++++++++++++++++++++++
drivers/net/r8169/base/rtl8168h.c | 447 ++++++
drivers/net/r8169/base/rtl8168h.h | 21 +
drivers/net/r8169/base/rtl8168h_mcu.c | 1186 +++++++++++++++
drivers/net/r8169/base/rtl8168m.c | 19 +
drivers/net/r8169/meson.build | 9 +
drivers/net/r8169/r8169_compat.h | 25 +-
drivers/net/r8169/r8169_dash.c | 439 +++++-
drivers/net/r8169/r8169_dash.h | 8 +-
drivers/net/r8169/r8169_ethdev.c | 179 ++-
drivers/net/r8169/r8169_ethdev.h | 32 +-
drivers/net/r8169/r8169_hw.c | 1713 +++++++++++++++++++--
drivers/net/r8169/r8169_hw.h | 56 +-
drivers/net/r8169/r8169_phy.c | 1024 +++++++++++--
drivers/net/r8169/r8169_phy.h | 11 +
drivers/net/r8169/r8169_rxtx.c | 317 +++-
27 files changed, 8261 insertions(+), 380 deletions(-)
create mode 100644 drivers/net/r8169/base/rtl8168ep.c
create mode 100644 drivers/net/r8169/base/rtl8168ep.h
create mode 100644 drivers/net/r8169/base/rtl8168ep_mcu.c
create mode 100644 drivers/net/r8169/base/rtl8168fp.c
create mode 100644 drivers/net/r8169/base/rtl8168fp.h
create mode 100644 drivers/net/r8169/base/rtl8168fp_mcu.c
create mode 100644 drivers/net/r8169/base/rtl8168g.c
create mode 100644 drivers/net/r8169/base/rtl8168g.h
create mode 100644 drivers/net/r8169/base/rtl8168g_mcu.c
create mode 100644 drivers/net/r8169/base/rtl8168h.c
create mode 100644 drivers/net/r8169/base/rtl8168h.h
create mode 100644 drivers/net/r8169/base/rtl8168h_mcu.c
create mode 100644 drivers/net/r8169/base/rtl8168m.c
diff --git a/doc/guides/nics/r8169.rst b/doc/guides/nics/r8169.rst
index bffdfc91cf..f3c547c4d4 100644
--- a/doc/guides/nics/r8169.rst
+++ b/doc/guides/nics/r8169.rst
@@ -7,8 +7,12 @@ R8169 Poll Mode Driver
The R8169 PMD provides poll mode driver support for Realtek 1, 2.5 and 5 Gigabit
Ethernet NICs.
+More information about Realtek 1G Ethernet NIC can be found at `RTL8168
+<https://www.realtek.com/Product/Index?id=4080>`_.
+
More information about Realtek 2.5G Ethernet NIC can be found at `RTL8125
<https://www.realtek.com/Product/Index?id=3962&cate_id=786&menu_id=1010>`_.
+
More information about Realtek 5G Ethernet NIC can be found at `RTL8126
<https://www.realtek.com/Product/ProductHitsDetail?id=4425&menu_id=643>`_.
diff --git a/drivers/net/r8169/base/rtl8125a_mcu.c b/drivers/net/r8169/base/rtl8125a_mcu.c
index 5a69b3e094..e2d56102fb 100644
--- a/drivers/net/r8169/base/rtl8125a_mcu.c
+++ b/drivers/net/r8169/base/rtl8125a_mcu.c
@@ -162,7 +162,12 @@ static void
rtl_release_phy_mcu_patch_key_lock(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_53:
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_52:
+ case CFG_METHOD_53:
rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x0000);
rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0000);
rtl_clear_eth_phy_ocp_bit(hw, 0xB82E, BIT_0);
diff --git a/drivers/net/r8169/base/rtl8126a.c b/drivers/net/r8169/base/rtl8126a.c
index 69fe7bc030..84354b6d32 100644
--- a/drivers/net/r8169/base/rtl8126a.c
+++ b/drivers/net/r8169/base/rtl8126a.c
@@ -29,7 +29,9 @@ static void
hw_ephy_config_8126a(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
/* nothing to do */
break;
}
diff --git a/drivers/net/r8169/base/rtl8168ep.c b/drivers/net/r8169/base/rtl8168ep.c
new file mode 100644
index 0000000000..5f955d2b0d
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168ep.c
@@ -0,0 +1,221 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168ep.h"
+
+/* For RTL8168EP, CFG_METHOD_23,27,28 */
+
+static void
+hw_init_rxcfg_8168ep(struct rtl_hw *hw)
+{
+ RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
+ (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
+}
+
+static void
+hw_ephy_config_8168ep(struct rtl_hw *hw)
+{
+ u16 ephy_data;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ rtl_ephy_write(hw, 0x00, 0x10AB);
+ rtl_ephy_write(hw, 0x06, 0xf030);
+ rtl_ephy_write(hw, 0x08, 0x2006);
+ rtl_ephy_write(hw, 0x0D, 0x1666);
+
+ ephy_data = rtl_ephy_read(hw, 0x0C);
+ ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
+ BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
+ rtl_ephy_write(hw, 0x0C, ephy_data);
+ break;
+ case CFG_METHOD_27:
+ rtl_ephy_write(hw, 0x00, 0x10A3);
+ rtl_ephy_write(hw, 0x19, 0xFC00);
+ rtl_ephy_write(hw, 0x1E, 0x20EA);
+ break;
+ case CFG_METHOD_28:
+ rtl_ephy_write(hw, 0x00, 0x10AB);
+ rtl_ephy_write(hw, 0x19, 0xFC00);
+ rtl_ephy_write(hw, 0x1E, 0x20EB);
+ rtl_ephy_write(hw, 0x0D, 0x1666);
+ rtl_clear_pcie_phy_bit(hw, 0x0B, BIT_0);
+ rtl_set_pcie_phy_bit(hw, 0x1D, BIT_14);
+ rtl_clear_and_set_pcie_phy_bit(hw, 0x0C, (BIT_13 | BIT_12 | BIT_11 |
+ BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5),
+ BIT_9 | BIT_4);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+hw_phy_config_8168ep(struct rtl_hw *hw)
+{
+ if (hw->mcfg == CFG_METHOD_23) {
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) |
+ (BIT_3 | BIT_2));
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8084);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) &
+ ~(BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A4B);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8012);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0C42);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x11, BIT_13, BIT_14);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ } else if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) {
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8084);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8012);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
+
+ rtl_mdio_write(hw, 0x1F, 0x0C42);
+ rtl_mdio_write(hw, 0x11, (rtl_mdio_read(hw, 0x11) & ~BIT_13) | BIT_14);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x80F3);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00);
+ rtl_mdio_write(hw, 0x13, 0x80F0);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00);
+ rtl_mdio_write(hw, 0x13, 0x80EF);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500);
+ rtl_mdio_write(hw, 0x13, 0x80F6);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00);
+ rtl_mdio_write(hw, 0x13, 0x80EC);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800);
+ rtl_mdio_write(hw, 0x13, 0x80ED);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
+ rtl_mdio_write(hw, 0x13, 0x80F2);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400);
+ rtl_mdio_write(hw, 0x13, 0x80F4);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8110);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800);
+ rtl_mdio_write(hw, 0x13, 0x810F);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00);
+ rtl_mdio_write(hw, 0x13, 0x8111);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500);
+ rtl_mdio_write(hw, 0x13, 0x8113);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100);
+ rtl_mdio_write(hw, 0x13, 0x8115);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200);
+ rtl_mdio_write(hw, 0x13, 0x810E);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400);
+ rtl_mdio_write(hw, 0x13, 0x810C);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
+ rtl_mdio_write(hw, 0x13, 0x810B);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x80D1);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00);
+ rtl_mdio_write(hw, 0x13, 0x80CD);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00);
+ rtl_mdio_write(hw, 0x13, 0x80D3);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00);
+ rtl_mdio_write(hw, 0x13, 0x80D5);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00);
+ rtl_mdio_write(hw, 0x13, 0x80D7);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400);
+ }
+}
+
+static void
+hw_config_8168ep(struct rtl_hw *hw)
+{
+ u16 mac_ocp_data;
+ u32 csi_tmp;
+
+ rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xCC, 1, 0x2F, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xD0, 1, 0x5F, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
+
+ /* Adjust the trx fifo */
+ rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
+
+ /* Disable share fifo */
+ RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
+
+ csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+ csi_tmp |= BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
+
+ /* EEE led enable */
+ RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
+
+ if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) {
+ rtl_oob_mutex_lock(hw);
+ rtl_eri_write(hw, 0x5F0, 2, 0x4F87, ERIAR_ExGMAC);
+ rtl_oob_mutex_unlock(hw);
+ }
+
+ rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
+ rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
+
+ if (hw->mcfg == CFG_METHOD_28) {
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E2);
+ mac_ocp_data &= 0xF000;
+ mac_ocp_data |= 0xAFD;
+ rtl_mac_ocp_write(hw, 0xD3E2, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E4);
+ mac_ocp_data &= 0xFF00;
+ rtl_mac_ocp_write(hw, 0xD3E4, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE860);
+ mac_ocp_data |= BIT_7;
+ rtl_mac_ocp_write(hw, 0xE860, mac_ocp_data);
+ }
+}
+
+const struct rtl_hw_ops rtl8168ep_ops = {
+ .hw_config = hw_config_8168ep,
+ .hw_init_rxcfg = hw_init_rxcfg_8168ep,
+ .hw_ephy_config = hw_ephy_config_8168ep,
+ .hw_phy_config = hw_phy_config_8168ep,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8168ep,
+ .hw_phy_mcu_config = hw_phy_mcu_config_8168ep,
+};
diff --git a/drivers/net/r8169/base/rtl8168ep.h b/drivers/net/r8169/base/rtl8168ep.h
new file mode 100644
index 0000000000..a03c94dc9f
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168ep.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef _RTL8168EP_H_
+#define _RTL8168EP_H_
+
+#include "../r8169_compat.h"
+
+extern const struct rtl_hw_ops rtl8168ep_ops;
+
+void hw_mac_mcu_config_8168ep(struct rtl_hw *hw);
+void hw_phy_mcu_config_8168ep(struct rtl_hw *hw);
+
+#endif
diff --git a/drivers/net/r8169/base/rtl8168ep_mcu.c b/drivers/net/r8169/base/rtl8168ep_mcu.c
new file mode 100644
index 0000000000..49375390ab
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168ep_mcu.c
@@ -0,0 +1,177 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_dash.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168ep.h"
+
+/* For RTL8168EP, CFG_METHOD_23,27,28 */
+
+/* -------------------------------------MAC 8168EP------------------------------------ */
+
+static void
+rtl8168_set_mac_mcu_8168ep_1(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168ep_1[] = {
+ 0xE008, 0xE0D3, 0xE0D6, 0xE0D9, 0xE0DB, 0xE0DD, 0xE0DF, 0xE0E1, 0xC251,
+ 0x7340, 0x49B1, 0xF010, 0x1D02, 0x8D40, 0xC202, 0xBA00, 0x2C3A, 0xC0F0,
+ 0xE8DE, 0x2000, 0x8000, 0xC0B6, 0x268C, 0x752C, 0x49D4, 0xF112, 0xE025,
+ 0xC2F6, 0x7146, 0xC2F5, 0x7340, 0x49BE, 0xF103, 0xC7F2, 0xE002, 0xC7F1,
+ 0x304F, 0x6226, 0x49A1, 0xF1F0, 0x7222, 0x49A0, 0xF1ED, 0x2525, 0x1F28,
+ 0x3097, 0x3091, 0x9A36, 0x752C, 0x21DC, 0x25BC, 0xC6E2, 0x77C0, 0x1304,
+ 0xF014, 0x1303, 0xF014, 0x1302, 0xF014, 0x1301, 0xF014, 0x49D4, 0xF103,
+ 0xC3D7, 0xBB00, 0xC618, 0x67C6, 0x752E, 0x22D7, 0x26DD, 0x1505, 0xF013,
+ 0xC60A, 0xBE00, 0xC309, 0xBB00, 0xC308, 0xBB00, 0xC307, 0xBB00, 0xC306,
+ 0xBB00, 0x25C8, 0x25A6, 0x25AC, 0x25B2, 0x25B8, 0xCD08, 0x0000, 0xC0BC,
+ 0xC2FF, 0x7340, 0x49B0, 0xF04E, 0x1F46, 0x308F, 0xC3F7, 0x1C04, 0xE84D,
+ 0x1401, 0xF147, 0x7226, 0x49A7, 0xF044, 0x7222, 0x2525, 0x1F30, 0x3097,
+ 0x3091, 0x7340, 0xC4EA, 0x401C, 0xF006, 0xC6E8, 0x75C0, 0x49D7, 0xF105,
+ 0xE036, 0x1D08, 0x8DC1, 0x0208, 0x6640, 0x2764, 0x1606, 0xF12F, 0x6346,
+ 0x133B, 0xF12C, 0x9B34, 0x1B18, 0x3093, 0xC32A, 0x1C10, 0xE82A, 0x1401,
+ 0xF124, 0x1A36, 0x308A, 0x7322, 0x25B5, 0x0B0E, 0x1C00, 0xE82C, 0xC71F,
+ 0x4027, 0xF11A, 0xE838, 0x1F42, 0x308F, 0x1B08, 0xE824, 0x7236, 0x7746,
+ 0x1700, 0xF00D, 0xC313, 0x401F, 0xF103, 0x1F00, 0x9F46, 0x7744, 0x449F,
+ 0x445F, 0xE817, 0xC70A, 0x4027, 0xF105, 0xC302, 0xBB00, 0x2E08, 0x2DC2,
+ 0xC7FF, 0xBF00, 0xCDB8, 0xFFFF, 0x0C02, 0xA554, 0xA5DC, 0x402F, 0xF105,
+ 0x1400, 0xF1FA, 0x1C01, 0xE002, 0x1C00, 0xFF80, 0x49B0, 0xF004, 0x0B01,
+ 0xA1D3, 0xE003, 0x0B02, 0xA5D3, 0x3127, 0x3720, 0x0B02, 0xA5D3, 0x3127,
+ 0x3720, 0x1300, 0xF1FB, 0xFF80, 0x7322, 0x25B5, 0x1E28, 0x30DE, 0x30D9,
+ 0x7264, 0x1E11, 0x2368, 0x3116, 0xFF80, 0x1B7E, 0xC602, 0xBE00, 0x06A6,
+ 0x1B7E, 0xC602, 0xBE00, 0x0764, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
+ 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
+ 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_1); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_1[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x2549);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x06A5);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0763);
+}
+
+static void
+rtl8168_set_mac_mcu_8168ep_2(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168ep_2[] = {
+ 0xE008, 0xE017, 0xE052, 0xE056, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xC50F,
+ 0x76A4, 0x49E3, 0xF007, 0x49C0, 0xF103, 0xC607, 0xBE00, 0xC606, 0xBE00,
+ 0xC602, 0xBE00, 0x0BDA, 0x0BB6, 0x0BBA, 0xDC00, 0xB400, 0xB401, 0xB402,
+ 0xB403, 0xB404, 0xC02E, 0x7206, 0x49AE, 0xF1FE, 0xC12B, 0x9904, 0xC12A,
+ 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF117, 0xC123, 0xC223,
+ 0xC323, 0xE808, 0xC322, 0xE806, 0xC321, 0xE804, 0xC320, 0xE802, 0xE00C,
+ 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x990A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE,
+ 0xF1FE, 0xFF80, 0xB004, 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002,
+ 0xB800, 0x1FC8, 0xE000, 0xE8E0, 0xF128, 0x0002, 0xFFFF, 0xF000, 0x8001,
+ 0x8002, 0x8003, 0x8004, 0x48C1, 0x48C2, 0xC502, 0xBD00, 0x0490, 0xC602,
+ 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602,
+ 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_2); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_2[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0BB3);
+ if (!rtl8168_check_dash_other_fun_present(hw))
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x1FC7);
+}
+
+/* ------------------------------------PHY 8168FP------------------------------------- */
+
+static void
+rtl8168_set_phy_mcu_8168ep_2(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x8700);
+ rtl_mdio_write(hw, 0x13, 0xB82E);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+
+ rtl_mdio_write(hw, 0x13, 0x83DD);
+ rtl_mdio_write(hw, 0x14, 0xAF83);
+ rtl_mdio_write(hw, 0x14, 0xE9AF);
+ rtl_mdio_write(hw, 0x14, 0x83EE);
+ rtl_mdio_write(hw, 0x14, 0xAF83);
+ rtl_mdio_write(hw, 0x14, 0xF1A1);
+ rtl_mdio_write(hw, 0x14, 0x83F4);
+ rtl_mdio_write(hw, 0x14, 0xD149);
+ rtl_mdio_write(hw, 0x14, 0xAF06);
+ rtl_mdio_write(hw, 0x14, 0x47AF);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0xAF00);
+ rtl_mdio_write(hw, 0x14, 0x00AF);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_mdio_write(hw, 0x13, 0xB818);
+ rtl_mdio_write(hw, 0x14, 0x0645);
+
+ rtl_mdio_write(hw, 0x13, 0xB81A);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_mdio_write(hw, 0x13, 0xB81C);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_mdio_write(hw, 0x13, 0xB81E);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_mdio_write(hw, 0x13, 0xB832);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x17);
+ gphy_val &= ~BIT_0;
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+void
+hw_mac_mcu_config_8168ep(struct rtl_hw *hw)
+{
+ if (hw->NotWrMcuPatchCode)
+ return;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_27:
+ rtl8168_set_mac_mcu_8168ep_1(hw);
+ break;
+ case CFG_METHOD_28:
+ rtl8168_set_mac_mcu_8168ep_2(hw);
+ break;
+ }
+}
+
+void
+hw_phy_mcu_config_8168ep(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_28:
+ rtl8168_set_phy_mcu_8168ep_2(hw);
+ break;
+ }
+}
diff --git a/drivers/net/r8169/base/rtl8168fp.c b/drivers/net/r8169/base/rtl8168fp.c
new file mode 100644
index 0000000000..b8a058bbd9
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168fp.c
@@ -0,0 +1,195 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168fp.h"
+
+/* For RTL8168FP, CFG_METHOD_31,32,33,34 */
+
+static void
+hw_init_rxcfg_8168fp(struct rtl_hw *hw)
+{
+ RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
+ (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
+}
+
+static void
+hw_ephy_config_8168fp(struct rtl_hw *hw)
+{
+ rtl_clear_and_set_pcie_phy_bit(hw, 0x19, BIT_6, BIT_12 | BIT_8);
+ rtl_clear_and_set_pcie_phy_bit(hw, 0x59, BIT_6, BIT_12 | BIT_8);
+
+ rtl_clear_pcie_phy_bit(hw, 0x0C, BIT_4);
+ rtl_clear_pcie_phy_bit(hw, 0x4C, BIT_4);
+ rtl_clear_pcie_phy_bit(hw, 0x0B, BIT_0);
+}
+
+static void
+hw_phy_config_8168fp(struct rtl_hw *hw)
+{
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x808E);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4800);
+ rtl_mdio_write(hw, 0x13, 0x8090);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xCC00);
+ rtl_mdio_write(hw, 0x13, 0x8092);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xB000);
+ rtl_mdio_write(hw, 0x13, 0x8088);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6000);
+ rtl_mdio_write(hw, 0x13, 0x808B);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0B00);
+ rtl_mdio_write(hw, 0x13, 0x808D);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0600);
+ rtl_mdio_write(hw, 0x13, 0x808C);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xB000);
+
+ rtl_mdio_write(hw, 0x13, 0x80A0);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x2800);
+ rtl_mdio_write(hw, 0x13, 0x80A2);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x5000);
+ rtl_mdio_write(hw, 0x13, 0x809B);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0xB000);
+ rtl_mdio_write(hw, 0x13, 0x809A);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4B00);
+ rtl_mdio_write(hw, 0x13, 0x809D);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0800);
+ rtl_mdio_write(hw, 0x13, 0x80A1);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7000);
+ rtl_mdio_write(hw, 0x13, 0x809F);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0300);
+ rtl_mdio_write(hw, 0x13, 0x809E);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8800);
+
+ rtl_mdio_write(hw, 0x13, 0x80B2);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x2200);
+ rtl_mdio_write(hw, 0x13, 0x80AD);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x9800);
+ rtl_mdio_write(hw, 0x13, 0x80AF);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0800);
+ rtl_mdio_write(hw, 0x13, 0x80B3);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6F00);
+ rtl_mdio_write(hw, 0x13, 0x80B1);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0300);
+ rtl_mdio_write(hw, 0x13, 0x80B0);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x9300);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8011);
+ rtl_set_eth_phy_bit(hw, 0x14, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_set_eth_phy_bit(hw, 0x11, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8016);
+ rtl_set_eth_phy_bit(hw, 0x14, BIT_10);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ /* Enable EthPhyPPSW */
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_clear_eth_phy_bit(hw, 0x11, BIT_7);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+static void
+hw_config_8168fp(struct rtl_hw *hw)
+{
+ u16 mac_ocp_data;
+ u32 csi_tmp;
+
+ rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xCC, 1, 0x2F, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xD0, 1, 0x5F, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
+
+ /* Adjust the trx fifo*/
+ rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
+
+ /* Disable share fifo */
+ RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
+
+ csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+ csi_tmp |= BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ /* EEE pwrsave params */
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE056);
+ mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4);
+ rtl_mac_ocp_write(hw, 0xE056, mac_ocp_data);
+
+ if (hw->HwPkgDet == 0x0F)
+ rtl_mac_ocp_write(hw, 0xEA80, 0x0003);
+ else
+ rtl_mac_ocp_write(hw, 0xEA80, 0x0000);
+
+ rtl_oob_mutex_lock(hw);
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE052);
+ mac_ocp_data &= ~(BIT_3 | BIT_0);
+ if (hw->HwPkgDet == 0x0F)
+ mac_ocp_data |= BIT_0;
+ rtl_mac_ocp_write(hw, 0xE052, mac_ocp_data);
+ rtl_oob_mutex_unlock(hw);
+
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
+
+ RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
+
+ RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En);
+
+ if (!HW_SUPP_SERDES_PHY(hw)) {
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6);
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_6);
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_7);
+ } else {
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_6);
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_7);
+ }
+
+ rtl_oob_mutex_lock(hw);
+ if (hw->HwPkgDet == 0x0F)
+ rtl_eri_write(hw, 0x5F0, 2, 0x4F00, ERIAR_ExGMAC);
+ else
+ rtl_eri_write(hw, 0x5F0, 2, 0x4000, ERIAR_ExGMAC);
+ rtl_oob_mutex_unlock(hw);
+
+ csi_tmp = rtl_eri_read(hw, 0xDC, 4, ERIAR_ExGMAC);
+ csi_tmp |= (BIT_2 | BIT_3);
+ rtl_eri_write(hw, 0xDC, 4, csi_tmp, ERIAR_ExGMAC);
+
+ if (hw->mcfg == CFG_METHOD_32 || hw->mcfg == CFG_METHOD_33 ||
+ hw->mcfg == CFG_METHOD_34) {
+ csi_tmp = rtl_eri_read(hw, 0xD4, 4, ERIAR_ExGMAC);
+ csi_tmp |= BIT_4;
+ rtl_eri_write(hw, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
+ }
+
+ rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
+ rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
+
+ csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~(BIT_0 | BIT_1);
+ csi_tmp |= BIT_0;
+ rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_1;
+ rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
+}
+
+const struct rtl_hw_ops rtl8168fp_ops = {
+ .hw_config = hw_config_8168fp,
+ .hw_init_rxcfg = hw_init_rxcfg_8168fp,
+ .hw_ephy_config = hw_ephy_config_8168fp,
+ .hw_phy_config = hw_phy_config_8168fp,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8168fp,
+};
diff --git a/drivers/net/r8169/base/rtl8168fp.h b/drivers/net/r8169/base/rtl8168fp.h
new file mode 100644
index 0000000000..4613fe9a98
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168fp.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef _RTL8168FP_H_
+#define _RTL8168FP_H_
+
+#include "../r8169_compat.h"
+
+extern const struct rtl_hw_ops rtl8168fp_ops;
+
+void hw_mac_mcu_config_8168fp(struct rtl_hw *hw);
+
+#endif
diff --git a/drivers/net/r8169/base/rtl8168fp_mcu.c b/drivers/net/r8169/base/rtl8168fp_mcu.c
new file mode 100644
index 0000000000..839dcfde61
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168fp_mcu.c
@@ -0,0 +1,270 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_dash.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168fp.h"
+
+/* For RTL8168FP, CFG_METHOD_31,32,33,34 */
+
+/* ------------------------------------MAC 8168FP--------------------------------------- */
+
+static void
+rtl8168_set_mac_mcu_8168fp_1(struct rtl_hw *hw)
+{
+ u16 i;
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+ if (hw->HwPkgDet == 0x00 || hw->HwPkgDet == 0x0F) {
+ static const u16 mcu_patch_code_8168fp_1_1[] = {
+ 0xE00A, 0xE0C1, 0xE104, 0xE108, 0xE10D, 0xE112, 0xE11C, 0xE121, 0xE000,
+ 0xE0C8, 0xB400, 0xC1FE, 0x49E2, 0xF04C, 0x49EA, 0xF04A, 0x74E6, 0xC246,
+ 0x7542, 0x73EC, 0x1800, 0x49C0, 0xF10D, 0x49C1, 0xF10B, 0x49C2, 0xF109,
+ 0x49B0, 0xF107, 0x49B1, 0xF105, 0x7220, 0x49A2, 0xF102, 0xE002, 0x4800,
+ 0x49D0, 0xF10A, 0x49D1, 0xF108, 0x49D2, 0xF106, 0x49D3, 0xF104, 0x49DF,
+ 0xF102, 0xE00C, 0x4801, 0x72E4, 0x49AD, 0xF108, 0xC225, 0x6741, 0x48F0,
+ 0x8F41, 0x4870, 0x8F41, 0xC7CF, 0x49B5, 0xF01F, 0x49B2, 0xF00B, 0x4980,
+ 0xF003, 0x484E, 0x94E7, 0x4981, 0xF004, 0x485E, 0xC212, 0x9543, 0xE071,
+ 0x49B6, 0xF003, 0x49B3, 0xF10F, 0x4980, 0xF003, 0x484E, 0x94E7, 0x4981,
+ 0xF004, 0x485E, 0xC204, 0x9543, 0xE005, 0xE000, 0xE0FC, 0xE0FA, 0xE065,
+ 0x49B7, 0xF007, 0x4980, 0xF005, 0x1A38, 0x46D4, 0x1200, 0xF109, 0x4981,
+ 0xF055, 0x49C3, 0xF105, 0x1A30, 0x46D5, 0x1200, 0xF04F, 0x7220, 0x49A2,
+ 0xF130, 0x49C1, 0xF12E, 0x49B0, 0xF12C, 0xC2E6, 0x7240, 0x49A8, 0xF003,
+ 0x49D0, 0xF126, 0x49A9, 0xF003, 0x49D1, 0xF122, 0x49AA, 0xF003, 0x49D2,
+ 0xF11E, 0x49AB, 0xF003, 0x49DF, 0xF11A, 0x49AC, 0xF003, 0x49D3, 0xF116,
+ 0x4980, 0xF003, 0x49C7, 0xF105, 0x4981, 0xF02C, 0x49D7, 0xF02A, 0x49C0,
+ 0xF00C, 0xC721, 0x62F4, 0x49A0, 0xF008, 0x49A4, 0xF106, 0x4824, 0x8AF4,
+ 0xC71A, 0x1A40, 0x9AE0, 0x49B6, 0xF017, 0x200E, 0xC7B8, 0x72E0, 0x4710,
+ 0x92E1, 0xC70E, 0x77E0, 0x49F0, 0xF112, 0xC70B, 0x77E0, 0x27FE, 0x1AFA,
+ 0x4317, 0xC705, 0x9AE2, 0x1A11, 0x8AE0, 0xE008, 0xE41C, 0xC0AE, 0xD23A,
+ 0xC7A2, 0x74E6, 0x484F, 0x94E7, 0xC79E, 0x8CE6, 0x8BEC, 0xC29C, 0x8D42,
+ 0x7220, 0xB000, 0xC502, 0xBD00, 0x0932, 0xB400, 0xC240, 0xC340, 0x7060,
+ 0x498F, 0xF014, 0x488F, 0x9061, 0x744C, 0x49C3, 0xF004, 0x7562, 0x485E,
+ 0x9563, 0x7446, 0x49C3, 0xF106, 0x7562, 0x1C30, 0x46E5, 0x1200, 0xF004,
+ 0x7446, 0x484F, 0x9447, 0xC32A, 0x7466, 0x49C0, 0xF00F, 0x48C0, 0x9C66,
+ 0x7446, 0x4840, 0x4841, 0x4842, 0x9C46, 0x744C, 0x4840, 0x9C4C, 0x744A,
+ 0x484A, 0x9C4A, 0xE013, 0x498E, 0xF011, 0x488E, 0x9061, 0x744C, 0x49C3,
+ 0xF004, 0x7446, 0x484E, 0x9447, 0x7446, 0x1D38, 0x46EC, 0x1500, 0xF004,
+ 0x7446, 0x484F, 0x9447, 0xB000, 0xC502, 0xBD00, 0x074C, 0xE000, 0xE0FC,
+ 0xE0C0, 0x4830, 0x4837, 0xC502, 0xBD00, 0x0978, 0x63E2, 0x4830, 0x4837,
+ 0xC502, 0xBD00, 0x09FE, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A12,
+ 0x73E2, 0x48B0, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x8BE2, 0xC302,
+ 0xBB00, 0x0A5A, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A6C, 0x73E2,
+ 0x4830, 0x4837, 0xC502, 0xBD00, 0x0A86
+ };
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_1); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_1_1[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0890);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0712);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0974);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x09FC);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0A0E);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x0A56);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x0A68);
+ rtl_mac_ocp_write(hw, 0xFC36, 0x0A84);
+
+ /* Set bp enable*/
+ if (hw->HwPkgDet == 0x00)
+ rtl_mac_ocp_write(hw, 0xFC38, 0x00FC);
+ else if (hw->HwPkgDet == 0x0F)
+ rtl_mac_ocp_write(hw, 0xFC38, 0x00FF);
+ } else if (hw->HwPkgDet == 0x05 || hw->HwPkgDet == 0x06) {
+ static const u16 mcu_patch_code_8168fp_1_2[] = {
+ 0xE008, 0xE00A, 0xE031, 0xE033, 0xE035, 0xE144, 0xE166, 0xE168, 0xC502,
+ 0xBD00, 0x0000, 0xC725, 0x75E0, 0x48D0, 0x9DE0, 0xC722, 0x75E0, 0x1C78,
+ 0x416C, 0x1530, 0xF111, 0xC71D, 0x75F6, 0x49D1, 0xF00D, 0x75E0, 0x1C1F,
+ 0x416C, 0x1502, 0xF108, 0x75FA, 0x49D3, 0xF005, 0x75EC, 0x9DE4, 0x4853,
+ 0x9DFA, 0xC70B, 0x75E0, 0x4852, 0x4850, 0x9DE0, 0xC602, 0xBE00, 0x04B8,
+ 0xE420, 0xE000, 0xE0FC, 0xE43C, 0xDC00, 0xEB00, 0xC202, 0xBA00, 0x0000,
+ 0xC002, 0xB800, 0x0000, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xB406,
+ 0xC44D, 0xC54D, 0x1867, 0xE8A2, 0x2318, 0x276E, 0x1601, 0xF106, 0x1A07,
+ 0xE861, 0xE86B, 0xE873, 0xE037, 0x231E, 0x276E, 0x1602, 0xF10B, 0x1A07,
+ 0xE858, 0xE862, 0xC247, 0xC344, 0xE8E3, 0xC73B, 0x66E0, 0xE8B5, 0xE029,
+ 0x231A, 0x276C, 0xC733, 0x9EE0, 0x1866, 0xE885, 0x251C, 0x120F, 0xF011,
+ 0x1209, 0xF011, 0x2014, 0x240E, 0x1000, 0xF007, 0x120C, 0xF00D, 0x1203,
+ 0xF00D, 0x1200, 0xF00D, 0x120C, 0xF00D, 0x1203, 0xF00D, 0x1A03, 0xE00C,
+ 0x1A07, 0xE00A, 0x1A00, 0xE008, 0x1A01, 0xE006, 0x1A02, 0xE004, 0x1A04,
+ 0xE002, 0x1A05, 0xE829, 0xE833, 0xB006, 0xB005, 0xB004, 0xB003, 0xB002,
+ 0xB001, 0x60C4, 0xC702, 0xBF00, 0x2786, 0xDD00, 0xD030, 0xE0C4, 0xE0F8,
+ 0xDC42, 0xD3F0, 0x0000, 0x0004, 0x0007, 0x0014, 0x0090, 0x1000, 0x0F00,
+ 0x1004, 0x1008, 0x3000, 0x3004, 0x3008, 0x4000, 0x7777, 0x8000, 0x8001,
+ 0x8008, 0x8003, 0x8004, 0xC000, 0xC004, 0xF004, 0xFFFF, 0xB406, 0xB407,
+ 0xC6E5, 0x77C0, 0x27F3, 0x23F3, 0x47FA, 0x9FC0, 0xB007, 0xB006, 0xFF80,
+ 0xB405, 0xB407, 0xC7D8, 0x75E0, 0x48D0, 0x9DE0, 0xB007, 0xB005, 0xFF80,
+ 0xB401, 0xC0EA, 0xC2DC, 0xC3D8, 0xE865, 0xC0D3, 0xC1E0, 0xC2E3, 0xE861,
+ 0xE817, 0xC0CD, 0xC2CF, 0xE85D, 0xC0C9, 0xC1D6, 0xC2DB, 0xE859, 0xE80F,
+ 0xC1C7, 0xC2CE, 0xE855, 0xC0C0, 0xC1D1, 0xC2D3, 0xE851, 0xE807, 0xC0BE,
+ 0xC2C2, 0xE84D, 0xE803, 0xB001, 0xFF80, 0xB402, 0xC2C6, 0xE859, 0x499F,
+ 0xF1FE, 0xB002, 0xFF80, 0xB402, 0xB403, 0xB407, 0xE821, 0x8882, 0x1980,
+ 0x8983, 0xE81D, 0x7180, 0x218B, 0x25BB, 0x1310, 0xF014, 0x1310, 0xFB03,
+ 0x1F20, 0x38FB, 0x3288, 0x434B, 0x2491, 0x430B, 0x1F0F, 0x38FB, 0x4313,
+ 0x2121, 0x4353, 0x2521, 0x418A, 0x6282, 0x2527, 0x212F, 0x418A, 0xB007,
+ 0xB003, 0xB002, 0xFF80, 0x6183, 0x2496, 0x1100, 0xF1FD, 0xFF80, 0x4800,
+ 0x4801, 0xC213, 0xC313, 0xE815, 0x4860, 0x8EE0, 0xC210, 0xC310, 0xE822,
+ 0x481E, 0xC20C, 0xC30C, 0xE80C, 0xC206, 0x7358, 0x483A, 0x9B58, 0xFF80,
+ 0xE8E0, 0xE000, 0x1008, 0x0F00, 0x800C, 0x0F00, 0xB407, 0xB406, 0xB403,
+ 0xC7F7, 0x98E0, 0x99E2, 0x9AE4, 0x21B2, 0x4831, 0x483F, 0x9BE6, 0x66E7,
+ 0x49E6, 0xF1FE, 0xB003, 0xB006, 0xB007, 0xFF80, 0xB407, 0xB406, 0xB403,
+ 0xC7E5, 0x9AE4, 0x21B2, 0x4831, 0x9BE6, 0x66E7, 0x49E6, 0xF1FE, 0x70E0,
+ 0x71E2, 0xB003, 0xB006, 0xB007, 0xFF80, 0x4882, 0xB406, 0xB405, 0xC71E,
+ 0x76E0, 0x1D78, 0x4175, 0x1630, 0xF10C, 0xC715, 0x76E0, 0x4861, 0x9EE0,
+ 0xC713, 0x1EFF, 0x9EE2, 0x75E0, 0x4850, 0x9DE0, 0xE005, 0xC70B, 0x76E0,
+ 0x4865, 0x9EE0, 0xB005, 0xB006, 0xC708, 0xC102, 0xB900, 0x279E, 0xEB16,
+ 0xEB00, 0xE43C, 0xDC00, 0xD3EC, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
+ 0x0000
+ };
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_2); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_1_2[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x04b4);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x279C);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC36, 0x0000);
+
+ /* Set bp enable*/
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0022);
+ }
+}
+
+static void
+rtl8168_set_mac_mcu_8168fp_8116as_2(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168fp_8116as_2[] = {
+ 0xE008, 0xE00A, 0xE00F, 0xE014, 0xE016, 0xE018, 0xE01A, 0xE01C, 0xC602,
+ 0xBE00, 0x2AB2, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0,
+ 0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xC602, 0xBE00, 0x0000, 0xC602,
+ 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602,
+ 0xBE00, 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_8116as_2); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_8116as_2[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x2AAC);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0B14);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0BE4);
+
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0007);
+}
+
+static void
+_rtl8168_set_mac_mcu_8168fp_2(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168fp_2[] = {
+ 0xE008, 0xE00A, 0xE00F, 0xE014, 0xE05F, 0xE064, 0xE066, 0xE068, 0xC602,
+ 0xBE00, 0x0000, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0,
+ 0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xB400, 0xB401, 0xB402, 0xB403,
+ 0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE, 0xC137, 0x9904, 0xC136,
+ 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF10B, 0xC52F, 0xC12E,
+ 0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330, 0xE80E, 0xE018, 0xC126,
+ 0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326, 0xE805, 0xC521, 0xC324,
+ 0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x9D0A, 0x9A0C, 0x9B0E,
+ 0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004, 0xB003, 0xB002, 0xB001,
+ 0xB000, 0xC604, 0xC002, 0xB800, 0x2A5E, 0xE000, 0xE8E0, 0xF128, 0x3DC2,
+ 0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000, 0x8002, 0x8004, 0x8007,
+ 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC, 0xC602, 0xBE00, 0x0000,
+ 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_2); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_2[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x2AAC);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0B14);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0BE4);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x2A5C);
+
+ if (rtl8168_check_dash_other_fun_present(hw))
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0006);
+ else
+ rtl_mac_ocp_write(hw, 0xFC38, 0x000E);
+}
+
+static void
+rtl8168_set_mac_mcu_8168fp_2(struct rtl_hw *hw)
+{
+ if (hw->HwSuppSerDesPhyVer == 1)
+ rtl8168_set_mac_mcu_8168fp_8116as_2(hw);
+ else
+ _rtl8168_set_mac_mcu_8168fp_2(hw);
+}
+
+static void
+rtl8168_set_mac_mcu_8168fp_3(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168fp_3[] = {
+ 0xE008, 0xE053, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xB400,
+ 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE,
+ 0xC137, 0x9904, 0xC136, 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0,
+ 0xF10B, 0xC52F, 0xC12E, 0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330,
+ 0xE80E, 0xE018, 0xC126, 0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326,
+ 0xE805, 0xC521, 0xC324, 0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908,
+ 0x9D0A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004,
+ 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002, 0xB800, 0x2B16, 0xE000,
+ 0xE8E0, 0xF128, 0x3DC2, 0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000,
+ 0x8002, 0x8004, 0x8007, 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC,
+ 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000,
+ 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_3); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_3[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x2B14);
+
+ if (rtl8168_check_dash_other_fun_present(hw))
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0000);
+ else
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0001);
+}
+
+/* ------------------------------------PHY 8168FP------------------------------------- */
+
+void
+hw_mac_mcu_config_8168fp(struct rtl_hw *hw)
+{
+ if (hw->NotWrMcuPatchCode)
+ return;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_31:
+ rtl8168_set_mac_mcu_8168fp_1(hw);
+ break;
+ case CFG_METHOD_32:
+ rtl8168_set_mac_mcu_8168fp_2(hw);
+ break;
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ rtl8168_set_mac_mcu_8168fp_3(hw);
+ break;
+ }
+}
diff --git a/drivers/net/r8169/base/rtl8168g.c b/drivers/net/r8169/base/rtl8168g.c
new file mode 100644
index 0000000000..8f5e7ac2a5
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168g.c
@@ -0,0 +1,297 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168g.h"
+
+/* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */
+
+static void
+hw_init_rxcfg_8168g(struct rtl_hw *hw)
+{
+ RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
+ (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
+}
+
+static void
+hw_ephy_config_8168g(struct rtl_hw *hw)
+{
+ u16 ephy_data;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ ephy_data = rtl_ephy_read(hw, 0x00);
+ ephy_data &= ~BIT_3;
+ rtl_ephy_write(hw, 0x00, ephy_data);
+ ephy_data = rtl_ephy_read(hw, 0x0C);
+ ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
+ BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
+ ephy_data |= (BIT_5 | BIT_11);
+ rtl_ephy_write(hw, 0x0C, ephy_data);
+
+ ephy_data = rtl_ephy_read(hw, 0x1E);
+ ephy_data |= BIT_0;
+ rtl_ephy_write(hw, 0x1E, ephy_data);
+
+ ephy_data = rtl_ephy_read(hw, 0x19);
+ ephy_data &= ~BIT_15;
+ rtl_ephy_write(hw, 0x19, ephy_data);
+ break;
+ case CFG_METHOD_25:
+ ephy_data = rtl_ephy_read(hw, 0x00);
+ ephy_data &= ~BIT_3;
+ rtl_ephy_write(hw, 0x00, ephy_data);
+ ephy_data = rtl_ephy_read(hw, 0x0C);
+ ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
+ BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
+ ephy_data |= (BIT_5 | BIT_11);
+ rtl_ephy_write(hw, 0x0C, ephy_data);
+
+ rtl_ephy_write(hw, 0x19, 0x7C00);
+ rtl_ephy_write(hw, 0x1E, 0x20EB);
+ rtl_ephy_write(hw, 0x0D, 0x1666);
+ rtl_ephy_write(hw, 0x00, 0x10A3);
+ rtl_ephy_write(hw, 0x06, 0xF050);
+
+ rtl_set_pcie_phy_bit(hw, 0x04, BIT_4);
+ rtl_clear_pcie_phy_bit(hw, 0x1D, BIT_14);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+hw_phy_config_8168g_1(struct rtl_hw *hw)
+{
+ u16 gphy_val;
+
+ rtl_mdio_write(hw, 0x1F, 0x0A46);
+ gphy_val = rtl_mdio_read(hw, 0x10);
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ if (gphy_val & BIT_8)
+ rtl_clear_eth_phy_bit(hw, 0x12, BIT_15);
+ else
+ rtl_set_eth_phy_bit(hw, 0x12, BIT_15);
+ rtl_mdio_write(hw, 0x1F, 0x0A46);
+ gphy_val = rtl_mdio_read(hw, 0x13);
+ rtl_mdio_write(hw, 0x1F, 0x0C41);
+ if (gphy_val & BIT_8)
+ rtl_set_eth_phy_bit(hw, 0x15, BIT_1);
+ else
+ rtl_clear_eth_phy_bit(hw, 0x15, BIT_1);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2 | BIT_3);
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8084);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A4B);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8012);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
+
+ rtl_mdio_write(hw, 0x1F, 0x0C42);
+ gphy_val = rtl_mdio_read(hw, 0x11);
+ gphy_val |= BIT_14;
+ gphy_val &= ~BIT_13;
+ rtl_mdio_write(hw, 0x11, gphy_val);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x809A);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x13, 0x80A0);
+ gphy_val = rtl_mdio_read(hw, 0x14) & 0x00FF;
+ gphy_val |= 0x1000;
+ rtl_mdio_write(hw, 0x14, gphy_val);
+ rtl_mdio_write(hw, 0x13, 0x8088);
+ rtl_mdio_write(hw, 0x14, 0x9222);
+
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+static void
+hw_phy_config_8168g_2(struct rtl_hw *hw)
+{
+ u16 gphy_val;
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8084);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8012);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
+
+ rtl_mdio_write(hw, 0x1F, 0x0C42);
+ gphy_val = rtl_mdio_read(hw, 0x11);
+ gphy_val |= BIT_14;
+ gphy_val &= ~BIT_13;
+ rtl_mdio_write(hw, 0x11, gphy_val);
+}
+
+static void
+hw_phy_config_8168g_3(struct rtl_hw *hw)
+{
+ rtl_mdio_write(hw, 0x1F, 0x0BCC);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
+ rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8084);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
+ rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8012);
+ rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCE);
+ rtl_mdio_write(hw, 0x12, 0x8860);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x80F3);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00);
+ rtl_mdio_write(hw, 0x13, 0x80F0);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00);
+ rtl_mdio_write(hw, 0x13, 0x80EF);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500);
+ rtl_mdio_write(hw, 0x13, 0x80F6);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00);
+ rtl_mdio_write(hw, 0x13, 0x80EC);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800);
+ rtl_mdio_write(hw, 0x13, 0x80ED);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
+ rtl_mdio_write(hw, 0x13, 0x80F2);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400);
+ rtl_mdio_write(hw, 0x13, 0x80F4);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8110);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800);
+ rtl_mdio_write(hw, 0x13, 0x810F);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00);
+ rtl_mdio_write(hw, 0x13, 0x8111);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500);
+ rtl_mdio_write(hw, 0x13, 0x8113);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100);
+ rtl_mdio_write(hw, 0x13, 0x8115);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200);
+ rtl_mdio_write(hw, 0x13, 0x810E);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400);
+ rtl_mdio_write(hw, 0x13, 0x810C);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
+ rtl_mdio_write(hw, 0x13, 0x810B);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x80D1);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00);
+ rtl_mdio_write(hw, 0x13, 0x80CD);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00);
+ rtl_mdio_write(hw, 0x13, 0x80D3);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00);
+ rtl_mdio_write(hw, 0x13, 0x80D5);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00);
+ rtl_mdio_write(hw, 0x13, 0x80D7);
+ rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400);
+}
+
+static void
+hw_phy_config_8168g(struct rtl_hw *hw)
+{
+ if (hw->mcfg == CFG_METHOD_21)
+ hw_phy_config_8168g_1(hw);
+ else if (hw->mcfg == CFG_METHOD_24)
+ hw_phy_config_8168g_2(hw);
+ else if (hw->mcfg == CFG_METHOD_25)
+ hw_phy_config_8168g_3(hw);
+
+ /* Disable EthPhyPPSW */
+ rtl_mdio_write(hw, 0x1F, 0x0BCD);
+ rtl_mdio_write(hw, 0x14, 0x5065);
+ rtl_mdio_write(hw, 0x14, 0xD065);
+ rtl_mdio_write(hw, 0x1F, 0x0BC8);
+ rtl_mdio_write(hw, 0x11, 0x5655);
+ rtl_mdio_write(hw, 0x1F, 0x0BCD);
+ rtl_mdio_write(hw, 0x14, 0x1065);
+ rtl_mdio_write(hw, 0x14, 0x9065);
+ rtl_mdio_write(hw, 0x14, 0x1065);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+static void
+hw_config_8168g(struct rtl_hw *hw)
+{
+ u32 csi_tmp;
+
+ /* Share fifo rx params */
+ rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
+
+ /* Adjust the trx fifo*/
+ rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
+
+ /* Disable share fifo */
+ RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
+
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
+
+ /* EEE led enable */
+ RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
+
+ RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En);
+
+ /* CRC wake disable */
+ rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
+
+ csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_12;
+ rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
+
+ csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
+ csi_tmp |= BIT_0;
+ rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC);
+ csi_tmp |= BIT_1;
+ rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
+}
+
+const struct rtl_hw_ops rtl8168g_ops = {
+ .hw_config = hw_config_8168g,
+ .hw_init_rxcfg = hw_init_rxcfg_8168g,
+ .hw_ephy_config = hw_ephy_config_8168g,
+ .hw_phy_config = hw_phy_config_8168g,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8168g,
+ .hw_phy_mcu_config = hw_phy_mcu_config_8168g,
+};
diff --git a/drivers/net/r8169/base/rtl8168g.h b/drivers/net/r8169/base/rtl8168g.h
new file mode 100644
index 0000000000..feb0e28ff6
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168g.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef _RTL8168G_H_
+#define _RTL8168G_H_
+
+#include "../r8169_compat.h"
+
+extern const struct rtl_hw_ops rtl8168g_ops;
+
+void hw_mac_mcu_config_8168g(struct rtl_hw *hw);
+void hw_phy_mcu_config_8168g(struct rtl_hw *hw);
+
+#endif
diff --git a/drivers/net/r8169/base/rtl8168g_mcu.c b/drivers/net/r8169/base/rtl8168g_mcu.c
new file mode 100644
index 0000000000..a1296b044b
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168g_mcu.c
@@ -0,0 +1,1936 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168g.h"
+
+/* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */
+
+/* ------------------------------------MAC 8168G1----------------------------------- */
+
+static void
+rtl8168_set_mac_mcu_8168g_1(struct rtl_hw *hw)
+{
+ rtl_mac_ocp_write(hw, 0xE43C, 0x0000);
+ rtl_mac_ocp_write(hw, 0xE43E, 0x0000);
+
+ rtl_mac_ocp_write(hw, 0xE434, 0x0004);
+ rtl_mac_ocp_write(hw, 0xE43C, 0x0004);
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ rtl_mac_ocp_write(hw, 0xF800, 0xE008);
+ rtl_mac_ocp_write(hw, 0xF802, 0xE01B);
+ rtl_mac_ocp_write(hw, 0xF804, 0xE022);
+ rtl_mac_ocp_write(hw, 0xF806, 0xE094);
+ rtl_mac_ocp_write(hw, 0xF808, 0xE097);
+ rtl_mac_ocp_write(hw, 0xF80A, 0xE09A);
+ rtl_mac_ocp_write(hw, 0xF80C, 0xE0B3);
+ rtl_mac_ocp_write(hw, 0xF80E, 0xE0BA);
+ rtl_mac_ocp_write(hw, 0xF810, 0x49D2);
+ rtl_mac_ocp_write(hw, 0xF812, 0xF10D);
+ rtl_mac_ocp_write(hw, 0xF814, 0x766C);
+ rtl_mac_ocp_write(hw, 0xF816, 0x49E2);
+ rtl_mac_ocp_write(hw, 0xF818, 0xF00A);
+ rtl_mac_ocp_write(hw, 0xF81A, 0x1EC0);
+ rtl_mac_ocp_write(hw, 0xF81C, 0x8EE1);
+ rtl_mac_ocp_write(hw, 0xF81E, 0xC60A);
+ rtl_mac_ocp_write(hw, 0xF820, 0x77C0);
+ rtl_mac_ocp_write(hw, 0xF822, 0x4870);
+ rtl_mac_ocp_write(hw, 0xF824, 0x9FC0);
+ rtl_mac_ocp_write(hw, 0xF826, 0x1EA0);
+ rtl_mac_ocp_write(hw, 0xF828, 0xC707);
+ rtl_mac_ocp_write(hw, 0xF82A, 0x8EE1);
+ rtl_mac_ocp_write(hw, 0xF82C, 0x9D6C);
+ rtl_mac_ocp_write(hw, 0xF82E, 0xC603);
+ rtl_mac_ocp_write(hw, 0xF830, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF832, 0xB416);
+ rtl_mac_ocp_write(hw, 0xF834, 0x0076);
+ rtl_mac_ocp_write(hw, 0xF836, 0xE86C);
+ rtl_mac_ocp_write(hw, 0xF838, 0xC406);
+ rtl_mac_ocp_write(hw, 0xF83A, 0x7580);
+ rtl_mac_ocp_write(hw, 0xF83C, 0x4852);
+ rtl_mac_ocp_write(hw, 0xF83E, 0x8D80);
+ rtl_mac_ocp_write(hw, 0xF840, 0xC403);
+ rtl_mac_ocp_write(hw, 0xF842, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF844, 0xD3E0);
+ rtl_mac_ocp_write(hw, 0xF846, 0x02C8);
+ rtl_mac_ocp_write(hw, 0xF848, 0x8918);
+ rtl_mac_ocp_write(hw, 0xF84A, 0xE815);
+ rtl_mac_ocp_write(hw, 0xF84C, 0x1100);
+ rtl_mac_ocp_write(hw, 0xF84E, 0xF011);
+ rtl_mac_ocp_write(hw, 0xF850, 0xE812);
+ rtl_mac_ocp_write(hw, 0xF852, 0x4990);
+ rtl_mac_ocp_write(hw, 0xF854, 0xF002);
+ rtl_mac_ocp_write(hw, 0xF856, 0xE817);
+ rtl_mac_ocp_write(hw, 0xF858, 0xE80E);
+ rtl_mac_ocp_write(hw, 0xF85A, 0x4992);
+ rtl_mac_ocp_write(hw, 0xF85C, 0xF002);
+ rtl_mac_ocp_write(hw, 0xF85E, 0xE80E);
+ rtl_mac_ocp_write(hw, 0xF860, 0xE80A);
+ rtl_mac_ocp_write(hw, 0xF862, 0x4993);
+ rtl_mac_ocp_write(hw, 0xF864, 0xF002);
+ rtl_mac_ocp_write(hw, 0xF866, 0xE818);
+ rtl_mac_ocp_write(hw, 0xF868, 0xE806);
+ rtl_mac_ocp_write(hw, 0xF86A, 0x4991);
+ rtl_mac_ocp_write(hw, 0xF86C, 0xF002);
+ rtl_mac_ocp_write(hw, 0xF86E, 0xE838);
+ rtl_mac_ocp_write(hw, 0xF870, 0xC25E);
+ rtl_mac_ocp_write(hw, 0xF872, 0xBA00);
+ rtl_mac_ocp_write(hw, 0xF874, 0xC056);
+ rtl_mac_ocp_write(hw, 0xF876, 0x7100);
+ rtl_mac_ocp_write(hw, 0xF878, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xF87A, 0x7100);
+ rtl_mac_ocp_write(hw, 0xF87C, 0x4892);
+ rtl_mac_ocp_write(hw, 0xF87E, 0x4813);
+ rtl_mac_ocp_write(hw, 0xF880, 0x8900);
+ rtl_mac_ocp_write(hw, 0xF882, 0xE00A);
+ rtl_mac_ocp_write(hw, 0xF884, 0x7100);
+ rtl_mac_ocp_write(hw, 0xF886, 0x4890);
+ rtl_mac_ocp_write(hw, 0xF888, 0x4813);
+ rtl_mac_ocp_write(hw, 0xF88A, 0x8900);
+ rtl_mac_ocp_write(hw, 0xF88C, 0xC74B);
+ rtl_mac_ocp_write(hw, 0xF88E, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF890, 0x48C2);
+ rtl_mac_ocp_write(hw, 0xF892, 0x4841);
+ rtl_mac_ocp_write(hw, 0xF894, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF896, 0xC746);
+ rtl_mac_ocp_write(hw, 0xF898, 0x74FC);
+ rtl_mac_ocp_write(hw, 0xF89A, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF89C, 0xF120);
+ rtl_mac_ocp_write(hw, 0xF89E, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8A0, 0xF11E);
+ rtl_mac_ocp_write(hw, 0xF8A2, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF8A4, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF8A6, 0xF01B);
+ rtl_mac_ocp_write(hw, 0xF8A8, 0x49C6);
+ rtl_mac_ocp_write(hw, 0xF8AA, 0xF119);
+ rtl_mac_ocp_write(hw, 0xF8AC, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF8AE, 0x49C4);
+ rtl_mac_ocp_write(hw, 0xF8B0, 0xF013);
+ rtl_mac_ocp_write(hw, 0xF8B2, 0xC536);
+ rtl_mac_ocp_write(hw, 0xF8B4, 0x74B0);
+ rtl_mac_ocp_write(hw, 0xF8B6, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8B8, 0xF1FD);
+ rtl_mac_ocp_write(hw, 0xF8BA, 0xC537);
+ rtl_mac_ocp_write(hw, 0xF8BC, 0xC434);
+ rtl_mac_ocp_write(hw, 0xF8BE, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xF8C0, 0xC435);
+ rtl_mac_ocp_write(hw, 0xF8C2, 0x1C13);
+ rtl_mac_ocp_write(hw, 0xF8C4, 0x484F);
+ rtl_mac_ocp_write(hw, 0xF8C6, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xF8C8, 0xC52B);
+ rtl_mac_ocp_write(hw, 0xF8CA, 0x74B0);
+ rtl_mac_ocp_write(hw, 0xF8CC, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8CE, 0xF1FD);
+ rtl_mac_ocp_write(hw, 0xF8D0, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF8D2, 0x48C4);
+ rtl_mac_ocp_write(hw, 0xF8D4, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF8D6, 0x7100);
+ rtl_mac_ocp_write(hw, 0xF8D8, 0x4893);
+ rtl_mac_ocp_write(hw, 0xF8DA, 0x8900);
+ rtl_mac_ocp_write(hw, 0xF8DC, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xF8DE, 0xC520);
+ rtl_mac_ocp_write(hw, 0xF8E0, 0x74B0);
+ rtl_mac_ocp_write(hw, 0xF8E2, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8E4, 0xF11C);
+ rtl_mac_ocp_write(hw, 0xF8E6, 0xC71E);
+ rtl_mac_ocp_write(hw, 0xF8E8, 0x74FC);
+ rtl_mac_ocp_write(hw, 0xF8EA, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8EC, 0xF118);
+ rtl_mac_ocp_write(hw, 0xF8EE, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF8F0, 0xF116);
+ rtl_mac_ocp_write(hw, 0xF8F2, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF8F4, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF8F6, 0xF013);
+ rtl_mac_ocp_write(hw, 0xF8F8, 0x48C3);
+ rtl_mac_ocp_write(hw, 0xF8FA, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF8FC, 0xC516);
+ rtl_mac_ocp_write(hw, 0xF8FE, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xF900, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xF902, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xF904, 0xC411);
+ rtl_mac_ocp_write(hw, 0xF906, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xF908, 0xC411);
+ rtl_mac_ocp_write(hw, 0xF90A, 0x1C13);
+ rtl_mac_ocp_write(hw, 0xF90C, 0x484F);
+ rtl_mac_ocp_write(hw, 0xF90E, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xF910, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xF912, 0x49CF);
+ rtl_mac_ocp_write(hw, 0xF914, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xF916, 0x7100);
+ rtl_mac_ocp_write(hw, 0xF918, 0x4891);
+ rtl_mac_ocp_write(hw, 0xF91A, 0x8900);
+ rtl_mac_ocp_write(hw, 0xF91C, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xF91E, 0xE400);
+ rtl_mac_ocp_write(hw, 0xF920, 0xD3E0);
+ rtl_mac_ocp_write(hw, 0xF922, 0xE000);
+ rtl_mac_ocp_write(hw, 0xF924, 0x0481);
+ rtl_mac_ocp_write(hw, 0xF926, 0x0C81);
+ rtl_mac_ocp_write(hw, 0xF928, 0xDE20);
+ rtl_mac_ocp_write(hw, 0xF92A, 0x0000);
+ rtl_mac_ocp_write(hw, 0xF92C, 0x0992);
+ rtl_mac_ocp_write(hw, 0xF92E, 0x1B76);
+ rtl_mac_ocp_write(hw, 0xF930, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF932, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF934, 0x059C);
+ rtl_mac_ocp_write(hw, 0xF936, 0x1B76);
+ rtl_mac_ocp_write(hw, 0xF938, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF93A, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF93C, 0x065A);
+ rtl_mac_ocp_write(hw, 0xF93E, 0xB400);
+ rtl_mac_ocp_write(hw, 0xF940, 0x18DE);
+ rtl_mac_ocp_write(hw, 0xF942, 0x2008);
+ rtl_mac_ocp_write(hw, 0xF944, 0x4001);
+ rtl_mac_ocp_write(hw, 0xF946, 0xF10F);
+ rtl_mac_ocp_write(hw, 0xF948, 0x7342);
+ rtl_mac_ocp_write(hw, 0xF94A, 0x1880);
+ rtl_mac_ocp_write(hw, 0xF94C, 0x2008);
+ rtl_mac_ocp_write(hw, 0xF94E, 0x0009);
+ rtl_mac_ocp_write(hw, 0xF950, 0x4018);
+ rtl_mac_ocp_write(hw, 0xF952, 0xF109);
+ rtl_mac_ocp_write(hw, 0xF954, 0x7340);
+ rtl_mac_ocp_write(hw, 0xF956, 0x25BC);
+ rtl_mac_ocp_write(hw, 0xF958, 0x130F);
+ rtl_mac_ocp_write(hw, 0xF95A, 0xF105);
+ rtl_mac_ocp_write(hw, 0xF95C, 0xC00A);
+ rtl_mac_ocp_write(hw, 0xF95E, 0x7300);
+ rtl_mac_ocp_write(hw, 0xF960, 0x4831);
+ rtl_mac_ocp_write(hw, 0xF962, 0x9B00);
+ rtl_mac_ocp_write(hw, 0xF964, 0xB000);
+ rtl_mac_ocp_write(hw, 0xF966, 0x7340);
+ rtl_mac_ocp_write(hw, 0xF968, 0x8320);
+ rtl_mac_ocp_write(hw, 0xF96A, 0xC302);
+ rtl_mac_ocp_write(hw, 0xF96C, 0xBB00);
+ rtl_mac_ocp_write(hw, 0xF96E, 0x0C12);
+ rtl_mac_ocp_write(hw, 0xF970, 0xE860);
+ rtl_mac_ocp_write(hw, 0xF972, 0xC406);
+ rtl_mac_ocp_write(hw, 0xF974, 0x7580);
+ rtl_mac_ocp_write(hw, 0xF976, 0x4851);
+ rtl_mac_ocp_write(hw, 0xF978, 0x8D80);
+ rtl_mac_ocp_write(hw, 0xF97A, 0xC403);
+ rtl_mac_ocp_write(hw, 0xF97C, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF97E, 0xD3E0);
+ rtl_mac_ocp_write(hw, 0xF980, 0x02C8);
+ rtl_mac_ocp_write(hw, 0xF982, 0xC406);
+ rtl_mac_ocp_write(hw, 0xF984, 0x7580);
+ rtl_mac_ocp_write(hw, 0xF986, 0x4850);
+ rtl_mac_ocp_write(hw, 0xF988, 0x8D80);
+ rtl_mac_ocp_write(hw, 0xF98A, 0xC403);
+ rtl_mac_ocp_write(hw, 0xF98C, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF98E, 0xD3E0);
+ rtl_mac_ocp_write(hw, 0xF990, 0x0298);
+
+ rtl_mac_ocp_write(hw, 0xDE30, 0x0080);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0075);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x02B1);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0991);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x059B);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0659);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x02C7);
+ rtl_mac_ocp_write(hw, 0xFC36, 0x0279);
+}
+
+/* ------------------------------------MAC 8168GU1---------------------------------- */
+
+static void
+rtl8168_set_mac_mcu_8168gu_1(struct rtl_hw *hw)
+{
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ rtl_mac_ocp_write(hw, 0xF800, 0xE008);
+ rtl_mac_ocp_write(hw, 0xF802, 0xE011);
+ rtl_mac_ocp_write(hw, 0xF804, 0xE015);
+ rtl_mac_ocp_write(hw, 0xF806, 0xE018);
+ rtl_mac_ocp_write(hw, 0xF808, 0xE01B);
+ rtl_mac_ocp_write(hw, 0xF80A, 0xE027);
+ rtl_mac_ocp_write(hw, 0xF80C, 0xE043);
+ rtl_mac_ocp_write(hw, 0xF80E, 0xE065);
+ rtl_mac_ocp_write(hw, 0xF810, 0x49E2);
+ rtl_mac_ocp_write(hw, 0xF812, 0xF005);
+ rtl_mac_ocp_write(hw, 0xF814, 0x49EA);
+ rtl_mac_ocp_write(hw, 0xF816, 0xF003);
+ rtl_mac_ocp_write(hw, 0xF818, 0xC404);
+ rtl_mac_ocp_write(hw, 0xF81A, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF81C, 0xC403);
+ rtl_mac_ocp_write(hw, 0xF81E, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF820, 0x0496);
+ rtl_mac_ocp_write(hw, 0xF822, 0x051A);
+ rtl_mac_ocp_write(hw, 0xF824, 0x1D01);
+ rtl_mac_ocp_write(hw, 0xF826, 0x8DE8);
+ rtl_mac_ocp_write(hw, 0xF828, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF82A, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF82C, 0x0206);
+ rtl_mac_ocp_write(hw, 0xF82E, 0x1B76);
+ rtl_mac_ocp_write(hw, 0xF830, 0xC202);
+ rtl_mac_ocp_write(hw, 0xF832, 0xBA00);
+ rtl_mac_ocp_write(hw, 0xF834, 0x058A);
+ rtl_mac_ocp_write(hw, 0xF836, 0x1B76);
+ rtl_mac_ocp_write(hw, 0xF838, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF83A, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF83C, 0x0648);
+ rtl_mac_ocp_write(hw, 0xF83E, 0x74E6);
+ rtl_mac_ocp_write(hw, 0xF840, 0x1B78);
+ rtl_mac_ocp_write(hw, 0xF842, 0x46DC);
+ rtl_mac_ocp_write(hw, 0xF844, 0x1300);
+ rtl_mac_ocp_write(hw, 0xF846, 0xF005);
+ rtl_mac_ocp_write(hw, 0xF848, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF84A, 0x48C3);
+ rtl_mac_ocp_write(hw, 0xF84C, 0x48C4);
+ rtl_mac_ocp_write(hw, 0xF84E, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF850, 0x64E7);
+ rtl_mac_ocp_write(hw, 0xF852, 0xC302);
+ rtl_mac_ocp_write(hw, 0xF854, 0xBB00);
+ rtl_mac_ocp_write(hw, 0xF856, 0x068E);
+ rtl_mac_ocp_write(hw, 0xF858, 0x74E4);
+ rtl_mac_ocp_write(hw, 0xF85A, 0x49C5);
+ rtl_mac_ocp_write(hw, 0xF85C, 0xF106);
+ rtl_mac_ocp_write(hw, 0xF85E, 0x49C6);
+ rtl_mac_ocp_write(hw, 0xF860, 0xF107);
+ rtl_mac_ocp_write(hw, 0xF862, 0x48C8);
+ rtl_mac_ocp_write(hw, 0xF864, 0x48C9);
+ rtl_mac_ocp_write(hw, 0xF866, 0xE011);
+ rtl_mac_ocp_write(hw, 0xF868, 0x48C9);
+ rtl_mac_ocp_write(hw, 0xF86A, 0x4848);
+ rtl_mac_ocp_write(hw, 0xF86C, 0xE00E);
+ rtl_mac_ocp_write(hw, 0xF86E, 0x4848);
+ rtl_mac_ocp_write(hw, 0xF870, 0x49C7);
+ rtl_mac_ocp_write(hw, 0xF872, 0xF00A);
+ rtl_mac_ocp_write(hw, 0xF874, 0x48C9);
+ rtl_mac_ocp_write(hw, 0xF876, 0xC60D);
+ rtl_mac_ocp_write(hw, 0xF878, 0x1D1F);
+ rtl_mac_ocp_write(hw, 0xF87A, 0x8DC2);
+ rtl_mac_ocp_write(hw, 0xF87C, 0x1D00);
+ rtl_mac_ocp_write(hw, 0xF87E, 0x8DC3);
+ rtl_mac_ocp_write(hw, 0xF880, 0x1D11);
+ rtl_mac_ocp_write(hw, 0xF882, 0x8DC0);
+ rtl_mac_ocp_write(hw, 0xF884, 0xE002);
+ rtl_mac_ocp_write(hw, 0xF886, 0x4849);
+ rtl_mac_ocp_write(hw, 0xF888, 0x94E5);
+ rtl_mac_ocp_write(hw, 0xF88A, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF88C, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF88E, 0x0238);
+ rtl_mac_ocp_write(hw, 0xF890, 0xE434);
+ rtl_mac_ocp_write(hw, 0xF892, 0x49D9);
+ rtl_mac_ocp_write(hw, 0xF894, 0xF01B);
+ rtl_mac_ocp_write(hw, 0xF896, 0xC31E);
+ rtl_mac_ocp_write(hw, 0xF898, 0x7464);
+ rtl_mac_ocp_write(hw, 0xF89A, 0x49C4);
+ rtl_mac_ocp_write(hw, 0xF89C, 0xF114);
+ rtl_mac_ocp_write(hw, 0xF89E, 0xC31B);
+ rtl_mac_ocp_write(hw, 0xF8A0, 0x6460);
+ rtl_mac_ocp_write(hw, 0xF8A2, 0x14FA);
+ rtl_mac_ocp_write(hw, 0xF8A4, 0xFA02);
+ rtl_mac_ocp_write(hw, 0xF8A6, 0xE00F);
+ rtl_mac_ocp_write(hw, 0xF8A8, 0xC317);
+ rtl_mac_ocp_write(hw, 0xF8AA, 0x7460);
+ rtl_mac_ocp_write(hw, 0xF8AC, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF8AE, 0xF10B);
+ rtl_mac_ocp_write(hw, 0xF8B0, 0xC311);
+ rtl_mac_ocp_write(hw, 0xF8B2, 0x7462);
+ rtl_mac_ocp_write(hw, 0xF8B4, 0x48C1);
+ rtl_mac_ocp_write(hw, 0xF8B6, 0x9C62);
+ rtl_mac_ocp_write(hw, 0xF8B8, 0x4841);
+ rtl_mac_ocp_write(hw, 0xF8BA, 0x9C62);
+ rtl_mac_ocp_write(hw, 0xF8BC, 0xC30A);
+ rtl_mac_ocp_write(hw, 0xF8BE, 0x1C04);
+ rtl_mac_ocp_write(hw, 0xF8C0, 0x8C60);
+ rtl_mac_ocp_write(hw, 0xF8C2, 0xE004);
+ rtl_mac_ocp_write(hw, 0xF8C4, 0x1C15);
+ rtl_mac_ocp_write(hw, 0xF8C6, 0xC305);
+ rtl_mac_ocp_write(hw, 0xF8C8, 0x8C60);
+ rtl_mac_ocp_write(hw, 0xF8CA, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF8CC, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF8CE, 0x0374);
+ rtl_mac_ocp_write(hw, 0xF8D0, 0xE434);
+ rtl_mac_ocp_write(hw, 0xF8D2, 0xE030);
+ rtl_mac_ocp_write(hw, 0xF8D4, 0xE61C);
+ rtl_mac_ocp_write(hw, 0xF8D6, 0xE906);
+ rtl_mac_ocp_write(hw, 0xF8D8, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF8DA, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF8DC, 0x0000);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0493);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0205);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0589);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x0647);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x0215);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x0285);
+}
+
+/* ------------------------------------MAC 8168GU2------------------------------------- */
+
+static void
+rtl8168_set_mac_mcu_8168gu_2(struct rtl_hw *hw)
+{
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ rtl_mac_ocp_write(hw, 0xF800, 0xE008);
+ rtl_mac_ocp_write(hw, 0xF802, 0xE00A);
+ rtl_mac_ocp_write(hw, 0xF804, 0xE00D);
+ rtl_mac_ocp_write(hw, 0xF806, 0xE02F);
+ rtl_mac_ocp_write(hw, 0xF808, 0xE031);
+ rtl_mac_ocp_write(hw, 0xF80A, 0xE038);
+ rtl_mac_ocp_write(hw, 0xF80C, 0xE03A);
+ rtl_mac_ocp_write(hw, 0xF80E, 0xE051);
+ rtl_mac_ocp_write(hw, 0xF810, 0xC202);
+ rtl_mac_ocp_write(hw, 0xF812, 0xBA00);
+ rtl_mac_ocp_write(hw, 0xF814, 0x0DFC);
+ rtl_mac_ocp_write(hw, 0xF816, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF818, 0xC502);
+ rtl_mac_ocp_write(hw, 0xF81A, 0xBD00);
+ rtl_mac_ocp_write(hw, 0xF81C, 0x0A30);
+ rtl_mac_ocp_write(hw, 0xF81E, 0x49D9);
+ rtl_mac_ocp_write(hw, 0xF820, 0xF019);
+ rtl_mac_ocp_write(hw, 0xF822, 0xC520);
+ rtl_mac_ocp_write(hw, 0xF824, 0x64A5);
+ rtl_mac_ocp_write(hw, 0xF826, 0x1400);
+ rtl_mac_ocp_write(hw, 0xF828, 0xF007);
+ rtl_mac_ocp_write(hw, 0xF82A, 0x0C01);
+ rtl_mac_ocp_write(hw, 0xF82C, 0x8CA5);
+ rtl_mac_ocp_write(hw, 0xF82E, 0x1C15);
+ rtl_mac_ocp_write(hw, 0xF830, 0xC515);
+ rtl_mac_ocp_write(hw, 0xF832, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xF834, 0xE00F);
+ rtl_mac_ocp_write(hw, 0xF836, 0xC513);
+ rtl_mac_ocp_write(hw, 0xF838, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xF83A, 0x48C8);
+ rtl_mac_ocp_write(hw, 0xF83C, 0x48CA);
+ rtl_mac_ocp_write(hw, 0xF83E, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xF840, 0xC510);
+ rtl_mac_ocp_write(hw, 0xF842, 0x1B00);
+ rtl_mac_ocp_write(hw, 0xF844, 0x9BA0);
+ rtl_mac_ocp_write(hw, 0xF846, 0x1B1C);
+ rtl_mac_ocp_write(hw, 0xF848, 0x483F);
+ rtl_mac_ocp_write(hw, 0xF84A, 0x9BA2);
+ rtl_mac_ocp_write(hw, 0xF84C, 0x1B04);
+ rtl_mac_ocp_write(hw, 0xF84E, 0xC506);
+ rtl_mac_ocp_write(hw, 0xF850, 0x9BA0);
+ rtl_mac_ocp_write(hw, 0xF852, 0xC603);
+ rtl_mac_ocp_write(hw, 0xF854, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF856, 0x0298);
+ rtl_mac_ocp_write(hw, 0xF858, 0x03DE);
+ rtl_mac_ocp_write(hw, 0xF85A, 0xE434);
+ rtl_mac_ocp_write(hw, 0xF85C, 0xE096);
+ rtl_mac_ocp_write(hw, 0xF85E, 0xE860);
+ rtl_mac_ocp_write(hw, 0xF860, 0xDE20);
+ rtl_mac_ocp_write(hw, 0xF862, 0xD3C0);
+ rtl_mac_ocp_write(hw, 0xF864, 0xC602);
+ rtl_mac_ocp_write(hw, 0xF866, 0xBE00);
+ rtl_mac_ocp_write(hw, 0xF868, 0x0A64);
+ rtl_mac_ocp_write(hw, 0xF86A, 0xC707);
+ rtl_mac_ocp_write(hw, 0xF86C, 0x1D00);
+ rtl_mac_ocp_write(hw, 0xF86E, 0x8DE2);
+ rtl_mac_ocp_write(hw, 0xF870, 0x48C1);
+ rtl_mac_ocp_write(hw, 0xF872, 0xC502);
+ rtl_mac_ocp_write(hw, 0xF874, 0xBD00);
+ rtl_mac_ocp_write(hw, 0xF876, 0x00AA);
+ rtl_mac_ocp_write(hw, 0xF878, 0xE0C0);
+ rtl_mac_ocp_write(hw, 0xF87A, 0xC502);
+ rtl_mac_ocp_write(hw, 0xF87C, 0xBD00);
+ rtl_mac_ocp_write(hw, 0xF87E, 0x0132);
+ rtl_mac_ocp_write(hw, 0xF880, 0xC50C);
+ rtl_mac_ocp_write(hw, 0xF882, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xF884, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xF886, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xF888, 0x1C00);
+ rtl_mac_ocp_write(hw, 0xF88A, 0x9EA0);
+ rtl_mac_ocp_write(hw, 0xF88C, 0x1C1C);
+ rtl_mac_ocp_write(hw, 0xF88E, 0x484F);
+ rtl_mac_ocp_write(hw, 0xF890, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xF892, 0xC402);
+ rtl_mac_ocp_write(hw, 0xF894, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xF896, 0x0AFA);
+ rtl_mac_ocp_write(hw, 0xF898, 0xDE20);
+ rtl_mac_ocp_write(hw, 0xF89A, 0xE000);
+ rtl_mac_ocp_write(hw, 0xF89C, 0xE092);
+ rtl_mac_ocp_write(hw, 0xF89E, 0xE430);
+ rtl_mac_ocp_write(hw, 0xF8A0, 0xDE20);
+ rtl_mac_ocp_write(hw, 0xF8A2, 0xE0C0);
+ rtl_mac_ocp_write(hw, 0xF8A4, 0xE860);
+ rtl_mac_ocp_write(hw, 0xF8A6, 0xE84C);
+ rtl_mac_ocp_write(hw, 0xF8A8, 0xB400);
+ rtl_mac_ocp_write(hw, 0xF8AA, 0xB430);
+ rtl_mac_ocp_write(hw, 0xF8AC, 0xE410);
+ rtl_mac_ocp_write(hw, 0xF8AE, 0xC0AE);
+ rtl_mac_ocp_write(hw, 0xF8B0, 0xB407);
+ rtl_mac_ocp_write(hw, 0xF8B2, 0xB406);
+ rtl_mac_ocp_write(hw, 0xF8B4, 0xB405);
+ rtl_mac_ocp_write(hw, 0xF8B6, 0xB404);
+ rtl_mac_ocp_write(hw, 0xF8B8, 0xB403);
+ rtl_mac_ocp_write(hw, 0xF8BA, 0xB402);
+ rtl_mac_ocp_write(hw, 0xF8BC, 0xB401);
+ rtl_mac_ocp_write(hw, 0xF8BE, 0xC7EE);
+ rtl_mac_ocp_write(hw, 0xF8C0, 0x76F4);
+ rtl_mac_ocp_write(hw, 0xF8C2, 0xC2ED);
+ rtl_mac_ocp_write(hw, 0xF8C4, 0xC3ED);
+ rtl_mac_ocp_write(hw, 0xF8C6, 0xC1EF);
+ rtl_mac_ocp_write(hw, 0xF8C8, 0xC5F3);
+ rtl_mac_ocp_write(hw, 0xF8CA, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xF8CC, 0x49CD);
+ rtl_mac_ocp_write(hw, 0xF8CE, 0xF001);
+ rtl_mac_ocp_write(hw, 0xF8D0, 0xC5EE);
+ rtl_mac_ocp_write(hw, 0xF8D2, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xF8D4, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF8D6, 0xF105);
+ rtl_mac_ocp_write(hw, 0xF8D8, 0xC5E4);
+ rtl_mac_ocp_write(hw, 0xF8DA, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xF8DC, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xF8DE, 0xF00B);
+ rtl_mac_ocp_write(hw, 0xF8E0, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF8E2, 0x484B);
+ rtl_mac_ocp_write(hw, 0xF8E4, 0x9C44);
+ rtl_mac_ocp_write(hw, 0xF8E6, 0x1C10);
+ rtl_mac_ocp_write(hw, 0xF8E8, 0x9C62);
+ rtl_mac_ocp_write(hw, 0xF8EA, 0x1C11);
+ rtl_mac_ocp_write(hw, 0xF8EC, 0x8C60);
+ rtl_mac_ocp_write(hw, 0xF8EE, 0x1C00);
+ rtl_mac_ocp_write(hw, 0xF8F0, 0x9CF6);
+ rtl_mac_ocp_write(hw, 0xF8F2, 0xE0EC);
+ rtl_mac_ocp_write(hw, 0xF8F4, 0x49E7);
+ rtl_mac_ocp_write(hw, 0xF8F6, 0xF016);
+ rtl_mac_ocp_write(hw, 0xF8F8, 0x1D80);
+ rtl_mac_ocp_write(hw, 0xF8FA, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xF8FC, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF8FE, 0x4843);
+ rtl_mac_ocp_write(hw, 0xF900, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF902, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF904, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF906, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF908, 0x48C8);
+ rtl_mac_ocp_write(hw, 0xF90A, 0x48C9);
+ rtl_mac_ocp_write(hw, 0xF90C, 0x48CA);
+ rtl_mac_ocp_write(hw, 0xF90E, 0x9C44);
+ rtl_mac_ocp_write(hw, 0xF910, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF912, 0x4844);
+ rtl_mac_ocp_write(hw, 0xF914, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF916, 0x1E01);
+ rtl_mac_ocp_write(hw, 0xF918, 0xE8DB);
+ rtl_mac_ocp_write(hw, 0xF91A, 0x7420);
+ rtl_mac_ocp_write(hw, 0xF91C, 0x48C1);
+ rtl_mac_ocp_write(hw, 0xF91E, 0x9C20);
+ rtl_mac_ocp_write(hw, 0xF920, 0xE0D5);
+ rtl_mac_ocp_write(hw, 0xF922, 0x49E6);
+ rtl_mac_ocp_write(hw, 0xF924, 0xF02A);
+ rtl_mac_ocp_write(hw, 0xF926, 0x1D40);
+ rtl_mac_ocp_write(hw, 0xF928, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xF92A, 0x74FC);
+ rtl_mac_ocp_write(hw, 0xF92C, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF92E, 0xF124);
+ rtl_mac_ocp_write(hw, 0xF930, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF932, 0xF122);
+ rtl_mac_ocp_write(hw, 0xF934, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF936, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF938, 0xF01F);
+ rtl_mac_ocp_write(hw, 0xF93A, 0xE8D3);
+ rtl_mac_ocp_write(hw, 0xF93C, 0x48C4);
+ rtl_mac_ocp_write(hw, 0xF93E, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF940, 0x1E00);
+ rtl_mac_ocp_write(hw, 0xF942, 0xE8C6);
+ rtl_mac_ocp_write(hw, 0xF944, 0xC5B1);
+ rtl_mac_ocp_write(hw, 0xF946, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xF948, 0x49C3);
+ rtl_mac_ocp_write(hw, 0xF94A, 0xF016);
+ rtl_mac_ocp_write(hw, 0xF94C, 0xC5AF);
+ rtl_mac_ocp_write(hw, 0xF94E, 0x74A4);
+ rtl_mac_ocp_write(hw, 0xF950, 0x49C2);
+ rtl_mac_ocp_write(hw, 0xF952, 0xF005);
+ rtl_mac_ocp_write(hw, 0xF954, 0xC5AA);
+ rtl_mac_ocp_write(hw, 0xF956, 0x74B2);
+ rtl_mac_ocp_write(hw, 0xF958, 0x49C9);
+ rtl_mac_ocp_write(hw, 0xF95A, 0xF10E);
+ rtl_mac_ocp_write(hw, 0xF95C, 0xC5A6);
+ rtl_mac_ocp_write(hw, 0xF95E, 0x74A8);
+ rtl_mac_ocp_write(hw, 0xF960, 0x4845);
+ rtl_mac_ocp_write(hw, 0xF962, 0x4846);
+ rtl_mac_ocp_write(hw, 0xF964, 0x4847);
+ rtl_mac_ocp_write(hw, 0xF966, 0x4848);
+ rtl_mac_ocp_write(hw, 0xF968, 0x9CA8);
+ rtl_mac_ocp_write(hw, 0xF96A, 0x74B2);
+ rtl_mac_ocp_write(hw, 0xF96C, 0x4849);
+ rtl_mac_ocp_write(hw, 0xF96E, 0x9CB2);
+ rtl_mac_ocp_write(hw, 0xF970, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xF972, 0x484F);
+ rtl_mac_ocp_write(hw, 0xF974, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xF976, 0xE0AA);
+ rtl_mac_ocp_write(hw, 0xF978, 0x49E4);
+ rtl_mac_ocp_write(hw, 0xF97A, 0xF018);
+ rtl_mac_ocp_write(hw, 0xF97C, 0x1D10);
+ rtl_mac_ocp_write(hw, 0xF97E, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xF980, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF982, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF984, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF986, 0x4843);
+ rtl_mac_ocp_write(hw, 0xF988, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF98A, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF98C, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF98E, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF990, 0x4844);
+ rtl_mac_ocp_write(hw, 0xF992, 0x4842);
+ rtl_mac_ocp_write(hw, 0xF994, 0x4841);
+ rtl_mac_ocp_write(hw, 0xF996, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF998, 0x1E01);
+ rtl_mac_ocp_write(hw, 0xF99A, 0xE89A);
+ rtl_mac_ocp_write(hw, 0xF99C, 0x7420);
+ rtl_mac_ocp_write(hw, 0xF99E, 0x4841);
+ rtl_mac_ocp_write(hw, 0xF9A0, 0x9C20);
+ rtl_mac_ocp_write(hw, 0xF9A2, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF9A4, 0x4848);
+ rtl_mac_ocp_write(hw, 0xF9A6, 0x9C44);
+ rtl_mac_ocp_write(hw, 0xF9A8, 0xE091);
+ rtl_mac_ocp_write(hw, 0xF9AA, 0x49E5);
+ rtl_mac_ocp_write(hw, 0xF9AC, 0xF03E);
+ rtl_mac_ocp_write(hw, 0xF9AE, 0x1D20);
+ rtl_mac_ocp_write(hw, 0xF9B0, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xF9B2, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF9B4, 0x48C2);
+ rtl_mac_ocp_write(hw, 0xF9B6, 0x4841);
+ rtl_mac_ocp_write(hw, 0xF9B8, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF9BA, 0x1E01);
+ rtl_mac_ocp_write(hw, 0xF9BC, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF9BE, 0x49CA);
+ rtl_mac_ocp_write(hw, 0xF9C0, 0xF103);
+ rtl_mac_ocp_write(hw, 0xF9C2, 0x49C2);
+ rtl_mac_ocp_write(hw, 0xF9C4, 0xF00C);
+ rtl_mac_ocp_write(hw, 0xF9C6, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF9C8, 0xF004);
+ rtl_mac_ocp_write(hw, 0xF9CA, 0x6447);
+ rtl_mac_ocp_write(hw, 0xF9CC, 0x2244);
+ rtl_mac_ocp_write(hw, 0xF9CE, 0xE002);
+ rtl_mac_ocp_write(hw, 0xF9D0, 0x1C01);
+ rtl_mac_ocp_write(hw, 0xF9D2, 0x9C62);
+ rtl_mac_ocp_write(hw, 0xF9D4, 0x1C11);
+ rtl_mac_ocp_write(hw, 0xF9D6, 0x8C60);
+ rtl_mac_ocp_write(hw, 0xF9D8, 0x1C00);
+ rtl_mac_ocp_write(hw, 0xF9DA, 0x9CF6);
+ rtl_mac_ocp_write(hw, 0xF9DC, 0x7444);
+ rtl_mac_ocp_write(hw, 0xF9DE, 0x49C8);
+ rtl_mac_ocp_write(hw, 0xF9E0, 0xF01D);
+ rtl_mac_ocp_write(hw, 0xF9E2, 0x74FC);
+ rtl_mac_ocp_write(hw, 0xF9E4, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF9E6, 0xF11A);
+ rtl_mac_ocp_write(hw, 0xF9E8, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xF9EA, 0xF118);
+ rtl_mac_ocp_write(hw, 0xF9EC, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xF9EE, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xF9F0, 0xF015);
+ rtl_mac_ocp_write(hw, 0xF9F2, 0x49C6);
+ rtl_mac_ocp_write(hw, 0xF9F4, 0xF113);
+ rtl_mac_ocp_write(hw, 0xF9F6, 0xE875);
+ rtl_mac_ocp_write(hw, 0xF9F8, 0x48C4);
+ rtl_mac_ocp_write(hw, 0xF9FA, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xF9FC, 0x7420);
+ rtl_mac_ocp_write(hw, 0xF9FE, 0x48C1);
+ rtl_mac_ocp_write(hw, 0xFA00, 0x9C20);
+ rtl_mac_ocp_write(hw, 0xFA02, 0xC50A);
+ rtl_mac_ocp_write(hw, 0xFA04, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFA06, 0x8CA5);
+ rtl_mac_ocp_write(hw, 0xFA08, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xFA0A, 0xC505);
+ rtl_mac_ocp_write(hw, 0xFA0C, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xFA0E, 0x1C11);
+ rtl_mac_ocp_write(hw, 0xFA10, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xFA12, 0xE00A);
+ rtl_mac_ocp_write(hw, 0xFA14, 0xE434);
+ rtl_mac_ocp_write(hw, 0xFA16, 0xD3C0);
+ rtl_mac_ocp_write(hw, 0xFA18, 0xDC00);
+ rtl_mac_ocp_write(hw, 0xFA1A, 0x7444);
+ rtl_mac_ocp_write(hw, 0xFA1C, 0x49CA);
+ rtl_mac_ocp_write(hw, 0xFA1E, 0xF004);
+ rtl_mac_ocp_write(hw, 0xFA20, 0x48CA);
+ rtl_mac_ocp_write(hw, 0xFA22, 0x9C44);
+ rtl_mac_ocp_write(hw, 0xFA24, 0xE855);
+ rtl_mac_ocp_write(hw, 0xFA26, 0xE052);
+ rtl_mac_ocp_write(hw, 0xFA28, 0x49E8);
+ rtl_mac_ocp_write(hw, 0xFA2A, 0xF024);
+ rtl_mac_ocp_write(hw, 0xFA2C, 0x1D01);
+ rtl_mac_ocp_write(hw, 0xFA2E, 0x8DF5);
+ rtl_mac_ocp_write(hw, 0xFA30, 0x7440);
+ rtl_mac_ocp_write(hw, 0xFA32, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xFA34, 0xF11E);
+ rtl_mac_ocp_write(hw, 0xFA36, 0x7444);
+ rtl_mac_ocp_write(hw, 0xFA38, 0x49C8);
+ rtl_mac_ocp_write(hw, 0xFA3A, 0xF01B);
+ rtl_mac_ocp_write(hw, 0xFA3C, 0x49CA);
+ rtl_mac_ocp_write(hw, 0xFA3E, 0xF119);
+ rtl_mac_ocp_write(hw, 0xFA40, 0xC5EC);
+ rtl_mac_ocp_write(hw, 0xFA42, 0x76A4);
+ rtl_mac_ocp_write(hw, 0xFA44, 0x49E3);
+ rtl_mac_ocp_write(hw, 0xFA46, 0xF015);
+ rtl_mac_ocp_write(hw, 0xFA48, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xFA4A, 0xF103);
+ rtl_mac_ocp_write(hw, 0xFA4C, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xFA4E, 0xF011);
+ rtl_mac_ocp_write(hw, 0xFA50, 0x4849);
+ rtl_mac_ocp_write(hw, 0xFA52, 0x9C44);
+ rtl_mac_ocp_write(hw, 0xFA54, 0x1C00);
+ rtl_mac_ocp_write(hw, 0xFA56, 0x9CF6);
+ rtl_mac_ocp_write(hw, 0xFA58, 0x7444);
+ rtl_mac_ocp_write(hw, 0xFA5A, 0x49C1);
+ rtl_mac_ocp_write(hw, 0xFA5C, 0xF004);
+ rtl_mac_ocp_write(hw, 0xFA5E, 0x6446);
+ rtl_mac_ocp_write(hw, 0xFA60, 0x1E07);
+ rtl_mac_ocp_write(hw, 0xFA62, 0xE003);
+ rtl_mac_ocp_write(hw, 0xFA64, 0x1C01);
+ rtl_mac_ocp_write(hw, 0xFA66, 0x1E03);
+ rtl_mac_ocp_write(hw, 0xFA68, 0x9C62);
+ rtl_mac_ocp_write(hw, 0xFA6A, 0x1C11);
+ rtl_mac_ocp_write(hw, 0xFA6C, 0x8C60);
+ rtl_mac_ocp_write(hw, 0xFA6E, 0xE830);
+ rtl_mac_ocp_write(hw, 0xFA70, 0xE02D);
+ rtl_mac_ocp_write(hw, 0xFA72, 0x49E9);
+ rtl_mac_ocp_write(hw, 0xFA74, 0xF004);
+ rtl_mac_ocp_write(hw, 0xFA76, 0x1D02);
+ rtl_mac_ocp_write(hw, 0xFA78, 0x8DF5);
+ rtl_mac_ocp_write(hw, 0xFA7A, 0xE79C);
+ rtl_mac_ocp_write(hw, 0xFA7C, 0x49E3);
+ rtl_mac_ocp_write(hw, 0xFA7E, 0xF006);
+ rtl_mac_ocp_write(hw, 0xFA80, 0x1D08);
+ rtl_mac_ocp_write(hw, 0xFA82, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xFA84, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xFA86, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xFA88, 0xE73A);
+ rtl_mac_ocp_write(hw, 0xFA8A, 0x49E1);
+ rtl_mac_ocp_write(hw, 0xFA8C, 0xF007);
+ rtl_mac_ocp_write(hw, 0xFA8E, 0x1D02);
+ rtl_mac_ocp_write(hw, 0xFA90, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xFA92, 0x1E01);
+ rtl_mac_ocp_write(hw, 0xFA94, 0xE7A7);
+ rtl_mac_ocp_write(hw, 0xFA96, 0xDE20);
+ rtl_mac_ocp_write(hw, 0xFA98, 0xE410);
+ rtl_mac_ocp_write(hw, 0xFA9A, 0x49E0);
+ rtl_mac_ocp_write(hw, 0xFA9C, 0xF017);
+ rtl_mac_ocp_write(hw, 0xFA9E, 0x1D01);
+ rtl_mac_ocp_write(hw, 0xFAA0, 0x8DF4);
+ rtl_mac_ocp_write(hw, 0xFAA2, 0xC5FA);
+ rtl_mac_ocp_write(hw, 0xFAA4, 0x1C00);
+ rtl_mac_ocp_write(hw, 0xFAA6, 0x8CA0);
+ rtl_mac_ocp_write(hw, 0xFAA8, 0x1C1B);
+ rtl_mac_ocp_write(hw, 0xFAAA, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xFAAC, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFAAE, 0x49CF);
+ rtl_mac_ocp_write(hw, 0xFAB0, 0xF0FE);
+ rtl_mac_ocp_write(hw, 0xFAB2, 0xC5F3);
+ rtl_mac_ocp_write(hw, 0xFAB4, 0x74A0);
+ rtl_mac_ocp_write(hw, 0xFAB6, 0x4849);
+ rtl_mac_ocp_write(hw, 0xFAB8, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xFABA, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xFABC, 0x49C0);
+ rtl_mac_ocp_write(hw, 0xFABE, 0xF006);
+ rtl_mac_ocp_write(hw, 0xFAC0, 0x48C3);
+ rtl_mac_ocp_write(hw, 0xFAC2, 0x8CF8);
+ rtl_mac_ocp_write(hw, 0xFAC4, 0xE820);
+ rtl_mac_ocp_write(hw, 0xFAC6, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xFAC8, 0x74F8);
+ rtl_mac_ocp_write(hw, 0xFACA, 0xC432);
+ rtl_mac_ocp_write(hw, 0xFACC, 0xBC00);
+ rtl_mac_ocp_write(hw, 0xFACE, 0xC5E4);
+ rtl_mac_ocp_write(hw, 0xFAD0, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFAD2, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xFAD4, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xFAD6, 0x9EA0);
+ rtl_mac_ocp_write(hw, 0xFAD8, 0x1C1C);
+ rtl_mac_ocp_write(hw, 0xFADA, 0x484F);
+ rtl_mac_ocp_write(hw, 0xFADC, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xFADE, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xFAE0, 0xB404);
+ rtl_mac_ocp_write(hw, 0xFAE2, 0xB405);
+ rtl_mac_ocp_write(hw, 0xFAE4, 0xC5D9);
+ rtl_mac_ocp_write(hw, 0xFAE6, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFAE8, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xFAEA, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xFAEC, 0xC41F);
+ rtl_mac_ocp_write(hw, 0xFAEE, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xFAF0, 0xC41C);
+ rtl_mac_ocp_write(hw, 0xFAF2, 0x1C13);
+ rtl_mac_ocp_write(hw, 0xFAF4, 0x484F);
+ rtl_mac_ocp_write(hw, 0xFAF6, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xFAF8, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFAFA, 0x49CF);
+ rtl_mac_ocp_write(hw, 0xFAFC, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xFAFE, 0xB005);
+ rtl_mac_ocp_write(hw, 0xFB00, 0xB004);
+ rtl_mac_ocp_write(hw, 0xFB02, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xFB04, 0xB404);
+ rtl_mac_ocp_write(hw, 0xFB06, 0xB405);
+ rtl_mac_ocp_write(hw, 0xFB08, 0xC5C7);
+ rtl_mac_ocp_write(hw, 0xFB0A, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFB0C, 0x49CE);
+ rtl_mac_ocp_write(hw, 0xFB0E, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xFB10, 0xC40E);
+ rtl_mac_ocp_write(hw, 0xFB12, 0x9CA0);
+ rtl_mac_ocp_write(hw, 0xFB14, 0xC40A);
+ rtl_mac_ocp_write(hw, 0xFB16, 0x1C13);
+ rtl_mac_ocp_write(hw, 0xFB18, 0x484F);
+ rtl_mac_ocp_write(hw, 0xFB1A, 0x9CA2);
+ rtl_mac_ocp_write(hw, 0xFB1C, 0x74A2);
+ rtl_mac_ocp_write(hw, 0xFB1E, 0x49CF);
+ rtl_mac_ocp_write(hw, 0xFB20, 0xF1FE);
+ rtl_mac_ocp_write(hw, 0xFB22, 0xB005);
+ rtl_mac_ocp_write(hw, 0xFB24, 0xB004);
+ rtl_mac_ocp_write(hw, 0xFB26, 0xFF80);
+ rtl_mac_ocp_write(hw, 0xFB28, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFB2A, 0x0481);
+ rtl_mac_ocp_write(hw, 0xFB2C, 0x0C81);
+ rtl_mac_ocp_write(hw, 0xFB2E, 0x0AE0);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x0297);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x00A9);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x012D);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x0000);
+ rtl_mac_ocp_write(hw, 0xFC36, 0x08DF);
+}
+
+/* ------------------------------------PHY 8168G------------------------------------- */
+
+static void
+rtl8168_set_phy_mcu_8168g_1(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x2300);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0290);
+ rtl_mdio_write(hw, 0x13, 0xA012);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA014);
+ rtl_mdio_write(hw, 0x14, 0x2c04);
+ rtl_mdio_write(hw, 0x14, 0x2c0c);
+ rtl_mdio_write(hw, 0x14, 0x2c6c);
+ rtl_mdio_write(hw, 0x14, 0x2d0d);
+ rtl_mdio_write(hw, 0x14, 0x31ce);
+ rtl_mdio_write(hw, 0x14, 0x506d);
+ rtl_mdio_write(hw, 0x14, 0xd708);
+ rtl_mdio_write(hw, 0x14, 0x3108);
+ rtl_mdio_write(hw, 0x14, 0x106d);
+ rtl_mdio_write(hw, 0x14, 0x1560);
+ rtl_mdio_write(hw, 0x14, 0x15a9);
+ rtl_mdio_write(hw, 0x14, 0x206e);
+ rtl_mdio_write(hw, 0x14, 0x175b);
+ rtl_mdio_write(hw, 0x14, 0x6062);
+ rtl_mdio_write(hw, 0x14, 0xd700);
+ rtl_mdio_write(hw, 0x14, 0x5fae);
+ rtl_mdio_write(hw, 0x14, 0xd708);
+ rtl_mdio_write(hw, 0x14, 0x3107);
+ rtl_mdio_write(hw, 0x14, 0x4c1e);
+ rtl_mdio_write(hw, 0x14, 0x4169);
+ rtl_mdio_write(hw, 0x14, 0x316a);
+ rtl_mdio_write(hw, 0x14, 0x0c19);
+ rtl_mdio_write(hw, 0x14, 0x31aa);
+ rtl_mdio_write(hw, 0x14, 0x0c19);
+ rtl_mdio_write(hw, 0x14, 0x2c1b);
+ rtl_mdio_write(hw, 0x14, 0x5e62);
+ rtl_mdio_write(hw, 0x14, 0x26b5);
+ rtl_mdio_write(hw, 0x14, 0x31ab);
+ rtl_mdio_write(hw, 0x14, 0x5c1e);
+ rtl_mdio_write(hw, 0x14, 0x2c0c);
+ rtl_mdio_write(hw, 0x14, 0xc040);
+ rtl_mdio_write(hw, 0x14, 0x8808);
+ rtl_mdio_write(hw, 0x14, 0xc520);
+ rtl_mdio_write(hw, 0x14, 0xc421);
+ rtl_mdio_write(hw, 0x14, 0xd05a);
+ rtl_mdio_write(hw, 0x14, 0xd19a);
+ rtl_mdio_write(hw, 0x14, 0xd709);
+ rtl_mdio_write(hw, 0x14, 0x608f);
+ rtl_mdio_write(hw, 0x14, 0xd06b);
+ rtl_mdio_write(hw, 0x14, 0xd18a);
+ rtl_mdio_write(hw, 0x14, 0x2c2c);
+ rtl_mdio_write(hw, 0x14, 0xd0be);
+ rtl_mdio_write(hw, 0x14, 0xd188);
+ rtl_mdio_write(hw, 0x14, 0x2c2c);
+ rtl_mdio_write(hw, 0x14, 0xd708);
+ rtl_mdio_write(hw, 0x14, 0x4072);
+ rtl_mdio_write(hw, 0x14, 0xc104);
+ rtl_mdio_write(hw, 0x14, 0x2c3e);
+ rtl_mdio_write(hw, 0x14, 0x4076);
+ rtl_mdio_write(hw, 0x14, 0xc110);
+ rtl_mdio_write(hw, 0x14, 0x2c3e);
+ rtl_mdio_write(hw, 0x14, 0x4071);
+ rtl_mdio_write(hw, 0x14, 0xc102);
+ rtl_mdio_write(hw, 0x14, 0x2c3e);
+ rtl_mdio_write(hw, 0x14, 0x4070);
+ rtl_mdio_write(hw, 0x14, 0xc101);
+ rtl_mdio_write(hw, 0x14, 0x2c3e);
+ rtl_mdio_write(hw, 0x14, 0x175b);
+ rtl_mdio_write(hw, 0x14, 0xd709);
+ rtl_mdio_write(hw, 0x14, 0x3390);
+ rtl_mdio_write(hw, 0x14, 0x5c39);
+ rtl_mdio_write(hw, 0x14, 0x2c4e);
+ rtl_mdio_write(hw, 0x14, 0x175b);
+ rtl_mdio_write(hw, 0x14, 0xd708);
+ rtl_mdio_write(hw, 0x14, 0x6193);
+ rtl_mdio_write(hw, 0x14, 0xd709);
+ rtl_mdio_write(hw, 0x14, 0x5f9d);
+ rtl_mdio_write(hw, 0x14, 0x408b);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x6042);
+ rtl_mdio_write(hw, 0x14, 0xb401);
+ rtl_mdio_write(hw, 0x14, 0x175b);
+ rtl_mdio_write(hw, 0x14, 0xd708);
+ rtl_mdio_write(hw, 0x14, 0x6073);
+ rtl_mdio_write(hw, 0x14, 0x5fbc);
+ rtl_mdio_write(hw, 0x14, 0x2c4d);
+ rtl_mdio_write(hw, 0x14, 0x26ed);
+ rtl_mdio_write(hw, 0x14, 0xb280);
+ rtl_mdio_write(hw, 0x14, 0xa841);
+ rtl_mdio_write(hw, 0x14, 0x9420);
+ rtl_mdio_write(hw, 0x14, 0x8710);
+ rtl_mdio_write(hw, 0x14, 0xd709);
+ rtl_mdio_write(hw, 0x14, 0x42ec);
+ rtl_mdio_write(hw, 0x14, 0x606d);
+ rtl_mdio_write(hw, 0x14, 0xd207);
+ rtl_mdio_write(hw, 0x14, 0x2c57);
+ rtl_mdio_write(hw, 0x14, 0xd203);
+ rtl_mdio_write(hw, 0x14, 0x33ff);
+ rtl_mdio_write(hw, 0x14, 0x563b);
+ rtl_mdio_write(hw, 0x14, 0x3275);
+ rtl_mdio_write(hw, 0x14, 0x7c5e);
+ rtl_mdio_write(hw, 0x14, 0xb240);
+ rtl_mdio_write(hw, 0x14, 0xb402);
+ rtl_mdio_write(hw, 0x14, 0x263b);
+ rtl_mdio_write(hw, 0x14, 0x6096);
+ rtl_mdio_write(hw, 0x14, 0xb240);
+ rtl_mdio_write(hw, 0x14, 0xb406);
+ rtl_mdio_write(hw, 0x14, 0x263b);
+ rtl_mdio_write(hw, 0x14, 0x31d7);
+ rtl_mdio_write(hw, 0x14, 0x7c67);
+ rtl_mdio_write(hw, 0x14, 0xb240);
+ rtl_mdio_write(hw, 0x14, 0xb40e);
+ rtl_mdio_write(hw, 0x14, 0x263b);
+ rtl_mdio_write(hw, 0x14, 0xb410);
+ rtl_mdio_write(hw, 0x14, 0x8802);
+ rtl_mdio_write(hw, 0x14, 0xb240);
+ rtl_mdio_write(hw, 0x14, 0x940e);
+ rtl_mdio_write(hw, 0x14, 0x263b);
+ rtl_mdio_write(hw, 0x14, 0xba04);
+ rtl_mdio_write(hw, 0x14, 0x1cd6);
+ rtl_mdio_write(hw, 0x14, 0xa902);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x4045);
+ rtl_mdio_write(hw, 0x14, 0xa980);
+ rtl_mdio_write(hw, 0x14, 0x3003);
+ rtl_mdio_write(hw, 0x14, 0x59b1);
+ rtl_mdio_write(hw, 0x14, 0xa540);
+ rtl_mdio_write(hw, 0x14, 0xa601);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4043);
+ rtl_mdio_write(hw, 0x14, 0xa910);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x60a0);
+ rtl_mdio_write(hw, 0x14, 0xca33);
+ rtl_mdio_write(hw, 0x14, 0xcb33);
+ rtl_mdio_write(hw, 0x14, 0xa941);
+ rtl_mdio_write(hw, 0x14, 0x2c82);
+ rtl_mdio_write(hw, 0x14, 0xcaff);
+ rtl_mdio_write(hw, 0x14, 0xcbff);
+ rtl_mdio_write(hw, 0x14, 0xa921);
+ rtl_mdio_write(hw, 0x14, 0xce02);
+ rtl_mdio_write(hw, 0x14, 0xe070);
+ rtl_mdio_write(hw, 0x14, 0x0f10);
+ rtl_mdio_write(hw, 0x14, 0xaf01);
+ rtl_mdio_write(hw, 0x14, 0x8f01);
+ rtl_mdio_write(hw, 0x14, 0x1766);
+ rtl_mdio_write(hw, 0x14, 0x8e02);
+ rtl_mdio_write(hw, 0x14, 0x1787);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x609c);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fa4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0x1ce9);
+ rtl_mdio_write(hw, 0x14, 0xce04);
+ rtl_mdio_write(hw, 0x14, 0xe070);
+ rtl_mdio_write(hw, 0x14, 0x0f20);
+ rtl_mdio_write(hw, 0x14, 0xaf01);
+ rtl_mdio_write(hw, 0x14, 0x8f01);
+ rtl_mdio_write(hw, 0x14, 0x1766);
+ rtl_mdio_write(hw, 0x14, 0x8e04);
+ rtl_mdio_write(hw, 0x14, 0x6044);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0xa520);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4043);
+ rtl_mdio_write(hw, 0x14, 0x2cc1);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0501);
+ rtl_mdio_write(hw, 0x14, 0x1cef);
+ rtl_mdio_write(hw, 0x14, 0xb801);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x4060);
+ rtl_mdio_write(hw, 0x14, 0x7fc4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0x1cf5);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0502);
+ rtl_mdio_write(hw, 0x14, 0x1cef);
+ rtl_mdio_write(hw, 0x14, 0xb802);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x4061);
+ rtl_mdio_write(hw, 0x14, 0x7fc4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0x1cf5);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0504);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6099);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fa4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0xc17f);
+ rtl_mdio_write(hw, 0x14, 0xc200);
+ rtl_mdio_write(hw, 0x14, 0xc43f);
+ rtl_mdio_write(hw, 0x14, 0xcc03);
+ rtl_mdio_write(hw, 0x14, 0xa701);
+ rtl_mdio_write(hw, 0x14, 0xa510);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4018);
+ rtl_mdio_write(hw, 0x14, 0x9910);
+ rtl_mdio_write(hw, 0x14, 0x8510);
+ rtl_mdio_write(hw, 0x14, 0x2860);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0504);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6099);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fa4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0xa608);
+ rtl_mdio_write(hw, 0x14, 0xc17d);
+ rtl_mdio_write(hw, 0x14, 0xc200);
+ rtl_mdio_write(hw, 0x14, 0xc43f);
+ rtl_mdio_write(hw, 0x14, 0xcc03);
+ rtl_mdio_write(hw, 0x14, 0xa701);
+ rtl_mdio_write(hw, 0x14, 0xa510);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4018);
+ rtl_mdio_write(hw, 0x14, 0x9910);
+ rtl_mdio_write(hw, 0x14, 0x8510);
+ rtl_mdio_write(hw, 0x14, 0x2926);
+ rtl_mdio_write(hw, 0x14, 0x1792);
+ rtl_mdio_write(hw, 0x14, 0x27db);
+ rtl_mdio_write(hw, 0x14, 0xc000);
+ rtl_mdio_write(hw, 0x14, 0xc100);
+ rtl_mdio_write(hw, 0x14, 0xc200);
+ rtl_mdio_write(hw, 0x14, 0xc300);
+ rtl_mdio_write(hw, 0x14, 0xc400);
+ rtl_mdio_write(hw, 0x14, 0xc500);
+ rtl_mdio_write(hw, 0x14, 0xc600);
+ rtl_mdio_write(hw, 0x14, 0xc7c1);
+ rtl_mdio_write(hw, 0x14, 0xc800);
+ rtl_mdio_write(hw, 0x14, 0xcc00);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xca0f);
+ rtl_mdio_write(hw, 0x14, 0xcbff);
+ rtl_mdio_write(hw, 0x14, 0xa901);
+ rtl_mdio_write(hw, 0x14, 0x8902);
+ rtl_mdio_write(hw, 0x14, 0xc900);
+ rtl_mdio_write(hw, 0x14, 0xca00);
+ rtl_mdio_write(hw, 0x14, 0xcb00);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xb804);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x6044);
+ rtl_mdio_write(hw, 0x14, 0x9804);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6099);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fa4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xa510);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6098);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fa4);
+ rtl_mdio_write(hw, 0x14, 0x2cd4);
+ rtl_mdio_write(hw, 0x14, 0x8510);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x3003);
+ rtl_mdio_write(hw, 0x14, 0x1d01);
+ rtl_mdio_write(hw, 0x14, 0x2d0b);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x60be);
+ rtl_mdio_write(hw, 0x14, 0xe060);
+ rtl_mdio_write(hw, 0x14, 0x0920);
+ rtl_mdio_write(hw, 0x14, 0x1cd6);
+ rtl_mdio_write(hw, 0x14, 0x2c89);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x3063);
+ rtl_mdio_write(hw, 0x14, 0x1948);
+ rtl_mdio_write(hw, 0x14, 0x288a);
+ rtl_mdio_write(hw, 0x14, 0x1cd6);
+ rtl_mdio_write(hw, 0x14, 0x29bd);
+ rtl_mdio_write(hw, 0x14, 0xa802);
+ rtl_mdio_write(hw, 0x14, 0xa303);
+ rtl_mdio_write(hw, 0x14, 0x843f);
+ rtl_mdio_write(hw, 0x14, 0x81ff);
+ rtl_mdio_write(hw, 0x14, 0x8208);
+ rtl_mdio_write(hw, 0x14, 0xa201);
+ rtl_mdio_write(hw, 0x14, 0xc001);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x30a0);
+ rtl_mdio_write(hw, 0x14, 0x0d1c);
+ rtl_mdio_write(hw, 0x14, 0x30a0);
+ rtl_mdio_write(hw, 0x14, 0x3d13);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7f4c);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0xe003);
+ rtl_mdio_write(hw, 0x14, 0x0202);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6090);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fac);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0xa20c);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6091);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fac);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0x820e);
+ rtl_mdio_write(hw, 0x14, 0xa3e0);
+ rtl_mdio_write(hw, 0x14, 0xa520);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x609d);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fac);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0x8520);
+ rtl_mdio_write(hw, 0x14, 0x6703);
+ rtl_mdio_write(hw, 0x14, 0x2d34);
+ rtl_mdio_write(hw, 0x14, 0xa13e);
+ rtl_mdio_write(hw, 0x14, 0xc001);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x6046);
+ rtl_mdio_write(hw, 0x14, 0x2d0d);
+ rtl_mdio_write(hw, 0x14, 0xa43f);
+ rtl_mdio_write(hw, 0x14, 0xa101);
+ rtl_mdio_write(hw, 0x14, 0xc020);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x3121);
+ rtl_mdio_write(hw, 0x14, 0x0d45);
+ rtl_mdio_write(hw, 0x14, 0x30c0);
+ rtl_mdio_write(hw, 0x14, 0x3d0d);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7f4c);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0xa540);
+ rtl_mdio_write(hw, 0x14, 0xc001);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4001);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0501);
+ rtl_mdio_write(hw, 0x14, 0x1dac);
+ rtl_mdio_write(hw, 0x14, 0xc1c4);
+ rtl_mdio_write(hw, 0x14, 0xa268);
+ rtl_mdio_write(hw, 0x14, 0xa303);
+ rtl_mdio_write(hw, 0x14, 0x8420);
+ rtl_mdio_write(hw, 0x14, 0xe00f);
+ rtl_mdio_write(hw, 0x14, 0x0502);
+ rtl_mdio_write(hw, 0x14, 0x1dac);
+ rtl_mdio_write(hw, 0x14, 0xc002);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x8208);
+ rtl_mdio_write(hw, 0x14, 0x8410);
+ rtl_mdio_write(hw, 0x14, 0xa121);
+ rtl_mdio_write(hw, 0x14, 0xc002);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x8120);
+ rtl_mdio_write(hw, 0x14, 0x8180);
+ rtl_mdio_write(hw, 0x14, 0x1d97);
+ rtl_mdio_write(hw, 0x14, 0xa180);
+ rtl_mdio_write(hw, 0x14, 0xa13a);
+ rtl_mdio_write(hw, 0x14, 0x8240);
+ rtl_mdio_write(hw, 0x14, 0xa430);
+ rtl_mdio_write(hw, 0x14, 0xc010);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x30e1);
+ rtl_mdio_write(hw, 0x14, 0x0abc);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7f8c);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0xa480);
+ rtl_mdio_write(hw, 0x14, 0xa230);
+ rtl_mdio_write(hw, 0x14, 0xa303);
+ rtl_mdio_write(hw, 0x14, 0xc001);
+ rtl_mdio_write(hw, 0x14, 0xd70c);
+ rtl_mdio_write(hw, 0x14, 0x4124);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x6120);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x3128);
+ rtl_mdio_write(hw, 0x14, 0x3d76);
+ rtl_mdio_write(hw, 0x14, 0x2d70);
+ rtl_mdio_write(hw, 0x14, 0xa801);
+ rtl_mdio_write(hw, 0x14, 0x2d6c);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0xe018);
+ rtl_mdio_write(hw, 0x14, 0x0208);
+ rtl_mdio_write(hw, 0x14, 0xa1f8);
+ rtl_mdio_write(hw, 0x14, 0x8480);
+ rtl_mdio_write(hw, 0x14, 0xc004);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x6046);
+ rtl_mdio_write(hw, 0x14, 0x2d0d);
+ rtl_mdio_write(hw, 0x14, 0xa43f);
+ rtl_mdio_write(hw, 0x14, 0xa105);
+ rtl_mdio_write(hw, 0x14, 0x8228);
+ rtl_mdio_write(hw, 0x14, 0xc004);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x81bc);
+ rtl_mdio_write(hw, 0x14, 0xa220);
+ rtl_mdio_write(hw, 0x14, 0x1d97);
+ rtl_mdio_write(hw, 0x14, 0x8220);
+ rtl_mdio_write(hw, 0x14, 0xa1bc);
+ rtl_mdio_write(hw, 0x14, 0xc040);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x30e1);
+ rtl_mdio_write(hw, 0x14, 0x0abc);
+ rtl_mdio_write(hw, 0x14, 0x30e1);
+ rtl_mdio_write(hw, 0x14, 0x3d0d);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7f4c);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0xa802);
+ rtl_mdio_write(hw, 0x14, 0xd70c);
+ rtl_mdio_write(hw, 0x14, 0x4244);
+ rtl_mdio_write(hw, 0x14, 0xa301);
+ rtl_mdio_write(hw, 0x14, 0xc004);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x3128);
+ rtl_mdio_write(hw, 0x14, 0x3da5);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x5f80);
+ rtl_mdio_write(hw, 0x14, 0xd711);
+ rtl_mdio_write(hw, 0x14, 0x3109);
+ rtl_mdio_write(hw, 0x14, 0x3da7);
+ rtl_mdio_write(hw, 0x14, 0x2dab);
+ rtl_mdio_write(hw, 0x14, 0xa801);
+ rtl_mdio_write(hw, 0x14, 0x2d9a);
+ rtl_mdio_write(hw, 0x14, 0xa802);
+ rtl_mdio_write(hw, 0x14, 0xc004);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x4000);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x14, 0xa510);
+ rtl_mdio_write(hw, 0x14, 0xd710);
+ rtl_mdio_write(hw, 0x14, 0x609a);
+ rtl_mdio_write(hw, 0x14, 0xd71e);
+ rtl_mdio_write(hw, 0x14, 0x7fac);
+ rtl_mdio_write(hw, 0x14, 0x2ab6);
+ rtl_mdio_write(hw, 0x14, 0x8510);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x13, 0xA01A);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA006);
+ rtl_mdio_write(hw, 0x14, 0x0ad6);
+ rtl_mdio_write(hw, 0x13, 0xA004);
+ rtl_mdio_write(hw, 0x14, 0x07f5);
+ rtl_mdio_write(hw, 0x13, 0xA002);
+ rtl_mdio_write(hw, 0x14, 0x06a9);
+ rtl_mdio_write(hw, 0x13, 0xA000);
+ rtl_mdio_write(hw, 0x14, 0xf069);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x83a0);
+ rtl_mdio_write(hw, 0x14, 0xaf83);
+ rtl_mdio_write(hw, 0x14, 0xacaf);
+ rtl_mdio_write(hw, 0x14, 0x83b8);
+ rtl_mdio_write(hw, 0x14, 0xaf83);
+ rtl_mdio_write(hw, 0x14, 0xcdaf);
+ rtl_mdio_write(hw, 0x14, 0x83d3);
+ rtl_mdio_write(hw, 0x14, 0x0204);
+ rtl_mdio_write(hw, 0x14, 0x9a02);
+ rtl_mdio_write(hw, 0x14, 0x09a9);
+ rtl_mdio_write(hw, 0x14, 0x0284);
+ rtl_mdio_write(hw, 0x14, 0x61af);
+ rtl_mdio_write(hw, 0x14, 0x02fc);
+ rtl_mdio_write(hw, 0x14, 0xad20);
+ rtl_mdio_write(hw, 0x14, 0x0302);
+ rtl_mdio_write(hw, 0x14, 0x867c);
+ rtl_mdio_write(hw, 0x14, 0xad21);
+ rtl_mdio_write(hw, 0x14, 0x0302);
+ rtl_mdio_write(hw, 0x14, 0x85c9);
+ rtl_mdio_write(hw, 0x14, 0xad22);
+ rtl_mdio_write(hw, 0x14, 0x0302);
+ rtl_mdio_write(hw, 0x14, 0x1bc0);
+ rtl_mdio_write(hw, 0x14, 0xaf17);
+ rtl_mdio_write(hw, 0x14, 0xe302);
+ rtl_mdio_write(hw, 0x14, 0x8703);
+ rtl_mdio_write(hw, 0x14, 0xaf18);
+ rtl_mdio_write(hw, 0x14, 0x6201);
+ rtl_mdio_write(hw, 0x14, 0x06e0);
+ rtl_mdio_write(hw, 0x14, 0x8148);
+ rtl_mdio_write(hw, 0x14, 0xaf3c);
+ rtl_mdio_write(hw, 0x14, 0x69f8);
+ rtl_mdio_write(hw, 0x14, 0xf9fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0x10f7);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0x131f);
+ rtl_mdio_write(hw, 0x14, 0xd104);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0xf302);
+ rtl_mdio_write(hw, 0x14, 0x4259);
+ rtl_mdio_write(hw, 0x14, 0x0287);
+ rtl_mdio_write(hw, 0x14, 0x88bf);
+ rtl_mdio_write(hw, 0x14, 0x87cf);
+ rtl_mdio_write(hw, 0x14, 0xd7b8);
+ rtl_mdio_write(hw, 0x14, 0x22d0);
+ rtl_mdio_write(hw, 0x14, 0x0c02);
+ rtl_mdio_write(hw, 0x14, 0x4252);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xcda0);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xce8b);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xd1f5);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xd2a9);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xd30a);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xf010);
+ rtl_mdio_write(hw, 0x14, 0xee80);
+ rtl_mdio_write(hw, 0x14, 0xf38f);
+ rtl_mdio_write(hw, 0x14, 0xee81);
+ rtl_mdio_write(hw, 0x14, 0x011e);
+ rtl_mdio_write(hw, 0x14, 0xee81);
+ rtl_mdio_write(hw, 0x14, 0x0b4a);
+ rtl_mdio_write(hw, 0x14, 0xee81);
+ rtl_mdio_write(hw, 0x14, 0x0c7c);
+ rtl_mdio_write(hw, 0x14, 0xee81);
+ rtl_mdio_write(hw, 0x14, 0x127f);
+ rtl_mdio_write(hw, 0x14, 0xd100);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+ rtl_mdio_write(hw, 0x14, 0xb5ee);
+ rtl_mdio_write(hw, 0x14, 0x8088);
+ rtl_mdio_write(hw, 0x14, 0xa4ee);
+ rtl_mdio_write(hw, 0x14, 0x8089);
+ rtl_mdio_write(hw, 0x14, 0x44ee);
+ rtl_mdio_write(hw, 0x14, 0x809a);
+ rtl_mdio_write(hw, 0x14, 0xa4ee);
+ rtl_mdio_write(hw, 0x14, 0x809b);
+ rtl_mdio_write(hw, 0x14, 0x44ee);
+ rtl_mdio_write(hw, 0x14, 0x809c);
+ rtl_mdio_write(hw, 0x14, 0xa7ee);
+ rtl_mdio_write(hw, 0x14, 0x80a5);
+ rtl_mdio_write(hw, 0x14, 0xa7d2);
+ rtl_mdio_write(hw, 0x14, 0x0002);
+ rtl_mdio_write(hw, 0x14, 0x0e66);
+ rtl_mdio_write(hw, 0x14, 0x0285);
+ rtl_mdio_write(hw, 0x14, 0xc0ee);
+ rtl_mdio_write(hw, 0x14, 0x87fc);
+ rtl_mdio_write(hw, 0x14, 0x00e0);
+ rtl_mdio_write(hw, 0x14, 0x8245);
+ rtl_mdio_write(hw, 0x14, 0xf622);
+ rtl_mdio_write(hw, 0x14, 0xe482);
+ rtl_mdio_write(hw, 0x14, 0x45ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfdfc);
+ rtl_mdio_write(hw, 0x14, 0x0402);
+ rtl_mdio_write(hw, 0x14, 0x847a);
+ rtl_mdio_write(hw, 0x14, 0x0284);
+ rtl_mdio_write(hw, 0x14, 0xb302);
+ rtl_mdio_write(hw, 0x14, 0x0cab);
+ rtl_mdio_write(hw, 0x14, 0x020c);
+ rtl_mdio_write(hw, 0x14, 0xc402);
+ rtl_mdio_write(hw, 0x14, 0x0cef);
+ rtl_mdio_write(hw, 0x14, 0x020d);
+ rtl_mdio_write(hw, 0x14, 0x0802);
+ rtl_mdio_write(hw, 0x14, 0x0d33);
+ rtl_mdio_write(hw, 0x14, 0x020c);
+ rtl_mdio_write(hw, 0x14, 0x3d04);
+ rtl_mdio_write(hw, 0x14, 0xf8fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe182);
+ rtl_mdio_write(hw, 0x14, 0x2fac);
+ rtl_mdio_write(hw, 0x14, 0x291a);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x24ac);
+ rtl_mdio_write(hw, 0x14, 0x2102);
+ rtl_mdio_write(hw, 0x14, 0xae22);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+ rtl_mdio_write(hw, 0x14, 0x57f6);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8224);
+ rtl_mdio_write(hw, 0x14, 0xd101);
+ rtl_mdio_write(hw, 0x14, 0xbf44);
+ rtl_mdio_write(hw, 0x14, 0xd202);
+ rtl_mdio_write(hw, 0x14, 0x4259);
+ rtl_mdio_write(hw, 0x14, 0xae10);
+ rtl_mdio_write(hw, 0x14, 0x0212);
+ rtl_mdio_write(hw, 0x14, 0x4cf6);
+ rtl_mdio_write(hw, 0x14, 0x29e5);
+ rtl_mdio_write(hw, 0x14, 0x822f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x24f6);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8224);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xe182);
+ rtl_mdio_write(hw, 0x14, 0x2fac);
+ rtl_mdio_write(hw, 0x14, 0x2a18);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x24ac);
+ rtl_mdio_write(hw, 0x14, 0x2202);
+ rtl_mdio_write(hw, 0x14, 0xae26);
+ rtl_mdio_write(hw, 0x14, 0x0284);
+ rtl_mdio_write(hw, 0x14, 0xf802);
+ rtl_mdio_write(hw, 0x14, 0x8565);
+ rtl_mdio_write(hw, 0x14, 0xd101);
+ rtl_mdio_write(hw, 0x14, 0xbf44);
+ rtl_mdio_write(hw, 0x14, 0xd502);
+ rtl_mdio_write(hw, 0x14, 0x4259);
+ rtl_mdio_write(hw, 0x14, 0xae0e);
+ rtl_mdio_write(hw, 0x14, 0x0284);
+ rtl_mdio_write(hw, 0x14, 0xea02);
+ rtl_mdio_write(hw, 0x14, 0x85a9);
+ rtl_mdio_write(hw, 0x14, 0xe182);
+ rtl_mdio_write(hw, 0x14, 0x2ff6);
+ rtl_mdio_write(hw, 0x14, 0x2ae5);
+ rtl_mdio_write(hw, 0x14, 0x822f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x24f6);
+ rtl_mdio_write(hw, 0x14, 0x22e4);
+ rtl_mdio_write(hw, 0x14, 0x8224);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf9e2);
+ rtl_mdio_write(hw, 0x14, 0x8011);
+ rtl_mdio_write(hw, 0x14, 0xad31);
+ rtl_mdio_write(hw, 0x14, 0x05d2);
+ rtl_mdio_write(hw, 0x14, 0x0002);
+ rtl_mdio_write(hw, 0x14, 0x0e66);
+ rtl_mdio_write(hw, 0x14, 0xfd04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69e0);
+ rtl_mdio_write(hw, 0x14, 0x8011);
+ rtl_mdio_write(hw, 0x14, 0xad21);
+ rtl_mdio_write(hw, 0x14, 0x5cbf);
+ rtl_mdio_write(hw, 0x14, 0x43be);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97ac);
+ rtl_mdio_write(hw, 0x14, 0x281b);
+ rtl_mdio_write(hw, 0x14, 0xbf43);
+ rtl_mdio_write(hw, 0x14, 0xc102);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0xac28);
+ rtl_mdio_write(hw, 0x14, 0x12bf);
+ rtl_mdio_write(hw, 0x14, 0x43c7);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97ac);
+ rtl_mdio_write(hw, 0x14, 0x2804);
+ rtl_mdio_write(hw, 0x14, 0xd300);
+ rtl_mdio_write(hw, 0x14, 0xae07);
+ rtl_mdio_write(hw, 0x14, 0xd306);
+ rtl_mdio_write(hw, 0x14, 0xaf85);
+ rtl_mdio_write(hw, 0x14, 0x56d3);
+ rtl_mdio_write(hw, 0x14, 0x03e0);
+ rtl_mdio_write(hw, 0x14, 0x8011);
+ rtl_mdio_write(hw, 0x14, 0xad26);
+ rtl_mdio_write(hw, 0x14, 0x25bf);
+ rtl_mdio_write(hw, 0x14, 0x4559);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97e2);
+ rtl_mdio_write(hw, 0x14, 0x8073);
+ rtl_mdio_write(hw, 0x14, 0x0d21);
+ rtl_mdio_write(hw, 0x14, 0xf637);
+ rtl_mdio_write(hw, 0x14, 0x0d11);
+ rtl_mdio_write(hw, 0x14, 0xf62f);
+ rtl_mdio_write(hw, 0x14, 0x1b21);
+ rtl_mdio_write(hw, 0x14, 0xaa02);
+ rtl_mdio_write(hw, 0x14, 0xae10);
+ rtl_mdio_write(hw, 0x14, 0xe280);
+ rtl_mdio_write(hw, 0x14, 0x740d);
+ rtl_mdio_write(hw, 0x14, 0x21f6);
+ rtl_mdio_write(hw, 0x14, 0x371b);
+ rtl_mdio_write(hw, 0x14, 0x21aa);
+ rtl_mdio_write(hw, 0x14, 0x0313);
+ rtl_mdio_write(hw, 0x14, 0xae02);
+ rtl_mdio_write(hw, 0x14, 0x2b02);
+ rtl_mdio_write(hw, 0x14, 0x020e);
+ rtl_mdio_write(hw, 0x14, 0x5102);
+ rtl_mdio_write(hw, 0x14, 0x0e66);
+ rtl_mdio_write(hw, 0x14, 0x020f);
+ rtl_mdio_write(hw, 0x14, 0xa3ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfdfc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xf9fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe080);
+ rtl_mdio_write(hw, 0x14, 0x12ad);
+ rtl_mdio_write(hw, 0x14, 0x2733);
+ rtl_mdio_write(hw, 0x14, 0xbf43);
+ rtl_mdio_write(hw, 0x14, 0xbe02);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0xac28);
+ rtl_mdio_write(hw, 0x14, 0x09bf);
+ rtl_mdio_write(hw, 0x14, 0x43c1);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97ad);
+ rtl_mdio_write(hw, 0x14, 0x2821);
+ rtl_mdio_write(hw, 0x14, 0xbf45);
+ rtl_mdio_write(hw, 0x14, 0x5902);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0xe387);
+ rtl_mdio_write(hw, 0x14, 0xffd2);
+ rtl_mdio_write(hw, 0x14, 0x001b);
+ rtl_mdio_write(hw, 0x14, 0x45ac);
+ rtl_mdio_write(hw, 0x14, 0x2711);
+ rtl_mdio_write(hw, 0x14, 0xe187);
+ rtl_mdio_write(hw, 0x14, 0xfebf);
+ rtl_mdio_write(hw, 0x14, 0x87e4);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x590d);
+ rtl_mdio_write(hw, 0x14, 0x11bf);
+ rtl_mdio_write(hw, 0x14, 0x87e7);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfdfc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69d1);
+ rtl_mdio_write(hw, 0x14, 0x00bf);
+ rtl_mdio_write(hw, 0x14, 0x87e4);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59bf);
+ rtl_mdio_write(hw, 0x14, 0x87e7);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xff46);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xfe01);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69e0);
+ rtl_mdio_write(hw, 0x14, 0x8241);
+ rtl_mdio_write(hw, 0x14, 0xa000);
+ rtl_mdio_write(hw, 0x14, 0x0502);
+ rtl_mdio_write(hw, 0x14, 0x85eb);
+ rtl_mdio_write(hw, 0x14, 0xae0e);
+ rtl_mdio_write(hw, 0x14, 0xa001);
+ rtl_mdio_write(hw, 0x14, 0x0502);
+ rtl_mdio_write(hw, 0x14, 0x1a5a);
+ rtl_mdio_write(hw, 0x14, 0xae06);
+ rtl_mdio_write(hw, 0x14, 0xa002);
+ rtl_mdio_write(hw, 0x14, 0x0302);
+ rtl_mdio_write(hw, 0x14, 0x1ae6);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xf9fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x29f6);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8229);
+ rtl_mdio_write(hw, 0x14, 0xe080);
+ rtl_mdio_write(hw, 0x14, 0x10ac);
+ rtl_mdio_write(hw, 0x14, 0x2202);
+ rtl_mdio_write(hw, 0x14, 0xae76);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x27f7);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8227);
+ rtl_mdio_write(hw, 0x14, 0xbf43);
+ rtl_mdio_write(hw, 0x14, 0x1302);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0xef21);
+ rtl_mdio_write(hw, 0x14, 0xbf43);
+ rtl_mdio_write(hw, 0x14, 0x1602);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0x0c11);
+ rtl_mdio_write(hw, 0x14, 0x1e21);
+ rtl_mdio_write(hw, 0x14, 0xbf43);
+ rtl_mdio_write(hw, 0x14, 0x1902);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0x0c12);
+ rtl_mdio_write(hw, 0x14, 0x1e21);
+ rtl_mdio_write(hw, 0x14, 0xe682);
+ rtl_mdio_write(hw, 0x14, 0x43a2);
+ rtl_mdio_write(hw, 0x14, 0x000a);
+ rtl_mdio_write(hw, 0x14, 0xe182);
+ rtl_mdio_write(hw, 0x14, 0x27f6);
+ rtl_mdio_write(hw, 0x14, 0x29e5);
+ rtl_mdio_write(hw, 0x14, 0x8227);
+ rtl_mdio_write(hw, 0x14, 0xae42);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44f7);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x0246);
+ rtl_mdio_write(hw, 0x14, 0xaebf);
+ rtl_mdio_write(hw, 0x14, 0x4325);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97ef);
+ rtl_mdio_write(hw, 0x14, 0x21bf);
+ rtl_mdio_write(hw, 0x14, 0x431c);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x970c);
+ rtl_mdio_write(hw, 0x14, 0x121e);
+ rtl_mdio_write(hw, 0x14, 0x21bf);
+ rtl_mdio_write(hw, 0x14, 0x431f);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x970c);
+ rtl_mdio_write(hw, 0x14, 0x131e);
+ rtl_mdio_write(hw, 0x14, 0x21bf);
+ rtl_mdio_write(hw, 0x14, 0x4328);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x970c);
+ rtl_mdio_write(hw, 0x14, 0x141e);
+ rtl_mdio_write(hw, 0x14, 0x21bf);
+ rtl_mdio_write(hw, 0x14, 0x44b1);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x970c);
+ rtl_mdio_write(hw, 0x14, 0x161e);
+ rtl_mdio_write(hw, 0x14, 0x21e6);
+ rtl_mdio_write(hw, 0x14, 0x8242);
+ rtl_mdio_write(hw, 0x14, 0xee82);
+ rtl_mdio_write(hw, 0x14, 0x4101);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x46a0);
+ rtl_mdio_write(hw, 0x14, 0x0005);
+ rtl_mdio_write(hw, 0x14, 0x0286);
+ rtl_mdio_write(hw, 0x14, 0x96ae);
+ rtl_mdio_write(hw, 0x14, 0x06a0);
+ rtl_mdio_write(hw, 0x14, 0x0103);
+ rtl_mdio_write(hw, 0x14, 0x0219);
+ rtl_mdio_write(hw, 0x14, 0x19ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x29f6);
+ rtl_mdio_write(hw, 0x14, 0x20e4);
+ rtl_mdio_write(hw, 0x14, 0x8229);
+ rtl_mdio_write(hw, 0x14, 0xe080);
+ rtl_mdio_write(hw, 0x14, 0x10ac);
+ rtl_mdio_write(hw, 0x14, 0x2102);
+ rtl_mdio_write(hw, 0x14, 0xae54);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x27f7);
+ rtl_mdio_write(hw, 0x14, 0x20e4);
+ rtl_mdio_write(hw, 0x14, 0x8227);
+ rtl_mdio_write(hw, 0x14, 0xbf42);
+ rtl_mdio_write(hw, 0x14, 0xe602);
+ rtl_mdio_write(hw, 0x14, 0x4297);
+ rtl_mdio_write(hw, 0x14, 0xac28);
+ rtl_mdio_write(hw, 0x14, 0x22bf);
+ rtl_mdio_write(hw, 0x14, 0x430d);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97e5);
+ rtl_mdio_write(hw, 0x14, 0x8247);
+ rtl_mdio_write(hw, 0x14, 0xac28);
+ rtl_mdio_write(hw, 0x14, 0x20d1);
+ rtl_mdio_write(hw, 0x14, 0x03bf);
+ rtl_mdio_write(hw, 0x14, 0x4307);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59ee);
+ rtl_mdio_write(hw, 0x14, 0x8246);
+ rtl_mdio_write(hw, 0x14, 0x00e1);
+ rtl_mdio_write(hw, 0x14, 0x8227);
+ rtl_mdio_write(hw, 0x14, 0xf628);
+ rtl_mdio_write(hw, 0x14, 0xe582);
+ rtl_mdio_write(hw, 0x14, 0x27ae);
+ rtl_mdio_write(hw, 0x14, 0x21d1);
+ rtl_mdio_write(hw, 0x14, 0x04bf);
+ rtl_mdio_write(hw, 0x14, 0x4307);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59ae);
+ rtl_mdio_write(hw, 0x14, 0x08d1);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x4307);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59e0);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0xf720);
+ rtl_mdio_write(hw, 0x14, 0xe482);
+ rtl_mdio_write(hw, 0x14, 0x4402);
+ rtl_mdio_write(hw, 0x14, 0x46ae);
+ rtl_mdio_write(hw, 0x14, 0xee82);
+ rtl_mdio_write(hw, 0x14, 0x4601);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69e0);
+ rtl_mdio_write(hw, 0x14, 0x8013);
+ rtl_mdio_write(hw, 0x14, 0xad24);
+ rtl_mdio_write(hw, 0x14, 0x1cbf);
+ rtl_mdio_write(hw, 0x14, 0x87f0);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x97ad);
+ rtl_mdio_write(hw, 0x14, 0x2813);
+ rtl_mdio_write(hw, 0x14, 0xe087);
+ rtl_mdio_write(hw, 0x14, 0xfca0);
+ rtl_mdio_write(hw, 0x14, 0x0005);
+ rtl_mdio_write(hw, 0x14, 0x0287);
+ rtl_mdio_write(hw, 0x14, 0x36ae);
+ rtl_mdio_write(hw, 0x14, 0x10a0);
+ rtl_mdio_write(hw, 0x14, 0x0105);
+ rtl_mdio_write(hw, 0x14, 0x0287);
+ rtl_mdio_write(hw, 0x14, 0x48ae);
+ rtl_mdio_write(hw, 0x14, 0x08e0);
+ rtl_mdio_write(hw, 0x14, 0x8230);
+ rtl_mdio_write(hw, 0x14, 0xf626);
+ rtl_mdio_write(hw, 0x14, 0xe482);
+ rtl_mdio_write(hw, 0x14, 0x30ef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8e0);
+ rtl_mdio_write(hw, 0x14, 0x8245);
+ rtl_mdio_write(hw, 0x14, 0xf722);
+ rtl_mdio_write(hw, 0x14, 0xe482);
+ rtl_mdio_write(hw, 0x14, 0x4502);
+ rtl_mdio_write(hw, 0x14, 0x46ae);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xfc01);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xfb02);
+ rtl_mdio_write(hw, 0x14, 0x46d3);
+ rtl_mdio_write(hw, 0x14, 0xad50);
+ rtl_mdio_write(hw, 0x14, 0x2fbf);
+ rtl_mdio_write(hw, 0x14, 0x87ed);
+ rtl_mdio_write(hw, 0x14, 0xd101);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59bf);
+ rtl_mdio_write(hw, 0x14, 0x87ed);
+ rtl_mdio_write(hw, 0x14, 0xd100);
+ rtl_mdio_write(hw, 0x14, 0x0242);
+ rtl_mdio_write(hw, 0x14, 0x59e0);
+ rtl_mdio_write(hw, 0x14, 0x8245);
+ rtl_mdio_write(hw, 0x14, 0xf622);
+ rtl_mdio_write(hw, 0x14, 0xe482);
+ rtl_mdio_write(hw, 0x14, 0x4502);
+ rtl_mdio_write(hw, 0x14, 0x46ae);
+ rtl_mdio_write(hw, 0x14, 0xd100);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0xf002);
+ rtl_mdio_write(hw, 0x14, 0x4259);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xfc00);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x30f6);
+ rtl_mdio_write(hw, 0x14, 0x26e4);
+ rtl_mdio_write(hw, 0x14, 0x8230);
+ rtl_mdio_write(hw, 0x14, 0xffef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xface);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69fb);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0xb3d7);
+ rtl_mdio_write(hw, 0x14, 0x001c);
+ rtl_mdio_write(hw, 0x14, 0xd819);
+ rtl_mdio_write(hw, 0x14, 0xd919);
+ rtl_mdio_write(hw, 0x14, 0xda19);
+ rtl_mdio_write(hw, 0x14, 0xdb19);
+ rtl_mdio_write(hw, 0x14, 0x07ef);
+ rtl_mdio_write(hw, 0x14, 0x9502);
+ rtl_mdio_write(hw, 0x14, 0x4259);
+ rtl_mdio_write(hw, 0x14, 0x073f);
+ rtl_mdio_write(hw, 0x14, 0x0004);
+ rtl_mdio_write(hw, 0x14, 0x9fec);
+ rtl_mdio_write(hw, 0x14, 0xffef);
+ rtl_mdio_write(hw, 0x14, 0x96fe);
+ rtl_mdio_write(hw, 0x14, 0xc6fe);
+ rtl_mdio_write(hw, 0x14, 0xfdfc);
+ rtl_mdio_write(hw, 0x14, 0x0400);
+ rtl_mdio_write(hw, 0x14, 0x0145);
+ rtl_mdio_write(hw, 0x14, 0x7d00);
+ rtl_mdio_write(hw, 0x14, 0x0345);
+ rtl_mdio_write(hw, 0x14, 0x5c00);
+ rtl_mdio_write(hw, 0x14, 0x0143);
+ rtl_mdio_write(hw, 0x14, 0x4f00);
+ rtl_mdio_write(hw, 0x14, 0x0387);
+ rtl_mdio_write(hw, 0x14, 0xdb00);
+ rtl_mdio_write(hw, 0x14, 0x0987);
+ rtl_mdio_write(hw, 0x14, 0xde00);
+ rtl_mdio_write(hw, 0x14, 0x0987);
+ rtl_mdio_write(hw, 0x14, 0xe100);
+ rtl_mdio_write(hw, 0x14, 0x0087);
+ rtl_mdio_write(hw, 0x14, 0xeaa4);
+ rtl_mdio_write(hw, 0x14, 0x00b8);
+ rtl_mdio_write(hw, 0x14, 0x20c4);
+ rtl_mdio_write(hw, 0x14, 0x1600);
+ rtl_mdio_write(hw, 0x14, 0x000f);
+ rtl_mdio_write(hw, 0x14, 0xf800);
+ rtl_mdio_write(hw, 0x14, 0x7098);
+ rtl_mdio_write(hw, 0x14, 0xa58a);
+ rtl_mdio_write(hw, 0x14, 0xb6a8);
+ rtl_mdio_write(hw, 0x14, 0x3e50);
+ rtl_mdio_write(hw, 0x14, 0xa83e);
+ rtl_mdio_write(hw, 0x14, 0x33bc);
+ rtl_mdio_write(hw, 0x14, 0xc622);
+ rtl_mdio_write(hw, 0x14, 0xbcc6);
+ rtl_mdio_write(hw, 0x14, 0xaaa4);
+ rtl_mdio_write(hw, 0x14, 0x42ff);
+ rtl_mdio_write(hw, 0x14, 0xc408);
+ rtl_mdio_write(hw, 0x14, 0x00c4);
+ rtl_mdio_write(hw, 0x14, 0x16a8);
+ rtl_mdio_write(hw, 0x14, 0xbcc0);
+ rtl_mdio_write(hw, 0x13, 0xb818);
+ rtl_mdio_write(hw, 0x14, 0x02f3);
+ rtl_mdio_write(hw, 0x13, 0xb81a);
+ rtl_mdio_write(hw, 0x14, 0x17d1);
+ rtl_mdio_write(hw, 0x13, 0xb81c);
+ rtl_mdio_write(hw, 0x14, 0x185a);
+ rtl_mdio_write(hw, 0x13, 0xb81e);
+ rtl_mdio_write(hw, 0x14, 0x3c66);
+ rtl_mdio_write(hw, 0x13, 0xb820);
+ rtl_mdio_write(hw, 0x14, 0x021f);
+ rtl_mdio_write(hw, 0x13, 0xc416);
+ rtl_mdio_write(hw, 0x14, 0x0500);
+ rtl_mdio_write(hw, 0x13, 0xb82e);
+ rtl_mdio_write(hw, 0x14, 0xfffc);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x10);
+ gphy_val &= ~BIT_9;
+ rtl_mdio_write(hw, 0x10, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+/* ------------------------------------PHY 8168GU2------------------------------------- */
+
+static void
+rtl8168_set_phy_mcu_8168gu_2(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x0300);
+ rtl_mdio_write(hw, 0x13, 0xB82E);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0xb820);
+ rtl_mdio_write(hw, 0x14, 0x0290);
+ rtl_mdio_write(hw, 0x13, 0xa012);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xa014);
+ rtl_mdio_write(hw, 0x14, 0x2c04);
+ rtl_mdio_write(hw, 0x14, 0x2c07);
+ rtl_mdio_write(hw, 0x14, 0x2c07);
+ rtl_mdio_write(hw, 0x14, 0x2c07);
+ rtl_mdio_write(hw, 0x14, 0xa304);
+ rtl_mdio_write(hw, 0x14, 0xa301);
+ rtl_mdio_write(hw, 0x14, 0x207e);
+ rtl_mdio_write(hw, 0x13, 0xa01a);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xa006);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xa004);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xa002);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xa000);
+ rtl_mdio_write(hw, 0x14, 0x107c);
+ rtl_mdio_write(hw, 0x13, 0xb820);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x17);
+ gphy_val &= ~BIT_0;
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8146);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+void
+hw_mac_mcu_config_8168g(struct rtl_hw *hw)
+{
+ if (hw->NotWrMcuPatchCode)
+ return;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ rtl8168_set_mac_mcu_8168g_1(hw);
+ break;
+ case CFG_METHOD_24:
+ rtl8168_set_mac_mcu_8168gu_1(hw);
+ break;
+ case CFG_METHOD_25:
+ rtl8168_set_mac_mcu_8168gu_2(hw);
+ break;
+ }
+}
+
+void
+hw_phy_mcu_config_8168g(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ rtl8168_set_phy_mcu_8168g_1(hw);
+ break;
+ case CFG_METHOD_25:
+ rtl8168_set_phy_mcu_8168gu_2(hw);
+ break;
+ }
+}
diff --git a/drivers/net/r8169/base/rtl8168h.c b/drivers/net/r8169/base/rtl8168h.c
new file mode 100644
index 0000000000..933a15ae39
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168h.c
@@ -0,0 +1,447 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168h.h"
+
+/* For RTL8168H, CFG_METHOD_29,30,35,36 */
+
+void
+hw_init_rxcfg_8168h(struct rtl_hw *hw)
+{
+ RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
+ (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
+}
+
+void
+hw_ephy_config_8168h(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_37:
+ rtl_clear_pcie_phy_bit(hw, 0x1E, BIT_11);
+
+ rtl_set_pcie_phy_bit(hw, 0x1E, BIT_0);
+ rtl_set_pcie_phy_bit(hw, 0x1D, BIT_11);
+
+ rtl_ephy_write(hw, 0x05, 0x2089);
+ rtl_ephy_write(hw, 0x06, 0x5881);
+
+ rtl_ephy_write(hw, 0x04, 0x854A);
+ rtl_ephy_write(hw, 0x01, 0x068B);
+
+ break;
+ case CFG_METHOD_35:
+ rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_2);
+
+ rtl_clear_pcie_phy_bit(hw, 0x24, BIT_9);
+
+ rtl8168_clear_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0));
+
+ rtl8168_set_mcu_ocp_bit(hw, 0xD438, BIT_2);
+
+ break;
+ case CFG_METHOD_36:
+ rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_2);
+
+ rtl8168_clear_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0));
+
+ rtl8168_set_mcu_ocp_bit(hw, 0xD438, BIT_2);
+
+ break;
+ default:
+ break;
+ }
+}
+
+static int
+rtl8168h_require_adc_bias_patch_check(struct rtl_hw *hw, u16 *offset)
+{
+ int ret;
+ u16 ioffset_p3, ioffset_p2, ioffset_p1, ioffset_p0;
+ u16 tmp_ushort;
+
+ rtl_mac_ocp_write(hw, 0xDD02, 0x807D);
+ tmp_ushort = rtl_mac_ocp_read(hw, 0xDD02);
+ ioffset_p3 = ((tmp_ushort & BIT_7) >> 7);
+ ioffset_p3 <<= 3;
+ tmp_ushort = rtl_mac_ocp_read(hw, 0xDD00);
+
+ ioffset_p3 |= ((tmp_ushort & (BIT_15 | BIT_14 | BIT_13)) >> 13);
+
+ ioffset_p2 = ((tmp_ushort & (BIT_12 | BIT_11 | BIT_10 | BIT_9)) >> 9);
+ ioffset_p1 = ((tmp_ushort & (BIT_8 | BIT_7 | BIT_6 | BIT_5)) >> 5);
+
+ ioffset_p0 = ((tmp_ushort & BIT_4) >> 4);
+ ioffset_p0 <<= 3;
+ ioffset_p0 |= (tmp_ushort & (BIT_2 | BIT_1 | BIT_0));
+
+ if (ioffset_p3 == 0x0F && ioffset_p2 == 0x0F && ioffset_p1 == 0x0F &&
+ ioffset_p0 == 0x0F) {
+ ret = FALSE;
+ } else {
+ ret = TRUE;
+ *offset = (ioffset_p3 << 12) | (ioffset_p2 << 8) |
+ (ioffset_p1 << 4) | ioffset_p0;
+ }
+
+ return ret;
+}
+
+static void
+hw_phy_config_8168h_1(struct rtl_hw *hw)
+{
+ u16 dout_tapbin;
+ u16 gphy_val;
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x809b);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x8000);
+ rtl_mdio_write(hw, 0x13, 0x80A2);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8000);
+ rtl_mdio_write(hw, 0x13, 0x80A4);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8500);
+ rtl_mdio_write(hw, 0x13, 0x809C);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xbd00);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x80AD);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x7000);
+ rtl_mdio_write(hw, 0x13, 0x80B4);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x5000);
+ rtl_mdio_write(hw, 0x13, 0x80AC);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4000);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x808E);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x1200);
+ rtl_mdio_write(hw, 0x13, 0x8090);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xE500);
+ rtl_mdio_write(hw, 0x13, 0x8092);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x9F00);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) {
+ dout_tapbin = 0x0000;
+ rtl_mdio_write(hw, 0x1F, 0x0A46);
+ gphy_val = rtl_mdio_read(hw, 0x13);
+ gphy_val &= (BIT_1 | BIT_0);
+ gphy_val <<= 2;
+ dout_tapbin |= gphy_val;
+
+ gphy_val = rtl_mdio_read(hw, 0x12);
+ gphy_val &= (BIT_15 | BIT_14);
+ gphy_val >>= 14;
+ dout_tapbin |= gphy_val;
+
+ dout_tapbin = ~(dout_tapbin ^ BIT_3);
+ dout_tapbin <<= 12;
+ dout_tapbin &= 0xF000;
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+
+ rtl_mdio_write(hw, 0x13, 0x827A);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 | BIT_12),
+ dout_tapbin);
+
+ rtl_mdio_write(hw, 0x13, 0x827B);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 | BIT_12),
+ dout_tapbin);
+
+ rtl_mdio_write(hw, 0x13, 0x827C);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 | BIT_12),
+ dout_tapbin);
+
+ rtl_mdio_write(hw, 0x13, 0x827D);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 | BIT_12),
+ dout_tapbin);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8011);
+ rtl_set_eth_phy_bit(hw, 0x14, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ rtl_set_eth_phy_bit(hw, 0x16, BIT_1);
+ }
+
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_set_eth_phy_bit(hw, 0x11, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCA);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x17, (BIT_13 | BIT_12), BIT_14);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x803F);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x8047);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x804F);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x8057);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x805F);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x8067);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x13, 0x806F);
+ rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12));
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+static void
+hw_phy_config_8168h_2(struct rtl_hw *hw)
+{
+ u16 gphy_val;
+ u16 offset;
+ u16 rlen;
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x808A);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0),
+ 0x0A);
+
+ if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) {
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8011);
+ rtl_set_eth_phy_bit(hw, 0x14, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ rtl_set_eth_phy_bit(hw, 0x16, BIT_1);
+ }
+
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_set_eth_phy_bit(hw, 0x11, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ if (rtl8168h_require_adc_bias_patch_check(hw, &offset)) {
+ rtl_mdio_write(hw, 0x1F, 0x0BCF);
+ rtl_mdio_write(hw, 0x16, offset);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ }
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCD);
+ gphy_val = rtl_mdio_read(hw, 0x16);
+ gphy_val &= 0x000F;
+
+ if (gphy_val > 3)
+ rlen = gphy_val - 3;
+ else
+ rlen = 0;
+
+ gphy_val = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12);
+
+ rtl_mdio_write(hw, 0x1F, 0x0BCD);
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) {
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x85FE);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, (BIT_15 | BIT_14 |
+ BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8),
+ BIT_9);
+ rtl_mdio_write(hw, 0x13, 0x85FF);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 | BIT_12),
+ (BIT_11 | BIT_10 | BIT_9 | BIT_8));
+ rtl_mdio_write(hw, 0x13, 0x814B);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14,
+ (BIT_15 | BIT_14 | BIT_13 |
+ BIT_11 | BIT_10 | BIT_9 | BIT_8),
+ BIT_12);
+ }
+
+ rtl_mdio_write(hw, 0x1F, 0x0C41);
+ rtl_clear_eth_phy_bit(hw, 0x15, BIT_1);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_set_eth_phy_bit(hw, 0x10, BIT_0);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+static void
+hw_phy_config_8168h_3(struct rtl_hw *hw)
+{
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_set_eth_phy_bit(hw, 0x11, BIT_11);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A4C);
+ rtl_clear_eth_phy_bit(hw, 0x15, (BIT_14 | BIT_13));
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x81B9);
+ rtl_mdio_write(hw, 0x14, 0x2000);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x81D4);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6600);
+ rtl_mdio_write(hw, 0x13, 0x81CB);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x3500);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A80);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x16, 0x000F, 0x0005);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8016);
+ rtl_set_eth_phy_bit(hw, 0x14, BIT_13);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x811E);
+ rtl_mdio_write(hw, 0x14, 0xDECA);
+
+ rtl_mdio_write(hw, 0x13, 0x811C);
+ rtl_mdio_write(hw, 0x14, 0x8008);
+ rtl_mdio_write(hw, 0x13, 0x8118);
+ rtl_mdio_write(hw, 0x14, 0xF8B4);
+ rtl_mdio_write(hw, 0x13, 0x811A);
+ rtl_mdio_write(hw, 0x14, 0x1A04);
+
+ rtl_mdio_write(hw, 0x13, 0x8134);
+ rtl_mdio_write(hw, 0x14, 0xDECA);
+ rtl_mdio_write(hw, 0x13, 0x8132);
+ rtl_mdio_write(hw, 0x14, 0xA008);
+ rtl_mdio_write(hw, 0x13, 0x812E);
+ rtl_mdio_write(hw, 0x14, 0x00B5);
+ rtl_mdio_write(hw, 0x13, 0x8130);
+ rtl_mdio_write(hw, 0x14, 0x1A04);
+
+ rtl_mdio_write(hw, 0x13, 0x8112);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7300);
+ rtl_mdio_write(hw, 0x13, 0x8106);
+ rtl_mdio_write(hw, 0x14, 0xA209);
+ rtl_mdio_write(hw, 0x13, 0x8108);
+ rtl_mdio_write(hw, 0x14, 0x13B0);
+ rtl_mdio_write(hw, 0x13, 0x8103);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0xB800);
+ rtl_mdio_write(hw, 0x13, 0x8105);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x0A00);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x87EB);
+ rtl_mdio_write(hw, 0x14, 0x0018);
+ rtl_mdio_write(hw, 0x13, 0x87EB);
+ rtl_mdio_write(hw, 0x14, 0x0018);
+ rtl_mdio_write(hw, 0x13, 0x87ED);
+ rtl_mdio_write(hw, 0x14, 0x0733);
+ rtl_mdio_write(hw, 0x13, 0x87EF);
+ rtl_mdio_write(hw, 0x14, 0x08DC);
+ rtl_mdio_write(hw, 0x13, 0x87F1);
+ rtl_mdio_write(hw, 0x14, 0x08DF);
+ rtl_mdio_write(hw, 0x13, 0x87F3);
+ rtl_mdio_write(hw, 0x14, 0x0C79);
+ rtl_mdio_write(hw, 0x13, 0x87F5);
+ rtl_mdio_write(hw, 0x14, 0x0D93);
+ rtl_mdio_write(hw, 0x13, 0x87F9);
+ rtl_mdio_write(hw, 0x14, 0x0010);
+ rtl_mdio_write(hw, 0x13, 0x87FB);
+ rtl_mdio_write(hw, 0x14, 0x0800);
+ rtl_mdio_write(hw, 0x13, 0x8015);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x7000, 0x7000);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8111);
+ rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7C00);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+}
+
+void
+hw_phy_config_8168h(struct rtl_hw *hw)
+{
+ if (hw->mcfg == CFG_METHOD_29)
+ hw_phy_config_8168h_1(hw);
+ else if (hw->mcfg == CFG_METHOD_30 || hw->mcfg == CFG_METHOD_37)
+ hw_phy_config_8168h_2(hw);
+ else if (hw->mcfg == CFG_METHOD_35)
+ hw_phy_config_8168h_3(hw);
+
+ /* Enable EthPhyPPSW */
+ if (hw->mcfg != CFG_METHOD_37) {
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ rtl_clear_eth_phy_bit(hw, 0x11, BIT_7);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ }
+}
+
+void
+hw_config_8168h(struct rtl_hw *hw)
+{
+ u32 csi_tmp;
+ u16 mac_ocp_data;
+
+ /* Share fifo rx params */
+ rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
+
+ /* Adjust the trx fifo*/
+ rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
+ rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
+
+ /* Disable share fifo */
+ RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
+
+ if (hw->mcfg == CFG_METHOD_35 || hw->mcfg == CFG_METHOD_36)
+ rtl8168_set_mcu_ocp_bit(hw, 0xD438, (BIT_1 | BIT_0));
+
+ /* EPHY err mask */
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE0D6);
+ mac_ocp_data &= ~(BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 |
+ BIT_2 | BIT_1 | BIT_0);
+ mac_ocp_data |= 0x17F;
+ rtl_mac_ocp_write(hw, 0xE0D6, mac_ocp_data);
+
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
+
+ /* EEE led enable */
+ RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
+
+ RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En);
+
+ csi_tmp = rtl_eri_read(hw, 0xDC, 4, ERIAR_ExGMAC);
+ csi_tmp |= (BIT_2 | BIT_3 | BIT_4);
+ rtl_eri_write(hw, 0xDC, 4, csi_tmp, ERIAR_ExGMAC);
+
+ /* CRC wake disable */
+ rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
+ rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
+
+ csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_12;
+ rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
+
+ csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_2;
+ rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ if (hw->mcfg != CFG_METHOD_37) {
+ csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC);
+ csi_tmp |= BIT_1;
+ rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
+ }
+}
+
+const struct rtl_hw_ops rtl8168h_ops = {
+ .hw_config = hw_config_8168h,
+ .hw_init_rxcfg = hw_init_rxcfg_8168h,
+ .hw_ephy_config = hw_ephy_config_8168h,
+ .hw_phy_config = hw_phy_config_8168h,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8168h,
+ .hw_phy_mcu_config = hw_phy_mcu_config_8168h,
+};
diff --git a/drivers/net/r8169/base/rtl8168h.h b/drivers/net/r8169/base/rtl8168h.h
new file mode 100644
index 0000000000..51612d5fc3
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168h.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef _RTL8168H_H_
+#define _RTL8168H_H_
+
+#include "../r8169_compat.h"
+
+extern const struct rtl_hw_ops rtl8168h_ops;
+extern const struct rtl_hw_ops rtl8168m_ops;
+
+void hw_mac_mcu_config_8168h(struct rtl_hw *hw);
+void hw_phy_mcu_config_8168h(struct rtl_hw *hw);
+
+void hw_init_rxcfg_8168h(struct rtl_hw *hw);
+void hw_ephy_config_8168h(struct rtl_hw *hw);
+void hw_phy_config_8168h(struct rtl_hw *hw);
+void hw_config_8168h(struct rtl_hw *hw);
+
+#endif
diff --git a/drivers/net/r8169/base/rtl8168h_mcu.c b/drivers/net/r8169/base/rtl8168h_mcu.c
new file mode 100644
index 0000000000..445e6ab22e
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168h_mcu.c
@@ -0,0 +1,1186 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168h.h"
+
+/* For RTL8168H, CFG_METHOD_29,30,35,36 */
+
+/* ------------------------------------MAC 8168H------------------------------------- */
+
+static void
+rtl8168_set_mac_mcu_8168h_1(struct rtl_hw *hw)
+{
+ rtl_hw_disable_mac_mcu_bps(hw);
+}
+
+static void
+rtl8168_set_mac_mcu_8168h_2(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168h_1[] = {
+ 0xE008, 0xE00F, 0xE011, 0xE047, 0xE049, 0xE073, 0xE075, 0xE07A, 0xC707,
+ 0x1D00, 0x8DE2, 0x48C1, 0xC502, 0xBD00, 0x00E4, 0xE0C0, 0xC502, 0xBD00,
+ 0x0216, 0xC634, 0x75C0, 0x49D3, 0xF027, 0xC631, 0x75C0, 0x49D3, 0xF123,
+ 0xC627, 0x75C0, 0xB405, 0xC525, 0x9DC0, 0xC621, 0x75C8, 0x49D5, 0xF00A,
+ 0x49D6, 0xF008, 0x49D7, 0xF006, 0x49D8, 0xF004, 0x75D2, 0x49D9, 0xF111,
+ 0xC517, 0x9DC8, 0xC516, 0x9DD2, 0xC618, 0x75C0, 0x49D4, 0xF003, 0x49D0,
+ 0xF104, 0xC60A, 0xC50E, 0x9DC0, 0xB005, 0xC607, 0x9DC0, 0xB007, 0xC602,
+ 0xBE00, 0x1A06, 0xB400, 0xE86C, 0xA000, 0x01E1, 0x0200, 0x9200, 0xE84C,
+ 0xE004, 0xE908, 0xC502, 0xBD00, 0x0B58, 0xB407, 0xB404, 0x2195, 0x25BD,
+ 0x9BE0, 0x1C1C, 0x484F, 0x9CE2, 0x72E2, 0x49AE, 0xF1FE, 0x0B00, 0xF116,
+ 0xC71C, 0xC419, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE,
+ 0xC412, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE, 0xC70C,
+ 0x74F8, 0x48C3, 0x8CF8, 0xB004, 0xB007, 0xC502, 0xBD00, 0x0F24, 0x0481,
+ 0x0C81, 0xDE24, 0xE000, 0xC602, 0xBE00, 0x0CA4, 0x48C1, 0x48C2, 0x9C46,
+ 0xC402, 0xBC00, 0x0578, 0xC602, 0xBE00, 0x0000
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168h_1); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168h_1[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC28, 0x00E2);
+ rtl_mac_ocp_write(hw, 0xFC2A, 0x0210);
+ rtl_mac_ocp_write(hw, 0xFC2C, 0x1A04);
+ rtl_mac_ocp_write(hw, 0xFC2E, 0x0B26);
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0F02);
+ rtl_mac_ocp_write(hw, 0xFC32, 0x0CA0);
+
+ rtl_mac_ocp_write(hw, 0xFC38, 0x003F);
+}
+
+static void
+rtl8168_set_mac_mcu_8168h_3(struct rtl_hw *hw)
+{
+ u16 i;
+ static const u16 mcu_patch_code_8168h_3[] = {
+ 0xE008, 0xE00A, 0xE00C, 0xE00E, 0xE010, 0xE03E, 0xE040, 0xE069, 0xC602,
+ 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC002, 0xB800, 0x0000, 0xC602,
+ 0xBE00, 0x0000, 0xC72B, 0x76E2, 0x49EE, 0xF1FD, 0x1E00, 0x9EE0, 0x1E1C,
+ 0x9EE2, 0x76E2, 0x49EE, 0xF1FE, 0xC621, 0x9EE0, 0x1E1D, 0x486F, 0x9EE2,
+ 0x76E2, 0x49EE, 0xF1FE, 0xC71A, 0x76E0, 0x48E8, 0x48E9, 0x48EA, 0x48EB,
+ 0x48EC, 0x9EE0, 0xC70D, 0xC60D, 0x9EF4, 0xC60C, 0x9EF6, 0xC70E, 0x76E0,
+ 0x4863, 0x9EE0, 0xB007, 0xC602, 0xBE00, 0x0ACC, 0xE000, 0x03BF, 0x07FF,
+ 0xDE24, 0x3200, 0xE096, 0xD438, 0xC602, 0xBE00, 0x0000, 0x8EE6, 0xC726,
+ 0x76E2, 0x49EE, 0xF1FD, 0x1E00, 0x8EE0, 0x1E1C, 0x8EE2, 0x76E2, 0x49EE,
+ 0xF1FE, 0xC61C, 0x8EE0, 0x1E1D, 0x486F, 0x8EE2, 0x76E2, 0x49EE, 0xF1FE,
+ 0xC715, 0x76E0, 0x48E8, 0x48E9, 0x48EA, 0x48EB, 0x48EC, 0x9EE0, 0xC708,
+ 0xC608, 0x9EF4, 0xC607, 0x9EF6, 0xC602, 0xBE00, 0x0ABE, 0xE000, 0x03BF,
+ 0x07FF, 0xDE24, 0x3200, 0xE096, 0xC602, 0xBE00, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x6838, 0x0A17, 0x0613, 0x0D26
+ };
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168h_3); i++)
+ rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168h_3[i]);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC30, 0x0ACA);
+
+ rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_3);
+
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0010);
+}
+
+static void
+rtl8168_set_mac_mcu_8168h_4(struct rtl_hw *hw)
+{
+ rtl_hw_disable_mac_mcu_bps(hw);
+}
+
+/* ------------------------------------PHY 8168H------------------------------------- */
+
+static void
+rtl8168_set_phy_mcu_8168h_1(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8028);
+ rtl_mdio_write(hw, 0x14, 0x6200);
+ rtl_mdio_write(hw, 0x13, 0xB82E);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0290);
+ rtl_mdio_write(hw, 0x13, 0xA012);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA014);
+ rtl_mdio_write(hw, 0x14, 0x2c04);
+ rtl_mdio_write(hw, 0x14, 0x2c10);
+ rtl_mdio_write(hw, 0x14, 0x2c10);
+ rtl_mdio_write(hw, 0x14, 0x2c10);
+ rtl_mdio_write(hw, 0x14, 0xa210);
+ rtl_mdio_write(hw, 0x14, 0xa101);
+ rtl_mdio_write(hw, 0x14, 0xce10);
+ rtl_mdio_write(hw, 0x14, 0xe070);
+ rtl_mdio_write(hw, 0x14, 0x0f40);
+ rtl_mdio_write(hw, 0x14, 0xaf01);
+ rtl_mdio_write(hw, 0x14, 0x8f01);
+ rtl_mdio_write(hw, 0x14, 0x183e);
+ rtl_mdio_write(hw, 0x14, 0x8e10);
+ rtl_mdio_write(hw, 0x14, 0x8101);
+ rtl_mdio_write(hw, 0x14, 0x8210);
+ rtl_mdio_write(hw, 0x14, 0x28da);
+ rtl_mdio_write(hw, 0x13, 0xA01A);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA006);
+ rtl_mdio_write(hw, 0x14, 0x0017);
+ rtl_mdio_write(hw, 0x13, 0xA004);
+ rtl_mdio_write(hw, 0x14, 0x0015);
+ rtl_mdio_write(hw, 0x13, 0xA002);
+ rtl_mdio_write(hw, 0x14, 0x0013);
+ rtl_mdio_write(hw, 0x13, 0xA000);
+ rtl_mdio_write(hw, 0x14, 0x18d1);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x17);
+ gphy_val &= ~BIT_0;
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8028);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+static void
+rtl8168_set_phy_mcu_8168h_2(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8028);
+ rtl_mdio_write(hw, 0x14, 0x6201);
+ rtl_mdio_write(hw, 0x13, 0xB82E);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0290);
+ rtl_mdio_write(hw, 0x13, 0xA012);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA014);
+ rtl_mdio_write(hw, 0x14, 0x2c04);
+ rtl_mdio_write(hw, 0x14, 0x2c09);
+ rtl_mdio_write(hw, 0x14, 0x2c0d);
+ rtl_mdio_write(hw, 0x14, 0x2c12);
+ rtl_mdio_write(hw, 0x14, 0xad01);
+ rtl_mdio_write(hw, 0x14, 0xad01);
+ rtl_mdio_write(hw, 0x14, 0xad01);
+ rtl_mdio_write(hw, 0x14, 0xad01);
+ rtl_mdio_write(hw, 0x14, 0x236c);
+ rtl_mdio_write(hw, 0x14, 0xd03c);
+ rtl_mdio_write(hw, 0x14, 0xd1aa);
+ rtl_mdio_write(hw, 0x14, 0xc010);
+ rtl_mdio_write(hw, 0x14, 0x2745);
+ rtl_mdio_write(hw, 0x14, 0x33de);
+ rtl_mdio_write(hw, 0x14, 0x16ba);
+ rtl_mdio_write(hw, 0x14, 0x31ee);
+ rtl_mdio_write(hw, 0x14, 0x2712);
+ rtl_mdio_write(hw, 0x14, 0x274e);
+ rtl_mdio_write(hw, 0x14, 0xc2bb);
+ rtl_mdio_write(hw, 0x14, 0xd500);
+ rtl_mdio_write(hw, 0x14, 0xc426);
+ rtl_mdio_write(hw, 0x14, 0xd01d);
+ rtl_mdio_write(hw, 0x14, 0xd1c3);
+ rtl_mdio_write(hw, 0x14, 0x401c);
+ rtl_mdio_write(hw, 0x14, 0xd501);
+ rtl_mdio_write(hw, 0x14, 0xc2b3);
+ rtl_mdio_write(hw, 0x14, 0xd500);
+ rtl_mdio_write(hw, 0x14, 0xd00b);
+ rtl_mdio_write(hw, 0x14, 0xd1c3);
+ rtl_mdio_write(hw, 0x14, 0x401c);
+ rtl_mdio_write(hw, 0x14, 0x241a);
+ rtl_mdio_write(hw, 0x13, 0xA01A);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA006);
+ rtl_mdio_write(hw, 0x14, 0x0414);
+ rtl_mdio_write(hw, 0x13, 0xA004);
+ rtl_mdio_write(hw, 0x14, 0x074c);
+ rtl_mdio_write(hw, 0x13, 0xA002);
+ rtl_mdio_write(hw, 0x14, 0x0744);
+ rtl_mdio_write(hw, 0x13, 0xA000);
+ rtl_mdio_write(hw, 0x14, 0xf36b);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0210);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8323);
+ rtl_mdio_write(hw, 0x14, 0xaf83);
+ rtl_mdio_write(hw, 0x14, 0x2faf);
+ rtl_mdio_write(hw, 0x14, 0x853d);
+ rtl_mdio_write(hw, 0x14, 0xaf85);
+ rtl_mdio_write(hw, 0x14, 0x3daf);
+ rtl_mdio_write(hw, 0x14, 0x853d);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x45ad);
+ rtl_mdio_write(hw, 0x14, 0x2052);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7ae3);
+ rtl_mdio_write(hw, 0x14, 0x85fe);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f6);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7a1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fa);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7be3);
+ rtl_mdio_write(hw, 0x14, 0x85fe);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f7);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7b1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fb);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7ce3);
+ rtl_mdio_write(hw, 0x14, 0x85fe);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f8);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7c1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fc);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7de3);
+ rtl_mdio_write(hw, 0x14, 0x85fe);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f9);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7d1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fd);
+ rtl_mdio_write(hw, 0x14, 0xae50);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7ee3);
+ rtl_mdio_write(hw, 0x14, 0x85ff);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f6);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7e1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fa);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7fe3);
+ rtl_mdio_write(hw, 0x14, 0x85ff);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f7);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x7f1b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fb);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x80e3);
+ rtl_mdio_write(hw, 0x14, 0x85ff);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f8);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x801b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fc);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x81e3);
+ rtl_mdio_write(hw, 0x14, 0x85ff);
+ rtl_mdio_write(hw, 0x14, 0x1a03);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x85f9);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x811b);
+ rtl_mdio_write(hw, 0x14, 0x03e4);
+ rtl_mdio_write(hw, 0x14, 0x85fd);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf6ad);
+ rtl_mdio_write(hw, 0x14, 0x2404);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xf610);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf7ad);
+ rtl_mdio_write(hw, 0x14, 0x2404);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xf710);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf8ad);
+ rtl_mdio_write(hw, 0x14, 0x2404);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xf810);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf9ad);
+ rtl_mdio_write(hw, 0x14, 0x2404);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xf910);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfaad);
+ rtl_mdio_write(hw, 0x14, 0x2704);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xfa00);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfbad);
+ rtl_mdio_write(hw, 0x14, 0x2704);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xfb00);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfcad);
+ rtl_mdio_write(hw, 0x14, 0x2704);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xfc00);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfdad);
+ rtl_mdio_write(hw, 0x14, 0x2704);
+ rtl_mdio_write(hw, 0x14, 0xee85);
+ rtl_mdio_write(hw, 0x14, 0xfd00);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44ad);
+ rtl_mdio_write(hw, 0x14, 0x203f);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf6e4);
+ rtl_mdio_write(hw, 0x14, 0x8288);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfae4);
+ rtl_mdio_write(hw, 0x14, 0x8289);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x440d);
+ rtl_mdio_write(hw, 0x14, 0x0458);
+ rtl_mdio_write(hw, 0x14, 0x01bf);
+ rtl_mdio_write(hw, 0x14, 0x8264);
+ rtl_mdio_write(hw, 0x14, 0x0215);
+ rtl_mdio_write(hw, 0x14, 0x38bf);
+ rtl_mdio_write(hw, 0x14, 0x824e);
+ rtl_mdio_write(hw, 0x14, 0x0213);
+ rtl_mdio_write(hw, 0x14, 0x06a0);
+ rtl_mdio_write(hw, 0x14, 0x010f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44f6);
+ rtl_mdio_write(hw, 0x14, 0x20e4);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x580f);
+ rtl_mdio_write(hw, 0x14, 0xe582);
+ rtl_mdio_write(hw, 0x14, 0x5aae);
+ rtl_mdio_write(hw, 0x14, 0x0ebf);
+ rtl_mdio_write(hw, 0x14, 0x825e);
+ rtl_mdio_write(hw, 0x14, 0xe382);
+ rtl_mdio_write(hw, 0x14, 0x44f7);
+ rtl_mdio_write(hw, 0x14, 0x3ce7);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x0212);
+ rtl_mdio_write(hw, 0x14, 0xf0ad);
+ rtl_mdio_write(hw, 0x14, 0x213f);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf7e4);
+ rtl_mdio_write(hw, 0x14, 0x8288);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfbe4);
+ rtl_mdio_write(hw, 0x14, 0x8289);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x440d);
+ rtl_mdio_write(hw, 0x14, 0x0558);
+ rtl_mdio_write(hw, 0x14, 0x01bf);
+ rtl_mdio_write(hw, 0x14, 0x826b);
+ rtl_mdio_write(hw, 0x14, 0x0215);
+ rtl_mdio_write(hw, 0x14, 0x38bf);
+ rtl_mdio_write(hw, 0x14, 0x824f);
+ rtl_mdio_write(hw, 0x14, 0x0213);
+ rtl_mdio_write(hw, 0x14, 0x06a0);
+ rtl_mdio_write(hw, 0x14, 0x010f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44f6);
+ rtl_mdio_write(hw, 0x14, 0x21e4);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x580f);
+ rtl_mdio_write(hw, 0x14, 0xe582);
+ rtl_mdio_write(hw, 0x14, 0x5bae);
+ rtl_mdio_write(hw, 0x14, 0x0ebf);
+ rtl_mdio_write(hw, 0x14, 0x8265);
+ rtl_mdio_write(hw, 0x14, 0xe382);
+ rtl_mdio_write(hw, 0x14, 0x44f7);
+ rtl_mdio_write(hw, 0x14, 0x3de7);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x0212);
+ rtl_mdio_write(hw, 0x14, 0xf0ad);
+ rtl_mdio_write(hw, 0x14, 0x223f);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf8e4);
+ rtl_mdio_write(hw, 0x14, 0x8288);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfce4);
+ rtl_mdio_write(hw, 0x14, 0x8289);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x440d);
+ rtl_mdio_write(hw, 0x14, 0x0658);
+ rtl_mdio_write(hw, 0x14, 0x01bf);
+ rtl_mdio_write(hw, 0x14, 0x8272);
+ rtl_mdio_write(hw, 0x14, 0x0215);
+ rtl_mdio_write(hw, 0x14, 0x38bf);
+ rtl_mdio_write(hw, 0x14, 0x8250);
+ rtl_mdio_write(hw, 0x14, 0x0213);
+ rtl_mdio_write(hw, 0x14, 0x06a0);
+ rtl_mdio_write(hw, 0x14, 0x010f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44f6);
+ rtl_mdio_write(hw, 0x14, 0x22e4);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x580f);
+ rtl_mdio_write(hw, 0x14, 0xe582);
+ rtl_mdio_write(hw, 0x14, 0x5cae);
+ rtl_mdio_write(hw, 0x14, 0x0ebf);
+ rtl_mdio_write(hw, 0x14, 0x826c);
+ rtl_mdio_write(hw, 0x14, 0xe382);
+ rtl_mdio_write(hw, 0x14, 0x44f7);
+ rtl_mdio_write(hw, 0x14, 0x3ee7);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x0212);
+ rtl_mdio_write(hw, 0x14, 0xf0ad);
+ rtl_mdio_write(hw, 0x14, 0x233f);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xf9e4);
+ rtl_mdio_write(hw, 0x14, 0x8288);
+ rtl_mdio_write(hw, 0x14, 0xe085);
+ rtl_mdio_write(hw, 0x14, 0xfde4);
+ rtl_mdio_write(hw, 0x14, 0x8289);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x440d);
+ rtl_mdio_write(hw, 0x14, 0x0758);
+ rtl_mdio_write(hw, 0x14, 0x01bf);
+ rtl_mdio_write(hw, 0x14, 0x8279);
+ rtl_mdio_write(hw, 0x14, 0x0215);
+ rtl_mdio_write(hw, 0x14, 0x38bf);
+ rtl_mdio_write(hw, 0x14, 0x8251);
+ rtl_mdio_write(hw, 0x14, 0x0213);
+ rtl_mdio_write(hw, 0x14, 0x06a0);
+ rtl_mdio_write(hw, 0x14, 0x010f);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0x44f6);
+ rtl_mdio_write(hw, 0x14, 0x23e4);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x580f);
+ rtl_mdio_write(hw, 0x14, 0xe582);
+ rtl_mdio_write(hw, 0x14, 0x5dae);
+ rtl_mdio_write(hw, 0x14, 0x0ebf);
+ rtl_mdio_write(hw, 0x14, 0x8273);
+ rtl_mdio_write(hw, 0x14, 0xe382);
+ rtl_mdio_write(hw, 0x14, 0x44f7);
+ rtl_mdio_write(hw, 0x14, 0x3fe7);
+ rtl_mdio_write(hw, 0x14, 0x8244);
+ rtl_mdio_write(hw, 0x14, 0x0212);
+ rtl_mdio_write(hw, 0x14, 0xf0ee);
+ rtl_mdio_write(hw, 0x14, 0x8288);
+ rtl_mdio_write(hw, 0x14, 0x10ee);
+ rtl_mdio_write(hw, 0x14, 0x8289);
+ rtl_mdio_write(hw, 0x14, 0x00af);
+ rtl_mdio_write(hw, 0x14, 0x14aa);
+ rtl_mdio_write(hw, 0x13, 0xb818);
+ rtl_mdio_write(hw, 0x14, 0x13cf);
+ rtl_mdio_write(hw, 0x13, 0xb81a);
+ rtl_mdio_write(hw, 0x14, 0xfffd);
+ rtl_mdio_write(hw, 0x13, 0xb81c);
+ rtl_mdio_write(hw, 0x14, 0xfffd);
+ rtl_mdio_write(hw, 0x13, 0xb81e);
+ rtl_mdio_write(hw, 0x14, 0xfffd);
+ rtl_mdio_write(hw, 0x13, 0xb832);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x17);
+ gphy_val &= ~BIT_0;
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8028);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+static void
+rtl8168_set_phy_mcu_8168h_3(struct rtl_hw *hw)
+{
+ unsigned int gphy_val;
+
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8042);
+ rtl_mdio_write(hw, 0x14, 0x3800);
+ rtl_mdio_write(hw, 0x13, 0xB82E);
+ rtl_mdio_write(hw, 0x14, 0x0001);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0090);
+ rtl_mdio_write(hw, 0x13, 0xA016);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA012);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x13, 0xA014);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8010);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8014);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x8022);
+ rtl_mdio_write(hw, 0x14, 0x2b5d);
+ rtl_mdio_write(hw, 0x14, 0x0c68);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x0b3c);
+ rtl_mdio_write(hw, 0x14, 0xc2bb);
+ rtl_mdio_write(hw, 0x14, 0xd500);
+ rtl_mdio_write(hw, 0x14, 0xc426);
+ rtl_mdio_write(hw, 0x14, 0xd01d);
+ rtl_mdio_write(hw, 0x14, 0xd1c3);
+ rtl_mdio_write(hw, 0x14, 0x401c);
+ rtl_mdio_write(hw, 0x14, 0xd501);
+ rtl_mdio_write(hw, 0x14, 0xc2b3);
+ rtl_mdio_write(hw, 0x14, 0xd500);
+ rtl_mdio_write(hw, 0x14, 0xd00b);
+ rtl_mdio_write(hw, 0x14, 0xd1c3);
+ rtl_mdio_write(hw, 0x14, 0x401c);
+ rtl_mdio_write(hw, 0x14, 0x1800);
+ rtl_mdio_write(hw, 0x14, 0x0478);
+ rtl_mdio_write(hw, 0x13, 0xA026);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA024);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA022);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA020);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA006);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA004);
+ rtl_mdio_write(hw, 0x14, 0x0fff);
+ rtl_mdio_write(hw, 0x13, 0xA002);
+ rtl_mdio_write(hw, 0x14, 0x0472);
+ rtl_mdio_write(hw, 0x13, 0xA000);
+ rtl_mdio_write(hw, 0x14, 0x0b3a);
+ rtl_mdio_write(hw, 0x13, 0xA008);
+ rtl_mdio_write(hw, 0x14, 0x0300);
+ rtl_mdio_write(hw, 0x13, 0xB820);
+ rtl_mdio_write(hw, 0x14, 0x0010);
+
+ rtl_mdio_write(hw, 0x13, 0x83f3);
+ rtl_mdio_write(hw, 0x14, 0xaf84);
+ rtl_mdio_write(hw, 0x14, 0x0baf);
+ rtl_mdio_write(hw, 0x14, 0x8466);
+ rtl_mdio_write(hw, 0x14, 0xaf84);
+ rtl_mdio_write(hw, 0x14, 0xcdaf);
+ rtl_mdio_write(hw, 0x14, 0x873c);
+ rtl_mdio_write(hw, 0x14, 0xaf87);
+ rtl_mdio_write(hw, 0x14, 0x3faf);
+ rtl_mdio_write(hw, 0x14, 0x8760);
+ rtl_mdio_write(hw, 0x14, 0xaf87);
+ rtl_mdio_write(hw, 0x14, 0x60af);
+ rtl_mdio_write(hw, 0x14, 0x8760);
+ rtl_mdio_write(hw, 0x14, 0xef79);
+ rtl_mdio_write(hw, 0x14, 0xfb89);
+ rtl_mdio_write(hw, 0x14, 0xe987);
+ rtl_mdio_write(hw, 0x14, 0xffd7);
+ rtl_mdio_write(hw, 0x14, 0x0017);
+ rtl_mdio_write(hw, 0x14, 0xd400);
+ rtl_mdio_write(hw, 0x14, 0x051c);
+ rtl_mdio_write(hw, 0x14, 0x421a);
+ rtl_mdio_write(hw, 0x14, 0x741b);
+ rtl_mdio_write(hw, 0x14, 0x97e9);
+ rtl_mdio_write(hw, 0x14, 0x87fe);
+ rtl_mdio_write(hw, 0x14, 0xffef);
+ rtl_mdio_write(hw, 0x14, 0x97e0);
+ rtl_mdio_write(hw, 0x14, 0x82aa);
+ rtl_mdio_write(hw, 0x14, 0xa000);
+ rtl_mdio_write(hw, 0x14, 0x08ef);
+ rtl_mdio_write(hw, 0x14, 0x46dc);
+ rtl_mdio_write(hw, 0x14, 0x19dd);
+ rtl_mdio_write(hw, 0x14, 0xaf1a);
+ rtl_mdio_write(hw, 0x14, 0x37a0);
+ rtl_mdio_write(hw, 0x14, 0x012d);
+ rtl_mdio_write(hw, 0x14, 0xe082);
+ rtl_mdio_write(hw, 0x14, 0xa7ac);
+ rtl_mdio_write(hw, 0x14, 0x2013);
+ rtl_mdio_write(hw, 0x14, 0xe087);
+ rtl_mdio_write(hw, 0x14, 0xffe1);
+ rtl_mdio_write(hw, 0x14, 0x87fe);
+ rtl_mdio_write(hw, 0x14, 0xac27);
+ rtl_mdio_write(hw, 0x14, 0x05a1);
+ rtl_mdio_write(hw, 0x14, 0x0807);
+ rtl_mdio_write(hw, 0x14, 0xae0f);
+ rtl_mdio_write(hw, 0x14, 0xa107);
+ rtl_mdio_write(hw, 0x14, 0x02ae);
+ rtl_mdio_write(hw, 0x14, 0x0aef);
+ rtl_mdio_write(hw, 0x14, 0x4619);
+ rtl_mdio_write(hw, 0x14, 0x19dc);
+ rtl_mdio_write(hw, 0x14, 0x19dd);
+ rtl_mdio_write(hw, 0x14, 0xaf1a);
+ rtl_mdio_write(hw, 0x14, 0x37d8);
+ rtl_mdio_write(hw, 0x14, 0x19d9);
+ rtl_mdio_write(hw, 0x14, 0x19dc);
+ rtl_mdio_write(hw, 0x14, 0x19dd);
+ rtl_mdio_write(hw, 0x14, 0xaf1a);
+ rtl_mdio_write(hw, 0x14, 0x3719);
+ rtl_mdio_write(hw, 0x14, 0x19ae);
+ rtl_mdio_write(hw, 0x14, 0xcfbf);
+ rtl_mdio_write(hw, 0x14, 0x878a);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdc3c);
+ rtl_mdio_write(hw, 0x14, 0x0005);
+ rtl_mdio_write(hw, 0x14, 0xaaf5);
+ rtl_mdio_write(hw, 0x14, 0x0249);
+ rtl_mdio_write(hw, 0x14, 0xcaef);
+ rtl_mdio_write(hw, 0x14, 0x67d7);
+ rtl_mdio_write(hw, 0x14, 0x0014);
+ rtl_mdio_write(hw, 0x14, 0x0249);
+ rtl_mdio_write(hw, 0x14, 0xe5ad);
+ rtl_mdio_write(hw, 0x14, 0x50f7);
+ rtl_mdio_write(hw, 0x14, 0xd400);
+ rtl_mdio_write(hw, 0x14, 0x01bf);
+ rtl_mdio_write(hw, 0x14, 0x46a7);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0x98bf);
+ rtl_mdio_write(hw, 0x14, 0x465c);
+ rtl_mdio_write(hw, 0x14, 0x024a);
+ rtl_mdio_write(hw, 0x14, 0x5fd4);
+ rtl_mdio_write(hw, 0x14, 0x0003);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9c02);
+ rtl_mdio_write(hw, 0x14, 0x4498);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9902);
+ rtl_mdio_write(hw, 0x14, 0x4a5f);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x8d02);
+ rtl_mdio_write(hw, 0x14, 0x4a5f);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9002);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0xad28);
+ rtl_mdio_write(hw, 0x14, 0xf7bf);
+ rtl_mdio_write(hw, 0x14, 0x8796);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcad);
+ rtl_mdio_write(hw, 0x14, 0x28f7);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9302);
+ rtl_mdio_write(hw, 0x14, 0x4a5f);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9302);
+ rtl_mdio_write(hw, 0x14, 0x4a56);
+ rtl_mdio_write(hw, 0x14, 0xbf46);
+ rtl_mdio_write(hw, 0x14, 0x5c02);
+ rtl_mdio_write(hw, 0x14, 0x4a56);
+ rtl_mdio_write(hw, 0x14, 0xbf45);
+ rtl_mdio_write(hw, 0x14, 0x21af);
+ rtl_mdio_write(hw, 0x14, 0x020e);
+ rtl_mdio_write(hw, 0x14, 0xee82);
+ rtl_mdio_write(hw, 0x14, 0x5000);
+ rtl_mdio_write(hw, 0x14, 0x0284);
+ rtl_mdio_write(hw, 0x14, 0xdd02);
+ rtl_mdio_write(hw, 0x14, 0x8521);
+ rtl_mdio_write(hw, 0x14, 0x0285);
+ rtl_mdio_write(hw, 0x14, 0x36af);
+ rtl_mdio_write(hw, 0x14, 0x03d2);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfafb);
+ rtl_mdio_write(hw, 0x14, 0xef59);
+ rtl_mdio_write(hw, 0x14, 0xbf45);
+ rtl_mdio_write(hw, 0x14, 0x3002);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0x3c00);
+ rtl_mdio_write(hw, 0x14, 0x03aa);
+ rtl_mdio_write(hw, 0x14, 0x2cbf);
+ rtl_mdio_write(hw, 0x14, 0x8790);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcad);
+ rtl_mdio_write(hw, 0x14, 0x2823);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x9602);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0xad28);
+ rtl_mdio_write(hw, 0x14, 0x1a02);
+ rtl_mdio_write(hw, 0x14, 0x49ca);
+ rtl_mdio_write(hw, 0x14, 0xef67);
+ rtl_mdio_write(hw, 0x14, 0xd700);
+ rtl_mdio_write(hw, 0x14, 0x0202);
+ rtl_mdio_write(hw, 0x14, 0x49e5);
+ rtl_mdio_write(hw, 0x14, 0xad50);
+ rtl_mdio_write(hw, 0x14, 0xf7bf);
+ rtl_mdio_write(hw, 0x14, 0x8793);
+ rtl_mdio_write(hw, 0x14, 0x024a);
+ rtl_mdio_write(hw, 0x14, 0x5fbf);
+ rtl_mdio_write(hw, 0x14, 0x8793);
+ rtl_mdio_write(hw, 0x14, 0x024a);
+ rtl_mdio_write(hw, 0x14, 0x56ef);
+ rtl_mdio_write(hw, 0x14, 0x95ff);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xe080);
+ rtl_mdio_write(hw, 0x14, 0x15ad);
+ rtl_mdio_write(hw, 0x14, 0x2406);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x8702);
+ rtl_mdio_write(hw, 0x14, 0x4a56);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xe087);
+ rtl_mdio_write(hw, 0x14, 0xf9e1);
+ rtl_mdio_write(hw, 0x14, 0x87fa);
+ rtl_mdio_write(hw, 0x14, 0x1b10);
+ rtl_mdio_write(hw, 0x14, 0x9f1e);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xf900);
+ rtl_mdio_write(hw, 0x14, 0xe080);
+ rtl_mdio_write(hw, 0x14, 0x15ac);
+ rtl_mdio_write(hw, 0x14, 0x2606);
+ rtl_mdio_write(hw, 0x14, 0xee87);
+ rtl_mdio_write(hw, 0x14, 0xf700);
+ rtl_mdio_write(hw, 0x14, 0xae12);
+ rtl_mdio_write(hw, 0x14, 0x0286);
+ rtl_mdio_write(hw, 0x14, 0x9d02);
+ rtl_mdio_write(hw, 0x14, 0x8565);
+ rtl_mdio_write(hw, 0x14, 0x0285);
+ rtl_mdio_write(hw, 0x14, 0x9d02);
+ rtl_mdio_write(hw, 0x14, 0x8660);
+ rtl_mdio_write(hw, 0x14, 0xae04);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x87f9);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69fa);
+ rtl_mdio_write(hw, 0x14, 0xbf45);
+ rtl_mdio_write(hw, 0x14, 0x3002);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0xa103);
+ rtl_mdio_write(hw, 0x14, 0x22e0);
+ rtl_mdio_write(hw, 0x14, 0x87eb);
+ rtl_mdio_write(hw, 0x14, 0xe187);
+ rtl_mdio_write(hw, 0x14, 0xecef);
+ rtl_mdio_write(hw, 0x14, 0x64bf);
+ rtl_mdio_write(hw, 0x14, 0x876f);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdc1b);
+ rtl_mdio_write(hw, 0x14, 0x46aa);
+ rtl_mdio_write(hw, 0x14, 0x0abf);
+ rtl_mdio_write(hw, 0x14, 0x8772);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdc1b);
+ rtl_mdio_write(hw, 0x14, 0x46ab);
+ rtl_mdio_write(hw, 0x14, 0x06bf);
+ rtl_mdio_write(hw, 0x14, 0x876c);
+ rtl_mdio_write(hw, 0x14, 0x024a);
+ rtl_mdio_write(hw, 0x14, 0x5ffe);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xef59);
+ rtl_mdio_write(hw, 0x14, 0xf9bf);
+ rtl_mdio_write(hw, 0x14, 0x4530);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdca1);
+ rtl_mdio_write(hw, 0x14, 0x0310);
+ rtl_mdio_write(hw, 0x14, 0xe087);
+ rtl_mdio_write(hw, 0x14, 0xf7ac);
+ rtl_mdio_write(hw, 0x14, 0x2605);
+ rtl_mdio_write(hw, 0x14, 0x0285);
+ rtl_mdio_write(hw, 0x14, 0xc9ae);
+ rtl_mdio_write(hw, 0x14, 0x0d02);
+ rtl_mdio_write(hw, 0x14, 0x8613);
+ rtl_mdio_write(hw, 0x14, 0xae08);
+ rtl_mdio_write(hw, 0x14, 0xe287);
+ rtl_mdio_write(hw, 0x14, 0xf7f6);
+ rtl_mdio_write(hw, 0x14, 0x36e6);
+ rtl_mdio_write(hw, 0x14, 0x87f7);
+ rtl_mdio_write(hw, 0x14, 0xfdef);
+ rtl_mdio_write(hw, 0x14, 0x95fd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfafb);
+ rtl_mdio_write(hw, 0x14, 0xef79);
+ rtl_mdio_write(hw, 0x14, 0xfbbf);
+ rtl_mdio_write(hw, 0x14, 0x876f);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcef);
+ rtl_mdio_write(hw, 0x14, 0x64e2);
+ rtl_mdio_write(hw, 0x14, 0x87e9);
+ rtl_mdio_write(hw, 0x14, 0xe387);
+ rtl_mdio_write(hw, 0x14, 0xea1b);
+ rtl_mdio_write(hw, 0x14, 0x659e);
+ rtl_mdio_write(hw, 0x14, 0x10e4);
+ rtl_mdio_write(hw, 0x14, 0x87e9);
+ rtl_mdio_write(hw, 0x14, 0xe587);
+ rtl_mdio_write(hw, 0x14, 0xeae2);
+ rtl_mdio_write(hw, 0x14, 0x87f7);
+ rtl_mdio_write(hw, 0x14, 0xf636);
+ rtl_mdio_write(hw, 0x14, 0xe687);
+ rtl_mdio_write(hw, 0x14, 0xf7ae);
+ rtl_mdio_write(hw, 0x14, 0x19e2);
+ rtl_mdio_write(hw, 0x14, 0x87f7);
+ rtl_mdio_write(hw, 0x14, 0xf736);
+ rtl_mdio_write(hw, 0x14, 0xe687);
+ rtl_mdio_write(hw, 0x14, 0xf700);
+ rtl_mdio_write(hw, 0x14, 0x00ae);
+ rtl_mdio_write(hw, 0x14, 0x0200);
+ rtl_mdio_write(hw, 0x14, 0x0002);
+ rtl_mdio_write(hw, 0x14, 0x49ca);
+ rtl_mdio_write(hw, 0x14, 0xef57);
+ rtl_mdio_write(hw, 0x14, 0xe687);
+ rtl_mdio_write(hw, 0x14, 0xe7e7);
+ rtl_mdio_write(hw, 0x14, 0x87e8);
+ rtl_mdio_write(hw, 0x14, 0xffef);
+ rtl_mdio_write(hw, 0x14, 0x97ff);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfafb);
+ rtl_mdio_write(hw, 0x14, 0xef79);
+ rtl_mdio_write(hw, 0x14, 0xfbe2);
+ rtl_mdio_write(hw, 0x14, 0x87e7);
+ rtl_mdio_write(hw, 0x14, 0xe387);
+ rtl_mdio_write(hw, 0x14, 0xe8ef);
+ rtl_mdio_write(hw, 0x14, 0x65e2);
+ rtl_mdio_write(hw, 0x14, 0x87fb);
+ rtl_mdio_write(hw, 0x14, 0xe387);
+ rtl_mdio_write(hw, 0x14, 0xfcef);
+ rtl_mdio_write(hw, 0x14, 0x7502);
+ rtl_mdio_write(hw, 0x14, 0x49e5);
+ rtl_mdio_write(hw, 0x14, 0xac50);
+ rtl_mdio_write(hw, 0x14, 0x1abf);
+ rtl_mdio_write(hw, 0x14, 0x876f);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcef);
+ rtl_mdio_write(hw, 0x14, 0x64e2);
+ rtl_mdio_write(hw, 0x14, 0x87e9);
+ rtl_mdio_write(hw, 0x14, 0xe387);
+ rtl_mdio_write(hw, 0x14, 0xea1b);
+ rtl_mdio_write(hw, 0x14, 0x659e);
+ rtl_mdio_write(hw, 0x14, 0x16e4);
+ rtl_mdio_write(hw, 0x14, 0x87e9);
+ rtl_mdio_write(hw, 0x14, 0xe587);
+ rtl_mdio_write(hw, 0x14, 0xeaae);
+ rtl_mdio_write(hw, 0x14, 0x06bf);
+ rtl_mdio_write(hw, 0x14, 0x876c);
+ rtl_mdio_write(hw, 0x14, 0x024a);
+ rtl_mdio_write(hw, 0x14, 0x5fe2);
+ rtl_mdio_write(hw, 0x14, 0x87f7);
+ rtl_mdio_write(hw, 0x14, 0xf636);
+ rtl_mdio_write(hw, 0x14, 0xe687);
+ rtl_mdio_write(hw, 0x14, 0xf7ff);
+ rtl_mdio_write(hw, 0x14, 0xef97);
+ rtl_mdio_write(hw, 0x14, 0xfffe);
+ rtl_mdio_write(hw, 0x14, 0xfdfc);
+ rtl_mdio_write(hw, 0x14, 0x04f8);
+ rtl_mdio_write(hw, 0x14, 0xf9fa);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x6602);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0xad28);
+ rtl_mdio_write(hw, 0x14, 0x29bf);
+ rtl_mdio_write(hw, 0x14, 0x8763);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcef);
+ rtl_mdio_write(hw, 0x14, 0x54bf);
+ rtl_mdio_write(hw, 0x14, 0x8760);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdcac);
+ rtl_mdio_write(hw, 0x14, 0x290d);
+ rtl_mdio_write(hw, 0x14, 0xac28);
+ rtl_mdio_write(hw, 0x14, 0x05a3);
+ rtl_mdio_write(hw, 0x14, 0x020c);
+ rtl_mdio_write(hw, 0x14, 0xae10);
+ rtl_mdio_write(hw, 0x14, 0xa303);
+ rtl_mdio_write(hw, 0x14, 0x07ae);
+ rtl_mdio_write(hw, 0x14, 0x0ba3);
+ rtl_mdio_write(hw, 0x14, 0x0402);
+ rtl_mdio_write(hw, 0x14, 0xae06);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x6c02);
+ rtl_mdio_write(hw, 0x14, 0x4a5f);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8f9);
+ rtl_mdio_write(hw, 0x14, 0xfafb);
+ rtl_mdio_write(hw, 0x14, 0xef69);
+ rtl_mdio_write(hw, 0x14, 0xfae0);
+ rtl_mdio_write(hw, 0x14, 0x8015);
+ rtl_mdio_write(hw, 0x14, 0xad25);
+ rtl_mdio_write(hw, 0x14, 0x41d2);
+ rtl_mdio_write(hw, 0x14, 0x0002);
+ rtl_mdio_write(hw, 0x14, 0x86f3);
+ rtl_mdio_write(hw, 0x14, 0xe087);
+ rtl_mdio_write(hw, 0x14, 0xebe1);
+ rtl_mdio_write(hw, 0x14, 0x87ec);
+ rtl_mdio_write(hw, 0x14, 0x1b46);
+ rtl_mdio_write(hw, 0x14, 0xab26);
+ rtl_mdio_write(hw, 0x14, 0xd40b);
+ rtl_mdio_write(hw, 0x14, 0xff1b);
+ rtl_mdio_write(hw, 0x14, 0x46aa);
+ rtl_mdio_write(hw, 0x14, 0x1fac);
+ rtl_mdio_write(hw, 0x14, 0x3204);
+ rtl_mdio_write(hw, 0x14, 0xef32);
+ rtl_mdio_write(hw, 0x14, 0xae02);
+ rtl_mdio_write(hw, 0x14, 0xd304);
+ rtl_mdio_write(hw, 0x14, 0x0c31);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0xeb1a);
+ rtl_mdio_write(hw, 0x14, 0x93d8);
+ rtl_mdio_write(hw, 0x14, 0x19d9);
+ rtl_mdio_write(hw, 0x14, 0x1b46);
+ rtl_mdio_write(hw, 0x14, 0xab0e);
+ rtl_mdio_write(hw, 0x14, 0x19d8);
+ rtl_mdio_write(hw, 0x14, 0x19d9);
+ rtl_mdio_write(hw, 0x14, 0x1b46);
+ rtl_mdio_write(hw, 0x14, 0xaa06);
+ rtl_mdio_write(hw, 0x14, 0x12a2);
+ rtl_mdio_write(hw, 0x14, 0x08c9);
+ rtl_mdio_write(hw, 0x14, 0xae06);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x6902);
+ rtl_mdio_write(hw, 0x14, 0x4a5f);
+ rtl_mdio_write(hw, 0x14, 0xfeef);
+ rtl_mdio_write(hw, 0x14, 0x96ff);
+ rtl_mdio_write(hw, 0x14, 0xfefd);
+ rtl_mdio_write(hw, 0x14, 0xfc04);
+ rtl_mdio_write(hw, 0x14, 0xf8fb);
+ rtl_mdio_write(hw, 0x14, 0xef79);
+ rtl_mdio_write(hw, 0x14, 0xa200);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x876f);
+ rtl_mdio_write(hw, 0x14, 0xae33);
+ rtl_mdio_write(hw, 0x14, 0xa201);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x8772);
+ rtl_mdio_write(hw, 0x14, 0xae2b);
+ rtl_mdio_write(hw, 0x14, 0xa202);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x8775);
+ rtl_mdio_write(hw, 0x14, 0xae23);
+ rtl_mdio_write(hw, 0x14, 0xa203);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x8778);
+ rtl_mdio_write(hw, 0x14, 0xae1b);
+ rtl_mdio_write(hw, 0x14, 0xa204);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x877b);
+ rtl_mdio_write(hw, 0x14, 0xae13);
+ rtl_mdio_write(hw, 0x14, 0xa205);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x877e);
+ rtl_mdio_write(hw, 0x14, 0xae0b);
+ rtl_mdio_write(hw, 0x14, 0xa206);
+ rtl_mdio_write(hw, 0x14, 0x05bf);
+ rtl_mdio_write(hw, 0x14, 0x8781);
+ rtl_mdio_write(hw, 0x14, 0xae03);
+ rtl_mdio_write(hw, 0x14, 0xbf87);
+ rtl_mdio_write(hw, 0x14, 0x8402);
+ rtl_mdio_write(hw, 0x14, 0x44dc);
+ rtl_mdio_write(hw, 0x14, 0xef64);
+ rtl_mdio_write(hw, 0x14, 0xef97);
+ rtl_mdio_write(hw, 0x14, 0xfffc);
+ rtl_mdio_write(hw, 0x14, 0x04af);
+ rtl_mdio_write(hw, 0x14, 0x00ed);
+ rtl_mdio_write(hw, 0x14, 0x0220);
+ rtl_mdio_write(hw, 0x14, 0xa5f8);
+ rtl_mdio_write(hw, 0x14, 0xfaef);
+ rtl_mdio_write(hw, 0x14, 0x69bf);
+ rtl_mdio_write(hw, 0x14, 0x4554);
+ rtl_mdio_write(hw, 0x14, 0x0244);
+ rtl_mdio_write(hw, 0x14, 0xdce0);
+ rtl_mdio_write(hw, 0x14, 0x87ff);
+ rtl_mdio_write(hw, 0x14, 0x1f01);
+ rtl_mdio_write(hw, 0x14, 0x9e06);
+ rtl_mdio_write(hw, 0x14, 0xe587);
+ rtl_mdio_write(hw, 0x14, 0xff02);
+ rtl_mdio_write(hw, 0x14, 0x4b05);
+ rtl_mdio_write(hw, 0x14, 0xef96);
+ rtl_mdio_write(hw, 0x14, 0xfefc);
+ rtl_mdio_write(hw, 0x14, 0xaf03);
+ rtl_mdio_write(hw, 0x14, 0x8c54);
+ rtl_mdio_write(hw, 0x14, 0xa434);
+ rtl_mdio_write(hw, 0x14, 0x74a6);
+ rtl_mdio_write(hw, 0x14, 0x0022);
+ rtl_mdio_write(hw, 0x14, 0xa434);
+ rtl_mdio_write(hw, 0x14, 0x11b8);
+ rtl_mdio_write(hw, 0x14, 0x4222);
+ rtl_mdio_write(hw, 0x14, 0xb842);
+ rtl_mdio_write(hw, 0x14, 0xf0a2);
+ rtl_mdio_write(hw, 0x14, 0x00f0);
+ rtl_mdio_write(hw, 0x14, 0xa202);
+ rtl_mdio_write(hw, 0x14, 0xf0a2);
+ rtl_mdio_write(hw, 0x14, 0x04f0);
+ rtl_mdio_write(hw, 0x14, 0xa206);
+ rtl_mdio_write(hw, 0x14, 0xf0a2);
+ rtl_mdio_write(hw, 0x14, 0x08f0);
+ rtl_mdio_write(hw, 0x14, 0xa20a);
+ rtl_mdio_write(hw, 0x14, 0xf0a2);
+ rtl_mdio_write(hw, 0x14, 0x0cf0);
+ rtl_mdio_write(hw, 0x14, 0xa20e);
+ rtl_mdio_write(hw, 0x14, 0x55b8);
+ rtl_mdio_write(hw, 0x14, 0x20d9);
+ rtl_mdio_write(hw, 0x14, 0xc608);
+ rtl_mdio_write(hw, 0x14, 0xaac4);
+ rtl_mdio_write(hw, 0x14, 0x3000);
+ rtl_mdio_write(hw, 0x14, 0xc614);
+ rtl_mdio_write(hw, 0x14, 0x33c4);
+ rtl_mdio_write(hw, 0x14, 0x1a88);
+ rtl_mdio_write(hw, 0x14, 0xc42e);
+ rtl_mdio_write(hw, 0x14, 0x22c4);
+ rtl_mdio_write(hw, 0x14, 0x2e54);
+ rtl_mdio_write(hw, 0x14, 0xc41a);
+ rtl_mdio_write(hw, 0x13, 0xb818);
+ rtl_mdio_write(hw, 0x14, 0x1a01);
+ rtl_mdio_write(hw, 0x13, 0xb81a);
+ rtl_mdio_write(hw, 0x14, 0x020b);
+ rtl_mdio_write(hw, 0x13, 0xb81c);
+ rtl_mdio_write(hw, 0x14, 0x03ce);
+ rtl_mdio_write(hw, 0x13, 0xb81e);
+ rtl_mdio_write(hw, 0x14, 0x00e7);
+ rtl_mdio_write(hw, 0x13, 0xb846);
+ rtl_mdio_write(hw, 0x14, 0x0389);
+ rtl_mdio_write(hw, 0x13, 0xb848);
+ rtl_mdio_write(hw, 0x14, 0xffff);
+ rtl_mdio_write(hw, 0x13, 0xb84a);
+ rtl_mdio_write(hw, 0x14, 0xffff);
+ rtl_mdio_write(hw, 0x13, 0xb84c);
+ rtl_mdio_write(hw, 0x14, 0xffff);
+ rtl_mdio_write(hw, 0x13, 0xb832);
+ rtl_mdio_write(hw, 0x14, 0x001f);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x0000);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ gphy_val = rtl_mdio_read(hw, 0x17);
+ gphy_val &= ~BIT_0;
+ rtl_mdio_write(hw, 0x17, gphy_val);
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8042);
+ rtl_mdio_write(hw, 0x14, 0x0000);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
+
+void
+hw_mac_mcu_config_8168h(struct rtl_hw *hw)
+{
+ if (hw->NotWrMcuPatchCode)
+ return;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_29:
+ rtl8168_set_mac_mcu_8168h_1(hw);
+ break;
+ case CFG_METHOD_30:
+ case CFG_METHOD_37:
+ rtl8168_set_mac_mcu_8168h_2(hw);
+ break;
+ case CFG_METHOD_35:
+ rtl8168_set_mac_mcu_8168h_3(hw);
+ break;
+ case CFG_METHOD_36:
+ rtl8168_set_mac_mcu_8168h_4(hw);
+ break;
+ }
+}
+
+void
+hw_phy_mcu_config_8168h(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_29:
+ rtl8168_set_phy_mcu_8168h_1(hw);
+ break;
+ case CFG_METHOD_30:
+ case CFG_METHOD_37:
+ rtl8168_set_phy_mcu_8168h_2(hw);
+ break;
+ case CFG_METHOD_35:
+ rtl8168_set_phy_mcu_8168h_3(hw);
+ break;
+ case CFG_METHOD_36:
+ break;
+ }
+}
diff --git a/drivers/net/r8169/base/rtl8168m.c b/drivers/net/r8169/base/rtl8168m.c
new file mode 100644
index 0000000000..2b544c9fe8
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8168m.c
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_compat.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8168h.h"
+
+/* For RTL8168M, CFG_METHOD_37 */
+
+const struct rtl_hw_ops rtl8168m_ops = {
+ .hw_config = hw_config_8168h,
+ .hw_init_rxcfg = hw_init_rxcfg_8168h,
+ .hw_ephy_config = hw_ephy_config_8168h,
+ .hw_phy_config = hw_phy_config_8168h,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8168h,
+ .hw_phy_mcu_config = hw_phy_mcu_config_8168h,
+};
diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build
index d1e65377a3..720d79acff 100644
--- a/drivers/net/r8169/meson.build
+++ b/drivers/net/r8169/meson.build
@@ -18,4 +18,13 @@ sources = files(
'base/rtl8126a.c',
'base/rtl8126a_mcu.c',
'base/rtl8168kb.c',
+ 'base/rtl8168g.c',
+ 'base/rtl8168g_mcu.c',
+ 'base/rtl8168h.c',
+ 'base/rtl8168h_mcu.c',
+ 'base/rtl8168ep.c',
+ 'base/rtl8168ep_mcu.c',
+ 'base/rtl8168fp.c',
+ 'base/rtl8168fp_mcu.c',
+ 'base/rtl8168m.c',
)
\ No newline at end of file
diff --git a/drivers/net/r8169/r8169_compat.h b/drivers/net/r8169/r8169_compat.h
index f5b953b098..631acffb64 100644
--- a/drivers/net/r8169/r8169_compat.h
+++ b/drivers/net/r8169/r8169_compat.h
@@ -355,16 +355,16 @@ enum RTL_register_content {
/* Config3 register */
Isolate_en = (1UL << 12), /* Isolate enable */
MagicPacket = (1UL << 5), /* Wake up when receives a magic packet */
- LinkUp = (1UL << 4), /* This bit is reserved in RTL8125B. */
+ LinkUp = (1UL << 4),
/* Wake up when the cable connection is re-established */
- ECRCEN = (1UL << 3), /* This bit is reserved in RTL8125B. */
- Jumbo_En0 = (1UL << 2), /* This bit is reserved in RTL8125B. */
- RDY_TO_L23 = (1UL << 1), /* This bit is reserved in RTL8125B. */
- Beacon_en = (1UL << 0), /* This bit is reserved in RTL8125B. */
+ ECRCEN = (1UL << 3),
+ Jumbo_En0 = (1UL << 2),
+ RDY_TO_L23 = (1UL << 1),
+ Beacon_en = (1UL << 0),
/* Config4 register */
- Jumbo_En1 = (1UL << 1), /* This bit is reserved in RTL8125B. */
+ Jumbo_En1 = (1UL << 1),
/* Config5 register */
BWF = (1UL << 6), /* Accept broadcast wakeup frame */
@@ -380,8 +380,8 @@ enum RTL_register_content {
Force_halfdup = (1UL << 12),
Force_rxflow_en = (1UL << 11),
Force_txflow_en = (1UL << 10),
- Cxpl_dbg_sel = (1UL << 9), /* This bit is reserved in RTL8125B. */
- ASF = (1UL << 8), /* This bit is reserved in RTL8125C. */
+ Cxpl_dbg_sel = (1UL << 9),
+ ASF = (1UL << 8),
PktCntrDisable = (1UL << 7),
RxVlan = (1UL << 6),
RxChkSum = (1UL << 5),
@@ -508,6 +508,11 @@ enum RTL_chipset_name {
RTL8125BP,
RTL8125D,
RTL8126A,
+ RTL8168EP,
+ RTL8168FP,
+ RTL8168G,
+ RTL8168H,
+ RTL8168M,
UNKNOWN
};
@@ -540,6 +545,8 @@ enum RTL_chipset_name {
#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
#define Rx_Fetch_Number_8 (1 << 30)
#define Rx_Close_Multiple (1 << 21)
+#define RxEarly_off_V2 (1 << 11)
+#define Rx_Single_fetch_V2 (1 << 14)
#define TRUE 1
#define FALSE 0
@@ -567,8 +574,6 @@ enum RTL_chipset_name {
#define ADVERTISE_5000_HALF 0x0100 /* NOT used, just FYI */
#define ADVERTISE_5000_FULL 0x0200
-#define MAC_ADDR_LEN RTE_ETHER_ADDR_LEN
-
#define RTL_MAX_TX_DESC 4096
#define RTL_MAX_RX_DESC 4096
#define RTL_MIN_TX_DESC 64
diff --git a/drivers/net/r8169/r8169_dash.c b/drivers/net/r8169/r8169_dash.c
index 21684b19eb..c26d7a5280 100644
--- a/drivers/net/r8169/r8169_dash.c
+++ b/drivers/net/r8169/r8169_dash.c
@@ -48,7 +48,7 @@ rtl_get_dash_fw_ver(struct rtl_hw *hw)
{
u32 ver = 0xffffffff;
- if (HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw) == FALSE)
+ if (!HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw))
goto exit;
ver = rtl_ocp_read(hw, OCP_REG_FIRMWARE_MAJOR_VERSION, 4);
@@ -63,46 +63,165 @@ _rtl_check_dash(struct rtl_hw *hw)
if (!hw->AllowAccessDashOcp)
return 0;
- if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) {
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw) ||
+ HW_DASH_SUPPORT_TYPE_4(hw)) {
if (rtl_ocp_read(hw, 0x128, 1) & BIT_0)
return 1;
+ else
+ return 0;
+ } else if (HW_DASH_SUPPORT_TYPE_1(hw)) {
+ if (rtl_ocp_read(hw, 0x10, 2) & 0x00008000)
+ return 1;
+ else
+ return 0;
+ } else {
+ return 0;
}
-
- return 0;
}
int
rtl_check_dash(struct rtl_hw *hw)
{
- u32 ver;
+ int dash_enabled;
+ u32 fw_ver;
- if (_rtl_check_dash(hw)) {
- ver = rtl_get_dash_fw_ver(hw);
- if (!(ver == 0 || ver == 0xffffffff))
- return 1;
+ dash_enabled = _rtl_check_dash(hw);
+
+ if (!dash_enabled)
+ goto exit;
+
+ if (!HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw))
+ goto exit;
+
+ fw_ver = rtl_get_dash_fw_ver(hw);
+ if (fw_ver == 0 || fw_ver == 0xffffffff)
+ dash_enabled = 0;
+exit:
+ return dash_enabled;
+}
+
+static u32
+rtl8168_csi_to_cmac_r32(struct rtl_hw *hw)
+{
+ u32 cmd;
+ int i;
+ u32 value = 0;
+
+ cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift | 0xf9;
+
+ cmd |= 1 << 16;
+
+ RTL_W32(hw, CSIAR, cmd);
+
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
+
+ /* Check if the RTL8168 has completed CSI read */
+ if (RTL_R32(hw, CSIAR) & CSIAR_Flag) {
+ value = RTL_R32(hw, CSIDR);
+ break;
+ }
}
- return 0;
+ rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
+
+ return value;
+}
+
+static u8
+rtl8168_csi_to_cmac_r8(struct rtl_hw *hw, u32 reg)
+{
+ u32 mask, value1 = 0;
+ u8 val_shift, value2 = 0;
+
+ val_shift = reg - 0xf8;
+
+ if (val_shift == 0)
+ mask = 0xFF;
+ else if (val_shift == 1)
+ mask = 0xFF00;
+ else if (val_shift == 2)
+ mask = 0xFF0000;
+ else if (val_shift == 3)
+ mask = 0xFF000000;
+
+ value1 = rtl8168_csi_to_cmac_r32(hw) & mask;
+ value2 = value1 >> (val_shift * 8);
+
+ return value2;
}
static void
-rtl8125_dash2_disable_tx(struct rtl_hw *hw)
+rtl8168_csi_to_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value)
{
- u16 wait_cnt = 0;
- u8 tmp_uchar;
+ int i;
+ u8 val_shift;
+ u32 value32, cmd, mask;
- if (!HW_DASH_SUPPORT_CMAC(hw))
- return;
+ val_shift = reg - 0xf8;
- if (!hw->DASH)
- return;
+ if (val_shift == 0)
+ mask = 0xFF;
+ else if (val_shift == 1)
+ mask = 0xFF00;
+ else if (val_shift == 2)
+ mask = 0xFF0000;
+ else if (val_shift == 3)
+ mask = 0xFF000000;
+
+ value32 = rtl8168_csi_to_cmac_r32(hw) & ~mask;
+ value32 |= value << (val_shift * 8);
+ RTL_W32(hw, CSIDR, value32);
+
+ cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift | 0xf9;
+
+ cmd |= 1 << 16;
+
+ RTL_W32(hw, CSIAR, cmd);
+
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
+
+ /* Check if the RTL8168 has completed CSI write */
+ if (!(RTL_R32(hw, CSIAR) & CSIAR_Flag))
+ break;
+ }
+
+ rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
+}
+
+static void
+rtl_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value)
+{
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw))
+ RTL_CMAC_W8(hw, reg, value);
+ else if (HW_DASH_SUPPORT_TYPE_3(hw))
+ rtl8168_csi_to_cmac_w8(hw, reg, value);
+}
+
+static u8
+rtl_cmac_r8(struct rtl_hw *hw, u32 reg)
+{
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw))
+ return RTL_CMAC_R8(hw, reg);
+ else if (HW_DASH_SUPPORT_TYPE_3(hw))
+ return rtl8168_csi_to_cmac_r8(hw, reg);
+ else
+ return 0;
+}
+
+static void
+rtl_dash2_disable_tx(struct rtl_hw *hw)
+{
+ u16 wait_cnt = 0;
+ u8 tmp_uchar;
/* Disable oob Tx */
- RTL_CMAC_W8(hw, CMAC_IBCR2, RTL_CMAC_R8(hw, CMAC_IBCR2) & ~BIT_0);
+ rtl_cmac_w8(hw, CMAC_IBCR2, rtl_cmac_r8(hw, CMAC_IBCR2) & ~BIT_0);
/* Wait oob Tx disable */
do {
- tmp_uchar = RTL_CMAC_R8(hw, CMAC_IBISR0);
+ tmp_uchar = rtl_cmac_r8(hw, CMAC_IBISR0);
if (tmp_uchar & ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE)
break;
@@ -111,30 +230,27 @@ rtl8125_dash2_disable_tx(struct rtl_hw *hw)
} while (wait_cnt < 2000);
/* Clear ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE */
- RTL_CMAC_W8(hw, CMAC_IBISR0, RTL_CMAC_R8(hw, CMAC_IBISR0) |
+ rtl_cmac_w8(hw, CMAC_IBISR0, rtl_cmac_r8(hw, CMAC_IBISR0) |
ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE);
}
static void
-rtl8125_dash2_disable_rx(struct rtl_hw *hw)
+rtl_dash2_disable_rx(struct rtl_hw *hw)
{
- if (!HW_DASH_SUPPORT_CMAC(hw))
- return;
-
- if (!hw->DASH)
- return;
-
- RTL_CMAC_W8(hw, CMAC_IBCR0, RTL_CMAC_R8(hw, CMAC_IBCR0) & ~BIT_0);
+ rtl_cmac_w8(hw, CMAC_IBCR0, rtl_cmac_r8(hw, CMAC_IBCR0) & ~BIT_0);
}
void
-rtl8125_dash2_disable_txrx(struct rtl_hw *hw)
+rtl_dash2_disable_txrx(struct rtl_hw *hw)
{
if (!HW_DASH_SUPPORT_CMAC(hw))
return;
- rtl8125_dash2_disable_tx(hw);
- rtl8125_dash2_disable_rx(hw);
+ if (!hw->DASH)
+ return;
+
+ rtl_dash2_disable_tx(hw);
+ rtl_dash2_disable_rx(hw);
}
static void
@@ -154,7 +270,7 @@ rtl8125_notify_dash_oob_cmac(struct rtl_hw *hw, u32 cmd)
static void
rtl8125_notify_dash_oob_ipc2(struct rtl_hw *hw, u32 cmd)
{
- if (HW_DASH_SUPPORT_TYPE_4(hw) == FALSE)
+ if (!HW_DASH_SUPPORT_TYPE_4(hw))
return;
rtl_ocp_write(hw, IB2SOC_DATA, 4, cmd);
@@ -179,20 +295,36 @@ rtl8125_notify_dash_oob(struct rtl_hw *hw, u32 cmd)
}
static int
-rtl8125_wait_dash_fw_ready(struct rtl_hw *hw)
+rtl_wait_dash_fw_ready(struct rtl_hw *hw)
{
int rc = -1;
int timeout;
+ if (!HW_DASH_SUPPORT_DASH(hw))
+ goto out;
+
if (!hw->DASH)
goto out;
- for (timeout = 0; timeout < 10; timeout++) {
- rte_delay_ms(10);
- if (rtl_ocp_read(hw, 0x124, 1) & BIT_0) {
- rc = 1;
- goto out;
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw) ||
+ HW_DASH_SUPPORT_TYPE_4(hw)) {
+ for (timeout = 0; timeout < 10; timeout++) {
+ rte_delay_ms(10);
+ if (rtl_ocp_read(hw, 0x124, 1) & BIT_0) {
+ rc = 1;
+ goto out;
+ }
}
+ } else if (HW_DASH_SUPPORT_TYPE_1(hw)) {
+ for (timeout = 0; timeout < 10; timeout++) {
+ rte_delay_ms(10);
+ if (rtl_ocp_read(hw, 0x10, 2) & BIT_11) {
+ rc = 1;
+ goto out;
+ }
+ }
+ } else {
+ goto out;
}
rc = 0;
@@ -201,7 +333,7 @@ rtl8125_wait_dash_fw_ready(struct rtl_hw *hw)
return rc;
}
-void
+static void
rtl8125_driver_start(struct rtl_hw *hw)
{
if (!hw->AllowAccessDashOcp)
@@ -209,19 +341,242 @@ rtl8125_driver_start(struct rtl_hw *hw)
rtl8125_notify_dash_oob(hw, OOB_CMD_DRIVER_START);
- rtl8125_wait_dash_fw_ready(hw);
+ rtl_wait_dash_fw_ready(hw);
+}
+
+static void
+rtl8168_clear_and_set_other_fun_pci_bit(struct rtl_hw *hw, u8 multi_fun_sel_bit,
+ u32 addr, u32 clearmask, u32 setmask)
+{
+ u32 tmp_ulong;
+
+ tmp_ulong = rtl_csi_other_fun_read(hw, multi_fun_sel_bit, addr);
+ tmp_ulong &= ~clearmask;
+ tmp_ulong |= setmask;
+ rtl_csi_other_fun_write(hw, multi_fun_sel_bit, addr, tmp_ulong);
+}
+
+static void
+rtl8168_other_fun_dev_pci_setting(struct rtl_hw *hw, u32 addr, u32 clearmask,
+ u32 setmask, u8 multi_fun_sel_bit)
+{
+ u32 tmp_ulong;
+ u8 i;
+ u8 fun_bit;
+ u8 set_other_fun;
+
+ for (i = 0; i < 8; i++) {
+ fun_bit = (1 << i);
+ if (!(fun_bit & multi_fun_sel_bit))
+ continue;
+
+ set_other_fun = TRUE;
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ /*
+ * 0: UMAC, 1: TCR1, 2: TCR2, 3: KCS,
+ * 4: EHCI(Control by EHCI Driver)
+ */
+ if (i < 5) {
+ tmp_ulong = rtl_csi_other_fun_read(hw, i, 0x00);
+ if (tmp_ulong == 0xFFFFFFFF)
+ set_other_fun = TRUE;
+ else
+ set_other_fun = FALSE;
+ }
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ /*
+ * 0: BMC, 1: NIC, 2: TCR, 3: VGA / PCIE_TO_USB,
+ * 4: EHCI, 5: WIFI, 6: WIFI, 7: KCS
+ */
+ if (i == 5 || i == 6) {
+ if (hw->DASH) {
+ tmp_ulong = rtl_ocp_read(hw, 0x184, 4);
+ if (tmp_ulong & BIT_26)
+ set_other_fun = FALSE;
+ else
+ set_other_fun = TRUE;
+ }
+ } else { /* Function 0/1/2/3/4/7 */
+ tmp_ulong = rtl_csi_other_fun_read(hw, i, 0x00);
+ if (tmp_ulong == 0xFFFFFFFF)
+ set_other_fun = TRUE;
+ else
+ set_other_fun = FALSE;
+ }
+ break;
+ default:
+ return;
+ }
+
+ if (set_other_fun)
+ rtl8168_clear_and_set_other_fun_pci_bit(hw, i, addr,
+ clearmask, setmask);
+ }
+}
+
+static void
+rtl8168_set_dash_other_fun_dev_state_change(struct rtl_hw *hw, u8 dev_state,
+ u8 multi_fun_sel_bit)
+{
+ u32 clearmask;
+ u32 setmask;
+
+ if (dev_state == 0) {
+ /* Goto D0 */
+ clearmask = (BIT_0 | BIT_1);
+ setmask = 0;
+
+ rtl8168_other_fun_dev_pci_setting(hw, 0x44, clearmask, setmask,
+ multi_fun_sel_bit);
+ } else {
+ /* Goto D3 */
+ clearmask = 0;
+ setmask = (BIT_0 | BIT_1);
+
+ rtl8168_other_fun_dev_pci_setting(hw, 0x44, clearmask, setmask,
+ multi_fun_sel_bit);
+ }
+}
+
+static void
+rtl8168_set_dash_other_fun_dev_aspm_clkreq(struct rtl_hw *hw, u8 aspm_val,
+ u8 clkreq_en, u8 multi_fun_sel_bit)
+{
+ u32 clearmask;
+ u32 setmask;
+
+ aspm_val &= (BIT_0 | BIT_1);
+ clearmask = (BIT_0 | BIT_1 | BIT_8);
+ setmask = aspm_val;
+ if (clkreq_en)
+ setmask |= BIT_8;
+
+ rtl8168_other_fun_dev_pci_setting(hw, 0x80, clearmask, setmask,
+ multi_fun_sel_bit);
+}
+
+static void
+rtl8168_oob_notify(struct rtl_hw *hw, u8 cmd)
+{
+ rtl_eri_write(hw, 0xE8, 1, cmd, ERIAR_ExGMAC);
+
+ rtl_ocp_write(hw, 0x30, 1, 0x01);
+}
+
+static void
+rtl8168_driver_start(struct rtl_hw *hw)
+{
+ u32 tmp_value;
+
+ /* Change other device state to D0. */
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ rtl8168_set_dash_other_fun_dev_aspm_clkreq(hw, 3, 1, 0x1E);
+ rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0x1E);
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ rtl8168_set_dash_other_fun_dev_aspm_clkreq(hw, 3, 1, 0xFC);
+ rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0xFC);
+ break;
+ }
+
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw)) {
+ rtl_ocp_write(hw, 0x180, 1, OOB_CMD_DRIVER_START);
+ tmp_value = rtl_ocp_read(hw, 0x30, 1);
+ tmp_value |= BIT_0;
+ rtl_ocp_write(hw, 0x30, 1, tmp_value);
+ } else {
+ rtl8168_oob_notify(hw, OOB_CMD_DRIVER_START);
+ }
+
+ rtl_wait_dash_fw_ready(hw);
}
void
+rtl_driver_start(struct rtl_hw *hw)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_driver_start(hw);
+ else
+ rtl8168_driver_start(hw);
+}
+
+static void
+rtl8168_driver_stop(struct rtl_hw *hw)
+{
+ u32 tmp_value;
+
+ if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw)) {
+ rtl_dash2_disable_txrx(hw);
+
+ rtl_ocp_write(hw, 0x180, 1, OOB_CMD_DRIVER_STOP);
+ tmp_value = rtl_ocp_read(hw, 0x30, 1);
+ tmp_value |= BIT_0;
+ rtl_ocp_write(hw, 0x30, 1, tmp_value);
+ } else if (HW_DASH_SUPPORT_TYPE_1(hw)) {
+ rtl8168_oob_notify(hw, OOB_CMD_DRIVER_STOP);
+ }
+
+ rtl_wait_dash_fw_ready(hw);
+
+ /* Change other device state to D3. */
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0x0E);
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0xFD);
+ break;
+ }
+}
+
+static void
rtl8125_driver_stop(struct rtl_hw *hw)
{
if (!hw->AllowAccessDashOcp)
return;
if (HW_DASH_SUPPORT_CMAC(hw))
- rtl8125_dash2_disable_txrx(hw);
+ rtl_dash2_disable_txrx(hw);
rtl8125_notify_dash_oob(hw, OOB_CMD_DRIVER_STOP);
- rtl8125_wait_dash_fw_ready(hw);
+ rtl_wait_dash_fw_ready(hw);
+}
+
+void
+rtl_driver_stop(struct rtl_hw *hw)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_driver_stop(hw);
+ else
+ rtl8168_driver_stop(hw);
+}
+
+bool
+rtl8168_check_dash_other_fun_present(struct rtl_hw *hw)
+{
+ /* Check if func 2 exist */
+ if (rtl_csi_other_fun_read(hw, 2, 0x00) != 0xffffffff)
+ return true;
+ else
+ return false;
}
diff --git a/drivers/net/r8169/r8169_dash.h b/drivers/net/r8169/r8169_dash.h
index daa572b456..47c5d6906e 100644
--- a/drivers/net/r8169/r8169_dash.h
+++ b/drivers/net/r8169/r8169_dash.h
@@ -50,8 +50,10 @@ bool rtl_is_allow_access_dash_ocp(struct rtl_hw *hw);
int rtl_check_dash(struct rtl_hw *hw);
-void rtl8125_driver_start(struct rtl_hw *hw);
-void rtl8125_driver_stop(struct rtl_hw *hw);
-void rtl8125_dash2_disable_txrx(struct rtl_hw *hw);
+void rtl_driver_start(struct rtl_hw *hw);
+void rtl_driver_stop(struct rtl_hw *hw);
+void rtl_dash2_disable_txrx(struct rtl_hw *hw);
+
+bool rtl8168_check_dash_other_fun_present(struct rtl_hw *hw);
#endif /* R8169_DASH_H */
diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c
index c0cac6e7d8..e2ea9435fe 100644
--- a/drivers/net/r8169/r8169_ethdev.c
+++ b/drivers/net/r8169/r8169_ethdev.c
@@ -26,12 +26,12 @@
#include "r8169_hw.h"
#include "r8169_dash.h"
-static int rtl_dev_configure(struct rte_eth_dev *dev);
+static int rtl_dev_configure(struct rte_eth_dev *dev __rte_unused);
static int rtl_dev_start(struct rte_eth_dev *dev);
static int rtl_dev_stop(struct rte_eth_dev *dev);
static int rtl_dev_reset(struct rte_eth_dev *dev);
static int rtl_dev_close(struct rte_eth_dev *dev);
-static int rtl_dev_link_update(struct rte_eth_dev *dev, int wait);
+static int rtl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused);
static int rtl_dev_set_link_up(struct rte_eth_dev *dev);
static int rtl_dev_set_link_down(struct rte_eth_dev *dev);
static int rtl_dev_infos_get(struct rte_eth_dev *dev,
@@ -55,6 +55,7 @@ static const struct rte_pci_id pci_id_r8169_map[] = {
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8162) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8126) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x5000) },
+ { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168) },
{.vendor_id = 0, /* sentinel */ },
};
@@ -116,15 +117,23 @@ static void
rtl_disable_intr(struct rtl_hw *hw)
{
PMD_INIT_FUNC_TRACE();
- RTL_W32(hw, IMR0_8125, 0x0000);
- RTL_W32(hw, ISR0_8125, RTL_R32(hw, ISR0_8125));
+ if (rtl_is_8125(hw)) {
+ RTL_W32(hw, IMR0_8125, 0x0000);
+ RTL_W32(hw, ISR0_8125, RTL_R32(hw, ISR0_8125));
+ } else {
+ RTL_W16(hw, IntrMask, 0x0000);
+ RTL_W16(hw, IntrStatus, RTL_R16(hw, IntrStatus));
+ }
}
static void
rtl_enable_intr(struct rtl_hw *hw)
{
PMD_INIT_FUNC_TRACE();
- RTL_W32(hw, IMR0_8125, LinkChg);
+ if (rtl_is_8125(hw))
+ RTL_W32(hw, IMR0_8125, LinkChg);
+ else
+ RTL_W16(hw, IntrMask, LinkChg);
}
static int
@@ -134,10 +143,35 @@ _rtl_setup_link(struct rte_eth_dev *dev)
struct rtl_hw *hw = &adapter->hw;
u64 adv = 0;
u32 *link_speeds = &dev->data->dev_conf.link_speeds;
+ unsigned int speed_mode;
/* Setup link speed and duplex */
if (*link_speeds == RTE_ETH_LINK_SPEED_AUTONEG) {
- rtl_set_link_option(hw, AUTONEG_ENABLE, SPEED_5000, DUPLEX_FULL, rtl_fc_full);
+ switch (hw->mcfg) {
+ 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:
+ speed_mode = SPEED_2500;
+ break;
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ speed_mode = SPEED_5000;
+ break;
+ default:
+ speed_mode = SPEED_1000;
+ break;
+ }
+
+ rtl_set_link_option(hw, AUTONEG_ENABLE, speed_mode, DUPLEX_FULL,
+ rtl_fc_full);
} else if (*link_speeds != 0) {
if (*link_speeds & ~(RTE_ETH_LINK_SPEED_10M_HD | RTE_ETH_LINK_SPEED_10M |
RTE_ETH_LINK_SPEED_100M_HD | RTE_ETH_LINK_SPEED_100M |
@@ -225,6 +259,18 @@ rtl_setup_link(struct rte_eth_dev *dev)
return 0;
}
+/* Set PCI configuration space offset 0x79 to setting */
+static void
+set_offset79(struct rte_pci_device *pdev, u8 setting)
+{
+ u8 device_control;
+
+ PCI_READ_CONFIG_BYTE(pdev, &device_control, 0x79);
+ device_control &= ~0x70;
+ device_control |= setting;
+ PCI_WRITE_CONFIG_BYTE(pdev, &device_control, 0x79);
+}
+
/*
* Configure device link speed and setup link.
* It returns 0 on success.
@@ -249,6 +295,28 @@ rtl_dev_start(struct rte_eth_dev *dev)
rtl_hw_config(hw);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ set_offset79(pci_dev, 0x40);
+ break;
+ }
+
/* Initialize transmission unit */
rtl_tx_init(dev);
@@ -295,8 +363,19 @@ rtl_dev_stop(struct rte_eth_dev *dev)
rtl_nic_reset(hw);
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting);
break;
}
@@ -333,8 +412,19 @@ rtl_dev_set_link_down(struct rte_eth_dev *dev)
/* mcu pme intr masks */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting & ~(BIT_11 | BIT_14));
break;
}
@@ -515,20 +605,63 @@ rtl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)
if (status & FullDup) {
link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
- if (hw->mcfg == CFG_METHOD_2)
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ case CFG_METHOD_48:
RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) |
- (BIT_24 | BIT_25)) & ~BIT_19);
-
+ (BIT_24 | BIT_25)) & ~BIT_19);
+ break;
+ }
} else {
link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
- if (hw->mcfg == CFG_METHOD_2)
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ case CFG_METHOD_48:
RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | BIT_25) &
- ~(BIT_19 | BIT_24));
+ ~(BIT_19 | BIT_24));
+ break;
+ }
}
- if (status & _5000bpsF)
+ /*
+ * The PHYstatus register for the RTL8168 is 8 bits,
+ * while for the RTL8125 and RTL8126, it is 16 bits.
+ */
+ if (status & _5000bpsF && rtl_is_8125(hw))
speed = 5000;
- else if (status & _2500bpsF)
+ else if (status & _2500bpsF && rtl_is_8125(hw))
speed = 2500;
else if (status & _1000bpsF)
speed = 1000;
@@ -556,7 +689,10 @@ rtl_dev_interrupt_handler(void *param)
struct rtl_hw *hw = &adapter->hw;
uint32_t intr;
- intr = RTL_R32(hw, ISR0_8125);
+ if (rtl_is_8125(hw))
+ intr = RTL_R32(hw, ISR0_8125);
+ else
+ intr = RTL_R16(hw, IntrStatus);
/* Clear all cause mask */
rtl_disable_intr(hw);
@@ -586,7 +722,7 @@ rtl_dev_close(struct rte_eth_dev *dev)
return 0;
if (HW_DASH_SUPPORT_DASH(hw))
- rtl8125_driver_stop(hw);
+ rtl_driver_stop(hw);
ret_stp = rtl_dev_stop(dev);
@@ -656,14 +792,15 @@ rtl_dev_init(struct rte_eth_dev *dev)
dev->tx_pkt_burst = &rtl_xmit_pkts;
dev->rx_pkt_burst = &rtl_recv_pkts;
- /* For secondary processes, the primary process has done all the work */
+ /* For secondary processes, the primary process has done all the work. */
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
if (dev->data->scattered_rx)
dev->rx_pkt_burst = &rtl_recv_scattered_pkts;
return 0;
}
- hw->mmio_addr = (u8 *)pci_dev->mem_resource[2].addr; /* RTL8169 uses BAR2 */
+ /* R8169 uses BAR2 */
+ hw->mmio_addr = (u8 *)pci_dev->mem_resource[2].addr;
rtl_get_mac_version(hw, pci_dev);
diff --git a/drivers/net/r8169/r8169_ethdev.h b/drivers/net/r8169/r8169_ethdev.h
index c5fd465ff0..0de91045fa 100644
--- a/drivers/net/r8169/r8169_ethdev.h
+++ b/drivers/net/r8169/r8169_ethdev.h
@@ -15,6 +15,7 @@
struct rtl_hw;
struct rtl_hw_ops {
+ void (*hw_config)(struct rtl_hw *hw);
void (*hw_init_rxcfg)(struct rtl_hw *hw);
void (*hw_ephy_config)(struct rtl_hw *hw);
void (*hw_phy_config)(struct rtl_hw *hw);
@@ -36,13 +37,12 @@ struct rtl_hw {
u8 *mmio_addr;
u8 *cmac_ioaddr; /* cmac memory map physical address */
u8 chipset_name;
- u8 efuse_ver;
u8 HwIcVerUnknown;
u32 mcfg;
u32 mtu;
u8 HwSuppIntMitiVer;
u16 cur_page;
- u8 mac_addr[MAC_ADDR_LEN];
+ u8 mac_addr[RTE_ETHER_ADDR_LEN];
u32 rx_buf_sz;
struct rtl_counters *tally_vaddr;
@@ -53,9 +53,9 @@ struct rtl_hw {
u8 HwSuppMacMcuVer;
u16 MacMcuPageSize;
- u8 NotWrRamCodeToMicroP;
- u8 HwHasWrRamCodeToMicroP;
- u8 HwSuppCheckPhyDisableModeVer;
+ u8 NotWrRamCodeToMicroP;
+ u8 HwHasWrRamCodeToMicroP;
+ u8 HwSuppCheckPhyDisableModeVer;
u16 sw_ram_code_ver;
u16 hw_ram_code_ver;
@@ -68,7 +68,7 @@ struct rtl_hw {
u32 HwSuppMaxPhyLinkSpeed;
- u8 HwSuppNowIsOobVer;
+ u8 HwSuppNowIsOobVer;
u16 mcu_pme_setting;
@@ -86,6 +86,8 @@ struct rtl_hw {
u8 DASH;
u8 HwSuppOcpChannelVer;
u8 AllowAccessDashOcp;
+ u8 HwPkgDet;
+ u8 HwSuppSerDesPhyVer;
};
struct rtl_sw_stats {
@@ -108,6 +110,24 @@ struct rtl_adapter {
#define R8169_LINK_CHECK_TIMEOUT 50 /* 10s */
#define R8169_LINK_CHECK_INTERVAL 200 /* ms */
+#define PCI_READ_CONFIG_BYTE(dev, val, where) \
+ rte_pci_read_config(dev, val, 1, where)
+
+#define PCI_READ_CONFIG_WORD(dev, val, where) \
+ rte_pci_read_config(dev, val, 2, where)
+
+#define PCI_READ_CONFIG_DWORD(dev, val, where) \
+ rte_pci_read_config(dev, val, 4, where)
+
+#define PCI_WRITE_CONFIG_BYTE(dev, val, where) \
+ rte_pci_write_config(dev, val, 1, where)
+
+#define PCI_WRITE_CONFIG_WORD(dev, val, where) \
+ rte_pci_write_config(dev, val, 2, where)
+
+#define PCI_WRITE_CONFIG_DWORD(dev, val, where) \
+ rte_pci_write_config(dev, val, 4, where)
+
int rtl_rx_init(struct rte_eth_dev *dev);
int rtl_tx_init(struct rte_eth_dev *dev);
diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c
index 63a20a733e..21a599dfc6 100644
--- a/drivers/net/r8169/r8169_hw.c
+++ b/drivers/net/r8169/r8169_hw.c
@@ -77,6 +77,12 @@ rtl_eri_read_with_oob_base_address(struct rtl_hw *hw, int addr, int len,
return value2;
}
+u32
+rtl_eri_read(struct rtl_hw *hw, int addr, int len, int type)
+{
+ return rtl_eri_read_with_oob_base_address(hw, addr, len, type, 0);
+}
+
static int
rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr,
int len, u32 value, int type,
@@ -144,6 +150,13 @@ rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr,
return 0;
}
+int
+rtl_eri_write(struct rtl_hw *hw, int addr, int len, u32 value, int type)
+{
+ return rtl_eri_write_with_oob_base_address(hw, addr, len, value, type,
+ NO_BASE_ADDRESS);
+}
+
static u32
rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
const u32 base_address)
@@ -152,17 +165,122 @@ rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
base_address);
}
+static u32
+rtl8168_real_ocp_read(struct rtl_hw *hw, u16 addr, u8 len)
+{
+ int i, val_shift, shift = 0;
+ u32 value1, value2, mask;
+
+ value1 = 0;
+ value2 = 0;
+
+ if (len > 4 || len <= 0)
+ return -1;
+
+ while (len > 0) {
+ val_shift = addr % 4;
+ addr = addr & ~0x3;
+
+ RTL_W32(hw, OCPAR, (0x0F << 12) | (addr & 0xFFF));
+
+ for (i = 0; i < 20; i++) {
+ rte_delay_us(100);
+ if (RTL_R32(hw, OCPAR) & OCPAR_Flag)
+ break;
+ }
+
+ if (len == 1)
+ mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else if (len == 2)
+ mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else if (len == 3)
+ mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else
+ mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+
+ value1 = RTL_R32(hw, OCPDR) & mask;
+ value2 |= (value1 >> val_shift * 8) << shift * 8;
+
+ if (len <= 4 - val_shift) {
+ len = 0;
+ } else {
+ len -= (4 - val_shift);
+ shift = 4 - val_shift;
+ addr += 4;
+ }
+ }
+
+ rte_delay_us(20);
+
+ return value2;
+}
+
+static int
+rtl8168_real_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value)
+{
+ int i, val_shift, shift = 0;
+ u32 mask, value1 = 0;
+
+ if (len > 4 || len <= 0)
+ return -1;
+
+ while (len > 0) {
+ val_shift = addr % 4;
+ addr = addr & ~0x3;
+
+ if (len == 1)
+ mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else if (len == 2)
+ mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else if (len == 3)
+ mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+ else
+ mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
+
+ value1 = rtl_ocp_read(hw, addr, 4) & ~mask;
+ value1 |= ((value << val_shift * 8) >> shift * 8);
+
+ RTL_W32(hw, OCPDR, value1);
+ RTL_W32(hw, OCPAR, OCPAR_Flag | (0x0F << 12) | (addr & 0xFFF));
+
+ for (i = 0; i < 10; i++) {
+ rte_delay_us(100);
+
+ /* Check if the RTL8168 has completed ERI write */
+ if (!(RTL_R32(hw, OCPAR) & OCPAR_Flag))
+ break;
+ }
+
+ if (len <= 4 - val_shift) {
+ len = 0;
+ } else {
+ len -= (4 - val_shift);
+ shift = 4 - val_shift;
+ addr += 4;
+ }
+ }
+
+ rte_delay_us(20);
+
+ return 0;
+}
+
u32
rtl_ocp_read(struct rtl_hw *hw, u16 addr, u8 len)
{
u32 value = 0;
- if (!hw->AllowAccessDashOcp)
+ if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp)
return 0xffffffff;
if (hw->HwSuppOcpChannelVer == 2)
value = rtl_ocp_read_with_oob_base_address(hw, addr, len,
NO_BASE_ADDRESS);
+ else if (hw->HwSuppOcpChannelVer == 3)
+ value = rtl_ocp_read_with_oob_base_address(hw, addr, len,
+ RTL8168FP_OOBMAC_BASE);
+ else
+ value = rtl8168_real_ocp_read(hw, addr, len);
return value;
}
@@ -171,23 +289,28 @@ static u32
rtl_ocp_write_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
u32 value, const u32 base_address)
{
- return rtl_eri_write_with_oob_base_address(hw, addr, len, value, ERIAR_OOB,
- base_address);
+ return rtl_eri_write_with_oob_base_address(hw, addr, len, value,
+ ERIAR_OOB, base_address);
}
void
rtl_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value)
{
- if (!hw->AllowAccessDashOcp)
+ if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp)
return;
if (hw->HwSuppOcpChannelVer == 2)
rtl_ocp_write_with_oob_base_address(hw, addr, len, value,
NO_BASE_ADDRESS);
+ else if (hw->HwSuppOcpChannelVer == 3)
+ rtl_ocp_write_with_oob_base_address(hw, addr, len, value,
+ RTL8168FP_OOBMAC_BASE);
+ else
+ rtl8168_real_ocp_write(hw, addr, len, value);
}
void
-rtl8125_oob_mutex_lock(struct rtl_hw *hw)
+rtl_oob_mutex_lock(struct rtl_hw *hw)
{
u8 reg_16, reg_a0;
u16 ocp_reg_mutex_ib;
@@ -199,6 +322,13 @@ rtl8125_oob_mutex_lock(struct rtl_hw *hw)
return;
switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_52:
@@ -241,7 +371,7 @@ rtl8125_oob_mutex_lock(struct rtl_hw *hw)
}
void
-rtl8125_oob_mutex_unlock(struct rtl_hw *hw)
+rtl_oob_mutex_unlock(struct rtl_hw *hw)
{
u16 ocp_reg_mutex_ib;
u16 ocp_reg_mutex_prio;
@@ -250,6 +380,13 @@ rtl8125_oob_mutex_unlock(struct rtl_hw *hw)
return;
switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_52:
@@ -295,34 +432,62 @@ rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr)
}
u32
-rtl_csi_read(struct rtl_hw *hw, u32 addr)
+rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr)
{
u32 cmd;
int i;
- u32 value = 0;
+ u32 value = 0xffffffff;
cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift |
(addr & CSIAR_Addr_Mask);
+ if (multi_fun_sel_bit > 7)
+ goto exit;
+
+ cmd |= multi_fun_sel_bit << 16;
+
RTL_W32(hw, CSIAR, cmd);
- for (i = 0; i < 10; i++) {
- rte_delay_us(100);
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
/* Check if the NIC has completed CSI read */
if (RTL_R32(hw, CSIAR) & CSIAR_Flag) {
- value = RTL_R32(hw, CSIDR);
+ value = (u32)RTL_R32(hw, CSIDR);
break;
}
}
- rte_delay_us(20);
+ rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
+exit:
return value;
}
+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);
+}
+
void
-rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
+rtl_csi_other_fun_write(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr,
+ u32 value)
{
u32 cmd;
int i;
@@ -331,6 +496,11 @@ rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift |
(addr & CSIAR_Addr_Mask);
+ if (multi_fun_sel_bit > 7)
+ return;
+
+ cmd |= multi_fun_sel_bit << 16;
+
RTL_W32(hw, CSIAR, cmd);
for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
@@ -344,14 +514,88 @@ rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
}
+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);
+}
+
+void
+rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
+ u16 setmask)
+{
+ u16 reg_value;
+
+ reg_value = rtl_mac_ocp_read(hw, addr);
+ reg_value &= ~clearmask;
+ reg_value |= setmask;
+ rtl_mac_ocp_write(hw, addr, reg_value);
+}
+
+void
+rtl8168_clear_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
+{
+ rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, mask, 0);
+}
+
+void
+rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
+{
+ rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, 0, mask);
+}
+
static void
rtl_enable_rxdvgate(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_3);
rte_delay_ms(2);
+ break;
}
}
@@ -359,15 +603,44 @@ void
rtl_disable_rxdvgate(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_3);
rte_delay_ms(2);
+ break;
}
}
static void
-rtl_stop_all_request(struct rtl_hw *hw)
+rtl8125_stop_all_request(struct rtl_hw *hw)
{
int i;
@@ -392,14 +665,95 @@ rtl_stop_all_request(struct rtl_hw *hw)
RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb));
}
+static void
+rtl8168_stop_all_request(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rte_delay_ms(2);
+ break;
+ default:
+ rte_delay_ms(10);
+ break;
+ }
+}
+
+static void
+rtl_stop_all_request(struct rtl_hw *hw)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_stop_all_request(hw);
+ else
+ rtl8168_stop_all_request(hw);
+}
+
static void
rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
{
int i;
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ for (i = 0; i < 10; i++) {
+ rte_delay_us(100);
+ if (RTL_R32(hw, TxConfig) & BIT_11)
+ break;
+ }
+
+ for (i = 0; i < 10; i++) {
+ rte_delay_us(100);
+ if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
+ (Txfifo_empty | Rxfifo_empty))
+ break;
+ }
+
+ rte_delay_ms(1);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
for (i = 0; i < 3000; i++) {
rte_delay_us(50);
if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
@@ -412,8 +766,14 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
switch (hw->mcfg) {
case CFG_METHOD_50:
case CFG_METHOD_51:
- case CFG_METHOD_53 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_53:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
for (i = 0; i < 3000; i++) {
rte_delay_us(50);
if ((RTL_R16(hw, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) ==
@@ -473,19 +833,86 @@ rtl_disable_cfg9346_write(struct rtl_hw *hw)
static void
rtl_enable_force_clkreq(struct rtl_hw *hw, bool enable)
{
- if (enable)
- RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7);
- else
- RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ if (enable)
+ RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7);
+ else
+ RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7);
+ break;
+ }
}
static void
rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ if (enable) {
+ RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7);
+ RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
+ } else {
+ RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7);
+ RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
+ }
+ rte_delay_us(10);
+ 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_69:
- rtl_enable_cfg9346_write(hw);
if (enable) {
RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7);
RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
@@ -493,11 +920,9 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7);
RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
}
- rtl_disable_cfg9346_write(hw);
break;
case CFG_METHOD_70:
case CFG_METHOD_71:
- rtl_enable_cfg9346_write(hw);
if (enable) {
RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) | BIT_3);
RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
@@ -505,26 +930,35 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) & ~BIT_3);
RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
}
- rtl_disable_cfg9346_write(hw);
break;
}
}
static void
-rtl_disable_l1_timeout(struct rtl_hw *hw)
+rtl8126_disable_l1_timeout(struct rtl_hw *hw)
{
rtl_csi_write(hw, 0x890, rtl_csi_read(hw, 0x890) & ~BIT_0);
}
static void
-rtl_disable_eee_plus(struct rtl_hw *hw)
+rtl8125_disable_eee_plus(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mac_ocp_write(hw, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1);
break;
-
default:
/* Not support EEEPlus */
break;
@@ -535,8 +969,41 @@ static void
rtl_hw_clear_timer_int(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ RTL_W32(hw, TimeInt0, 0x0000);
+ RTL_W32(hw, TimeInt1, 0x0000);
+ RTL_W32(hw, TimeInt2, 0x0000);
+ RTL_W32(hw, TimeInt3, 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
RTL_W32(hw, TIMER_INT0_8125, 0x0000);
RTL_W32(hw, TIMER_INT1_8125, 0x0000);
RTL_W32(hw, TIMER_INT2_8125, 0x0000);
@@ -546,7 +1013,7 @@ rtl_hw_clear_timer_int(struct rtl_hw *hw)
}
static void
-rtl_hw_clear_int_miti(struct rtl_hw *hw)
+rtl8125_hw_clear_int_miti(struct rtl_hw *hw)
{
int i;
@@ -577,8 +1044,8 @@ rtl_hw_clear_int_miti(struct rtl_hw *hw)
}
}
-void
-rtl_hw_config(struct rtl_hw *hw)
+static void
+rtl8125_hw_config(struct rtl_hw *hw)
{
u32 mac_ocp_data;
@@ -590,18 +1057,24 @@ rtl_hw_config(struct rtl_hw *hw)
rtl_enable_cfg9346_write(hw);
/* Disable aspm clkreq internal */
- switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- rtl_enable_force_clkreq(hw, 0);
- rtl_enable_aspm_clkreq_lock(hw, 0);
- break;
- }
+ rtl_enable_force_clkreq(hw, 0);
+ rtl_enable_aspm_clkreq_lock(hw, 0);
/* Disable magic packet */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
mac_ocp_data = 0;
rtl_mac_ocp_write(hw, 0xC0B6, mac_ocp_data);
break;
@@ -616,21 +1089,38 @@ rtl_hw_config(struct rtl_hw *hw)
/* TCAM */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_53:
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_52:
+ case CFG_METHOD_53:
RTL_W16(hw, 0x382, 0x221B);
break;
}
switch (hw->mcfg) {
- case CFG_METHOD_69 ... CFG_METHOD_71:
- rtl_disable_l1_timeout(hw);
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl8126_disable_l1_timeout(hw);
break;
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
-
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
/* RSS_control_0 */
RTL_W32(hw, RSS_CTRL_8125, 0x00);
@@ -644,33 +1134,17 @@ rtl_hw_config(struct rtl_hw *hw)
rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
- /* New TX desc format */
+ /* Disable new TX desc format */
mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB58);
if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
mac_ocp_data &= ~(BIT_0 | BIT_1);
- mac_ocp_data |= BIT_0;
+ else
+ mac_ocp_data &= ~BIT_0;
rtl_mac_ocp_write(hw, 0xEB58, mac_ocp_data);
if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~BIT_1);
- /*
- * MTPS
- * 15-8 maximum tx use credit number
- * 7-0 reserved for pcie product line
- */
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xE614);
- mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8);
- if (hw->mcfg == CFG_METHOD_50 || hw->mcfg == CFG_METHOD_51 ||
- hw->mcfg == CFG_METHOD_53)
- mac_ocp_data |= ((2 & 0x07) << 8);
- else if (hw->mcfg == CFG_METHOD_69 || hw->mcfg == CFG_METHOD_70 ||
- hw->mcfg == CFG_METHOD_71)
- mac_ocp_data |= ((4 & 0x07) << 8);
- else
- mac_ocp_data |= ((3 & 0x07) << 8);
- rtl_mac_ocp_write(hw, 0xE614, mac_ocp_data);
-
mac_ocp_data = rtl_mac_ocp_read(hw, 0xE63E);
mac_ocp_data &= ~(BIT_5 | BIT_4);
if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
@@ -724,7 +1198,7 @@ rtl_hw_config(struct rtl_hw *hw)
case CFG_METHOD_52:
case CFG_METHOD_54:
case CFG_METHOD_55:
- rtl8125_oob_mutex_lock(hw);
+ rtl_oob_mutex_lock(hw);
break;
}
@@ -740,7 +1214,7 @@ rtl_hw_config(struct rtl_hw *hw)
case CFG_METHOD_52:
case CFG_METHOD_54:
case CFG_METHOD_55:
- rtl8125_oob_mutex_unlock(hw);
+ rtl_oob_mutex_unlock(hw);
break;
}
@@ -766,7 +1240,7 @@ rtl_hw_config(struct rtl_hw *hw)
hw->mcfg == CFG_METHOD_52)
RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0);
- rtl_disable_eee_plus(hw);
+ rtl8125_disable_eee_plus(hw);
mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
mac_ocp_data &= ~BIT_2;
@@ -782,7 +1256,10 @@ rtl_hw_config(struct rtl_hw *hw)
RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5));
switch (hw->mcfg) {
- case CFG_METHOD_54 ... CFG_METHOD_57:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
RTL_W8(hw, 0xd8, RTL_R8(hw, 0xd8) & ~EnableRxDescV4_0);
break;
}
@@ -791,24 +1268,223 @@ rtl_hw_config(struct rtl_hw *hw)
/* Other hw parameters */
rtl_hw_clear_timer_int(hw);
- rtl_hw_clear_int_miti(hw);
+ rtl8125_hw_clear_int_miti(hw);
+
+ switch (hw->mcfg) {
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_mac_ocp_write(hw, 0xE098, 0xC302);
+ break;
+ }
+
+ rtl_disable_cfg9346_write(hw);
+
+ rte_delay_us(10);
+}
+
+static void
+rtl8168_hw_config(struct rtl_hw *hw)
+{
+ u32 csi_tmp;
+ int timeout;
+
+ rtl_nic_reset(hw);
+
+ rtl_enable_cfg9346_write(hw);
+
+ /* Disable aspm clkreq internal */
+ rtl_enable_force_clkreq(hw, 0);
+ rtl_enable_aspm_clkreq_lock(hw, 0);
+
+ /* Clear io_rdy_l23 */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~BIT_1);
+ break;
+ }
+
+ /* Keep magic packet only */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_eri_read(hw, 0xDE, 1, ERIAR_ExGMAC);
+ csi_tmp &= BIT_0;
+ rtl_eri_write(hw, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
+ break;
+ }
+
+ /* Set TxConfig to default */
+ RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
+ (InterFrameGap << TxInterFrameGapShift));
+
+ hw->hw_ops.hw_config(hw);
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ rtl_eri_write(hw, 0x2F8, 2, 0x1D8F, ERIAR_ExGMAC);
+ break;
+ }
+
+ rtl_hw_clear_timer_int(hw);
+
+ /* Clkreq exit masks */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_eri_read(hw, 0xD4, 4, ERIAR_ExGMAC);
+ csi_tmp |= (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
+ rtl_eri_write(hw, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
+ break;
+ }
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_25:
+ rtl_mac_ocp_write(hw, 0xD3C0, 0x0B00);
+ rtl_mac_ocp_write(hw, 0xD3C2, 0x0000);
+ break;
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mac_ocp_write(hw, 0xE098, 0x0AA2);
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
rtl_mac_ocp_write(hw, 0xE098, 0xC302);
break;
}
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ for (timeout = 0; timeout < 10; timeout++) {
+ if ((rtl_eri_read(hw, 0x1AE, 2, ERIAR_ExGMAC) & BIT_13) == 0)
+ break;
+ rte_delay_ms(1);
+ }
+ break;
+ }
+
rtl_disable_cfg9346_write(hw);
rte_delay_us(10);
}
+void
+rtl_hw_config(struct rtl_hw *hw)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_hw_config(hw);
+ else
+ rtl8168_hw_config(hw);
+}
+
int
rtl_set_hw_ops(struct rtl_hw *hw)
{
switch (hw->mcfg) {
+ /* 8168G */
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ /* 8168GU */
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ hw->hw_ops = rtl8168g_ops;
+ return 0;
+ /* 8168EP */
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ hw->hw_ops = rtl8168ep_ops;
+ return 0;
+ /* 8168H */
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ hw->hw_ops = rtl8168h_ops;
+ return 0;
+ /* 8168FP */
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ hw->hw_ops = rtl8168fp_ops;
+ return 0;
+ /* 8168M */
+ case CFG_METHOD_37:
+ hw->hw_ops = rtl8168m_ops;
+ return 0;
/* 8125A */
case CFG_METHOD_48:
case CFG_METHOD_49:
@@ -835,7 +1511,9 @@ rtl_set_hw_ops(struct rtl_hw *hw)
hw->hw_ops = rtl8125d_ops;
return 0;
/* 8126A */
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->hw_ops = rtl8126a_ops;
return 0;
default:
@@ -848,23 +1526,80 @@ rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw)
{
u16 reg_addr;
+ rtl_enable_cfg9346_write(hw);
rtl_enable_aspm_clkreq_lock(hw, 0);
+ rtl_disable_cfg9346_write(hw);
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mac_ocp_write(hw, 0xFC38, 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mac_ocp_write(hw, 0xFC48, 0x0000);
break;
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2)
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ for (reg_addr = 0xFC28; reg_addr < 0xFC38; reg_addr += 2)
rtl_mac_ocp_write(hw, reg_addr, 0x0000);
rte_delay_ms(3);
+ rtl_mac_ocp_write(hw, 0xFC26, 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2)
+ rtl_mac_ocp_write(hw, reg_addr, 0x0000);
+ rte_delay_ms(3);
rtl_mac_ocp_write(hw, 0xFC26, 0x0000);
break;
}
@@ -973,7 +1708,7 @@ rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex,
u64 adv;
if (!rtl_is_speed_mode_valid(speed))
- speed = SPEED_5000;
+ speed = SPEED_1000;
if (!rtl_is_duplex_mode_valid(duplex))
duplex = DUPLEX_FULL;
@@ -1009,12 +1744,46 @@ static void
rtl_init_software_variable(struct rtl_hw *hw)
{
int tx_no_close_enable = 1;
- unsigned int speed_mode = SPEED_5000;
+ unsigned int speed_mode;
unsigned int duplex_mode = DUPLEX_FULL;
unsigned int autoneg_mode = AUTONEG_ENABLE;
- u8 tmp;
+ u32 tmp;
+
+ switch (hw->mcfg) {
+ 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:
+ speed_mode = SPEED_2500;
+ break;
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ speed_mode = SPEED_5000;
+ break;
+ default:
+ speed_mode = SPEED_1000;
+ break;
+ }
switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ hw->HwSuppDashVer = 2;
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ hw->HwSuppDashVer = 3;
+ break;
case CFG_METHOD_48:
case CFG_METHOD_49:
tmp = (u8)rtl_mac_ocp_read(hw, 0xD006);
@@ -1031,6 +1800,41 @@ rtl_init_software_variable(struct rtl_hw *hw)
}
switch (hw->mcfg) {
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ tmp = rtl_mac_ocp_read(hw, 0xDC00);
+ hw->HwPkgDet = (tmp >> 3) & 0x0F;
+ break;
+ }
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ if (hw->HwPkgDet == 0x06) {
+ tmp = rtl_eri_read(hw, 0xE6, 1, ERIAR_ExGMAC);
+ if (tmp == 0x02)
+ hw->HwSuppSerDesPhyVer = 1;
+ else if (tmp == 0x00)
+ hw->HwSuppSerDesPhyVer = 2;
+ }
+ break;
+ }
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ hw->HwSuppOcpChannelVer = 2;
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ hw->HwSuppOcpChannelVer = 3;
+ break;
case CFG_METHOD_48:
case CFG_METHOD_49:
if (HW_DASH_SUPPORT_DASH(hw))
@@ -1040,9 +1844,13 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_55:
hw->HwSuppOcpChannelVer = 2;
break;
+ default:
+ hw->HwSuppOcpChannelVer = 0;
+ break;
}
- hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw);
+ if (rtl_is_8125(hw))
+ hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw);
if (HW_DASH_SUPPORT_DASH(hw) && rtl_check_dash(hw))
hw->DASH = 1;
@@ -1053,6 +1861,32 @@ rtl_init_software_variable(struct rtl_hw *hw)
hw->cmac_ioaddr = hw->mmio_addr;
switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ hw->chipset_name = RTL8168G;
+ break;
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ hw->chipset_name = RTL8168EP;
+ break;
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ hw->chipset_name = RTL8168H;
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ hw->chipset_name = RTL8168FP;
+ break;
+ case CFG_METHOD_37:
+ hw->chipset_name = RTL8168M;
+ break;
case CFG_METHOD_48:
case CFG_METHOD_49:
hw->chipset_name = RTL8125A;
@@ -1073,7 +1907,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_57:
hw->chipset_name = RTL8125D;
break;
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->chipset_name = RTL8126A;
break;
default:
@@ -1082,23 +1918,91 @@ rtl_init_software_variable(struct rtl_hw *hw)
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->HwSuppNowIsOobVer = 1;
+ break;
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ hw->HwSuppCheckPhyDisableModeVer = 2;
+ break;
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->HwSuppCheckPhyDisableModeVer = 3;
+ break;
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_51:
- case CFG_METHOD_54 ... CFG_METHOD_57:
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
hw->HwSuppMaxPhyLinkSpeed = SPEED_2500;
break;
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->HwSuppMaxPhyLinkSpeed = SPEED_5000;
break;
default:
@@ -1107,10 +2011,18 @@ rtl_init_software_variable(struct rtl_hw *hw)
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_53:
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_52:
+ case CFG_METHOD_53:
hw->HwSuppTxNoCloseVer = 3;
break;
- case CFG_METHOD_54 ... CFG_METHOD_57:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
hw->HwSuppTxNoCloseVer = 6;
break;
case CFG_METHOD_69:
@@ -1158,6 +2070,41 @@ rtl_init_software_variable(struct rtl_hw *hw)
}
switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_21;
+ break;
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_23;
+ break;
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_24;
+ break;
+ case CFG_METHOD_26:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_26;
+ break;
+ case CFG_METHOD_28:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_28;
+ break;
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_37:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_29;
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_31;
+ break;
+ case CFG_METHOD_35:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_35;
+ break;
+ case CFG_METHOD_36:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_36;
+ break;
case CFG_METHOD_48:
hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_48;
break;
@@ -1201,15 +2148,37 @@ rtl_init_software_variable(struct rtl_hw *hw)
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->HwSuppMacMcuVer = 2;
break;
}
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->MacMcuPageSize = RTL_MAC_MCU_PAGE_SIZE;
break;
}
@@ -1235,7 +2204,10 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_69:
hw->HwSuppIntMitiVer = 4;
break;
- case CFG_METHOD_54 ... CFG_METHOD_57:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
hw->HwSuppIntMitiVer = 6;
break;
case CFG_METHOD_70:
@@ -1247,8 +2219,19 @@ rtl_init_software_variable(struct rtl_hw *hw)
rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, rtl_fc_full);
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
hw->mcu_pme_setting = rtl_mac_ocp_read(hw, 0xE00A);
break;
}
@@ -1259,13 +2242,69 @@ rtl_init_software_variable(struct rtl_hw *hw)
static void
rtl_exit_realwow(struct rtl_hw *hw)
{
+ u32 csi_tmp;
+
/* Disable realwow function */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ RTL_W32(hw, MACOCP, 0x605E0000);
+ RTL_W32(hw, MACOCP, (0xE05E << 16) |
+ (RTL_R32(hw, MACOCP) & 0xFFFE));
+ RTL_W32(hw, MACOCP, 0xE9720000);
+ RTL_W32(hw, MACOCP, 0xF2140010);
+ break;
+ case CFG_METHOD_26:
+ RTL_W32(hw, MACOCP, 0xE05E00FF);
+ RTL_W32(hw, MACOCP, 0xE9720000);
+ rtl_mac_ocp_write(hw, 0xE428, 0x0010);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mac_ocp_write(hw, 0xC0BC, 0x00FF);
break;
}
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ rtl_eri_write(hw, 0x174, 2, 0x0000, ERIAR_ExGMAC);
+ rtl_mac_ocp_write(hw, 0xE428, 0x0010);
+ break;
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ rtl_eri_write(hw, 0x174, 2, 0x00FF, ERIAR_ExGMAC);
+ rtl_mac_ocp_write(hw, 0xE428, 0x0010);
+ break;
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_eri_read(hw, 0x174, 2, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_8;
+ csi_tmp |= BIT_15;
+ rtl_eri_write(hw, 0x174, 2, csi_tmp, ERIAR_ExGMAC);
+ rtl_mac_ocp_write(hw, 0xE428, 0x0010);
+ break;
+ }
}
static void
@@ -1287,6 +2326,20 @@ rtl_wait_ll_share_fifo_ready(struct rtl_hw *hw)
}
}
+static void
+rtl8168_switch_to_sgmii_mode(struct rtl_hw *hw)
+{
+ if (!HW_SUPP_SERDES_PHY(hw))
+ return;
+
+ switch (hw->HwSuppSerDesPhyVer) {
+ case 1:
+ rtl_mac_ocp_write(hw, 0xEB00, 0x2);
+ rtl8168_set_mcu_ocp_bit(hw, 0xEB16, BIT_1);
+ break;
+ }
+}
+
static void
rtl_exit_oob(struct rtl_hw *hw)
{
@@ -1294,9 +2347,14 @@ rtl_exit_oob(struct rtl_hw *hw)
rtl_disable_rx_packet_filter(hw);
+ if (HW_SUPP_SERDES_PHY(hw)) {
+ if (hw->HwSuppSerDesPhyVer == 1)
+ rtl8168_switch_to_sgmii_mode(hw);
+ }
+
if (HW_DASH_SUPPORT_DASH(hw)) {
- rtl8125_driver_start(hw);
- rtl8125_dash2_disable_txrx(hw);
+ rtl_driver_start(hw);
+ rtl_dash2_disable_txrx(hw);
}
rtl_exit_realwow(hw);
@@ -1304,8 +2362,47 @@ rtl_exit_oob(struct rtl_hw *hw)
rtl_nic_reset(hw);
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_disable_now_is_oob(hw);
+
+ data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14;
+ rtl_mac_ocp_write(hw, 0xE8DE, data16);
+ rtl_wait_ll_share_fifo_ready(hw);
+
+ data16 = rtl_mac_ocp_read(hw, 0xE8DE) | BIT_15;
+ rtl_mac_ocp_write(hw, 0xE8DE, data16);
+
+ rtl_wait_ll_share_fifo_ready(hw);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_disable_now_is_oob(hw);
data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14;
@@ -1327,20 +2424,66 @@ static void
rtl_disable_ups(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- rtl_mac_ocp_write(hw, 0xD40A, rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4);
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ rtl_mac_ocp_write(hw, 0xD400,
+ rtl_mac_ocp_read(hw, 0xD400) & ~BIT_0);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_mac_ocp_write(hw, 0xD40A,
+ rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4);
break;
}
}
static void
-rtl8125_disable_ocp_phy_power_saving(struct rtl_hw *hw)
+rtl_disable_ocp_phy_power_saving(struct rtl_hw *hw)
{
u16 val;
- if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
- hw->mcfg == CFG_METHOD_52) {
+ switch (hw->mcfg) {
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ val = rtl_mdio_real_read_phy_ocp(hw, 0x0C41, 0x13);
+ if (val != 0x0500) {
+ rtl_set_phy_mcu_patch_request(hw);
+ rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0000);
+ rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0500);
+ rtl_clear_phy_mcu_patch_request(hw);
+ }
+ break;
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_52:
val = rtl_mdio_direct_read_phy_ocp(hw, 0xC416);
if (val != 0x0050) {
rtl_set_phy_mcu_patch_request(hw);
@@ -1348,26 +2491,108 @@ rtl8125_disable_ocp_phy_power_saving(struct rtl_hw *hw)
rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0500);
rtl_clear_phy_mcu_patch_request(hw);
}
+ break;
}
}
static void
-rtl_hw_init(struct rtl_hw *hw)
+rtl8168_disable_dma_agg(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- rtl_enable_aspm_clkreq_lock(hw, 0);
- rtl_enable_force_clkreq(hw, 0);
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mac_ocp_write(hw, 0xE63E, rtl_mac_ocp_read(hw, 0xE63E) &
+ ~(BIT_3 | BIT_2 | BIT_1));
+ rtl_mac_ocp_write(hw, 0xE63E,
+ rtl_mac_ocp_read(hw, 0xE63E) | (BIT_0));
+ rtl_mac_ocp_write(hw, 0xE63E,
+ rtl_mac_ocp_read(hw, 0xE63E) & ~(BIT_0));
+ rtl_mac_ocp_write(hw, 0xC094, 0x0);
+ rtl_mac_ocp_write(hw, 0xC09E, 0x0);
break;
}
+}
+
+static void
+rtl_hw_init(struct rtl_hw *hw)
+{
+ u32 csi_tmp;
+
+ /* Disable aspm clkreq internal */
+ rtl_enable_force_clkreq(hw, 0);
+ rtl_enable_cfg9346_write(hw);
+ rtl_enable_aspm_clkreq_lock(hw, 0);
+ rtl_disable_cfg9346_write(hw);
rtl_disable_ups(hw);
+ /* Disable DMA aggregation */
+ rtl8168_disable_dma_agg(hw);
+
hw->hw_ops.hw_mac_mcu_config(hw);
/* Disable ocp phy power saving */
- rtl8125_disable_ocp_phy_power_saving(hw);
+ rtl_disable_ocp_phy_power_saving(hw);
+
+ /* Set PCIE uncorrectable error status mask pcie 0x108 */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_csi_read(hw, 0x108);
+ csi_tmp |= BIT_20;
+ rtl_csi_write(hw, 0x108, csi_tmp);
+ break;
+ }
+
+ /* MCU PME setting */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
+ csi_tmp |= (BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
+ rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
+ break;
+ case CFG_METHOD_25:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
+ csi_tmp |= (BIT_3 | BIT_6);
+ rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
+ break;
+ }
}
void
@@ -1393,33 +2618,200 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
ic_version_id = val32 & 0x00700000;
switch (reg) {
+ case 0x30000000:
+ hw->mcfg = CFG_METHOD_1;
+ break;
+ case 0x38000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_2;
+ } else if (ic_version_id == 0x00500000) {
+ hw->mcfg = CFG_METHOD_3;
+ } else {
+ hw->mcfg = CFG_METHOD_3;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x3C000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_4;
+ } else if (ic_version_id == 0x00200000) {
+ hw->mcfg = CFG_METHOD_5;
+ } else if (ic_version_id == 0x00400000) {
+ hw->mcfg = CFG_METHOD_6;
+ } else {
+ hw->mcfg = CFG_METHOD_6;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x3C800000:
+ if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_7;
+ } else if (ic_version_id == 0x00300000) {
+ hw->mcfg = CFG_METHOD_8;
+ } else {
+ hw->mcfg = CFG_METHOD_8;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x28000000:
+ if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_9;
+ } else if (ic_version_id == 0x00300000) {
+ hw->mcfg = CFG_METHOD_10;
+ } else {
+ hw->mcfg = CFG_METHOD_10;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x28800000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_11;
+ } else if (ic_version_id == 0x00200000) {
+ hw->mcfg = CFG_METHOD_12;
+ RTL_W32(hw, 0xD0, RTL_R32(hw, 0xD0) | 0x00020000);
+ } else if (ic_version_id == 0x00300000) {
+ hw->mcfg = CFG_METHOD_13;
+ } else {
+ hw->mcfg = CFG_METHOD_13;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x2C000000:
+ if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_14;
+ } else if (ic_version_id == 0x00200000) {
+ hw->mcfg = CFG_METHOD_15;
+ } else {
+ hw->mcfg = CFG_METHOD_15;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x2C800000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_16;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_17;
+ } else {
+ hw->mcfg = CFG_METHOD_17;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x48000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_18;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_19;
+ } else {
+ hw->mcfg = CFG_METHOD_19;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x48800000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_20;
+ } else {
+ hw->mcfg = CFG_METHOD_20;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x4C000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_21;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_22;
+ } else {
+ hw->mcfg = CFG_METHOD_22;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x50000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_23;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_27;
+ } else if (ic_version_id == 0x00200000) {
+ hw->mcfg = CFG_METHOD_28;
+ } else {
+ hw->mcfg = CFG_METHOD_28;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x50800000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_24;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_25;
+ } else {
+ hw->mcfg = CFG_METHOD_25;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x5C800000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_26;
+ } else {
+ hw->mcfg = CFG_METHOD_26;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x54000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_29;
+ } else if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_30;
+ } else {
+ hw->mcfg = CFG_METHOD_30;
+ hw->HwIcVerUnknown = TRUE;
+ }
+
+ if (hw->mcfg == CFG_METHOD_30) {
+ if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0100)
+ hw->mcfg = CFG_METHOD_35;
+ else if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0300)
+ hw->mcfg = CFG_METHOD_36;
+ }
+ break;
+ case 0x6C000000:
+ if (ic_version_id == 0x00000000) {
+ hw->mcfg = CFG_METHOD_37;
+ } else {
+ hw->mcfg = CFG_METHOD_37;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
+ case 0x54800000:
+ if (ic_version_id == 0x00100000) {
+ hw->mcfg = CFG_METHOD_31;
+ } else if (ic_version_id == 0x00200000) {
+ hw->mcfg = CFG_METHOD_32;
+ } else if (ic_version_id == 0x00300000) {
+ hw->mcfg = CFG_METHOD_33;
+ } else if (ic_version_id == 0x00400000) {
+ hw->mcfg = CFG_METHOD_34;
+ } else {
+ hw->mcfg = CFG_METHOD_34;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
case 0x60800000:
if (ic_version_id == 0x00000000) {
hw->mcfg = CFG_METHOD_48;
-
} else if (ic_version_id == 0x100000) {
hw->mcfg = CFG_METHOD_49;
-
} else {
hw->mcfg = CFG_METHOD_49;
hw->HwIcVerUnknown = TRUE;
}
-
- hw->efuse_ver = EFUSE_SUPPORT_V4;
break;
case 0x64000000:
if (ic_version_id == 0x00000000) {
hw->mcfg = CFG_METHOD_50;
-
} else if (ic_version_id == 0x100000) {
hw->mcfg = CFG_METHOD_51;
-
} else {
hw->mcfg = CFG_METHOD_51;
hw->HwIcVerUnknown = TRUE;
}
-
- hw->efuse_ver = EFUSE_SUPPORT_V4;
break;
case 0x68000000:
if (ic_version_id == 0x00000000) {
@@ -1430,8 +2822,6 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
hw->mcfg = CFG_METHOD_55;
hw->HwIcVerUnknown = TRUE;
}
-
- hw->efuse_ver = EFUSE_SUPPORT_V4;
break;
case 0x68800000:
if (ic_version_id == 0x00000000) {
@@ -1442,8 +2832,6 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
hw->mcfg = CFG_METHOD_57;
hw->HwIcVerUnknown = TRUE;
}
-
- hw->efuse_ver = EFUSE_SUPPORT_V4;
break;
case 0x64800000:
if (ic_version_id == 0x00000000) {
@@ -1456,14 +2844,11 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
hw->mcfg = CFG_METHOD_71;
hw->HwIcVerUnknown = TRUE;
}
-
- hw->efuse_ver = EFUSE_SUPPORT_V4;
break;
default:
PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg);
hw->mcfg = CFG_METHOD_DEFAULT;
hw->HwIcVerUnknown = TRUE;
- hw->efuse_ver = EFUSE_NOT_SUPPORT;
break;
}
@@ -1478,11 +2863,42 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
int
rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea)
{
- u8 mac_addr[MAC_ADDR_LEN] = {0};
+ u8 mac_addr[RTE_ETHER_ADDR_LEN] = {0};
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ *(u32 *)&mac_addr[0] = rtl_eri_read(hw, 0xE0, 4, ERIAR_ExGMAC);
+ *(u16 *)&mac_addr[4] = rtl_eri_read(hw, 0xE4, 2, ERIAR_ExGMAC);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
*(u32 *)&mac_addr[0] = RTL_R32(hw, BACKUP_ADDR0_8125);
*(u16 *)&mac_addr[4] = RTL_R16(hw, BACKUP_ADDR1_8125);
break;
@@ -1495,6 +2911,7 @@ rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea)
return 0;
}
+/* Puts an ethernet address into a receive address register. */
void
rtl_rar_set(struct rtl_hw *hw, uint8_t *addr)
{
@@ -1593,3 +3010,9 @@ rtl_tally_free(struct rte_eth_dev *dev)
{
rte_eth_dma_zone_free(dev, "tally_counters", 0);
}
+
+bool
+rtl_is_8125(struct rtl_hw *hw)
+{
+ return hw->mcfg >= CFG_METHOD_48;
+}
diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h
index e7c4bf1abc..7cc4ee527f 100644
--- a/drivers/net/r8169/r8169_hw.h
+++ b/drivers/net/r8169/r8169_hw.h
@@ -30,8 +30,8 @@ void rtl_nic_reset(struct rtl_hw *hw);
void rtl_enable_cfg9346_write(struct rtl_hw *hw);
void rtl_disable_cfg9346_write(struct rtl_hw *hw);
-void rtl8125_oob_mutex_lock(struct rtl_hw *hw);
-void rtl8125_oob_mutex_unlock(struct rtl_hw *hw);
+void rtl_oob_mutex_lock(struct rtl_hw *hw);
+void rtl_oob_mutex_unlock(struct rtl_hw *hw);
void rtl_disable_rxdvgate(struct rtl_hw *hw);
@@ -60,6 +60,24 @@ void rtl_clear_tally_stats(struct rtl_hw *hw);
int rtl_tally_init(struct rte_eth_dev *dev);
void rtl_tally_free(struct rte_eth_dev *dev);
+bool rtl_is_8125(struct rtl_hw *hw);
+
+u32 rtl_eri_read(struct rtl_hw *hw, int addr, int len, int type);
+int rtl_eri_write(struct rtl_hw *hw, int addr, int len, u32 value, int type);
+
+u32 rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr);
+void rtl_csi_other_fun_write(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr,
+ u32 value);
+void rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr,
+ u16 clearmask, u16 setmask);
+void rtl8168_clear_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
+void rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
+
+extern const struct rtl_hw_ops rtl8168g_ops;
+extern const struct rtl_hw_ops rtl8168h_ops;
+extern const struct rtl_hw_ops rtl8168ep_ops;
+extern const struct rtl_hw_ops rtl8168fp_ops;
+extern const struct rtl_hw_ops rtl8168m_ops;
extern const struct rtl_hw_ops rtl8125a_ops;
extern const struct rtl_hw_ops rtl8125b_ops;
extern const struct rtl_hw_ops rtl8125bp_ops;
@@ -67,7 +85,8 @@ extern const struct rtl_hw_ops rtl8125d_ops;
extern const struct rtl_hw_ops rtl8126a_ops;
extern const struct rtl_hw_ops rtl8168kb_ops;
-#define NO_BASE_ADDRESS 0x00000000
+#define NO_BASE_ADDRESS 0x00000000
+#define RTL8168FP_OOBMAC_BASE 0xBAF70000
/* Channel wait count */
#define RTL_CHANNEL_WAIT_COUNT 20000
@@ -80,15 +99,24 @@ extern const struct rtl_hw_ops rtl8168kb_ops;
#define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M) ((_M)->HwHasWrRamCodeToMicroP ? 1 : 0)
/* Tx NO CLOSE */
-#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000
-#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2 0xFFFF
-#define MAX_TX_NO_CLOSE_DESC_PTR_V3 0x100000000
-#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3 0xFFFFFFFF
-#define MAX_TX_NO_CLOSE_DESC_PTR_V4 0x80000000
-#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4 0x7FFFFFFF
-#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF
+#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000
+#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2 0xFFFF
+#define MAX_TX_NO_CLOSE_DESC_PTR_V3 0x100000000
+#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3 0xFFFFFFFF
+#define MAX_TX_NO_CLOSE_DESC_PTR_V4 0x80000000
+#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4 0x7FFFFFFF
+#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF
/* Ram code version */
+#define NIC_RAMCODE_VERSION_CFG_METHOD_21 (0x0042)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_24 (0x0001)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_23 (0x0015)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_26 (0x0012)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_28 (0x0019)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_29 (0x0083)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_31 (0x0003)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_35 (0x0027)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_36 (0x0000)
#define NIC_RAMCODE_VERSION_CFG_METHOD_48 (0x0b11)
#define NIC_RAMCODE_VERSION_CFG_METHOD_49 (0x0b33)
#define NIC_RAMCODE_VERSION_CFG_METHOD_50 (0x0b17)
@@ -104,12 +132,4 @@ extern const struct rtl_hw_ops rtl8168kb_ops;
#define RTL_MAC_MCU_PAGE_SIZE 256
#define RTL_DEFAULT_MTU 1500
-enum effuse {
- EFUSE_NOT_SUPPORT = 0,
- EFUSE_SUPPORT_V1,
- EFUSE_SUPPORT_V2,
- EFUSE_SUPPORT_V3,
- EFUSE_SUPPORT_V4,
-};
-
#endif /* R8169_HW_H */
diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c
index cc8efe80f2..ce16ab3242 100644
--- a/drivers/net/r8169/r8169_phy.c
+++ b/drivers/net/r8169/r8169_phy.c
@@ -13,6 +13,7 @@
#include "r8169_hw.h"
#include "r8169_phy.h"
#include "r8169_logs.h"
+#include "r8169_dash.h"
static void
rtl_clear_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
@@ -68,7 +69,7 @@ rtl_map_phy_ocp_addr(u16 PageNum, u8 RegNum)
}
static u32
-rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
+rtl_mdio_real_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
{
u32 data32;
int i, value = 0;
@@ -77,8 +78,8 @@ rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
data32 <<= OCPR_Addr_Reg_shift;
RTL_W32(hw, PHYOCP, data32);
- for (i = 0; i < 100; i++) {
- rte_delay_us(1);
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
if (RTL_R32(hw, PHYOCP) & OCPR_Flag)
break;
@@ -91,27 +92,33 @@ rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
u32
rtl_mdio_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr)
{
- return rtl_mdio_real_read_phy_ocp(hw, RegAddr);
+ return rtl_mdio_real_direct_read_phy_ocp(hw, RegAddr);
}
-static u32
-rtl_mdio_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr)
+u32
+rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr)
{
u16 ocp_addr;
ocp_addr = rtl_map_phy_ocp_addr(PageNum, RegAddr);
- return rtl_mdio_direct_read_phy_ocp(hw, ocp_addr);
+ return rtl_mdio_real_direct_read_phy_ocp(hw, ocp_addr);
}
static u32
rtl_mdio_real_read(struct rtl_hw *hw, u32 RegAddr)
{
- return rtl_mdio_read_phy_ocp(hw, hw->cur_page, RegAddr);
+ return rtl_mdio_real_read_phy_ocp(hw, hw->cur_page, RegAddr);
+}
+
+u32
+rtl_mdio_read(struct rtl_hw *hw, u32 RegAddr)
+{
+ return rtl_mdio_real_read(hw, RegAddr);
}
static void
-rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
+rtl_mdio_real_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
{
u32 data32;
int i;
@@ -121,8 +128,8 @@ rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
data32 |= OCPR_Write | value;
RTL_W32(hw, PHYOCP, data32);
- for (i = 0; i < 100; i++) {
- rte_delay_us(1);
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
if (!(RTL_R32(hw, PHYOCP) & OCPR_Flag))
break;
@@ -132,11 +139,11 @@ rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
void
rtl_mdio_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value)
{
- rtl_mdio_real_write_phy_ocp(hw, RegAddr, value);
+ rtl_mdio_real_direct_write_phy_ocp(hw, RegAddr, value);
}
-static void
-rtl_mdio_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value)
+void
+rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value)
{
u16 ocp_addr;
@@ -148,15 +155,11 @@ rtl_mdio_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value)
static void
rtl_mdio_real_write(struct rtl_hw *hw, u32 RegAddr, u32 value)
{
- if (RegAddr == 0x1F)
+ if (RegAddr == 0x1F) {
hw->cur_page = value;
- rtl_mdio_write_phy_ocp(hw, hw->cur_page, RegAddr, value);
-}
-
-u32
-rtl_mdio_read(struct rtl_hw *hw, u32 RegAddr)
-{
- return rtl_mdio_real_read(hw, RegAddr);
+ return;
+ }
+ rtl_mdio_real_write_phy_ocp(hw, hw->cur_page, RegAddr, value);
}
void
@@ -189,37 +192,67 @@ rtl_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
rtl_clear_and_set_eth_phy_ocp_bit(hw, addr, 0, mask);
}
+static u8
+rtl8168_check_ephy_addr(struct rtl_hw *hw, int addr)
+{
+ if (hw->mcfg != CFG_METHOD_35 && hw->mcfg != CFG_METHOD_36)
+ goto exit;
+
+ if (addr & (BIT_6 | BIT_5))
+ rtl8168_clear_and_set_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0),
+ (addr >> 5) & (BIT_1 | BIT_0));
+
+ addr &= 0x1F;
+
+exit:
+ return addr;
+}
+
void
rtl_ephy_write(struct rtl_hw *hw, int addr, int value)
{
int i;
+ unsigned int mask;
- RTL_W32(hw, EPHYAR, EPHYAR_Write |
- (addr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift |
+ if (rtl_is_8125(hw)) {
+ mask = EPHYAR_Reg_Mask_v2;
+ } else {
+ mask = EPHYAR_Reg_Mask;
+ addr = rtl8168_check_ephy_addr(hw, addr);
+ }
+
+ RTL_W32(hw, EPHYAR, EPHYAR_Write | (addr & mask) << EPHYAR_Reg_shift |
(value & EPHYAR_Data_Mask));
- for (i = 0; i < 10; i++) {
- rte_delay_us(100);
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
/* Check if the NIC has completed EPHY write */
if (!(RTL_R32(hw, EPHYAR) & EPHYAR_Flag))
break;
}
- rte_delay_us(20);
+ rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
}
-static u16
+u16
rtl_ephy_read(struct rtl_hw *hw, int addr)
{
int i;
u16 value = 0xffff;
+ unsigned int mask;
+
+ if (rtl_is_8125(hw)) {
+ mask = EPHYAR_Reg_Mask_v2;
+ } else {
+ mask = EPHYAR_Reg_Mask;
+ addr = rtl8168_check_ephy_addr(hw, addr);
+ }
- RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & EPHYAR_Reg_Mask_v2) <<
- EPHYAR_Reg_shift);
+ RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & mask) << EPHYAR_Reg_shift);
- for (i = 0; i < 10; i++) {
- rte_delay_us(100);
+ for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
+ rte_delay_us(RTL_CHANNEL_WAIT_TIME);
/* Check if the NIC has completed EPHY read */
if (RTL_R32(hw, EPHYAR) & EPHYAR_Flag) {
@@ -228,7 +261,7 @@ rtl_ephy_read(struct rtl_hw *hw, int addr)
}
}
- rte_delay_us(20);
+ rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
return value;
}
@@ -264,18 +297,66 @@ rtl_set_phy_mcu_patch_request(struct rtl_hw *hw)
u16 wait_cnt;
bool bool_success = TRUE;
- rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ rtl_set_eth_phy_bit(hw, 0x10, BIT_4);
+
+ rtl_mdio_write(hw, 0x1f, 0x0B80);
+ wait_cnt = 0;
+ do {
+ gphy_val = rtl_mdio_read(hw, 0x10);
+ rte_delay_us(100);
+ wait_cnt++;
+ } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
- wait_cnt = 0;
- do {
- gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
- rte_delay_us(100);
- wait_cnt++;
- } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
+ if (!(gphy_val & BIT_6) && wait_cnt == 1000)
+ bool_success = FALSE;
- if (!(gphy_val & BIT_6) && wait_cnt == 1000)
- bool_success = FALSE;
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
+
+ wait_cnt = 0;
+ do {
+ gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
+ rte_delay_us(100);
+ wait_cnt++;
+ } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
+ if (!(gphy_val & BIT_6) && wait_cnt == 1000)
+ bool_success = FALSE;
+ break;
+ }
if (!bool_success)
PMD_INIT_LOG(NOTICE, "%s fail.", __func__);
@@ -289,17 +370,66 @@ rtl_clear_phy_mcu_patch_request(struct rtl_hw *hw)
u16 wait_cnt;
bool bool_success = TRUE;
- rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ rtl_clear_eth_phy_bit(hw, 0x10, BIT_4);
+
+ rtl_mdio_write(hw, 0x1f, 0x0B80);
+ wait_cnt = 0;
+ do {
+ gphy_val = rtl_mdio_read(hw, 0x10);
+ rte_delay_us(100);
+ wait_cnt++;
+ } while ((gphy_val & BIT_6) && (wait_cnt < 1000));
+
+ if ((gphy_val & BIT_6) && wait_cnt == 1000)
+ bool_success = FALSE;
- wait_cnt = 0;
- do {
- gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
- rte_delay_us(100);
- wait_cnt++;
- } while ((gphy_val & BIT_6) && (wait_cnt < 1000));
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
+
+ wait_cnt = 0;
+ do {
+ gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
+ rte_delay_us(100);
+ wait_cnt++;
+ } while ((gphy_val & BIT_6) && (wait_cnt < 1000));
- if ((gphy_val & BIT_6) && wait_cnt == 1000)
- bool_success = FALSE;
+ if ((gphy_val & BIT_6) && wait_cnt == 1000)
+ bool_success = FALSE;
+ break;
+ }
if (!bool_success)
PMD_INIT_LOG(NOTICE, "%s fail.", __func__);
@@ -335,6 +465,11 @@ rtl_is_phy_disable_mode_enabled(struct rtl_hw *hw)
u8 phy_disable_mode_enabled = FALSE;
switch (hw->HwSuppCheckPhyDisableModeVer) {
+ case 1:
+ if (rtl_mac_ocp_read(hw, 0xDC20) & BIT_1)
+ phy_disable_mode_enabled = TRUE;
+ break;
+ case 2:
case 3:
if (RTL_R8(hw, 0xF2) & BIT_5)
phy_disable_mode_enabled = TRUE;
@@ -350,6 +485,11 @@ rtl_is_gpio_low(struct rtl_hw *hw)
u8 gpio_low = FALSE;
switch (hw->HwSuppCheckPhyDisableModeVer) {
+ case 1:
+ case 2:
+ if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_9))
+ gpio_low = TRUE;
+ break;
case 3:
if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_13))
gpio_low = TRUE;
@@ -377,14 +517,41 @@ rtl_wait_phy_ups_resume(struct rtl_hw *hw, u16 PhyState)
int i = 0;
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ do {
+ tmp_phy_state = rtl_mdio_real_read_phy_ocp(hw, 0x0A42, 0x10);
+ tmp_phy_state &= 0x7;
+ rte_delay_ms(1);
+ i++;
+ } while ((i < 100) && (tmp_phy_state != PhyState));
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
do {
tmp_phy_state = rtl_mdio_direct_read_phy_ocp(hw, 0xA420);
tmp_phy_state &= 0x7;
rte_delay_ms(1);
i++;
} while ((i < 100) && (tmp_phy_state != PhyState));
+ break;
}
}
@@ -395,13 +562,43 @@ rtl_phy_power_up(struct rtl_hw *hw)
return;
rtl_mdio_write(hw, 0x1F, 0x0000);
+
rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE);
+ /* Wait mdc/mdio ready */
+ switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ rte_delay_ms(10);
+ break;
+ }
+
/* Wait ups resume (phy state 3) */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_wait_phy_ups_resume(hw, 3);
+ break;
}
}
@@ -409,9 +606,36 @@ void
rtl_powerup_pll(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) | BIT_7 | BIT_6);
+ break;
}
rtl_phy_power_up(hw);
@@ -420,8 +644,67 @@ rtl_powerup_pll(struct rtl_hw *hw)
static void
rtl_phy_power_down(struct rtl_hw *hw)
{
+ u32 csi_tmp;
+
+ /* MCU PME intr masks */
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~(BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
+ rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
+ break;
+ case CFG_METHOD_25:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~(BIT_3 | BIT_6);
+ rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
+ break;
+ }
+
rtl_mdio_write(hw, 0x1F, 0x0000);
- rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
+ break;
+ default:
+ rtl_mdio_write(hw, MII_BMCR, BMCR_PDOWN);
+ break;
+ }
}
void
@@ -432,10 +715,75 @@ rtl_powerdown_pll(struct rtl_hw *hw)
rtl_phy_power_down(hw);
+ if (!hw->HwIcVerUnknown) {
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7);
+ break;
+ }
+ }
+
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7);
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_6);
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
break;
}
}
@@ -470,12 +818,16 @@ rtl_xmii_reset_enable(struct rtl_hw *hw)
rtl_mdio_write(hw, 0x1F, 0x0000);
rtl_mdio_write(hw, MII_ADVERTISE, rtl_mdio_read(hw, MII_ADVERTISE) &
- ~(ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF |
- ADVERTISE_100FULL));
+ ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
+ ADVERTISE_100HALF | ADVERTISE_100FULL));
rtl_mdio_write(hw, MII_CTRL1000, rtl_mdio_read(hw, MII_CTRL1000) &
~(ADVERTISE_1000HALF | ADVERTISE_1000FULL));
- rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4) &
- ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL));
+
+ if (rtl_is_8125(hw))
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4,
+ rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4) &
+ ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL));
+
rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
if (rtl_wait_phy_reset_complete(hw) == 0)
@@ -488,7 +840,7 @@ rtl8125_set_hw_phy_before_init_phy_mcu(struct rtl_hw *hw)
u16 phy_reg_value;
switch (hw->mcfg) {
- case CFG_METHOD_4:
+ case CFG_METHOD_50:
rtl_mdio_direct_write_phy_ocp(hw, 0xBF86, 0x9000);
rtl_set_eth_phy_ocp_bit(hw, 0xC402, BIT_10);
@@ -516,8 +868,41 @@ rtl_get_hw_phy_mcu_code_ver(struct rtl_hw *hw)
u16 hw_ram_code_ver = ~0;
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x801E);
+ hw_ram_code_ver = rtl_mdio_read(hw, 0x14);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E);
hw_ram_code_ver = rtl_mdio_direct_read_phy_ocp(hw, 0xA438);
break;
@@ -547,8 +932,42 @@ static void
rtl_write_hw_phy_mcu_code_ver(struct rtl_hw *hw)
{
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x801E);
+ rtl_mdio_write(hw, 0x14, hw->sw_ram_code_ver);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ hw->hw_ram_code_ver = hw->sw_ram_code_ver;
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E);
rtl_mdio_direct_write_phy_ocp(hw, 0xA438, hw->sw_ram_code_ver);
hw->hw_ram_code_ver = hw->sw_ram_code_ver;
@@ -560,6 +979,11 @@ static void
rtl_enable_phy_disable_mode(struct rtl_hw *hw)
{
switch (hw->HwSuppCheckPhyDisableModeVer) {
+ case 1:
+ rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) |
+ BIT_1);
+ break;
+ case 2:
case 3:
RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_5);
break;
@@ -570,6 +994,11 @@ static void
rtl_disable_phy_disable_mode(struct rtl_hw *hw)
{
switch (hw->HwSuppCheckPhyDisableModeVer) {
+ case 1:
+ rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) &
+ ~BIT_1);
+ break;
+ case 2:
case 3:
RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_5);
break;
@@ -578,6 +1007,107 @@ rtl_disable_phy_disable_mode(struct rtl_hw *hw)
rte_delay_ms(1);
}
+static int
+rtl8168_phy_ram_code_check(struct rtl_hw *hw)
+{
+ u16 phy_reg_value;
+ int retval = TRUE;
+
+ if (hw->mcfg == CFG_METHOD_21) {
+ rtl_mdio_write(hw, 0x1f, 0x0A40);
+ phy_reg_value = rtl_mdio_read(hw, 0x10);
+ phy_reg_value &= ~BIT_11;
+ rtl_mdio_write(hw, 0x10, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A00);
+ phy_reg_value = rtl_mdio_read(hw, 0x10);
+ phy_reg_value &= ~(BIT_12 | BIT_13 | BIT_14 | BIT_15);
+ rtl_mdio_write(hw, 0x10, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8010);
+ phy_reg_value = rtl_mdio_read(hw, 0x14);
+ phy_reg_value &= ~BIT_11;
+ rtl_mdio_write(hw, 0x14, phy_reg_value);
+
+ retval = rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A40);
+ rtl_mdio_write(hw, 0x10, 0x0140);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A4A);
+ phy_reg_value = rtl_mdio_read(hw, 0x13);
+ phy_reg_value &= ~BIT_6;
+ phy_reg_value |= BIT_7;
+ rtl_mdio_write(hw, 0x13, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A44);
+ phy_reg_value = rtl_mdio_read(hw, 0x14);
+ phy_reg_value |= BIT_2;
+ rtl_mdio_write(hw, 0x14, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A50);
+ phy_reg_value = rtl_mdio_read(hw, 0x11);
+ phy_reg_value |= (BIT_11 | BIT_12);
+ rtl_mdio_write(hw, 0x11, phy_reg_value);
+
+ retval = rtl_clear_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A40);
+ rtl_mdio_write(hw, 0x10, 0x1040);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A4A);
+ phy_reg_value = rtl_mdio_read(hw, 0x13);
+ phy_reg_value &= ~(BIT_6 | BIT_7);
+ rtl_mdio_write(hw, 0x13, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A44);
+ phy_reg_value = rtl_mdio_read(hw, 0x14);
+ phy_reg_value &= ~BIT_2;
+ rtl_mdio_write(hw, 0x14, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A50);
+ phy_reg_value = rtl_mdio_read(hw, 0x11);
+ phy_reg_value &= ~(BIT_11 | BIT_12);
+ rtl_mdio_write(hw, 0x11, phy_reg_value);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A43);
+ rtl_mdio_write(hw, 0x13, 0x8010);
+ phy_reg_value = rtl_mdio_read(hw, 0x14);
+ phy_reg_value |= BIT_11;
+ rtl_mdio_write(hw, 0x14, phy_reg_value);
+
+ retval = rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_mdio_write(hw, 0x1f, 0x0A20);
+ phy_reg_value = rtl_mdio_read(hw, 0x13);
+ if (phy_reg_value & BIT_11) {
+ if (phy_reg_value & BIT_10)
+ retval = FALSE;
+ }
+
+ retval = rtl_clear_phy_mcu_patch_request(hw);
+
+ rte_delay_ms(2);
+ }
+
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+
+ return retval;
+}
+
+static void
+rtl8168_set_phy_ram_code_check_fail_flag(struct rtl_hw *hw)
+{
+ u16 tmp_ushort;
+
+ if (hw->mcfg == CFG_METHOD_21) {
+ tmp_ushort = rtl_mac_ocp_read(hw, 0xD3C0);
+ tmp_ushort |= BIT_0;
+ rtl_mac_ocp_write(hw, 0xD3C0, tmp_ushort);
+ }
+}
+
static void
rtl_init_hw_phy_mcu(struct rtl_hw *hw)
{
@@ -589,6 +1119,11 @@ rtl_init_hw_phy_mcu(struct rtl_hw *hw)
if (rtl_check_hw_phy_mcu_code_ver(hw))
return;
+ if (!rtl_is_8125(hw) && !rtl8168_phy_ram_code_check(hw)) {
+ rtl8168_set_phy_ram_code_check_fail_flag(hw);
+ return;
+ }
+
if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(hw) && rtl_is_in_phy_disable_mode(hw))
require_disable_phy_disable_mode = TRUE;
@@ -611,44 +1146,107 @@ static void
rtl_disable_aldps(struct rtl_hw *hw)
{
u16 tmp_ushort;
- u32 timeout, wait_cnt;
-
- tmp_ushort = rtl_mdio_real_read_phy_ocp(hw, 0xA430);
- if (tmp_ushort & BIT_2) {
- timeout = 0;
- wait_cnt = 200;
- rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2);
+ u32 timeout = 0;
+ u32 wait_cnt = 200;
- do {
- rte_delay_us(100);
-
- tmp_ushort = rtl_mac_ocp_read(hw, 0xE908);
-
- timeout++;
- } while (!(tmp_ushort & BIT_7) && timeout < wait_cnt);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430);
+ if (tmp_ushort & BIT_2)
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430);
+ if (tmp_ushort & BIT_2) {
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2);
+
+ do {
+ rte_delay_us(100);
+ tmp_ushort = rtl_mac_ocp_read(hw, 0xE908);
+ timeout++;
+ } while (!(tmp_ushort & BIT_7) && timeout < wait_cnt);
+ }
+ break;
}
}
static bool
rtl_is_adv_eee_enabled(struct rtl_hw *hw)
{
+ bool enabled = false;
+
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_55:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ if (rtl_mdio_read(hw, 0x10) & BIT_15)
+ enabled = true;
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
if (rtl_mdio_direct_read_phy_ocp(hw, 0xA430) & BIT_15)
- return true;
+ enabled = true;
break;
default:
break;
}
- return false;
+ return enabled;
}
static void
_rtl_disable_adv_eee(struct rtl_hw *hw)
{
bool lock;
+ u16 data;
if (rtl_is_adv_eee_enabled(hw))
lock = true;
@@ -658,9 +1256,70 @@ _rtl_disable_adv_eee(struct rtl_hw *hw)
if (lock)
rtl_set_phy_mcu_patch_request(hw);
- 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);
+ switch (hw->mcfg) {
+ case CFG_METHOD_25:
+ rtl_eri_write(hw, 0x1EA, 1, 0x00, ERIAR_ExGMAC);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ data = rtl_mdio_read(hw, 0x16);
+ data &= ~BIT_1;
+ rtl_mdio_write(hw, 0x16, data);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ break;
+ case CFG_METHOD_26:
+ data = rtl_mac_ocp_read(hw, 0xE052);
+ data &= ~BIT_0;
+ rtl_mac_ocp_write(hw, 0xE052, data);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ data = rtl_mdio_read(hw, 0x16);
+ data &= ~BIT_1;
+ rtl_mdio_write(hw, 0x16, data);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ break;
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ data = rtl_mac_ocp_read(hw, 0xE052);
+ data &= ~BIT_0;
+ rtl_mac_ocp_write(hw, 0xE052, data);
+ break;
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ data = rtl_mac_ocp_read(hw, 0xE052);
+ data &= ~BIT_0;
+ rtl_mac_ocp_write(hw, 0xE052, data);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ data = rtl_mdio_read(hw, 0x10) & ~(BIT_15);
+ rtl_mdio_write(hw, 0x10, data);
+
+ rtl_mdio_write(hw, 0x1F, 0x0A44);
+ data = rtl_mdio_read(hw, 0x11) & ~(BIT_12 | BIT_13 | BIT_14);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ 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);
+ break;
+ }
if (lock)
rtl_clear_phy_mcu_patch_request(hw);
@@ -669,25 +1328,42 @@ _rtl_disable_adv_eee(struct rtl_hw *hw)
static void
rtl_disable_adv_eee(struct rtl_hw *hw)
{
+ if (hw->mcfg < CFG_METHOD_25 || hw->mcfg == CFG_METHOD_37)
+ return;
+
switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_52:
case CFG_METHOD_54:
case CFG_METHOD_55:
- rtl8125_oob_mutex_lock(hw);
+ rtl_oob_mutex_lock(hw);
break;
}
_rtl_disable_adv_eee(hw);
switch (hw->mcfg) {
+ case CFG_METHOD_23:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_52:
case CFG_METHOD_54:
case CFG_METHOD_55:
- rtl8125_oob_mutex_unlock(hw);
+ rtl_oob_mutex_unlock(hw);
break;
}
}
@@ -695,7 +1371,39 @@ rtl_disable_adv_eee(struct rtl_hw *hw)
static void
rtl_disable_eee(struct rtl_hw *hw)
{
+ u16 data;
+ u32 csi_tmp;
+
switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
+ csi_tmp &= ~(BIT_1 | BIT_0);
+ rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
+ rtl_mdio_write(hw, 0x1F, 0x0A43);
+ data = rtl_mdio_read(hw, 0x11);
+ if (hw->mcfg == CFG_METHOD_36)
+ rtl_mdio_write(hw, 0x11, data | BIT_4);
+ else
+ rtl_mdio_write(hw, 0x11, data & ~BIT_4);
+ rtl_mdio_write(hw, 0x1F, 0x0A5D);
+ rtl_mdio_write(hw, 0x10, 0x0000);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ break;
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_52:
@@ -712,7 +1420,11 @@ rtl_disable_eee(struct rtl_hw *hw)
break;
case CFG_METHOD_50:
case CFG_METHOD_51:
- case CFG_METHOD_53 ... CFG_METHOD_57:
+ case CFG_METHOD_53:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ case CFG_METHOD_56:
+ case CFG_METHOD_57:
rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
rtl_set_eth_phy_ocp_bit(hw, 0xA432, BIT_4);
@@ -723,7 +1435,9 @@ rtl_disable_eee(struct rtl_hw *hw)
rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7);
rtl_clear_eth_phy_ocp_bit(hw, 0xA4A2, BIT_9);
break;
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0));
rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, (MDIO_EEE_100TX | MDIO_EEE_1000T));
@@ -740,6 +1454,19 @@ rtl_disable_eee(struct rtl_hw *hw)
break;
}
+ switch (hw->mcfg) {
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ rtl_clear_eth_phy_bit(hw, 0x14, BIT_7);
+ rtl_mdio_write(hw, 0x1F, 0x0A4A);
+ rtl_clear_eth_phy_bit(hw, 0x11, BIT_9);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ break;
+ }
+
/* Advanced EEE */
rtl_disable_adv_eee(hw);
}
@@ -749,24 +1476,32 @@ rtl_hw_phy_config(struct rtl_hw *hw)
{
rtl_xmii_reset_enable(hw);
+ if (HW_DASH_SUPPORT_TYPE_3(hw) && hw->HwPkgDet == 0x06)
+ return;
+
rtl8125_set_hw_phy_before_init_phy_mcu(hw);
rtl_init_hw_phy_mcu(hw);
hw->hw_ops.hw_phy_config(hw);
- switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- rtl_disable_aldps(hw);
- break;
- }
+ rtl_disable_aldps(hw);
/* Legacy force mode (chap 22) */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
- default:
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
rtl_clear_eth_phy_ocp_bit(hw, 0xA5B4, BIT_15);
break;
}
@@ -784,7 +1519,11 @@ rtl_phy_restart_nway(struct rtl_hw *hw)
return;
rtl_mdio_write(hw, 0x1F, 0x0000);
- rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+ if (rtl_is_8125(hw))
+ rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+ else
+ rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE |
+ BMCR_ANRESTART);
}
static void
@@ -819,11 +1558,45 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
int rc = -EINVAL;
/* Disable giga lite */
- rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9);
- rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_0);
+ switch (hw->mcfg) {
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ rtl_clear_eth_phy_bit(hw, 0x14, BIT_9);
+ rtl_mdio_write(hw, 0x1F, 0x0A40);
+ rtl_mdio_write(hw, 0x1F, 0x0000);
+ break;
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ rtl_mdio_write(hw, 0x1F, 0x0A42);
+ rtl_clear_eth_phy_bit(hw, 0x14, BIT_9 | BIT_7);
+ rtl_mdio_write(hw, 0x1F, 0x0A40);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_0);
- if (HW_SUPP_PHY_LINK_SPEED_5000M(hw))
- rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_1);
+ if (HW_SUPP_PHY_LINK_SPEED_5000M(hw))
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_1);
+ break;
+ }
if (!rtl_is_speed_mode_valid(speed)) {
speed = hw->HwSuppMaxPhyLinkSpeed;
@@ -833,8 +1606,10 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
giga_ctrl = rtl_mdio_read(hw, MII_CTRL1000);
giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
- ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
- ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL);
+ if (rtl_is_8125(hw)) {
+ ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
+ ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL);
+ }
if (autoneg == AUTONEG_ENABLE) {
/* N-way force */
@@ -867,7 +1642,8 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
rtl_mdio_write(hw, 0x1f, 0x0000);
rtl_mdio_write(hw, MII_ADVERTISE, auto_nego);
rtl_mdio_write(hw, MII_CTRL1000, giga_ctrl);
- rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, ctrl_2500);
+ if (rtl_is_8125(hw))
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, ctrl_2500);
rtl_phy_restart_nway(hw);
rte_delay_ms(20);
} else {
@@ -897,3 +1673,27 @@ rtl_set_speed(struct rtl_hw *hw)
return ret;
}
+
+void
+rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
+ u16 setmask)
+{
+ u16 phy_reg_value;
+
+ phy_reg_value = rtl_mdio_read(hw, addr);
+ phy_reg_value &= ~clearmask;
+ phy_reg_value |= setmask;
+ rtl_mdio_write(hw, addr, phy_reg_value);
+}
+
+void
+rtl_clear_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
+{
+ rtl_clear_and_set_eth_phy_bit(hw, addr, mask, 0);
+}
+
+void
+rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
+{
+ rtl_clear_and_set_eth_phy_bit(hw, addr, 0, mask);
+}
diff --git a/drivers/net/r8169/r8169_phy.h b/drivers/net/r8169/r8169_phy.h
index 4d553f9712..ea1facba5b 100644
--- a/drivers/net/r8169/r8169_phy.h
+++ b/drivers/net/r8169/r8169_phy.h
@@ -109,6 +109,8 @@
#define MDIO_EEE_2_5GT 0x0001
#define MDIO_EEE_5GT 0x0002
+#define HW_SUPP_SERDES_PHY(_M) ((_M)->HwSuppSerDesPhyVer > 0)
+
void rtl_clear_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
void rtl_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
@@ -124,6 +126,7 @@ void rtl_clear_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
void rtl_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask);
void rtl_ephy_write(struct rtl_hw *hw, int addr, int value);
+u16 rtl_ephy_read(struct rtl_hw *hw, int addr);
void rtl_clear_and_set_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
u16 setmask);
@@ -144,4 +147,12 @@ void rtl_hw_phy_config(struct rtl_hw *hw);
int rtl_set_speed(struct rtl_hw *hw);
+u32 rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr);
+void rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr,
+ u32 value);
+void rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
+ u16 setmask);
+void rtl_clear_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask);
+void rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask);
+
#endif /* R8169_PHY_H */
diff --git a/drivers/net/r8169/r8169_rxtx.c b/drivers/net/r8169/r8169_rxtx.c
index 57b97338d4..eee91a639e 100644
--- a/drivers/net/r8169/r8169_rxtx.c
+++ b/drivers/net/r8169/r8169_rxtx.c
@@ -41,10 +41,6 @@ struct rtl_tx_desc {
RTE_ATOMIC(u32) opts1;
u32 opts2;
u64 addr;
- u32 reserved0;
- u32 reserved1;
- u32 reserved2;
- u32 reserved3;
};
/* Struct RxDesc in kernel r8169 */
@@ -187,6 +183,9 @@ enum _DescStatusBit {
#define LSOPKTSIZE_MAX 0xffffU
#define MSS_MAX 0x07ffu /* MSS value */
+typedef void (*rtl_clear_rdu_func)(struct rtl_hw *);
+static rtl_clear_rdu_func rtl_clear_rdu;
+
/* ---------------------------------RX---------------------------------- */
static void
@@ -384,8 +383,8 @@ rtl_alloc_rx_queue_mbufs(struct rtl_rx_queue *rxq)
return 0;
}
-static int
-rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads)
+static void
+rtl8125_hw_set_features(struct rtl_hw *hw, uint64_t offloads)
{
u16 cp_cmd;
u32 rx_config;
@@ -406,8 +405,35 @@ rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads)
cp_cmd &= ~RxChkSum;
RTL_W16(hw, CPlusCmd, cp_cmd);
+}
- return 0;
+static void
+rtl8168_hw_set_features(struct rtl_hw *hw, uint64_t offloads)
+{
+ u16 cp_cmd;
+
+ cp_cmd = RTL_R16(hw, CPlusCmd);
+
+ if (offloads & RTE_ETH_RX_OFFLOAD_CHECKSUM)
+ cp_cmd |= RxChkSum;
+ else
+ cp_cmd &= ~RxChkSum;
+
+ if (offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP)
+ cp_cmd |= RxVlan;
+ else
+ cp_cmd &= ~RxVlan;
+
+ RTL_W16(hw, CPlusCmd, cp_cmd);
+}
+
+static void
+rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_hw_set_features(hw, offloads);
+ else
+ rtl8168_hw_set_features(hw, offloads);
}
static void
@@ -421,6 +447,18 @@ rtl_hw_set_rx_packet_filter(struct rtl_hw *hw)
RTL_W32(hw, RxConfig, rx_mode | (RTL_R32(hw, RxConfig)));
}
+static void
+rtl8125_clear_rdu(struct rtl_hw *hw)
+{
+ RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail));
+}
+
+static void
+rtl8168_clear_rdu(struct rtl_hw *hw)
+{
+ RTL_W16(hw, IntrStatus, (RxOK | RxErr | RxDescUnavail));
+}
+
int
rtl_rx_init(struct rte_eth_dev *dev)
{
@@ -428,7 +466,7 @@ rtl_rx_init(struct rte_eth_dev *dev)
struct rtl_hw *hw = &adapter->hw;
struct rtl_rx_queue *rxq;
int ret;
- u32 max_rx_pkt_size;
+ u32 csi_tmp, max_rx_pkt_size;
rxq = dev->data->rx_queues[0];
@@ -463,6 +501,37 @@ rtl_rx_init(struct rte_eth_dev *dev)
rtl_enable_cfg9346_write(hw);
+ switch (hw->mcfg) {
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ /* RX ftr mcu enable */
+ csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC);
+ csi_tmp &= ~BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+ csi_tmp |= BIT_0;
+ rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
+
+ /* RSS disable */
+ rtl_eri_write(hw, 0xC0, 2, 0x0000, ERIAR_ExGMAC); /* queue num = 1 */
+ rtl_eri_write(hw, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
+ break;
+ }
+
/* RX accept type and csum vlan offload */
rtl_hw_set_features(hw, rxq->offloads);
@@ -477,6 +546,11 @@ rtl_rx_init(struct rte_eth_dev *dev)
dev->data->rx_queue_state[0] = RTE_ETH_QUEUE_STATE_STARTED;
+ if (rtl_is_8125(hw))
+ rtl_clear_rdu = rtl8125_clear_rdu;
+ else
+ rtl_clear_rdu = rtl8168_clear_rdu;
+
return 0;
}
@@ -527,10 +601,10 @@ rtl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
uint16_t nb_rx = 0;
uint16_t nb_hold = 0;
uint16_t tail = rxq->rx_tail;
+ uint16_t pkt_len = 0;
const uint16_t nb_rx_desc = rxq->nb_rx_desc;
uint32_t opts1;
uint32_t opts2;
- uint16_t pkt_len = 0;
uint64_t dma_addr;
hw_ring = rxq->hw_ring;
@@ -632,7 +706,7 @@ rtl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
rte_wmb();
/* Clear RDU */
- RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail));
+ rtl_clear_rdu(hw);
nb_hold = 0;
}
@@ -829,7 +903,7 @@ rtl_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
rte_wmb();
/* Clear RDU */
- RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail));
+ rtl_clear_rdu(hw);
nb_hold = 0;
}
@@ -941,7 +1015,7 @@ rtl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
txq = rte_zmalloc_socket("r8169 TX queue", sizeof(struct rtl_tx_queue),
RTE_CACHE_LINE_SIZE, socket_id);
- if (txq == NULL) {
+ if (!txq) {
PMD_INIT_LOG(ERR, "Cannot allocate Tx queue structure");
return -ENOMEM;
}
@@ -995,6 +1069,44 @@ rtl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
return 0;
}
+static void
+rtl8125_set_tx_tag_num(struct rtl_hw *hw)
+{
+ u32 mac_ocp_data;
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE614);
+ mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8);
+ switch (hw->mcfg) {
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_53:
+ mac_ocp_data |= (2 << 8);
+ break;
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ if (hw->EnableTxNoClose)
+ mac_ocp_data |= (4 << 8);
+ else
+ mac_ocp_data |= (3 << 8);
+ break;
+ default:
+ mac_ocp_data |= (3 << 8);
+ break;
+ }
+ rtl_mac_ocp_write(hw, 0xE614, mac_ocp_data);
+}
+
+/* Set MTPS: Max Tx Pkt Size */
+static void
+rtl8168_set_mtps(struct rtl_hw *hw)
+{
+ if (hw->mtu > RTE_ETHER_MTU)
+ RTL_W8(hw, MTPS, 0x27);
+ else
+ RTL_W8(hw, MTPS, 0x3F);
+}
+
int
rtl_tx_init(struct rte_eth_dev *dev)
{
@@ -1010,10 +1122,45 @@ rtl_tx_init(struct rte_eth_dev *dev)
rtl_enable_cfg9346_write(hw);
+ if (rtl_is_8125(hw))
+ rtl8125_set_tx_tag_num(hw);
+ else
+ rtl8168_set_mtps(hw);
+
/* Set TDFNR: TX Desc Fetch NumbeR */
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_57:
- case CFG_METHOD_69 ... CFG_METHOD_71:
+ case CFG_METHOD_21:
+ case CFG_METHOD_22:
+ case CFG_METHOD_23:
+ case CFG_METHOD_24:
+ case CFG_METHOD_25:
+ case CFG_METHOD_26:
+ case CFG_METHOD_27:
+ case CFG_METHOD_28:
+ case CFG_METHOD_29:
+ case CFG_METHOD_30:
+ case CFG_METHOD_31:
+ case CFG_METHOD_32:
+ case CFG_METHOD_33:
+ case CFG_METHOD_34:
+ case CFG_METHOD_35:
+ case CFG_METHOD_36:
+ case CFG_METHOD_37:
+ RTL_W8(hw, TDFNR, 0x4);
+ 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_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
RTL_W8(hw, TDFNR, 0x10);
break;
}
@@ -1187,7 +1334,12 @@ rtl_xmit_pkt(struct rtl_hw *hw, struct rtl_tx_queue *txq,
rtl_setup_csum_offload(tx_pkt, tx_ol_flags, opts);
switch (hw->mcfg) {
- case CFG_METHOD_48 ... CFG_METHOD_53:
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_50:
+ case CFG_METHOD_51:
+ case CFG_METHOD_52:
+ case CFG_METHOD_53:
rtl8125_ptp_patch(tx_pkt);
break;
}
@@ -1270,7 +1422,7 @@ rtl_get_opts1(struct rtl_tx_desc *txd)
}
static void
-rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq)
+rtl8125_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq)
{
struct rtl_tx_entry *sw_ring = txq->sw_ring;
struct rtl_tx_entry *txe;
@@ -1282,7 +1434,7 @@ rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq)
uint32_t tx_left;
uint32_t tx_desc_closed, next_hw_desc_clo_ptr0;
- if (txq == NULL)
+ if (!txq)
return;
if (enable_tx_no_close) {
@@ -1319,8 +1471,54 @@ rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq)
txq->tx_head = head;
}
-int
-rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
+static void
+rtl8168_tx_clean(struct rtl_hw *hw __rte_unused, struct rtl_tx_queue *txq)
+{
+ struct rtl_tx_entry *sw_ring = txq->sw_ring;
+ struct rtl_tx_entry *txe;
+ struct rtl_tx_desc *txd;
+ const uint16_t nb_tx_desc = txq->nb_tx_desc;
+ const int tx_tail = txq->tx_tail % nb_tx_desc;
+ int head = txq->tx_head;
+ uint16_t desc_freed = 0;
+
+ if (!txq)
+ return;
+
+ while (1) {
+ txd = &txq->hw_ring[head];
+
+ if (rtl_get_opts1(txd) & DescOwn)
+ break;
+
+ txe = &sw_ring[head];
+ if (txe->mbuf) {
+ rte_pktmbuf_free_seg(txe->mbuf);
+ txe->mbuf = NULL;
+ }
+
+ head = (head + 1) % nb_tx_desc;
+ desc_freed++;
+
+ if (head == tx_tail)
+ break;
+ }
+
+ txq->tx_free += desc_freed;
+ txq->tx_head = head;
+}
+
+static void
+rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_tx_clean(hw, txq);
+ else
+ rtl8168_tx_clean(hw, txq);
+}
+
+static int
+rtl8125_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
{
struct rtl_tx_queue *txq = tx_queue;
struct rtl_hw *hw = txq->hw;
@@ -1336,7 +1534,7 @@ rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
uint32_t status;
uint32_t tx_desc_closed, next_hw_desc_clo_ptr0;
- if (txq == NULL)
+ if (!txq)
return -ENODEV;
if (enable_tx_no_close) {
@@ -1385,8 +1583,70 @@ rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
return count;
}
+static int
+rtl8168_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
+{
+ struct rtl_tx_queue *txq = tx_queue;
+ struct rtl_tx_entry *sw_ring = txq->sw_ring;
+ struct rtl_tx_entry *txe;
+ struct rtl_tx_desc *txd;
+ const uint16_t nb_tx_desc = txq->nb_tx_desc;
+ const int tx_tail = txq->tx_tail % nb_tx_desc;
+ int head = txq->tx_head;
+ uint16_t desc_freed = 0;
+ int count = 0;
+ uint32_t status;
+
+ if (!txq)
+ return -ENODEV;
+
+ while (1) {
+ txd = &txq->hw_ring[head];
+
+ status = rtl_get_opts1(txd);
+
+ if (status & DescOwn)
+ break;
+
+ txe = &sw_ring[head];
+ if (txe->mbuf) {
+ rte_pktmbuf_free_seg(txe->mbuf);
+ txe->mbuf = NULL;
+ }
+
+ head = (head + 1) % nb_tx_desc;
+ desc_freed++;
+
+ if (status & LastFrag) {
+ count++;
+ if ((uint32_t)count == free_cnt)
+ break;
+ }
+
+ if (head == tx_tail)
+ break;
+ }
+
+ txq->tx_free += desc_freed;
+ txq->tx_head = head;
+
+ return count;
+}
+
+int
+rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
+{
+ struct rtl_tx_queue *txq = tx_queue;
+ struct rtl_hw *hw = txq->hw;
+
+ if (rtl_is_8125(hw))
+ return rtl8125_tx_done_cleanup(tx_queue, free_cnt);
+ else
+ return rtl8168_tx_done_cleanup(tx_queue, free_cnt);
+}
+
static void
-rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq)
+rtl8125_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq)
{
if (hw->EnableTxNoClose)
if (hw->HwSuppTxNoCloseVer > 3)
@@ -1397,6 +1657,21 @@ rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq)
RTL_W16(hw, TPPOLL_8125, BIT_0);
}
+static void
+rtl8168_doorbell(struct rtl_hw *hw)
+{
+ RTL_W8(hw, TxPoll, NPQ);
+}
+
+static void
+rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq)
+{
+ if (rtl_is_8125(hw))
+ rtl8125_doorbell(hw, txq);
+ else
+ rtl8168_doorbell(hw);
+}
+
/* PMD transmit function */
uint16_t
rtl_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
--
2.34.1
next prev parent reply other threads:[~2025-06-10 6:23 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-10 6:22 [PATCH v1 0/8] net/r8169: support more cards Howard Wang
2025-06-10 6:22 ` Howard Wang [this message]
2025-06-10 6:22 ` [PATCH v1 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang
2025-06-10 14:26 ` Stephen Hemminger
2025-06-10 6:22 ` [PATCH v1 3/8] net/r8169: add support for RTL8127 Howard Wang
2025-06-10 6:22 ` [PATCH v1 4/8] net/r8169: remove cmac feature for RTL8125AP Howard Wang
2025-06-10 6:22 ` [PATCH v1 5/8] net/r8169: add RTL8127AP dash support Howard Wang
2025-06-10 6:22 ` [PATCH v1 6/8] net/r8169: add support for RTL8125CP Howard Wang
2025-06-10 6:22 ` [PATCH v1 7/8] net/r8169: add support for RTL8127ATF serdes interface Howard Wang
2025-06-10 6:22 ` [PATCH v1 8/8] net/r8169: update HW configuration for 8127 Howard Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250610062241.4517-2-howard_wang@realsil.com.cn \
--to=howard_wang@realsil.com.cn \
--cc=dev@dpdk.org \
--cc=pro_nic_dpdk@realtek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).