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 v2 3/8] net/r8169: add support for RTL8127
Date: Tue, 10 Jun 2025 15:40:32 +0800 [thread overview]
Message-ID: <20250610074037.5288-4-howard_wang@realsil.com.cn> (raw)
In-Reply-To: <20250610074037.5288-1-howard_wang@realsil.com.cn>
Signed-off-by: Howard Wang <howard_wang@realsil.com.cn>
---
doc/guides/nics/r8169.rst | 5 +-
drivers/net/r8169/base/rtl8125a.c | 8 +-
drivers/net/r8169/base/rtl8125a.h | 1 -
drivers/net/r8169/base/rtl8125a_mcu.c | 17 +-
drivers/net/r8169/base/rtl8125b.c | 5 +-
drivers/net/r8169/base/rtl8125b.h | 1 -
drivers/net/r8169/base/rtl8125b_mcu.c | 8 -
drivers/net/r8169/base/rtl8125bp.c | 5 +
drivers/net/r8169/base/rtl8125bp_mcu.c | 28 +-
drivers/net/r8169/base/rtl8125d.c | 5 +-
drivers/net/r8169/base/rtl8125d_mcu.c | 8 +-
drivers/net/r8169/base/rtl8125d_mcu.h | 1 -
drivers/net/r8169/base/rtl8126a.c | 5 +
drivers/net/r8169/base/rtl8126a_mcu.c | 20 +-
drivers/net/r8169/base/rtl8127.c | 365 ++++++++
drivers/net/r8169/base/rtl8127_mcu.c | 616 ++++++++++++++
drivers/net/r8169/base/rtl8127_mcu.h | 12 +
drivers/net/r8169/base/rtl8168kb.c | 5 +
drivers/net/r8169/meson.build | 2 +
drivers/net/r8169/r8169_compat.h | 52 +-
drivers/net/r8169/r8169_ethdev.c | 121 +--
drivers/net/r8169/r8169_ethdev.h | 4 +-
drivers/net/r8169/r8169_hw.c | 1050 ++++++++----------------
drivers/net/r8169/r8169_hw.h | 8 +
drivers/net/r8169/r8169_phy.c | 523 +++++-------
drivers/net/r8169/r8169_phy.h | 7 +-
drivers/net/r8169/r8169_rxtx.c | 64 +-
27 files changed, 1701 insertions(+), 1245 deletions(-)
create mode 100644 drivers/net/r8169/base/rtl8127.c
create mode 100644 drivers/net/r8169/base/rtl8127_mcu.c
create mode 100644 drivers/net/r8169/base/rtl8127_mcu.h
diff --git a/doc/guides/nics/r8169.rst b/doc/guides/nics/r8169.rst
index f3c547c4d4..c0eeb5ec6a 100644
--- a/doc/guides/nics/r8169.rst
+++ b/doc/guides/nics/r8169.rst
@@ -4,8 +4,8 @@
R8169 Poll Mode Driver
======================
-The R8169 PMD provides poll mode driver support for Realtek 1, 2.5 and 5 Gigabit
-Ethernet NICs.
+The R8169 PMD provides poll mode driver support for Realtek 1, 2.5, 5 and 10
+Gigabit Ethernet NICs.
More information about Realtek 1G Ethernet NIC can be found at `RTL8168
<https://www.realtek.com/Product/Index?id=4080>`_.
@@ -22,6 +22,7 @@ Supported Chipsets and NICs
- Realtek RTL8168 1 Gigabit Ethernet Controller
- Realtek RTL8125 2.5 Gigabit Ethernet Controller
- Realtek RTL8126 5 Gigabit Ethernet Controller
+- Realtek RTL8127 10 Gigabit Ethernet Controller
Features
--------
diff --git a/drivers/net/r8169/base/rtl8125a.c b/drivers/net/r8169/base/rtl8125a.c
index 39ab308d51..114727b717 100644
--- a/drivers/net/r8169/base/rtl8125a.c
+++ b/drivers/net/r8169/base/rtl8125a.c
@@ -380,10 +380,12 @@ hw_mac_mcu_config_8125a(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ /* Get H/W mac mcu patch code version */
+ hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
switch (hw->mcfg) {
- case CFG_METHOD_48:
- rtl_set_mac_mcu_8125a_1(hw);
- break;
case CFG_METHOD_49:
rtl_set_mac_mcu_8125a_2(hw);
break;
diff --git a/drivers/net/r8169/base/rtl8125a.h b/drivers/net/r8169/base/rtl8125a.h
index 0b2e0492ab..e1f98fa40a 100644
--- a/drivers/net/r8169/base/rtl8125a.h
+++ b/drivers/net/r8169/base/rtl8125a.h
@@ -5,7 +5,6 @@
#ifndef RTL8125A_H
#define RTL8125A_H
-void rtl_set_mac_mcu_8125a_1(struct rtl_hw *hw);
void rtl_set_mac_mcu_8125a_2(struct rtl_hw *hw);
void rtl_set_phy_mcu_8125a_1(struct rtl_hw *hw);
diff --git a/drivers/net/r8169/base/rtl8125a_mcu.c b/drivers/net/r8169/base/rtl8125a_mcu.c
index e2d56102fb..b810787daa 100644
--- a/drivers/net/r8169/base/rtl8125a_mcu.c
+++ b/drivers/net/r8169/base/rtl8125a_mcu.c
@@ -11,15 +11,10 @@
/* ------------------------------------MAC 8125A------------------------------------- */
-void
-rtl_set_mac_mcu_8125a_1(struct rtl_hw *hw)
-{
- rtl_hw_disable_mac_mcu_bps(hw);
-}
-
void
rtl_set_mac_mcu_8125a_2(struct rtl_hw *hw)
{
+ u16 entry_cnt;
static const u16 mcu_patch_code_8125a_2[] = {
0xE010, 0xE012, 0xE022, 0xE024, 0xE029, 0xE02B, 0xE094, 0xE09D, 0xE09F,
0xE0AA, 0xE0B5, 0xE0C6, 0xE0CC, 0xE0D1, 0xE0D6, 0xE0D8, 0xC602, 0xBE00,
@@ -109,10 +104,14 @@ rtl_set_mac_mcu_8125a_2(struct rtl_hw *hw)
0x0B15, 0x090E, 0x1139
};
- rtl_hw_disable_mac_mcu_bps(hw);
+ entry_cnt = ARRAY_SIZE(mcu_patch_code_8125a_2);
+
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code_8125a_2,
+ entry_cnt);
- rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125a_2,
- ARRAY_SIZE(mcu_patch_code_8125a_2));
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125a_2, entry_cnt);
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
diff --git a/drivers/net/r8169/base/rtl8125b.c b/drivers/net/r8169/base/rtl8125b.c
index 06cd125bcf..3b094f3080 100644
--- a/drivers/net/r8169/base/rtl8125b.c
+++ b/drivers/net/r8169/base/rtl8125b.c
@@ -362,10 +362,9 @@ hw_mac_mcu_config_8125b(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
switch (hw->mcfg) {
- case CFG_METHOD_50:
- rtl_set_mac_mcu_8125b_1(hw);
- break;
case CFG_METHOD_51:
rtl_set_mac_mcu_8125b_2(hw);
break;
diff --git a/drivers/net/r8169/base/rtl8125b.h b/drivers/net/r8169/base/rtl8125b.h
index ec63446e89..b2df6746be 100644
--- a/drivers/net/r8169/base/rtl8125b.h
+++ b/drivers/net/r8169/base/rtl8125b.h
@@ -5,7 +5,6 @@
#ifndef RTL8125B_H
#define RTL8125B_H
-void rtl_set_mac_mcu_8125b_1(struct rtl_hw *hw);
void rtl_set_mac_mcu_8125b_2(struct rtl_hw *hw);
void rtl_set_phy_mcu_8125b_1(struct rtl_hw *hw);
diff --git a/drivers/net/r8169/base/rtl8125b_mcu.c b/drivers/net/r8169/base/rtl8125b_mcu.c
index 03b004b430..afc17707ec 100644
--- a/drivers/net/r8169/base/rtl8125b_mcu.c
+++ b/drivers/net/r8169/base/rtl8125b_mcu.c
@@ -11,12 +11,6 @@
/* ------------------------------------MAC 8125B------------------------------------- */
-void
-rtl_set_mac_mcu_8125b_1(struct rtl_hw *hw)
-{
- rtl_hw_disable_mac_mcu_bps(hw);
-}
-
void
rtl_set_mac_mcu_8125b_2(struct rtl_hw *hw)
{
@@ -38,8 +32,6 @@ rtl_set_mac_mcu_8125b_2(struct rtl_hw *hw)
0x0000, 0xC602, 0xBE00, 0x0000
};
- rtl_hw_disable_mac_mcu_bps(hw);
-
rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125b_2,
ARRAY_SIZE(mcu_patch_code_8125b_2));
diff --git a/drivers/net/r8169/base/rtl8125bp.c b/drivers/net/r8169/base/rtl8125bp.c
index 19d0d256af..fe546cf9a3 100644
--- a/drivers/net/r8169/base/rtl8125bp.c
+++ b/drivers/net/r8169/base/rtl8125bp.c
@@ -83,6 +83,11 @@ hw_mac_mcu_config_8125bp(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ /* Get H/W mac mcu patch code version */
+ hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
switch (hw->mcfg) {
case CFG_METHOD_54:
rtl_set_mac_mcu_8125bp_1(hw);
diff --git a/drivers/net/r8169/base/rtl8125bp_mcu.c b/drivers/net/r8169/base/rtl8125bp_mcu.c
index 05e04dbf84..2a9d0a3d48 100644
--- a/drivers/net/r8169/base/rtl8125bp_mcu.c
+++ b/drivers/net/r8169/base/rtl8125bp_mcu.c
@@ -14,7 +14,8 @@
void
rtl_set_mac_mcu_8125bp_1(struct rtl_hw *hw)
{
- static const u16 mcu_patch_code_8125bp_1[] = {
+ u16 entry_cnt;
+ static const u16 mcu_patch_code[] = {
0xE010, 0xE014, 0xE027, 0xE04A, 0xE04D, 0xE050, 0xE052, 0xE054, 0xE056,
0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xE064, 0x1BC8, 0x46EB,
0xC302, 0xBB00, 0x0F14, 0xC211, 0x400A, 0xF00A, 0xC20F, 0x400A, 0xF007,
@@ -31,10 +32,14 @@ rtl_set_mac_mcu_8125bp_1(struct rtl_hw *hw)
0x0000, 0x6936, 0x0A18, 0x0C02, 0x0D21
};
- rtl_hw_disable_mac_mcu_bps(hw);
+ entry_cnt = ARRAY_SIZE(mcu_patch_code);
- rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125bp_1,
- ARRAY_SIZE(mcu_patch_code_8125bp_1));
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code,
+ entry_cnt);
+
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code, entry_cnt);
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
@@ -52,7 +57,8 @@ rtl_set_mac_mcu_8125bp_1(struct rtl_hw *hw)
void
rtl_set_mac_mcu_8125bp_2(struct rtl_hw *hw)
{
- static const u16 mcu_patch_code_8125bp_2[] = {
+ u16 entry_cnt;
+ static const u16 mcu_patch_code[] = {
0xE010, 0xE033, 0xE046, 0xE04A, 0xE04D, 0xE050, 0xE052, 0xE054, 0xE056,
0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xE064, 0xB406, 0x1000,
0xF016, 0xC61F, 0x400E, 0xF012, 0x218E, 0x25BE, 0x1300, 0xF007, 0x7340,
@@ -68,9 +74,15 @@ rtl_set_mac_mcu_8125bp_2(struct rtl_hw *hw)
0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
0x0000, 0x6936, 0x0B18, 0x0C02, 0x0D22
};
- rtl_hw_disable_mac_mcu_bps(hw);
- rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125bp_2,
- ARRAY_SIZE(mcu_patch_code_8125bp_2));
+
+ entry_cnt = ARRAY_SIZE(mcu_patch_code);
+
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code,
+ entry_cnt);
+
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code, entry_cnt);
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
diff --git a/drivers/net/r8169/base/rtl8125d.c b/drivers/net/r8169/base/rtl8125d.c
index 3d4b60abc9..55bfdbcf21 100644
--- a/drivers/net/r8169/base/rtl8125d.c
+++ b/drivers/net/r8169/base/rtl8125d.c
@@ -275,13 +275,12 @@ hw_mac_mcu_config_8125d(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
switch (hw->mcfg) {
case CFG_METHOD_56:
rtl_set_mac_mcu_8125d_1(hw);
break;
- case CFG_METHOD_57:
- rtl_set_mac_mcu_8125d_2(hw);
- break;
}
}
diff --git a/drivers/net/r8169/base/rtl8125d_mcu.c b/drivers/net/r8169/base/rtl8125d_mcu.c
index 8f01b5414e..2f6d1df584 100644
--- a/drivers/net/r8169/base/rtl8125d_mcu.c
+++ b/drivers/net/r8169/base/rtl8125d_mcu.c
@@ -102,7 +102,7 @@ rtl_set_mac_mcu_8125d_1(struct rtl_hw *hw)
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6938,
0x0A18, 0x0217, 0x0D2A
};
- rtl_hw_disable_mac_mcu_bps(hw);
+
rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8125d_1,
ARRAY_SIZE(mcu_patch_code_8125d_1));
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
@@ -110,12 +110,6 @@ rtl_set_mac_mcu_8125d_1(struct rtl_hw *hw)
rtl_mac_ocp_write(hw, 0xFC48, 0x0001);
}
-void
-rtl_set_mac_mcu_8125d_2(struct rtl_hw *hw)
-{
- rtl_hw_disable_mac_mcu_bps(hw);
-}
-
/* ------------------------------------PHY 8125D--------------------------------------- */
static const u16 phy_mcu_ram_code_8125d_1_1[] = {
diff --git a/drivers/net/r8169/base/rtl8125d_mcu.h b/drivers/net/r8169/base/rtl8125d_mcu.h
index 82b70e5b53..163e0e8123 100644
--- a/drivers/net/r8169/base/rtl8125d_mcu.h
+++ b/drivers/net/r8169/base/rtl8125d_mcu.h
@@ -6,7 +6,6 @@
#define RTL8125D_MCU_H
void rtl_set_mac_mcu_8125d_1(struct rtl_hw *hw);
-void rtl_set_mac_mcu_8125d_2(struct rtl_hw *hw);
void rtl_set_phy_mcu_8125d_1(struct rtl_hw *hw);
void rtl_set_phy_mcu_8125d_2(struct rtl_hw *hw);
diff --git a/drivers/net/r8169/base/rtl8126a.c b/drivers/net/r8169/base/rtl8126a.c
index cd6ac5e4e9..047ef83587 100644
--- a/drivers/net/r8169/base/rtl8126a.c
+++ b/drivers/net/r8169/base/rtl8126a.c
@@ -491,6 +491,11 @@ hw_mac_mcu_config_8126a(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ /* Get H/W mac mcu patch code version */
+ hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
switch (hw->mcfg) {
case CFG_METHOD_69:
rtl_set_mac_mcu_8126a_1(hw);
diff --git a/drivers/net/r8169/base/rtl8126a_mcu.c b/drivers/net/r8169/base/rtl8126a_mcu.c
index ba8112d723..759e2df7cf 100644
--- a/drivers/net/r8169/base/rtl8126a_mcu.c
+++ b/drivers/net/r8169/base/rtl8126a_mcu.c
@@ -25,8 +25,6 @@ rtl_set_mac_mcu_8126a_1(struct rtl_hw *hw)
0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
};
- rtl_hw_disable_mac_mcu_bps(hw);
-
rtl_write_mac_mcu_ram_code(hw, mcu_patch_code_8126a_1,
ARRAY_SIZE(mcu_patch_code_8126a_1));
@@ -67,10 +65,13 @@ rtl_set_mac_mcu_8126a_2(struct rtl_hw *hw)
0x0000, 0xC602, 0xBE00, 0x0000, 0x6847, 0x0A18, 0x0C02, 0x0B30
};
- rtl_hw_disable_mac_mcu_bps(hw);
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code,
+ ARRAY_SIZE(mcu_patch_code));
- rtl_write_mac_mcu_ram_code(hw, mcu_patch_code,
- ARRAY_SIZE(mcu_patch_code));
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code,
+ ARRAY_SIZE(mcu_patch_code));
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
@@ -104,10 +105,13 @@ rtl_set_mac_mcu_8126a_3(struct rtl_hw *hw)
0x0000, 0x6847, 0x0B18, 0x0C02, 0x0D10
};
- rtl_hw_disable_mac_mcu_bps(hw);
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code,
+ ARRAY_SIZE(mcu_patch_code));
- rtl_write_mac_mcu_ram_code(hw, mcu_patch_code,
- ARRAY_SIZE(mcu_patch_code));
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code,
+ ARRAY_SIZE(mcu_patch_code));
rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
diff --git a/drivers/net/r8169/base/rtl8127.c b/drivers/net/r8169/base/rtl8127.c
new file mode 100644
index 0000000000..fac6165931
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8127.c
@@ -0,0 +1,365 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_ethdev.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8127_mcu.h"
+
+/* For RTL8127, CFG_METHOD_91 */
+
+static void
+hw_init_rxcfg_8127(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_91:
+ RTL_W32(hw, RxConfig, Rx_Fetch_Number_8 | Rx_Close_Multiple |
+ RxCfg_pause_slot_en | (RX_DMA_BURST_512 << RxCfgDMAShift));
+ break;
+ }
+}
+
+static void
+hw_ephy_config_8127(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_91:
+ rtl_ephy_write(hw, 0x8088, 0x0064);
+ rtl_ephy_write(hw, 0x8488, 0x0064);
+ rtl_ephy_write(hw, 0x8888, 0x0064);
+ rtl_ephy_write(hw, 0x8C88, 0x0064);
+ rtl_ephy_write(hw, 0x8188, 0x0064);
+ rtl_ephy_write(hw, 0x8588, 0x0064);
+ rtl_ephy_write(hw, 0x8988, 0x0064);
+ rtl_ephy_write(hw, 0x8D88, 0x0064);
+ rtl_ephy_write(hw, 0x808C, 0x09B0);
+ rtl_ephy_write(hw, 0x848C, 0x09B0);
+ rtl_ephy_write(hw, 0x888C, 0x0F90);
+ rtl_ephy_write(hw, 0x8C8C, 0x0F90);
+ rtl_ephy_write(hw, 0x818C, 0x09B0);
+ rtl_ephy_write(hw, 0x858C, 0x09B0);
+ rtl_ephy_write(hw, 0x898C, 0x0F90);
+ rtl_ephy_write(hw, 0x8D8C, 0x0F90);
+ rtl_ephy_write(hw, 0x808A, 0x09B8);
+ rtl_ephy_write(hw, 0x848A, 0x09B8);
+ rtl_ephy_write(hw, 0x888A, 0x0F98);
+ rtl_ephy_write(hw, 0x8C8A, 0x0F98);
+ rtl_ephy_write(hw, 0x818A, 0x09B8);
+ rtl_ephy_write(hw, 0x858A, 0x09B8);
+ rtl_ephy_write(hw, 0x898A, 0x0F98);
+ rtl_ephy_write(hw, 0x8D8A, 0x0F98);
+ rtl_ephy_write(hw, 0x9020, 0x0080);
+ rtl_ephy_write(hw, 0x9420, 0x0080);
+ rtl_ephy_write(hw, 0x9820, 0x0080);
+ rtl_ephy_write(hw, 0x9C20, 0x0080);
+ rtl_ephy_write(hw, 0x901E, 0x0190);
+ rtl_ephy_write(hw, 0x941E, 0x0190);
+ rtl_ephy_write(hw, 0x981E, 0x0140);
+ rtl_ephy_write(hw, 0x9C1E, 0x0140);
+ rtl_ephy_write(hw, 0x901C, 0x0190);
+ rtl_ephy_write(hw, 0x941C, 0x0190);
+ rtl_ephy_write(hw, 0x981C, 0x0140);
+ rtl_ephy_write(hw, 0x9C1C, 0x0140);
+
+ /* Clear extended address */
+ rtl8127_clear_ephy_ext_addr(hw);
+ break;
+ default:
+ /* nothing to do */
+ break;
+ }
+}
+
+static void
+rtl8127_tgphy_irq_mask_and_ack(struct rtl_hw *hw)
+{
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA4D2, 0x0000);
+ (void)rtl_mdio_direct_read_phy_ocp(hw, 0xA4D4);
+}
+
+static void
+rtl_hw_phy_config_8127a_1(struct rtl_hw *hw)
+{
+ rtl8127_tgphy_irq_mask_and_ack(hw);
+
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA442, BIT_11);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8415);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x9300);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81A3);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x0F00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81AE);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x0F00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81B9);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xB900);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x83B0);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0x0E00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x83C5);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0x0E00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x83DA);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0x0E00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x83EF);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0x0E00);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8173);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x8620);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8175);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x8671);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x817C);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8187);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8192);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x819D);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81A8);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81B3);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81BE);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_13);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x817D);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xA600);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8188);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xA600);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8193);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xA600);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x819E);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xA600);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81A9);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x1400);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81B4);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x1400);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81BF);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xA600);
+
+ rtl_clear_eth_phy_ocp_bit(hw, 0xAEAA, BIT_5 | BIT_3);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84F0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x201C);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84F2);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x3117);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xAEC6, 0x0000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xAE20, 0xFFFF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xAECE, 0xFFFF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xAED2, 0xFFFF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xAEC8, 0x0000);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xAED0, BIT_0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xADB8, 0x0150);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8197);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8231);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x82CB);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x82CD);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5700);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8233);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5700);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8199);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5700);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x815A);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0150);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x81F4);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0150);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x828E);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0150);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x81B1);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x824B);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x82E5);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0000);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84F7);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x2800);
+ rtl_set_eth_phy_ocp_bit(hw, 0xAEC2, BIT_12);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x81B3);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0xAD00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x824D);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0xAD00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x82E7);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0xAD00);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAE4E, 0x000F, 0x0001);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x82CE);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xF000, 0x4000);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84AC);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84AE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84B0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xF818);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x84B2);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x6000);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FFC);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x6008);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FFE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xF450);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8015);
+ rtl_set_eth_phy_ocp_bit(hw, 0xB87E, BIT_9);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8016);
+ rtl_set_eth_phy_ocp_bit(hw, 0xB87E, BIT_11);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FE6);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0800);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FE4);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x2114);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8647);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xA7B1);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8649);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xBBCA);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x864B);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0xDC00);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8154);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xC000, 0x4000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8158);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0xC000);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x826C);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xFFFF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x826E);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xFFFF);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8872);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0E00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8012);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_11);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8012);
+ rtl_set_eth_phy_ocp_bit(hw, 0xA438, BIT_14);
+ rtl_set_eth_phy_ocp_bit(hw, 0xB576, BIT_0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x834A);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x0700);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8217);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0x3F00, 0x2A00);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81B1);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x0B00);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8370);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x8671);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8372);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x86C8);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8401);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x86C8);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8403);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x86DA);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8406);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8408);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x840A);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x840C);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x840E);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8410);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8412);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8414);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8416);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0x1800, 0x1000);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x82BD);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x1F40);
+
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBFB4, 0x07FF, 0x0328);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xBFB6, 0x3E14);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x81C4);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x003B);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0086);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00B7);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00DB);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00FE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00FE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00FE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00FE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x00C3);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0078);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0047);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0023);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88D7);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x01A0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88D9);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x01A0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FFA);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x002A);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FEE);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xFFDF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF0);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xFFDF);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF1);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xDF0A);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF3);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x4AAA);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF5);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x5A0A);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF7);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x4AAA);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF9);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x5A00);
+
+ rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88D5);
+ rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0200);
+
+ rtl_set_eth_phy_ocp_bit(hw, 0xA430, BIT_1 | BIT_0);
+}
+
+static void
+hw_phy_config_8127(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_91:
+ rtl_hw_phy_config_8127a_1(hw);
+ break;
+ }
+}
+
+static void
+hw_mac_mcu_config_8127(struct rtl_hw *hw)
+{
+ if (hw->NotWrMcuPatchCode)
+ return;
+
+ rtl_hw_disable_mac_mcu_bps(hw);
+
+ /* Get H/W mac mcu patch code version */
+ hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
+ switch (hw->mcfg) {
+ case CFG_METHOD_91:
+ rtl_set_mac_mcu_8127a_1(hw);
+ break;
+ }
+}
+
+static void
+hw_phy_mcu_config_8127(struct rtl_hw *hw)
+{
+ switch (hw->mcfg) {
+ case CFG_METHOD_91:
+ rtl_set_phy_mcu_8127a_1(hw);
+ break;
+ }
+}
+
+const struct rtl_hw_ops rtl8127_ops = {
+ .hw_init_rxcfg = hw_init_rxcfg_8127,
+ .hw_ephy_config = hw_ephy_config_8127,
+ .hw_phy_config = hw_phy_config_8127,
+ .hw_mac_mcu_config = hw_mac_mcu_config_8127,
+ .hw_phy_mcu_config = hw_phy_mcu_config_8127,
+};
diff --git a/drivers/net/r8169/base/rtl8127_mcu.c b/drivers/net/r8169/base/rtl8127_mcu.c
new file mode 100644
index 0000000000..44e6d96d9e
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8127_mcu.c
@@ -0,0 +1,616 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#include "../r8169_ethdev.h"
+#include "../r8169_hw.h"
+#include "../r8169_phy.h"
+#include "rtl8127_mcu.h"
+
+/* For RTL8127, CFG_METHOD_91 */
+
+/* ------------------------------------MAC 8127------------------------------------- */
+
+static void
+_rtl_set_mac_mcu_8127a_1(struct rtl_hw *hw)
+{
+ u16 entry_cnt;
+ static const u16 mcu_patch_code[] = {
+ 0xE010, 0xE012, 0xE014, 0xE016, 0xE018, 0xE01A, 0xE0CF, 0xE180, 0xE182,
+ 0xE184, 0xE186, 0xE188, 0xE18A, 0xE18C, 0xE18E, 0xE190, 0xC602, 0xBE00,
+ 0x0000, 0xC602, 0xBE00, 0x0000, 0xC502, 0xBD00, 0x0000, 0xC502, 0xBD00,
+ 0x0000, 0xC502, 0xBD00, 0x0000, 0xC643, 0x76C0, 0x49E1, 0xF13F, 0xC140,
+ 0x7720, 0x49E0, 0xF003, 0x1B00, 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006,
+ 0x49E4, 0xF003, 0x1B08, 0xE002, 0x1B0C, 0x21B8, 0x1A0E, 0x44DA, 0xE893,
+ 0x481C, 0xE884, 0xE001, 0x49E0, 0xF003, 0x1B00, 0xE00A, 0x49E2, 0xF003,
+ 0x1B04, 0xE006, 0x49E4, 0xF003, 0x1B08, 0xE002, 0x1B0C, 0x21B8, 0x1A12,
+ 0x44DA, 0xE87F, 0x481F, 0xE870, 0xE001, 0x49E0, 0xF003, 0x1B00, 0xE00A,
+ 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E4, 0xF003, 0x1B08, 0xE002, 0x1B0C,
+ 0x21B8, 0x1A1C, 0x44DA, 0xE86B, 0x481F, 0xE85C, 0xE004, 0xE04F, 0xDD98,
+ 0xD450, 0x49E0, 0xF003, 0x1B00, 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006,
+ 0x49E4, 0xF003, 0x1B08, 0xE002, 0x1B0C, 0x21B8, 0x1A0E, 0x44DA, 0xE854,
+ 0x489E, 0x481F, 0xE844, 0xE001, 0x1908, 0xE83E, 0x49E0, 0xF003, 0x1B00,
+ 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E4, 0xF003, 0x1B08, 0xE002,
+ 0x1B0C, 0x21B8, 0x1A8A, 0x44DA, 0xE83D, 0x4813, 0xE82E, 0x49F9, 0xF106,
+ 0x4838, 0xE837, 0x4813, 0xE828, 0xE001, 0x49E0, 0xF003, 0x1B00, 0xE00A,
+ 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E4, 0xF003, 0x1B08, 0xE002, 0x1B0C,
+ 0x21B8, 0x1A84, 0x44DA, 0xE823, 0x4890, 0x4811, 0xE813, 0x49F9, 0xF106,
+ 0x4838, 0xE81C, 0x4890, 0x4811, 0xE80C, 0xC207, 0x7440, 0xC602, 0xBE00,
+ 0x1600, 0x0FFE, 0xDE20, 0xE092, 0xC3FD, 0xE802, 0xFF80, 0xC0FB, 0x7202,
+ 0x49AE, 0xF1FE, 0x9900, 0x44D3, 0x4413, 0x482F, 0x9A02, 0x7202, 0x49AE,
+ 0xF1FE, 0xFF80, 0xC0EE, 0x7202, 0x49AE, 0xF1FE, 0x44D3, 0x4413, 0x48AF,
+ 0x9A02, 0x7202, 0x49AE, 0xF1FE, 0x7100, 0xFF80, 0xB401, 0xB402, 0xB404,
+ 0xB407, 0xC61F, 0x76C0, 0x49E1, 0xF164, 0xC11C, 0x7720, 0x1906, 0xE88A,
+ 0x1B0C, 0x21B8, 0x1A40, 0x44DA, 0xE895, 0x4810, 0xE886, 0x190C, 0xE881,
+ 0x1B08, 0x21B8, 0x1A26, 0x44DA, 0xE88C, 0x4890, 0x4891, 0xE87C, 0x49F9,
+ 0xF107, 0x4898, 0x4899, 0xE877, 0xE003, 0xDD98, 0xD450, 0x1908, 0xE86F,
+ 0x49E0, 0xF003, 0x1B00, 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E2,
+ 0xF003, 0x1B08, 0xE002, 0x1B0C, 0x21B8, 0x1A5C, 0x44DA, 0xE86E, 0x4897,
+ 0x4898, 0x4819, 0x481A, 0xE85C, 0x49F9, 0xF109, 0x4838, 0xE865, 0x4897,
+ 0x4898, 0x4819, 0x481A, 0xE853, 0xE001, 0x190A, 0xE84D, 0x1B00, 0xE85B,
+ 0x44E1, 0x4838, 0xE858, 0x44E9, 0x1908, 0xE845, 0x49E0, 0xF003, 0x1B00,
+ 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E4, 0xF003, 0x1B08, 0xE002,
+ 0x1B0C, 0x21B8, 0x1A86, 0x44DA, 0xE844, 0x44CC, 0xE835, 0x49F9, 0xF108,
+ 0x4838, 0xE83E, 0x44CD, 0xE82F, 0xE003, 0xE021, 0xFFC0, 0x190A, 0xE827,
+ 0x1B00, 0x4839, 0xE834, 0x249A, 0x1C00, 0x44E1, 0x1909, 0xE81F, 0x49E0,
+ 0xF003, 0x1B00, 0xE00A, 0x49E2, 0xF003, 0x1B04, 0xE006, 0x49E4, 0xF003,
+ 0x1B08, 0xE002, 0x1B0C, 0x21B8, 0x1A1A, 0x44DA, 0xE81E, 0xC5E4, 0x414D,
+ 0x418C, 0xE80D, 0xB007, 0xB004, 0xB002, 0xB001, 0xC602, 0xBE00, 0x15E6,
+ 0x0FFE, 0xDE20, 0xC3FE, 0xE802, 0xFF80, 0xC0FC, 0x7202, 0x49AE, 0xF1FE,
+ 0x9900, 0x44D3, 0x4413, 0x482F, 0x9A02, 0x7202, 0x49AE, 0xF1FE, 0xFF80,
+ 0xC0EF, 0x7202, 0x49AE, 0xF1FE, 0x44D3, 0x4413, 0x48AF, 0x9A02, 0x7202,
+ 0x49AE, 0xF1FE, 0x7100, 0xFF80, 0xC502, 0xBD00, 0x0000, 0xC502, 0xBD00,
+ 0x0000, 0xC502, 0xBD00, 0x0000, 0xC302, 0xBB00, 0x0000, 0xC602, 0xBE00,
+ 0x0000, 0xC102, 0xB900, 0x0000, 0xC102, 0xB900, 0x0000, 0xC602, 0xBE00,
+ 0x0000, 0xC602, 0xBE00, 0x0000, 0x6961, 0x0018, 0x0C11, 0x0A38
+ };
+
+ entry_cnt = ARRAY_SIZE(mcu_patch_code);
+
+ /* Get BIN mac mcu patch code version */
+ hw->bin_mcu_patch_code_ver = rtl_get_bin_mcu_patch_code_ver(mcu_patch_code,
+ entry_cnt);
+
+ if (hw->hw_mcu_patch_code_ver != hw->bin_mcu_patch_code_ver)
+ rtl_write_mac_mcu_ram_code(hw, mcu_patch_code, entry_cnt);
+
+ rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
+
+ rtl_mac_ocp_write(hw, 0xFC32, 0x15FE);
+ rtl_mac_ocp_write(hw, 0xFC34, 0x15E4);
+
+ rtl_mac_ocp_write(hw, 0xFC48, 0x0060);
+}
+
+void
+rtl_set_mac_mcu_8127a_1(struct rtl_hw *hw)
+{
+ u8 tmp = (u8)rtl_mac_ocp_read(hw, 0xD006);
+
+ if (tmp != 0x04)
+ return;
+ _rtl_set_mac_mcu_8127a_1(hw);
+}
+
+/* ------------------------------------PHY 8127------------------------------------- */
+
+static const u16 phy_mcu_ram_code_8127a_1[] = {
+ 0xa436, 0x8023, 0xa438, 0x6100, 0xa436, 0xB82E, 0xa438, 0x0001,
+ 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012,
+ 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010,
+ 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x801a,
+ 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x801a,
+ 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x801a,
+ 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0xce00, 0xa438, 0x2941,
+ 0xa438, 0x8017, 0xa438, 0x2c59, 0xa438, 0x8017, 0xa438, 0x1800,
+ 0xa438, 0x0e11, 0xa438, 0x8aff, 0xa438, 0x1800, 0xa438, 0x0e11,
+ 0xa436, 0xA026, 0xa438, 0xffff, 0xa436, 0xA024, 0xa438, 0xffff,
+ 0xa436, 0xA022, 0xa438, 0xffff, 0xa436, 0xA020, 0xa438, 0xffff,
+ 0xa436, 0xA006, 0xa438, 0xffff, 0xa436, 0xA004, 0xa438, 0xffff,
+ 0xa436, 0xA002, 0xa438, 0xffff, 0xa436, 0xA000, 0xa438, 0x0e10,
+ 0xa436, 0xA008, 0xa438, 0x0100, 0xa436, 0xA016, 0xa438, 0x0000,
+ 0xa436, 0xA012, 0xa438, 0x0ff8, 0xa436, 0xA014, 0xa438, 0x219a,
+ 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000,
+ 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA152,
+ 0xa438, 0x21a4, 0xa436, 0xA154, 0xa438, 0x3fff, 0xa436, 0xA156,
+ 0xa438, 0x3fff, 0xa436, 0xA158, 0xa438, 0x3fff, 0xa436, 0xA15A,
+ 0xa438, 0x3fff, 0xa436, 0xA15C, 0xa438, 0x3fff, 0xa436, 0xA15E,
+ 0xa438, 0x3fff, 0xa436, 0xA160, 0xa438, 0x3fff, 0xa436, 0xA150,
+ 0xa438, 0x0001, 0xa436, 0xA016, 0xa438, 0x0010, 0xa436, 0xA012,
+ 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010,
+ 0xa438, 0x1800, 0xa438, 0x8014, 0xa438, 0x1800, 0xa438, 0x801a,
+ 0xa438, 0x1800, 0xa438, 0x801e, 0xa438, 0x1800, 0xa438, 0x8026,
+ 0xa438, 0x1800, 0xa438, 0x802e, 0xa438, 0x1800, 0xa438, 0x8036,
+ 0xa438, 0x1800, 0xa438, 0x803a, 0xa438, 0xce01, 0xa438, 0x8208,
+ 0xa438, 0x1800, 0xa438, 0x0028, 0xa438, 0x1000, 0xa438, 0x02c5,
+ 0xa438, 0x1000, 0xa438, 0x0304, 0xa438, 0x1800, 0xa438, 0x0119,
+ 0xa438, 0xce01, 0xa438, 0x8208, 0xa438, 0x1800, 0xa438, 0x009e,
+ 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa50f, 0xa438, 0x8208,
+ 0xa438, 0xd500, 0xa438, 0xaa0f, 0xa438, 0x1800, 0xa438, 0x015b,
+ 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa50f, 0xa438, 0x8208,
+ 0xa438, 0xd500, 0xa438, 0xaa0f, 0xa438, 0x1800, 0xa438, 0x01a9,
+ 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa50f, 0xa438, 0x8208,
+ 0xa438, 0xd500, 0xa438, 0xaa0f, 0xa438, 0x1800, 0xa438, 0x01f4,
+ 0xa438, 0x8208, 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x02a5,
+ 0xa438, 0xa208, 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x02b8,
+ 0xa436, 0xA08E, 0xa438, 0x02b7, 0xa436, 0xA08C, 0xa438, 0x02a4,
+ 0xa436, 0xA08A, 0xa438, 0x01e7, 0xa436, 0xA088, 0xa438, 0x019c,
+ 0xa436, 0xA086, 0xa438, 0x014e, 0xa436, 0xA084, 0xa438, 0x009d,
+ 0xa436, 0xA082, 0xa438, 0x0117, 0xa436, 0xA080, 0xa438, 0x0027,
+ 0xa436, 0xA090, 0xa438, 0x00ff, 0xa436, 0xA016, 0xa438, 0x0020,
+ 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800,
+ 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x801d, 0xa438, 0x1800,
+ 0xa438, 0x803b, 0xa438, 0x1800, 0xa438, 0x8087, 0xa438, 0x1800,
+ 0xa438, 0x808e, 0xa438, 0x1800, 0xa438, 0x809d, 0xa438, 0x1800,
+ 0xa438, 0x80b7, 0xa438, 0x1800, 0xa438, 0x80c4, 0xa438, 0xd1bc,
+ 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700,
+ 0xa438, 0x5fba, 0xa438, 0xd700, 0xa438, 0x273d, 0xa438, 0x801b,
+ 0xa438, 0x1800, 0xa438, 0x07d1, 0xa438, 0x1800, 0xa438, 0x080e,
+ 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8032, 0xa438, 0x33a9,
+ 0xa438, 0x802a, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4,
+ 0xa438, 0xd048, 0xa438, 0xf013, 0xa438, 0xd1b7, 0xa438, 0xd04b,
+ 0xa438, 0xf010, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4,
+ 0xa438, 0xd048, 0xa438, 0xf00b, 0xa438, 0xd1b7, 0xa438, 0xd04b,
+ 0xa438, 0xf008, 0xa438, 0xd705, 0xa438, 0x4084, 0xa438, 0xd1f4,
+ 0xa438, 0xd048, 0xa438, 0xf003, 0xa438, 0xd1b7, 0xa438, 0xd04b,
+ 0xa438, 0x1800, 0xa438, 0x14cc, 0xa438, 0xd700, 0xa438, 0x2b59,
+ 0xa438, 0x803f, 0xa438, 0xf003, 0xa438, 0x1800, 0xa438, 0x118f,
+ 0xa438, 0x6060, 0xa438, 0x1800, 0xa438, 0x1167, 0xa438, 0xd700,
+ 0xa438, 0x60c7, 0xa438, 0xd704, 0xa438, 0x609f, 0xa438, 0xd705,
+ 0xa438, 0x4043, 0xa438, 0xf003, 0xa438, 0x1800, 0xa438, 0x1150,
+ 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8702, 0xa438, 0x8011,
+ 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x81a0, 0xa438, 0x8302,
+ 0xa438, 0x8480, 0xa438, 0x8686, 0xa438, 0xcde0, 0xa438, 0xd1ff,
+ 0xa438, 0xd049, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700,
+ 0xa438, 0x5fba, 0xa438, 0xd705, 0xa438, 0x417e, 0xa438, 0x0c03,
+ 0xa438, 0x1502, 0xa438, 0xa011, 0xa438, 0x9503, 0xa438, 0xd1c8,
+ 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700,
+ 0xa438, 0x5fba, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa702,
+ 0xa438, 0x9503, 0xa438, 0xa00a, 0xa438, 0xa1a0, 0xa438, 0xa480,
+ 0xa438, 0xa686, 0xa438, 0xd705, 0xa438, 0x605e, 0xa438, 0xa302,
+ 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x37c9, 0xa438, 0x8083,
+ 0xa438, 0x33a9, 0xa438, 0x807f, 0xa438, 0xd178, 0xa438, 0xd04b,
+ 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd1c8, 0xa438, 0xd04b,
+ 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd1e6, 0xa438, 0xd04b,
+ 0xa438, 0x1800, 0xa438, 0x115d, 0xa438, 0xd71f, 0xa438, 0x6080,
+ 0xa438, 0xd704, 0xa438, 0x1800, 0xa438, 0x1bc0, 0xa438, 0x1800,
+ 0xa438, 0x1bc4, 0xa438, 0x4134, 0xa438, 0xd115, 0xa438, 0xd04f,
+ 0xa438, 0x1000, 0xa438, 0x1d0b, 0xa438, 0x1000, 0xa438, 0x80ad,
+ 0xa438, 0x1800, 0xa438, 0x01f2, 0xa438, 0x1000, 0xa438, 0x1d0b,
+ 0xa438, 0x1000, 0xa438, 0x80ad, 0xa438, 0x1800, 0xa438, 0x01f9,
+ 0xa438, 0x2969, 0xa438, 0x80a3, 0xa438, 0xd700, 0xa438, 0x606b,
+ 0xa438, 0xd701, 0xa438, 0x60b4, 0xa438, 0x1000, 0xa438, 0x80ad,
+ 0xa438, 0x1800, 0xa438, 0x0551, 0xa438, 0xd196, 0xa438, 0xd04d,
+ 0xa438, 0x1000, 0xa438, 0x80ad, 0xa438, 0x1800, 0xa438, 0x054d,
+ 0xa438, 0xd208, 0xa438, 0x0c09, 0xa438, 0x1301, 0xa438, 0x1000,
+ 0xa438, 0x1cd2, 0xa438, 0xd701, 0xa438, 0x5fa3, 0xa438, 0xb302,
+ 0xa438, 0xd200, 0xa438, 0x0800, 0xa438, 0xd705, 0xa438, 0x6064,
+ 0xa438, 0x1800, 0xa438, 0x140a, 0xa438, 0x8810, 0xa438, 0xd199,
+ 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x1cd2, 0xa438, 0xd700,
+ 0xa438, 0x5fba, 0xa438, 0x1800, 0xa438, 0x140a, 0xa436, 0xA10E,
+ 0xa438, 0xffff, 0xa436, 0xA10C, 0xa438, 0x1352, 0xa436, 0xA10A,
+ 0xa438, 0x0545, 0xa436, 0xA108, 0xa438, 0x01ed, 0xa436, 0xA106,
+ 0xa438, 0x1bbf, 0xa436, 0xA104, 0xa438, 0x114b, 0xa436, 0xA102,
+ 0xa438, 0x14bf, 0xa436, 0xA100, 0xa438, 0x07ce, 0xa436, 0xA110,
+ 0xa438, 0x007f, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012,
+ 0xa438, 0x1ff8, 0xa436, 0xA014, 0xa438, 0xd1ce, 0xa438, 0x0000,
+ 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000,
+ 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA164, 0xa438, 0x07fc,
+ 0xa436, 0xA166, 0xa438, 0x143d, 0xa436, 0xA168, 0xa438, 0x3fff,
+ 0xa436, 0xA16A, 0xa438, 0x3fff, 0xa436, 0xA16C, 0xa438, 0x3fff,
+ 0xa436, 0xA16E, 0xa438, 0x3fff, 0xa436, 0xA170, 0xa438, 0x3fff,
+ 0xa436, 0xA172, 0xa438, 0x3fff, 0xa436, 0xA162, 0xa438, 0x0003,
+ 0xa436, 0xb87c, 0xa438, 0x8994, 0xa436, 0xb87e, 0xa438, 0xaf89,
+ 0xa438, 0xacaf, 0xa438, 0x89e4, 0xa438, 0xaf89, 0xa438, 0xecaf,
+ 0xa438, 0x8a04, 0xa438, 0xaf8a, 0xa438, 0x2eaf, 0xa438, 0x8a4a,
+ 0xa438, 0xaf8d, 0xa438, 0x31af, 0xa438, 0x8dc6, 0xa438, 0x1f55,
+ 0xa438, 0xe18f, 0xa438, 0xe3a1, 0xa438, 0x0007, 0xa438, 0xee86,
+ 0xa438, 0xe900, 0xa438, 0xaf4f, 0xa438, 0x9ead, 0xa438, 0x281b,
+ 0xa438, 0xe18f, 0xa438, 0xfcef, 0xa438, 0x71bf, 0xa438, 0x74f6,
+ 0xa438, 0x027e, 0xa438, 0xd2ef, 0xa438, 0x641c, 0xa438, 0x670d,
+ 0xa438, 0x67ef, 0xa438, 0x461f, 0xa438, 0x00bf, 0xa438, 0x74f6,
+ 0xa438, 0x027e, 0xa438, 0xdee1, 0xa438, 0x8fe3, 0xa438, 0x0d11,
+ 0xa438, 0xe58f, 0xa438, 0xe313, 0xa438, 0xaeca, 0xa438, 0x028d,
+ 0xa438, 0xd1d3, 0xa438, 0x01af, 0xa438, 0x40d1, 0xa438, 0xbf7a,
+ 0xa438, 0x6102, 0xa438, 0x7d44, 0xa438, 0xa100, 0xa438, 0x09e0,
+ 0xa438, 0x8ffa, 0xa438, 0xe18f, 0xa438, 0xfbaf, 0xa438, 0x683d,
+ 0xa438, 0x027f, 0xa438, 0xa9af, 0xa438, 0x682c, 0xa438, 0xbf8e,
+ 0xa438, 0x4102, 0xa438, 0x7d44, 0xa438, 0xe58f, 0xa438, 0xecbf,
+ 0xa438, 0x74cc, 0xa438, 0x027d, 0xa438, 0x44e3, 0xa438, 0x8fed,
+ 0xa438, 0x0d31, 0xa438, 0xf63f, 0xa438, 0x0d11, 0xa438, 0xf62f,
+ 0xa438, 0x1b13, 0xa438, 0xad2f, 0xa438, 0x06bf, 0xa438, 0x8e41,
+ 0xa438, 0x027c, 0xa438, 0xf9d1, 0xa438, 0x01af, 0xa438, 0x5974,
+ 0xa438, 0xee88, 0xa438, 0x8600, 0xa438, 0xe08f, 0xa438, 0xebad,
+ 0xa438, 0x200b, 0xa438, 0xe18f, 0xa438, 0xecbf, 0xa438, 0x8e41,
+ 0xa438, 0x027d, 0xa438, 0x25ae, 0xa438, 0x04ee, 0xa438, 0x8feb,
+ 0xa438, 0x01af, 0xa438, 0x5945, 0xa438, 0xad28, 0xa438, 0x2ce0,
+ 0xa438, 0x8fea, 0xa438, 0xa000, 0xa438, 0x0502, 0xa438, 0x8af0,
+ 0xa438, 0xae1e, 0xa438, 0xa001, 0xa438, 0x0502, 0xa438, 0x8b9f,
+ 0xa438, 0xae16, 0xa438, 0xa002, 0xa438, 0x0502, 0xa438, 0x8c0f,
+ 0xa438, 0xae0e, 0xa438, 0xa003, 0xa438, 0x0502, 0xa438, 0x8c95,
+ 0xa438, 0xae06, 0xa438, 0xa004, 0xa438, 0x0302, 0xa438, 0x8d08,
+ 0xa438, 0xaf63, 0xa438, 0x8902, 0xa438, 0x8a7f, 0xa438, 0xaf63,
+ 0xa438, 0x81f8, 0xa438, 0xef49, 0xa438, 0xf8e0, 0xa438, 0x8015,
+ 0xa438, 0xad21, 0xa438, 0x19bf, 0xa438, 0x7bd8, 0xa438, 0x027c,
+ 0xa438, 0xf9bf, 0xa438, 0x7bf3, 0xa438, 0x027d, 0xa438, 0x44bf,
+ 0xa438, 0x7bf6, 0xa438, 0x027c, 0xa438, 0xf902, 0xa438, 0x638e,
+ 0xa438, 0xee8f, 0xa438, 0xea00, 0xa438, 0xe080, 0xa438, 0x16ad,
+ 0xa438, 0x233d, 0xa438, 0xbf7b, 0xa438, 0xf302, 0xa438, 0x7d44,
+ 0xa438, 0xbf7a, 0xa438, 0x9402, 0xa438, 0x7cf9, 0xa438, 0xbf8e,
+ 0xa438, 0x4402, 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa602,
+ 0xa438, 0x7cf9, 0xa438, 0xbf7a, 0xa438, 0xa302, 0xa438, 0x7cf9,
+ 0xa438, 0xbf7a, 0xa438, 0xa902, 0xa438, 0x7cf9, 0xa438, 0xbf7a,
+ 0xa438, 0xac02, 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x4702,
+ 0xa438, 0x7cf9, 0xa438, 0xbf8e, 0xa438, 0x4a02, 0xa438, 0x7cf9,
+ 0xa438, 0x0263, 0xa438, 0x8eee, 0xa438, 0x8fea, 0xa438, 0x00bf,
+ 0xa438, 0x7c02, 0xa438, 0x027c, 0xa438, 0xf9fc, 0xa438, 0xef94,
+ 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xfbef, 0xa438, 0x79fb,
+ 0xa438, 0xe080, 0xa438, 0x15ac, 0xa438, 0x2103, 0xa438, 0xaf8b,
+ 0xa438, 0x70ee, 0xa438, 0x8888, 0xa438, 0x00ee, 0xa438, 0x888a,
+ 0xa438, 0x00ee, 0xa438, 0x888b, 0xa438, 0x00bf, 0xa438, 0x7bd8,
+ 0xa438, 0x027d, 0xa438, 0x02bf, 0xa438, 0x6000, 0xa438, 0xd788,
+ 0xa438, 0x881f, 0xa438, 0x44d4, 0xa438, 0x000c, 0xa438, 0x0273,
+ 0xa438, 0x3b02, 0xa438, 0x7fa9, 0xa438, 0xac28, 0xa438, 0x05ac,
+ 0xa438, 0x290d, 0xa438, 0xae18, 0xa438, 0xe188, 0xa438, 0x98bf,
+ 0xa438, 0x7be1, 0xa438, 0x027d, 0xa438, 0x25ae, 0xa438, 0x18e1,
+ 0xa438, 0x8898, 0xa438, 0x0d11, 0xa438, 0xbf7b, 0xa438, 0xe102,
+ 0xa438, 0x7d25, 0xa438, 0xae0b, 0xa438, 0xe188, 0xa438, 0x980d,
+ 0xa438, 0x12bf, 0xa438, 0x7be1, 0xa438, 0x027d, 0xa438, 0x25bf,
+ 0xa438, 0x88a0, 0xa438, 0xda19, 0xa438, 0xdb19, 0xa438, 0xd819,
+ 0xa438, 0xd91f, 0xa438, 0x77bf, 0xa438, 0x88b1, 0xa438, 0xde19,
+ 0xa438, 0xdf19, 0xa438, 0xdc19, 0xa438, 0xdd19, 0xa438, 0x17a7,
+ 0xa438, 0x0004, 0xa438, 0xf302, 0xa438, 0x63cd, 0xa438, 0xee8f,
+ 0xa438, 0xea01, 0xa438, 0xe080, 0xa438, 0x16ad, 0xa438, 0x2319,
+ 0xa438, 0xee88, 0xa438, 0x8800, 0xa438, 0xee88, 0xa438, 0x8a00,
+ 0xa438, 0xee88, 0xa438, 0x8b00, 0xa438, 0xbf8e, 0xa438, 0x4402,
+ 0xa438, 0x7d02, 0xa438, 0x0263, 0xa438, 0xcdee, 0xa438, 0x8fea,
+ 0xa438, 0x0102, 0xa438, 0x70de, 0xa438, 0xbf7c, 0xa438, 0x0202,
+ 0xa438, 0x7d02, 0xa438, 0xffef, 0xa438, 0x97ff, 0xa438, 0xfdfc,
+ 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xef69, 0xa438, 0xfae0,
+ 0xa438, 0x888a, 0xa438, 0xe188, 0xa438, 0x8b14, 0xa438, 0xe488,
+ 0xa438, 0x8ae5, 0xa438, 0x888b, 0xa438, 0xbf88, 0xa438, 0x94d8,
+ 0xa438, 0x19d9, 0xa438, 0xef64, 0xa438, 0xe088, 0xa438, 0x8ae1,
+ 0xa438, 0x888b, 0xa438, 0x1b46, 0xa438, 0x9f30, 0xa438, 0x1f44,
+ 0xa438, 0xe488, 0xa438, 0x8ae5, 0xa438, 0x888b, 0xa438, 0xe080,
+ 0xa438, 0x15ad, 0xa438, 0x211a, 0xa438, 0x0260, 0xa438, 0xece0,
+ 0xa438, 0x8016, 0xa438, 0xad23, 0xa438, 0x1602, 0xa438, 0x7c86,
+ 0xa438, 0xef47, 0xa438, 0xe48f, 0xa438, 0xe9e5, 0xa438, 0x8fe8,
+ 0xa438, 0xee8f, 0xa438, 0xea02, 0xa438, 0xae0b, 0xa438, 0x028c,
+ 0xa438, 0x2eae, 0xa438, 0x0602, 0xa438, 0x8bfe, 0xa438, 0x0270,
+ 0xa438, 0xdefe, 0xa438, 0xef96, 0xa438, 0xfefd, 0xa438, 0xfc04,
+ 0xa438, 0xf8e1, 0xa438, 0x8888, 0xa438, 0x11e5, 0xa438, 0x8888,
+ 0xa438, 0xad2a, 0xa438, 0x04ee, 0xa438, 0x8888, 0xa438, 0x00fc,
+ 0xa438, 0x04f8, 0xa438, 0xfafb, 0xa438, 0xe08f, 0xa438, 0xe9e1,
+ 0xa438, 0x8fe8, 0xa438, 0xef64, 0xa438, 0x1f00, 0xa438, 0xe18f,
+ 0xa438, 0xe6ef, 0xa438, 0x7402, 0xa438, 0x7ca1, 0xa438, 0xad50,
+ 0xa438, 0x0302, 0xa438, 0x8c2e, 0xa438, 0xfffe, 0xa438, 0xfc04,
+ 0xa438, 0xf8fa, 0xa438, 0xef69, 0xa438, 0xfbbf, 0xa438, 0x7bf3,
+ 0xa438, 0x027d, 0xa438, 0x44ac, 0xa438, 0x284c, 0xa438, 0x0264,
+ 0xa438, 0x1cbf, 0xa438, 0x8e47, 0xa438, 0x027d, 0xa438, 0x02bf,
+ 0xa438, 0x8e4a, 0xa438, 0x027d, 0xa438, 0x02d1, 0xa438, 0x43b1,
+ 0xa438, 0xfebf, 0xa438, 0x7aa6, 0xa438, 0x027c, 0xa438, 0xf9bf,
+ 0xa438, 0x7aa3, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa9,
+ 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aac, 0xa438, 0x027d,
+ 0xa438, 0x02d1, 0xa438, 0x80e0, 0xa438, 0x8888, 0xa438, 0x100e,
+ 0xa438, 0x11b0, 0xa438, 0xfcbf, 0xa438, 0x7a94, 0xa438, 0x027d,
+ 0xa438, 0x2502, 0xa438, 0x7c86, 0xa438, 0xef47, 0xa438, 0xe48f,
+ 0xa438, 0xe9e5, 0xa438, 0x8fe8, 0xa438, 0xee8f, 0xa438, 0xea03,
+ 0xa438, 0xae07, 0xa438, 0xee8f, 0xa438, 0xea01, 0xa438, 0x0270,
+ 0xa438, 0xdeff, 0xa438, 0xef96, 0xa438, 0xfefc, 0xa438, 0x04f8,
+ 0xa438, 0xf9fa, 0xa438, 0xfbef, 0xa438, 0x79fb, 0xa438, 0xbf7a,
+ 0xa438, 0x9402, 0xa438, 0x7d44, 0xa438, 0xef21, 0xa438, 0xbf7a,
+ 0xa438, 0xb802, 0xa438, 0x7d44, 0xa438, 0x1f21, 0xa438, 0x9e19,
+ 0xa438, 0xe08f, 0xa438, 0xe9e1, 0xa438, 0x8fe8, 0xa438, 0xef64,
+ 0xa438, 0x1f00, 0xa438, 0xe18f, 0xa438, 0xe4ef, 0xa438, 0x7402,
+ 0xa438, 0x7ca1, 0xa438, 0xad50, 0xa438, 0x3dee, 0xa438, 0x8fe7,
+ 0xa438, 0x01bf, 0xa438, 0x7a94, 0xa438, 0x027c, 0xa438, 0xf9bf,
+ 0xa438, 0x7aa6, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa3,
+ 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x7aa9, 0xa438, 0x027c,
+ 0xa438, 0xf9bf, 0xa438, 0x7aac, 0xa438, 0x027d, 0xa438, 0x02bf,
+ 0xa438, 0x8e47, 0xa438, 0x027c, 0xa438, 0xf9bf, 0xa438, 0x8e4a,
+ 0xa438, 0x027c, 0xa438, 0xf902, 0xa438, 0x7c86, 0xa438, 0xef47,
+ 0xa438, 0xe48f, 0xa438, 0xe9e5, 0xa438, 0x8fe8, 0xa438, 0xee8f,
+ 0xa438, 0xea04, 0xa438, 0xffef, 0xa438, 0x97ff, 0xa438, 0xfefd,
+ 0xa438, 0xfc04, 0xa438, 0xf8fa, 0xa438, 0xfbe0, 0xa438, 0x8fe9,
+ 0xa438, 0xe18f, 0xa438, 0xe8ef, 0xa438, 0x641f, 0xa438, 0x00e1,
+ 0xa438, 0x8fe5, 0xa438, 0xef74, 0xa438, 0x027c, 0xa438, 0xa1ad,
+ 0xa438, 0x500d, 0xa438, 0x0263, 0xa438, 0x8e02, 0xa438, 0x8bfe,
+ 0xa438, 0xee8f, 0xa438, 0xea01, 0xa438, 0x0270, 0xa438, 0xdeff,
+ 0xa438, 0xfefc, 0xa438, 0x04e3, 0xa438, 0x8fd8, 0xa438, 0xe787,
+ 0xa438, 0x75e4, 0xa438, 0x8fe1, 0xa438, 0xe58f, 0xa438, 0xe2bf,
+ 0xa438, 0x8fd9, 0xa438, 0xef32, 0xa438, 0x0c31, 0xa438, 0x1a93,
+ 0xa438, 0xdc19, 0xa438, 0xdd02, 0xa438, 0x7fa9, 0xa438, 0xac2a,
+ 0xa438, 0x18e0, 0xa438, 0x8fe1, 0xa438, 0xe18f, 0xa438, 0xe2ef,
+ 0xa438, 0x74e1, 0xa438, 0x8775, 0xa438, 0x1f00, 0xa438, 0xef64,
+ 0xa438, 0xe18f, 0xa438, 0xd8e5, 0xa438, 0x8775, 0xa438, 0xaf4d,
+ 0xa438, 0x72bf, 0xa438, 0x7b3c, 0xa438, 0xef32, 0xa438, 0x4b03,
+ 0xa438, 0x1a93, 0xa438, 0x027d, 0xa438, 0x44ef, 0xa438, 0x64e1,
+ 0xa438, 0x8fff, 0xa438, 0x1f00, 0xa438, 0xef74, 0xa438, 0x1b67,
+ 0xa438, 0xac4f, 0xa438, 0xcee0, 0xa438, 0x8ffd, 0xa438, 0xe18f,
+ 0xa438, 0xfeef, 0xa438, 0x64e0, 0xa438, 0x8fe1, 0xa438, 0xe18f,
+ 0xa438, 0xe2ef, 0xa438, 0x7402, 0xa438, 0x7c53, 0xa438, 0xac50,
+ 0xa438, 0x02ae, 0xa438, 0xb6e1, 0xa438, 0x8775, 0xa438, 0x1f00,
+ 0xa438, 0xef64, 0xa438, 0xe18f, 0xa438, 0xfcef, 0xa438, 0x711c,
+ 0xa438, 0x670d, 0xa438, 0x67ef, 0xa438, 0x46e5, 0xa438, 0x8775,
+ 0xa438, 0xef32, 0xa438, 0xd101, 0xa438, 0xa300, 0xa438, 0x02ae,
+ 0xa438, 0x050c, 0xa438, 0x1183, 0xa438, 0xaef6, 0xa438, 0xe08f,
+ 0xa438, 0xe31e, 0xa438, 0x10e5, 0xa438, 0x8fe3, 0xa438, 0xae89,
+ 0xa438, 0xe287, 0xa438, 0x75e6, 0xa438, 0x8fd8, 0xa438, 0x1f22,
+ 0xa438, 0xaf4d, 0xa438, 0x42f8, 0xa438, 0xf9ef, 0xa438, 0x59fa,
+ 0xa438, 0xfbbf, 0xa438, 0x8fee, 0xa438, 0x027f, 0xa438, 0xa90d,
+ 0xa438, 0x1149, 0xa438, 0x041a, 0xa438, 0x91d7, 0xa438, 0x8df3,
+ 0xa438, 0xd68e, 0xa438, 0x2302, 0xa438, 0x72aa, 0xa438, 0xfffe,
+ 0xa438, 0xef95, 0xa438, 0xfdfc, 0xa438, 0x0400, 0xa438, 0x7591,
+ 0xa438, 0x0275, 0xa438, 0x4404, 0xa438, 0x758e, 0xa438, 0x2675,
+ 0xa438, 0x4100, 0xa438, 0x8e26, 0xa438, 0x028e, 0xa438, 0x2304,
+ 0xa438, 0x759d, 0xa438, 0x2675, 0xa438, 0x4700, 0xa438, 0x8e32,
+ 0xa438, 0x028e, 0xa438, 0x2f04, 0xa438, 0x8e2c, 0xa438, 0x268e,
+ 0xa438, 0x2900, 0xa438, 0x8e3e, 0xa438, 0x028e, 0xa438, 0x3b04,
+ 0xa438, 0x8e38, 0xa438, 0x268e, 0xa438, 0x35fe, 0xa438, 0xad96,
+ 0xa438, 0xdcad, 0xa438, 0x96ba, 0xa438, 0xad96, 0xa438, 0x98ad,
+ 0xa438, 0x9676, 0xa438, 0xad98, 0xa438, 0x54ad, 0xa438, 0x9876,
+ 0xa438, 0xae38, 0xa438, 0x54ae, 0xa438, 0x38fe, 0xa438, 0xae3a,
+ 0xa438, 0xdcae, 0xa438, 0x3abb, 0xa438, 0xbf14, 0xa438, 0x99bd,
+ 0xa438, 0xe0cc, 0xa438, 0xbdc8, 0xa438, 0xddbd, 0xa438, 0xc800,
+ 0xa436, 0xb85e, 0xa438, 0x4f9a, 0xa436, 0xb860, 0xa438, 0x40cf,
+ 0xa436, 0xb862, 0xa438, 0x6829, 0xa436, 0xb864, 0xa438, 0x5972,
+ 0xa436, 0xb886, 0xa438, 0x5941, 0xa436, 0xb888, 0xa438, 0x636b,
+ 0xa436, 0xb88a, 0xa438, 0x4d6b, 0xa436, 0xb88c, 0xa438, 0x4d40,
+ 0xa436, 0xb838, 0xa438, 0x00ff, 0xb820, 0x0010, 0xa436, 0x8608,
+ 0xa438, 0xaf86, 0xa438, 0xdaaf, 0xa438, 0x894c, 0xa438, 0xaf8a,
+ 0xa438, 0xf8af, 0xa438, 0x8bf3, 0xa438, 0xaf8b, 0xa438, 0xf3af,
+ 0xa438, 0x8bf3, 0xa438, 0xaf8b, 0xa438, 0xf3af, 0xa438, 0x8bf3,
+ 0xa438, 0x006f, 0xa438, 0x4a03, 0xa438, 0x6f47, 0xa438, 0x266f,
+ 0xa438, 0x5900, 0xa438, 0x6f4d, 0xa438, 0x016f, 0xa438, 0x5004,
+ 0xa438, 0x6f56, 0xa438, 0x056f, 0xa438, 0x5f06, 0xa438, 0x6f5c,
+ 0xa438, 0x2774, 0xa438, 0x7800, 0xa438, 0x6f68, 0xa438, 0x246f,
+ 0xa438, 0x6b20, 0xa438, 0x6f6e, 0xa438, 0x206f, 0xa438, 0x7410,
+ 0xa438, 0x7469, 0xa438, 0x1074, 0xa438, 0x6c10, 0xa438, 0x746f,
+ 0xa438, 0x1074, 0xa438, 0x7225, 0xa438, 0x8bfc, 0xa438, 0x008c,
+ 0xa438, 0x0802, 0xa438, 0x8c02, 0xa438, 0x038b, 0xa438, 0xff04,
+ 0xa438, 0x6eed, 0xa438, 0x278c, 0xa438, 0x0520, 0xa438, 0x74da,
+ 0xa438, 0x2074, 0xa438, 0xdd20, 0xa438, 0x74e0, 0xa438, 0x0074,
+ 0xa438, 0xe300, 0xa438, 0x6ef3, 0xa438, 0x006e, 0xa438, 0xf600,
+ 0xa438, 0x6ef9, 0xa438, 0x006e, 0xa438, 0xfc00, 0xa438, 0x6eff,
+ 0xa438, 0x006f, 0xa438, 0x0200, 0xa438, 0x6f05, 0xa438, 0x026f,
+ 0xa438, 0x0802, 0xa438, 0x6f0b, 0xa438, 0x026f, 0xa438, 0x0e02,
+ 0xa438, 0x6f11, 0xa438, 0x026f, 0xa438, 0x1402, 0xa438, 0x6f17,
+ 0xa438, 0x226f, 0xa438, 0x1a00, 0xa438, 0x723e, 0xa438, 0x016e,
+ 0xa438, 0xed24, 0xa438, 0x6f50, 0xa438, 0x0072, 0xa438, 0x4701,
+ 0xa438, 0x724a, 0xa438, 0x0272, 0xa438, 0x4d23, 0xa438, 0x7250,
+ 0xa438, 0x1074, 0xa438, 0x6910, 0xa438, 0x746c, 0xa438, 0x1074,
+ 0xa438, 0x6f00, 0xa438, 0x7472, 0xa438, 0x158c, 0xa438, 0x0b15,
+ 0xa438, 0x8c0e, 0xa438, 0x158c, 0xa438, 0x1105, 0xa438, 0x8c14,
+ 0xa438, 0x006f, 0xa438, 0x4a03, 0xa438, 0x6f47, 0xa438, 0x266f,
+ 0xa438, 0x5900, 0xa438, 0x731f, 0xa438, 0x0273, 0xa438, 0x2203,
+ 0xa438, 0x8c08, 0xa438, 0xee84, 0xa438, 0x7100, 0xa438, 0x0286,
+ 0xa438, 0xece0, 0xa438, 0x8043, 0xa438, 0xf626, 0xa438, 0xe480,
+ 0xa438, 0x43af, 0xa438, 0x6611, 0xa438, 0xf8e0, 0xa438, 0x8012,
+ 0xa438, 0xac26, 0xa438, 0x03af, 0xa438, 0x86ff, 0xa438, 0x0287,
+ 0xa438, 0x0102, 0xa438, 0x8906, 0xa438, 0x0289, 0xa438, 0x29fc,
+ 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x59f9, 0xa438, 0xfaee,
+ 0xa438, 0x8476, 0xa438, 0x00d6, 0xa438, 0x008f, 0xa438, 0x0266,
+ 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f,
+ 0xa438, 0x08e4, 0xa438, 0x8fe7, 0xa438, 0xe58f, 0xa438, 0xe8ae,
+ 0xa438, 0x06e0, 0xa438, 0x8fe7, 0xa438, 0xe18f, 0xa438, 0xe8ee,
+ 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x00c0, 0xa438, 0x0266,
+ 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x00d6, 0xa438, 0x0090,
+ 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200,
+ 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8fe9, 0xa438, 0xe58f,
+ 0xa438, 0xeaae, 0xa438, 0x06e0, 0xa438, 0x8fe9, 0xa438, 0xe18f,
+ 0xa438, 0xeaee, 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x00c1,
+ 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x00d6,
+ 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e,
+ 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8feb,
+ 0xa438, 0xe58f, 0xa438, 0xecae, 0xa438, 0x06e0, 0xa438, 0x8feb,
+ 0xa438, 0xe18f, 0xa438, 0xecee, 0xa438, 0x8476, 0xa438, 0x01d6,
+ 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476,
+ 0xa438, 0x01d6, 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef,
+ 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4,
+ 0xa438, 0x8fed, 0xa438, 0xe58f, 0xa438, 0xeeae, 0xa438, 0x06e0,
+ 0xa438, 0x8fed, 0xa438, 0xe18f, 0xa438, 0xeeee, 0xa438, 0x8476,
+ 0xa438, 0x02d6, 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee,
+ 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x0090, 0xa438, 0x0266,
+ 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f,
+ 0xa438, 0x08e4, 0xa438, 0x8fef, 0xa438, 0xe58f, 0xa438, 0xf0ae,
+ 0xa438, 0x06e0, 0xa438, 0x8fef, 0xa438, 0xe18f, 0xa438, 0xf0ee,
+ 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x00c1, 0xa438, 0x0266,
+ 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x01d6, 0xa438, 0x0091,
+ 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200,
+ 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff1, 0xa438, 0xe58f,
+ 0xa438, 0xf2ae, 0xa438, 0x06e0, 0xa438, 0x8ff1, 0xa438, 0xe18f,
+ 0xa438, 0xf2ee, 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x00c2,
+ 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x02d6,
+ 0xa438, 0x008f, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e,
+ 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff3,
+ 0xa438, 0xe58f, 0xa438, 0xf4ae, 0xa438, 0x06e0, 0xa438, 0x8ff3,
+ 0xa438, 0xe18f, 0xa438, 0xf4ee, 0xa438, 0x8476, 0xa438, 0x04d6,
+ 0xa438, 0x00c0, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476,
+ 0xa438, 0x02d6, 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef,
+ 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4,
+ 0xa438, 0x8ff5, 0xa438, 0xe58f, 0xa438, 0xf6ae, 0xa438, 0x06e0,
+ 0xa438, 0x8ff5, 0xa438, 0xe18f, 0xa438, 0xf6ee, 0xa438, 0x8476,
+ 0xa438, 0x04d6, 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee,
+ 0xa438, 0x8476, 0xa438, 0x02d6, 0xa438, 0x0091, 0xa438, 0x0266,
+ 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f,
+ 0xa438, 0x08e4, 0xa438, 0x8ff7, 0xa438, 0xe58f, 0xa438, 0xf8ae,
+ 0xa438, 0x06e0, 0xa438, 0x8ff7, 0xa438, 0xe18f, 0xa438, 0xf8ee,
+ 0xa438, 0x8476, 0xa438, 0x04d6, 0xa438, 0x00c2, 0xa438, 0x0266,
+ 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x03d6, 0xa438, 0x008f,
+ 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e, 0xa438, 0x1200,
+ 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ff9, 0xa438, 0xe58f,
+ 0xa438, 0xfaae, 0xa438, 0x06e0, 0xa438, 0x8ff9, 0xa438, 0xe18f,
+ 0xa438, 0xfaee, 0xa438, 0x8476, 0xa438, 0x08d6, 0xa438, 0x00c0,
+ 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476, 0xa438, 0x03d6,
+ 0xa438, 0x0090, 0xa438, 0x0266, 0xa438, 0x53ef, 0xa438, 0x643e,
+ 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4, 0xa438, 0x8ffb,
+ 0xa438, 0xe58f, 0xa438, 0xfcae, 0xa438, 0x06e0, 0xa438, 0x8ffb,
+ 0xa438, 0xe18f, 0xa438, 0xfcee, 0xa438, 0x8476, 0xa438, 0x08d6,
+ 0xa438, 0x00c1, 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x8476,
+ 0xa438, 0x03d6, 0xa438, 0x0091, 0xa438, 0x0266, 0xa438, 0x53ef,
+ 0xa438, 0x643e, 0xa438, 0x1200, 0xa438, 0xac4f, 0xa438, 0x08e4,
+ 0xa438, 0x8ffd, 0xa438, 0xe58f, 0xa438, 0xfeae, 0xa438, 0x06e0,
+ 0xa438, 0x8ffd, 0xa438, 0xe18f, 0xa438, 0xfeee, 0xa438, 0x8476,
+ 0xa438, 0x08d6, 0xa438, 0x00c2, 0xa438, 0x0266, 0xa438, 0x71fe,
+ 0xa438, 0xfdef, 0xa438, 0x95fd, 0xa438, 0xfc04, 0xa438, 0xf8f9,
+ 0xa438, 0xfad4, 0xa438, 0x0400, 0xa438, 0xd600, 0xa438, 0x0dd3,
+ 0xa438, 0x0fe7, 0xa438, 0x8476, 0xa438, 0x0266, 0xa438, 0x71d4,
+ 0xa438, 0x1400, 0xa438, 0xd600, 0xa438, 0x0dd3, 0xa438, 0x0fe7,
+ 0xa438, 0x8476, 0xa438, 0x0266, 0xa438, 0x71fe, 0xa438, 0xfdfc,
+ 0xa438, 0x04f8, 0xa438, 0xf9fa, 0xa438, 0xd410, 0xa438, 0x00d6,
+ 0xa438, 0x000d, 0xa438, 0xd30f, 0xa438, 0xe784, 0xa438, 0x7602,
+ 0xa438, 0x6671, 0xa438, 0xd400, 0xa438, 0x00d6, 0xa438, 0x000d,
+ 0xa438, 0xd30f, 0xa438, 0xe784, 0xa438, 0x7602, 0xa438, 0x6671,
+ 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xe080, 0xa438, 0x4fac,
+ 0xa438, 0x2317, 0xa438, 0xe080, 0xa438, 0x44ad, 0xa438, 0x231a,
+ 0xa438, 0x0289, 0xa438, 0x75e0, 0xa438, 0x8044, 0xa438, 0xac23,
+ 0xa438, 0x11bf, 0xa438, 0x6ecf, 0xa438, 0x0276, 0xa438, 0x74ae,
+ 0xa438, 0x0902, 0xa438, 0x8adb, 0xa438, 0x021f, 0xa438, 0xe702,
+ 0xa438, 0x1fbb, 0xa438, 0xaf1f, 0xa438, 0x95f8, 0xa438, 0xf9ef,
+ 0xa438, 0x59f9, 0xa438, 0xfafb, 0xa438, 0xe080, 0xa438, 0x12ac,
+ 0xa438, 0x2303, 0xa438, 0xaf8a, 0xa438, 0xd0d4, 0xa438, 0x0120,
+ 0xa438, 0xd600, 0xa438, 0x10d2, 0xa438, 0x0fe6, 0xa438, 0x8476,
+ 0xa438, 0x0266, 0xa438, 0x71ee, 0xa438, 0x846f, 0xa438, 0x00d4,
+ 0xa438, 0x000f, 0xa438, 0xbf72, 0xa438, 0x9e02, 0xa438, 0x7697,
+ 0xa438, 0x0275, 0xa438, 0xbeef, 0xa438, 0x47e4, 0xa438, 0x8474,
+ 0xa438, 0xe584, 0xa438, 0x75bf, 0xa438, 0x729b, 0xa438, 0x0276,
+ 0xa438, 0xb6e5, 0xa438, 0x846f, 0xa438, 0xef31, 0xa438, 0xbf6e,
+ 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e,
+ 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e,
+ 0xa438, 0x0f02, 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xac40,
+ 0xa438, 0x05a3, 0xa438, 0x0f0c, 0xa438, 0xae26, 0xa438, 0xa303,
+ 0xa438, 0x02ae, 0xa438, 0x21a3, 0xa438, 0x0c02, 0xa438, 0xae1c,
+ 0xa438, 0xe084, 0xa438, 0x74e1, 0xa438, 0x8475, 0xa438, 0xef64,
+ 0xa438, 0xd000, 0xa438, 0xd196, 0xa438, 0xef74, 0xa438, 0x0275,
+ 0xa438, 0xd9ad, 0xa438, 0x50b7, 0xa438, 0xe083, 0xa438, 0xecf7,
+ 0xa438, 0x23e4, 0xa438, 0x83ec, 0xa438, 0xbf72, 0xa438, 0x9e02,
+ 0xa438, 0x766b, 0xa438, 0x0287, 0xa438, 0x0102, 0xa438, 0x8906,
+ 0xa438, 0xee83, 0xa438, 0xe800, 0xa438, 0xbf72, 0xa438, 0x6b02,
+ 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x6e02, 0xa438, 0x766b,
+ 0xa438, 0xbf72, 0xa438, 0x7102, 0xa438, 0x766b, 0xa438, 0xbf72,
+ 0xa438, 0x7402, 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7702,
+ 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x7a02, 0xa438, 0x766b,
+ 0xa438, 0xd400, 0xa438, 0x0fbf, 0xa438, 0x7295, 0xa438, 0x0276,
+ 0xa438, 0x97d7, 0xa438, 0x0400, 0xa438, 0xbf6e, 0xa438, 0x0602,
+ 0xa438, 0x76b6, 0xa438, 0xef64, 0xa438, 0xbf6e, 0xa438, 0x0902,
+ 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xbf6e, 0xa438, 0x0f02,
+ 0xa438, 0x76b6, 0xa438, 0x1e64, 0xa438, 0xac40, 0xa438, 0x0fbf,
+ 0xa438, 0x7298, 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x83e8,
+ 0xa438, 0xa10f, 0xa438, 0x28af, 0xa438, 0x8a95, 0xa438, 0xbf8b,
+ 0xa438, 0xf302, 0xa438, 0x76b6, 0xa438, 0xac28, 0xa438, 0x02ae,
+ 0xa438, 0x0bbf, 0xa438, 0x8bf9, 0xa438, 0x0276, 0xa438, 0xb6e5,
+ 0xa438, 0x83e8, 0xa438, 0xae09, 0xa438, 0xbf8b, 0xa438, 0xf602,
+ 0xa438, 0x76b6, 0xa438, 0xe583, 0xa438, 0xe8a1, 0xa438, 0x0303,
+ 0xa438, 0xaf8a, 0xa438, 0x95b7, 0xa438, 0xafe2, 0xa438, 0x83ec,
+ 0xa438, 0xf735, 0xa438, 0xe683, 0xa438, 0xecbf, 0xa438, 0x7295,
+ 0xa438, 0x0276, 0xa438, 0x6bbf, 0xa438, 0x726b, 0xa438, 0x0276,
+ 0xa438, 0x74bf, 0xa438, 0x726e, 0xa438, 0x0276, 0xa438, 0x74bf,
+ 0xa438, 0x7271, 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x7274,
+ 0xa438, 0x0276, 0xa438, 0x74bf, 0xa438, 0x7277, 0xa438, 0x0276,
+ 0xa438, 0x74bf, 0xa438, 0x727a, 0xa438, 0x0276, 0xa438, 0x7402,
+ 0xa438, 0x8929, 0xa438, 0xd401, 0xa438, 0x28d6, 0xa438, 0x0010,
+ 0xa438, 0xd20f, 0xa438, 0xe684, 0xa438, 0x7602, 0xa438, 0x6671,
+ 0xa438, 0x021f, 0xa438, 0xbbff, 0xa438, 0xfefd, 0xa438, 0xef95,
+ 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x59f9,
+ 0xa438, 0xe080, 0xa438, 0x12ad, 0xa438, 0x230c, 0xa438, 0xbf72,
+ 0xa438, 0x9e02, 0xa438, 0x766b, 0xa438, 0xbf72, 0xa438, 0x9502,
+ 0xa438, 0x766b, 0xa438, 0xfdef, 0xa438, 0x95fd, 0xa438, 0xfc04,
+ 0xa438, 0xbf6e, 0xa438, 0x0602, 0xa438, 0x76b6, 0xa438, 0xef64,
+ 0xa438, 0xbf6e, 0xa438, 0x0902, 0xa438, 0x76b6, 0xa438, 0x1e64,
+ 0xa438, 0xbf6e, 0xa438, 0x0f02, 0xa438, 0x76b6, 0xa438, 0x1e64,
+ 0xa438, 0xac40, 0xa438, 0x0ebf, 0xa438, 0x7298, 0xa438, 0x0276,
+ 0xa438, 0xb6e5, 0xa438, 0x8478, 0xa438, 0xa10f, 0xa438, 0x26ae,
+ 0xa438, 0x47bf, 0xa438, 0x8bf3, 0xa438, 0x0276, 0xa438, 0xb6ac,
+ 0xa438, 0x2802, 0xa438, 0xae0b, 0xa438, 0xbf8b, 0xa438, 0xf902,
+ 0xa438, 0x76b6, 0xa438, 0xe584, 0xa438, 0x78ae, 0xa438, 0x09bf,
+ 0xa438, 0x8bf6, 0xa438, 0x0276, 0xa438, 0xb6e5, 0xa438, 0x8478,
+ 0xa438, 0xa103, 0xa438, 0x02ae, 0xa438, 0x23e0, 0xa438, 0x8474,
+ 0xa438, 0xe184, 0xa438, 0x75ef, 0xa438, 0x64e0, 0xa438, 0x83fc,
+ 0xa438, 0xe183, 0xa438, 0xfdef, 0xa438, 0x7402, 0xa438, 0x75d9,
+ 0xa438, 0xad50, 0xa438, 0x0ae0, 0xa438, 0x83ec, 0xa438, 0xf721,
+ 0xa438, 0xe483, 0xa438, 0xecae, 0xa438, 0x03af, 0xa438, 0x68e4,
+ 0xa438, 0xbf72, 0xa438, 0x9502, 0xa438, 0x766b, 0xa438, 0xe083,
+ 0xa438, 0xebad, 0xa438, 0x2170, 0xa438, 0xbf73, 0xa438, 0x7f02,
+ 0xa438, 0x766b, 0xa438, 0xd700, 0xa438, 0x64bf, 0xa438, 0x73c4,
+ 0xa438, 0x0276, 0xa438, 0xb6a4, 0xa438, 0x0000, 0xa438, 0x02ae,
+ 0xa438, 0x0d87, 0xa438, 0xa700, 0xa438, 0x00ef, 0xa438, 0xe183,
+ 0xa438, 0xecf7, 0xa438, 0x2ae5, 0xa438, 0x83ec, 0xa438, 0xbf73,
+ 0xa438, 0xbe02, 0xa438, 0x766b, 0xa438, 0xbf73, 0xa438, 0xb802,
+ 0xa438, 0x766b, 0xa438, 0xbf73, 0xa438, 0xc102, 0xa438, 0x766b,
+ 0xa438, 0xbf73, 0xa438, 0xbb02, 0xa438, 0x766b, 0xa438, 0xe084,
+ 0xa438, 0x9ee1, 0xa438, 0x849f, 0xa438, 0xbf72, 0xa438, 0x7d02,
+ 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8002, 0xa438, 0x7697,
+ 0xa438, 0xbf72, 0xa438, 0x8302, 0xa438, 0x7697, 0xa438, 0xbf72,
+ 0xa438, 0x8602, 0xa438, 0x7697, 0xa438, 0xbf72, 0xa438, 0x8902,
+ 0xa438, 0x7674, 0xa438, 0xbf72, 0xa438, 0x8c02, 0xa438, 0x7674,
+ 0xa438, 0xbf72, 0xa438, 0x8f02, 0xa438, 0x7674, 0xa438, 0xbf72,
+ 0xa438, 0x9202, 0xa438, 0x7674, 0xa438, 0xee84, 0xa438, 0x7700,
+ 0xa438, 0xe080, 0xa438, 0x44f6, 0xa438, 0x21e4, 0xa438, 0x8044,
+ 0xa438, 0xaf68, 0xa438, 0xe411, 0xa438, 0xd1a4, 0xa438, 0x10bc,
+ 0xa438, 0x7432, 0xa438, 0xbc74, 0xa438, 0xbbbf, 0xa438, 0x14cc,
+ 0xa438, 0xbfaa, 0xa438, 0x00bf, 0xa438, 0x9055, 0xa438, 0xbf06,
+ 0xa438, 0x10bf, 0xa438, 0xb876, 0xa438, 0xbe02, 0xa438, 0x54be,
+ 0xa438, 0x0232, 0xa438, 0xbe02, 0xa438, 0x10be, 0xa438, 0x0200,
+ 0xa436, 0x8fe7, 0xa438, 0x1200, 0xa436, 0x8fe9, 0xa438, 0x1200,
+ 0xa436, 0x8feb, 0xa438, 0x1200, 0xa436, 0x8fed, 0xa438, 0x1200,
+ 0xa436, 0x8fef, 0xa438, 0x1200, 0xa436, 0x8ff1, 0xa438, 0x1200,
+ 0xa436, 0x8ff3, 0xa438, 0x1200, 0xa436, 0x8ff5, 0xa438, 0x1200,
+ 0xa436, 0x8ff7, 0xa438, 0x1200, 0xa436, 0x8ff9, 0xa438, 0x1200,
+ 0xa436, 0x8ffb, 0xa438, 0x1200, 0xa436, 0x8ffd, 0xa438, 0x1200,
+ 0xa436, 0xb818, 0xa438, 0x6602, 0xa436, 0xb81a, 0xa438, 0x1f75,
+ 0xa436, 0xb81c, 0xa438, 0x67eb, 0xa436, 0xb81e, 0xa438, 0xffff,
+ 0xa436, 0xb850, 0xa438, 0xffff, 0xa436, 0xb852, 0xa438, 0xffff,
+ 0xa436, 0xb878, 0xa438, 0xffff, 0xa436, 0xb884, 0xa438, 0xffff,
+ 0xa436, 0xb832, 0xa438, 0x0007, 0xB82E, 0x0000, 0xa436, 0x8023,
+ 0xa438, 0x0000, 0xB820, 0x0000, 0xFFFF, 0xFFFF
+};
+
+static const u16 phy_mcu_ram_code_8127a_2[] = {
+ 0xb892, 0x0000, 0xB88E, 0xc07c, 0xB890, 0x0203, 0xB890, 0x0304,
+ 0xB890, 0x0405, 0xB890, 0x0607, 0xB890, 0x0809, 0xB890, 0x0B0D,
+ 0xB890, 0x0F11, 0xB890, 0x1418, 0xB890, 0x1B20, 0xB890, 0x252B,
+ 0xB890, 0x343E, 0xB890, 0x4854, 0xB890, 0x6203, 0xB890, 0x0304,
+ 0xB890, 0x0506, 0xB890, 0x080A, 0xB890, 0x0C0E, 0xB890, 0x1216,
+ 0xB890, 0x1B22, 0xB890, 0x2A34, 0xB890, 0x404F, 0xB890, 0x6171,
+ 0xB890, 0x7884, 0xB890, 0x9097, 0xB890, 0x0203, 0xB890, 0x0406,
+ 0xB890, 0x080B, 0xB890, 0x0E13, 0xB890, 0x1820, 0xB890, 0x2A39,
+ 0xB890, 0x4856, 0xB890, 0xE060, 0xB890, 0xE050, 0xB890, 0xD080,
+ 0xB890, 0x8070, 0xB890, 0x70A0, 0xB890, 0x1000, 0xB890, 0x60D0,
+ 0xB890, 0xB010, 0xB890, 0xE0B0, 0xB890, 0x80C0, 0xB890, 0xE000,
+ 0xB890, 0x2020, 0xB890, 0x1020, 0xB890, 0xE090, 0xB890, 0x80C0,
+ 0xB890, 0x3020, 0xB890, 0x00E0, 0xB890, 0x40A0, 0xB890, 0xE020,
+ 0xB890, 0x5060, 0xB890, 0xE0D0, 0xB890, 0xA000, 0xB890, 0x3030,
+ 0xB890, 0x4070, 0xB890, 0xE0E0, 0xB890, 0xD080, 0xB890, 0xA010,
+ 0xB890, 0xE040, 0xB890, 0x80B0, 0xB890, 0x50B0, 0xB890, 0x2090,
+ 0xB820, 0x0000, 0xFFFF, 0xFFFF
+};
+
+static void
+rtl_real_set_phy_mcu_8127a_1(struct rtl_hw *hw)
+{
+ rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_8127a_1,
+ ARRAY_SIZE(phy_mcu_ram_code_8127a_1));
+}
+
+static void
+rtl_real_set_phy_mcu_8127a_2(struct rtl_hw *hw)
+{
+ rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_8127a_2,
+ ARRAY_SIZE(phy_mcu_ram_code_8127a_2));
+}
+
+void
+rtl_set_phy_mcu_8127a_1(struct rtl_hw *hw)
+{
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_real_set_phy_mcu_8127a_1(hw);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+
+ rtl_set_phy_mcu_patch_request(hw);
+
+ rtl_real_set_phy_mcu_8127a_2(hw);
+
+ rtl_clear_phy_mcu_patch_request(hw);
+}
diff --git a/drivers/net/r8169/base/rtl8127_mcu.h b/drivers/net/r8169/base/rtl8127_mcu.h
new file mode 100644
index 0000000000..3cea035cf8
--- /dev/null
+++ b/drivers/net/r8169/base/rtl8127_mcu.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2024 Realtek Corporation. All rights reserved
+ */
+
+#ifndef RTL8127_MCU_H
+#define RTL8127_MCU_H
+
+void rtl_set_mac_mcu_8127a_1(struct rtl_hw *hw);
+
+void rtl_set_phy_mcu_8127a_1(struct rtl_hw *hw);
+
+#endif /* RTL8127_MCU_H */
diff --git a/drivers/net/r8169/base/rtl8168kb.c b/drivers/net/r8169/base/rtl8168kb.c
index 1131f69856..e6f9d68c45 100644
--- a/drivers/net/r8169/base/rtl8168kb.c
+++ b/drivers/net/r8169/base/rtl8168kb.c
@@ -91,8 +91,13 @@ hw_mac_mcu_config_8168kb(struct rtl_hw *hw)
if (hw->NotWrMcuPatchCode)
return;
+ rtl_hw_disable_mac_mcu_bps(hw);
+
switch (hw->mcfg) {
case CFG_METHOD_52:
+ /* Get H/W mac mcu patch code version */
+ hw->hw_mcu_patch_code_ver = rtl_get_hw_mcu_patch_code_ver(hw);
+
rtl_set_mac_mcu_8125a_2(hw);
break;
case CFG_METHOD_53:
diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build
index 720d79acff..5662ecf0f5 100644
--- a/drivers/net/r8169/meson.build
+++ b/drivers/net/r8169/meson.build
@@ -27,4 +27,6 @@ sources = files(
'base/rtl8168fp.c',
'base/rtl8168fp_mcu.c',
'base/rtl8168m.c',
+ 'base/rtl8127.c',
+ 'base/rtl8127_mcu.c',
)
\ No newline at end of file
diff --git a/drivers/net/r8169/r8169_compat.h b/drivers/net/r8169/r8169_compat.h
index 631acffb64..8d06120518 100644
--- a/drivers/net/r8169/r8169_compat.h
+++ b/drivers/net/r8169/r8169_compat.h
@@ -105,6 +105,7 @@ enum mcfg {
CFG_METHOD_69,
CFG_METHOD_70,
CFG_METHOD_71,
+ CFG_METHOD_91,
CFG_METHOD_MAX,
CFG_METHOD_DEFAULT = 0xFF
};
@@ -393,8 +394,13 @@ enum RTL_register_content {
/* PHY status */
PowerSaveStatus = 0x80,
+ _1000bpsL = 0x80000,
+ _10000bpsF = 0x4000,
+ _10000bpsL = 0x2000,
_5000bpsF = 0x1000,
+ _5000bpsL = 0x800,
_2500bpsF = 0x400,
+ _2500bpsL = 0x200,
TxFlowCtrl = 0x40,
RxFlowCtrl = 0x20,
_1000bpsF = 0x10,
@@ -429,6 +435,7 @@ enum RTL_register_content {
EPHYAR_Reg_Mask_v2 = 0x7f,
EPHYAR_Reg_shift = 16,
EPHYAR_Data_Mask = 0xffff,
+ EPHYAR_EXT_ADDR = 0x0ffe,
/* CSI access */
CSIAR_Flag = 0x80000000,
@@ -513,6 +520,7 @@ enum RTL_chipset_name {
RTL8168G,
RTL8168H,
RTL8168M,
+ RTL8127,
UNKNOWN
};
@@ -551,28 +559,28 @@ enum RTL_chipset_name {
#define TRUE 1
#define FALSE 0
-#define SPEED_10 10
-#define SPEED_100 100
-#define SPEED_1000 1000
-#define SPEED_2500 2500
-#define SPEED_5000 5000
-
-#define DUPLEX_HALF 1
-#define DUPLEX_FULL 2
-
-#define AUTONEG_ENABLE 1
-#define AUTONEG_DISABLE 0
-
-#define ADVERTISE_10_HALF 0x0001
-#define ADVERTISE_10_FULL 0x0002
-#define ADVERTISE_100_HALF 0x0004
-#define ADVERTISE_100_FULL 0x0008
-#define ADVERTISE_1000_HALF 0x0010 /* Not used, just FYI */
-#define ADVERTISE_1000_FULL 0x0020
-#define ADVERTISE_2500_HALF 0x0040 /* NOT used, just FYI */
-#define ADVERTISE_2500_FULL 0x0080
-#define ADVERTISE_5000_HALF 0x0100 /* NOT used, just FYI */
-#define ADVERTISE_5000_FULL 0x0200
+#define SPEED_10 10
+#define SPEED_100 100
+#define SPEED_1000 1000
+#define SPEED_2500 2500
+#define SPEED_5000 5000
+#define SPEED_10000 10000
+
+#define DUPLEX_HALF 1
+#define DUPLEX_FULL 2
+
+#define AUTONEG_ENABLE 1
+#define AUTONEG_DISABLE 0
+
+#define ADVERTISE_10_HALF RTE_BIT64(0)
+#define ADVERTISE_10_FULL RTE_BIT64(1)
+#define ADVERTISE_100_HALF RTE_BIT64(2)
+#define ADVERTISE_100_FULL RTE_BIT64(3)
+#define ADVERTISE_1000_HALF RTE_BIT64(4)
+#define ADVERTISE_1000_FULL RTE_BIT64(5)
+#define ADVERTISE_2500_FULL RTE_BIT64(15)
+#define ADVERTISE_5000_FULL RTE_BIT64(48)
+#define ADVERTISE_10000_FULL RTE_BIT64(12)
#define RTL_MAX_TX_DESC 4096
#define RTL_MAX_RX_DESC 4096
diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c
index e2ea9435fe..1f4c7eb885 100644
--- a/drivers/net/r8169/r8169_ethdev.c
+++ b/drivers/net/r8169/r8169_ethdev.c
@@ -56,6 +56,8 @@ static const struct rte_pci_id pci_id_r8169_map[] = {
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8126) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x5000) },
{ RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168) },
+ { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8127) },
+ { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x0E10) },
{.vendor_id = 0, /* sentinel */ },
};
@@ -165,6 +167,9 @@ _rtl_setup_link(struct rte_eth_dev *dev)
case CFG_METHOD_71:
speed_mode = SPEED_5000;
break;
+ case CFG_METHOD_91:
+ speed_mode = SPEED_10000;
+ break;
default:
speed_mode = SPEED_1000;
break;
@@ -176,7 +181,8 @@ _rtl_setup_link(struct rte_eth_dev *dev)
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 |
RTE_ETH_LINK_SPEED_1G | RTE_ETH_LINK_SPEED_2_5G |
- RTE_ETH_LINK_SPEED_5G | RTE_ETH_LINK_SPEED_FIXED))
+ RTE_ETH_LINK_SPEED_5G | RTE_ETH_LINK_SPEED_10G |
+ RTE_ETH_LINK_SPEED_FIXED))
goto error_invalid_config;
if (*link_speeds & RTE_ETH_LINK_SPEED_10M_HD) {
@@ -214,6 +220,11 @@ _rtl_setup_link(struct rte_eth_dev *dev)
hw->duplex = DUPLEX_FULL;
adv |= ADVERTISE_5000_FULL;
}
+ if (*link_speeds & RTE_ETH_LINK_SPEED_10G) {
+ hw->speed = SPEED_10000;
+ hw->duplex = DUPLEX_FULL;
+ adv |= ADVERTISE_10000_FULL;
+ }
hw->autoneg = AUTONEG_ENABLE;
hw->advertising = adv;
@@ -295,27 +306,8 @@ 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:
+ if (!rtl_is_8125(hw))
set_offset79(pci_dev, 0x40);
- break;
- }
/* Initialize transmission unit */
rtl_tx_init(dev);
@@ -362,23 +354,8 @@ rtl_dev_stop(struct rte_eth_dev *dev)
rtl_nic_reset(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:
+ if (rtl_is_8125(hw))
rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting);
- break;
- }
rtl_powerdown_pll(hw);
@@ -411,23 +388,8 @@ rtl_dev_set_link_down(struct rte_eth_dev *dev)
struct rtl_hw *hw = &adapter->hw;
/* mcu pme intr masks */
- 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:
+ if (rtl_is_8125(hw))
rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting & ~(BIT_11 | BIT_14));
- break;
- }
rtl_powerdown_pll(hw);
@@ -463,6 +425,9 @@ rtl_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
RTE_ETH_LINK_SPEED_1G;
switch (hw->chipset_name) {
+ case RTL8127:
+ dev_info->speed_capa |= RTE_ETH_LINK_SPEED_10G;
+ /* fallthrough */
case RTL8126A:
dev_info->speed_capa |= RTE_ETH_LINK_SPEED_5G;
/* fallthrough */
@@ -605,61 +570,23 @@ rtl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused)
if (status & FullDup) {
link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
- 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:
+ if (!rtl_is_8125(hw) || hw->mcfg == CFG_METHOD_48)
RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) |
(BIT_24 | BIT_25)) & ~BIT_19);
- break;
- }
} else {
link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
- 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:
+ if (!rtl_is_8125(hw) || hw->mcfg == CFG_METHOD_48)
RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | BIT_25) &
~(BIT_19 | BIT_24));
- break;
- }
}
/*
* The PHYstatus register for the RTL8168 is 8 bits,
- * while for the RTL8125 and RTL8126, it is 16 bits.
+ * while for the RTL8125, RTL8126 and RTL8127, it is 16 bits.
*/
- if (status & _5000bpsF && rtl_is_8125(hw))
+ if (status & _10000bpsF && rtl_is_8125(hw))
+ speed = 10000;
+ else if (status & _5000bpsF && rtl_is_8125(hw))
speed = 5000;
else if (status & _2500bpsF && rtl_is_8125(hw))
speed = 2500;
diff --git a/drivers/net/r8169/r8169_ethdev.h b/drivers/net/r8169/r8169_ethdev.h
index 0de91045fa..bc65ccf68a 100644
--- a/drivers/net/r8169/r8169_ethdev.h
+++ b/drivers/net/r8169/r8169_ethdev.h
@@ -52,6 +52,8 @@ struct rtl_hw {
u8 NotWrMcuPatchCode;
u8 HwSuppMacMcuVer;
u16 MacMcuPageSize;
+ u64 hw_mcu_patch_code_ver;
+ u64 bin_mcu_patch_code_ver;
u8 NotWrRamCodeToMicroP;
u8 HwHasWrRamCodeToMicroP;
@@ -63,7 +65,7 @@ struct rtl_hw {
u8 autoneg;
u8 duplex;
u32 speed;
- u32 advertising;
+ u64 advertising;
enum rtl_fc_mode fcpause;
u32 HwSuppMaxPhyLinkSpeed;
diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c
index 21a599dfc6..002dc25ef7 100644
--- a/drivers/net/r8169/r8169_hw.c
+++ b/drivers/net/r8169/r8169_hw.c
@@ -431,6 +431,30 @@ rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr)
return data16;
}
+static void
+rtl_clear_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
+ u16 setmask)
+{
+ u16 val;
+
+ val = rtl_mac_ocp_read(hw, addr);
+ val &= ~clearmask;
+ val |= setmask;
+ rtl_mac_ocp_write(hw, addr, val);
+}
+
+void
+rtl_clear_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
+{
+ rtl_clear_set_mac_ocp_bit(hw, addr, mask, 0);
+}
+
+void
+rtl_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
+{
+ rtl_clear_set_mac_ocp_bit(hw, addr, 0, mask);
+}
+
u32
rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr)
{
@@ -562,46 +586,26 @@ rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
static void
rtl_enable_rxdvgate(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:
- 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);
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_3);
+
+ if (!rtl_is_8125(hw))
rte_delay_ms(2);
- break;
- }
}
void
rtl_disable_rxdvgate(struct rtl_hw *hw)
{
+ RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_3);
+
+ if (!rtl_is_8125(hw))
+ rte_delay_ms(2);
+}
+
+static void
+rtl_stop_all_request(struct rtl_hw *hw)
+{
+ int i;
+
switch (hw->mcfg) {
case CFG_METHOD_21:
case CFG_METHOD_22:
@@ -620,11 +624,20 @@ rtl_disable_rxdvgate(struct rtl_hw *hw)
case CFG_METHOD_35:
case CFG_METHOD_36:
case CFG_METHOD_37:
+ rte_delay_ms(2);
+ break;
case CFG_METHOD_48:
case CFG_METHOD_49:
+ case CFG_METHOD_52:
+ RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
+ for (i = 0; i < 20; i++) {
+ rte_delay_us(10);
+ if (!(RTL_R8(hw, ChipCmd) & StopReq))
+ break;
+ }
+ break;
case CFG_METHOD_50:
case CFG_METHOD_51:
- case CFG_METHOD_52:
case CFG_METHOD_53:
case CFG_METHOD_54:
case CFG_METHOD_55:
@@ -633,74 +646,17 @@ rtl_disable_rxdvgate(struct rtl_hw *hw)
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
-rtl8125_stop_all_request(struct rtl_hw *hw)
-{
- int i;
-
- RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
-
- switch (hw->mcfg) {
- case CFG_METHOD_48:
- case CFG_METHOD_49:
- case CFG_METHOD_52:
- for (i = 0; i < 20; i++) {
- rte_delay_us(10);
- if (!(RTL_R8(hw, ChipCmd) & StopReq))
- break;
- }
-
- break;
- default:
+ case CFG_METHOD_91:
+ RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
rte_delay_us(200);
break;
}
-
- RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb));
}
static void
-rtl8168_stop_all_request(struct rtl_hw *hw)
+rtl_clear_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);
+ RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb));
}
static void
@@ -708,24 +664,14 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
{
int i;
- 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:
+ if (rtl_is_8125(hw)) {
+ for (i = 0; i < 3000; i++) {
+ rte_delay_us(50);
+ if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
+ (Txfifo_empty | Rxfifo_empty))
+ break;
+ }
+ } else {
for (i = 0; i < 10; i++) {
rte_delay_us(100);
if (RTL_R32(hw, TxConfig) & BIT_11)
@@ -740,27 +686,6 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
}
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)) ==
- (Txfifo_empty | Rxfifo_empty))
- break;
- }
- break;
}
switch (hw->mcfg) {
@@ -774,6 +699,7 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
for (i = 0; i < 3000; i++) {
rte_delay_us(50);
if ((RTL_R16(hw, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) ==
@@ -805,7 +731,7 @@ rtl_nic_reset(struct rtl_hw *hw)
rtl_wait_txrx_fifo_empty(hw);
- rte_delay_ms(2);
+ rtl_clear_stop_all_request(hw);
/* Soft reset the chip. */
RTL_W8(hw, ChipCmd, CmdReset);
@@ -833,43 +759,10 @@ rtl_disable_cfg9346_write(struct rtl_hw *hw)
static void
rtl_enable_force_clkreq(struct rtl_hw *hw, bool enable)
{
- 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;
- }
+ if (enable)
+ RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7);
+ else
+ RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7);
}
static void
@@ -935,7 +828,7 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
}
static void
-rtl8126_disable_l1_timeout(struct rtl_hw *hw)
+rtl_disable_l1_timeout(struct rtl_hw *hw)
{
rtl_csi_write(hw, 0x890, rtl_csi_read(hw, 0x890) & ~BIT_0);
}
@@ -943,26 +836,7 @@ rtl8126_disable_l1_timeout(struct rtl_hw *hw)
static void
rtl8125_disable_eee_plus(struct rtl_hw *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, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1);
- break;
- default:
- /* Not support EEEPlus */
- break;
- }
+ rtl_mac_ocp_write(hw, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1);
}
static void
@@ -1004,6 +878,7 @@ rtl_hw_clear_timer_int(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
RTL_W32(hw, TIMER_INT0_8125, 0x0000);
RTL_W32(hw, TIMER_INT1_8125, 0x0000);
RTL_W32(hw, TIMER_INT2_8125, 0x0000);
@@ -1049,9 +924,6 @@ rtl8125_hw_config(struct rtl_hw *hw)
{
u32 mac_ocp_data;
- /* Set RxConfig to default */
- RTL_W32(hw, RxConfig, (RX_DMA_BURST_unlimited << RxCfgDMAShift));
-
rtl_nic_reset(hw);
rtl_enable_cfg9346_write(hw);
@@ -1061,24 +933,7 @@ rtl8125_hw_config(struct rtl_hw *hw)
rtl_enable_aspm_clkreq_lock(hw, 0);
/* Disable magic packet */
- 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:
- mac_ocp_data = 0;
- rtl_mac_ocp_write(hw, 0xC0B6, mac_ocp_data);
- break;
- }
+ rtl_mac_ocp_write(hw, 0xC0B6, 0);
/* Set DMA burst size and interframe gap time */
RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
@@ -1103,190 +958,178 @@ rtl8125_hw_config(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
- rtl8126_disable_l1_timeout(hw);
+ case CFG_METHOD_91:
+ rtl_disable_l1_timeout(hw);
break;
}
+ /* RSS_control_0 */
+ RTL_W32(hw, RSS_CTRL_8125, 0x00);
+
+ /* VMQ_control */
+ RTL_W16(hw, Q_NUM_CTRL_8125, 0x0000);
+
+ /* Disable speed down */
+ RTL_W8(hw, Config1, RTL_R8(hw, Config1) & ~0x10);
+
+ /* CRC disable set */
+ rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
+ rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
+
+ /* 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 ||
+ hw->mcfg == CFG_METHOD_91)
+ mac_ocp_data &= ~(BIT_0 | BIT_1);
+ else
+ mac_ocp_data &= ~BIT_0;
+ rtl_mac_ocp_write(hw, 0xEB58, mac_ocp_data);
+
+ if (hw->mcfg >= CFG_METHOD_91) {
+ if (hw->EnableTxNoClose)
+ RTL_W8(hw, 0x20E4, RTL_R8(hw, 0x20E4) | BIT_2);
+ else
+ RTL_W8(hw, 0x20E4, RTL_R8(hw, 0x20E4) & ~BIT_2);
+ }
+
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:
- /* RSS_control_0 */
- RTL_W32(hw, RSS_CTRL_8125, 0x00);
-
- /* VMQ_control */
- RTL_W16(hw, Q_NUM_CTRL_8125, 0x0000);
+ case CFG_METHOD_91:
+ RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~EnableRxDescV4_0);
+ break;
+ }
+
+ if (hw->mcfg >= CFG_METHOD_91) {
+ rtl_clear_mac_ocp_bit(hw, 0xE00C, BIT_12);
+ rtl_clear_mac_ocp_bit(hw, 0xC0C2, BIT_6);
+ }
+
+ 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 ||
+ hw->mcfg == CFG_METHOD_52 || hw->mcfg == CFG_METHOD_69 ||
+ hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71 ||
+ hw->mcfg == CFG_METHOD_91)
+ mac_ocp_data |= ((0x02 & 0x03) << 4);
+ rtl_mac_ocp_write(hw, 0xE63E, mac_ocp_data);
+
+ /*
+ * FTR_MCU_CTRL
+ * 3-2 txpla packet valid start
+ */
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
+ mac_ocp_data &= ~BIT_0;
+ rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
+ mac_ocp_data |= BIT_0;
+ rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
+ mac_ocp_data |= (BIT_3 | BIT_2);
+ rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB6A);
+ mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 |
+ BIT_1 | BIT_0);
+ mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0);
+ rtl_mac_ocp_write(hw, 0xEB6A, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB50);
+ mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5);
+ mac_ocp_data |= BIT_6;
+ rtl_mac_ocp_write(hw, 0xEB50, mac_ocp_data);
+
+ 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);
+
+ /* EEE_CR */
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xE040);
+ mac_ocp_data &= ~BIT_12;
+ rtl_mac_ocp_write(hw, 0xE040, mac_ocp_data);
+
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
+ mac_ocp_data &= ~(BIT_1 | BIT_0);
+ mac_ocp_data |= BIT_0;
+ rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
- /* Disable speed down */
- RTL_W8(hw, Config1, RTL_R8(hw, Config1) & ~0x10);
+ switch (hw->mcfg) {
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_52:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ rtl_oob_mutex_lock(hw);
+ break;
+ }
- /* CRC disable set */
- rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
- rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
+ /* MAC_PWRDWN_CR0 */
+ rtl_mac_ocp_write(hw, 0xE0C0, 0x4000);
- /* 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);
- 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);
-
- 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 ||
- hw->mcfg == CFG_METHOD_52 || hw->mcfg == CFG_METHOD_69 ||
- hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
- mac_ocp_data |= ((0x02 & 0x03) << 4);
- rtl_mac_ocp_write(hw, 0xE63E, mac_ocp_data);
-
- /*
- * FTR_MCU_CTRL
- * 3-2 txpla packet valid start
- */
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
- mac_ocp_data &= ~BIT_0;
- rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
- mac_ocp_data |= BIT_0;
- rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
-
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
- mac_ocp_data |= (BIT_3 | BIT_2);
- rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
-
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB6A);
- mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 |
- BIT_0);
- mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0);
- rtl_mac_ocp_write(hw, 0xEB6A, mac_ocp_data);
-
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB50);
- mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5);
- mac_ocp_data |= BIT_6;
- rtl_mac_ocp_write(hw, 0xEB50, mac_ocp_data);
-
- 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);
-
- /* EEE_CR */
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xE040);
- mac_ocp_data &= ~BIT_12;
- rtl_mac_ocp_write(hw, 0xE040, mac_ocp_data);
-
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
- mac_ocp_data &= ~(BIT_1 | BIT_0);
- mac_ocp_data |= BIT_0;
- rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
-
- switch (hw->mcfg) {
- case CFG_METHOD_48:
- case CFG_METHOD_49:
- case CFG_METHOD_52:
- case CFG_METHOD_54:
- case CFG_METHOD_55:
- rtl_oob_mutex_lock(hw);
- break;
- }
+ rtl_set_mac_ocp_bit(hw, 0xE052, (BIT_6 | BIT_5));
+ rtl_clear_mac_ocp_bit(hw, 0xE052, (BIT_3 | BIT_7));
- /* MAC_PWRDWN_CR0 */
- rtl_mac_ocp_write(hw, 0xE0C0, 0x4000);
+ switch (hw->mcfg) {
+ case CFG_METHOD_48:
+ case CFG_METHOD_49:
+ case CFG_METHOD_52:
+ case CFG_METHOD_54:
+ case CFG_METHOD_55:
+ rtl_oob_mutex_unlock(hw);
+ break;
+ }
- rtl_set_mac_ocp_bit(hw, 0xE052, (BIT_6 | BIT_5));
- rtl_clear_mac_ocp_bit(hw, 0xE052, (BIT_3 | BIT_7));
+ /*
+ * DMY_PWR_REG_0
+ * (1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask
+ */
+ rtl_set_mac_ocp_bit(hw, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 |
+ BIT_11 | BIT_12));
- switch (hw->mcfg) {
- case CFG_METHOD_48:
- case CFG_METHOD_49:
- case CFG_METHOD_52:
- case CFG_METHOD_54:
- case CFG_METHOD_55:
- rtl_oob_mutex_unlock(hw);
- break;
- }
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xD430);
+ mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 |
+ BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
+ mac_ocp_data |= 0x45F;
+ rtl_mac_ocp_write(hw, 0xD430, mac_ocp_data);
- /*
- * DMY_PWR_REG_0
- * (1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask
- */
- rtl_set_mac_ocp_bit(hw, 0xC0AC,
- (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12));
-
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xD430);
- mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 |
- BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
- mac_ocp_data |= 0x45F;
- rtl_mac_ocp_write(hw, 0xD430, mac_ocp_data);
-
- if (!hw->DASH)
- RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6 | BIT_7);
- else
- RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~(BIT_6 | BIT_7));
+ if (!hw->DASH)
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6 | BIT_7);
+ else
+ RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~(BIT_6 | BIT_7));
- if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
- hw->mcfg == CFG_METHOD_52)
- RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0);
+ if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
+ hw->mcfg == CFG_METHOD_52)
+ RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0);
- rtl8125_disable_eee_plus(hw);
+ rtl8125_disable_eee_plus(hw);
- mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
- mac_ocp_data &= ~BIT_2;
- if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
- mac_ocp_data &= ~(BIT_9 | BIT_8);
- rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
+ mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
+ mac_ocp_data &= ~BIT_2;
+ if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71 ||
+ hw->mcfg == CFG_METHOD_91)
+ mac_ocp_data &= ~(BIT_9 | BIT_8);
+ rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
- /* Clear TCAM entries */
- rtl_set_mac_ocp_bit(hw, 0xEB54, BIT_0);
- rte_delay_us(1);
- rtl_clear_mac_ocp_bit(hw, 0xEB54, BIT_0);
+ /* Clear TCAM entries */
+ rtl_set_mac_ocp_bit(hw, 0xEB54, BIT_0);
+ rte_delay_us(1);
+ rtl_clear_mac_ocp_bit(hw, 0xEB54, BIT_0);
- RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5));
+ RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5));
- switch (hw->mcfg) {
- 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;
- }
- }
+ if (hw->mcfg == CFG_METHOD_91)
+ rtl_clear_set_mac_ocp_bit(hw, 0xD40C, 0xE038, 0x8020);
/* Other hw parameters */
rtl_hw_clear_timer_int(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_mac_ocp_write(hw, 0xE098, 0xC302);
rtl_disable_cfg9346_write(hw);
@@ -1308,52 +1151,12 @@ rtl8168_hw_config(struct rtl_hw *hw)
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;
- }
+ RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~BIT_1);
/* 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;
- }
+ csi_tmp = rtl_eri_read(hw, 0xDE, 1, ERIAR_ExGMAC);
+ csi_tmp &= BIT_0;
+ rtl_eri_write(hw, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
/* Set TxConfig to default */
RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
@@ -1377,29 +1180,9 @@ rtl8168_hw_config(struct rtl_hw *hw)
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;
- }
+ 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);
switch (hw->mcfg) {
case CFG_METHOD_25:
@@ -1516,6 +1299,9 @@ rtl_set_hw_ops(struct rtl_hw *hw)
case CFG_METHOD_71:
hw->hw_ops = rtl8126a_ops;
return 0;
+ case CFG_METHOD_91:
+ hw->hw_ops = rtl8127_ops;
+ return 0;
default:
return -ENOTSUP;
}
@@ -1526,48 +1312,11 @@ 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_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;
- }
+ rtl_enable_cfg9346_write(hw);
+ rtl_enable_aspm_clkreq_lock(hw, 0);
+ rtl_disable_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:
@@ -1577,11 +1326,7 @@ rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw)
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);
+ rtl_mac_ocp_write(hw, 0xFC38, 0x0000);
break;
case CFG_METHOD_48:
case CFG_METHOD_49:
@@ -1596,13 +1341,21 @@ rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
+ rtl_mac_ocp_write(hw, 0xFC48, 0x0000);
+ break;
+ }
+
+ if (rtl_is_8125(hw)) {
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;
+ } else {
+ 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);
}
static void
@@ -1647,12 +1400,37 @@ _rtl_write_mac_mcu_ram_code_with_page(struct rtl_hw *hw, const u16 *entry,
}
}
+static void
+_rtl_set_hw_mcu_patch_code_ver(struct rtl_hw *hw, u64 ver)
+{
+ int i;
+
+ /* Switch to page 2 */
+ rtl_switch_mac_mcu_ram_code_page(hw, 2);
+
+ for (i = 0; i < 8; i += 2) {
+ rtl_mac_ocp_write(hw, 0xF9F8 + 6 - i, (u16)ver);
+ ver >>= 16;
+ }
+
+ /* Switch back to page 0 */
+ rtl_switch_mac_mcu_ram_code_page(hw, 0);
+}
+
+static void
+rtl_set_hw_mcu_patch_code_ver(struct rtl_hw *hw, u64 ver)
+{
+ _rtl_set_hw_mcu_patch_code_ver(hw, ver);
+
+ hw->hw_mcu_patch_code_ver = ver;
+}
+
void
rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
{
- if (HW_SUPPORT_MAC_MCU(hw) == FALSE)
+ if (!HW_SUPPORT_MAC_MCU(hw))
return;
- if (entry == NULL || entry_cnt == 0)
+ if (!entry || entry_cnt == 0)
return;
if (hw->MacMcuPageSize > 0)
@@ -1660,12 +1438,16 @@ rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
hw->MacMcuPageSize);
else
_rtl_write_mac_mcu_ram_code(hw, entry, entry_cnt);
+
+ if (hw->bin_mcu_patch_code_ver > 0)
+ rtl_set_hw_mcu_patch_code_ver(hw, hw->bin_mcu_patch_code_ver);
}
bool
rtl_is_speed_mode_valid(u32 speed)
{
switch (speed) {
+ case SPEED_10000:
case SPEED_5000:
case SPEED_2500:
case SPEED_1000:
@@ -1708,7 +1490,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_1000;
+ speed = hw->HwSuppMaxPhyLinkSpeed;
if (!rtl_is_duplex_mode_valid(duplex))
duplex = DUPLEX_FULL;
@@ -1720,6 +1502,9 @@ rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex,
adv = 0;
switch (speed) {
+ case SPEED_10000:
+ adv |= ADVERTISE_10000_FULL;
+ /* Fall through */
case SPEED_5000:
adv |= ADVERTISE_5000_FULL;
/* Fall through */
@@ -1767,6 +1552,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_71:
speed_mode = SPEED_5000;
break;
+ case CFG_METHOD_91:
+ speed_mode = SPEED_10000;
+ break;
default:
speed_mode = SPEED_1000;
break;
@@ -1912,45 +1700,15 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_71:
hw->chipset_name = RTL8126A;
break;
+ case CFG_METHOD_91:
+ hw->chipset_name = RTL8127;
+ break;
default:
hw->chipset_name = UNKNOWN;
break;
}
- 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:
- hw->HwSuppNowIsOobVer = 1;
- break;
- }
+ hw->HwSuppNowIsOobVer = 1;
switch (hw->mcfg) {
case CFG_METHOD_21:
@@ -1985,6 +1743,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
hw->HwSuppCheckPhyDisableModeVer = 3;
break;
}
@@ -2005,6 +1764,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_71:
hw->HwSuppMaxPhyLinkSpeed = SPEED_5000;
break;
+ case CFG_METHOD_91:
+ hw->HwSuppMaxPhyLinkSpeed = SPEED_10000;
+ break;
default:
hw->HwSuppMaxPhyLinkSpeed = SPEED_1000;
break;
@@ -2023,6 +1785,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_55:
case CFG_METHOD_56:
case CFG_METHOD_57:
+ case CFG_METHOD_91:
hw->HwSuppTxNoCloseVer = 6;
break;
case CFG_METHOD_69:
@@ -2140,6 +1903,9 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_71:
hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_71;
break;
+ case CFG_METHOD_91:
+ hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_91;
+ break;
}
if (hw->HwIcVerUnknown) {
@@ -2147,40 +1913,10 @@ rtl_init_software_variable(struct rtl_hw *hw)
hw->NotWrMcuPatchCode = TRUE;
}
- 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:
+ if (rtl_is_8125(hw)) {
hw->HwSuppMacMcuVer = 2;
- break;
- }
-
- 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:
hw->MacMcuPageSize = RTL_MAC_MCU_PAGE_SIZE;
- break;
+ hw->mcu_pme_setting = rtl_mac_ocp_read(hw, 0xE00A);
}
switch (hw->mcfg) {
@@ -2208,6 +1944,7 @@ rtl_init_software_variable(struct rtl_hw *hw)
case CFG_METHOD_55:
case CFG_METHOD_56:
case CFG_METHOD_57:
+ case CFG_METHOD_91:
hw->HwSuppIntMitiVer = 6;
break;
case CFG_METHOD_70:
@@ -2218,24 +1955,6 @@ 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:
- 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;
- }
-
hw->mtu = RTL_DEFAULT_MTU;
}
@@ -2272,6 +1991,7 @@ rtl_exit_realwow(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
rtl_mac_ocp_write(hw, 0xC0BC, 0x00FF);
break;
}
@@ -2329,15 +2049,8 @@ 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;
- }
+ rtl_mac_ocp_write(hw, 0xEB00, 0x2);
+ rtl8168_set_mcu_ocp_bit(hw, 0xEB16, BIT_1);
}
static void
@@ -2361,63 +2074,25 @@ rtl_exit_oob(struct rtl_hw *hw)
rtl_nic_reset(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:
- 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);
+ 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_14;
+ rtl_mac_ocp_write(hw, 0xE8DE, data16);
+ rtl_wait_ll_share_fifo_ready(hw);
+ if (rtl_is_8125(hw)) {
rtl_mac_ocp_write(hw, 0xC0AA, 0x07D0);
rtl_mac_ocp_write(hw, 0xC0A6, 0x01B5);
rtl_mac_ocp_write(hw, 0xC01E, 0x5555);
- rtl_wait_ll_share_fifo_ready(hw);
- break;
+ } else {
+ data16 = rtl_mac_ocp_read(hw, 0xE8DE) | BIT_15;
+ rtl_mac_ocp_write(hw, 0xE8DE, data16);
}
+
+ rtl_wait_ll_share_fifo_ready(hw);
}
static void
@@ -2448,6 +2123,7 @@ rtl_disable_ups(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
rtl_mac_ocp_write(hw, 0xD40A,
rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4);
break;
@@ -2542,29 +2218,9 @@ rtl_hw_init(struct rtl_hw *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;
- }
+ csi_tmp = rtl_csi_read(hw, 0x108);
+ csi_tmp |= BIT_20;
+ rtl_csi_write(hw, 0x108, csi_tmp);
/* MCU PME setting */
switch (hw->mcfg) {
@@ -2845,6 +2501,14 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
hw->HwIcVerUnknown = TRUE;
}
break;
+ case 0x6C800000:
+ if (ic_version_id == 0x100000) {
+ hw->mcfg = CFG_METHOD_91;
+ } else {
+ hw->mcfg = CFG_METHOD_91;
+ hw->HwIcVerUnknown = TRUE;
+ }
+ break;
default:
PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg);
hw->mcfg = CFG_METHOD_DEFAULT;
@@ -2865,45 +2529,12 @@ rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea)
{
u8 mac_addr[RTE_ETHER_ADDR_LEN] = {0};
- 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:
- *(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:
+ if (rtl_is_8125(hw)) {
*(u32 *)&mac_addr[0] = RTL_R32(hw, BACKUP_ADDR0_8125);
*(u16 *)&mac_addr[4] = RTL_R16(hw, BACKUP_ADDR1_8125);
- break;
- default:
- break;
+ } else {
+ *(u32 *)&mac_addr[0] = rtl_eri_read(hw, 0xE0, 4, ERIAR_ExGMAC);
+ *(u16 *)&mac_addr[4] = rtl_eri_read(hw, 0xE4, 2, ERIAR_ExGMAC);
}
rte_ether_addr_copy((struct rte_ether_addr *)mac_addr, ea);
@@ -3016,3 +2647,42 @@ rtl_is_8125(struct rtl_hw *hw)
{
return hw->mcfg >= CFG_METHOD_48;
}
+
+u64
+rtl_get_hw_mcu_patch_code_ver(struct rtl_hw *hw)
+{
+ u64 ver;
+ int i;
+
+ /* Switch to page 2 */
+ rtl_switch_mac_mcu_ram_code_page(hw, 2);
+
+ ver = 0;
+ for (i = 0; i < 8; i += 2) {
+ ver <<= 16;
+ ver |= rtl_mac_ocp_read(hw, 0xF9F8 + i);
+ }
+
+ /* Switch back to page 0 */
+ rtl_switch_mac_mcu_ram_code_page(hw, 0);
+
+ return ver;
+}
+
+u64
+rtl_get_bin_mcu_patch_code_ver(const u16 *entry, u16 entry_cnt)
+{
+ u64 ver;
+ int i;
+
+ if (!entry || entry_cnt == 0 || entry_cnt < 4)
+ return 0;
+
+ ver = 0;
+ for (i = 0; i < 4; i++) {
+ ver <<= 16;
+ ver |= entry[entry_cnt - 4 + i];
+ }
+
+ return ver;
+}
diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h
index 36a7b57c97..f775c1a547 100644
--- a/drivers/net/r8169/r8169_hw.h
+++ b/drivers/net/r8169/r8169_hw.h
@@ -18,6 +18,9 @@
u16 rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr);
void rtl_mac_ocp_write(struct rtl_hw *hw, u16 addr, u16 value);
+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);
+
u32 rtl_ocp_read(struct rtl_hw *hw, u16 addr, u8 len);
void rtl_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value);
@@ -73,6 +76,9 @@ void rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr,
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);
+u64 rtl_get_hw_mcu_patch_code_ver(struct rtl_hw *hw);
+u64 rtl_get_bin_mcu_patch_code_ver(const u16 *entry, u16 entry_cnt);
+
extern const struct rtl_hw_ops rtl8168g_ops;
extern const struct rtl_hw_ops rtl8168h_ops;
extern const struct rtl_hw_ops rtl8168ep_ops;
@@ -84,6 +90,7 @@ extern const struct rtl_hw_ops rtl8125bp_ops;
extern const struct rtl_hw_ops rtl8125d_ops;
extern const struct rtl_hw_ops rtl8126a_ops;
extern const struct rtl_hw_ops rtl8168kb_ops;
+extern const struct rtl_hw_ops rtl8127_ops;
#define NO_BASE_ADDRESS 0x00000000
#define RTL8168FP_OOBMAC_BASE 0xBAF70000
@@ -128,6 +135,7 @@ extern const struct rtl_hw_ops rtl8168kb_ops;
#define NIC_RAMCODE_VERSION_CFG_METHOD_69 (0x0023)
#define NIC_RAMCODE_VERSION_CFG_METHOD_70 (0x0033)
#define NIC_RAMCODE_VERSION_CFG_METHOD_71 (0x0060)
+#define NIC_RAMCODE_VERSION_CFG_METHOD_91 (0x0015)
#define RTL_MAC_MCU_PAGE_SIZE 256
#define RTL_DEFAULT_MTU 1500
diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c
index ce16ab3242..44ffd49a56 100644
--- a/drivers/net/r8169/r8169_phy.c
+++ b/drivers/net/r8169/r8169_phy.c
@@ -15,30 +15,6 @@
#include "r8169_logs.h"
#include "r8169_dash.h"
-static void
-rtl_clear_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
- u16 setmask)
-{
- u16 phy_reg_value;
-
- phy_reg_value = rtl_mac_ocp_read(hw, addr);
- phy_reg_value &= ~clearmask;
- phy_reg_value |= setmask;
- rtl_mac_ocp_write(hw, addr, phy_reg_value);
-}
-
-void
-rtl_clear_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
-{
- rtl_clear_set_mac_ocp_bit(hw, addr, mask, 0);
-}
-
-void
-rtl_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
-{
- rtl_clear_set_mac_ocp_bit(hw, addr, 0, mask);
-}
-
static u16
rtl_map_phy_ocp_addr(u16 PageNum, u8 RegNum)
{
@@ -172,12 +148,12 @@ void
rtl_clear_and_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
u16 setmask)
{
- u16 phy_reg_value;
+ u16 val;
- phy_reg_value = rtl_mdio_direct_read_phy_ocp(hw, addr);
- phy_reg_value &= ~clearmask;
- phy_reg_value |= setmask;
- rtl_mdio_direct_write_phy_ocp(hw, addr, phy_reg_value);
+ val = rtl_mdio_direct_read_phy_ocp(hw, addr);
+ val &= ~clearmask;
+ val |= setmask;
+ rtl_mdio_direct_write_phy_ocp(hw, addr, val);
}
void
@@ -208,18 +184,10 @@ rtl8168_check_ephy_addr(struct rtl_hw *hw, int addr)
return addr;
}
-void
-rtl_ephy_write(struct rtl_hw *hw, int addr, int value)
+static void
+_rtl_ephy_write(struct rtl_hw *hw, int addr, int value, unsigned int mask)
{
int i;
- 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_Write | (addr & mask) << EPHYAR_Reg_shift |
(value & EPHYAR_Data_Mask));
@@ -235,20 +203,48 @@ rtl_ephy_write(struct rtl_hw *hw, int addr, int value)
rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
}
-u16
-rtl_ephy_read(struct rtl_hw *hw, int addr)
+static void
+rtl8127_set_ephy_ext_addr(struct rtl_hw *hw, int addr)
+{
+ _rtl_ephy_write(hw, EPHYAR_EXT_ADDR, addr, EPHYAR_Reg_Mask_v2);
+}
+
+static int
+rtl8127_check_ephy_ext_addr(struct rtl_hw *hw, int addr)
+{
+ int data;
+
+ data = ((u16)addr >> 12);
+
+ rtl8127_set_ephy_ext_addr(hw, data);
+
+ return (addr & 0xfff);
+}
+
+void
+rtl_ephy_write(struct rtl_hw *hw, int addr, int value)
{
- int i;
- u16 value = 0xffff;
unsigned int mask;
- if (rtl_is_8125(hw)) {
- mask = EPHYAR_Reg_Mask_v2;
- } else {
+ if (!rtl_is_8125(hw)) {
mask = EPHYAR_Reg_Mask;
addr = rtl8168_check_ephy_addr(hw, addr);
+ } else if (hw->mcfg >= CFG_METHOD_91) {
+ mask = EPHYAR_Reg_Mask_v2;
+ addr = rtl8127_check_ephy_ext_addr(hw, addr);
+ } else {
+ mask = EPHYAR_Reg_Mask_v2;
}
+ _rtl_ephy_write(hw, addr, value, mask);
+}
+
+static u16
+_rtl_ephy_read(struct rtl_hw *hw, int addr, unsigned int mask)
+{
+ int i;
+ u16 value = 0xffff;
+
RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & mask) << EPHYAR_Reg_shift);
for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
@@ -266,6 +262,24 @@ rtl_ephy_read(struct rtl_hw *hw, int addr)
return value;
}
+u16
+rtl_ephy_read(struct rtl_hw *hw, int addr)
+{
+ unsigned int mask;
+
+ if (!rtl_is_8125(hw)) {
+ mask = EPHYAR_Reg_Mask;
+ addr = rtl8168_check_ephy_addr(hw, addr);
+ } else if (hw->mcfg >= CFG_METHOD_91) {
+ mask = EPHYAR_Reg_Mask_v2;
+ addr = rtl8127_check_ephy_ext_addr(hw, addr);
+ } else {
+ mask = EPHYAR_Reg_Mask_v2;
+ }
+
+ return _rtl_ephy_read(hw, addr, mask);
+}
+
void
rtl_clear_and_set_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
u16 setmask)
@@ -297,66 +311,36 @@ rtl_set_phy_mcu_patch_request(struct rtl_hw *hw)
u16 wait_cnt;
bool bool_success = TRUE;
- 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);
+ if (rtl_is_8125(hw)) {
+ rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
- rtl_mdio_write(hw, 0x1f, 0x0B80);
wait_cnt = 0;
do {
- gphy_val = rtl_mdio_read(hw, 0x10);
+ gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
rte_delay_us(100);
wait_cnt++;
- } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
+ } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
if (!(gphy_val & BIT_6) && wait_cnt == 1000)
bool_success = FALSE;
+ } else {
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ rtl_set_eth_phy_bit(hw, 0x10, BIT_4);
- 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);
-
+ rtl_mdio_write(hw, 0x1f, 0x0B80);
wait_cnt = 0;
do {
- gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
+ gphy_val = rtl_mdio_read(hw, 0x10);
rte_delay_us(100);
wait_cnt++;
- } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
+ } while (!(gphy_val & BIT_6) && (wait_cnt < 1000));
if (!(gphy_val & BIT_6) && wait_cnt == 1000)
bool_success = FALSE;
- break;
+
+ rtl_mdio_write(hw, 0x1f, 0x0000);
}
+
if (!bool_success)
PMD_INIT_LOG(NOTICE, "%s fail.", __func__);
@@ -370,65 +354,34 @@ rtl_clear_phy_mcu_patch_request(struct rtl_hw *hw)
u16 wait_cnt;
bool bool_success = TRUE;
- 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);
+ if (rtl_is_8125(hw)) {
+ rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4);
- rtl_mdio_write(hw, 0x1f, 0x0B80);
wait_cnt = 0;
do {
- gphy_val = rtl_mdio_read(hw, 0x10);
+ 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;
+ } else {
+ rtl_mdio_write(hw, 0x1f, 0x0B82);
+ rtl_clear_eth_phy_bit(hw, 0x10, BIT_4);
- 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);
-
+ rtl_mdio_write(hw, 0x1f, 0x0B80);
wait_cnt = 0;
do {
- gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800);
+ 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;
- break;
+
+ rtl_mdio_write(hw, 0x1f, 0x0000);
}
if (!bool_success)
@@ -545,6 +498,7 @@ rtl_wait_phy_ups_resume(struct rtl_hw *hw, u16 PhyState)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
do {
tmp_phy_state = rtl_mdio_direct_read_phy_ocp(hw, 0xA420);
tmp_phy_state &= 0x7;
@@ -597,6 +551,7 @@ rtl_phy_power_up(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
rtl_wait_phy_ups_resume(hw, 3);
break;
}
@@ -634,6 +589,7 @@ rtl_powerup_pll(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) | BIT_7 | BIT_6);
break;
}
@@ -699,6 +655,7 @@ rtl_phy_power_down(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
break;
default:
@@ -745,6 +702,7 @@ rtl_powerdown_pll(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7);
break;
}
@@ -783,6 +741,7 @@ rtl_powerdown_pll(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6);
break;
}
@@ -813,31 +772,39 @@ rtl_wait_phy_reset_complete(struct rtl_hw *hw)
static void
rtl_xmii_reset_enable(struct rtl_hw *hw)
{
+ u32 val;
+
if (rtl_is_in_phy_disable_mode(hw))
return;
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));
- rtl_mdio_write(hw, MII_CTRL1000, rtl_mdio_read(hw, MII_CTRL1000) &
- ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL));
- 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));
+ val = rtl_mdio_read(hw, MII_ADVERTISE);
+ val &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF |
+ ADVERTISE_100FULL);
+ rtl_mdio_write(hw, MII_ADVERTISE, val);
+
+ val = rtl_mdio_read(hw, MII_CTRL1000);
+ val &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
+ rtl_mdio_write(hw, MII_CTRL1000, val);
+
+ if (rtl_is_8125(hw)) {
+ val = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
+ val &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL |
+ RTK_ADVERTISE_10000FULL);
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, val);
+ }
rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
- if (rtl_wait_phy_reset_complete(hw) == 0)
- return;
+ if (rtl_wait_phy_reset_complete(hw))
+ PMD_INIT_LOG(NOTICE, "PHY reset failed.");
}
static void
rtl8125_set_hw_phy_before_init_phy_mcu(struct rtl_hw *hw)
{
- u16 phy_reg_value;
+ u16 val;
switch (hw->mcfg) {
case CFG_METHOD_50:
@@ -846,11 +813,11 @@ rtl8125_set_hw_phy_before_init_phy_mcu(struct rtl_hw *hw)
rtl_set_eth_phy_ocp_bit(hw, 0xC402, BIT_10);
rtl_clear_eth_phy_ocp_bit(hw, 0xC402, BIT_10);
- phy_reg_value = rtl_mdio_direct_read_phy_ocp(hw, 0xBF86);
- phy_reg_value &= (BIT_1 | BIT_0);
- if (phy_reg_value != 0)
+ val = rtl_mdio_direct_read_phy_ocp(hw, 0xBF86);
+ val &= (BIT_1 | BIT_0);
+ if (val != 0)
PMD_INIT_LOG(NOTICE, "PHY watch dog not clear, value = 0x%x",
- phy_reg_value);
+ val);
rtl_mdio_direct_write_phy_ocp(hw, 0xBD86, 0x1010);
rtl_mdio_direct_write_phy_ocp(hw, 0xBD88, 0x1010);
@@ -867,45 +834,14 @@ rtl_get_hw_phy_mcu_code_ver(struct rtl_hw *hw)
{
u16 hw_ram_code_ver = ~0;
- 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:
+ if (rtl_is_8125(hw)) {
+ rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E);
+ hw_ram_code_ver = rtl_mdio_direct_read_phy_ocp(hw, 0xA438);
+ } else {
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;
}
return hw_ram_code_ver;
@@ -931,47 +867,16 @@ rtl_check_hw_phy_mcu_code_ver(struct rtl_hw *hw)
static void
rtl_write_hw_phy_mcu_code_ver(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:
+ if (rtl_is_8125(hw)) {
+ 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;
+ } else {
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;
- break;
}
}
@@ -1010,25 +915,25 @@ rtl_disable_phy_disable_mode(struct rtl_hw *hw)
static int
rtl8168_phy_ram_code_check(struct rtl_hw *hw)
{
- u16 phy_reg_value;
+ u16 val;
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);
+ val = rtl_mdio_read(hw, 0x10);
+ val &= ~BIT_11;
+ rtl_mdio_write(hw, 0x10, val);
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);
+ val = rtl_mdio_read(hw, 0x10);
+ val &= ~(BIT_12 | BIT_13 | BIT_14 | BIT_15);
+ rtl_mdio_write(hw, 0x10, val);
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);
+ val = rtl_mdio_read(hw, 0x14);
+ val &= ~BIT_11;
+ rtl_mdio_write(hw, 0x14, val);
retval = rtl_set_phy_mcu_patch_request(hw);
@@ -1036,20 +941,20 @@ rtl8168_phy_ram_code_check(struct rtl_hw *hw)
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);
+ val = rtl_mdio_read(hw, 0x13);
+ val &= ~BIT_6;
+ val |= BIT_7;
+ rtl_mdio_write(hw, 0x13, val);
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);
+ val = rtl_mdio_read(hw, 0x14);
+ val |= BIT_2;
+ rtl_mdio_write(hw, 0x14, val);
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);
+ val = rtl_mdio_read(hw, 0x11);
+ val |= (BIT_11 | BIT_12);
+ rtl_mdio_write(hw, 0x11, val);
retval = rtl_clear_phy_mcu_patch_request(hw);
@@ -1057,32 +962,32 @@ rtl8168_phy_ram_code_check(struct rtl_hw *hw)
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);
+ val = rtl_mdio_read(hw, 0x13);
+ val &= ~(BIT_6 | BIT_7);
+ rtl_mdio_write(hw, 0x13, val);
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);
+ val = rtl_mdio_read(hw, 0x14);
+ val &= ~BIT_2;
+ rtl_mdio_write(hw, 0x14, val);
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);
+ val = rtl_mdio_read(hw, 0x11);
+ val &= ~(BIT_11 | BIT_12);
+ rtl_mdio_write(hw, 0x11, val);
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);
+ val = rtl_mdio_read(hw, 0x14);
+ val |= BIT_11;
+ rtl_mdio_write(hw, 0x14, val);
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)
+ val = rtl_mdio_read(hw, 0x13);
+ if (val & BIT_11) {
+ if (val & BIT_10)
retval = FALSE;
}
@@ -1149,41 +1054,7 @@ rtl_disable_aldps(struct rtl_hw *hw)
u32 timeout = 0;
u32 wait_cnt = 200;
- 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:
+ if (rtl_is_8125(hw)) {
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);
@@ -1194,7 +1065,10 @@ rtl_disable_aldps(struct rtl_hw *hw)
timeout++;
} while (!(tmp_ushort & BIT_7) && timeout < wait_cnt);
}
- break;
+ } else {
+ 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);
}
}
@@ -1232,6 +1106,7 @@ rtl_is_adv_eee_enabled(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
if (rtl_mdio_direct_read_phy_ocp(hw, 0xA430) & BIT_15)
enabled = true;
break;
@@ -1315,6 +1190,7 @@ _rtl_disable_adv_eee(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
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);
@@ -1372,6 +1248,7 @@ static void
rtl_disable_eee(struct rtl_hw *hw)
{
u16 data;
+ u16 mask;
u32 csi_tmp;
switch (hw->mcfg) {
@@ -1438,12 +1315,16 @@ rtl_disable_eee(struct rtl_hw *hw)
case CFG_METHOD_69:
case CFG_METHOD_70:
case CFG_METHOD_71:
+ case CFG_METHOD_91:
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));
- rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, MDIO_EEE_2_5GT);
- if (HW_SUPP_PHY_LINK_SPEED_5000M(hw))
- rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, MDIO_EEE_5GT);
+ if (HW_SUPP_PHY_LINK_SPEED_10000M(hw))
+ mask = MDIO_EEE_100TX | MDIO_EEE_1000T | MDIO_EEE_10GT;
+ else
+ mask = MDIO_EEE_100TX | MDIO_EEE_1000T;
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, mask);
+
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA6D4, MDIO_EEE_2_5GT | MDIO_EEE_5GT);
rtl_clear_eth_phy_ocp_bit(hw, 0xA6D8, BIT_4);
rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7);
@@ -1488,23 +1369,8 @@ rtl_hw_phy_config(struct rtl_hw *hw)
rtl_disable_aldps(hw);
/* Legacy force mode (chap 22) */
- 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:
+ if (rtl_is_8125(hw))
rtl_clear_eth_phy_ocp_bit(hw, 0xA5B4, BIT_15);
- break;
- }
rtl_mdio_write(hw, 0x1F, 0x0000);
@@ -1550,8 +1416,9 @@ rtl_phy_setup_force_mode(struct rtl_hw *hw, u32 speed, u8 duplex)
}
static int
-rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
+rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv)
{
+ u16 mask = 0;
int auto_nego = 0;
int giga_ctrl = 0;
int ctrl_2500 = 0;
@@ -1577,6 +1444,14 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
rtl_mdio_write(hw, 0x1F, 0x0A40);
rtl_mdio_write(hw, 0x1F, 0x0000);
break;
+ case CFG_METHOD_91:
+ mask |= BIT_2;
+ /* Fall through */
+ case CFG_METHOD_69:
+ case CFG_METHOD_70:
+ case CFG_METHOD_71:
+ mask |= BIT_1;
+ /* Fall through */
case CFG_METHOD_48:
case CFG_METHOD_49:
case CFG_METHOD_50:
@@ -1587,14 +1462,9 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
case CFG_METHOD_55:
case CFG_METHOD_56:
case CFG_METHOD_57:
- case CFG_METHOD_69:
- case CFG_METHOD_70:
- case CFG_METHOD_71:
+ mask |= BIT_0;
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);
+ rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, mask);
break;
}
@@ -1608,7 +1478,8 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
if (rtl_is_8125(hw)) {
ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4);
- ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL);
+ ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL |
+ RTK_ADVERTISE_10000FULL);
}
if (autoneg == AUTONEG_ENABLE) {
@@ -1634,6 +1505,8 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv)
ctrl_2500 |= RTK_ADVERTISE_2500FULL;
if (adv & ADVERTISE_5000_FULL)
ctrl_2500 |= RTK_ADVERTISE_5000FULL;
+ if (adv & ADVERTISE_10000_FULL)
+ ctrl_2500 |= RTK_ADVERTISE_10000FULL;
/* Flow control */
if (hw->fcpause == rtl_fc_full)
@@ -1678,12 +1551,12 @@ void
rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
u16 setmask)
{
- u16 phy_reg_value;
+ u16 val;
- phy_reg_value = rtl_mdio_read(hw, addr);
- phy_reg_value &= ~clearmask;
- phy_reg_value |= setmask;
- rtl_mdio_write(hw, addr, phy_reg_value);
+ val = rtl_mdio_read(hw, addr);
+ val &= ~clearmask;
+ val |= setmask;
+ rtl_mdio_write(hw, addr, val);
}
void
@@ -1697,3 +1570,9 @@ rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask)
{
rtl_clear_and_set_eth_phy_bit(hw, addr, 0, mask);
}
+
+void
+rtl8127_clear_ephy_ext_addr(struct rtl_hw *hw)
+{
+ rtl8127_set_ephy_ext_addr(hw, 0x0000);
+}
diff --git a/drivers/net/r8169/r8169_phy.h b/drivers/net/r8169/r8169_phy.h
index ea1facba5b..0a91515883 100644
--- a/drivers/net/r8169/r8169_phy.h
+++ b/drivers/net/r8169/r8169_phy.h
@@ -102,18 +102,17 @@
#define HW_SUPPORT_CHECK_PHY_DISABLE_MODE(_M) ((_M)->HwSuppCheckPhyDisableModeVer > 0)
+#define HW_SUPP_PHY_LINK_SPEED_10000M(_M) ((_M)->HwSuppMaxPhyLinkSpeed >= 10000)
#define HW_SUPP_PHY_LINK_SPEED_5000M(_M) ((_M)->HwSuppMaxPhyLinkSpeed >= 5000)
#define MDIO_EEE_100TX 0x0002
#define MDIO_EEE_1000T 0x0004
#define MDIO_EEE_2_5GT 0x0001
#define MDIO_EEE_5GT 0x0002
+#define MDIO_EEE_10GT 0x0008 /* 10GT EEE cap */
#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);
-
u32 rtl_mdio_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr);
void rtl_mdio_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value);
@@ -155,4 +154,6 @@ void rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask,
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);
+void rtl8127_clear_ephy_ext_addr(struct rtl_hw *hw);
+
#endif /* R8169_PHY_H */
diff --git a/drivers/net/r8169/r8169_rxtx.c b/drivers/net/r8169/r8169_rxtx.c
index eee91a639e..7bb2ab9cee 100644
--- a/drivers/net/r8169/r8169_rxtx.c
+++ b/drivers/net/r8169/r8169_rxtx.c
@@ -501,24 +501,7 @@ 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:
+ if (!rtl_is_8125(hw)) {
/* RX ftr mcu enable */
csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC);
csi_tmp &= ~BIT_0;
@@ -529,7 +512,6 @@ rtl_rx_init(struct rte_eth_dev *dev)
/* 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 */
@@ -1090,6 +1072,9 @@ rtl8125_set_tx_tag_num(struct rtl_hw *hw)
else
mac_ocp_data |= (3 << 8);
break;
+ case CFG_METHOD_91:
+ mac_ocp_data |= (15 << 8);
+ break;
default:
mac_ocp_data |= (3 << 8);
break;
@@ -1122,47 +1107,14 @@ rtl_tx_init(struct rte_eth_dev *dev)
rtl_enable_cfg9346_write(hw);
- if (rtl_is_8125(hw))
+ if (rtl_is_8125(hw)) {
rtl8125_set_tx_tag_num(hw);
- else
+
+ RTL_W8(hw, TDFNR, 0x10);
+ } else {
rtl8168_set_mtps(hw);
- /* Set TDFNR: TX Desc Fetch NumbeR */
- 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, 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;
}
rtl_disable_cfg9346_write(hw);
--
2.34.1
next prev parent reply other threads:[~2025-06-10 7:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-10 7:40 [PATCH v2 0/8] net/r8169: support more cards Howard Wang
2025-06-10 7:40 ` [PATCH v2 1/8] net/r8169: add support for RTL8168 series Howard Wang
2025-06-10 7:40 ` [PATCH v2 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang
2025-06-10 7:40 ` Howard Wang [this message]
2025-06-10 7:40 ` [PATCH v2 4/8] net/r8169: remove cmac feature for RTL8125AP Howard Wang
2025-06-10 7:40 ` [PATCH v2 5/8] net/r8169: add RTL8127AP dash support Howard Wang
2025-06-10 7:40 ` [PATCH v2 6/8] net/r8169: add support for RTL8125CP Howard Wang
2025-06-10 7:40 ` [PATCH v2 7/8] net/r8169: add support for RTL8127ATF serdes interface Howard Wang
2025-06-10 7:40 ` [PATCH v2 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=20250610074037.5288-4-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).