* [PATCH 1/8] net/r8169: add support for RTL8168 series @ 2025-06-10 6:01 Howard Wang 2025-06-10 6:01 ` [PATCH 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang ` (6 more replies) 0 siblings, 7 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang This patch adds support for RTL8168EP, RTL8168FP, RTL8168G, RTL8168H and RTL8168M. Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- doc/guides/nics/r8169.rst | 4 + drivers/net/r8169/base/rtl8125a_mcu.c | 7 +- drivers/net/r8169/base/rtl8126a.c | 4 +- drivers/net/r8169/base/rtl8168ep.c | 221 +++ drivers/net/r8169/base/rtl8168ep.h | 15 + drivers/net/r8169/base/rtl8168ep_mcu.c | 177 +++ drivers/net/r8169/base/rtl8168fp.c | 195 +++ drivers/net/r8169/base/rtl8168fp.h | 14 + drivers/net/r8169/base/rtl8168fp_mcu.c | 270 ++++ drivers/net/r8169/base/rtl8168g.c | 297 ++++ drivers/net/r8169/base/rtl8168g.h | 15 + drivers/net/r8169/base/rtl8168g_mcu.c | 1936 ++++++++++++++++++++++++ drivers/net/r8169/base/rtl8168h.c | 447 ++++++ drivers/net/r8169/base/rtl8168h.h | 21 + drivers/net/r8169/base/rtl8168h_mcu.c | 1186 +++++++++++++++ drivers/net/r8169/base/rtl8168m.c | 19 + drivers/net/r8169/meson.build | 9 + drivers/net/r8169/r8169_compat.h | 25 +- drivers/net/r8169/r8169_dash.c | 439 +++++- drivers/net/r8169/r8169_dash.h | 8 +- drivers/net/r8169/r8169_ethdev.c | 179 ++- drivers/net/r8169/r8169_ethdev.h | 32 +- drivers/net/r8169/r8169_hw.c | 1713 +++++++++++++++++++-- drivers/net/r8169/r8169_hw.h | 56 +- drivers/net/r8169/r8169_phy.c | 1024 +++++++++++-- drivers/net/r8169/r8169_phy.h | 11 + drivers/net/r8169/r8169_rxtx.c | 317 +++- 27 files changed, 8261 insertions(+), 380 deletions(-) create mode 100644 drivers/net/r8169/base/rtl8168ep.c create mode 100644 drivers/net/r8169/base/rtl8168ep.h create mode 100644 drivers/net/r8169/base/rtl8168ep_mcu.c create mode 100644 drivers/net/r8169/base/rtl8168fp.c create mode 100644 drivers/net/r8169/base/rtl8168fp.h create mode 100644 drivers/net/r8169/base/rtl8168fp_mcu.c create mode 100644 drivers/net/r8169/base/rtl8168g.c create mode 100644 drivers/net/r8169/base/rtl8168g.h create mode 100644 drivers/net/r8169/base/rtl8168g_mcu.c create mode 100644 drivers/net/r8169/base/rtl8168h.c create mode 100644 drivers/net/r8169/base/rtl8168h.h create mode 100644 drivers/net/r8169/base/rtl8168h_mcu.c create mode 100644 drivers/net/r8169/base/rtl8168m.c diff --git a/doc/guides/nics/r8169.rst b/doc/guides/nics/r8169.rst index bffdfc91cf..f3c547c4d4 100644 --- a/doc/guides/nics/r8169.rst +++ b/doc/guides/nics/r8169.rst @@ -7,8 +7,12 @@ R8169 Poll Mode Driver The R8169 PMD provides poll mode driver support for Realtek 1, 2.5 and 5 Gigabit Ethernet NICs. +More information about Realtek 1G Ethernet NIC can be found at `RTL8168 +<https://www.realtek.com/Product/Index?id=4080>`_. + More information about Realtek 2.5G Ethernet NIC can be found at `RTL8125 <https://www.realtek.com/Product/Index?id=3962&cate_id=786&menu_id=1010>`_. + More information about Realtek 5G Ethernet NIC can be found at `RTL8126 <https://www.realtek.com/Product/ProductHitsDetail?id=4425&menu_id=643>`_. diff --git a/drivers/net/r8169/base/rtl8125a_mcu.c b/drivers/net/r8169/base/rtl8125a_mcu.c index 5a69b3e094..e2d56102fb 100644 --- a/drivers/net/r8169/base/rtl8125a_mcu.c +++ b/drivers/net/r8169/base/rtl8125a_mcu.c @@ -162,7 +162,12 @@ static void rtl_release_phy_mcu_patch_key_lock(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_53: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x0000); rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x0000); rtl_clear_eth_phy_ocp_bit(hw, 0xB82E, BIT_0); diff --git a/drivers/net/r8169/base/rtl8126a.c b/drivers/net/r8169/base/rtl8126a.c index 69fe7bc030..84354b6d32 100644 --- a/drivers/net/r8169/base/rtl8126a.c +++ b/drivers/net/r8169/base/rtl8126a.c @@ -29,7 +29,9 @@ static void hw_ephy_config_8126a(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: /* nothing to do */ break; } diff --git a/drivers/net/r8169/base/rtl8168ep.c b/drivers/net/r8169/base/rtl8168ep.c new file mode 100644 index 0000000000..5f955d2b0d --- /dev/null +++ b/drivers/net/r8169/base/rtl8168ep.c @@ -0,0 +1,221 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168ep.h" + +/* For RTL8168EP, CFG_METHOD_23,27,28 */ + +static void +hw_init_rxcfg_8168ep(struct rtl_hw *hw) +{ + RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 | + (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2); +} + +static void +hw_ephy_config_8168ep(struct rtl_hw *hw) +{ + u16 ephy_data; + + switch (hw->mcfg) { + case CFG_METHOD_23: + rtl_ephy_write(hw, 0x00, 0x10AB); + rtl_ephy_write(hw, 0x06, 0xf030); + rtl_ephy_write(hw, 0x08, 0x2006); + rtl_ephy_write(hw, 0x0D, 0x1666); + + ephy_data = rtl_ephy_read(hw, 0x0C); + ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | + BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4); + rtl_ephy_write(hw, 0x0C, ephy_data); + break; + case CFG_METHOD_27: + rtl_ephy_write(hw, 0x00, 0x10A3); + rtl_ephy_write(hw, 0x19, 0xFC00); + rtl_ephy_write(hw, 0x1E, 0x20EA); + break; + case CFG_METHOD_28: + rtl_ephy_write(hw, 0x00, 0x10AB); + rtl_ephy_write(hw, 0x19, 0xFC00); + rtl_ephy_write(hw, 0x1E, 0x20EB); + rtl_ephy_write(hw, 0x0D, 0x1666); + rtl_clear_pcie_phy_bit(hw, 0x0B, BIT_0); + rtl_set_pcie_phy_bit(hw, 0x1D, BIT_14); + rtl_clear_and_set_pcie_phy_bit(hw, 0x0C, (BIT_13 | BIT_12 | BIT_11 | + BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5), + BIT_9 | BIT_4); + break; + default: + break; + } +} + +static void +hw_phy_config_8168ep(struct rtl_hw *hw) +{ + if (hw->mcfg == CFG_METHOD_23) { + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | + (BIT_3 | BIT_2)); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0BCC); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8); + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8084); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & + ~(BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0); + + rtl_mdio_write(hw, 0x1F, 0x0A4B); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8012); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0C42); + rtl_clear_and_set_eth_phy_bit(hw, 0x11, BIT_13, BIT_14); + rtl_mdio_write(hw, 0x1F, 0x0000); + + } else if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) { + rtl_mdio_write(hw, 0x1F, 0x0BCC); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8); + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8084); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8012); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15); + + rtl_mdio_write(hw, 0x1F, 0x0C42); + rtl_mdio_write(hw, 0x11, (rtl_mdio_read(hw, 0x11) & ~BIT_13) | BIT_14); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x80F3); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00); + rtl_mdio_write(hw, 0x13, 0x80F0); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00); + rtl_mdio_write(hw, 0x13, 0x80EF); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500); + rtl_mdio_write(hw, 0x13, 0x80F6); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00); + rtl_mdio_write(hw, 0x13, 0x80EC); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800); + rtl_mdio_write(hw, 0x13, 0x80ED); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00); + rtl_mdio_write(hw, 0x13, 0x80F2); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400); + rtl_mdio_write(hw, 0x13, 0x80F4); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8110); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800); + rtl_mdio_write(hw, 0x13, 0x810F); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00); + rtl_mdio_write(hw, 0x13, 0x8111); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500); + rtl_mdio_write(hw, 0x13, 0x8113); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100); + rtl_mdio_write(hw, 0x13, 0x8115); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200); + rtl_mdio_write(hw, 0x13, 0x810E); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400); + rtl_mdio_write(hw, 0x13, 0x810C); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00); + rtl_mdio_write(hw, 0x13, 0x810B); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x80D1); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00); + rtl_mdio_write(hw, 0x13, 0x80CD); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00); + rtl_mdio_write(hw, 0x13, 0x80D3); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00); + rtl_mdio_write(hw, 0x13, 0x80D5); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00); + rtl_mdio_write(hw, 0x13, 0x80D7); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400); + } +} + +static void +hw_config_8168ep(struct rtl_hw *hw) +{ + u16 mac_ocp_data; + u32 csi_tmp; + + rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xCC, 1, 0x2F, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xD0, 1, 0x5F, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC); + + /* Adjust the trx fifo */ + rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC); + + /* Disable share fifo */ + RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7); + + csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC); + csi_tmp &= ~BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + csi_tmp |= BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + + RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en); + + /* EEE led enable */ + RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07); + + if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) { + rtl_oob_mutex_lock(hw); + rtl_eri_write(hw, 0x5F0, 2, 0x4F87, ERIAR_ExGMAC); + rtl_oob_mutex_unlock(hw); + } + + rtl_mac_ocp_write(hw, 0xC140, 0xFFFF); + rtl_mac_ocp_write(hw, 0xC142, 0xFFFF); + + if (hw->mcfg == CFG_METHOD_28) { + mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E2); + mac_ocp_data &= 0xF000; + mac_ocp_data |= 0xAFD; + rtl_mac_ocp_write(hw, 0xD3E2, mac_ocp_data); + + mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E4); + mac_ocp_data &= 0xFF00; + rtl_mac_ocp_write(hw, 0xD3E4, mac_ocp_data); + + mac_ocp_data = rtl_mac_ocp_read(hw, 0xE860); + mac_ocp_data |= BIT_7; + rtl_mac_ocp_write(hw, 0xE860, mac_ocp_data); + } +} + +const struct rtl_hw_ops rtl8168ep_ops = { + .hw_config = hw_config_8168ep, + .hw_init_rxcfg = hw_init_rxcfg_8168ep, + .hw_ephy_config = hw_ephy_config_8168ep, + .hw_phy_config = hw_phy_config_8168ep, + .hw_mac_mcu_config = hw_mac_mcu_config_8168ep, + .hw_phy_mcu_config = hw_phy_mcu_config_8168ep, +}; diff --git a/drivers/net/r8169/base/rtl8168ep.h b/drivers/net/r8169/base/rtl8168ep.h new file mode 100644 index 0000000000..a03c94dc9f --- /dev/null +++ b/drivers/net/r8169/base/rtl8168ep.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef _RTL8168EP_H_ +#define _RTL8168EP_H_ + +#include "../r8169_compat.h" + +extern const struct rtl_hw_ops rtl8168ep_ops; + +void hw_mac_mcu_config_8168ep(struct rtl_hw *hw); +void hw_phy_mcu_config_8168ep(struct rtl_hw *hw); + +#endif diff --git a/drivers/net/r8169/base/rtl8168ep_mcu.c b/drivers/net/r8169/base/rtl8168ep_mcu.c new file mode 100644 index 0000000000..49375390ab --- /dev/null +++ b/drivers/net/r8169/base/rtl8168ep_mcu.c @@ -0,0 +1,177 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_dash.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168ep.h" + +/* For RTL8168EP, CFG_METHOD_23,27,28 */ + +/* -------------------------------------MAC 8168EP------------------------------------ */ + +static void +rtl8168_set_mac_mcu_8168ep_1(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168ep_1[] = { + 0xE008, 0xE0D3, 0xE0D6, 0xE0D9, 0xE0DB, 0xE0DD, 0xE0DF, 0xE0E1, 0xC251, + 0x7340, 0x49B1, 0xF010, 0x1D02, 0x8D40, 0xC202, 0xBA00, 0x2C3A, 0xC0F0, + 0xE8DE, 0x2000, 0x8000, 0xC0B6, 0x268C, 0x752C, 0x49D4, 0xF112, 0xE025, + 0xC2F6, 0x7146, 0xC2F5, 0x7340, 0x49BE, 0xF103, 0xC7F2, 0xE002, 0xC7F1, + 0x304F, 0x6226, 0x49A1, 0xF1F0, 0x7222, 0x49A0, 0xF1ED, 0x2525, 0x1F28, + 0x3097, 0x3091, 0x9A36, 0x752C, 0x21DC, 0x25BC, 0xC6E2, 0x77C0, 0x1304, + 0xF014, 0x1303, 0xF014, 0x1302, 0xF014, 0x1301, 0xF014, 0x49D4, 0xF103, + 0xC3D7, 0xBB00, 0xC618, 0x67C6, 0x752E, 0x22D7, 0x26DD, 0x1505, 0xF013, + 0xC60A, 0xBE00, 0xC309, 0xBB00, 0xC308, 0xBB00, 0xC307, 0xBB00, 0xC306, + 0xBB00, 0x25C8, 0x25A6, 0x25AC, 0x25B2, 0x25B8, 0xCD08, 0x0000, 0xC0BC, + 0xC2FF, 0x7340, 0x49B0, 0xF04E, 0x1F46, 0x308F, 0xC3F7, 0x1C04, 0xE84D, + 0x1401, 0xF147, 0x7226, 0x49A7, 0xF044, 0x7222, 0x2525, 0x1F30, 0x3097, + 0x3091, 0x7340, 0xC4EA, 0x401C, 0xF006, 0xC6E8, 0x75C0, 0x49D7, 0xF105, + 0xE036, 0x1D08, 0x8DC1, 0x0208, 0x6640, 0x2764, 0x1606, 0xF12F, 0x6346, + 0x133B, 0xF12C, 0x9B34, 0x1B18, 0x3093, 0xC32A, 0x1C10, 0xE82A, 0x1401, + 0xF124, 0x1A36, 0x308A, 0x7322, 0x25B5, 0x0B0E, 0x1C00, 0xE82C, 0xC71F, + 0x4027, 0xF11A, 0xE838, 0x1F42, 0x308F, 0x1B08, 0xE824, 0x7236, 0x7746, + 0x1700, 0xF00D, 0xC313, 0x401F, 0xF103, 0x1F00, 0x9F46, 0x7744, 0x449F, + 0x445F, 0xE817, 0xC70A, 0x4027, 0xF105, 0xC302, 0xBB00, 0x2E08, 0x2DC2, + 0xC7FF, 0xBF00, 0xCDB8, 0xFFFF, 0x0C02, 0xA554, 0xA5DC, 0x402F, 0xF105, + 0x1400, 0xF1FA, 0x1C01, 0xE002, 0x1C00, 0xFF80, 0x49B0, 0xF004, 0x0B01, + 0xA1D3, 0xE003, 0x0B02, 0xA5D3, 0x3127, 0x3720, 0x0B02, 0xA5D3, 0x3127, + 0x3720, 0x1300, 0xF1FB, 0xFF80, 0x7322, 0x25B5, 0x1E28, 0x30DE, 0x30D9, + 0x7264, 0x1E11, 0x2368, 0x3116, 0xFF80, 0x1B7E, 0xC602, 0xBE00, 0x06A6, + 0x1B7E, 0xC602, 0xBE00, 0x0764, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_1); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_1[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x2549); + rtl_mac_ocp_write(hw, 0xFC2A, 0x06A5); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0763); +} + +static void +rtl8168_set_mac_mcu_8168ep_2(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168ep_2[] = { + 0xE008, 0xE017, 0xE052, 0xE056, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xC50F, + 0x76A4, 0x49E3, 0xF007, 0x49C0, 0xF103, 0xC607, 0xBE00, 0xC606, 0xBE00, + 0xC602, 0xBE00, 0x0BDA, 0x0BB6, 0x0BBA, 0xDC00, 0xB400, 0xB401, 0xB402, + 0xB403, 0xB404, 0xC02E, 0x7206, 0x49AE, 0xF1FE, 0xC12B, 0x9904, 0xC12A, + 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF117, 0xC123, 0xC223, + 0xC323, 0xE808, 0xC322, 0xE806, 0xC321, 0xE804, 0xC320, 0xE802, 0xE00C, + 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x990A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE, + 0xF1FE, 0xFF80, 0xB004, 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002, + 0xB800, 0x1FC8, 0xE000, 0xE8E0, 0xF128, 0x0002, 0xFFFF, 0xF000, 0x8001, + 0x8002, 0x8003, 0x8004, 0x48C1, 0x48C2, 0xC502, 0xBD00, 0x0490, 0xC602, + 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, + 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_2); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_2[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0BB3); + if (!rtl8168_check_dash_other_fun_present(hw)) + rtl_mac_ocp_write(hw, 0xFC2A, 0x1FC7); +} + +/* ------------------------------------PHY 8168FP------------------------------------- */ + +static void +rtl8168_set_phy_mcu_8168ep_2(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x8700); + rtl_mdio_write(hw, 0x13, 0xB82E); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + + rtl_mdio_write(hw, 0x13, 0x83DD); + rtl_mdio_write(hw, 0x14, 0xAF83); + rtl_mdio_write(hw, 0x14, 0xE9AF); + rtl_mdio_write(hw, 0x14, 0x83EE); + rtl_mdio_write(hw, 0x14, 0xAF83); + rtl_mdio_write(hw, 0x14, 0xF1A1); + rtl_mdio_write(hw, 0x14, 0x83F4); + rtl_mdio_write(hw, 0x14, 0xD149); + rtl_mdio_write(hw, 0x14, 0xAF06); + rtl_mdio_write(hw, 0x14, 0x47AF); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x14, 0xAF00); + rtl_mdio_write(hw, 0x14, 0x00AF); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_mdio_write(hw, 0x13, 0xB818); + rtl_mdio_write(hw, 0x14, 0x0645); + + rtl_mdio_write(hw, 0x13, 0xB81A); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_mdio_write(hw, 0x13, 0xB81C); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_mdio_write(hw, 0x13, 0xB81E); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_mdio_write(hw, 0x13, 0xB832); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x17); + gphy_val &= ~BIT_0; + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +void +hw_mac_mcu_config_8168ep(struct rtl_hw *hw) +{ + if (hw->NotWrMcuPatchCode) + return; + + switch (hw->mcfg) { + case CFG_METHOD_27: + rtl8168_set_mac_mcu_8168ep_1(hw); + break; + case CFG_METHOD_28: + rtl8168_set_mac_mcu_8168ep_2(hw); + break; + } +} + +void +hw_phy_mcu_config_8168ep(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_28: + rtl8168_set_phy_mcu_8168ep_2(hw); + break; + } +} diff --git a/drivers/net/r8169/base/rtl8168fp.c b/drivers/net/r8169/base/rtl8168fp.c new file mode 100644 index 0000000000..b8a058bbd9 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168fp.c @@ -0,0 +1,195 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168fp.h" + +/* For RTL8168FP, CFG_METHOD_31,32,33,34 */ + +static void +hw_init_rxcfg_8168fp(struct rtl_hw *hw) +{ + RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 | + (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2); +} + +static void +hw_ephy_config_8168fp(struct rtl_hw *hw) +{ + rtl_clear_and_set_pcie_phy_bit(hw, 0x19, BIT_6, BIT_12 | BIT_8); + rtl_clear_and_set_pcie_phy_bit(hw, 0x59, BIT_6, BIT_12 | BIT_8); + + rtl_clear_pcie_phy_bit(hw, 0x0C, BIT_4); + rtl_clear_pcie_phy_bit(hw, 0x4C, BIT_4); + rtl_clear_pcie_phy_bit(hw, 0x0B, BIT_0); +} + +static void +hw_phy_config_8168fp(struct rtl_hw *hw) +{ + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x808E); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4800); + rtl_mdio_write(hw, 0x13, 0x8090); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xCC00); + rtl_mdio_write(hw, 0x13, 0x8092); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xB000); + rtl_mdio_write(hw, 0x13, 0x8088); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6000); + rtl_mdio_write(hw, 0x13, 0x808B); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0B00); + rtl_mdio_write(hw, 0x13, 0x808D); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0600); + rtl_mdio_write(hw, 0x13, 0x808C); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xB000); + + rtl_mdio_write(hw, 0x13, 0x80A0); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x2800); + rtl_mdio_write(hw, 0x13, 0x80A2); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x5000); + rtl_mdio_write(hw, 0x13, 0x809B); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0xB000); + rtl_mdio_write(hw, 0x13, 0x809A); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4B00); + rtl_mdio_write(hw, 0x13, 0x809D); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0800); + rtl_mdio_write(hw, 0x13, 0x80A1); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7000); + rtl_mdio_write(hw, 0x13, 0x809F); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0300); + rtl_mdio_write(hw, 0x13, 0x809E); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8800); + + rtl_mdio_write(hw, 0x13, 0x80B2); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x2200); + rtl_mdio_write(hw, 0x13, 0x80AD); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x9800); + rtl_mdio_write(hw, 0x13, 0x80AF); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x3F00, 0x0800); + rtl_mdio_write(hw, 0x13, 0x80B3); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6F00); + rtl_mdio_write(hw, 0x13, 0x80B1); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x1F00, 0x0300); + rtl_mdio_write(hw, 0x13, 0x80B0); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x9300); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8011); + rtl_set_eth_phy_bit(hw, 0x14, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_set_eth_phy_bit(hw, 0x11, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8016); + rtl_set_eth_phy_bit(hw, 0x14, BIT_10); + rtl_mdio_write(hw, 0x1F, 0x0000); + + /* Enable EthPhyPPSW */ + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_clear_eth_phy_bit(hw, 0x11, BIT_7); + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +static void +hw_config_8168fp(struct rtl_hw *hw) +{ + u16 mac_ocp_data; + u32 csi_tmp; + + rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xCC, 1, 0x2F, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xD0, 1, 0x5F, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC); + + /* Adjust the trx fifo*/ + rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC); + + /* Disable share fifo */ + RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7); + + csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC); + csi_tmp &= ~BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + csi_tmp |= BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + + /* EEE pwrsave params */ + mac_ocp_data = rtl_mac_ocp_read(hw, 0xE056); + mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4); + rtl_mac_ocp_write(hw, 0xE056, mac_ocp_data); + + if (hw->HwPkgDet == 0x0F) + rtl_mac_ocp_write(hw, 0xEA80, 0x0003); + else + rtl_mac_ocp_write(hw, 0xEA80, 0x0000); + + rtl_oob_mutex_lock(hw); + mac_ocp_data = rtl_mac_ocp_read(hw, 0xE052); + mac_ocp_data &= ~(BIT_3 | BIT_0); + if (hw->HwPkgDet == 0x0F) + mac_ocp_data |= BIT_0; + rtl_mac_ocp_write(hw, 0xE052, mac_ocp_data); + rtl_oob_mutex_unlock(hw); + + RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en); + + RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07); + + RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En); + + if (!HW_SUPP_SERDES_PHY(hw)) { + RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6); + RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_6); + RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_7); + } else { + RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_6); + RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6); + RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_7); + } + + rtl_oob_mutex_lock(hw); + if (hw->HwPkgDet == 0x0F) + rtl_eri_write(hw, 0x5F0, 2, 0x4F00, ERIAR_ExGMAC); + else + rtl_eri_write(hw, 0x5F0, 2, 0x4000, ERIAR_ExGMAC); + rtl_oob_mutex_unlock(hw); + + csi_tmp = rtl_eri_read(hw, 0xDC, 4, ERIAR_ExGMAC); + csi_tmp |= (BIT_2 | BIT_3); + rtl_eri_write(hw, 0xDC, 4, csi_tmp, ERIAR_ExGMAC); + + if (hw->mcfg == CFG_METHOD_32 || hw->mcfg == CFG_METHOD_33 || + hw->mcfg == CFG_METHOD_34) { + csi_tmp = rtl_eri_read(hw, 0xD4, 4, ERIAR_ExGMAC); + csi_tmp |= BIT_4; + rtl_eri_write(hw, 0xD4, 4, csi_tmp, ERIAR_ExGMAC); + } + + rtl_mac_ocp_write(hw, 0xC140, 0xFFFF); + rtl_mac_ocp_write(hw, 0xC142, 0xFFFF); + + csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC); + csi_tmp &= ~(BIT_0 | BIT_1); + csi_tmp |= BIT_0; + rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC); + + csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC); + csi_tmp &= ~BIT_1; + rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC); +} + +const struct rtl_hw_ops rtl8168fp_ops = { + .hw_config = hw_config_8168fp, + .hw_init_rxcfg = hw_init_rxcfg_8168fp, + .hw_ephy_config = hw_ephy_config_8168fp, + .hw_phy_config = hw_phy_config_8168fp, + .hw_mac_mcu_config = hw_mac_mcu_config_8168fp, +}; diff --git a/drivers/net/r8169/base/rtl8168fp.h b/drivers/net/r8169/base/rtl8168fp.h new file mode 100644 index 0000000000..4613fe9a98 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168fp.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef _RTL8168FP_H_ +#define _RTL8168FP_H_ + +#include "../r8169_compat.h" + +extern const struct rtl_hw_ops rtl8168fp_ops; + +void hw_mac_mcu_config_8168fp(struct rtl_hw *hw); + +#endif diff --git a/drivers/net/r8169/base/rtl8168fp_mcu.c b/drivers/net/r8169/base/rtl8168fp_mcu.c new file mode 100644 index 0000000000..839dcfde61 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168fp_mcu.c @@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_dash.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168fp.h" + +/* For RTL8168FP, CFG_METHOD_31,32,33,34 */ + +/* ------------------------------------MAC 8168FP--------------------------------------- */ + +static void +rtl8168_set_mac_mcu_8168fp_1(struct rtl_hw *hw) +{ + u16 i; + + rtl_hw_disable_mac_mcu_bps(hw); + if (hw->HwPkgDet == 0x00 || hw->HwPkgDet == 0x0F) { + static const u16 mcu_patch_code_8168fp_1_1[] = { + 0xE00A, 0xE0C1, 0xE104, 0xE108, 0xE10D, 0xE112, 0xE11C, 0xE121, 0xE000, + 0xE0C8, 0xB400, 0xC1FE, 0x49E2, 0xF04C, 0x49EA, 0xF04A, 0x74E6, 0xC246, + 0x7542, 0x73EC, 0x1800, 0x49C0, 0xF10D, 0x49C1, 0xF10B, 0x49C2, 0xF109, + 0x49B0, 0xF107, 0x49B1, 0xF105, 0x7220, 0x49A2, 0xF102, 0xE002, 0x4800, + 0x49D0, 0xF10A, 0x49D1, 0xF108, 0x49D2, 0xF106, 0x49D3, 0xF104, 0x49DF, + 0xF102, 0xE00C, 0x4801, 0x72E4, 0x49AD, 0xF108, 0xC225, 0x6741, 0x48F0, + 0x8F41, 0x4870, 0x8F41, 0xC7CF, 0x49B5, 0xF01F, 0x49B2, 0xF00B, 0x4980, + 0xF003, 0x484E, 0x94E7, 0x4981, 0xF004, 0x485E, 0xC212, 0x9543, 0xE071, + 0x49B6, 0xF003, 0x49B3, 0xF10F, 0x4980, 0xF003, 0x484E, 0x94E7, 0x4981, + 0xF004, 0x485E, 0xC204, 0x9543, 0xE005, 0xE000, 0xE0FC, 0xE0FA, 0xE065, + 0x49B7, 0xF007, 0x4980, 0xF005, 0x1A38, 0x46D4, 0x1200, 0xF109, 0x4981, + 0xF055, 0x49C3, 0xF105, 0x1A30, 0x46D5, 0x1200, 0xF04F, 0x7220, 0x49A2, + 0xF130, 0x49C1, 0xF12E, 0x49B0, 0xF12C, 0xC2E6, 0x7240, 0x49A8, 0xF003, + 0x49D0, 0xF126, 0x49A9, 0xF003, 0x49D1, 0xF122, 0x49AA, 0xF003, 0x49D2, + 0xF11E, 0x49AB, 0xF003, 0x49DF, 0xF11A, 0x49AC, 0xF003, 0x49D3, 0xF116, + 0x4980, 0xF003, 0x49C7, 0xF105, 0x4981, 0xF02C, 0x49D7, 0xF02A, 0x49C0, + 0xF00C, 0xC721, 0x62F4, 0x49A0, 0xF008, 0x49A4, 0xF106, 0x4824, 0x8AF4, + 0xC71A, 0x1A40, 0x9AE0, 0x49B6, 0xF017, 0x200E, 0xC7B8, 0x72E0, 0x4710, + 0x92E1, 0xC70E, 0x77E0, 0x49F0, 0xF112, 0xC70B, 0x77E0, 0x27FE, 0x1AFA, + 0x4317, 0xC705, 0x9AE2, 0x1A11, 0x8AE0, 0xE008, 0xE41C, 0xC0AE, 0xD23A, + 0xC7A2, 0x74E6, 0x484F, 0x94E7, 0xC79E, 0x8CE6, 0x8BEC, 0xC29C, 0x8D42, + 0x7220, 0xB000, 0xC502, 0xBD00, 0x0932, 0xB400, 0xC240, 0xC340, 0x7060, + 0x498F, 0xF014, 0x488F, 0x9061, 0x744C, 0x49C3, 0xF004, 0x7562, 0x485E, + 0x9563, 0x7446, 0x49C3, 0xF106, 0x7562, 0x1C30, 0x46E5, 0x1200, 0xF004, + 0x7446, 0x484F, 0x9447, 0xC32A, 0x7466, 0x49C0, 0xF00F, 0x48C0, 0x9C66, + 0x7446, 0x4840, 0x4841, 0x4842, 0x9C46, 0x744C, 0x4840, 0x9C4C, 0x744A, + 0x484A, 0x9C4A, 0xE013, 0x498E, 0xF011, 0x488E, 0x9061, 0x744C, 0x49C3, + 0xF004, 0x7446, 0x484E, 0x9447, 0x7446, 0x1D38, 0x46EC, 0x1500, 0xF004, + 0x7446, 0x484F, 0x9447, 0xB000, 0xC502, 0xBD00, 0x074C, 0xE000, 0xE0FC, + 0xE0C0, 0x4830, 0x4837, 0xC502, 0xBD00, 0x0978, 0x63E2, 0x4830, 0x4837, + 0xC502, 0xBD00, 0x09FE, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A12, + 0x73E2, 0x48B0, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x8BE2, 0xC302, + 0xBB00, 0x0A5A, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A6C, 0x73E2, + 0x4830, 0x4837, 0xC502, 0xBD00, 0x0A86 + }; + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_1); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_1_1[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0890); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0712); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0974); + rtl_mac_ocp_write(hw, 0xFC2E, 0x09FC); + rtl_mac_ocp_write(hw, 0xFC30, 0x0A0E); + rtl_mac_ocp_write(hw, 0xFC32, 0x0A56); + rtl_mac_ocp_write(hw, 0xFC34, 0x0A68); + rtl_mac_ocp_write(hw, 0xFC36, 0x0A84); + + /* Set bp enable*/ + if (hw->HwPkgDet == 0x00) + rtl_mac_ocp_write(hw, 0xFC38, 0x00FC); + else if (hw->HwPkgDet == 0x0F) + rtl_mac_ocp_write(hw, 0xFC38, 0x00FF); + } else if (hw->HwPkgDet == 0x05 || hw->HwPkgDet == 0x06) { + static const u16 mcu_patch_code_8168fp_1_2[] = { + 0xE008, 0xE00A, 0xE031, 0xE033, 0xE035, 0xE144, 0xE166, 0xE168, 0xC502, + 0xBD00, 0x0000, 0xC725, 0x75E0, 0x48D0, 0x9DE0, 0xC722, 0x75E0, 0x1C78, + 0x416C, 0x1530, 0xF111, 0xC71D, 0x75F6, 0x49D1, 0xF00D, 0x75E0, 0x1C1F, + 0x416C, 0x1502, 0xF108, 0x75FA, 0x49D3, 0xF005, 0x75EC, 0x9DE4, 0x4853, + 0x9DFA, 0xC70B, 0x75E0, 0x4852, 0x4850, 0x9DE0, 0xC602, 0xBE00, 0x04B8, + 0xE420, 0xE000, 0xE0FC, 0xE43C, 0xDC00, 0xEB00, 0xC202, 0xBA00, 0x0000, + 0xC002, 0xB800, 0x0000, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xB406, + 0xC44D, 0xC54D, 0x1867, 0xE8A2, 0x2318, 0x276E, 0x1601, 0xF106, 0x1A07, + 0xE861, 0xE86B, 0xE873, 0xE037, 0x231E, 0x276E, 0x1602, 0xF10B, 0x1A07, + 0xE858, 0xE862, 0xC247, 0xC344, 0xE8E3, 0xC73B, 0x66E0, 0xE8B5, 0xE029, + 0x231A, 0x276C, 0xC733, 0x9EE0, 0x1866, 0xE885, 0x251C, 0x120F, 0xF011, + 0x1209, 0xF011, 0x2014, 0x240E, 0x1000, 0xF007, 0x120C, 0xF00D, 0x1203, + 0xF00D, 0x1200, 0xF00D, 0x120C, 0xF00D, 0x1203, 0xF00D, 0x1A03, 0xE00C, + 0x1A07, 0xE00A, 0x1A00, 0xE008, 0x1A01, 0xE006, 0x1A02, 0xE004, 0x1A04, + 0xE002, 0x1A05, 0xE829, 0xE833, 0xB006, 0xB005, 0xB004, 0xB003, 0xB002, + 0xB001, 0x60C4, 0xC702, 0xBF00, 0x2786, 0xDD00, 0xD030, 0xE0C4, 0xE0F8, + 0xDC42, 0xD3F0, 0x0000, 0x0004, 0x0007, 0x0014, 0x0090, 0x1000, 0x0F00, + 0x1004, 0x1008, 0x3000, 0x3004, 0x3008, 0x4000, 0x7777, 0x8000, 0x8001, + 0x8008, 0x8003, 0x8004, 0xC000, 0xC004, 0xF004, 0xFFFF, 0xB406, 0xB407, + 0xC6E5, 0x77C0, 0x27F3, 0x23F3, 0x47FA, 0x9FC0, 0xB007, 0xB006, 0xFF80, + 0xB405, 0xB407, 0xC7D8, 0x75E0, 0x48D0, 0x9DE0, 0xB007, 0xB005, 0xFF80, + 0xB401, 0xC0EA, 0xC2DC, 0xC3D8, 0xE865, 0xC0D3, 0xC1E0, 0xC2E3, 0xE861, + 0xE817, 0xC0CD, 0xC2CF, 0xE85D, 0xC0C9, 0xC1D6, 0xC2DB, 0xE859, 0xE80F, + 0xC1C7, 0xC2CE, 0xE855, 0xC0C0, 0xC1D1, 0xC2D3, 0xE851, 0xE807, 0xC0BE, + 0xC2C2, 0xE84D, 0xE803, 0xB001, 0xFF80, 0xB402, 0xC2C6, 0xE859, 0x499F, + 0xF1FE, 0xB002, 0xFF80, 0xB402, 0xB403, 0xB407, 0xE821, 0x8882, 0x1980, + 0x8983, 0xE81D, 0x7180, 0x218B, 0x25BB, 0x1310, 0xF014, 0x1310, 0xFB03, + 0x1F20, 0x38FB, 0x3288, 0x434B, 0x2491, 0x430B, 0x1F0F, 0x38FB, 0x4313, + 0x2121, 0x4353, 0x2521, 0x418A, 0x6282, 0x2527, 0x212F, 0x418A, 0xB007, + 0xB003, 0xB002, 0xFF80, 0x6183, 0x2496, 0x1100, 0xF1FD, 0xFF80, 0x4800, + 0x4801, 0xC213, 0xC313, 0xE815, 0x4860, 0x8EE0, 0xC210, 0xC310, 0xE822, + 0x481E, 0xC20C, 0xC30C, 0xE80C, 0xC206, 0x7358, 0x483A, 0x9B58, 0xFF80, + 0xE8E0, 0xE000, 0x1008, 0x0F00, 0x800C, 0x0F00, 0xB407, 0xB406, 0xB403, + 0xC7F7, 0x98E0, 0x99E2, 0x9AE4, 0x21B2, 0x4831, 0x483F, 0x9BE6, 0x66E7, + 0x49E6, 0xF1FE, 0xB003, 0xB006, 0xB007, 0xFF80, 0xB407, 0xB406, 0xB403, + 0xC7E5, 0x9AE4, 0x21B2, 0x4831, 0x9BE6, 0x66E7, 0x49E6, 0xF1FE, 0x70E0, + 0x71E2, 0xB003, 0xB006, 0xB007, 0xFF80, 0x4882, 0xB406, 0xB405, 0xC71E, + 0x76E0, 0x1D78, 0x4175, 0x1630, 0xF10C, 0xC715, 0x76E0, 0x4861, 0x9EE0, + 0xC713, 0x1EFF, 0x9EE2, 0x75E0, 0x4850, 0x9DE0, 0xE005, 0xC70B, 0x76E0, + 0x4865, 0x9EE0, 0xB005, 0xB006, 0xC708, 0xC102, 0xB900, 0x279E, 0xEB16, + 0xEB00, 0xE43C, 0xDC00, 0xD3EC, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000 + }; + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_2); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_1_2[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0000); + rtl_mac_ocp_write(hw, 0xFC2A, 0x04b4); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0000); + rtl_mac_ocp_write(hw, 0xFC2E, 0x0000); + rtl_mac_ocp_write(hw, 0xFC30, 0x0000); + rtl_mac_ocp_write(hw, 0xFC32, 0x279C); + rtl_mac_ocp_write(hw, 0xFC34, 0x0000); + rtl_mac_ocp_write(hw, 0xFC36, 0x0000); + + /* Set bp enable*/ + rtl_mac_ocp_write(hw, 0xFC38, 0x0022); + } +} + +static void +rtl8168_set_mac_mcu_8168fp_8116as_2(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168fp_8116as_2[] = { + 0xE008, 0xE00A, 0xE00F, 0xE014, 0xE016, 0xE018, 0xE01A, 0xE01C, 0xC602, + 0xBE00, 0x2AB2, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0, + 0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xC602, 0xBE00, 0x0000, 0xC602, + 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, + 0xBE00, 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_8116as_2); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_8116as_2[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x2AAC); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0B14); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0BE4); + + rtl_mac_ocp_write(hw, 0xFC38, 0x0007); +} + +static void +_rtl8168_set_mac_mcu_8168fp_2(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168fp_2[] = { + 0xE008, 0xE00A, 0xE00F, 0xE014, 0xE05F, 0xE064, 0xE066, 0xE068, 0xC602, + 0xBE00, 0x0000, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0, + 0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xB400, 0xB401, 0xB402, 0xB403, + 0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE, 0xC137, 0x9904, 0xC136, + 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF10B, 0xC52F, 0xC12E, + 0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330, 0xE80E, 0xE018, 0xC126, + 0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326, 0xE805, 0xC521, 0xC324, + 0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x9D0A, 0x9A0C, 0x9B0E, + 0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004, 0xB003, 0xB002, 0xB001, + 0xB000, 0xC604, 0xC002, 0xB800, 0x2A5E, 0xE000, 0xE8E0, 0xF128, 0x3DC2, + 0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000, 0x8002, 0x8004, 0x8007, + 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC, 0xC602, 0xBE00, 0x0000, + 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_2); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_2[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x2AAC); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0B14); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0BE4); + rtl_mac_ocp_write(hw, 0xFC2E, 0x2A5C); + + if (rtl8168_check_dash_other_fun_present(hw)) + rtl_mac_ocp_write(hw, 0xFC38, 0x0006); + else + rtl_mac_ocp_write(hw, 0xFC38, 0x000E); +} + +static void +rtl8168_set_mac_mcu_8168fp_2(struct rtl_hw *hw) +{ + if (hw->HwSuppSerDesPhyVer == 1) + rtl8168_set_mac_mcu_8168fp_8116as_2(hw); + else + _rtl8168_set_mac_mcu_8168fp_2(hw); +} + +static void +rtl8168_set_mac_mcu_8168fp_3(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168fp_3[] = { + 0xE008, 0xE053, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xB400, + 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE, + 0xC137, 0x9904, 0xC136, 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, + 0xF10B, 0xC52F, 0xC12E, 0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330, + 0xE80E, 0xE018, 0xC126, 0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326, + 0xE805, 0xC521, 0xC324, 0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908, + 0x9D0A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004, + 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002, 0xB800, 0x2B16, 0xE000, + 0xE8E0, 0xF128, 0x3DC2, 0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000, + 0x8002, 0x8004, 0x8007, 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC, + 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, + 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_3); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168fp_3[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x2B14); + + if (rtl8168_check_dash_other_fun_present(hw)) + rtl_mac_ocp_write(hw, 0xFC38, 0x0000); + else + rtl_mac_ocp_write(hw, 0xFC38, 0x0001); +} + +/* ------------------------------------PHY 8168FP------------------------------------- */ + +void +hw_mac_mcu_config_8168fp(struct rtl_hw *hw) +{ + if (hw->NotWrMcuPatchCode) + return; + + switch (hw->mcfg) { + case CFG_METHOD_31: + rtl8168_set_mac_mcu_8168fp_1(hw); + break; + case CFG_METHOD_32: + rtl8168_set_mac_mcu_8168fp_2(hw); + break; + case CFG_METHOD_33: + case CFG_METHOD_34: + rtl8168_set_mac_mcu_8168fp_3(hw); + break; + } +} diff --git a/drivers/net/r8169/base/rtl8168g.c b/drivers/net/r8169/base/rtl8168g.c new file mode 100644 index 0000000000..8f5e7ac2a5 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168g.c @@ -0,0 +1,297 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168g.h" + +/* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */ + +static void +hw_init_rxcfg_8168g(struct rtl_hw *hw) +{ + RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 | + (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2); +} + +static void +hw_ephy_config_8168g(struct rtl_hw *hw) +{ + u16 ephy_data; + + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + ephy_data = rtl_ephy_read(hw, 0x00); + ephy_data &= ~BIT_3; + rtl_ephy_write(hw, 0x00, ephy_data); + ephy_data = rtl_ephy_read(hw, 0x0C); + ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | + BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4); + ephy_data |= (BIT_5 | BIT_11); + rtl_ephy_write(hw, 0x0C, ephy_data); + + ephy_data = rtl_ephy_read(hw, 0x1E); + ephy_data |= BIT_0; + rtl_ephy_write(hw, 0x1E, ephy_data); + + ephy_data = rtl_ephy_read(hw, 0x19); + ephy_data &= ~BIT_15; + rtl_ephy_write(hw, 0x19, ephy_data); + break; + case CFG_METHOD_25: + ephy_data = rtl_ephy_read(hw, 0x00); + ephy_data &= ~BIT_3; + rtl_ephy_write(hw, 0x00, ephy_data); + ephy_data = rtl_ephy_read(hw, 0x0C); + ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | + BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4); + ephy_data |= (BIT_5 | BIT_11); + rtl_ephy_write(hw, 0x0C, ephy_data); + + rtl_ephy_write(hw, 0x19, 0x7C00); + rtl_ephy_write(hw, 0x1E, 0x20EB); + rtl_ephy_write(hw, 0x0D, 0x1666); + rtl_ephy_write(hw, 0x00, 0x10A3); + rtl_ephy_write(hw, 0x06, 0xF050); + + rtl_set_pcie_phy_bit(hw, 0x04, BIT_4); + rtl_clear_pcie_phy_bit(hw, 0x1D, BIT_14); + break; + default: + break; + } +} + +static void +hw_phy_config_8168g_1(struct rtl_hw *hw) +{ + u16 gphy_val; + + rtl_mdio_write(hw, 0x1F, 0x0A46); + gphy_val = rtl_mdio_read(hw, 0x10); + rtl_mdio_write(hw, 0x1F, 0x0BCC); + if (gphy_val & BIT_8) + rtl_clear_eth_phy_bit(hw, 0x12, BIT_15); + else + rtl_set_eth_phy_bit(hw, 0x12, BIT_15); + rtl_mdio_write(hw, 0x1F, 0x0A46); + gphy_val = rtl_mdio_read(hw, 0x13); + rtl_mdio_write(hw, 0x1F, 0x0C41); + if (gphy_val & BIT_8) + rtl_set_eth_phy_bit(hw, 0x15, BIT_1); + else + rtl_clear_eth_phy_bit(hw, 0x15, BIT_1); + + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2 | BIT_3); + + rtl_mdio_write(hw, 0x1F, 0x0BCC); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8); + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8084); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0); + + rtl_mdio_write(hw, 0x1F, 0x0A4B); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8012); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15); + + rtl_mdio_write(hw, 0x1F, 0x0C42); + gphy_val = rtl_mdio_read(hw, 0x11); + gphy_val |= BIT_14; + gphy_val &= ~BIT_13; + rtl_mdio_write(hw, 0x11, gphy_val); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x809A); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x13, 0x80A0); + gphy_val = rtl_mdio_read(hw, 0x14) & 0x00FF; + gphy_val |= 0x1000; + rtl_mdio_write(hw, 0x14, gphy_val); + rtl_mdio_write(hw, 0x13, 0x8088); + rtl_mdio_write(hw, 0x14, 0x9222); + + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +static void +hw_phy_config_8168g_2(struct rtl_hw *hw) +{ + u16 gphy_val; + + rtl_mdio_write(hw, 0x1F, 0x0BCC); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8); + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8084); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8012); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15); + + rtl_mdio_write(hw, 0x1F, 0x0C42); + gphy_val = rtl_mdio_read(hw, 0x11); + gphy_val |= BIT_14; + gphy_val &= ~BIT_13; + rtl_mdio_write(hw, 0x11, gphy_val); +} + +static void +hw_phy_config_8168g_3(struct rtl_hw *hw) +{ + rtl_mdio_write(hw, 0x1F, 0x0BCC); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8); + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7); + rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8084); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1); + rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8012); + rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15); + + rtl_mdio_write(hw, 0x1F, 0x0BCE); + rtl_mdio_write(hw, 0x12, 0x8860); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x80F3); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00); + rtl_mdio_write(hw, 0x13, 0x80F0); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00); + rtl_mdio_write(hw, 0x13, 0x80EF); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500); + rtl_mdio_write(hw, 0x13, 0x80F6); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00); + rtl_mdio_write(hw, 0x13, 0x80EC); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800); + rtl_mdio_write(hw, 0x13, 0x80ED); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00); + rtl_mdio_write(hw, 0x13, 0x80F2); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400); + rtl_mdio_write(hw, 0x13, 0x80F4); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8110); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800); + rtl_mdio_write(hw, 0x13, 0x810F); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00); + rtl_mdio_write(hw, 0x13, 0x8111); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500); + rtl_mdio_write(hw, 0x13, 0x8113); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100); + rtl_mdio_write(hw, 0x13, 0x8115); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200); + rtl_mdio_write(hw, 0x13, 0x810E); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400); + rtl_mdio_write(hw, 0x13, 0x810C); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00); + rtl_mdio_write(hw, 0x13, 0x810B); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x80D1); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00); + rtl_mdio_write(hw, 0x13, 0x80CD); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00); + rtl_mdio_write(hw, 0x13, 0x80D3); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00); + rtl_mdio_write(hw, 0x13, 0x80D5); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00); + rtl_mdio_write(hw, 0x13, 0x80D7); + rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400); +} + +static void +hw_phy_config_8168g(struct rtl_hw *hw) +{ + if (hw->mcfg == CFG_METHOD_21) + hw_phy_config_8168g_1(hw); + else if (hw->mcfg == CFG_METHOD_24) + hw_phy_config_8168g_2(hw); + else if (hw->mcfg == CFG_METHOD_25) + hw_phy_config_8168g_3(hw); + + /* Disable EthPhyPPSW */ + rtl_mdio_write(hw, 0x1F, 0x0BCD); + rtl_mdio_write(hw, 0x14, 0x5065); + rtl_mdio_write(hw, 0x14, 0xD065); + rtl_mdio_write(hw, 0x1F, 0x0BC8); + rtl_mdio_write(hw, 0x11, 0x5655); + rtl_mdio_write(hw, 0x1F, 0x0BCD); + rtl_mdio_write(hw, 0x14, 0x1065); + rtl_mdio_write(hw, 0x14, 0x9065); + rtl_mdio_write(hw, 0x14, 0x1065); + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +static void +hw_config_8168g(struct rtl_hw *hw) +{ + u32 csi_tmp; + + /* Share fifo rx params */ + rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC); + + /* Adjust the trx fifo*/ + rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC); + + /* Disable share fifo */ + RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7); + + RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en); + + /* EEE led enable */ + RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07); + + RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En); + + /* CRC wake disable */ + rtl_mac_ocp_write(hw, 0xC140, 0xFFFF); + + csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC); + csi_tmp &= ~BIT_12; + rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC); + + csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC); + csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2); + csi_tmp |= BIT_0; + rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC); + + csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC); + csi_tmp |= BIT_1; + rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC); +} + +const struct rtl_hw_ops rtl8168g_ops = { + .hw_config = hw_config_8168g, + .hw_init_rxcfg = hw_init_rxcfg_8168g, + .hw_ephy_config = hw_ephy_config_8168g, + .hw_phy_config = hw_phy_config_8168g, + .hw_mac_mcu_config = hw_mac_mcu_config_8168g, + .hw_phy_mcu_config = hw_phy_mcu_config_8168g, +}; diff --git a/drivers/net/r8169/base/rtl8168g.h b/drivers/net/r8169/base/rtl8168g.h new file mode 100644 index 0000000000..feb0e28ff6 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168g.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef _RTL8168G_H_ +#define _RTL8168G_H_ + +#include "../r8169_compat.h" + +extern const struct rtl_hw_ops rtl8168g_ops; + +void hw_mac_mcu_config_8168g(struct rtl_hw *hw); +void hw_phy_mcu_config_8168g(struct rtl_hw *hw); + +#endif diff --git a/drivers/net/r8169/base/rtl8168g_mcu.c b/drivers/net/r8169/base/rtl8168g_mcu.c new file mode 100644 index 0000000000..a1296b044b --- /dev/null +++ b/drivers/net/r8169/base/rtl8168g_mcu.c @@ -0,0 +1,1936 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168g.h" + +/* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */ + +/* ------------------------------------MAC 8168G1----------------------------------- */ + +static void +rtl8168_set_mac_mcu_8168g_1(struct rtl_hw *hw) +{ + rtl_mac_ocp_write(hw, 0xE43C, 0x0000); + rtl_mac_ocp_write(hw, 0xE43E, 0x0000); + + rtl_mac_ocp_write(hw, 0xE434, 0x0004); + rtl_mac_ocp_write(hw, 0xE43C, 0x0004); + + rtl_hw_disable_mac_mcu_bps(hw); + + rtl_mac_ocp_write(hw, 0xF800, 0xE008); + rtl_mac_ocp_write(hw, 0xF802, 0xE01B); + rtl_mac_ocp_write(hw, 0xF804, 0xE022); + rtl_mac_ocp_write(hw, 0xF806, 0xE094); + rtl_mac_ocp_write(hw, 0xF808, 0xE097); + rtl_mac_ocp_write(hw, 0xF80A, 0xE09A); + rtl_mac_ocp_write(hw, 0xF80C, 0xE0B3); + rtl_mac_ocp_write(hw, 0xF80E, 0xE0BA); + rtl_mac_ocp_write(hw, 0xF810, 0x49D2); + rtl_mac_ocp_write(hw, 0xF812, 0xF10D); + rtl_mac_ocp_write(hw, 0xF814, 0x766C); + rtl_mac_ocp_write(hw, 0xF816, 0x49E2); + rtl_mac_ocp_write(hw, 0xF818, 0xF00A); + rtl_mac_ocp_write(hw, 0xF81A, 0x1EC0); + rtl_mac_ocp_write(hw, 0xF81C, 0x8EE1); + rtl_mac_ocp_write(hw, 0xF81E, 0xC60A); + rtl_mac_ocp_write(hw, 0xF820, 0x77C0); + rtl_mac_ocp_write(hw, 0xF822, 0x4870); + rtl_mac_ocp_write(hw, 0xF824, 0x9FC0); + rtl_mac_ocp_write(hw, 0xF826, 0x1EA0); + rtl_mac_ocp_write(hw, 0xF828, 0xC707); + rtl_mac_ocp_write(hw, 0xF82A, 0x8EE1); + rtl_mac_ocp_write(hw, 0xF82C, 0x9D6C); + rtl_mac_ocp_write(hw, 0xF82E, 0xC603); + rtl_mac_ocp_write(hw, 0xF830, 0xBE00); + rtl_mac_ocp_write(hw, 0xF832, 0xB416); + rtl_mac_ocp_write(hw, 0xF834, 0x0076); + rtl_mac_ocp_write(hw, 0xF836, 0xE86C); + rtl_mac_ocp_write(hw, 0xF838, 0xC406); + rtl_mac_ocp_write(hw, 0xF83A, 0x7580); + rtl_mac_ocp_write(hw, 0xF83C, 0x4852); + rtl_mac_ocp_write(hw, 0xF83E, 0x8D80); + rtl_mac_ocp_write(hw, 0xF840, 0xC403); + rtl_mac_ocp_write(hw, 0xF842, 0xBC00); + rtl_mac_ocp_write(hw, 0xF844, 0xD3E0); + rtl_mac_ocp_write(hw, 0xF846, 0x02C8); + rtl_mac_ocp_write(hw, 0xF848, 0x8918); + rtl_mac_ocp_write(hw, 0xF84A, 0xE815); + rtl_mac_ocp_write(hw, 0xF84C, 0x1100); + rtl_mac_ocp_write(hw, 0xF84E, 0xF011); + rtl_mac_ocp_write(hw, 0xF850, 0xE812); + rtl_mac_ocp_write(hw, 0xF852, 0x4990); + rtl_mac_ocp_write(hw, 0xF854, 0xF002); + rtl_mac_ocp_write(hw, 0xF856, 0xE817); + rtl_mac_ocp_write(hw, 0xF858, 0xE80E); + rtl_mac_ocp_write(hw, 0xF85A, 0x4992); + rtl_mac_ocp_write(hw, 0xF85C, 0xF002); + rtl_mac_ocp_write(hw, 0xF85E, 0xE80E); + rtl_mac_ocp_write(hw, 0xF860, 0xE80A); + rtl_mac_ocp_write(hw, 0xF862, 0x4993); + rtl_mac_ocp_write(hw, 0xF864, 0xF002); + rtl_mac_ocp_write(hw, 0xF866, 0xE818); + rtl_mac_ocp_write(hw, 0xF868, 0xE806); + rtl_mac_ocp_write(hw, 0xF86A, 0x4991); + rtl_mac_ocp_write(hw, 0xF86C, 0xF002); + rtl_mac_ocp_write(hw, 0xF86E, 0xE838); + rtl_mac_ocp_write(hw, 0xF870, 0xC25E); + rtl_mac_ocp_write(hw, 0xF872, 0xBA00); + rtl_mac_ocp_write(hw, 0xF874, 0xC056); + rtl_mac_ocp_write(hw, 0xF876, 0x7100); + rtl_mac_ocp_write(hw, 0xF878, 0xFF80); + rtl_mac_ocp_write(hw, 0xF87A, 0x7100); + rtl_mac_ocp_write(hw, 0xF87C, 0x4892); + rtl_mac_ocp_write(hw, 0xF87E, 0x4813); + rtl_mac_ocp_write(hw, 0xF880, 0x8900); + rtl_mac_ocp_write(hw, 0xF882, 0xE00A); + rtl_mac_ocp_write(hw, 0xF884, 0x7100); + rtl_mac_ocp_write(hw, 0xF886, 0x4890); + rtl_mac_ocp_write(hw, 0xF888, 0x4813); + rtl_mac_ocp_write(hw, 0xF88A, 0x8900); + rtl_mac_ocp_write(hw, 0xF88C, 0xC74B); + rtl_mac_ocp_write(hw, 0xF88E, 0x74F8); + rtl_mac_ocp_write(hw, 0xF890, 0x48C2); + rtl_mac_ocp_write(hw, 0xF892, 0x4841); + rtl_mac_ocp_write(hw, 0xF894, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF896, 0xC746); + rtl_mac_ocp_write(hw, 0xF898, 0x74FC); + rtl_mac_ocp_write(hw, 0xF89A, 0x49C0); + rtl_mac_ocp_write(hw, 0xF89C, 0xF120); + rtl_mac_ocp_write(hw, 0xF89E, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8A0, 0xF11E); + rtl_mac_ocp_write(hw, 0xF8A2, 0x74F8); + rtl_mac_ocp_write(hw, 0xF8A4, 0x49C0); + rtl_mac_ocp_write(hw, 0xF8A6, 0xF01B); + rtl_mac_ocp_write(hw, 0xF8A8, 0x49C6); + rtl_mac_ocp_write(hw, 0xF8AA, 0xF119); + rtl_mac_ocp_write(hw, 0xF8AC, 0x74F8); + rtl_mac_ocp_write(hw, 0xF8AE, 0x49C4); + rtl_mac_ocp_write(hw, 0xF8B0, 0xF013); + rtl_mac_ocp_write(hw, 0xF8B2, 0xC536); + rtl_mac_ocp_write(hw, 0xF8B4, 0x74B0); + rtl_mac_ocp_write(hw, 0xF8B6, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8B8, 0xF1FD); + rtl_mac_ocp_write(hw, 0xF8BA, 0xC537); + rtl_mac_ocp_write(hw, 0xF8BC, 0xC434); + rtl_mac_ocp_write(hw, 0xF8BE, 0x9CA0); + rtl_mac_ocp_write(hw, 0xF8C0, 0xC435); + rtl_mac_ocp_write(hw, 0xF8C2, 0x1C13); + rtl_mac_ocp_write(hw, 0xF8C4, 0x484F); + rtl_mac_ocp_write(hw, 0xF8C6, 0x9CA2); + rtl_mac_ocp_write(hw, 0xF8C8, 0xC52B); + rtl_mac_ocp_write(hw, 0xF8CA, 0x74B0); + rtl_mac_ocp_write(hw, 0xF8CC, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8CE, 0xF1FD); + rtl_mac_ocp_write(hw, 0xF8D0, 0x74F8); + rtl_mac_ocp_write(hw, 0xF8D2, 0x48C4); + rtl_mac_ocp_write(hw, 0xF8D4, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF8D6, 0x7100); + rtl_mac_ocp_write(hw, 0xF8D8, 0x4893); + rtl_mac_ocp_write(hw, 0xF8DA, 0x8900); + rtl_mac_ocp_write(hw, 0xF8DC, 0xFF80); + rtl_mac_ocp_write(hw, 0xF8DE, 0xC520); + rtl_mac_ocp_write(hw, 0xF8E0, 0x74B0); + rtl_mac_ocp_write(hw, 0xF8E2, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8E4, 0xF11C); + rtl_mac_ocp_write(hw, 0xF8E6, 0xC71E); + rtl_mac_ocp_write(hw, 0xF8E8, 0x74FC); + rtl_mac_ocp_write(hw, 0xF8EA, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8EC, 0xF118); + rtl_mac_ocp_write(hw, 0xF8EE, 0x49C0); + rtl_mac_ocp_write(hw, 0xF8F0, 0xF116); + rtl_mac_ocp_write(hw, 0xF8F2, 0x74F8); + rtl_mac_ocp_write(hw, 0xF8F4, 0x49C0); + rtl_mac_ocp_write(hw, 0xF8F6, 0xF013); + rtl_mac_ocp_write(hw, 0xF8F8, 0x48C3); + rtl_mac_ocp_write(hw, 0xF8FA, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF8FC, 0xC516); + rtl_mac_ocp_write(hw, 0xF8FE, 0x74A2); + rtl_mac_ocp_write(hw, 0xF900, 0x49CE); + rtl_mac_ocp_write(hw, 0xF902, 0xF1FE); + rtl_mac_ocp_write(hw, 0xF904, 0xC411); + rtl_mac_ocp_write(hw, 0xF906, 0x9CA0); + rtl_mac_ocp_write(hw, 0xF908, 0xC411); + rtl_mac_ocp_write(hw, 0xF90A, 0x1C13); + rtl_mac_ocp_write(hw, 0xF90C, 0x484F); + rtl_mac_ocp_write(hw, 0xF90E, 0x9CA2); + rtl_mac_ocp_write(hw, 0xF910, 0x74A2); + rtl_mac_ocp_write(hw, 0xF912, 0x49CF); + rtl_mac_ocp_write(hw, 0xF914, 0xF1FE); + rtl_mac_ocp_write(hw, 0xF916, 0x7100); + rtl_mac_ocp_write(hw, 0xF918, 0x4891); + rtl_mac_ocp_write(hw, 0xF91A, 0x8900); + rtl_mac_ocp_write(hw, 0xF91C, 0xFF80); + rtl_mac_ocp_write(hw, 0xF91E, 0xE400); + rtl_mac_ocp_write(hw, 0xF920, 0xD3E0); + rtl_mac_ocp_write(hw, 0xF922, 0xE000); + rtl_mac_ocp_write(hw, 0xF924, 0x0481); + rtl_mac_ocp_write(hw, 0xF926, 0x0C81); + rtl_mac_ocp_write(hw, 0xF928, 0xDE20); + rtl_mac_ocp_write(hw, 0xF92A, 0x0000); + rtl_mac_ocp_write(hw, 0xF92C, 0x0992); + rtl_mac_ocp_write(hw, 0xF92E, 0x1B76); + rtl_mac_ocp_write(hw, 0xF930, 0xC602); + rtl_mac_ocp_write(hw, 0xF932, 0xBE00); + rtl_mac_ocp_write(hw, 0xF934, 0x059C); + rtl_mac_ocp_write(hw, 0xF936, 0x1B76); + rtl_mac_ocp_write(hw, 0xF938, 0xC602); + rtl_mac_ocp_write(hw, 0xF93A, 0xBE00); + rtl_mac_ocp_write(hw, 0xF93C, 0x065A); + rtl_mac_ocp_write(hw, 0xF93E, 0xB400); + rtl_mac_ocp_write(hw, 0xF940, 0x18DE); + rtl_mac_ocp_write(hw, 0xF942, 0x2008); + rtl_mac_ocp_write(hw, 0xF944, 0x4001); + rtl_mac_ocp_write(hw, 0xF946, 0xF10F); + rtl_mac_ocp_write(hw, 0xF948, 0x7342); + rtl_mac_ocp_write(hw, 0xF94A, 0x1880); + rtl_mac_ocp_write(hw, 0xF94C, 0x2008); + rtl_mac_ocp_write(hw, 0xF94E, 0x0009); + rtl_mac_ocp_write(hw, 0xF950, 0x4018); + rtl_mac_ocp_write(hw, 0xF952, 0xF109); + rtl_mac_ocp_write(hw, 0xF954, 0x7340); + rtl_mac_ocp_write(hw, 0xF956, 0x25BC); + rtl_mac_ocp_write(hw, 0xF958, 0x130F); + rtl_mac_ocp_write(hw, 0xF95A, 0xF105); + rtl_mac_ocp_write(hw, 0xF95C, 0xC00A); + rtl_mac_ocp_write(hw, 0xF95E, 0x7300); + rtl_mac_ocp_write(hw, 0xF960, 0x4831); + rtl_mac_ocp_write(hw, 0xF962, 0x9B00); + rtl_mac_ocp_write(hw, 0xF964, 0xB000); + rtl_mac_ocp_write(hw, 0xF966, 0x7340); + rtl_mac_ocp_write(hw, 0xF968, 0x8320); + rtl_mac_ocp_write(hw, 0xF96A, 0xC302); + rtl_mac_ocp_write(hw, 0xF96C, 0xBB00); + rtl_mac_ocp_write(hw, 0xF96E, 0x0C12); + rtl_mac_ocp_write(hw, 0xF970, 0xE860); + rtl_mac_ocp_write(hw, 0xF972, 0xC406); + rtl_mac_ocp_write(hw, 0xF974, 0x7580); + rtl_mac_ocp_write(hw, 0xF976, 0x4851); + rtl_mac_ocp_write(hw, 0xF978, 0x8D80); + rtl_mac_ocp_write(hw, 0xF97A, 0xC403); + rtl_mac_ocp_write(hw, 0xF97C, 0xBC00); + rtl_mac_ocp_write(hw, 0xF97E, 0xD3E0); + rtl_mac_ocp_write(hw, 0xF980, 0x02C8); + rtl_mac_ocp_write(hw, 0xF982, 0xC406); + rtl_mac_ocp_write(hw, 0xF984, 0x7580); + rtl_mac_ocp_write(hw, 0xF986, 0x4850); + rtl_mac_ocp_write(hw, 0xF988, 0x8D80); + rtl_mac_ocp_write(hw, 0xF98A, 0xC403); + rtl_mac_ocp_write(hw, 0xF98C, 0xBC00); + rtl_mac_ocp_write(hw, 0xF98E, 0xD3E0); + rtl_mac_ocp_write(hw, 0xF990, 0x0298); + + rtl_mac_ocp_write(hw, 0xDE30, 0x0080); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0075); + rtl_mac_ocp_write(hw, 0xFC2A, 0x02B1); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0991); + rtl_mac_ocp_write(hw, 0xFC2E, 0x059B); + rtl_mac_ocp_write(hw, 0xFC30, 0x0659); + rtl_mac_ocp_write(hw, 0xFC32, 0x0000); + rtl_mac_ocp_write(hw, 0xFC34, 0x02C7); + rtl_mac_ocp_write(hw, 0xFC36, 0x0279); +} + +/* ------------------------------------MAC 8168GU1---------------------------------- */ + +static void +rtl8168_set_mac_mcu_8168gu_1(struct rtl_hw *hw) +{ + rtl_hw_disable_mac_mcu_bps(hw); + + rtl_mac_ocp_write(hw, 0xF800, 0xE008); + rtl_mac_ocp_write(hw, 0xF802, 0xE011); + rtl_mac_ocp_write(hw, 0xF804, 0xE015); + rtl_mac_ocp_write(hw, 0xF806, 0xE018); + rtl_mac_ocp_write(hw, 0xF808, 0xE01B); + rtl_mac_ocp_write(hw, 0xF80A, 0xE027); + rtl_mac_ocp_write(hw, 0xF80C, 0xE043); + rtl_mac_ocp_write(hw, 0xF80E, 0xE065); + rtl_mac_ocp_write(hw, 0xF810, 0x49E2); + rtl_mac_ocp_write(hw, 0xF812, 0xF005); + rtl_mac_ocp_write(hw, 0xF814, 0x49EA); + rtl_mac_ocp_write(hw, 0xF816, 0xF003); + rtl_mac_ocp_write(hw, 0xF818, 0xC404); + rtl_mac_ocp_write(hw, 0xF81A, 0xBC00); + rtl_mac_ocp_write(hw, 0xF81C, 0xC403); + rtl_mac_ocp_write(hw, 0xF81E, 0xBC00); + rtl_mac_ocp_write(hw, 0xF820, 0x0496); + rtl_mac_ocp_write(hw, 0xF822, 0x051A); + rtl_mac_ocp_write(hw, 0xF824, 0x1D01); + rtl_mac_ocp_write(hw, 0xF826, 0x8DE8); + rtl_mac_ocp_write(hw, 0xF828, 0xC602); + rtl_mac_ocp_write(hw, 0xF82A, 0xBE00); + rtl_mac_ocp_write(hw, 0xF82C, 0x0206); + rtl_mac_ocp_write(hw, 0xF82E, 0x1B76); + rtl_mac_ocp_write(hw, 0xF830, 0xC202); + rtl_mac_ocp_write(hw, 0xF832, 0xBA00); + rtl_mac_ocp_write(hw, 0xF834, 0x058A); + rtl_mac_ocp_write(hw, 0xF836, 0x1B76); + rtl_mac_ocp_write(hw, 0xF838, 0xC602); + rtl_mac_ocp_write(hw, 0xF83A, 0xBE00); + rtl_mac_ocp_write(hw, 0xF83C, 0x0648); + rtl_mac_ocp_write(hw, 0xF83E, 0x74E6); + rtl_mac_ocp_write(hw, 0xF840, 0x1B78); + rtl_mac_ocp_write(hw, 0xF842, 0x46DC); + rtl_mac_ocp_write(hw, 0xF844, 0x1300); + rtl_mac_ocp_write(hw, 0xF846, 0xF005); + rtl_mac_ocp_write(hw, 0xF848, 0x74F8); + rtl_mac_ocp_write(hw, 0xF84A, 0x48C3); + rtl_mac_ocp_write(hw, 0xF84C, 0x48C4); + rtl_mac_ocp_write(hw, 0xF84E, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF850, 0x64E7); + rtl_mac_ocp_write(hw, 0xF852, 0xC302); + rtl_mac_ocp_write(hw, 0xF854, 0xBB00); + rtl_mac_ocp_write(hw, 0xF856, 0x068E); + rtl_mac_ocp_write(hw, 0xF858, 0x74E4); + rtl_mac_ocp_write(hw, 0xF85A, 0x49C5); + rtl_mac_ocp_write(hw, 0xF85C, 0xF106); + rtl_mac_ocp_write(hw, 0xF85E, 0x49C6); + rtl_mac_ocp_write(hw, 0xF860, 0xF107); + rtl_mac_ocp_write(hw, 0xF862, 0x48C8); + rtl_mac_ocp_write(hw, 0xF864, 0x48C9); + rtl_mac_ocp_write(hw, 0xF866, 0xE011); + rtl_mac_ocp_write(hw, 0xF868, 0x48C9); + rtl_mac_ocp_write(hw, 0xF86A, 0x4848); + rtl_mac_ocp_write(hw, 0xF86C, 0xE00E); + rtl_mac_ocp_write(hw, 0xF86E, 0x4848); + rtl_mac_ocp_write(hw, 0xF870, 0x49C7); + rtl_mac_ocp_write(hw, 0xF872, 0xF00A); + rtl_mac_ocp_write(hw, 0xF874, 0x48C9); + rtl_mac_ocp_write(hw, 0xF876, 0xC60D); + rtl_mac_ocp_write(hw, 0xF878, 0x1D1F); + rtl_mac_ocp_write(hw, 0xF87A, 0x8DC2); + rtl_mac_ocp_write(hw, 0xF87C, 0x1D00); + rtl_mac_ocp_write(hw, 0xF87E, 0x8DC3); + rtl_mac_ocp_write(hw, 0xF880, 0x1D11); + rtl_mac_ocp_write(hw, 0xF882, 0x8DC0); + rtl_mac_ocp_write(hw, 0xF884, 0xE002); + rtl_mac_ocp_write(hw, 0xF886, 0x4849); + rtl_mac_ocp_write(hw, 0xF888, 0x94E5); + rtl_mac_ocp_write(hw, 0xF88A, 0xC602); + rtl_mac_ocp_write(hw, 0xF88C, 0xBE00); + rtl_mac_ocp_write(hw, 0xF88E, 0x0238); + rtl_mac_ocp_write(hw, 0xF890, 0xE434); + rtl_mac_ocp_write(hw, 0xF892, 0x49D9); + rtl_mac_ocp_write(hw, 0xF894, 0xF01B); + rtl_mac_ocp_write(hw, 0xF896, 0xC31E); + rtl_mac_ocp_write(hw, 0xF898, 0x7464); + rtl_mac_ocp_write(hw, 0xF89A, 0x49C4); + rtl_mac_ocp_write(hw, 0xF89C, 0xF114); + rtl_mac_ocp_write(hw, 0xF89E, 0xC31B); + rtl_mac_ocp_write(hw, 0xF8A0, 0x6460); + rtl_mac_ocp_write(hw, 0xF8A2, 0x14FA); + rtl_mac_ocp_write(hw, 0xF8A4, 0xFA02); + rtl_mac_ocp_write(hw, 0xF8A6, 0xE00F); + rtl_mac_ocp_write(hw, 0xF8A8, 0xC317); + rtl_mac_ocp_write(hw, 0xF8AA, 0x7460); + rtl_mac_ocp_write(hw, 0xF8AC, 0x49C0); + rtl_mac_ocp_write(hw, 0xF8AE, 0xF10B); + rtl_mac_ocp_write(hw, 0xF8B0, 0xC311); + rtl_mac_ocp_write(hw, 0xF8B2, 0x7462); + rtl_mac_ocp_write(hw, 0xF8B4, 0x48C1); + rtl_mac_ocp_write(hw, 0xF8B6, 0x9C62); + rtl_mac_ocp_write(hw, 0xF8B8, 0x4841); + rtl_mac_ocp_write(hw, 0xF8BA, 0x9C62); + rtl_mac_ocp_write(hw, 0xF8BC, 0xC30A); + rtl_mac_ocp_write(hw, 0xF8BE, 0x1C04); + rtl_mac_ocp_write(hw, 0xF8C0, 0x8C60); + rtl_mac_ocp_write(hw, 0xF8C2, 0xE004); + rtl_mac_ocp_write(hw, 0xF8C4, 0x1C15); + rtl_mac_ocp_write(hw, 0xF8C6, 0xC305); + rtl_mac_ocp_write(hw, 0xF8C8, 0x8C60); + rtl_mac_ocp_write(hw, 0xF8CA, 0xC602); + rtl_mac_ocp_write(hw, 0xF8CC, 0xBE00); + rtl_mac_ocp_write(hw, 0xF8CE, 0x0374); + rtl_mac_ocp_write(hw, 0xF8D0, 0xE434); + rtl_mac_ocp_write(hw, 0xF8D2, 0xE030); + rtl_mac_ocp_write(hw, 0xF8D4, 0xE61C); + rtl_mac_ocp_write(hw, 0xF8D6, 0xE906); + rtl_mac_ocp_write(hw, 0xF8D8, 0xC602); + rtl_mac_ocp_write(hw, 0xF8DA, 0xBE00); + rtl_mac_ocp_write(hw, 0xF8DC, 0x0000); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0493); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0205); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0589); + rtl_mac_ocp_write(hw, 0xFC2E, 0x0647); + rtl_mac_ocp_write(hw, 0xFC30, 0x0000); + rtl_mac_ocp_write(hw, 0xFC32, 0x0215); + rtl_mac_ocp_write(hw, 0xFC34, 0x0285); +} + +/* ------------------------------------MAC 8168GU2------------------------------------- */ + +static void +rtl8168_set_mac_mcu_8168gu_2(struct rtl_hw *hw) +{ + rtl_hw_disable_mac_mcu_bps(hw); + + rtl_mac_ocp_write(hw, 0xF800, 0xE008); + rtl_mac_ocp_write(hw, 0xF802, 0xE00A); + rtl_mac_ocp_write(hw, 0xF804, 0xE00D); + rtl_mac_ocp_write(hw, 0xF806, 0xE02F); + rtl_mac_ocp_write(hw, 0xF808, 0xE031); + rtl_mac_ocp_write(hw, 0xF80A, 0xE038); + rtl_mac_ocp_write(hw, 0xF80C, 0xE03A); + rtl_mac_ocp_write(hw, 0xF80E, 0xE051); + rtl_mac_ocp_write(hw, 0xF810, 0xC202); + rtl_mac_ocp_write(hw, 0xF812, 0xBA00); + rtl_mac_ocp_write(hw, 0xF814, 0x0DFC); + rtl_mac_ocp_write(hw, 0xF816, 0x7444); + rtl_mac_ocp_write(hw, 0xF818, 0xC502); + rtl_mac_ocp_write(hw, 0xF81A, 0xBD00); + rtl_mac_ocp_write(hw, 0xF81C, 0x0A30); + rtl_mac_ocp_write(hw, 0xF81E, 0x49D9); + rtl_mac_ocp_write(hw, 0xF820, 0xF019); + rtl_mac_ocp_write(hw, 0xF822, 0xC520); + rtl_mac_ocp_write(hw, 0xF824, 0x64A5); + rtl_mac_ocp_write(hw, 0xF826, 0x1400); + rtl_mac_ocp_write(hw, 0xF828, 0xF007); + rtl_mac_ocp_write(hw, 0xF82A, 0x0C01); + rtl_mac_ocp_write(hw, 0xF82C, 0x8CA5); + rtl_mac_ocp_write(hw, 0xF82E, 0x1C15); + rtl_mac_ocp_write(hw, 0xF830, 0xC515); + rtl_mac_ocp_write(hw, 0xF832, 0x9CA0); + rtl_mac_ocp_write(hw, 0xF834, 0xE00F); + rtl_mac_ocp_write(hw, 0xF836, 0xC513); + rtl_mac_ocp_write(hw, 0xF838, 0x74A0); + rtl_mac_ocp_write(hw, 0xF83A, 0x48C8); + rtl_mac_ocp_write(hw, 0xF83C, 0x48CA); + rtl_mac_ocp_write(hw, 0xF83E, 0x9CA0); + rtl_mac_ocp_write(hw, 0xF840, 0xC510); + rtl_mac_ocp_write(hw, 0xF842, 0x1B00); + rtl_mac_ocp_write(hw, 0xF844, 0x9BA0); + rtl_mac_ocp_write(hw, 0xF846, 0x1B1C); + rtl_mac_ocp_write(hw, 0xF848, 0x483F); + rtl_mac_ocp_write(hw, 0xF84A, 0x9BA2); + rtl_mac_ocp_write(hw, 0xF84C, 0x1B04); + rtl_mac_ocp_write(hw, 0xF84E, 0xC506); + rtl_mac_ocp_write(hw, 0xF850, 0x9BA0); + rtl_mac_ocp_write(hw, 0xF852, 0xC603); + rtl_mac_ocp_write(hw, 0xF854, 0xBE00); + rtl_mac_ocp_write(hw, 0xF856, 0x0298); + rtl_mac_ocp_write(hw, 0xF858, 0x03DE); + rtl_mac_ocp_write(hw, 0xF85A, 0xE434); + rtl_mac_ocp_write(hw, 0xF85C, 0xE096); + rtl_mac_ocp_write(hw, 0xF85E, 0xE860); + rtl_mac_ocp_write(hw, 0xF860, 0xDE20); + rtl_mac_ocp_write(hw, 0xF862, 0xD3C0); + rtl_mac_ocp_write(hw, 0xF864, 0xC602); + rtl_mac_ocp_write(hw, 0xF866, 0xBE00); + rtl_mac_ocp_write(hw, 0xF868, 0x0A64); + rtl_mac_ocp_write(hw, 0xF86A, 0xC707); + rtl_mac_ocp_write(hw, 0xF86C, 0x1D00); + rtl_mac_ocp_write(hw, 0xF86E, 0x8DE2); + rtl_mac_ocp_write(hw, 0xF870, 0x48C1); + rtl_mac_ocp_write(hw, 0xF872, 0xC502); + rtl_mac_ocp_write(hw, 0xF874, 0xBD00); + rtl_mac_ocp_write(hw, 0xF876, 0x00AA); + rtl_mac_ocp_write(hw, 0xF878, 0xE0C0); + rtl_mac_ocp_write(hw, 0xF87A, 0xC502); + rtl_mac_ocp_write(hw, 0xF87C, 0xBD00); + rtl_mac_ocp_write(hw, 0xF87E, 0x0132); + rtl_mac_ocp_write(hw, 0xF880, 0xC50C); + rtl_mac_ocp_write(hw, 0xF882, 0x74A2); + rtl_mac_ocp_write(hw, 0xF884, 0x49CE); + rtl_mac_ocp_write(hw, 0xF886, 0xF1FE); + rtl_mac_ocp_write(hw, 0xF888, 0x1C00); + rtl_mac_ocp_write(hw, 0xF88A, 0x9EA0); + rtl_mac_ocp_write(hw, 0xF88C, 0x1C1C); + rtl_mac_ocp_write(hw, 0xF88E, 0x484F); + rtl_mac_ocp_write(hw, 0xF890, 0x9CA2); + rtl_mac_ocp_write(hw, 0xF892, 0xC402); + rtl_mac_ocp_write(hw, 0xF894, 0xBC00); + rtl_mac_ocp_write(hw, 0xF896, 0x0AFA); + rtl_mac_ocp_write(hw, 0xF898, 0xDE20); + rtl_mac_ocp_write(hw, 0xF89A, 0xE000); + rtl_mac_ocp_write(hw, 0xF89C, 0xE092); + rtl_mac_ocp_write(hw, 0xF89E, 0xE430); + rtl_mac_ocp_write(hw, 0xF8A0, 0xDE20); + rtl_mac_ocp_write(hw, 0xF8A2, 0xE0C0); + rtl_mac_ocp_write(hw, 0xF8A4, 0xE860); + rtl_mac_ocp_write(hw, 0xF8A6, 0xE84C); + rtl_mac_ocp_write(hw, 0xF8A8, 0xB400); + rtl_mac_ocp_write(hw, 0xF8AA, 0xB430); + rtl_mac_ocp_write(hw, 0xF8AC, 0xE410); + rtl_mac_ocp_write(hw, 0xF8AE, 0xC0AE); + rtl_mac_ocp_write(hw, 0xF8B0, 0xB407); + rtl_mac_ocp_write(hw, 0xF8B2, 0xB406); + rtl_mac_ocp_write(hw, 0xF8B4, 0xB405); + rtl_mac_ocp_write(hw, 0xF8B6, 0xB404); + rtl_mac_ocp_write(hw, 0xF8B8, 0xB403); + rtl_mac_ocp_write(hw, 0xF8BA, 0xB402); + rtl_mac_ocp_write(hw, 0xF8BC, 0xB401); + rtl_mac_ocp_write(hw, 0xF8BE, 0xC7EE); + rtl_mac_ocp_write(hw, 0xF8C0, 0x76F4); + rtl_mac_ocp_write(hw, 0xF8C2, 0xC2ED); + rtl_mac_ocp_write(hw, 0xF8C4, 0xC3ED); + rtl_mac_ocp_write(hw, 0xF8C6, 0xC1EF); + rtl_mac_ocp_write(hw, 0xF8C8, 0xC5F3); + rtl_mac_ocp_write(hw, 0xF8CA, 0x74A0); + rtl_mac_ocp_write(hw, 0xF8CC, 0x49CD); + rtl_mac_ocp_write(hw, 0xF8CE, 0xF001); + rtl_mac_ocp_write(hw, 0xF8D0, 0xC5EE); + rtl_mac_ocp_write(hw, 0xF8D2, 0x74A0); + rtl_mac_ocp_write(hw, 0xF8D4, 0x49C1); + rtl_mac_ocp_write(hw, 0xF8D6, 0xF105); + rtl_mac_ocp_write(hw, 0xF8D8, 0xC5E4); + rtl_mac_ocp_write(hw, 0xF8DA, 0x74A2); + rtl_mac_ocp_write(hw, 0xF8DC, 0x49CE); + rtl_mac_ocp_write(hw, 0xF8DE, 0xF00B); + rtl_mac_ocp_write(hw, 0xF8E0, 0x7444); + rtl_mac_ocp_write(hw, 0xF8E2, 0x484B); + rtl_mac_ocp_write(hw, 0xF8E4, 0x9C44); + rtl_mac_ocp_write(hw, 0xF8E6, 0x1C10); + rtl_mac_ocp_write(hw, 0xF8E8, 0x9C62); + rtl_mac_ocp_write(hw, 0xF8EA, 0x1C11); + rtl_mac_ocp_write(hw, 0xF8EC, 0x8C60); + rtl_mac_ocp_write(hw, 0xF8EE, 0x1C00); + rtl_mac_ocp_write(hw, 0xF8F0, 0x9CF6); + rtl_mac_ocp_write(hw, 0xF8F2, 0xE0EC); + rtl_mac_ocp_write(hw, 0xF8F4, 0x49E7); + rtl_mac_ocp_write(hw, 0xF8F6, 0xF016); + rtl_mac_ocp_write(hw, 0xF8F8, 0x1D80); + rtl_mac_ocp_write(hw, 0xF8FA, 0x8DF4); + rtl_mac_ocp_write(hw, 0xF8FC, 0x74F8); + rtl_mac_ocp_write(hw, 0xF8FE, 0x4843); + rtl_mac_ocp_write(hw, 0xF900, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF902, 0x74F8); + rtl_mac_ocp_write(hw, 0xF904, 0x74F8); + rtl_mac_ocp_write(hw, 0xF906, 0x7444); + rtl_mac_ocp_write(hw, 0xF908, 0x48C8); + rtl_mac_ocp_write(hw, 0xF90A, 0x48C9); + rtl_mac_ocp_write(hw, 0xF90C, 0x48CA); + rtl_mac_ocp_write(hw, 0xF90E, 0x9C44); + rtl_mac_ocp_write(hw, 0xF910, 0x74F8); + rtl_mac_ocp_write(hw, 0xF912, 0x4844); + rtl_mac_ocp_write(hw, 0xF914, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF916, 0x1E01); + rtl_mac_ocp_write(hw, 0xF918, 0xE8DB); + rtl_mac_ocp_write(hw, 0xF91A, 0x7420); + rtl_mac_ocp_write(hw, 0xF91C, 0x48C1); + rtl_mac_ocp_write(hw, 0xF91E, 0x9C20); + rtl_mac_ocp_write(hw, 0xF920, 0xE0D5); + rtl_mac_ocp_write(hw, 0xF922, 0x49E6); + rtl_mac_ocp_write(hw, 0xF924, 0xF02A); + rtl_mac_ocp_write(hw, 0xF926, 0x1D40); + rtl_mac_ocp_write(hw, 0xF928, 0x8DF4); + rtl_mac_ocp_write(hw, 0xF92A, 0x74FC); + rtl_mac_ocp_write(hw, 0xF92C, 0x49C0); + rtl_mac_ocp_write(hw, 0xF92E, 0xF124); + rtl_mac_ocp_write(hw, 0xF930, 0x49C1); + rtl_mac_ocp_write(hw, 0xF932, 0xF122); + rtl_mac_ocp_write(hw, 0xF934, 0x74F8); + rtl_mac_ocp_write(hw, 0xF936, 0x49C0); + rtl_mac_ocp_write(hw, 0xF938, 0xF01F); + rtl_mac_ocp_write(hw, 0xF93A, 0xE8D3); + rtl_mac_ocp_write(hw, 0xF93C, 0x48C4); + rtl_mac_ocp_write(hw, 0xF93E, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF940, 0x1E00); + rtl_mac_ocp_write(hw, 0xF942, 0xE8C6); + rtl_mac_ocp_write(hw, 0xF944, 0xC5B1); + rtl_mac_ocp_write(hw, 0xF946, 0x74A0); + rtl_mac_ocp_write(hw, 0xF948, 0x49C3); + rtl_mac_ocp_write(hw, 0xF94A, 0xF016); + rtl_mac_ocp_write(hw, 0xF94C, 0xC5AF); + rtl_mac_ocp_write(hw, 0xF94E, 0x74A4); + rtl_mac_ocp_write(hw, 0xF950, 0x49C2); + rtl_mac_ocp_write(hw, 0xF952, 0xF005); + rtl_mac_ocp_write(hw, 0xF954, 0xC5AA); + rtl_mac_ocp_write(hw, 0xF956, 0x74B2); + rtl_mac_ocp_write(hw, 0xF958, 0x49C9); + rtl_mac_ocp_write(hw, 0xF95A, 0xF10E); + rtl_mac_ocp_write(hw, 0xF95C, 0xC5A6); + rtl_mac_ocp_write(hw, 0xF95E, 0x74A8); + rtl_mac_ocp_write(hw, 0xF960, 0x4845); + rtl_mac_ocp_write(hw, 0xF962, 0x4846); + rtl_mac_ocp_write(hw, 0xF964, 0x4847); + rtl_mac_ocp_write(hw, 0xF966, 0x4848); + rtl_mac_ocp_write(hw, 0xF968, 0x9CA8); + rtl_mac_ocp_write(hw, 0xF96A, 0x74B2); + rtl_mac_ocp_write(hw, 0xF96C, 0x4849); + rtl_mac_ocp_write(hw, 0xF96E, 0x9CB2); + rtl_mac_ocp_write(hw, 0xF970, 0x74A0); + rtl_mac_ocp_write(hw, 0xF972, 0x484F); + rtl_mac_ocp_write(hw, 0xF974, 0x9CA0); + rtl_mac_ocp_write(hw, 0xF976, 0xE0AA); + rtl_mac_ocp_write(hw, 0xF978, 0x49E4); + rtl_mac_ocp_write(hw, 0xF97A, 0xF018); + rtl_mac_ocp_write(hw, 0xF97C, 0x1D10); + rtl_mac_ocp_write(hw, 0xF97E, 0x8DF4); + rtl_mac_ocp_write(hw, 0xF980, 0x74F8); + rtl_mac_ocp_write(hw, 0xF982, 0x74F8); + rtl_mac_ocp_write(hw, 0xF984, 0x74F8); + rtl_mac_ocp_write(hw, 0xF986, 0x4843); + rtl_mac_ocp_write(hw, 0xF988, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF98A, 0x74F8); + rtl_mac_ocp_write(hw, 0xF98C, 0x74F8); + rtl_mac_ocp_write(hw, 0xF98E, 0x74F8); + rtl_mac_ocp_write(hw, 0xF990, 0x4844); + rtl_mac_ocp_write(hw, 0xF992, 0x4842); + rtl_mac_ocp_write(hw, 0xF994, 0x4841); + rtl_mac_ocp_write(hw, 0xF996, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF998, 0x1E01); + rtl_mac_ocp_write(hw, 0xF99A, 0xE89A); + rtl_mac_ocp_write(hw, 0xF99C, 0x7420); + rtl_mac_ocp_write(hw, 0xF99E, 0x4841); + rtl_mac_ocp_write(hw, 0xF9A0, 0x9C20); + rtl_mac_ocp_write(hw, 0xF9A2, 0x7444); + rtl_mac_ocp_write(hw, 0xF9A4, 0x4848); + rtl_mac_ocp_write(hw, 0xF9A6, 0x9C44); + rtl_mac_ocp_write(hw, 0xF9A8, 0xE091); + rtl_mac_ocp_write(hw, 0xF9AA, 0x49E5); + rtl_mac_ocp_write(hw, 0xF9AC, 0xF03E); + rtl_mac_ocp_write(hw, 0xF9AE, 0x1D20); + rtl_mac_ocp_write(hw, 0xF9B0, 0x8DF4); + rtl_mac_ocp_write(hw, 0xF9B2, 0x74F8); + rtl_mac_ocp_write(hw, 0xF9B4, 0x48C2); + rtl_mac_ocp_write(hw, 0xF9B6, 0x4841); + rtl_mac_ocp_write(hw, 0xF9B8, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF9BA, 0x1E01); + rtl_mac_ocp_write(hw, 0xF9BC, 0x7444); + rtl_mac_ocp_write(hw, 0xF9BE, 0x49CA); + rtl_mac_ocp_write(hw, 0xF9C0, 0xF103); + rtl_mac_ocp_write(hw, 0xF9C2, 0x49C2); + rtl_mac_ocp_write(hw, 0xF9C4, 0xF00C); + rtl_mac_ocp_write(hw, 0xF9C6, 0x49C1); + rtl_mac_ocp_write(hw, 0xF9C8, 0xF004); + rtl_mac_ocp_write(hw, 0xF9CA, 0x6447); + rtl_mac_ocp_write(hw, 0xF9CC, 0x2244); + rtl_mac_ocp_write(hw, 0xF9CE, 0xE002); + rtl_mac_ocp_write(hw, 0xF9D0, 0x1C01); + rtl_mac_ocp_write(hw, 0xF9D2, 0x9C62); + rtl_mac_ocp_write(hw, 0xF9D4, 0x1C11); + rtl_mac_ocp_write(hw, 0xF9D6, 0x8C60); + rtl_mac_ocp_write(hw, 0xF9D8, 0x1C00); + rtl_mac_ocp_write(hw, 0xF9DA, 0x9CF6); + rtl_mac_ocp_write(hw, 0xF9DC, 0x7444); + rtl_mac_ocp_write(hw, 0xF9DE, 0x49C8); + rtl_mac_ocp_write(hw, 0xF9E0, 0xF01D); + rtl_mac_ocp_write(hw, 0xF9E2, 0x74FC); + rtl_mac_ocp_write(hw, 0xF9E4, 0x49C0); + rtl_mac_ocp_write(hw, 0xF9E6, 0xF11A); + rtl_mac_ocp_write(hw, 0xF9E8, 0x49C1); + rtl_mac_ocp_write(hw, 0xF9EA, 0xF118); + rtl_mac_ocp_write(hw, 0xF9EC, 0x74F8); + rtl_mac_ocp_write(hw, 0xF9EE, 0x49C0); + rtl_mac_ocp_write(hw, 0xF9F0, 0xF015); + rtl_mac_ocp_write(hw, 0xF9F2, 0x49C6); + rtl_mac_ocp_write(hw, 0xF9F4, 0xF113); + rtl_mac_ocp_write(hw, 0xF9F6, 0xE875); + rtl_mac_ocp_write(hw, 0xF9F8, 0x48C4); + rtl_mac_ocp_write(hw, 0xF9FA, 0x8CF8); + rtl_mac_ocp_write(hw, 0xF9FC, 0x7420); + rtl_mac_ocp_write(hw, 0xF9FE, 0x48C1); + rtl_mac_ocp_write(hw, 0xFA00, 0x9C20); + rtl_mac_ocp_write(hw, 0xFA02, 0xC50A); + rtl_mac_ocp_write(hw, 0xFA04, 0x74A2); + rtl_mac_ocp_write(hw, 0xFA06, 0x8CA5); + rtl_mac_ocp_write(hw, 0xFA08, 0x74A0); + rtl_mac_ocp_write(hw, 0xFA0A, 0xC505); + rtl_mac_ocp_write(hw, 0xFA0C, 0x9CA2); + rtl_mac_ocp_write(hw, 0xFA0E, 0x1C11); + rtl_mac_ocp_write(hw, 0xFA10, 0x9CA0); + rtl_mac_ocp_write(hw, 0xFA12, 0xE00A); + rtl_mac_ocp_write(hw, 0xFA14, 0xE434); + rtl_mac_ocp_write(hw, 0xFA16, 0xD3C0); + rtl_mac_ocp_write(hw, 0xFA18, 0xDC00); + rtl_mac_ocp_write(hw, 0xFA1A, 0x7444); + rtl_mac_ocp_write(hw, 0xFA1C, 0x49CA); + rtl_mac_ocp_write(hw, 0xFA1E, 0xF004); + rtl_mac_ocp_write(hw, 0xFA20, 0x48CA); + rtl_mac_ocp_write(hw, 0xFA22, 0x9C44); + rtl_mac_ocp_write(hw, 0xFA24, 0xE855); + rtl_mac_ocp_write(hw, 0xFA26, 0xE052); + rtl_mac_ocp_write(hw, 0xFA28, 0x49E8); + rtl_mac_ocp_write(hw, 0xFA2A, 0xF024); + rtl_mac_ocp_write(hw, 0xFA2C, 0x1D01); + rtl_mac_ocp_write(hw, 0xFA2E, 0x8DF5); + rtl_mac_ocp_write(hw, 0xFA30, 0x7440); + rtl_mac_ocp_write(hw, 0xFA32, 0x49C0); + rtl_mac_ocp_write(hw, 0xFA34, 0xF11E); + rtl_mac_ocp_write(hw, 0xFA36, 0x7444); + rtl_mac_ocp_write(hw, 0xFA38, 0x49C8); + rtl_mac_ocp_write(hw, 0xFA3A, 0xF01B); + rtl_mac_ocp_write(hw, 0xFA3C, 0x49CA); + rtl_mac_ocp_write(hw, 0xFA3E, 0xF119); + rtl_mac_ocp_write(hw, 0xFA40, 0xC5EC); + rtl_mac_ocp_write(hw, 0xFA42, 0x76A4); + rtl_mac_ocp_write(hw, 0xFA44, 0x49E3); + rtl_mac_ocp_write(hw, 0xFA46, 0xF015); + rtl_mac_ocp_write(hw, 0xFA48, 0x49C0); + rtl_mac_ocp_write(hw, 0xFA4A, 0xF103); + rtl_mac_ocp_write(hw, 0xFA4C, 0x49C1); + rtl_mac_ocp_write(hw, 0xFA4E, 0xF011); + rtl_mac_ocp_write(hw, 0xFA50, 0x4849); + rtl_mac_ocp_write(hw, 0xFA52, 0x9C44); + rtl_mac_ocp_write(hw, 0xFA54, 0x1C00); + rtl_mac_ocp_write(hw, 0xFA56, 0x9CF6); + rtl_mac_ocp_write(hw, 0xFA58, 0x7444); + rtl_mac_ocp_write(hw, 0xFA5A, 0x49C1); + rtl_mac_ocp_write(hw, 0xFA5C, 0xF004); + rtl_mac_ocp_write(hw, 0xFA5E, 0x6446); + rtl_mac_ocp_write(hw, 0xFA60, 0x1E07); + rtl_mac_ocp_write(hw, 0xFA62, 0xE003); + rtl_mac_ocp_write(hw, 0xFA64, 0x1C01); + rtl_mac_ocp_write(hw, 0xFA66, 0x1E03); + rtl_mac_ocp_write(hw, 0xFA68, 0x9C62); + rtl_mac_ocp_write(hw, 0xFA6A, 0x1C11); + rtl_mac_ocp_write(hw, 0xFA6C, 0x8C60); + rtl_mac_ocp_write(hw, 0xFA6E, 0xE830); + rtl_mac_ocp_write(hw, 0xFA70, 0xE02D); + rtl_mac_ocp_write(hw, 0xFA72, 0x49E9); + rtl_mac_ocp_write(hw, 0xFA74, 0xF004); + rtl_mac_ocp_write(hw, 0xFA76, 0x1D02); + rtl_mac_ocp_write(hw, 0xFA78, 0x8DF5); + rtl_mac_ocp_write(hw, 0xFA7A, 0xE79C); + rtl_mac_ocp_write(hw, 0xFA7C, 0x49E3); + rtl_mac_ocp_write(hw, 0xFA7E, 0xF006); + rtl_mac_ocp_write(hw, 0xFA80, 0x1D08); + rtl_mac_ocp_write(hw, 0xFA82, 0x8DF4); + rtl_mac_ocp_write(hw, 0xFA84, 0x74F8); + rtl_mac_ocp_write(hw, 0xFA86, 0x74F8); + rtl_mac_ocp_write(hw, 0xFA88, 0xE73A); + rtl_mac_ocp_write(hw, 0xFA8A, 0x49E1); + rtl_mac_ocp_write(hw, 0xFA8C, 0xF007); + rtl_mac_ocp_write(hw, 0xFA8E, 0x1D02); + rtl_mac_ocp_write(hw, 0xFA90, 0x8DF4); + rtl_mac_ocp_write(hw, 0xFA92, 0x1E01); + rtl_mac_ocp_write(hw, 0xFA94, 0xE7A7); + rtl_mac_ocp_write(hw, 0xFA96, 0xDE20); + rtl_mac_ocp_write(hw, 0xFA98, 0xE410); + rtl_mac_ocp_write(hw, 0xFA9A, 0x49E0); + rtl_mac_ocp_write(hw, 0xFA9C, 0xF017); + rtl_mac_ocp_write(hw, 0xFA9E, 0x1D01); + rtl_mac_ocp_write(hw, 0xFAA0, 0x8DF4); + rtl_mac_ocp_write(hw, 0xFAA2, 0xC5FA); + rtl_mac_ocp_write(hw, 0xFAA4, 0x1C00); + rtl_mac_ocp_write(hw, 0xFAA6, 0x8CA0); + rtl_mac_ocp_write(hw, 0xFAA8, 0x1C1B); + rtl_mac_ocp_write(hw, 0xFAAA, 0x9CA2); + rtl_mac_ocp_write(hw, 0xFAAC, 0x74A2); + rtl_mac_ocp_write(hw, 0xFAAE, 0x49CF); + rtl_mac_ocp_write(hw, 0xFAB0, 0xF0FE); + rtl_mac_ocp_write(hw, 0xFAB2, 0xC5F3); + rtl_mac_ocp_write(hw, 0xFAB4, 0x74A0); + rtl_mac_ocp_write(hw, 0xFAB6, 0x4849); + rtl_mac_ocp_write(hw, 0xFAB8, 0x9CA0); + rtl_mac_ocp_write(hw, 0xFABA, 0x74F8); + rtl_mac_ocp_write(hw, 0xFABC, 0x49C0); + rtl_mac_ocp_write(hw, 0xFABE, 0xF006); + rtl_mac_ocp_write(hw, 0xFAC0, 0x48C3); + rtl_mac_ocp_write(hw, 0xFAC2, 0x8CF8); + rtl_mac_ocp_write(hw, 0xFAC4, 0xE820); + rtl_mac_ocp_write(hw, 0xFAC6, 0x74F8); + rtl_mac_ocp_write(hw, 0xFAC8, 0x74F8); + rtl_mac_ocp_write(hw, 0xFACA, 0xC432); + rtl_mac_ocp_write(hw, 0xFACC, 0xBC00); + rtl_mac_ocp_write(hw, 0xFACE, 0xC5E4); + rtl_mac_ocp_write(hw, 0xFAD0, 0x74A2); + rtl_mac_ocp_write(hw, 0xFAD2, 0x49CE); + rtl_mac_ocp_write(hw, 0xFAD4, 0xF1FE); + rtl_mac_ocp_write(hw, 0xFAD6, 0x9EA0); + rtl_mac_ocp_write(hw, 0xFAD8, 0x1C1C); + rtl_mac_ocp_write(hw, 0xFADA, 0x484F); + rtl_mac_ocp_write(hw, 0xFADC, 0x9CA2); + rtl_mac_ocp_write(hw, 0xFADE, 0xFF80); + rtl_mac_ocp_write(hw, 0xFAE0, 0xB404); + rtl_mac_ocp_write(hw, 0xFAE2, 0xB405); + rtl_mac_ocp_write(hw, 0xFAE4, 0xC5D9); + rtl_mac_ocp_write(hw, 0xFAE6, 0x74A2); + rtl_mac_ocp_write(hw, 0xFAE8, 0x49CE); + rtl_mac_ocp_write(hw, 0xFAEA, 0xF1FE); + rtl_mac_ocp_write(hw, 0xFAEC, 0xC41F); + rtl_mac_ocp_write(hw, 0xFAEE, 0x9CA0); + rtl_mac_ocp_write(hw, 0xFAF0, 0xC41C); + rtl_mac_ocp_write(hw, 0xFAF2, 0x1C13); + rtl_mac_ocp_write(hw, 0xFAF4, 0x484F); + rtl_mac_ocp_write(hw, 0xFAF6, 0x9CA2); + rtl_mac_ocp_write(hw, 0xFAF8, 0x74A2); + rtl_mac_ocp_write(hw, 0xFAFA, 0x49CF); + rtl_mac_ocp_write(hw, 0xFAFC, 0xF1FE); + rtl_mac_ocp_write(hw, 0xFAFE, 0xB005); + rtl_mac_ocp_write(hw, 0xFB00, 0xB004); + rtl_mac_ocp_write(hw, 0xFB02, 0xFF80); + rtl_mac_ocp_write(hw, 0xFB04, 0xB404); + rtl_mac_ocp_write(hw, 0xFB06, 0xB405); + rtl_mac_ocp_write(hw, 0xFB08, 0xC5C7); + rtl_mac_ocp_write(hw, 0xFB0A, 0x74A2); + rtl_mac_ocp_write(hw, 0xFB0C, 0x49CE); + rtl_mac_ocp_write(hw, 0xFB0E, 0xF1FE); + rtl_mac_ocp_write(hw, 0xFB10, 0xC40E); + rtl_mac_ocp_write(hw, 0xFB12, 0x9CA0); + rtl_mac_ocp_write(hw, 0xFB14, 0xC40A); + rtl_mac_ocp_write(hw, 0xFB16, 0x1C13); + rtl_mac_ocp_write(hw, 0xFB18, 0x484F); + rtl_mac_ocp_write(hw, 0xFB1A, 0x9CA2); + rtl_mac_ocp_write(hw, 0xFB1C, 0x74A2); + rtl_mac_ocp_write(hw, 0xFB1E, 0x49CF); + rtl_mac_ocp_write(hw, 0xFB20, 0xF1FE); + rtl_mac_ocp_write(hw, 0xFB22, 0xB005); + rtl_mac_ocp_write(hw, 0xFB24, 0xB004); + rtl_mac_ocp_write(hw, 0xFB26, 0xFF80); + rtl_mac_ocp_write(hw, 0xFB28, 0x0000); + rtl_mac_ocp_write(hw, 0xFB2A, 0x0481); + rtl_mac_ocp_write(hw, 0xFB2C, 0x0C81); + rtl_mac_ocp_write(hw, 0xFB2E, 0x0AE0); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x0000); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0000); + rtl_mac_ocp_write(hw, 0xFC2C, 0x0297); + rtl_mac_ocp_write(hw, 0xFC2E, 0x0000); + rtl_mac_ocp_write(hw, 0xFC30, 0x00A9); + rtl_mac_ocp_write(hw, 0xFC32, 0x012D); + rtl_mac_ocp_write(hw, 0xFC34, 0x0000); + rtl_mac_ocp_write(hw, 0xFC36, 0x08DF); +} + +/* ------------------------------------PHY 8168G------------------------------------- */ + +static void +rtl8168_set_phy_mcu_8168g_1(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x2300); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0210); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0290); + rtl_mdio_write(hw, 0x13, 0xA012); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA014); + rtl_mdio_write(hw, 0x14, 0x2c04); + rtl_mdio_write(hw, 0x14, 0x2c0c); + rtl_mdio_write(hw, 0x14, 0x2c6c); + rtl_mdio_write(hw, 0x14, 0x2d0d); + rtl_mdio_write(hw, 0x14, 0x31ce); + rtl_mdio_write(hw, 0x14, 0x506d); + rtl_mdio_write(hw, 0x14, 0xd708); + rtl_mdio_write(hw, 0x14, 0x3108); + rtl_mdio_write(hw, 0x14, 0x106d); + rtl_mdio_write(hw, 0x14, 0x1560); + rtl_mdio_write(hw, 0x14, 0x15a9); + rtl_mdio_write(hw, 0x14, 0x206e); + rtl_mdio_write(hw, 0x14, 0x175b); + rtl_mdio_write(hw, 0x14, 0x6062); + rtl_mdio_write(hw, 0x14, 0xd700); + rtl_mdio_write(hw, 0x14, 0x5fae); + rtl_mdio_write(hw, 0x14, 0xd708); + rtl_mdio_write(hw, 0x14, 0x3107); + rtl_mdio_write(hw, 0x14, 0x4c1e); + rtl_mdio_write(hw, 0x14, 0x4169); + rtl_mdio_write(hw, 0x14, 0x316a); + rtl_mdio_write(hw, 0x14, 0x0c19); + rtl_mdio_write(hw, 0x14, 0x31aa); + rtl_mdio_write(hw, 0x14, 0x0c19); + rtl_mdio_write(hw, 0x14, 0x2c1b); + rtl_mdio_write(hw, 0x14, 0x5e62); + rtl_mdio_write(hw, 0x14, 0x26b5); + rtl_mdio_write(hw, 0x14, 0x31ab); + rtl_mdio_write(hw, 0x14, 0x5c1e); + rtl_mdio_write(hw, 0x14, 0x2c0c); + rtl_mdio_write(hw, 0x14, 0xc040); + rtl_mdio_write(hw, 0x14, 0x8808); + rtl_mdio_write(hw, 0x14, 0xc520); + rtl_mdio_write(hw, 0x14, 0xc421); + rtl_mdio_write(hw, 0x14, 0xd05a); + rtl_mdio_write(hw, 0x14, 0xd19a); + rtl_mdio_write(hw, 0x14, 0xd709); + rtl_mdio_write(hw, 0x14, 0x608f); + rtl_mdio_write(hw, 0x14, 0xd06b); + rtl_mdio_write(hw, 0x14, 0xd18a); + rtl_mdio_write(hw, 0x14, 0x2c2c); + rtl_mdio_write(hw, 0x14, 0xd0be); + rtl_mdio_write(hw, 0x14, 0xd188); + rtl_mdio_write(hw, 0x14, 0x2c2c); + rtl_mdio_write(hw, 0x14, 0xd708); + rtl_mdio_write(hw, 0x14, 0x4072); + rtl_mdio_write(hw, 0x14, 0xc104); + rtl_mdio_write(hw, 0x14, 0x2c3e); + rtl_mdio_write(hw, 0x14, 0x4076); + rtl_mdio_write(hw, 0x14, 0xc110); + rtl_mdio_write(hw, 0x14, 0x2c3e); + rtl_mdio_write(hw, 0x14, 0x4071); + rtl_mdio_write(hw, 0x14, 0xc102); + rtl_mdio_write(hw, 0x14, 0x2c3e); + rtl_mdio_write(hw, 0x14, 0x4070); + rtl_mdio_write(hw, 0x14, 0xc101); + rtl_mdio_write(hw, 0x14, 0x2c3e); + rtl_mdio_write(hw, 0x14, 0x175b); + rtl_mdio_write(hw, 0x14, 0xd709); + rtl_mdio_write(hw, 0x14, 0x3390); + rtl_mdio_write(hw, 0x14, 0x5c39); + rtl_mdio_write(hw, 0x14, 0x2c4e); + rtl_mdio_write(hw, 0x14, 0x175b); + rtl_mdio_write(hw, 0x14, 0xd708); + rtl_mdio_write(hw, 0x14, 0x6193); + rtl_mdio_write(hw, 0x14, 0xd709); + rtl_mdio_write(hw, 0x14, 0x5f9d); + rtl_mdio_write(hw, 0x14, 0x408b); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x6042); + rtl_mdio_write(hw, 0x14, 0xb401); + rtl_mdio_write(hw, 0x14, 0x175b); + rtl_mdio_write(hw, 0x14, 0xd708); + rtl_mdio_write(hw, 0x14, 0x6073); + rtl_mdio_write(hw, 0x14, 0x5fbc); + rtl_mdio_write(hw, 0x14, 0x2c4d); + rtl_mdio_write(hw, 0x14, 0x26ed); + rtl_mdio_write(hw, 0x14, 0xb280); + rtl_mdio_write(hw, 0x14, 0xa841); + rtl_mdio_write(hw, 0x14, 0x9420); + rtl_mdio_write(hw, 0x14, 0x8710); + rtl_mdio_write(hw, 0x14, 0xd709); + rtl_mdio_write(hw, 0x14, 0x42ec); + rtl_mdio_write(hw, 0x14, 0x606d); + rtl_mdio_write(hw, 0x14, 0xd207); + rtl_mdio_write(hw, 0x14, 0x2c57); + rtl_mdio_write(hw, 0x14, 0xd203); + rtl_mdio_write(hw, 0x14, 0x33ff); + rtl_mdio_write(hw, 0x14, 0x563b); + rtl_mdio_write(hw, 0x14, 0x3275); + rtl_mdio_write(hw, 0x14, 0x7c5e); + rtl_mdio_write(hw, 0x14, 0xb240); + rtl_mdio_write(hw, 0x14, 0xb402); + rtl_mdio_write(hw, 0x14, 0x263b); + rtl_mdio_write(hw, 0x14, 0x6096); + rtl_mdio_write(hw, 0x14, 0xb240); + rtl_mdio_write(hw, 0x14, 0xb406); + rtl_mdio_write(hw, 0x14, 0x263b); + rtl_mdio_write(hw, 0x14, 0x31d7); + rtl_mdio_write(hw, 0x14, 0x7c67); + rtl_mdio_write(hw, 0x14, 0xb240); + rtl_mdio_write(hw, 0x14, 0xb40e); + rtl_mdio_write(hw, 0x14, 0x263b); + rtl_mdio_write(hw, 0x14, 0xb410); + rtl_mdio_write(hw, 0x14, 0x8802); + rtl_mdio_write(hw, 0x14, 0xb240); + rtl_mdio_write(hw, 0x14, 0x940e); + rtl_mdio_write(hw, 0x14, 0x263b); + rtl_mdio_write(hw, 0x14, 0xba04); + rtl_mdio_write(hw, 0x14, 0x1cd6); + rtl_mdio_write(hw, 0x14, 0xa902); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x4045); + rtl_mdio_write(hw, 0x14, 0xa980); + rtl_mdio_write(hw, 0x14, 0x3003); + rtl_mdio_write(hw, 0x14, 0x59b1); + rtl_mdio_write(hw, 0x14, 0xa540); + rtl_mdio_write(hw, 0x14, 0xa601); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4043); + rtl_mdio_write(hw, 0x14, 0xa910); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x60a0); + rtl_mdio_write(hw, 0x14, 0xca33); + rtl_mdio_write(hw, 0x14, 0xcb33); + rtl_mdio_write(hw, 0x14, 0xa941); + rtl_mdio_write(hw, 0x14, 0x2c82); + rtl_mdio_write(hw, 0x14, 0xcaff); + rtl_mdio_write(hw, 0x14, 0xcbff); + rtl_mdio_write(hw, 0x14, 0xa921); + rtl_mdio_write(hw, 0x14, 0xce02); + rtl_mdio_write(hw, 0x14, 0xe070); + rtl_mdio_write(hw, 0x14, 0x0f10); + rtl_mdio_write(hw, 0x14, 0xaf01); + rtl_mdio_write(hw, 0x14, 0x8f01); + rtl_mdio_write(hw, 0x14, 0x1766); + rtl_mdio_write(hw, 0x14, 0x8e02); + rtl_mdio_write(hw, 0x14, 0x1787); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x609c); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fa4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0x1ce9); + rtl_mdio_write(hw, 0x14, 0xce04); + rtl_mdio_write(hw, 0x14, 0xe070); + rtl_mdio_write(hw, 0x14, 0x0f20); + rtl_mdio_write(hw, 0x14, 0xaf01); + rtl_mdio_write(hw, 0x14, 0x8f01); + rtl_mdio_write(hw, 0x14, 0x1766); + rtl_mdio_write(hw, 0x14, 0x8e04); + rtl_mdio_write(hw, 0x14, 0x6044); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0xa520); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4043); + rtl_mdio_write(hw, 0x14, 0x2cc1); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0501); + rtl_mdio_write(hw, 0x14, 0x1cef); + rtl_mdio_write(hw, 0x14, 0xb801); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x4060); + rtl_mdio_write(hw, 0x14, 0x7fc4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0x1cf5); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0502); + rtl_mdio_write(hw, 0x14, 0x1cef); + rtl_mdio_write(hw, 0x14, 0xb802); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x4061); + rtl_mdio_write(hw, 0x14, 0x7fc4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0x1cf5); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0504); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6099); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fa4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0xc17f); + rtl_mdio_write(hw, 0x14, 0xc200); + rtl_mdio_write(hw, 0x14, 0xc43f); + rtl_mdio_write(hw, 0x14, 0xcc03); + rtl_mdio_write(hw, 0x14, 0xa701); + rtl_mdio_write(hw, 0x14, 0xa510); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4018); + rtl_mdio_write(hw, 0x14, 0x9910); + rtl_mdio_write(hw, 0x14, 0x8510); + rtl_mdio_write(hw, 0x14, 0x2860); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0504); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6099); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fa4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0xa608); + rtl_mdio_write(hw, 0x14, 0xc17d); + rtl_mdio_write(hw, 0x14, 0xc200); + rtl_mdio_write(hw, 0x14, 0xc43f); + rtl_mdio_write(hw, 0x14, 0xcc03); + rtl_mdio_write(hw, 0x14, 0xa701); + rtl_mdio_write(hw, 0x14, 0xa510); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4018); + rtl_mdio_write(hw, 0x14, 0x9910); + rtl_mdio_write(hw, 0x14, 0x8510); + rtl_mdio_write(hw, 0x14, 0x2926); + rtl_mdio_write(hw, 0x14, 0x1792); + rtl_mdio_write(hw, 0x14, 0x27db); + rtl_mdio_write(hw, 0x14, 0xc000); + rtl_mdio_write(hw, 0x14, 0xc100); + rtl_mdio_write(hw, 0x14, 0xc200); + rtl_mdio_write(hw, 0x14, 0xc300); + rtl_mdio_write(hw, 0x14, 0xc400); + rtl_mdio_write(hw, 0x14, 0xc500); + rtl_mdio_write(hw, 0x14, 0xc600); + rtl_mdio_write(hw, 0x14, 0xc7c1); + rtl_mdio_write(hw, 0x14, 0xc800); + rtl_mdio_write(hw, 0x14, 0xcc00); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xca0f); + rtl_mdio_write(hw, 0x14, 0xcbff); + rtl_mdio_write(hw, 0x14, 0xa901); + rtl_mdio_write(hw, 0x14, 0x8902); + rtl_mdio_write(hw, 0x14, 0xc900); + rtl_mdio_write(hw, 0x14, 0xca00); + rtl_mdio_write(hw, 0x14, 0xcb00); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xb804); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x6044); + rtl_mdio_write(hw, 0x14, 0x9804); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6099); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fa4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xa510); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6098); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fa4); + rtl_mdio_write(hw, 0x14, 0x2cd4); + rtl_mdio_write(hw, 0x14, 0x8510); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x3003); + rtl_mdio_write(hw, 0x14, 0x1d01); + rtl_mdio_write(hw, 0x14, 0x2d0b); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x60be); + rtl_mdio_write(hw, 0x14, 0xe060); + rtl_mdio_write(hw, 0x14, 0x0920); + rtl_mdio_write(hw, 0x14, 0x1cd6); + rtl_mdio_write(hw, 0x14, 0x2c89); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x3063); + rtl_mdio_write(hw, 0x14, 0x1948); + rtl_mdio_write(hw, 0x14, 0x288a); + rtl_mdio_write(hw, 0x14, 0x1cd6); + rtl_mdio_write(hw, 0x14, 0x29bd); + rtl_mdio_write(hw, 0x14, 0xa802); + rtl_mdio_write(hw, 0x14, 0xa303); + rtl_mdio_write(hw, 0x14, 0x843f); + rtl_mdio_write(hw, 0x14, 0x81ff); + rtl_mdio_write(hw, 0x14, 0x8208); + rtl_mdio_write(hw, 0x14, 0xa201); + rtl_mdio_write(hw, 0x14, 0xc001); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x30a0); + rtl_mdio_write(hw, 0x14, 0x0d1c); + rtl_mdio_write(hw, 0x14, 0x30a0); + rtl_mdio_write(hw, 0x14, 0x3d13); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7f4c); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0xe003); + rtl_mdio_write(hw, 0x14, 0x0202); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6090); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fac); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0xa20c); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6091); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fac); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0x820e); + rtl_mdio_write(hw, 0x14, 0xa3e0); + rtl_mdio_write(hw, 0x14, 0xa520); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x609d); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fac); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0x8520); + rtl_mdio_write(hw, 0x14, 0x6703); + rtl_mdio_write(hw, 0x14, 0x2d34); + rtl_mdio_write(hw, 0x14, 0xa13e); + rtl_mdio_write(hw, 0x14, 0xc001); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x6046); + rtl_mdio_write(hw, 0x14, 0x2d0d); + rtl_mdio_write(hw, 0x14, 0xa43f); + rtl_mdio_write(hw, 0x14, 0xa101); + rtl_mdio_write(hw, 0x14, 0xc020); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x3121); + rtl_mdio_write(hw, 0x14, 0x0d45); + rtl_mdio_write(hw, 0x14, 0x30c0); + rtl_mdio_write(hw, 0x14, 0x3d0d); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7f4c); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0xa540); + rtl_mdio_write(hw, 0x14, 0xc001); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4001); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0501); + rtl_mdio_write(hw, 0x14, 0x1dac); + rtl_mdio_write(hw, 0x14, 0xc1c4); + rtl_mdio_write(hw, 0x14, 0xa268); + rtl_mdio_write(hw, 0x14, 0xa303); + rtl_mdio_write(hw, 0x14, 0x8420); + rtl_mdio_write(hw, 0x14, 0xe00f); + rtl_mdio_write(hw, 0x14, 0x0502); + rtl_mdio_write(hw, 0x14, 0x1dac); + rtl_mdio_write(hw, 0x14, 0xc002); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x8208); + rtl_mdio_write(hw, 0x14, 0x8410); + rtl_mdio_write(hw, 0x14, 0xa121); + rtl_mdio_write(hw, 0x14, 0xc002); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x8120); + rtl_mdio_write(hw, 0x14, 0x8180); + rtl_mdio_write(hw, 0x14, 0x1d97); + rtl_mdio_write(hw, 0x14, 0xa180); + rtl_mdio_write(hw, 0x14, 0xa13a); + rtl_mdio_write(hw, 0x14, 0x8240); + rtl_mdio_write(hw, 0x14, 0xa430); + rtl_mdio_write(hw, 0x14, 0xc010); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x30e1); + rtl_mdio_write(hw, 0x14, 0x0abc); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7f8c); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0xa480); + rtl_mdio_write(hw, 0x14, 0xa230); + rtl_mdio_write(hw, 0x14, 0xa303); + rtl_mdio_write(hw, 0x14, 0xc001); + rtl_mdio_write(hw, 0x14, 0xd70c); + rtl_mdio_write(hw, 0x14, 0x4124); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x6120); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x3128); + rtl_mdio_write(hw, 0x14, 0x3d76); + rtl_mdio_write(hw, 0x14, 0x2d70); + rtl_mdio_write(hw, 0x14, 0xa801); + rtl_mdio_write(hw, 0x14, 0x2d6c); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0xe018); + rtl_mdio_write(hw, 0x14, 0x0208); + rtl_mdio_write(hw, 0x14, 0xa1f8); + rtl_mdio_write(hw, 0x14, 0x8480); + rtl_mdio_write(hw, 0x14, 0xc004); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x6046); + rtl_mdio_write(hw, 0x14, 0x2d0d); + rtl_mdio_write(hw, 0x14, 0xa43f); + rtl_mdio_write(hw, 0x14, 0xa105); + rtl_mdio_write(hw, 0x14, 0x8228); + rtl_mdio_write(hw, 0x14, 0xc004); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x81bc); + rtl_mdio_write(hw, 0x14, 0xa220); + rtl_mdio_write(hw, 0x14, 0x1d97); + rtl_mdio_write(hw, 0x14, 0x8220); + rtl_mdio_write(hw, 0x14, 0xa1bc); + rtl_mdio_write(hw, 0x14, 0xc040); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x30e1); + rtl_mdio_write(hw, 0x14, 0x0abc); + rtl_mdio_write(hw, 0x14, 0x30e1); + rtl_mdio_write(hw, 0x14, 0x3d0d); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7f4c); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0xa802); + rtl_mdio_write(hw, 0x14, 0xd70c); + rtl_mdio_write(hw, 0x14, 0x4244); + rtl_mdio_write(hw, 0x14, 0xa301); + rtl_mdio_write(hw, 0x14, 0xc004); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x3128); + rtl_mdio_write(hw, 0x14, 0x3da5); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x5f80); + rtl_mdio_write(hw, 0x14, 0xd711); + rtl_mdio_write(hw, 0x14, 0x3109); + rtl_mdio_write(hw, 0x14, 0x3da7); + rtl_mdio_write(hw, 0x14, 0x2dab); + rtl_mdio_write(hw, 0x14, 0xa801); + rtl_mdio_write(hw, 0x14, 0x2d9a); + rtl_mdio_write(hw, 0x14, 0xa802); + rtl_mdio_write(hw, 0x14, 0xc004); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x4000); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x14, 0xa510); + rtl_mdio_write(hw, 0x14, 0xd710); + rtl_mdio_write(hw, 0x14, 0x609a); + rtl_mdio_write(hw, 0x14, 0xd71e); + rtl_mdio_write(hw, 0x14, 0x7fac); + rtl_mdio_write(hw, 0x14, 0x2ab6); + rtl_mdio_write(hw, 0x14, 0x8510); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x13, 0xA01A); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA006); + rtl_mdio_write(hw, 0x14, 0x0ad6); + rtl_mdio_write(hw, 0x13, 0xA004); + rtl_mdio_write(hw, 0x14, 0x07f5); + rtl_mdio_write(hw, 0x13, 0xA002); + rtl_mdio_write(hw, 0x14, 0x06a9); + rtl_mdio_write(hw, 0x13, 0xA000); + rtl_mdio_write(hw, 0x14, 0xf069); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0210); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x83a0); + rtl_mdio_write(hw, 0x14, 0xaf83); + rtl_mdio_write(hw, 0x14, 0xacaf); + rtl_mdio_write(hw, 0x14, 0x83b8); + rtl_mdio_write(hw, 0x14, 0xaf83); + rtl_mdio_write(hw, 0x14, 0xcdaf); + rtl_mdio_write(hw, 0x14, 0x83d3); + rtl_mdio_write(hw, 0x14, 0x0204); + rtl_mdio_write(hw, 0x14, 0x9a02); + rtl_mdio_write(hw, 0x14, 0x09a9); + rtl_mdio_write(hw, 0x14, 0x0284); + rtl_mdio_write(hw, 0x14, 0x61af); + rtl_mdio_write(hw, 0x14, 0x02fc); + rtl_mdio_write(hw, 0x14, 0xad20); + rtl_mdio_write(hw, 0x14, 0x0302); + rtl_mdio_write(hw, 0x14, 0x867c); + rtl_mdio_write(hw, 0x14, 0xad21); + rtl_mdio_write(hw, 0x14, 0x0302); + rtl_mdio_write(hw, 0x14, 0x85c9); + rtl_mdio_write(hw, 0x14, 0xad22); + rtl_mdio_write(hw, 0x14, 0x0302); + rtl_mdio_write(hw, 0x14, 0x1bc0); + rtl_mdio_write(hw, 0x14, 0xaf17); + rtl_mdio_write(hw, 0x14, 0xe302); + rtl_mdio_write(hw, 0x14, 0x8703); + rtl_mdio_write(hw, 0x14, 0xaf18); + rtl_mdio_write(hw, 0x14, 0x6201); + rtl_mdio_write(hw, 0x14, 0x06e0); + rtl_mdio_write(hw, 0x14, 0x8148); + rtl_mdio_write(hw, 0x14, 0xaf3c); + rtl_mdio_write(hw, 0x14, 0x69f8); + rtl_mdio_write(hw, 0x14, 0xf9fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0x10f7); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0x131f); + rtl_mdio_write(hw, 0x14, 0xd104); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0xf302); + rtl_mdio_write(hw, 0x14, 0x4259); + rtl_mdio_write(hw, 0x14, 0x0287); + rtl_mdio_write(hw, 0x14, 0x88bf); + rtl_mdio_write(hw, 0x14, 0x87cf); + rtl_mdio_write(hw, 0x14, 0xd7b8); + rtl_mdio_write(hw, 0x14, 0x22d0); + rtl_mdio_write(hw, 0x14, 0x0c02); + rtl_mdio_write(hw, 0x14, 0x4252); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xcda0); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xce8b); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xd1f5); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xd2a9); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xd30a); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xf010); + rtl_mdio_write(hw, 0x14, 0xee80); + rtl_mdio_write(hw, 0x14, 0xf38f); + rtl_mdio_write(hw, 0x14, 0xee81); + rtl_mdio_write(hw, 0x14, 0x011e); + rtl_mdio_write(hw, 0x14, 0xee81); + rtl_mdio_write(hw, 0x14, 0x0b4a); + rtl_mdio_write(hw, 0x14, 0xee81); + rtl_mdio_write(hw, 0x14, 0x0c7c); + rtl_mdio_write(hw, 0x14, 0xee81); + rtl_mdio_write(hw, 0x14, 0x127f); + rtl_mdio_write(hw, 0x14, 0xd100); + rtl_mdio_write(hw, 0x14, 0x0210); + rtl_mdio_write(hw, 0x14, 0xb5ee); + rtl_mdio_write(hw, 0x14, 0x8088); + rtl_mdio_write(hw, 0x14, 0xa4ee); + rtl_mdio_write(hw, 0x14, 0x8089); + rtl_mdio_write(hw, 0x14, 0x44ee); + rtl_mdio_write(hw, 0x14, 0x809a); + rtl_mdio_write(hw, 0x14, 0xa4ee); + rtl_mdio_write(hw, 0x14, 0x809b); + rtl_mdio_write(hw, 0x14, 0x44ee); + rtl_mdio_write(hw, 0x14, 0x809c); + rtl_mdio_write(hw, 0x14, 0xa7ee); + rtl_mdio_write(hw, 0x14, 0x80a5); + rtl_mdio_write(hw, 0x14, 0xa7d2); + rtl_mdio_write(hw, 0x14, 0x0002); + rtl_mdio_write(hw, 0x14, 0x0e66); + rtl_mdio_write(hw, 0x14, 0x0285); + rtl_mdio_write(hw, 0x14, 0xc0ee); + rtl_mdio_write(hw, 0x14, 0x87fc); + rtl_mdio_write(hw, 0x14, 0x00e0); + rtl_mdio_write(hw, 0x14, 0x8245); + rtl_mdio_write(hw, 0x14, 0xf622); + rtl_mdio_write(hw, 0x14, 0xe482); + rtl_mdio_write(hw, 0x14, 0x45ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfdfc); + rtl_mdio_write(hw, 0x14, 0x0402); + rtl_mdio_write(hw, 0x14, 0x847a); + rtl_mdio_write(hw, 0x14, 0x0284); + rtl_mdio_write(hw, 0x14, 0xb302); + rtl_mdio_write(hw, 0x14, 0x0cab); + rtl_mdio_write(hw, 0x14, 0x020c); + rtl_mdio_write(hw, 0x14, 0xc402); + rtl_mdio_write(hw, 0x14, 0x0cef); + rtl_mdio_write(hw, 0x14, 0x020d); + rtl_mdio_write(hw, 0x14, 0x0802); + rtl_mdio_write(hw, 0x14, 0x0d33); + rtl_mdio_write(hw, 0x14, 0x020c); + rtl_mdio_write(hw, 0x14, 0x3d04); + rtl_mdio_write(hw, 0x14, 0xf8fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe182); + rtl_mdio_write(hw, 0x14, 0x2fac); + rtl_mdio_write(hw, 0x14, 0x291a); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x24ac); + rtl_mdio_write(hw, 0x14, 0x2102); + rtl_mdio_write(hw, 0x14, 0xae22); + rtl_mdio_write(hw, 0x14, 0x0210); + rtl_mdio_write(hw, 0x14, 0x57f6); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8224); + rtl_mdio_write(hw, 0x14, 0xd101); + rtl_mdio_write(hw, 0x14, 0xbf44); + rtl_mdio_write(hw, 0x14, 0xd202); + rtl_mdio_write(hw, 0x14, 0x4259); + rtl_mdio_write(hw, 0x14, 0xae10); + rtl_mdio_write(hw, 0x14, 0x0212); + rtl_mdio_write(hw, 0x14, 0x4cf6); + rtl_mdio_write(hw, 0x14, 0x29e5); + rtl_mdio_write(hw, 0x14, 0x822f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x24f6); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8224); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xe182); + rtl_mdio_write(hw, 0x14, 0x2fac); + rtl_mdio_write(hw, 0x14, 0x2a18); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x24ac); + rtl_mdio_write(hw, 0x14, 0x2202); + rtl_mdio_write(hw, 0x14, 0xae26); + rtl_mdio_write(hw, 0x14, 0x0284); + rtl_mdio_write(hw, 0x14, 0xf802); + rtl_mdio_write(hw, 0x14, 0x8565); + rtl_mdio_write(hw, 0x14, 0xd101); + rtl_mdio_write(hw, 0x14, 0xbf44); + rtl_mdio_write(hw, 0x14, 0xd502); + rtl_mdio_write(hw, 0x14, 0x4259); + rtl_mdio_write(hw, 0x14, 0xae0e); + rtl_mdio_write(hw, 0x14, 0x0284); + rtl_mdio_write(hw, 0x14, 0xea02); + rtl_mdio_write(hw, 0x14, 0x85a9); + rtl_mdio_write(hw, 0x14, 0xe182); + rtl_mdio_write(hw, 0x14, 0x2ff6); + rtl_mdio_write(hw, 0x14, 0x2ae5); + rtl_mdio_write(hw, 0x14, 0x822f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x24f6); + rtl_mdio_write(hw, 0x14, 0x22e4); + rtl_mdio_write(hw, 0x14, 0x8224); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf9e2); + rtl_mdio_write(hw, 0x14, 0x8011); + rtl_mdio_write(hw, 0x14, 0xad31); + rtl_mdio_write(hw, 0x14, 0x05d2); + rtl_mdio_write(hw, 0x14, 0x0002); + rtl_mdio_write(hw, 0x14, 0x0e66); + rtl_mdio_write(hw, 0x14, 0xfd04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69e0); + rtl_mdio_write(hw, 0x14, 0x8011); + rtl_mdio_write(hw, 0x14, 0xad21); + rtl_mdio_write(hw, 0x14, 0x5cbf); + rtl_mdio_write(hw, 0x14, 0x43be); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97ac); + rtl_mdio_write(hw, 0x14, 0x281b); + rtl_mdio_write(hw, 0x14, 0xbf43); + rtl_mdio_write(hw, 0x14, 0xc102); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0xac28); + rtl_mdio_write(hw, 0x14, 0x12bf); + rtl_mdio_write(hw, 0x14, 0x43c7); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97ac); + rtl_mdio_write(hw, 0x14, 0x2804); + rtl_mdio_write(hw, 0x14, 0xd300); + rtl_mdio_write(hw, 0x14, 0xae07); + rtl_mdio_write(hw, 0x14, 0xd306); + rtl_mdio_write(hw, 0x14, 0xaf85); + rtl_mdio_write(hw, 0x14, 0x56d3); + rtl_mdio_write(hw, 0x14, 0x03e0); + rtl_mdio_write(hw, 0x14, 0x8011); + rtl_mdio_write(hw, 0x14, 0xad26); + rtl_mdio_write(hw, 0x14, 0x25bf); + rtl_mdio_write(hw, 0x14, 0x4559); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97e2); + rtl_mdio_write(hw, 0x14, 0x8073); + rtl_mdio_write(hw, 0x14, 0x0d21); + rtl_mdio_write(hw, 0x14, 0xf637); + rtl_mdio_write(hw, 0x14, 0x0d11); + rtl_mdio_write(hw, 0x14, 0xf62f); + rtl_mdio_write(hw, 0x14, 0x1b21); + rtl_mdio_write(hw, 0x14, 0xaa02); + rtl_mdio_write(hw, 0x14, 0xae10); + rtl_mdio_write(hw, 0x14, 0xe280); + rtl_mdio_write(hw, 0x14, 0x740d); + rtl_mdio_write(hw, 0x14, 0x21f6); + rtl_mdio_write(hw, 0x14, 0x371b); + rtl_mdio_write(hw, 0x14, 0x21aa); + rtl_mdio_write(hw, 0x14, 0x0313); + rtl_mdio_write(hw, 0x14, 0xae02); + rtl_mdio_write(hw, 0x14, 0x2b02); + rtl_mdio_write(hw, 0x14, 0x020e); + rtl_mdio_write(hw, 0x14, 0x5102); + rtl_mdio_write(hw, 0x14, 0x0e66); + rtl_mdio_write(hw, 0x14, 0x020f); + rtl_mdio_write(hw, 0x14, 0xa3ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfdfc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xf9fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe080); + rtl_mdio_write(hw, 0x14, 0x12ad); + rtl_mdio_write(hw, 0x14, 0x2733); + rtl_mdio_write(hw, 0x14, 0xbf43); + rtl_mdio_write(hw, 0x14, 0xbe02); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0xac28); + rtl_mdio_write(hw, 0x14, 0x09bf); + rtl_mdio_write(hw, 0x14, 0x43c1); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97ad); + rtl_mdio_write(hw, 0x14, 0x2821); + rtl_mdio_write(hw, 0x14, 0xbf45); + rtl_mdio_write(hw, 0x14, 0x5902); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0xe387); + rtl_mdio_write(hw, 0x14, 0xffd2); + rtl_mdio_write(hw, 0x14, 0x001b); + rtl_mdio_write(hw, 0x14, 0x45ac); + rtl_mdio_write(hw, 0x14, 0x2711); + rtl_mdio_write(hw, 0x14, 0xe187); + rtl_mdio_write(hw, 0x14, 0xfebf); + rtl_mdio_write(hw, 0x14, 0x87e4); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x590d); + rtl_mdio_write(hw, 0x14, 0x11bf); + rtl_mdio_write(hw, 0x14, 0x87e7); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfdfc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69d1); + rtl_mdio_write(hw, 0x14, 0x00bf); + rtl_mdio_write(hw, 0x14, 0x87e4); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59bf); + rtl_mdio_write(hw, 0x14, 0x87e7); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xff46); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xfe01); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69e0); + rtl_mdio_write(hw, 0x14, 0x8241); + rtl_mdio_write(hw, 0x14, 0xa000); + rtl_mdio_write(hw, 0x14, 0x0502); + rtl_mdio_write(hw, 0x14, 0x85eb); + rtl_mdio_write(hw, 0x14, 0xae0e); + rtl_mdio_write(hw, 0x14, 0xa001); + rtl_mdio_write(hw, 0x14, 0x0502); + rtl_mdio_write(hw, 0x14, 0x1a5a); + rtl_mdio_write(hw, 0x14, 0xae06); + rtl_mdio_write(hw, 0x14, 0xa002); + rtl_mdio_write(hw, 0x14, 0x0302); + rtl_mdio_write(hw, 0x14, 0x1ae6); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xf9fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x29f6); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8229); + rtl_mdio_write(hw, 0x14, 0xe080); + rtl_mdio_write(hw, 0x14, 0x10ac); + rtl_mdio_write(hw, 0x14, 0x2202); + rtl_mdio_write(hw, 0x14, 0xae76); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x27f7); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8227); + rtl_mdio_write(hw, 0x14, 0xbf43); + rtl_mdio_write(hw, 0x14, 0x1302); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0xef21); + rtl_mdio_write(hw, 0x14, 0xbf43); + rtl_mdio_write(hw, 0x14, 0x1602); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0x0c11); + rtl_mdio_write(hw, 0x14, 0x1e21); + rtl_mdio_write(hw, 0x14, 0xbf43); + rtl_mdio_write(hw, 0x14, 0x1902); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0x0c12); + rtl_mdio_write(hw, 0x14, 0x1e21); + rtl_mdio_write(hw, 0x14, 0xe682); + rtl_mdio_write(hw, 0x14, 0x43a2); + rtl_mdio_write(hw, 0x14, 0x000a); + rtl_mdio_write(hw, 0x14, 0xe182); + rtl_mdio_write(hw, 0x14, 0x27f6); + rtl_mdio_write(hw, 0x14, 0x29e5); + rtl_mdio_write(hw, 0x14, 0x8227); + rtl_mdio_write(hw, 0x14, 0xae42); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44f7); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x0246); + rtl_mdio_write(hw, 0x14, 0xaebf); + rtl_mdio_write(hw, 0x14, 0x4325); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97ef); + rtl_mdio_write(hw, 0x14, 0x21bf); + rtl_mdio_write(hw, 0x14, 0x431c); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x970c); + rtl_mdio_write(hw, 0x14, 0x121e); + rtl_mdio_write(hw, 0x14, 0x21bf); + rtl_mdio_write(hw, 0x14, 0x431f); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x970c); + rtl_mdio_write(hw, 0x14, 0x131e); + rtl_mdio_write(hw, 0x14, 0x21bf); + rtl_mdio_write(hw, 0x14, 0x4328); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x970c); + rtl_mdio_write(hw, 0x14, 0x141e); + rtl_mdio_write(hw, 0x14, 0x21bf); + rtl_mdio_write(hw, 0x14, 0x44b1); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x970c); + rtl_mdio_write(hw, 0x14, 0x161e); + rtl_mdio_write(hw, 0x14, 0x21e6); + rtl_mdio_write(hw, 0x14, 0x8242); + rtl_mdio_write(hw, 0x14, 0xee82); + rtl_mdio_write(hw, 0x14, 0x4101); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x46a0); + rtl_mdio_write(hw, 0x14, 0x0005); + rtl_mdio_write(hw, 0x14, 0x0286); + rtl_mdio_write(hw, 0x14, 0x96ae); + rtl_mdio_write(hw, 0x14, 0x06a0); + rtl_mdio_write(hw, 0x14, 0x0103); + rtl_mdio_write(hw, 0x14, 0x0219); + rtl_mdio_write(hw, 0x14, 0x19ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x29f6); + rtl_mdio_write(hw, 0x14, 0x20e4); + rtl_mdio_write(hw, 0x14, 0x8229); + rtl_mdio_write(hw, 0x14, 0xe080); + rtl_mdio_write(hw, 0x14, 0x10ac); + rtl_mdio_write(hw, 0x14, 0x2102); + rtl_mdio_write(hw, 0x14, 0xae54); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x27f7); + rtl_mdio_write(hw, 0x14, 0x20e4); + rtl_mdio_write(hw, 0x14, 0x8227); + rtl_mdio_write(hw, 0x14, 0xbf42); + rtl_mdio_write(hw, 0x14, 0xe602); + rtl_mdio_write(hw, 0x14, 0x4297); + rtl_mdio_write(hw, 0x14, 0xac28); + rtl_mdio_write(hw, 0x14, 0x22bf); + rtl_mdio_write(hw, 0x14, 0x430d); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97e5); + rtl_mdio_write(hw, 0x14, 0x8247); + rtl_mdio_write(hw, 0x14, 0xac28); + rtl_mdio_write(hw, 0x14, 0x20d1); + rtl_mdio_write(hw, 0x14, 0x03bf); + rtl_mdio_write(hw, 0x14, 0x4307); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59ee); + rtl_mdio_write(hw, 0x14, 0x8246); + rtl_mdio_write(hw, 0x14, 0x00e1); + rtl_mdio_write(hw, 0x14, 0x8227); + rtl_mdio_write(hw, 0x14, 0xf628); + rtl_mdio_write(hw, 0x14, 0xe582); + rtl_mdio_write(hw, 0x14, 0x27ae); + rtl_mdio_write(hw, 0x14, 0x21d1); + rtl_mdio_write(hw, 0x14, 0x04bf); + rtl_mdio_write(hw, 0x14, 0x4307); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59ae); + rtl_mdio_write(hw, 0x14, 0x08d1); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x4307); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59e0); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0xf720); + rtl_mdio_write(hw, 0x14, 0xe482); + rtl_mdio_write(hw, 0x14, 0x4402); + rtl_mdio_write(hw, 0x14, 0x46ae); + rtl_mdio_write(hw, 0x14, 0xee82); + rtl_mdio_write(hw, 0x14, 0x4601); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69e0); + rtl_mdio_write(hw, 0x14, 0x8013); + rtl_mdio_write(hw, 0x14, 0xad24); + rtl_mdio_write(hw, 0x14, 0x1cbf); + rtl_mdio_write(hw, 0x14, 0x87f0); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x97ad); + rtl_mdio_write(hw, 0x14, 0x2813); + rtl_mdio_write(hw, 0x14, 0xe087); + rtl_mdio_write(hw, 0x14, 0xfca0); + rtl_mdio_write(hw, 0x14, 0x0005); + rtl_mdio_write(hw, 0x14, 0x0287); + rtl_mdio_write(hw, 0x14, 0x36ae); + rtl_mdio_write(hw, 0x14, 0x10a0); + rtl_mdio_write(hw, 0x14, 0x0105); + rtl_mdio_write(hw, 0x14, 0x0287); + rtl_mdio_write(hw, 0x14, 0x48ae); + rtl_mdio_write(hw, 0x14, 0x08e0); + rtl_mdio_write(hw, 0x14, 0x8230); + rtl_mdio_write(hw, 0x14, 0xf626); + rtl_mdio_write(hw, 0x14, 0xe482); + rtl_mdio_write(hw, 0x14, 0x30ef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8e0); + rtl_mdio_write(hw, 0x14, 0x8245); + rtl_mdio_write(hw, 0x14, 0xf722); + rtl_mdio_write(hw, 0x14, 0xe482); + rtl_mdio_write(hw, 0x14, 0x4502); + rtl_mdio_write(hw, 0x14, 0x46ae); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xfc01); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xfb02); + rtl_mdio_write(hw, 0x14, 0x46d3); + rtl_mdio_write(hw, 0x14, 0xad50); + rtl_mdio_write(hw, 0x14, 0x2fbf); + rtl_mdio_write(hw, 0x14, 0x87ed); + rtl_mdio_write(hw, 0x14, 0xd101); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59bf); + rtl_mdio_write(hw, 0x14, 0x87ed); + rtl_mdio_write(hw, 0x14, 0xd100); + rtl_mdio_write(hw, 0x14, 0x0242); + rtl_mdio_write(hw, 0x14, 0x59e0); + rtl_mdio_write(hw, 0x14, 0x8245); + rtl_mdio_write(hw, 0x14, 0xf622); + rtl_mdio_write(hw, 0x14, 0xe482); + rtl_mdio_write(hw, 0x14, 0x4502); + rtl_mdio_write(hw, 0x14, 0x46ae); + rtl_mdio_write(hw, 0x14, 0xd100); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0xf002); + rtl_mdio_write(hw, 0x14, 0x4259); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xfc00); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x30f6); + rtl_mdio_write(hw, 0x14, 0x26e4); + rtl_mdio_write(hw, 0x14, 0x8230); + rtl_mdio_write(hw, 0x14, 0xffef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xface); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69fb); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0xb3d7); + rtl_mdio_write(hw, 0x14, 0x001c); + rtl_mdio_write(hw, 0x14, 0xd819); + rtl_mdio_write(hw, 0x14, 0xd919); + rtl_mdio_write(hw, 0x14, 0xda19); + rtl_mdio_write(hw, 0x14, 0xdb19); + rtl_mdio_write(hw, 0x14, 0x07ef); + rtl_mdio_write(hw, 0x14, 0x9502); + rtl_mdio_write(hw, 0x14, 0x4259); + rtl_mdio_write(hw, 0x14, 0x073f); + rtl_mdio_write(hw, 0x14, 0x0004); + rtl_mdio_write(hw, 0x14, 0x9fec); + rtl_mdio_write(hw, 0x14, 0xffef); + rtl_mdio_write(hw, 0x14, 0x96fe); + rtl_mdio_write(hw, 0x14, 0xc6fe); + rtl_mdio_write(hw, 0x14, 0xfdfc); + rtl_mdio_write(hw, 0x14, 0x0400); + rtl_mdio_write(hw, 0x14, 0x0145); + rtl_mdio_write(hw, 0x14, 0x7d00); + rtl_mdio_write(hw, 0x14, 0x0345); + rtl_mdio_write(hw, 0x14, 0x5c00); + rtl_mdio_write(hw, 0x14, 0x0143); + rtl_mdio_write(hw, 0x14, 0x4f00); + rtl_mdio_write(hw, 0x14, 0x0387); + rtl_mdio_write(hw, 0x14, 0xdb00); + rtl_mdio_write(hw, 0x14, 0x0987); + rtl_mdio_write(hw, 0x14, 0xde00); + rtl_mdio_write(hw, 0x14, 0x0987); + rtl_mdio_write(hw, 0x14, 0xe100); + rtl_mdio_write(hw, 0x14, 0x0087); + rtl_mdio_write(hw, 0x14, 0xeaa4); + rtl_mdio_write(hw, 0x14, 0x00b8); + rtl_mdio_write(hw, 0x14, 0x20c4); + rtl_mdio_write(hw, 0x14, 0x1600); + rtl_mdio_write(hw, 0x14, 0x000f); + rtl_mdio_write(hw, 0x14, 0xf800); + rtl_mdio_write(hw, 0x14, 0x7098); + rtl_mdio_write(hw, 0x14, 0xa58a); + rtl_mdio_write(hw, 0x14, 0xb6a8); + rtl_mdio_write(hw, 0x14, 0x3e50); + rtl_mdio_write(hw, 0x14, 0xa83e); + rtl_mdio_write(hw, 0x14, 0x33bc); + rtl_mdio_write(hw, 0x14, 0xc622); + rtl_mdio_write(hw, 0x14, 0xbcc6); + rtl_mdio_write(hw, 0x14, 0xaaa4); + rtl_mdio_write(hw, 0x14, 0x42ff); + rtl_mdio_write(hw, 0x14, 0xc408); + rtl_mdio_write(hw, 0x14, 0x00c4); + rtl_mdio_write(hw, 0x14, 0x16a8); + rtl_mdio_write(hw, 0x14, 0xbcc0); + rtl_mdio_write(hw, 0x13, 0xb818); + rtl_mdio_write(hw, 0x14, 0x02f3); + rtl_mdio_write(hw, 0x13, 0xb81a); + rtl_mdio_write(hw, 0x14, 0x17d1); + rtl_mdio_write(hw, 0x13, 0xb81c); + rtl_mdio_write(hw, 0x14, 0x185a); + rtl_mdio_write(hw, 0x13, 0xb81e); + rtl_mdio_write(hw, 0x14, 0x3c66); + rtl_mdio_write(hw, 0x13, 0xb820); + rtl_mdio_write(hw, 0x14, 0x021f); + rtl_mdio_write(hw, 0x13, 0xc416); + rtl_mdio_write(hw, 0x14, 0x0500); + rtl_mdio_write(hw, 0x13, 0xb82e); + rtl_mdio_write(hw, 0x14, 0xfffc); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x10); + gphy_val &= ~BIT_9; + rtl_mdio_write(hw, 0x10, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +/* ------------------------------------PHY 8168GU2------------------------------------- */ + +static void +rtl8168_set_phy_mcu_8168gu_2(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x0300); + rtl_mdio_write(hw, 0x13, 0xB82E); + rtl_mdio_write(hw, 0x14, 0x0001); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0xb820); + rtl_mdio_write(hw, 0x14, 0x0290); + rtl_mdio_write(hw, 0x13, 0xa012); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xa014); + rtl_mdio_write(hw, 0x14, 0x2c04); + rtl_mdio_write(hw, 0x14, 0x2c07); + rtl_mdio_write(hw, 0x14, 0x2c07); + rtl_mdio_write(hw, 0x14, 0x2c07); + rtl_mdio_write(hw, 0x14, 0xa304); + rtl_mdio_write(hw, 0x14, 0xa301); + rtl_mdio_write(hw, 0x14, 0x207e); + rtl_mdio_write(hw, 0x13, 0xa01a); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xa006); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xa004); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xa002); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xa000); + rtl_mdio_write(hw, 0x14, 0x107c); + rtl_mdio_write(hw, 0x13, 0xb820); + rtl_mdio_write(hw, 0x14, 0x0210); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x17); + gphy_val &= ~BIT_0; + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8146); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +void +hw_mac_mcu_config_8168g(struct rtl_hw *hw) +{ + if (hw->NotWrMcuPatchCode) + return; + + switch (hw->mcfg) { + case CFG_METHOD_21: + rtl8168_set_mac_mcu_8168g_1(hw); + break; + case CFG_METHOD_24: + rtl8168_set_mac_mcu_8168gu_1(hw); + break; + case CFG_METHOD_25: + rtl8168_set_mac_mcu_8168gu_2(hw); + break; + } +} + +void +hw_phy_mcu_config_8168g(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_21: + rtl8168_set_phy_mcu_8168g_1(hw); + break; + case CFG_METHOD_25: + rtl8168_set_phy_mcu_8168gu_2(hw); + break; + } +} diff --git a/drivers/net/r8169/base/rtl8168h.c b/drivers/net/r8169/base/rtl8168h.c new file mode 100644 index 0000000000..933a15ae39 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168h.c @@ -0,0 +1,447 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168h.h" + +/* For RTL8168H, CFG_METHOD_29,30,35,36 */ + +void +hw_init_rxcfg_8168h(struct rtl_hw *hw) +{ + RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 | + (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2); +} + +void +hw_ephy_config_8168h(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_37: + rtl_clear_pcie_phy_bit(hw, 0x1E, BIT_11); + + rtl_set_pcie_phy_bit(hw, 0x1E, BIT_0); + rtl_set_pcie_phy_bit(hw, 0x1D, BIT_11); + + rtl_ephy_write(hw, 0x05, 0x2089); + rtl_ephy_write(hw, 0x06, 0x5881); + + rtl_ephy_write(hw, 0x04, 0x854A); + rtl_ephy_write(hw, 0x01, 0x068B); + + break; + case CFG_METHOD_35: + rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_2); + + rtl_clear_pcie_phy_bit(hw, 0x24, BIT_9); + + rtl8168_clear_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0)); + + rtl8168_set_mcu_ocp_bit(hw, 0xD438, BIT_2); + + break; + case CFG_METHOD_36: + rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_2); + + rtl8168_clear_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0)); + + rtl8168_set_mcu_ocp_bit(hw, 0xD438, BIT_2); + + break; + default: + break; + } +} + +static int +rtl8168h_require_adc_bias_patch_check(struct rtl_hw *hw, u16 *offset) +{ + int ret; + u16 ioffset_p3, ioffset_p2, ioffset_p1, ioffset_p0; + u16 tmp_ushort; + + rtl_mac_ocp_write(hw, 0xDD02, 0x807D); + tmp_ushort = rtl_mac_ocp_read(hw, 0xDD02); + ioffset_p3 = ((tmp_ushort & BIT_7) >> 7); + ioffset_p3 <<= 3; + tmp_ushort = rtl_mac_ocp_read(hw, 0xDD00); + + ioffset_p3 |= ((tmp_ushort & (BIT_15 | BIT_14 | BIT_13)) >> 13); + + ioffset_p2 = ((tmp_ushort & (BIT_12 | BIT_11 | BIT_10 | BIT_9)) >> 9); + ioffset_p1 = ((tmp_ushort & (BIT_8 | BIT_7 | BIT_6 | BIT_5)) >> 5); + + ioffset_p0 = ((tmp_ushort & BIT_4) >> 4); + ioffset_p0 <<= 3; + ioffset_p0 |= (tmp_ushort & (BIT_2 | BIT_1 | BIT_0)); + + if (ioffset_p3 == 0x0F && ioffset_p2 == 0x0F && ioffset_p1 == 0x0F && + ioffset_p0 == 0x0F) { + ret = FALSE; + } else { + ret = TRUE; + *offset = (ioffset_p3 << 12) | (ioffset_p2 << 8) | + (ioffset_p1 << 4) | ioffset_p0; + } + + return ret; +} + +static void +hw_phy_config_8168h_1(struct rtl_hw *hw) +{ + u16 dout_tapbin; + u16 gphy_val; + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x809b); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x8000); + rtl_mdio_write(hw, 0x13, 0x80A2); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8000); + rtl_mdio_write(hw, 0x13, 0x80A4); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x8500); + rtl_mdio_write(hw, 0x13, 0x809C); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xbd00); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x80AD); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0x7000); + rtl_mdio_write(hw, 0x13, 0x80B4); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x5000); + rtl_mdio_write(hw, 0x13, 0x80AC); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x4000); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x808E); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x1200); + rtl_mdio_write(hw, 0x13, 0x8090); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0xE500); + rtl_mdio_write(hw, 0x13, 0x8092); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x9F00); + rtl_mdio_write(hw, 0x1F, 0x0000); + + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) { + dout_tapbin = 0x0000; + rtl_mdio_write(hw, 0x1F, 0x0A46); + gphy_val = rtl_mdio_read(hw, 0x13); + gphy_val &= (BIT_1 | BIT_0); + gphy_val <<= 2; + dout_tapbin |= gphy_val; + + gphy_val = rtl_mdio_read(hw, 0x12); + gphy_val &= (BIT_15 | BIT_14); + gphy_val >>= 14; + dout_tapbin |= gphy_val; + + dout_tapbin = ~(dout_tapbin ^ BIT_3); + dout_tapbin <<= 12; + dout_tapbin &= 0xF000; + + rtl_mdio_write(hw, 0x1F, 0x0A43); + + rtl_mdio_write(hw, 0x13, 0x827A); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | BIT_12), + dout_tapbin); + + rtl_mdio_write(hw, 0x13, 0x827B); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | BIT_12), + dout_tapbin); + + rtl_mdio_write(hw, 0x13, 0x827C); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | BIT_12), + dout_tapbin); + + rtl_mdio_write(hw, 0x13, 0x827D); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | BIT_12), + dout_tapbin); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8011); + rtl_set_eth_phy_bit(hw, 0x14, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0A42); + rtl_set_eth_phy_bit(hw, 0x16, BIT_1); + } + + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_set_eth_phy_bit(hw, 0x11, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0BCA); + rtl_clear_and_set_eth_phy_bit(hw, 0x17, (BIT_13 | BIT_12), BIT_14); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x803F); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x8047); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x804F); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x8057); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x805F); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x8067); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x13, 0x806F); + rtl_clear_eth_phy_bit(hw, 0x14, (BIT_13 | BIT_12)); + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +static void +hw_phy_config_8168h_2(struct rtl_hw *hw) +{ + u16 gphy_val; + u16 offset; + u16 rlen; + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x808A); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0), + 0x0A); + + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) { + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8011); + rtl_set_eth_phy_bit(hw, 0x14, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0A42); + rtl_set_eth_phy_bit(hw, 0x16, BIT_1); + } + + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_set_eth_phy_bit(hw, 0x11, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0000); + + if (rtl8168h_require_adc_bias_patch_check(hw, &offset)) { + rtl_mdio_write(hw, 0x1F, 0x0BCF); + rtl_mdio_write(hw, 0x16, offset); + rtl_mdio_write(hw, 0x1F, 0x0000); + } + + rtl_mdio_write(hw, 0x1F, 0x0BCD); + gphy_val = rtl_mdio_read(hw, 0x16); + gphy_val &= 0x000F; + + if (gphy_val > 3) + rlen = gphy_val - 3; + else + rlen = 0; + + gphy_val = rlen | (rlen << 4) | (rlen << 8) | (rlen << 12); + + rtl_mdio_write(hw, 0x1F, 0x0BCD); + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1F, 0x0000); + + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) { + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x85FE); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, (BIT_15 | BIT_14 | + BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8), + BIT_9); + rtl_mdio_write(hw, 0x13, 0x85FF); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | BIT_12), + (BIT_11 | BIT_10 | BIT_9 | BIT_8)); + rtl_mdio_write(hw, 0x13, 0x814B); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, + (BIT_15 | BIT_14 | BIT_13 | + BIT_11 | BIT_10 | BIT_9 | BIT_8), + BIT_12); + } + + rtl_mdio_write(hw, 0x1F, 0x0C41); + rtl_clear_eth_phy_bit(hw, 0x15, BIT_1); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_set_eth_phy_bit(hw, 0x10, BIT_0); + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +static void +hw_phy_config_8168h_3(struct rtl_hw *hw) +{ + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_set_eth_phy_bit(hw, 0x11, BIT_11); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A4C); + rtl_clear_eth_phy_bit(hw, 0x15, (BIT_14 | BIT_13)); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x81B9); + rtl_mdio_write(hw, 0x14, 0x2000); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x81D4); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x6600); + rtl_mdio_write(hw, 0x13, 0x81CB); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x3500); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A80); + rtl_clear_and_set_eth_phy_bit(hw, 0x16, 0x000F, 0x0005); + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8016); + rtl_set_eth_phy_bit(hw, 0x14, BIT_13); + rtl_mdio_write(hw, 0x1F, 0x0000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x811E); + rtl_mdio_write(hw, 0x14, 0xDECA); + + rtl_mdio_write(hw, 0x13, 0x811C); + rtl_mdio_write(hw, 0x14, 0x8008); + rtl_mdio_write(hw, 0x13, 0x8118); + rtl_mdio_write(hw, 0x14, 0xF8B4); + rtl_mdio_write(hw, 0x13, 0x811A); + rtl_mdio_write(hw, 0x14, 0x1A04); + + rtl_mdio_write(hw, 0x13, 0x8134); + rtl_mdio_write(hw, 0x14, 0xDECA); + rtl_mdio_write(hw, 0x13, 0x8132); + rtl_mdio_write(hw, 0x14, 0xA008); + rtl_mdio_write(hw, 0x13, 0x812E); + rtl_mdio_write(hw, 0x14, 0x00B5); + rtl_mdio_write(hw, 0x13, 0x8130); + rtl_mdio_write(hw, 0x14, 0x1A04); + + rtl_mdio_write(hw, 0x13, 0x8112); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7300); + rtl_mdio_write(hw, 0x13, 0x8106); + rtl_mdio_write(hw, 0x14, 0xA209); + rtl_mdio_write(hw, 0x13, 0x8108); + rtl_mdio_write(hw, 0x14, 0x13B0); + rtl_mdio_write(hw, 0x13, 0x8103); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xF800, 0xB800); + rtl_mdio_write(hw, 0x13, 0x8105); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x0A00); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x87EB); + rtl_mdio_write(hw, 0x14, 0x0018); + rtl_mdio_write(hw, 0x13, 0x87EB); + rtl_mdio_write(hw, 0x14, 0x0018); + rtl_mdio_write(hw, 0x13, 0x87ED); + rtl_mdio_write(hw, 0x14, 0x0733); + rtl_mdio_write(hw, 0x13, 0x87EF); + rtl_mdio_write(hw, 0x14, 0x08DC); + rtl_mdio_write(hw, 0x13, 0x87F1); + rtl_mdio_write(hw, 0x14, 0x08DF); + rtl_mdio_write(hw, 0x13, 0x87F3); + rtl_mdio_write(hw, 0x14, 0x0C79); + rtl_mdio_write(hw, 0x13, 0x87F5); + rtl_mdio_write(hw, 0x14, 0x0D93); + rtl_mdio_write(hw, 0x13, 0x87F9); + rtl_mdio_write(hw, 0x14, 0x0010); + rtl_mdio_write(hw, 0x13, 0x87FB); + rtl_mdio_write(hw, 0x14, 0x0800); + rtl_mdio_write(hw, 0x13, 0x8015); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0x7000, 0x7000); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8111); + rtl_clear_and_set_eth_phy_bit(hw, 0x14, 0xFF00, 0x7C00); + rtl_mdio_write(hw, 0x1F, 0x0000); +} + +void +hw_phy_config_8168h(struct rtl_hw *hw) +{ + if (hw->mcfg == CFG_METHOD_29) + hw_phy_config_8168h_1(hw); + else if (hw->mcfg == CFG_METHOD_30 || hw->mcfg == CFG_METHOD_37) + hw_phy_config_8168h_2(hw); + else if (hw->mcfg == CFG_METHOD_35) + hw_phy_config_8168h_3(hw); + + /* Enable EthPhyPPSW */ + if (hw->mcfg != CFG_METHOD_37) { + rtl_mdio_write(hw, 0x1F, 0x0A44); + rtl_clear_eth_phy_bit(hw, 0x11, BIT_7); + rtl_mdio_write(hw, 0x1F, 0x0000); + } +} + +void +hw_config_8168h(struct rtl_hw *hw) +{ + u32 csi_tmp; + u16 mac_ocp_data; + + /* Share fifo rx params */ + rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC); + + /* Adjust the trx fifo*/ + rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC); + rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC); + + /* Disable share fifo */ + RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7); + + if (hw->mcfg == CFG_METHOD_35 || hw->mcfg == CFG_METHOD_36) + rtl8168_set_mcu_ocp_bit(hw, 0xD438, (BIT_1 | BIT_0)); + + /* EPHY err mask */ + mac_ocp_data = rtl_mac_ocp_read(hw, 0xE0D6); + mac_ocp_data &= ~(BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | + BIT_2 | BIT_1 | BIT_0); + mac_ocp_data |= 0x17F; + rtl_mac_ocp_write(hw, 0xE0D6, mac_ocp_data); + + RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en); + + /* EEE led enable */ + RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07); + + RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En); + + csi_tmp = rtl_eri_read(hw, 0xDC, 4, ERIAR_ExGMAC); + csi_tmp |= (BIT_2 | BIT_3 | BIT_4); + rtl_eri_write(hw, 0xDC, 4, csi_tmp, ERIAR_ExGMAC); + + /* CRC wake disable */ + rtl_mac_ocp_write(hw, 0xC140, 0xFFFF); + rtl_mac_ocp_write(hw, 0xC142, 0xFFFF); + + csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC); + csi_tmp &= ~BIT_12; + rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC); + + csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC); + csi_tmp &= ~BIT_2; + rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC); + + if (hw->mcfg != CFG_METHOD_37) { + csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC); + csi_tmp |= BIT_1; + rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC); + } +} + +const struct rtl_hw_ops rtl8168h_ops = { + .hw_config = hw_config_8168h, + .hw_init_rxcfg = hw_init_rxcfg_8168h, + .hw_ephy_config = hw_ephy_config_8168h, + .hw_phy_config = hw_phy_config_8168h, + .hw_mac_mcu_config = hw_mac_mcu_config_8168h, + .hw_phy_mcu_config = hw_phy_mcu_config_8168h, +}; diff --git a/drivers/net/r8169/base/rtl8168h.h b/drivers/net/r8169/base/rtl8168h.h new file mode 100644 index 0000000000..51612d5fc3 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168h.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef _RTL8168H_H_ +#define _RTL8168H_H_ + +#include "../r8169_compat.h" + +extern const struct rtl_hw_ops rtl8168h_ops; +extern const struct rtl_hw_ops rtl8168m_ops; + +void hw_mac_mcu_config_8168h(struct rtl_hw *hw); +void hw_phy_mcu_config_8168h(struct rtl_hw *hw); + +void hw_init_rxcfg_8168h(struct rtl_hw *hw); +void hw_ephy_config_8168h(struct rtl_hw *hw); +void hw_phy_config_8168h(struct rtl_hw *hw); +void hw_config_8168h(struct rtl_hw *hw); + +#endif diff --git a/drivers/net/r8169/base/rtl8168h_mcu.c b/drivers/net/r8169/base/rtl8168h_mcu.c new file mode 100644 index 0000000000..445e6ab22e --- /dev/null +++ b/drivers/net/r8169/base/rtl8168h_mcu.c @@ -0,0 +1,1186 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168h.h" + +/* For RTL8168H, CFG_METHOD_29,30,35,36 */ + +/* ------------------------------------MAC 8168H------------------------------------- */ + +static void +rtl8168_set_mac_mcu_8168h_1(struct rtl_hw *hw) +{ + rtl_hw_disable_mac_mcu_bps(hw); +} + +static void +rtl8168_set_mac_mcu_8168h_2(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168h_1[] = { + 0xE008, 0xE00F, 0xE011, 0xE047, 0xE049, 0xE073, 0xE075, 0xE07A, 0xC707, + 0x1D00, 0x8DE2, 0x48C1, 0xC502, 0xBD00, 0x00E4, 0xE0C0, 0xC502, 0xBD00, + 0x0216, 0xC634, 0x75C0, 0x49D3, 0xF027, 0xC631, 0x75C0, 0x49D3, 0xF123, + 0xC627, 0x75C0, 0xB405, 0xC525, 0x9DC0, 0xC621, 0x75C8, 0x49D5, 0xF00A, + 0x49D6, 0xF008, 0x49D7, 0xF006, 0x49D8, 0xF004, 0x75D2, 0x49D9, 0xF111, + 0xC517, 0x9DC8, 0xC516, 0x9DD2, 0xC618, 0x75C0, 0x49D4, 0xF003, 0x49D0, + 0xF104, 0xC60A, 0xC50E, 0x9DC0, 0xB005, 0xC607, 0x9DC0, 0xB007, 0xC602, + 0xBE00, 0x1A06, 0xB400, 0xE86C, 0xA000, 0x01E1, 0x0200, 0x9200, 0xE84C, + 0xE004, 0xE908, 0xC502, 0xBD00, 0x0B58, 0xB407, 0xB404, 0x2195, 0x25BD, + 0x9BE0, 0x1C1C, 0x484F, 0x9CE2, 0x72E2, 0x49AE, 0xF1FE, 0x0B00, 0xF116, + 0xC71C, 0xC419, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE, + 0xC412, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE, 0xC70C, + 0x74F8, 0x48C3, 0x8CF8, 0xB004, 0xB007, 0xC502, 0xBD00, 0x0F24, 0x0481, + 0x0C81, 0xDE24, 0xE000, 0xC602, 0xBE00, 0x0CA4, 0x48C1, 0x48C2, 0x9C46, + 0xC402, 0xBC00, 0x0578, 0xC602, 0xBE00, 0x0000 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168h_1); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168h_1[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC28, 0x00E2); + rtl_mac_ocp_write(hw, 0xFC2A, 0x0210); + rtl_mac_ocp_write(hw, 0xFC2C, 0x1A04); + rtl_mac_ocp_write(hw, 0xFC2E, 0x0B26); + rtl_mac_ocp_write(hw, 0xFC30, 0x0F02); + rtl_mac_ocp_write(hw, 0xFC32, 0x0CA0); + + rtl_mac_ocp_write(hw, 0xFC38, 0x003F); +} + +static void +rtl8168_set_mac_mcu_8168h_3(struct rtl_hw *hw) +{ + u16 i; + static const u16 mcu_patch_code_8168h_3[] = { + 0xE008, 0xE00A, 0xE00C, 0xE00E, 0xE010, 0xE03E, 0xE040, 0xE069, 0xC602, + 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC002, 0xB800, 0x0000, 0xC602, + 0xBE00, 0x0000, 0xC72B, 0x76E2, 0x49EE, 0xF1FD, 0x1E00, 0x9EE0, 0x1E1C, + 0x9EE2, 0x76E2, 0x49EE, 0xF1FE, 0xC621, 0x9EE0, 0x1E1D, 0x486F, 0x9EE2, + 0x76E2, 0x49EE, 0xF1FE, 0xC71A, 0x76E0, 0x48E8, 0x48E9, 0x48EA, 0x48EB, + 0x48EC, 0x9EE0, 0xC70D, 0xC60D, 0x9EF4, 0xC60C, 0x9EF6, 0xC70E, 0x76E0, + 0x4863, 0x9EE0, 0xB007, 0xC602, 0xBE00, 0x0ACC, 0xE000, 0x03BF, 0x07FF, + 0xDE24, 0x3200, 0xE096, 0xD438, 0xC602, 0xBE00, 0x0000, 0x8EE6, 0xC726, + 0x76E2, 0x49EE, 0xF1FD, 0x1E00, 0x8EE0, 0x1E1C, 0x8EE2, 0x76E2, 0x49EE, + 0xF1FE, 0xC61C, 0x8EE0, 0x1E1D, 0x486F, 0x8EE2, 0x76E2, 0x49EE, 0xF1FE, + 0xC715, 0x76E0, 0x48E8, 0x48E9, 0x48EA, 0x48EB, 0x48EC, 0x9EE0, 0xC708, + 0xC608, 0x9EF4, 0xC607, 0x9EF6, 0xC602, 0xBE00, 0x0ABE, 0xE000, 0x03BF, + 0x07FF, 0xDE24, 0x3200, 0xE096, 0xC602, 0xBE00, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6838, 0x0A17, 0x0613, 0x0D26 + }; + + rtl_hw_disable_mac_mcu_bps(hw); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168h_3); i++) + rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168h_3[i]); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC30, 0x0ACA); + + rtl8168_clear_mcu_ocp_bit(hw, 0xD438, BIT_3); + + rtl_mac_ocp_write(hw, 0xFC38, 0x0010); +} + +static void +rtl8168_set_mac_mcu_8168h_4(struct rtl_hw *hw) +{ + rtl_hw_disable_mac_mcu_bps(hw); +} + +/* ------------------------------------PHY 8168H------------------------------------- */ + +static void +rtl8168_set_phy_mcu_8168h_1(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8028); + rtl_mdio_write(hw, 0x14, 0x6200); + rtl_mdio_write(hw, 0x13, 0xB82E); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0290); + rtl_mdio_write(hw, 0x13, 0xA012); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA014); + rtl_mdio_write(hw, 0x14, 0x2c04); + rtl_mdio_write(hw, 0x14, 0x2c10); + rtl_mdio_write(hw, 0x14, 0x2c10); + rtl_mdio_write(hw, 0x14, 0x2c10); + rtl_mdio_write(hw, 0x14, 0xa210); + rtl_mdio_write(hw, 0x14, 0xa101); + rtl_mdio_write(hw, 0x14, 0xce10); + rtl_mdio_write(hw, 0x14, 0xe070); + rtl_mdio_write(hw, 0x14, 0x0f40); + rtl_mdio_write(hw, 0x14, 0xaf01); + rtl_mdio_write(hw, 0x14, 0x8f01); + rtl_mdio_write(hw, 0x14, 0x183e); + rtl_mdio_write(hw, 0x14, 0x8e10); + rtl_mdio_write(hw, 0x14, 0x8101); + rtl_mdio_write(hw, 0x14, 0x8210); + rtl_mdio_write(hw, 0x14, 0x28da); + rtl_mdio_write(hw, 0x13, 0xA01A); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA006); + rtl_mdio_write(hw, 0x14, 0x0017); + rtl_mdio_write(hw, 0x13, 0xA004); + rtl_mdio_write(hw, 0x14, 0x0015); + rtl_mdio_write(hw, 0x13, 0xA002); + rtl_mdio_write(hw, 0x14, 0x0013); + rtl_mdio_write(hw, 0x13, 0xA000); + rtl_mdio_write(hw, 0x14, 0x18d1); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0210); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x17); + gphy_val &= ~BIT_0; + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8028); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +static void +rtl8168_set_phy_mcu_8168h_2(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8028); + rtl_mdio_write(hw, 0x14, 0x6201); + rtl_mdio_write(hw, 0x13, 0xB82E); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0290); + rtl_mdio_write(hw, 0x13, 0xA012); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA014); + rtl_mdio_write(hw, 0x14, 0x2c04); + rtl_mdio_write(hw, 0x14, 0x2c09); + rtl_mdio_write(hw, 0x14, 0x2c0d); + rtl_mdio_write(hw, 0x14, 0x2c12); + rtl_mdio_write(hw, 0x14, 0xad01); + rtl_mdio_write(hw, 0x14, 0xad01); + rtl_mdio_write(hw, 0x14, 0xad01); + rtl_mdio_write(hw, 0x14, 0xad01); + rtl_mdio_write(hw, 0x14, 0x236c); + rtl_mdio_write(hw, 0x14, 0xd03c); + rtl_mdio_write(hw, 0x14, 0xd1aa); + rtl_mdio_write(hw, 0x14, 0xc010); + rtl_mdio_write(hw, 0x14, 0x2745); + rtl_mdio_write(hw, 0x14, 0x33de); + rtl_mdio_write(hw, 0x14, 0x16ba); + rtl_mdio_write(hw, 0x14, 0x31ee); + rtl_mdio_write(hw, 0x14, 0x2712); + rtl_mdio_write(hw, 0x14, 0x274e); + rtl_mdio_write(hw, 0x14, 0xc2bb); + rtl_mdio_write(hw, 0x14, 0xd500); + rtl_mdio_write(hw, 0x14, 0xc426); + rtl_mdio_write(hw, 0x14, 0xd01d); + rtl_mdio_write(hw, 0x14, 0xd1c3); + rtl_mdio_write(hw, 0x14, 0x401c); + rtl_mdio_write(hw, 0x14, 0xd501); + rtl_mdio_write(hw, 0x14, 0xc2b3); + rtl_mdio_write(hw, 0x14, 0xd500); + rtl_mdio_write(hw, 0x14, 0xd00b); + rtl_mdio_write(hw, 0x14, 0xd1c3); + rtl_mdio_write(hw, 0x14, 0x401c); + rtl_mdio_write(hw, 0x14, 0x241a); + rtl_mdio_write(hw, 0x13, 0xA01A); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA006); + rtl_mdio_write(hw, 0x14, 0x0414); + rtl_mdio_write(hw, 0x13, 0xA004); + rtl_mdio_write(hw, 0x14, 0x074c); + rtl_mdio_write(hw, 0x13, 0xA002); + rtl_mdio_write(hw, 0x14, 0x0744); + rtl_mdio_write(hw, 0x13, 0xA000); + rtl_mdio_write(hw, 0x14, 0xf36b); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0210); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8323); + rtl_mdio_write(hw, 0x14, 0xaf83); + rtl_mdio_write(hw, 0x14, 0x2faf); + rtl_mdio_write(hw, 0x14, 0x853d); + rtl_mdio_write(hw, 0x14, 0xaf85); + rtl_mdio_write(hw, 0x14, 0x3daf); + rtl_mdio_write(hw, 0x14, 0x853d); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x45ad); + rtl_mdio_write(hw, 0x14, 0x2052); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7ae3); + rtl_mdio_write(hw, 0x14, 0x85fe); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f6); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7a1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fa); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7be3); + rtl_mdio_write(hw, 0x14, 0x85fe); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f7); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7b1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fb); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7ce3); + rtl_mdio_write(hw, 0x14, 0x85fe); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f8); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7c1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fc); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7de3); + rtl_mdio_write(hw, 0x14, 0x85fe); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f9); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7d1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fd); + rtl_mdio_write(hw, 0x14, 0xae50); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7ee3); + rtl_mdio_write(hw, 0x14, 0x85ff); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f6); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7e1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fa); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7fe3); + rtl_mdio_write(hw, 0x14, 0x85ff); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f7); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x7f1b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fb); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x80e3); + rtl_mdio_write(hw, 0x14, 0x85ff); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f8); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x801b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fc); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x81e3); + rtl_mdio_write(hw, 0x14, 0x85ff); + rtl_mdio_write(hw, 0x14, 0x1a03); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x85f9); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x811b); + rtl_mdio_write(hw, 0x14, 0x03e4); + rtl_mdio_write(hw, 0x14, 0x85fd); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf6ad); + rtl_mdio_write(hw, 0x14, 0x2404); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xf610); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf7ad); + rtl_mdio_write(hw, 0x14, 0x2404); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xf710); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf8ad); + rtl_mdio_write(hw, 0x14, 0x2404); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xf810); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf9ad); + rtl_mdio_write(hw, 0x14, 0x2404); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xf910); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfaad); + rtl_mdio_write(hw, 0x14, 0x2704); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xfa00); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfbad); + rtl_mdio_write(hw, 0x14, 0x2704); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xfb00); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfcad); + rtl_mdio_write(hw, 0x14, 0x2704); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xfc00); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfdad); + rtl_mdio_write(hw, 0x14, 0x2704); + rtl_mdio_write(hw, 0x14, 0xee85); + rtl_mdio_write(hw, 0x14, 0xfd00); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44ad); + rtl_mdio_write(hw, 0x14, 0x203f); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf6e4); + rtl_mdio_write(hw, 0x14, 0x8288); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfae4); + rtl_mdio_write(hw, 0x14, 0x8289); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x440d); + rtl_mdio_write(hw, 0x14, 0x0458); + rtl_mdio_write(hw, 0x14, 0x01bf); + rtl_mdio_write(hw, 0x14, 0x8264); + rtl_mdio_write(hw, 0x14, 0x0215); + rtl_mdio_write(hw, 0x14, 0x38bf); + rtl_mdio_write(hw, 0x14, 0x824e); + rtl_mdio_write(hw, 0x14, 0x0213); + rtl_mdio_write(hw, 0x14, 0x06a0); + rtl_mdio_write(hw, 0x14, 0x010f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44f6); + rtl_mdio_write(hw, 0x14, 0x20e4); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x580f); + rtl_mdio_write(hw, 0x14, 0xe582); + rtl_mdio_write(hw, 0x14, 0x5aae); + rtl_mdio_write(hw, 0x14, 0x0ebf); + rtl_mdio_write(hw, 0x14, 0x825e); + rtl_mdio_write(hw, 0x14, 0xe382); + rtl_mdio_write(hw, 0x14, 0x44f7); + rtl_mdio_write(hw, 0x14, 0x3ce7); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x0212); + rtl_mdio_write(hw, 0x14, 0xf0ad); + rtl_mdio_write(hw, 0x14, 0x213f); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf7e4); + rtl_mdio_write(hw, 0x14, 0x8288); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfbe4); + rtl_mdio_write(hw, 0x14, 0x8289); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x440d); + rtl_mdio_write(hw, 0x14, 0x0558); + rtl_mdio_write(hw, 0x14, 0x01bf); + rtl_mdio_write(hw, 0x14, 0x826b); + rtl_mdio_write(hw, 0x14, 0x0215); + rtl_mdio_write(hw, 0x14, 0x38bf); + rtl_mdio_write(hw, 0x14, 0x824f); + rtl_mdio_write(hw, 0x14, 0x0213); + rtl_mdio_write(hw, 0x14, 0x06a0); + rtl_mdio_write(hw, 0x14, 0x010f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44f6); + rtl_mdio_write(hw, 0x14, 0x21e4); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x580f); + rtl_mdio_write(hw, 0x14, 0xe582); + rtl_mdio_write(hw, 0x14, 0x5bae); + rtl_mdio_write(hw, 0x14, 0x0ebf); + rtl_mdio_write(hw, 0x14, 0x8265); + rtl_mdio_write(hw, 0x14, 0xe382); + rtl_mdio_write(hw, 0x14, 0x44f7); + rtl_mdio_write(hw, 0x14, 0x3de7); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x0212); + rtl_mdio_write(hw, 0x14, 0xf0ad); + rtl_mdio_write(hw, 0x14, 0x223f); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf8e4); + rtl_mdio_write(hw, 0x14, 0x8288); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfce4); + rtl_mdio_write(hw, 0x14, 0x8289); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x440d); + rtl_mdio_write(hw, 0x14, 0x0658); + rtl_mdio_write(hw, 0x14, 0x01bf); + rtl_mdio_write(hw, 0x14, 0x8272); + rtl_mdio_write(hw, 0x14, 0x0215); + rtl_mdio_write(hw, 0x14, 0x38bf); + rtl_mdio_write(hw, 0x14, 0x8250); + rtl_mdio_write(hw, 0x14, 0x0213); + rtl_mdio_write(hw, 0x14, 0x06a0); + rtl_mdio_write(hw, 0x14, 0x010f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44f6); + rtl_mdio_write(hw, 0x14, 0x22e4); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x580f); + rtl_mdio_write(hw, 0x14, 0xe582); + rtl_mdio_write(hw, 0x14, 0x5cae); + rtl_mdio_write(hw, 0x14, 0x0ebf); + rtl_mdio_write(hw, 0x14, 0x826c); + rtl_mdio_write(hw, 0x14, 0xe382); + rtl_mdio_write(hw, 0x14, 0x44f7); + rtl_mdio_write(hw, 0x14, 0x3ee7); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x0212); + rtl_mdio_write(hw, 0x14, 0xf0ad); + rtl_mdio_write(hw, 0x14, 0x233f); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xf9e4); + rtl_mdio_write(hw, 0x14, 0x8288); + rtl_mdio_write(hw, 0x14, 0xe085); + rtl_mdio_write(hw, 0x14, 0xfde4); + rtl_mdio_write(hw, 0x14, 0x8289); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x440d); + rtl_mdio_write(hw, 0x14, 0x0758); + rtl_mdio_write(hw, 0x14, 0x01bf); + rtl_mdio_write(hw, 0x14, 0x8279); + rtl_mdio_write(hw, 0x14, 0x0215); + rtl_mdio_write(hw, 0x14, 0x38bf); + rtl_mdio_write(hw, 0x14, 0x8251); + rtl_mdio_write(hw, 0x14, 0x0213); + rtl_mdio_write(hw, 0x14, 0x06a0); + rtl_mdio_write(hw, 0x14, 0x010f); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0x44f6); + rtl_mdio_write(hw, 0x14, 0x23e4); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x580f); + rtl_mdio_write(hw, 0x14, 0xe582); + rtl_mdio_write(hw, 0x14, 0x5dae); + rtl_mdio_write(hw, 0x14, 0x0ebf); + rtl_mdio_write(hw, 0x14, 0x8273); + rtl_mdio_write(hw, 0x14, 0xe382); + rtl_mdio_write(hw, 0x14, 0x44f7); + rtl_mdio_write(hw, 0x14, 0x3fe7); + rtl_mdio_write(hw, 0x14, 0x8244); + rtl_mdio_write(hw, 0x14, 0x0212); + rtl_mdio_write(hw, 0x14, 0xf0ee); + rtl_mdio_write(hw, 0x14, 0x8288); + rtl_mdio_write(hw, 0x14, 0x10ee); + rtl_mdio_write(hw, 0x14, 0x8289); + rtl_mdio_write(hw, 0x14, 0x00af); + rtl_mdio_write(hw, 0x14, 0x14aa); + rtl_mdio_write(hw, 0x13, 0xb818); + rtl_mdio_write(hw, 0x14, 0x13cf); + rtl_mdio_write(hw, 0x13, 0xb81a); + rtl_mdio_write(hw, 0x14, 0xfffd); + rtl_mdio_write(hw, 0x13, 0xb81c); + rtl_mdio_write(hw, 0x14, 0xfffd); + rtl_mdio_write(hw, 0x13, 0xb81e); + rtl_mdio_write(hw, 0x14, 0xfffd); + rtl_mdio_write(hw, 0x13, 0xb832); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x17); + gphy_val &= ~BIT_0; + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8028); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +static void +rtl8168_set_phy_mcu_8168h_3(struct rtl_hw *hw) +{ + unsigned int gphy_val; + + rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8042); + rtl_mdio_write(hw, 0x14, 0x3800); + rtl_mdio_write(hw, 0x13, 0xB82E); + rtl_mdio_write(hw, 0x14, 0x0001); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0090); + rtl_mdio_write(hw, 0x13, 0xA016); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA012); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x13, 0xA014); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8010); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8014); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x8022); + rtl_mdio_write(hw, 0x14, 0x2b5d); + rtl_mdio_write(hw, 0x14, 0x0c68); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x0b3c); + rtl_mdio_write(hw, 0x14, 0xc2bb); + rtl_mdio_write(hw, 0x14, 0xd500); + rtl_mdio_write(hw, 0x14, 0xc426); + rtl_mdio_write(hw, 0x14, 0xd01d); + rtl_mdio_write(hw, 0x14, 0xd1c3); + rtl_mdio_write(hw, 0x14, 0x401c); + rtl_mdio_write(hw, 0x14, 0xd501); + rtl_mdio_write(hw, 0x14, 0xc2b3); + rtl_mdio_write(hw, 0x14, 0xd500); + rtl_mdio_write(hw, 0x14, 0xd00b); + rtl_mdio_write(hw, 0x14, 0xd1c3); + rtl_mdio_write(hw, 0x14, 0x401c); + rtl_mdio_write(hw, 0x14, 0x1800); + rtl_mdio_write(hw, 0x14, 0x0478); + rtl_mdio_write(hw, 0x13, 0xA026); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA024); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA022); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA020); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA006); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA004); + rtl_mdio_write(hw, 0x14, 0x0fff); + rtl_mdio_write(hw, 0x13, 0xA002); + rtl_mdio_write(hw, 0x14, 0x0472); + rtl_mdio_write(hw, 0x13, 0xA000); + rtl_mdio_write(hw, 0x14, 0x0b3a); + rtl_mdio_write(hw, 0x13, 0xA008); + rtl_mdio_write(hw, 0x14, 0x0300); + rtl_mdio_write(hw, 0x13, 0xB820); + rtl_mdio_write(hw, 0x14, 0x0010); + + rtl_mdio_write(hw, 0x13, 0x83f3); + rtl_mdio_write(hw, 0x14, 0xaf84); + rtl_mdio_write(hw, 0x14, 0x0baf); + rtl_mdio_write(hw, 0x14, 0x8466); + rtl_mdio_write(hw, 0x14, 0xaf84); + rtl_mdio_write(hw, 0x14, 0xcdaf); + rtl_mdio_write(hw, 0x14, 0x873c); + rtl_mdio_write(hw, 0x14, 0xaf87); + rtl_mdio_write(hw, 0x14, 0x3faf); + rtl_mdio_write(hw, 0x14, 0x8760); + rtl_mdio_write(hw, 0x14, 0xaf87); + rtl_mdio_write(hw, 0x14, 0x60af); + rtl_mdio_write(hw, 0x14, 0x8760); + rtl_mdio_write(hw, 0x14, 0xef79); + rtl_mdio_write(hw, 0x14, 0xfb89); + rtl_mdio_write(hw, 0x14, 0xe987); + rtl_mdio_write(hw, 0x14, 0xffd7); + rtl_mdio_write(hw, 0x14, 0x0017); + rtl_mdio_write(hw, 0x14, 0xd400); + rtl_mdio_write(hw, 0x14, 0x051c); + rtl_mdio_write(hw, 0x14, 0x421a); + rtl_mdio_write(hw, 0x14, 0x741b); + rtl_mdio_write(hw, 0x14, 0x97e9); + rtl_mdio_write(hw, 0x14, 0x87fe); + rtl_mdio_write(hw, 0x14, 0xffef); + rtl_mdio_write(hw, 0x14, 0x97e0); + rtl_mdio_write(hw, 0x14, 0x82aa); + rtl_mdio_write(hw, 0x14, 0xa000); + rtl_mdio_write(hw, 0x14, 0x08ef); + rtl_mdio_write(hw, 0x14, 0x46dc); + rtl_mdio_write(hw, 0x14, 0x19dd); + rtl_mdio_write(hw, 0x14, 0xaf1a); + rtl_mdio_write(hw, 0x14, 0x37a0); + rtl_mdio_write(hw, 0x14, 0x012d); + rtl_mdio_write(hw, 0x14, 0xe082); + rtl_mdio_write(hw, 0x14, 0xa7ac); + rtl_mdio_write(hw, 0x14, 0x2013); + rtl_mdio_write(hw, 0x14, 0xe087); + rtl_mdio_write(hw, 0x14, 0xffe1); + rtl_mdio_write(hw, 0x14, 0x87fe); + rtl_mdio_write(hw, 0x14, 0xac27); + rtl_mdio_write(hw, 0x14, 0x05a1); + rtl_mdio_write(hw, 0x14, 0x0807); + rtl_mdio_write(hw, 0x14, 0xae0f); + rtl_mdio_write(hw, 0x14, 0xa107); + rtl_mdio_write(hw, 0x14, 0x02ae); + rtl_mdio_write(hw, 0x14, 0x0aef); + rtl_mdio_write(hw, 0x14, 0x4619); + rtl_mdio_write(hw, 0x14, 0x19dc); + rtl_mdio_write(hw, 0x14, 0x19dd); + rtl_mdio_write(hw, 0x14, 0xaf1a); + rtl_mdio_write(hw, 0x14, 0x37d8); + rtl_mdio_write(hw, 0x14, 0x19d9); + rtl_mdio_write(hw, 0x14, 0x19dc); + rtl_mdio_write(hw, 0x14, 0x19dd); + rtl_mdio_write(hw, 0x14, 0xaf1a); + rtl_mdio_write(hw, 0x14, 0x3719); + rtl_mdio_write(hw, 0x14, 0x19ae); + rtl_mdio_write(hw, 0x14, 0xcfbf); + rtl_mdio_write(hw, 0x14, 0x878a); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdc3c); + rtl_mdio_write(hw, 0x14, 0x0005); + rtl_mdio_write(hw, 0x14, 0xaaf5); + rtl_mdio_write(hw, 0x14, 0x0249); + rtl_mdio_write(hw, 0x14, 0xcaef); + rtl_mdio_write(hw, 0x14, 0x67d7); + rtl_mdio_write(hw, 0x14, 0x0014); + rtl_mdio_write(hw, 0x14, 0x0249); + rtl_mdio_write(hw, 0x14, 0xe5ad); + rtl_mdio_write(hw, 0x14, 0x50f7); + rtl_mdio_write(hw, 0x14, 0xd400); + rtl_mdio_write(hw, 0x14, 0x01bf); + rtl_mdio_write(hw, 0x14, 0x46a7); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0x98bf); + rtl_mdio_write(hw, 0x14, 0x465c); + rtl_mdio_write(hw, 0x14, 0x024a); + rtl_mdio_write(hw, 0x14, 0x5fd4); + rtl_mdio_write(hw, 0x14, 0x0003); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9c02); + rtl_mdio_write(hw, 0x14, 0x4498); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9902); + rtl_mdio_write(hw, 0x14, 0x4a5f); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x8d02); + rtl_mdio_write(hw, 0x14, 0x4a5f); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9002); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0xad28); + rtl_mdio_write(hw, 0x14, 0xf7bf); + rtl_mdio_write(hw, 0x14, 0x8796); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcad); + rtl_mdio_write(hw, 0x14, 0x28f7); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9302); + rtl_mdio_write(hw, 0x14, 0x4a5f); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9302); + rtl_mdio_write(hw, 0x14, 0x4a56); + rtl_mdio_write(hw, 0x14, 0xbf46); + rtl_mdio_write(hw, 0x14, 0x5c02); + rtl_mdio_write(hw, 0x14, 0x4a56); + rtl_mdio_write(hw, 0x14, 0xbf45); + rtl_mdio_write(hw, 0x14, 0x21af); + rtl_mdio_write(hw, 0x14, 0x020e); + rtl_mdio_write(hw, 0x14, 0xee82); + rtl_mdio_write(hw, 0x14, 0x5000); + rtl_mdio_write(hw, 0x14, 0x0284); + rtl_mdio_write(hw, 0x14, 0xdd02); + rtl_mdio_write(hw, 0x14, 0x8521); + rtl_mdio_write(hw, 0x14, 0x0285); + rtl_mdio_write(hw, 0x14, 0x36af); + rtl_mdio_write(hw, 0x14, 0x03d2); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfafb); + rtl_mdio_write(hw, 0x14, 0xef59); + rtl_mdio_write(hw, 0x14, 0xbf45); + rtl_mdio_write(hw, 0x14, 0x3002); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0x3c00); + rtl_mdio_write(hw, 0x14, 0x03aa); + rtl_mdio_write(hw, 0x14, 0x2cbf); + rtl_mdio_write(hw, 0x14, 0x8790); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcad); + rtl_mdio_write(hw, 0x14, 0x2823); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x9602); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0xad28); + rtl_mdio_write(hw, 0x14, 0x1a02); + rtl_mdio_write(hw, 0x14, 0x49ca); + rtl_mdio_write(hw, 0x14, 0xef67); + rtl_mdio_write(hw, 0x14, 0xd700); + rtl_mdio_write(hw, 0x14, 0x0202); + rtl_mdio_write(hw, 0x14, 0x49e5); + rtl_mdio_write(hw, 0x14, 0xad50); + rtl_mdio_write(hw, 0x14, 0xf7bf); + rtl_mdio_write(hw, 0x14, 0x8793); + rtl_mdio_write(hw, 0x14, 0x024a); + rtl_mdio_write(hw, 0x14, 0x5fbf); + rtl_mdio_write(hw, 0x14, 0x8793); + rtl_mdio_write(hw, 0x14, 0x024a); + rtl_mdio_write(hw, 0x14, 0x56ef); + rtl_mdio_write(hw, 0x14, 0x95ff); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xe080); + rtl_mdio_write(hw, 0x14, 0x15ad); + rtl_mdio_write(hw, 0x14, 0x2406); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x8702); + rtl_mdio_write(hw, 0x14, 0x4a56); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xe087); + rtl_mdio_write(hw, 0x14, 0xf9e1); + rtl_mdio_write(hw, 0x14, 0x87fa); + rtl_mdio_write(hw, 0x14, 0x1b10); + rtl_mdio_write(hw, 0x14, 0x9f1e); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xf900); + rtl_mdio_write(hw, 0x14, 0xe080); + rtl_mdio_write(hw, 0x14, 0x15ac); + rtl_mdio_write(hw, 0x14, 0x2606); + rtl_mdio_write(hw, 0x14, 0xee87); + rtl_mdio_write(hw, 0x14, 0xf700); + rtl_mdio_write(hw, 0x14, 0xae12); + rtl_mdio_write(hw, 0x14, 0x0286); + rtl_mdio_write(hw, 0x14, 0x9d02); + rtl_mdio_write(hw, 0x14, 0x8565); + rtl_mdio_write(hw, 0x14, 0x0285); + rtl_mdio_write(hw, 0x14, 0x9d02); + rtl_mdio_write(hw, 0x14, 0x8660); + rtl_mdio_write(hw, 0x14, 0xae04); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x87f9); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69fa); + rtl_mdio_write(hw, 0x14, 0xbf45); + rtl_mdio_write(hw, 0x14, 0x3002); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0xa103); + rtl_mdio_write(hw, 0x14, 0x22e0); + rtl_mdio_write(hw, 0x14, 0x87eb); + rtl_mdio_write(hw, 0x14, 0xe187); + rtl_mdio_write(hw, 0x14, 0xecef); + rtl_mdio_write(hw, 0x14, 0x64bf); + rtl_mdio_write(hw, 0x14, 0x876f); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdc1b); + rtl_mdio_write(hw, 0x14, 0x46aa); + rtl_mdio_write(hw, 0x14, 0x0abf); + rtl_mdio_write(hw, 0x14, 0x8772); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdc1b); + rtl_mdio_write(hw, 0x14, 0x46ab); + rtl_mdio_write(hw, 0x14, 0x06bf); + rtl_mdio_write(hw, 0x14, 0x876c); + rtl_mdio_write(hw, 0x14, 0x024a); + rtl_mdio_write(hw, 0x14, 0x5ffe); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xef59); + rtl_mdio_write(hw, 0x14, 0xf9bf); + rtl_mdio_write(hw, 0x14, 0x4530); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdca1); + rtl_mdio_write(hw, 0x14, 0x0310); + rtl_mdio_write(hw, 0x14, 0xe087); + rtl_mdio_write(hw, 0x14, 0xf7ac); + rtl_mdio_write(hw, 0x14, 0x2605); + rtl_mdio_write(hw, 0x14, 0x0285); + rtl_mdio_write(hw, 0x14, 0xc9ae); + rtl_mdio_write(hw, 0x14, 0x0d02); + rtl_mdio_write(hw, 0x14, 0x8613); + rtl_mdio_write(hw, 0x14, 0xae08); + rtl_mdio_write(hw, 0x14, 0xe287); + rtl_mdio_write(hw, 0x14, 0xf7f6); + rtl_mdio_write(hw, 0x14, 0x36e6); + rtl_mdio_write(hw, 0x14, 0x87f7); + rtl_mdio_write(hw, 0x14, 0xfdef); + rtl_mdio_write(hw, 0x14, 0x95fd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfafb); + rtl_mdio_write(hw, 0x14, 0xef79); + rtl_mdio_write(hw, 0x14, 0xfbbf); + rtl_mdio_write(hw, 0x14, 0x876f); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcef); + rtl_mdio_write(hw, 0x14, 0x64e2); + rtl_mdio_write(hw, 0x14, 0x87e9); + rtl_mdio_write(hw, 0x14, 0xe387); + rtl_mdio_write(hw, 0x14, 0xea1b); + rtl_mdio_write(hw, 0x14, 0x659e); + rtl_mdio_write(hw, 0x14, 0x10e4); + rtl_mdio_write(hw, 0x14, 0x87e9); + rtl_mdio_write(hw, 0x14, 0xe587); + rtl_mdio_write(hw, 0x14, 0xeae2); + rtl_mdio_write(hw, 0x14, 0x87f7); + rtl_mdio_write(hw, 0x14, 0xf636); + rtl_mdio_write(hw, 0x14, 0xe687); + rtl_mdio_write(hw, 0x14, 0xf7ae); + rtl_mdio_write(hw, 0x14, 0x19e2); + rtl_mdio_write(hw, 0x14, 0x87f7); + rtl_mdio_write(hw, 0x14, 0xf736); + rtl_mdio_write(hw, 0x14, 0xe687); + rtl_mdio_write(hw, 0x14, 0xf700); + rtl_mdio_write(hw, 0x14, 0x00ae); + rtl_mdio_write(hw, 0x14, 0x0200); + rtl_mdio_write(hw, 0x14, 0x0002); + rtl_mdio_write(hw, 0x14, 0x49ca); + rtl_mdio_write(hw, 0x14, 0xef57); + rtl_mdio_write(hw, 0x14, 0xe687); + rtl_mdio_write(hw, 0x14, 0xe7e7); + rtl_mdio_write(hw, 0x14, 0x87e8); + rtl_mdio_write(hw, 0x14, 0xffef); + rtl_mdio_write(hw, 0x14, 0x97ff); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfafb); + rtl_mdio_write(hw, 0x14, 0xef79); + rtl_mdio_write(hw, 0x14, 0xfbe2); + rtl_mdio_write(hw, 0x14, 0x87e7); + rtl_mdio_write(hw, 0x14, 0xe387); + rtl_mdio_write(hw, 0x14, 0xe8ef); + rtl_mdio_write(hw, 0x14, 0x65e2); + rtl_mdio_write(hw, 0x14, 0x87fb); + rtl_mdio_write(hw, 0x14, 0xe387); + rtl_mdio_write(hw, 0x14, 0xfcef); + rtl_mdio_write(hw, 0x14, 0x7502); + rtl_mdio_write(hw, 0x14, 0x49e5); + rtl_mdio_write(hw, 0x14, 0xac50); + rtl_mdio_write(hw, 0x14, 0x1abf); + rtl_mdio_write(hw, 0x14, 0x876f); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcef); + rtl_mdio_write(hw, 0x14, 0x64e2); + rtl_mdio_write(hw, 0x14, 0x87e9); + rtl_mdio_write(hw, 0x14, 0xe387); + rtl_mdio_write(hw, 0x14, 0xea1b); + rtl_mdio_write(hw, 0x14, 0x659e); + rtl_mdio_write(hw, 0x14, 0x16e4); + rtl_mdio_write(hw, 0x14, 0x87e9); + rtl_mdio_write(hw, 0x14, 0xe587); + rtl_mdio_write(hw, 0x14, 0xeaae); + rtl_mdio_write(hw, 0x14, 0x06bf); + rtl_mdio_write(hw, 0x14, 0x876c); + rtl_mdio_write(hw, 0x14, 0x024a); + rtl_mdio_write(hw, 0x14, 0x5fe2); + rtl_mdio_write(hw, 0x14, 0x87f7); + rtl_mdio_write(hw, 0x14, 0xf636); + rtl_mdio_write(hw, 0x14, 0xe687); + rtl_mdio_write(hw, 0x14, 0xf7ff); + rtl_mdio_write(hw, 0x14, 0xef97); + rtl_mdio_write(hw, 0x14, 0xfffe); + rtl_mdio_write(hw, 0x14, 0xfdfc); + rtl_mdio_write(hw, 0x14, 0x04f8); + rtl_mdio_write(hw, 0x14, 0xf9fa); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x6602); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0xad28); + rtl_mdio_write(hw, 0x14, 0x29bf); + rtl_mdio_write(hw, 0x14, 0x8763); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcef); + rtl_mdio_write(hw, 0x14, 0x54bf); + rtl_mdio_write(hw, 0x14, 0x8760); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdcac); + rtl_mdio_write(hw, 0x14, 0x290d); + rtl_mdio_write(hw, 0x14, 0xac28); + rtl_mdio_write(hw, 0x14, 0x05a3); + rtl_mdio_write(hw, 0x14, 0x020c); + rtl_mdio_write(hw, 0x14, 0xae10); + rtl_mdio_write(hw, 0x14, 0xa303); + rtl_mdio_write(hw, 0x14, 0x07ae); + rtl_mdio_write(hw, 0x14, 0x0ba3); + rtl_mdio_write(hw, 0x14, 0x0402); + rtl_mdio_write(hw, 0x14, 0xae06); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x6c02); + rtl_mdio_write(hw, 0x14, 0x4a5f); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8f9); + rtl_mdio_write(hw, 0x14, 0xfafb); + rtl_mdio_write(hw, 0x14, 0xef69); + rtl_mdio_write(hw, 0x14, 0xfae0); + rtl_mdio_write(hw, 0x14, 0x8015); + rtl_mdio_write(hw, 0x14, 0xad25); + rtl_mdio_write(hw, 0x14, 0x41d2); + rtl_mdio_write(hw, 0x14, 0x0002); + rtl_mdio_write(hw, 0x14, 0x86f3); + rtl_mdio_write(hw, 0x14, 0xe087); + rtl_mdio_write(hw, 0x14, 0xebe1); + rtl_mdio_write(hw, 0x14, 0x87ec); + rtl_mdio_write(hw, 0x14, 0x1b46); + rtl_mdio_write(hw, 0x14, 0xab26); + rtl_mdio_write(hw, 0x14, 0xd40b); + rtl_mdio_write(hw, 0x14, 0xff1b); + rtl_mdio_write(hw, 0x14, 0x46aa); + rtl_mdio_write(hw, 0x14, 0x1fac); + rtl_mdio_write(hw, 0x14, 0x3204); + rtl_mdio_write(hw, 0x14, 0xef32); + rtl_mdio_write(hw, 0x14, 0xae02); + rtl_mdio_write(hw, 0x14, 0xd304); + rtl_mdio_write(hw, 0x14, 0x0c31); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0xeb1a); + rtl_mdio_write(hw, 0x14, 0x93d8); + rtl_mdio_write(hw, 0x14, 0x19d9); + rtl_mdio_write(hw, 0x14, 0x1b46); + rtl_mdio_write(hw, 0x14, 0xab0e); + rtl_mdio_write(hw, 0x14, 0x19d8); + rtl_mdio_write(hw, 0x14, 0x19d9); + rtl_mdio_write(hw, 0x14, 0x1b46); + rtl_mdio_write(hw, 0x14, 0xaa06); + rtl_mdio_write(hw, 0x14, 0x12a2); + rtl_mdio_write(hw, 0x14, 0x08c9); + rtl_mdio_write(hw, 0x14, 0xae06); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x6902); + rtl_mdio_write(hw, 0x14, 0x4a5f); + rtl_mdio_write(hw, 0x14, 0xfeef); + rtl_mdio_write(hw, 0x14, 0x96ff); + rtl_mdio_write(hw, 0x14, 0xfefd); + rtl_mdio_write(hw, 0x14, 0xfc04); + rtl_mdio_write(hw, 0x14, 0xf8fb); + rtl_mdio_write(hw, 0x14, 0xef79); + rtl_mdio_write(hw, 0x14, 0xa200); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x876f); + rtl_mdio_write(hw, 0x14, 0xae33); + rtl_mdio_write(hw, 0x14, 0xa201); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x8772); + rtl_mdio_write(hw, 0x14, 0xae2b); + rtl_mdio_write(hw, 0x14, 0xa202); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x8775); + rtl_mdio_write(hw, 0x14, 0xae23); + rtl_mdio_write(hw, 0x14, 0xa203); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x8778); + rtl_mdio_write(hw, 0x14, 0xae1b); + rtl_mdio_write(hw, 0x14, 0xa204); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x877b); + rtl_mdio_write(hw, 0x14, 0xae13); + rtl_mdio_write(hw, 0x14, 0xa205); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x877e); + rtl_mdio_write(hw, 0x14, 0xae0b); + rtl_mdio_write(hw, 0x14, 0xa206); + rtl_mdio_write(hw, 0x14, 0x05bf); + rtl_mdio_write(hw, 0x14, 0x8781); + rtl_mdio_write(hw, 0x14, 0xae03); + rtl_mdio_write(hw, 0x14, 0xbf87); + rtl_mdio_write(hw, 0x14, 0x8402); + rtl_mdio_write(hw, 0x14, 0x44dc); + rtl_mdio_write(hw, 0x14, 0xef64); + rtl_mdio_write(hw, 0x14, 0xef97); + rtl_mdio_write(hw, 0x14, 0xfffc); + rtl_mdio_write(hw, 0x14, 0x04af); + rtl_mdio_write(hw, 0x14, 0x00ed); + rtl_mdio_write(hw, 0x14, 0x0220); + rtl_mdio_write(hw, 0x14, 0xa5f8); + rtl_mdio_write(hw, 0x14, 0xfaef); + rtl_mdio_write(hw, 0x14, 0x69bf); + rtl_mdio_write(hw, 0x14, 0x4554); + rtl_mdio_write(hw, 0x14, 0x0244); + rtl_mdio_write(hw, 0x14, 0xdce0); + rtl_mdio_write(hw, 0x14, 0x87ff); + rtl_mdio_write(hw, 0x14, 0x1f01); + rtl_mdio_write(hw, 0x14, 0x9e06); + rtl_mdio_write(hw, 0x14, 0xe587); + rtl_mdio_write(hw, 0x14, 0xff02); + rtl_mdio_write(hw, 0x14, 0x4b05); + rtl_mdio_write(hw, 0x14, 0xef96); + rtl_mdio_write(hw, 0x14, 0xfefc); + rtl_mdio_write(hw, 0x14, 0xaf03); + rtl_mdio_write(hw, 0x14, 0x8c54); + rtl_mdio_write(hw, 0x14, 0xa434); + rtl_mdio_write(hw, 0x14, 0x74a6); + rtl_mdio_write(hw, 0x14, 0x0022); + rtl_mdio_write(hw, 0x14, 0xa434); + rtl_mdio_write(hw, 0x14, 0x11b8); + rtl_mdio_write(hw, 0x14, 0x4222); + rtl_mdio_write(hw, 0x14, 0xb842); + rtl_mdio_write(hw, 0x14, 0xf0a2); + rtl_mdio_write(hw, 0x14, 0x00f0); + rtl_mdio_write(hw, 0x14, 0xa202); + rtl_mdio_write(hw, 0x14, 0xf0a2); + rtl_mdio_write(hw, 0x14, 0x04f0); + rtl_mdio_write(hw, 0x14, 0xa206); + rtl_mdio_write(hw, 0x14, 0xf0a2); + rtl_mdio_write(hw, 0x14, 0x08f0); + rtl_mdio_write(hw, 0x14, 0xa20a); + rtl_mdio_write(hw, 0x14, 0xf0a2); + rtl_mdio_write(hw, 0x14, 0x0cf0); + rtl_mdio_write(hw, 0x14, 0xa20e); + rtl_mdio_write(hw, 0x14, 0x55b8); + rtl_mdio_write(hw, 0x14, 0x20d9); + rtl_mdio_write(hw, 0x14, 0xc608); + rtl_mdio_write(hw, 0x14, 0xaac4); + rtl_mdio_write(hw, 0x14, 0x3000); + rtl_mdio_write(hw, 0x14, 0xc614); + rtl_mdio_write(hw, 0x14, 0x33c4); + rtl_mdio_write(hw, 0x14, 0x1a88); + rtl_mdio_write(hw, 0x14, 0xc42e); + rtl_mdio_write(hw, 0x14, 0x22c4); + rtl_mdio_write(hw, 0x14, 0x2e54); + rtl_mdio_write(hw, 0x14, 0xc41a); + rtl_mdio_write(hw, 0x13, 0xb818); + rtl_mdio_write(hw, 0x14, 0x1a01); + rtl_mdio_write(hw, 0x13, 0xb81a); + rtl_mdio_write(hw, 0x14, 0x020b); + rtl_mdio_write(hw, 0x13, 0xb81c); + rtl_mdio_write(hw, 0x14, 0x03ce); + rtl_mdio_write(hw, 0x13, 0xb81e); + rtl_mdio_write(hw, 0x14, 0x00e7); + rtl_mdio_write(hw, 0x13, 0xb846); + rtl_mdio_write(hw, 0x14, 0x0389); + rtl_mdio_write(hw, 0x13, 0xb848); + rtl_mdio_write(hw, 0x14, 0xffff); + rtl_mdio_write(hw, 0x13, 0xb84a); + rtl_mdio_write(hw, 0x14, 0xffff); + rtl_mdio_write(hw, 0x13, 0xb84c); + rtl_mdio_write(hw, 0x14, 0xffff); + rtl_mdio_write(hw, 0x13, 0xb832); + rtl_mdio_write(hw, 0x14, 0x001f); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x0000); + rtl_mdio_write(hw, 0x14, 0x0000); + rtl_mdio_write(hw, 0x1f, 0x0B82); + gphy_val = rtl_mdio_read(hw, 0x17); + gphy_val &= ~BIT_0; + rtl_mdio_write(hw, 0x17, gphy_val); + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8042); + rtl_mdio_write(hw, 0x14, 0x0000); + + rtl_clear_phy_mcu_patch_request(hw); +} + +void +hw_mac_mcu_config_8168h(struct rtl_hw *hw) +{ + if (hw->NotWrMcuPatchCode) + return; + + switch (hw->mcfg) { + case CFG_METHOD_29: + rtl8168_set_mac_mcu_8168h_1(hw); + break; + case CFG_METHOD_30: + case CFG_METHOD_37: + rtl8168_set_mac_mcu_8168h_2(hw); + break; + case CFG_METHOD_35: + rtl8168_set_mac_mcu_8168h_3(hw); + break; + case CFG_METHOD_36: + rtl8168_set_mac_mcu_8168h_4(hw); + break; + } +} + +void +hw_phy_mcu_config_8168h(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_29: + rtl8168_set_phy_mcu_8168h_1(hw); + break; + case CFG_METHOD_30: + case CFG_METHOD_37: + rtl8168_set_phy_mcu_8168h_2(hw); + break; + case CFG_METHOD_35: + rtl8168_set_phy_mcu_8168h_3(hw); + break; + case CFG_METHOD_36: + break; + } +} diff --git a/drivers/net/r8169/base/rtl8168m.c b/drivers/net/r8169/base/rtl8168m.c new file mode 100644 index 0000000000..2b544c9fe8 --- /dev/null +++ b/drivers/net/r8169/base/rtl8168m.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include "../r8169_compat.h" +#include "../r8169_hw.h" +#include "../r8169_phy.h" +#include "rtl8168h.h" + +/* For RTL8168M, CFG_METHOD_37 */ + +const struct rtl_hw_ops rtl8168m_ops = { + .hw_config = hw_config_8168h, + .hw_init_rxcfg = hw_init_rxcfg_8168h, + .hw_ephy_config = hw_ephy_config_8168h, + .hw_phy_config = hw_phy_config_8168h, + .hw_mac_mcu_config = hw_mac_mcu_config_8168h, + .hw_phy_mcu_config = hw_phy_mcu_config_8168h, +}; diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build index d1e65377a3..720d79acff 100644 --- a/drivers/net/r8169/meson.build +++ b/drivers/net/r8169/meson.build @@ -18,4 +18,13 @@ sources = files( 'base/rtl8126a.c', 'base/rtl8126a_mcu.c', 'base/rtl8168kb.c', + 'base/rtl8168g.c', + 'base/rtl8168g_mcu.c', + 'base/rtl8168h.c', + 'base/rtl8168h_mcu.c', + 'base/rtl8168ep.c', + 'base/rtl8168ep_mcu.c', + 'base/rtl8168fp.c', + 'base/rtl8168fp_mcu.c', + 'base/rtl8168m.c', ) \ No newline at end of file diff --git a/drivers/net/r8169/r8169_compat.h b/drivers/net/r8169/r8169_compat.h index f5b953b098..631acffb64 100644 --- a/drivers/net/r8169/r8169_compat.h +++ b/drivers/net/r8169/r8169_compat.h @@ -355,16 +355,16 @@ enum RTL_register_content { /* Config3 register */ Isolate_en = (1UL << 12), /* Isolate enable */ MagicPacket = (1UL << 5), /* Wake up when receives a magic packet */ - LinkUp = (1UL << 4), /* This bit is reserved in RTL8125B. */ + LinkUp = (1UL << 4), /* Wake up when the cable connection is re-established */ - ECRCEN = (1UL << 3), /* This bit is reserved in RTL8125B. */ - Jumbo_En0 = (1UL << 2), /* This bit is reserved in RTL8125B. */ - RDY_TO_L23 = (1UL << 1), /* This bit is reserved in RTL8125B. */ - Beacon_en = (1UL << 0), /* This bit is reserved in RTL8125B. */ + ECRCEN = (1UL << 3), + Jumbo_En0 = (1UL << 2), + RDY_TO_L23 = (1UL << 1), + Beacon_en = (1UL << 0), /* Config4 register */ - Jumbo_En1 = (1UL << 1), /* This bit is reserved in RTL8125B. */ + Jumbo_En1 = (1UL << 1), /* Config5 register */ BWF = (1UL << 6), /* Accept broadcast wakeup frame */ @@ -380,8 +380,8 @@ enum RTL_register_content { Force_halfdup = (1UL << 12), Force_rxflow_en = (1UL << 11), Force_txflow_en = (1UL << 10), - Cxpl_dbg_sel = (1UL << 9), /* This bit is reserved in RTL8125B. */ - ASF = (1UL << 8), /* This bit is reserved in RTL8125C. */ + Cxpl_dbg_sel = (1UL << 9), + ASF = (1UL << 8), PktCntrDisable = (1UL << 7), RxVlan = (1UL << 6), RxChkSum = (1UL << 5), @@ -508,6 +508,11 @@ enum RTL_chipset_name { RTL8125BP, RTL8125D, RTL8126A, + RTL8168EP, + RTL8168FP, + RTL8168G, + RTL8168H, + RTL8168M, UNKNOWN }; @@ -540,6 +545,8 @@ enum RTL_chipset_name { #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ #define Rx_Fetch_Number_8 (1 << 30) #define Rx_Close_Multiple (1 << 21) +#define RxEarly_off_V2 (1 << 11) +#define Rx_Single_fetch_V2 (1 << 14) #define TRUE 1 #define FALSE 0 @@ -567,8 +574,6 @@ enum RTL_chipset_name { #define ADVERTISE_5000_HALF 0x0100 /* NOT used, just FYI */ #define ADVERTISE_5000_FULL 0x0200 -#define MAC_ADDR_LEN RTE_ETHER_ADDR_LEN - #define RTL_MAX_TX_DESC 4096 #define RTL_MAX_RX_DESC 4096 #define RTL_MIN_TX_DESC 64 diff --git a/drivers/net/r8169/r8169_dash.c b/drivers/net/r8169/r8169_dash.c index 21684b19eb..c26d7a5280 100644 --- a/drivers/net/r8169/r8169_dash.c +++ b/drivers/net/r8169/r8169_dash.c @@ -48,7 +48,7 @@ rtl_get_dash_fw_ver(struct rtl_hw *hw) { u32 ver = 0xffffffff; - if (HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw) == FALSE) + if (!HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw)) goto exit; ver = rtl_ocp_read(hw, OCP_REG_FIRMWARE_MAJOR_VERSION, 4); @@ -63,46 +63,165 @@ _rtl_check_dash(struct rtl_hw *hw) if (!hw->AllowAccessDashOcp) return 0; - if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) { + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw) || + HW_DASH_SUPPORT_TYPE_4(hw)) { if (rtl_ocp_read(hw, 0x128, 1) & BIT_0) return 1; + else + return 0; + } else if (HW_DASH_SUPPORT_TYPE_1(hw)) { + if (rtl_ocp_read(hw, 0x10, 2) & 0x00008000) + return 1; + else + return 0; + } else { + return 0; } - - return 0; } int rtl_check_dash(struct rtl_hw *hw) { - u32 ver; + int dash_enabled; + u32 fw_ver; - if (_rtl_check_dash(hw)) { - ver = rtl_get_dash_fw_ver(hw); - if (!(ver == 0 || ver == 0xffffffff)) - return 1; + dash_enabled = _rtl_check_dash(hw); + + if (!dash_enabled) + goto exit; + + if (!HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(hw)) + goto exit; + + fw_ver = rtl_get_dash_fw_ver(hw); + if (fw_ver == 0 || fw_ver == 0xffffffff) + dash_enabled = 0; +exit: + return dash_enabled; +} + +static u32 +rtl8168_csi_to_cmac_r32(struct rtl_hw *hw) +{ + u32 cmd; + int i; + u32 value = 0; + + cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift | 0xf9; + + cmd |= 1 << 16; + + RTL_W32(hw, CSIAR, cmd); + + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); + + /* Check if the RTL8168 has completed CSI read */ + if (RTL_R32(hw, CSIAR) & CSIAR_Flag) { + value = RTL_R32(hw, CSIDR); + break; + } } - return 0; + rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); + + return value; +} + +static u8 +rtl8168_csi_to_cmac_r8(struct rtl_hw *hw, u32 reg) +{ + u32 mask, value1 = 0; + u8 val_shift, value2 = 0; + + val_shift = reg - 0xf8; + + if (val_shift == 0) + mask = 0xFF; + else if (val_shift == 1) + mask = 0xFF00; + else if (val_shift == 2) + mask = 0xFF0000; + else if (val_shift == 3) + mask = 0xFF000000; + + value1 = rtl8168_csi_to_cmac_r32(hw) & mask; + value2 = value1 >> (val_shift * 8); + + return value2; } static void -rtl8125_dash2_disable_tx(struct rtl_hw *hw) +rtl8168_csi_to_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value) { - u16 wait_cnt = 0; - u8 tmp_uchar; + int i; + u8 val_shift; + u32 value32, cmd, mask; - if (!HW_DASH_SUPPORT_CMAC(hw)) - return; + val_shift = reg - 0xf8; - if (!hw->DASH) - return; + if (val_shift == 0) + mask = 0xFF; + else if (val_shift == 1) + mask = 0xFF00; + else if (val_shift == 2) + mask = 0xFF0000; + else if (val_shift == 3) + mask = 0xFF000000; + + value32 = rtl8168_csi_to_cmac_r32(hw) & ~mask; + value32 |= value << (val_shift * 8); + RTL_W32(hw, CSIDR, value32); + + cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift | 0xf9; + + cmd |= 1 << 16; + + RTL_W32(hw, CSIAR, cmd); + + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); + + /* Check if the RTL8168 has completed CSI write */ + if (!(RTL_R32(hw, CSIAR) & CSIAR_Flag)) + break; + } + + rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); +} + +static void +rtl_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value) +{ + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) + RTL_CMAC_W8(hw, reg, value); + else if (HW_DASH_SUPPORT_TYPE_3(hw)) + rtl8168_csi_to_cmac_w8(hw, reg, value); +} + +static u8 +rtl_cmac_r8(struct rtl_hw *hw, u32 reg) +{ + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) + return RTL_CMAC_R8(hw, reg); + else if (HW_DASH_SUPPORT_TYPE_3(hw)) + return rtl8168_csi_to_cmac_r8(hw, reg); + else + return 0; +} + +static void +rtl_dash2_disable_tx(struct rtl_hw *hw) +{ + u16 wait_cnt = 0; + u8 tmp_uchar; /* Disable oob Tx */ - RTL_CMAC_W8(hw, CMAC_IBCR2, RTL_CMAC_R8(hw, CMAC_IBCR2) & ~BIT_0); + rtl_cmac_w8(hw, CMAC_IBCR2, rtl_cmac_r8(hw, CMAC_IBCR2) & ~BIT_0); /* Wait oob Tx disable */ do { - tmp_uchar = RTL_CMAC_R8(hw, CMAC_IBISR0); + tmp_uchar = rtl_cmac_r8(hw, CMAC_IBISR0); if (tmp_uchar & ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE) break; @@ -111,30 +230,27 @@ rtl8125_dash2_disable_tx(struct rtl_hw *hw) } while (wait_cnt < 2000); /* Clear ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE */ - RTL_CMAC_W8(hw, CMAC_IBISR0, RTL_CMAC_R8(hw, CMAC_IBISR0) | + rtl_cmac_w8(hw, CMAC_IBISR0, rtl_cmac_r8(hw, CMAC_IBISR0) | ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE); } static void -rtl8125_dash2_disable_rx(struct rtl_hw *hw) +rtl_dash2_disable_rx(struct rtl_hw *hw) { - if (!HW_DASH_SUPPORT_CMAC(hw)) - return; - - if (!hw->DASH) - return; - - RTL_CMAC_W8(hw, CMAC_IBCR0, RTL_CMAC_R8(hw, CMAC_IBCR0) & ~BIT_0); + rtl_cmac_w8(hw, CMAC_IBCR0, rtl_cmac_r8(hw, CMAC_IBCR0) & ~BIT_0); } void -rtl8125_dash2_disable_txrx(struct rtl_hw *hw) +rtl_dash2_disable_txrx(struct rtl_hw *hw) { if (!HW_DASH_SUPPORT_CMAC(hw)) return; - rtl8125_dash2_disable_tx(hw); - rtl8125_dash2_disable_rx(hw); + if (!hw->DASH) + return; + + rtl_dash2_disable_tx(hw); + rtl_dash2_disable_rx(hw); } static void @@ -154,7 +270,7 @@ rtl8125_notify_dash_oob_cmac(struct rtl_hw *hw, u32 cmd) static void rtl8125_notify_dash_oob_ipc2(struct rtl_hw *hw, u32 cmd) { - if (HW_DASH_SUPPORT_TYPE_4(hw) == FALSE) + if (!HW_DASH_SUPPORT_TYPE_4(hw)) return; rtl_ocp_write(hw, IB2SOC_DATA, 4, cmd); @@ -179,20 +295,36 @@ rtl8125_notify_dash_oob(struct rtl_hw *hw, u32 cmd) } static int -rtl8125_wait_dash_fw_ready(struct rtl_hw *hw) +rtl_wait_dash_fw_ready(struct rtl_hw *hw) { int rc = -1; int timeout; + if (!HW_DASH_SUPPORT_DASH(hw)) + goto out; + if (!hw->DASH) goto out; - for (timeout = 0; timeout < 10; timeout++) { - rte_delay_ms(10); - if (rtl_ocp_read(hw, 0x124, 1) & BIT_0) { - rc = 1; - goto out; + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw) || + HW_DASH_SUPPORT_TYPE_4(hw)) { + for (timeout = 0; timeout < 10; timeout++) { + rte_delay_ms(10); + if (rtl_ocp_read(hw, 0x124, 1) & BIT_0) { + rc = 1; + goto out; + } } + } else if (HW_DASH_SUPPORT_TYPE_1(hw)) { + for (timeout = 0; timeout < 10; timeout++) { + rte_delay_ms(10); + if (rtl_ocp_read(hw, 0x10, 2) & BIT_11) { + rc = 1; + goto out; + } + } + } else { + goto out; } rc = 0; @@ -201,7 +333,7 @@ rtl8125_wait_dash_fw_ready(struct rtl_hw *hw) return rc; } -void +static void rtl8125_driver_start(struct rtl_hw *hw) { if (!hw->AllowAccessDashOcp) @@ -209,19 +341,242 @@ rtl8125_driver_start(struct rtl_hw *hw) rtl8125_notify_dash_oob(hw, OOB_CMD_DRIVER_START); - rtl8125_wait_dash_fw_ready(hw); + rtl_wait_dash_fw_ready(hw); +} + +static void +rtl8168_clear_and_set_other_fun_pci_bit(struct rtl_hw *hw, u8 multi_fun_sel_bit, + u32 addr, u32 clearmask, u32 setmask) +{ + u32 tmp_ulong; + + tmp_ulong = rtl_csi_other_fun_read(hw, multi_fun_sel_bit, addr); + tmp_ulong &= ~clearmask; + tmp_ulong |= setmask; + rtl_csi_other_fun_write(hw, multi_fun_sel_bit, addr, tmp_ulong); +} + +static void +rtl8168_other_fun_dev_pci_setting(struct rtl_hw *hw, u32 addr, u32 clearmask, + u32 setmask, u8 multi_fun_sel_bit) +{ + u32 tmp_ulong; + u8 i; + u8 fun_bit; + u8 set_other_fun; + + for (i = 0; i < 8; i++) { + fun_bit = (1 << i); + if (!(fun_bit & multi_fun_sel_bit)) + continue; + + set_other_fun = TRUE; + + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + /* + * 0: UMAC, 1: TCR1, 2: TCR2, 3: KCS, + * 4: EHCI(Control by EHCI Driver) + */ + if (i < 5) { + tmp_ulong = rtl_csi_other_fun_read(hw, i, 0x00); + if (tmp_ulong == 0xFFFFFFFF) + set_other_fun = TRUE; + else + set_other_fun = FALSE; + } + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + /* + * 0: BMC, 1: NIC, 2: TCR, 3: VGA / PCIE_TO_USB, + * 4: EHCI, 5: WIFI, 6: WIFI, 7: KCS + */ + if (i == 5 || i == 6) { + if (hw->DASH) { + tmp_ulong = rtl_ocp_read(hw, 0x184, 4); + if (tmp_ulong & BIT_26) + set_other_fun = FALSE; + else + set_other_fun = TRUE; + } + } else { /* Function 0/1/2/3/4/7 */ + tmp_ulong = rtl_csi_other_fun_read(hw, i, 0x00); + if (tmp_ulong == 0xFFFFFFFF) + set_other_fun = TRUE; + else + set_other_fun = FALSE; + } + break; + default: + return; + } + + if (set_other_fun) + rtl8168_clear_and_set_other_fun_pci_bit(hw, i, addr, + clearmask, setmask); + } +} + +static void +rtl8168_set_dash_other_fun_dev_state_change(struct rtl_hw *hw, u8 dev_state, + u8 multi_fun_sel_bit) +{ + u32 clearmask; + u32 setmask; + + if (dev_state == 0) { + /* Goto D0 */ + clearmask = (BIT_0 | BIT_1); + setmask = 0; + + rtl8168_other_fun_dev_pci_setting(hw, 0x44, clearmask, setmask, + multi_fun_sel_bit); + } else { + /* Goto D3 */ + clearmask = 0; + setmask = (BIT_0 | BIT_1); + + rtl8168_other_fun_dev_pci_setting(hw, 0x44, clearmask, setmask, + multi_fun_sel_bit); + } +} + +static void +rtl8168_set_dash_other_fun_dev_aspm_clkreq(struct rtl_hw *hw, u8 aspm_val, + u8 clkreq_en, u8 multi_fun_sel_bit) +{ + u32 clearmask; + u32 setmask; + + aspm_val &= (BIT_0 | BIT_1); + clearmask = (BIT_0 | BIT_1 | BIT_8); + setmask = aspm_val; + if (clkreq_en) + setmask |= BIT_8; + + rtl8168_other_fun_dev_pci_setting(hw, 0x80, clearmask, setmask, + multi_fun_sel_bit); +} + +static void +rtl8168_oob_notify(struct rtl_hw *hw, u8 cmd) +{ + rtl_eri_write(hw, 0xE8, 1, cmd, ERIAR_ExGMAC); + + rtl_ocp_write(hw, 0x30, 1, 0x01); +} + +static void +rtl8168_driver_start(struct rtl_hw *hw) +{ + u32 tmp_value; + + /* Change other device state to D0. */ + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + rtl8168_set_dash_other_fun_dev_aspm_clkreq(hw, 3, 1, 0x1E); + rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0x1E); + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + rtl8168_set_dash_other_fun_dev_aspm_clkreq(hw, 3, 1, 0xFC); + rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0xFC); + break; + } + + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw)) { + rtl_ocp_write(hw, 0x180, 1, OOB_CMD_DRIVER_START); + tmp_value = rtl_ocp_read(hw, 0x30, 1); + tmp_value |= BIT_0; + rtl_ocp_write(hw, 0x30, 1, tmp_value); + } else { + rtl8168_oob_notify(hw, OOB_CMD_DRIVER_START); + } + + rtl_wait_dash_fw_ready(hw); } void +rtl_driver_start(struct rtl_hw *hw) +{ + if (rtl_is_8125(hw)) + rtl8125_driver_start(hw); + else + rtl8168_driver_start(hw); +} + +static void +rtl8168_driver_stop(struct rtl_hw *hw) +{ + u32 tmp_value; + + if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw)) { + rtl_dash2_disable_txrx(hw); + + rtl_ocp_write(hw, 0x180, 1, OOB_CMD_DRIVER_STOP); + tmp_value = rtl_ocp_read(hw, 0x30, 1); + tmp_value |= BIT_0; + rtl_ocp_write(hw, 0x30, 1, tmp_value); + } else if (HW_DASH_SUPPORT_TYPE_1(hw)) { + rtl8168_oob_notify(hw, OOB_CMD_DRIVER_STOP); + } + + rtl_wait_dash_fw_ready(hw); + + /* Change other device state to D3. */ + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0x0E); + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + rtl8168_set_dash_other_fun_dev_state_change(hw, 3, 0xFD); + break; + } +} + +static void rtl8125_driver_stop(struct rtl_hw *hw) { if (!hw->AllowAccessDashOcp) return; if (HW_DASH_SUPPORT_CMAC(hw)) - rtl8125_dash2_disable_txrx(hw); + rtl_dash2_disable_txrx(hw); rtl8125_notify_dash_oob(hw, OOB_CMD_DRIVER_STOP); - rtl8125_wait_dash_fw_ready(hw); + rtl_wait_dash_fw_ready(hw); +} + +void +rtl_driver_stop(struct rtl_hw *hw) +{ + if (rtl_is_8125(hw)) + rtl8125_driver_stop(hw); + else + rtl8168_driver_stop(hw); +} + +bool +rtl8168_check_dash_other_fun_present(struct rtl_hw *hw) +{ + /* Check if func 2 exist */ + if (rtl_csi_other_fun_read(hw, 2, 0x00) != 0xffffffff) + return true; + else + return false; } diff --git a/drivers/net/r8169/r8169_dash.h b/drivers/net/r8169/r8169_dash.h index daa572b456..47c5d6906e 100644 --- a/drivers/net/r8169/r8169_dash.h +++ b/drivers/net/r8169/r8169_dash.h @@ -50,8 +50,10 @@ bool rtl_is_allow_access_dash_ocp(struct rtl_hw *hw); int rtl_check_dash(struct rtl_hw *hw); -void rtl8125_driver_start(struct rtl_hw *hw); -void rtl8125_driver_stop(struct rtl_hw *hw); -void rtl8125_dash2_disable_txrx(struct rtl_hw *hw); +void rtl_driver_start(struct rtl_hw *hw); +void rtl_driver_stop(struct rtl_hw *hw); +void rtl_dash2_disable_txrx(struct rtl_hw *hw); + +bool rtl8168_check_dash_other_fun_present(struct rtl_hw *hw); #endif /* R8169_DASH_H */ diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c index c0cac6e7d8..e2ea9435fe 100644 --- a/drivers/net/r8169/r8169_ethdev.c +++ b/drivers/net/r8169/r8169_ethdev.c @@ -26,12 +26,12 @@ #include "r8169_hw.h" #include "r8169_dash.h" -static int rtl_dev_configure(struct rte_eth_dev *dev); +static int rtl_dev_configure(struct rte_eth_dev *dev __rte_unused); static int rtl_dev_start(struct rte_eth_dev *dev); static int rtl_dev_stop(struct rte_eth_dev *dev); static int rtl_dev_reset(struct rte_eth_dev *dev); static int rtl_dev_close(struct rte_eth_dev *dev); -static int rtl_dev_link_update(struct rte_eth_dev *dev, int wait); +static int rtl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused); static int rtl_dev_set_link_up(struct rte_eth_dev *dev); static int rtl_dev_set_link_down(struct rte_eth_dev *dev); static int rtl_dev_infos_get(struct rte_eth_dev *dev, @@ -55,6 +55,7 @@ static const struct rte_pci_id pci_id_r8169_map[] = { { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8162) }, { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8126) }, { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x5000) }, + { RTE_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168) }, {.vendor_id = 0, /* sentinel */ }, }; @@ -116,15 +117,23 @@ static void rtl_disable_intr(struct rtl_hw *hw) { PMD_INIT_FUNC_TRACE(); - RTL_W32(hw, IMR0_8125, 0x0000); - RTL_W32(hw, ISR0_8125, RTL_R32(hw, ISR0_8125)); + if (rtl_is_8125(hw)) { + RTL_W32(hw, IMR0_8125, 0x0000); + RTL_W32(hw, ISR0_8125, RTL_R32(hw, ISR0_8125)); + } else { + RTL_W16(hw, IntrMask, 0x0000); + RTL_W16(hw, IntrStatus, RTL_R16(hw, IntrStatus)); + } } static void rtl_enable_intr(struct rtl_hw *hw) { PMD_INIT_FUNC_TRACE(); - RTL_W32(hw, IMR0_8125, LinkChg); + if (rtl_is_8125(hw)) + RTL_W32(hw, IMR0_8125, LinkChg); + else + RTL_W16(hw, IntrMask, LinkChg); } static int @@ -134,10 +143,35 @@ _rtl_setup_link(struct rte_eth_dev *dev) struct rtl_hw *hw = &adapter->hw; u64 adv = 0; u32 *link_speeds = &dev->data->dev_conf.link_speeds; + unsigned int speed_mode; /* Setup link speed and duplex */ if (*link_speeds == RTE_ETH_LINK_SPEED_AUTONEG) { - rtl_set_link_option(hw, AUTONEG_ENABLE, SPEED_5000, DUPLEX_FULL, rtl_fc_full); + switch (hw->mcfg) { + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + speed_mode = SPEED_2500; + break; + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + speed_mode = SPEED_5000; + break; + default: + speed_mode = SPEED_1000; + break; + } + + rtl_set_link_option(hw, AUTONEG_ENABLE, speed_mode, DUPLEX_FULL, + rtl_fc_full); } else if (*link_speeds != 0) { if (*link_speeds & ~(RTE_ETH_LINK_SPEED_10M_HD | RTE_ETH_LINK_SPEED_10M | RTE_ETH_LINK_SPEED_100M_HD | RTE_ETH_LINK_SPEED_100M | @@ -225,6 +259,18 @@ rtl_setup_link(struct rte_eth_dev *dev) return 0; } +/* Set PCI configuration space offset 0x79 to setting */ +static void +set_offset79(struct rte_pci_device *pdev, u8 setting) +{ + u8 device_control; + + PCI_READ_CONFIG_BYTE(pdev, &device_control, 0x79); + device_control &= ~0x70; + device_control |= setting; + PCI_WRITE_CONFIG_BYTE(pdev, &device_control, 0x79); +} + /* * Configure device link speed and setup link. * It returns 0 on success. @@ -249,6 +295,28 @@ rtl_dev_start(struct rte_eth_dev *dev) rtl_hw_config(hw); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + set_offset79(pci_dev, 0x40); + break; + } + /* Initialize transmission unit */ rtl_tx_init(dev); @@ -295,8 +363,19 @@ rtl_dev_stop(struct rte_eth_dev *dev) rtl_nic_reset(hw); switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting); break; } @@ -333,8 +412,19 @@ rtl_dev_set_link_down(struct rte_eth_dev *dev) /* mcu pme intr masks */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mac_ocp_write(hw, 0xE00A, hw->mcu_pme_setting & ~(BIT_11 | BIT_14)); break; } @@ -515,20 +605,63 @@ rtl_dev_link_update(struct rte_eth_dev *dev, int wait __rte_unused) if (status & FullDup) { link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; - if (hw->mcfg == CFG_METHOD_2) + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | - (BIT_24 | BIT_25)) & ~BIT_19); - + (BIT_24 | BIT_25)) & ~BIT_19); + break; + } } else { link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; - if (hw->mcfg == CFG_METHOD_2) + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | BIT_25) & - ~(BIT_19 | BIT_24)); + ~(BIT_19 | BIT_24)); + break; + } } - if (status & _5000bpsF) + /* + * The PHYstatus register for the RTL8168 is 8 bits, + * while for the RTL8125 and RTL8126, it is 16 bits. + */ + if (status & _5000bpsF && rtl_is_8125(hw)) speed = 5000; - else if (status & _2500bpsF) + else if (status & _2500bpsF && rtl_is_8125(hw)) speed = 2500; else if (status & _1000bpsF) speed = 1000; @@ -556,7 +689,10 @@ rtl_dev_interrupt_handler(void *param) struct rtl_hw *hw = &adapter->hw; uint32_t intr; - intr = RTL_R32(hw, ISR0_8125); + if (rtl_is_8125(hw)) + intr = RTL_R32(hw, ISR0_8125); + else + intr = RTL_R16(hw, IntrStatus); /* Clear all cause mask */ rtl_disable_intr(hw); @@ -586,7 +722,7 @@ rtl_dev_close(struct rte_eth_dev *dev) return 0; if (HW_DASH_SUPPORT_DASH(hw)) - rtl8125_driver_stop(hw); + rtl_driver_stop(hw); ret_stp = rtl_dev_stop(dev); @@ -656,14 +792,15 @@ rtl_dev_init(struct rte_eth_dev *dev) dev->tx_pkt_burst = &rtl_xmit_pkts; dev->rx_pkt_burst = &rtl_recv_pkts; - /* For secondary processes, the primary process has done all the work */ + /* For secondary processes, the primary process has done all the work. */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) { if (dev->data->scattered_rx) dev->rx_pkt_burst = &rtl_recv_scattered_pkts; return 0; } - hw->mmio_addr = (u8 *)pci_dev->mem_resource[2].addr; /* RTL8169 uses BAR2 */ + /* R8169 uses BAR2 */ + hw->mmio_addr = (u8 *)pci_dev->mem_resource[2].addr; rtl_get_mac_version(hw, pci_dev); diff --git a/drivers/net/r8169/r8169_ethdev.h b/drivers/net/r8169/r8169_ethdev.h index c5fd465ff0..0de91045fa 100644 --- a/drivers/net/r8169/r8169_ethdev.h +++ b/drivers/net/r8169/r8169_ethdev.h @@ -15,6 +15,7 @@ struct rtl_hw; struct rtl_hw_ops { + void (*hw_config)(struct rtl_hw *hw); void (*hw_init_rxcfg)(struct rtl_hw *hw); void (*hw_ephy_config)(struct rtl_hw *hw); void (*hw_phy_config)(struct rtl_hw *hw); @@ -36,13 +37,12 @@ struct rtl_hw { u8 *mmio_addr; u8 *cmac_ioaddr; /* cmac memory map physical address */ u8 chipset_name; - u8 efuse_ver; u8 HwIcVerUnknown; u32 mcfg; u32 mtu; u8 HwSuppIntMitiVer; u16 cur_page; - u8 mac_addr[MAC_ADDR_LEN]; + u8 mac_addr[RTE_ETHER_ADDR_LEN]; u32 rx_buf_sz; struct rtl_counters *tally_vaddr; @@ -53,9 +53,9 @@ struct rtl_hw { u8 HwSuppMacMcuVer; u16 MacMcuPageSize; - u8 NotWrRamCodeToMicroP; - u8 HwHasWrRamCodeToMicroP; - u8 HwSuppCheckPhyDisableModeVer; + u8 NotWrRamCodeToMicroP; + u8 HwHasWrRamCodeToMicroP; + u8 HwSuppCheckPhyDisableModeVer; u16 sw_ram_code_ver; u16 hw_ram_code_ver; @@ -68,7 +68,7 @@ struct rtl_hw { u32 HwSuppMaxPhyLinkSpeed; - u8 HwSuppNowIsOobVer; + u8 HwSuppNowIsOobVer; u16 mcu_pme_setting; @@ -86,6 +86,8 @@ struct rtl_hw { u8 DASH; u8 HwSuppOcpChannelVer; u8 AllowAccessDashOcp; + u8 HwPkgDet; + u8 HwSuppSerDesPhyVer; }; struct rtl_sw_stats { @@ -108,6 +110,24 @@ struct rtl_adapter { #define R8169_LINK_CHECK_TIMEOUT 50 /* 10s */ #define R8169_LINK_CHECK_INTERVAL 200 /* ms */ +#define PCI_READ_CONFIG_BYTE(dev, val, where) \ + rte_pci_read_config(dev, val, 1, where) + +#define PCI_READ_CONFIG_WORD(dev, val, where) \ + rte_pci_read_config(dev, val, 2, where) + +#define PCI_READ_CONFIG_DWORD(dev, val, where) \ + rte_pci_read_config(dev, val, 4, where) + +#define PCI_WRITE_CONFIG_BYTE(dev, val, where) \ + rte_pci_write_config(dev, val, 1, where) + +#define PCI_WRITE_CONFIG_WORD(dev, val, where) \ + rte_pci_write_config(dev, val, 2, where) + +#define PCI_WRITE_CONFIG_DWORD(dev, val, where) \ + rte_pci_write_config(dev, val, 4, where) + int rtl_rx_init(struct rte_eth_dev *dev); int rtl_tx_init(struct rte_eth_dev *dev); diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c index 63a20a733e..21a599dfc6 100644 --- a/drivers/net/r8169/r8169_hw.c +++ b/drivers/net/r8169/r8169_hw.c @@ -77,6 +77,12 @@ rtl_eri_read_with_oob_base_address(struct rtl_hw *hw, int addr, int len, return value2; } +u32 +rtl_eri_read(struct rtl_hw *hw, int addr, int len, int type) +{ + return rtl_eri_read_with_oob_base_address(hw, addr, len, type, 0); +} + static int rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr, int len, u32 value, int type, @@ -144,6 +150,13 @@ rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr, return 0; } +int +rtl_eri_write(struct rtl_hw *hw, int addr, int len, u32 value, int type) +{ + return rtl_eri_write_with_oob_base_address(hw, addr, len, value, type, + NO_BASE_ADDRESS); +} + static u32 rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len, const u32 base_address) @@ -152,17 +165,122 @@ rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len, base_address); } +static u32 +rtl8168_real_ocp_read(struct rtl_hw *hw, u16 addr, u8 len) +{ + int i, val_shift, shift = 0; + u32 value1, value2, mask; + + value1 = 0; + value2 = 0; + + if (len > 4 || len <= 0) + return -1; + + while (len > 0) { + val_shift = addr % 4; + addr = addr & ~0x3; + + RTL_W32(hw, OCPAR, (0x0F << 12) | (addr & 0xFFF)); + + for (i = 0; i < 20; i++) { + rte_delay_us(100); + if (RTL_R32(hw, OCPAR) & OCPAR_Flag) + break; + } + + if (len == 1) + mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF; + else if (len == 2) + mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF; + else if (len == 3) + mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF; + else + mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF; + + value1 = RTL_R32(hw, OCPDR) & mask; + value2 |= (value1 >> val_shift * 8) << shift * 8; + + if (len <= 4 - val_shift) { + len = 0; + } else { + len -= (4 - val_shift); + shift = 4 - val_shift; + addr += 4; + } + } + + rte_delay_us(20); + + return value2; +} + +static int +rtl8168_real_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value) +{ + int i, val_shift, shift = 0; + u32 mask, value1 = 0; + + if (len > 4 || len <= 0) + return -1; + + while (len > 0) { + val_shift = addr % 4; + addr = addr & ~0x3; + + if (len == 1) + mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF; + else if (len == 2) + mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF; + else if (len == 3) + mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF; + else + mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF; + + value1 = rtl_ocp_read(hw, addr, 4) & ~mask; + value1 |= ((value << val_shift * 8) >> shift * 8); + + RTL_W32(hw, OCPDR, value1); + RTL_W32(hw, OCPAR, OCPAR_Flag | (0x0F << 12) | (addr & 0xFFF)); + + for (i = 0; i < 10; i++) { + rte_delay_us(100); + + /* Check if the RTL8168 has completed ERI write */ + if (!(RTL_R32(hw, OCPAR) & OCPAR_Flag)) + break; + } + + if (len <= 4 - val_shift) { + len = 0; + } else { + len -= (4 - val_shift); + shift = 4 - val_shift; + addr += 4; + } + } + + rte_delay_us(20); + + return 0; +} + u32 rtl_ocp_read(struct rtl_hw *hw, u16 addr, u8 len) { u32 value = 0; - if (!hw->AllowAccessDashOcp) + if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp) return 0xffffffff; if (hw->HwSuppOcpChannelVer == 2) value = rtl_ocp_read_with_oob_base_address(hw, addr, len, NO_BASE_ADDRESS); + else if (hw->HwSuppOcpChannelVer == 3) + value = rtl_ocp_read_with_oob_base_address(hw, addr, len, + RTL8168FP_OOBMAC_BASE); + else + value = rtl8168_real_ocp_read(hw, addr, len); return value; } @@ -171,23 +289,28 @@ static u32 rtl_ocp_write_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len, u32 value, const u32 base_address) { - return rtl_eri_write_with_oob_base_address(hw, addr, len, value, ERIAR_OOB, - base_address); + return rtl_eri_write_with_oob_base_address(hw, addr, len, value, + ERIAR_OOB, base_address); } void rtl_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value) { - if (!hw->AllowAccessDashOcp) + if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp) return; if (hw->HwSuppOcpChannelVer == 2) rtl_ocp_write_with_oob_base_address(hw, addr, len, value, NO_BASE_ADDRESS); + else if (hw->HwSuppOcpChannelVer == 3) + rtl_ocp_write_with_oob_base_address(hw, addr, len, value, + RTL8168FP_OOBMAC_BASE); + else + rtl8168_real_ocp_write(hw, addr, len, value); } void -rtl8125_oob_mutex_lock(struct rtl_hw *hw) +rtl_oob_mutex_lock(struct rtl_hw *hw) { u8 reg_16, reg_a0; u16 ocp_reg_mutex_ib; @@ -199,6 +322,13 @@ rtl8125_oob_mutex_lock(struct rtl_hw *hw) return; switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: case CFG_METHOD_48: case CFG_METHOD_49: case CFG_METHOD_52: @@ -241,7 +371,7 @@ rtl8125_oob_mutex_lock(struct rtl_hw *hw) } void -rtl8125_oob_mutex_unlock(struct rtl_hw *hw) +rtl_oob_mutex_unlock(struct rtl_hw *hw) { u16 ocp_reg_mutex_ib; u16 ocp_reg_mutex_prio; @@ -250,6 +380,13 @@ rtl8125_oob_mutex_unlock(struct rtl_hw *hw) return; switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: case CFG_METHOD_48: case CFG_METHOD_49: case CFG_METHOD_52: @@ -295,34 +432,62 @@ rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr) } u32 -rtl_csi_read(struct rtl_hw *hw, u32 addr) +rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr) { u32 cmd; int i; - u32 value = 0; + u32 value = 0xffffffff; cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift | (addr & CSIAR_Addr_Mask); + if (multi_fun_sel_bit > 7) + goto exit; + + cmd |= multi_fun_sel_bit << 16; + RTL_W32(hw, CSIAR, cmd); - for (i = 0; i < 10; i++) { - rte_delay_us(100); + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); /* Check if the NIC has completed CSI read */ if (RTL_R32(hw, CSIAR) & CSIAR_Flag) { - value = RTL_R32(hw, CSIDR); + value = (u32)RTL_R32(hw, CSIDR); break; } } - rte_delay_us(20); + rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); +exit: return value; } +u32 +rtl_csi_read(struct rtl_hw *hw, u32 addr) +{ + u8 multi_fun_sel_bit; + + switch (hw->mcfg) { + case CFG_METHOD_26: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + multi_fun_sel_bit = 1; + break; + default: + multi_fun_sel_bit = 0; + break; + } + + return rtl_csi_other_fun_read(hw, multi_fun_sel_bit, addr); +} + void -rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value) +rtl_csi_other_fun_write(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr, + u32 value) { u32 cmd; int i; @@ -331,6 +496,11 @@ rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value) cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift | (addr & CSIAR_Addr_Mask); + if (multi_fun_sel_bit > 7) + return; + + cmd |= multi_fun_sel_bit << 16; + RTL_W32(hw, CSIAR, cmd); for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { @@ -344,14 +514,88 @@ rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value) rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); } +void +rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value) +{ + u8 multi_fun_sel_bit; + + switch (hw->mcfg) { + case CFG_METHOD_26: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + multi_fun_sel_bit = 1; + break; + default: + multi_fun_sel_bit = 0; + break; + } + + rtl_csi_other_fun_write(hw, multi_fun_sel_bit, addr, value); +} + +void +rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask, + u16 setmask) +{ + u16 reg_value; + + reg_value = rtl_mac_ocp_read(hw, addr); + reg_value &= ~clearmask; + reg_value |= setmask; + rtl_mac_ocp_write(hw, addr, reg_value); +} + +void +rtl8168_clear_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask) +{ + rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, mask, 0); +} + +void +rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask) +{ + rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, 0, mask); +} + static void rtl_enable_rxdvgate(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_3); rte_delay_ms(2); + break; } } @@ -359,15 +603,44 @@ void rtl_disable_rxdvgate(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_3); rte_delay_ms(2); + break; } } static void -rtl_stop_all_request(struct rtl_hw *hw) +rtl8125_stop_all_request(struct rtl_hw *hw) { int i; @@ -392,14 +665,95 @@ rtl_stop_all_request(struct rtl_hw *hw) RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb)); } +static void +rtl8168_stop_all_request(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rte_delay_ms(2); + break; + default: + rte_delay_ms(10); + break; + } +} + +static void +rtl_stop_all_request(struct rtl_hw *hw) +{ + if (rtl_is_8125(hw)) + rtl8125_stop_all_request(hw); + else + rtl8168_stop_all_request(hw); +} + static void rtl_wait_txrx_fifo_empty(struct rtl_hw *hw) { int i; switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + for (i = 0; i < 10; i++) { + rte_delay_us(100); + if (RTL_R32(hw, TxConfig) & BIT_11) + break; + } + + for (i = 0; i < 10; i++) { + rte_delay_us(100); + if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) == + (Txfifo_empty | Rxfifo_empty)) + break; + } + + rte_delay_ms(1); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: for (i = 0; i < 3000; i++) { rte_delay_us(50); if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) == @@ -412,8 +766,14 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw) switch (hw->mcfg) { case CFG_METHOD_50: case CFG_METHOD_51: - case CFG_METHOD_53 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: for (i = 0; i < 3000; i++) { rte_delay_us(50); if ((RTL_R16(hw, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) == @@ -473,19 +833,86 @@ rtl_disable_cfg9346_write(struct rtl_hw *hw) static void rtl_enable_force_clkreq(struct rtl_hw *hw, bool enable) { - if (enable) - RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7); - else - RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + if (enable) + RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7); + else + RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7); + break; + } } static void rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + if (enable) { + RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7); + RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0); + } else { + RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7); + RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0); + } + rte_delay_us(10); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: case CFG_METHOD_69: - rtl_enable_cfg9346_write(hw); if (enable) { RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7); RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0); @@ -493,11 +920,9 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable) RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7); RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0); } - rtl_disable_cfg9346_write(hw); break; case CFG_METHOD_70: case CFG_METHOD_71: - rtl_enable_cfg9346_write(hw); if (enable) { RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) | BIT_3); RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0); @@ -505,26 +930,35 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable) RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) & ~BIT_3); RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0); } - rtl_disable_cfg9346_write(hw); break; } } static void -rtl_disable_l1_timeout(struct rtl_hw *hw) +rtl8126_disable_l1_timeout(struct rtl_hw *hw) { rtl_csi_write(hw, 0x890, rtl_csi_read(hw, 0x890) & ~BIT_0); } static void -rtl_disable_eee_plus(struct rtl_hw *hw) +rtl8125_disable_eee_plus(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mac_ocp_write(hw, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1); break; - default: /* Not support EEEPlus */ break; @@ -535,8 +969,41 @@ static void rtl_hw_clear_timer_int(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + RTL_W32(hw, TimeInt0, 0x0000); + RTL_W32(hw, TimeInt1, 0x0000); + RTL_W32(hw, TimeInt2, 0x0000); + RTL_W32(hw, TimeInt3, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: RTL_W32(hw, TIMER_INT0_8125, 0x0000); RTL_W32(hw, TIMER_INT1_8125, 0x0000); RTL_W32(hw, TIMER_INT2_8125, 0x0000); @@ -546,7 +1013,7 @@ rtl_hw_clear_timer_int(struct rtl_hw *hw) } static void -rtl_hw_clear_int_miti(struct rtl_hw *hw) +rtl8125_hw_clear_int_miti(struct rtl_hw *hw) { int i; @@ -577,8 +1044,8 @@ rtl_hw_clear_int_miti(struct rtl_hw *hw) } } -void -rtl_hw_config(struct rtl_hw *hw) +static void +rtl8125_hw_config(struct rtl_hw *hw) { u32 mac_ocp_data; @@ -590,18 +1057,24 @@ rtl_hw_config(struct rtl_hw *hw) rtl_enable_cfg9346_write(hw); /* Disable aspm clkreq internal */ - switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - rtl_enable_force_clkreq(hw, 0); - rtl_enable_aspm_clkreq_lock(hw, 0); - break; - } + rtl_enable_force_clkreq(hw, 0); + rtl_enable_aspm_clkreq_lock(hw, 0); /* Disable magic packet */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: mac_ocp_data = 0; rtl_mac_ocp_write(hw, 0xC0B6, mac_ocp_data); break; @@ -616,21 +1089,38 @@ rtl_hw_config(struct rtl_hw *hw) /* TCAM */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_53: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: RTL_W16(hw, 0x382, 0x221B); break; } switch (hw->mcfg) { - case CFG_METHOD_69 ... CFG_METHOD_71: - rtl_disable_l1_timeout(hw); + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl8126_disable_l1_timeout(hw); break; } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: /* RSS_control_0 */ RTL_W32(hw, RSS_CTRL_8125, 0x00); @@ -644,33 +1134,17 @@ rtl_hw_config(struct rtl_hw *hw) rtl_mac_ocp_write(hw, 0xC140, 0xFFFF); rtl_mac_ocp_write(hw, 0xC142, 0xFFFF); - /* New TX desc format */ + /* Disable new TX desc format */ mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB58); if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71) mac_ocp_data &= ~(BIT_0 | BIT_1); - mac_ocp_data |= BIT_0; + else + mac_ocp_data &= ~BIT_0; rtl_mac_ocp_write(hw, 0xEB58, mac_ocp_data); if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71) RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~BIT_1); - /* - * MTPS - * 15-8 maximum tx use credit number - * 7-0 reserved for pcie product line - */ - mac_ocp_data = rtl_mac_ocp_read(hw, 0xE614); - mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8); - if (hw->mcfg == CFG_METHOD_50 || hw->mcfg == CFG_METHOD_51 || - hw->mcfg == CFG_METHOD_53) - mac_ocp_data |= ((2 & 0x07) << 8); - else if (hw->mcfg == CFG_METHOD_69 || hw->mcfg == CFG_METHOD_70 || - hw->mcfg == CFG_METHOD_71) - mac_ocp_data |= ((4 & 0x07) << 8); - else - mac_ocp_data |= ((3 & 0x07) << 8); - rtl_mac_ocp_write(hw, 0xE614, mac_ocp_data); - mac_ocp_data = rtl_mac_ocp_read(hw, 0xE63E); mac_ocp_data &= ~(BIT_5 | BIT_4); if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 || @@ -724,7 +1198,7 @@ rtl_hw_config(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: - rtl8125_oob_mutex_lock(hw); + rtl_oob_mutex_lock(hw); break; } @@ -740,7 +1214,7 @@ rtl_hw_config(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: - rtl8125_oob_mutex_unlock(hw); + rtl_oob_mutex_unlock(hw); break; } @@ -766,7 +1240,7 @@ rtl_hw_config(struct rtl_hw *hw) hw->mcfg == CFG_METHOD_52) RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0); - rtl_disable_eee_plus(hw); + rtl8125_disable_eee_plus(hw); mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C); mac_ocp_data &= ~BIT_2; @@ -782,7 +1256,10 @@ rtl_hw_config(struct rtl_hw *hw) RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5)); switch (hw->mcfg) { - case CFG_METHOD_54 ... CFG_METHOD_57: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: RTL_W8(hw, 0xd8, RTL_R8(hw, 0xd8) & ~EnableRxDescV4_0); break; } @@ -791,24 +1268,223 @@ rtl_hw_config(struct rtl_hw *hw) /* Other hw parameters */ rtl_hw_clear_timer_int(hw); - rtl_hw_clear_int_miti(hw); + rtl8125_hw_clear_int_miti(hw); + + switch (hw->mcfg) { + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_mac_ocp_write(hw, 0xE098, 0xC302); + break; + } + + rtl_disable_cfg9346_write(hw); + + rte_delay_us(10); +} + +static void +rtl8168_hw_config(struct rtl_hw *hw) +{ + u32 csi_tmp; + int timeout; + + rtl_nic_reset(hw); + + rtl_enable_cfg9346_write(hw); + + /* Disable aspm clkreq internal */ + rtl_enable_force_clkreq(hw, 0); + rtl_enable_aspm_clkreq_lock(hw, 0); + + /* Clear io_rdy_l23 */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~BIT_1); + break; + } + + /* Keep magic packet only */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_eri_read(hw, 0xDE, 1, ERIAR_ExGMAC); + csi_tmp &= BIT_0; + rtl_eri_write(hw, 0xDE, 1, csi_tmp, ERIAR_ExGMAC); + break; + } + + /* Set TxConfig to default */ + RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) | + (InterFrameGap << TxInterFrameGapShift)); + + hw->hw_ops.hw_config(hw); + + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + rtl_eri_write(hw, 0x2F8, 2, 0x1D8F, ERIAR_ExGMAC); + break; + } + + rtl_hw_clear_timer_int(hw); + + /* Clkreq exit masks */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_eri_read(hw, 0xD4, 4, ERIAR_ExGMAC); + csi_tmp |= (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12); + rtl_eri_write(hw, 0xD4, 4, csi_tmp, ERIAR_ExGMAC); + break; + } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_25: + rtl_mac_ocp_write(hw, 0xD3C0, 0x0B00); + rtl_mac_ocp_write(hw, 0xD3C2, 0x0000); + break; + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mac_ocp_write(hw, 0xE098, 0x0AA2); + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: rtl_mac_ocp_write(hw, 0xE098, 0xC302); break; } + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + for (timeout = 0; timeout < 10; timeout++) { + if ((rtl_eri_read(hw, 0x1AE, 2, ERIAR_ExGMAC) & BIT_13) == 0) + break; + rte_delay_ms(1); + } + break; + } + rtl_disable_cfg9346_write(hw); rte_delay_us(10); } +void +rtl_hw_config(struct rtl_hw *hw) +{ + if (rtl_is_8125(hw)) + rtl8125_hw_config(hw); + else + rtl8168_hw_config(hw); +} + int rtl_set_hw_ops(struct rtl_hw *hw) { switch (hw->mcfg) { + /* 8168G */ + case CFG_METHOD_21: + case CFG_METHOD_22: + /* 8168GU */ + case CFG_METHOD_24: + case CFG_METHOD_25: + hw->hw_ops = rtl8168g_ops; + return 0; + /* 8168EP */ + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + hw->hw_ops = rtl8168ep_ops; + return 0; + /* 8168H */ + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + hw->hw_ops = rtl8168h_ops; + return 0; + /* 8168FP */ + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + hw->hw_ops = rtl8168fp_ops; + return 0; + /* 8168M */ + case CFG_METHOD_37: + hw->hw_ops = rtl8168m_ops; + return 0; /* 8125A */ case CFG_METHOD_48: case CFG_METHOD_49: @@ -835,7 +1511,9 @@ rtl_set_hw_ops(struct rtl_hw *hw) hw->hw_ops = rtl8125d_ops; return 0; /* 8126A */ - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->hw_ops = rtl8126a_ops; return 0; default: @@ -848,23 +1526,80 @@ rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw) { u16 reg_addr; + rtl_enable_cfg9346_write(hw); rtl_enable_aspm_clkreq_lock(hw, 0); + rtl_disable_cfg9346_write(hw); switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mac_ocp_write(hw, 0xFC38, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mac_ocp_write(hw, 0xFC48, 0x0000); break; } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2) + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + for (reg_addr = 0xFC28; reg_addr < 0xFC38; reg_addr += 2) rtl_mac_ocp_write(hw, reg_addr, 0x0000); rte_delay_ms(3); + rtl_mac_ocp_write(hw, 0xFC26, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2) + rtl_mac_ocp_write(hw, reg_addr, 0x0000); + rte_delay_ms(3); rtl_mac_ocp_write(hw, 0xFC26, 0x0000); break; } @@ -973,7 +1708,7 @@ rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv; if (!rtl_is_speed_mode_valid(speed)) - speed = SPEED_5000; + speed = SPEED_1000; if (!rtl_is_duplex_mode_valid(duplex)) duplex = DUPLEX_FULL; @@ -1009,12 +1744,46 @@ static void rtl_init_software_variable(struct rtl_hw *hw) { int tx_no_close_enable = 1; - unsigned int speed_mode = SPEED_5000; + unsigned int speed_mode; unsigned int duplex_mode = DUPLEX_FULL; unsigned int autoneg_mode = AUTONEG_ENABLE; - u8 tmp; + u32 tmp; + + switch (hw->mcfg) { + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + speed_mode = SPEED_2500; + break; + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + speed_mode = SPEED_5000; + break; + default: + speed_mode = SPEED_1000; + break; + } switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + hw->HwSuppDashVer = 2; + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + hw->HwSuppDashVer = 3; + break; case CFG_METHOD_48: case CFG_METHOD_49: tmp = (u8)rtl_mac_ocp_read(hw, 0xD006); @@ -1031,6 +1800,41 @@ rtl_init_software_variable(struct rtl_hw *hw) } switch (hw->mcfg) { + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + tmp = rtl_mac_ocp_read(hw, 0xDC00); + hw->HwPkgDet = (tmp >> 3) & 0x0F; + break; + } + + switch (hw->mcfg) { + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + if (hw->HwPkgDet == 0x06) { + tmp = rtl_eri_read(hw, 0xE6, 1, ERIAR_ExGMAC); + if (tmp == 0x02) + hw->HwSuppSerDesPhyVer = 1; + else if (tmp == 0x00) + hw->HwSuppSerDesPhyVer = 2; + } + break; + } + + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + hw->HwSuppOcpChannelVer = 2; + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + hw->HwSuppOcpChannelVer = 3; + break; case CFG_METHOD_48: case CFG_METHOD_49: if (HW_DASH_SUPPORT_DASH(hw)) @@ -1040,9 +1844,13 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: hw->HwSuppOcpChannelVer = 2; break; + default: + hw->HwSuppOcpChannelVer = 0; + break; } - hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw); + if (rtl_is_8125(hw)) + hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw); if (HW_DASH_SUPPORT_DASH(hw) && rtl_check_dash(hw)) hw->DASH = 1; @@ -1053,6 +1861,32 @@ rtl_init_software_variable(struct rtl_hw *hw) hw->cmac_ioaddr = hw->mmio_addr; switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_24: + case CFG_METHOD_25: + hw->chipset_name = RTL8168G; + break; + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + hw->chipset_name = RTL8168EP; + break; + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + hw->chipset_name = RTL8168H; + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + hw->chipset_name = RTL8168FP; + break; + case CFG_METHOD_37: + hw->chipset_name = RTL8168M; + break; case CFG_METHOD_48: case CFG_METHOD_49: hw->chipset_name = RTL8125A; @@ -1073,7 +1907,9 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_57: hw->chipset_name = RTL8125D; break; - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->chipset_name = RTL8126A; break; default: @@ -1082,23 +1918,91 @@ rtl_init_software_variable(struct rtl_hw *hw) } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->HwSuppNowIsOobVer = 1; + break; } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + hw->HwSuppCheckPhyDisableModeVer = 2; + break; + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->HwSuppCheckPhyDisableModeVer = 3; + break; } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_51: - case CFG_METHOD_54 ... CFG_METHOD_57: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: hw->HwSuppMaxPhyLinkSpeed = SPEED_2500; break; - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->HwSuppMaxPhyLinkSpeed = SPEED_5000; break; default: @@ -1107,10 +2011,18 @@ rtl_init_software_variable(struct rtl_hw *hw) } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_53: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: hw->HwSuppTxNoCloseVer = 3; break; - case CFG_METHOD_54 ... CFG_METHOD_57: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: hw->HwSuppTxNoCloseVer = 6; break; case CFG_METHOD_69: @@ -1158,6 +2070,41 @@ rtl_init_software_variable(struct rtl_hw *hw) } switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_21; + break; + case CFG_METHOD_23: + case CFG_METHOD_27: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_23; + break; + case CFG_METHOD_24: + case CFG_METHOD_25: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_24; + break; + case CFG_METHOD_26: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_26; + break; + case CFG_METHOD_28: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_28; + break; + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_37: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_29; + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_31; + break; + case CFG_METHOD_35: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_35; + break; + case CFG_METHOD_36: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_36; + break; case CFG_METHOD_48: hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_48; break; @@ -1201,15 +2148,37 @@ rtl_init_software_variable(struct rtl_hw *hw) } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->HwSuppMacMcuVer = 2; break; } switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->MacMcuPageSize = RTL_MAC_MCU_PAGE_SIZE; break; } @@ -1235,7 +2204,10 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_69: hw->HwSuppIntMitiVer = 4; break; - case CFG_METHOD_54 ... CFG_METHOD_57: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: hw->HwSuppIntMitiVer = 6; break; case CFG_METHOD_70: @@ -1247,8 +2219,19 @@ rtl_init_software_variable(struct rtl_hw *hw) rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, rtl_fc_full); switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: hw->mcu_pme_setting = rtl_mac_ocp_read(hw, 0xE00A); break; } @@ -1259,13 +2242,69 @@ rtl_init_software_variable(struct rtl_hw *hw) static void rtl_exit_realwow(struct rtl_hw *hw) { + u32 csi_tmp; + /* Disable realwow function */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + RTL_W32(hw, MACOCP, 0x605E0000); + RTL_W32(hw, MACOCP, (0xE05E << 16) | + (RTL_R32(hw, MACOCP) & 0xFFFE)); + RTL_W32(hw, MACOCP, 0xE9720000); + RTL_W32(hw, MACOCP, 0xF2140010); + break; + case CFG_METHOD_26: + RTL_W32(hw, MACOCP, 0xE05E00FF); + RTL_W32(hw, MACOCP, 0xE9720000); + rtl_mac_ocp_write(hw, 0xE428, 0x0010); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mac_ocp_write(hw, 0xC0BC, 0x00FF); break; } + + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + rtl_eri_write(hw, 0x174, 2, 0x0000, ERIAR_ExGMAC); + rtl_mac_ocp_write(hw, 0xE428, 0x0010); + break; + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + rtl_eri_write(hw, 0x174, 2, 0x00FF, ERIAR_ExGMAC); + rtl_mac_ocp_write(hw, 0xE428, 0x0010); + break; + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_eri_read(hw, 0x174, 2, ERIAR_ExGMAC); + csi_tmp &= ~BIT_8; + csi_tmp |= BIT_15; + rtl_eri_write(hw, 0x174, 2, csi_tmp, ERIAR_ExGMAC); + rtl_mac_ocp_write(hw, 0xE428, 0x0010); + break; + } } static void @@ -1287,6 +2326,20 @@ rtl_wait_ll_share_fifo_ready(struct rtl_hw *hw) } } +static void +rtl8168_switch_to_sgmii_mode(struct rtl_hw *hw) +{ + if (!HW_SUPP_SERDES_PHY(hw)) + return; + + switch (hw->HwSuppSerDesPhyVer) { + case 1: + rtl_mac_ocp_write(hw, 0xEB00, 0x2); + rtl8168_set_mcu_ocp_bit(hw, 0xEB16, BIT_1); + break; + } +} + static void rtl_exit_oob(struct rtl_hw *hw) { @@ -1294,9 +2347,14 @@ rtl_exit_oob(struct rtl_hw *hw) rtl_disable_rx_packet_filter(hw); + if (HW_SUPP_SERDES_PHY(hw)) { + if (hw->HwSuppSerDesPhyVer == 1) + rtl8168_switch_to_sgmii_mode(hw); + } + if (HW_DASH_SUPPORT_DASH(hw)) { - rtl8125_driver_start(hw); - rtl8125_dash2_disable_txrx(hw); + rtl_driver_start(hw); + rtl_dash2_disable_txrx(hw); } rtl_exit_realwow(hw); @@ -1304,8 +2362,47 @@ rtl_exit_oob(struct rtl_hw *hw) rtl_nic_reset(hw); switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_disable_now_is_oob(hw); + + data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14; + rtl_mac_ocp_write(hw, 0xE8DE, data16); + rtl_wait_ll_share_fifo_ready(hw); + + data16 = rtl_mac_ocp_read(hw, 0xE8DE) | BIT_15; + rtl_mac_ocp_write(hw, 0xE8DE, data16); + + rtl_wait_ll_share_fifo_ready(hw); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_disable_now_is_oob(hw); data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14; @@ -1327,20 +2424,66 @@ static void rtl_disable_ups(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - rtl_mac_ocp_write(hw, 0xD40A, rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4); + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + rtl_mac_ocp_write(hw, 0xD400, + rtl_mac_ocp_read(hw, 0xD400) & ~BIT_0); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_mac_ocp_write(hw, 0xD40A, + rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4); break; } } static void -rtl8125_disable_ocp_phy_power_saving(struct rtl_hw *hw) +rtl_disable_ocp_phy_power_saving(struct rtl_hw *hw) { u16 val; - if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 || - hw->mcfg == CFG_METHOD_52) { + switch (hw->mcfg) { + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + val = rtl_mdio_real_read_phy_ocp(hw, 0x0C41, 0x13); + if (val != 0x0500) { + rtl_set_phy_mcu_patch_request(hw); + rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0000); + rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0500); + rtl_clear_phy_mcu_patch_request(hw); + } + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_52: val = rtl_mdio_direct_read_phy_ocp(hw, 0xC416); if (val != 0x0050) { rtl_set_phy_mcu_patch_request(hw); @@ -1348,26 +2491,108 @@ rtl8125_disable_ocp_phy_power_saving(struct rtl_hw *hw) rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0500); rtl_clear_phy_mcu_patch_request(hw); } + break; } } static void -rtl_hw_init(struct rtl_hw *hw) +rtl8168_disable_dma_agg(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - rtl_enable_aspm_clkreq_lock(hw, 0); - rtl_enable_force_clkreq(hw, 0); + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mac_ocp_write(hw, 0xE63E, rtl_mac_ocp_read(hw, 0xE63E) & + ~(BIT_3 | BIT_2 | BIT_1)); + rtl_mac_ocp_write(hw, 0xE63E, + rtl_mac_ocp_read(hw, 0xE63E) | (BIT_0)); + rtl_mac_ocp_write(hw, 0xE63E, + rtl_mac_ocp_read(hw, 0xE63E) & ~(BIT_0)); + rtl_mac_ocp_write(hw, 0xC094, 0x0); + rtl_mac_ocp_write(hw, 0xC09E, 0x0); break; } +} + +static void +rtl_hw_init(struct rtl_hw *hw) +{ + u32 csi_tmp; + + /* Disable aspm clkreq internal */ + rtl_enable_force_clkreq(hw, 0); + rtl_enable_cfg9346_write(hw); + rtl_enable_aspm_clkreq_lock(hw, 0); + rtl_disable_cfg9346_write(hw); rtl_disable_ups(hw); + /* Disable DMA aggregation */ + rtl8168_disable_dma_agg(hw); + hw->hw_ops.hw_mac_mcu_config(hw); /* Disable ocp phy power saving */ - rtl8125_disable_ocp_phy_power_saving(hw); + rtl_disable_ocp_phy_power_saving(hw); + + /* Set PCIE uncorrectable error status mask pcie 0x108 */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_csi_read(hw, 0x108); + csi_tmp |= BIT_20; + rtl_csi_write(hw, 0x108, csi_tmp); + break; + } + + /* MCU PME setting */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC); + csi_tmp |= (BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7); + rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC); + break; + case CFG_METHOD_25: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC); + csi_tmp |= (BIT_3 | BIT_6); + rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC); + break; + } } void @@ -1393,33 +2618,200 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) ic_version_id = val32 & 0x00700000; switch (reg) { + case 0x30000000: + hw->mcfg = CFG_METHOD_1; + break; + case 0x38000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_2; + } else if (ic_version_id == 0x00500000) { + hw->mcfg = CFG_METHOD_3; + } else { + hw->mcfg = CFG_METHOD_3; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x3C000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_4; + } else if (ic_version_id == 0x00200000) { + hw->mcfg = CFG_METHOD_5; + } else if (ic_version_id == 0x00400000) { + hw->mcfg = CFG_METHOD_6; + } else { + hw->mcfg = CFG_METHOD_6; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x3C800000: + if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_7; + } else if (ic_version_id == 0x00300000) { + hw->mcfg = CFG_METHOD_8; + } else { + hw->mcfg = CFG_METHOD_8; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x28000000: + if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_9; + } else if (ic_version_id == 0x00300000) { + hw->mcfg = CFG_METHOD_10; + } else { + hw->mcfg = CFG_METHOD_10; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x28800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_11; + } else if (ic_version_id == 0x00200000) { + hw->mcfg = CFG_METHOD_12; + RTL_W32(hw, 0xD0, RTL_R32(hw, 0xD0) | 0x00020000); + } else if (ic_version_id == 0x00300000) { + hw->mcfg = CFG_METHOD_13; + } else { + hw->mcfg = CFG_METHOD_13; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x2C000000: + if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_14; + } else if (ic_version_id == 0x00200000) { + hw->mcfg = CFG_METHOD_15; + } else { + hw->mcfg = CFG_METHOD_15; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x2C800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_16; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_17; + } else { + hw->mcfg = CFG_METHOD_17; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x48000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_18; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_19; + } else { + hw->mcfg = CFG_METHOD_19; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x48800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_20; + } else { + hw->mcfg = CFG_METHOD_20; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x4C000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_21; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_22; + } else { + hw->mcfg = CFG_METHOD_22; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x50000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_23; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_27; + } else if (ic_version_id == 0x00200000) { + hw->mcfg = CFG_METHOD_28; + } else { + hw->mcfg = CFG_METHOD_28; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x50800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_24; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_25; + } else { + hw->mcfg = CFG_METHOD_25; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x5C800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_26; + } else { + hw->mcfg = CFG_METHOD_26; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x54000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_29; + } else if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_30; + } else { + hw->mcfg = CFG_METHOD_30; + hw->HwIcVerUnknown = TRUE; + } + + if (hw->mcfg == CFG_METHOD_30) { + if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0100) + hw->mcfg = CFG_METHOD_35; + else if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0300) + hw->mcfg = CFG_METHOD_36; + } + break; + case 0x6C000000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_37; + } else { + hw->mcfg = CFG_METHOD_37; + hw->HwIcVerUnknown = TRUE; + } + break; + case 0x54800000: + if (ic_version_id == 0x00100000) { + hw->mcfg = CFG_METHOD_31; + } else if (ic_version_id == 0x00200000) { + hw->mcfg = CFG_METHOD_32; + } else if (ic_version_id == 0x00300000) { + hw->mcfg = CFG_METHOD_33; + } else if (ic_version_id == 0x00400000) { + hw->mcfg = CFG_METHOD_34; + } else { + hw->mcfg = CFG_METHOD_34; + hw->HwIcVerUnknown = TRUE; + } + break; case 0x60800000: if (ic_version_id == 0x00000000) { hw->mcfg = CFG_METHOD_48; - } else if (ic_version_id == 0x100000) { hw->mcfg = CFG_METHOD_49; - } else { hw->mcfg = CFG_METHOD_49; hw->HwIcVerUnknown = TRUE; } - - hw->efuse_ver = EFUSE_SUPPORT_V4; break; case 0x64000000: if (ic_version_id == 0x00000000) { hw->mcfg = CFG_METHOD_50; - } else if (ic_version_id == 0x100000) { hw->mcfg = CFG_METHOD_51; - } else { hw->mcfg = CFG_METHOD_51; hw->HwIcVerUnknown = TRUE; } - - hw->efuse_ver = EFUSE_SUPPORT_V4; break; case 0x68000000: if (ic_version_id == 0x00000000) { @@ -1430,8 +2822,6 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) hw->mcfg = CFG_METHOD_55; hw->HwIcVerUnknown = TRUE; } - - hw->efuse_ver = EFUSE_SUPPORT_V4; break; case 0x68800000: if (ic_version_id == 0x00000000) { @@ -1442,8 +2832,6 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) hw->mcfg = CFG_METHOD_57; hw->HwIcVerUnknown = TRUE; } - - hw->efuse_ver = EFUSE_SUPPORT_V4; break; case 0x64800000: if (ic_version_id == 0x00000000) { @@ -1456,14 +2844,11 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) hw->mcfg = CFG_METHOD_71; hw->HwIcVerUnknown = TRUE; } - - hw->efuse_ver = EFUSE_SUPPORT_V4; break; default: PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg); hw->mcfg = CFG_METHOD_DEFAULT; hw->HwIcVerUnknown = TRUE; - hw->efuse_ver = EFUSE_NOT_SUPPORT; break; } @@ -1478,11 +2863,42 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) int rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea) { - u8 mac_addr[MAC_ADDR_LEN] = {0}; + u8 mac_addr[RTE_ETHER_ADDR_LEN] = {0}; switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + *(u32 *)&mac_addr[0] = rtl_eri_read(hw, 0xE0, 4, ERIAR_ExGMAC); + *(u16 *)&mac_addr[4] = rtl_eri_read(hw, 0xE4, 2, ERIAR_ExGMAC); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: *(u32 *)&mac_addr[0] = RTL_R32(hw, BACKUP_ADDR0_8125); *(u16 *)&mac_addr[4] = RTL_R16(hw, BACKUP_ADDR1_8125); break; @@ -1495,6 +2911,7 @@ rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea) return 0; } +/* Puts an ethernet address into a receive address register. */ void rtl_rar_set(struct rtl_hw *hw, uint8_t *addr) { @@ -1593,3 +3010,9 @@ rtl_tally_free(struct rte_eth_dev *dev) { rte_eth_dma_zone_free(dev, "tally_counters", 0); } + +bool +rtl_is_8125(struct rtl_hw *hw) +{ + return hw->mcfg >= CFG_METHOD_48; +} diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h index e7c4bf1abc..7cc4ee527f 100644 --- a/drivers/net/r8169/r8169_hw.h +++ b/drivers/net/r8169/r8169_hw.h @@ -30,8 +30,8 @@ void rtl_nic_reset(struct rtl_hw *hw); void rtl_enable_cfg9346_write(struct rtl_hw *hw); void rtl_disable_cfg9346_write(struct rtl_hw *hw); -void rtl8125_oob_mutex_lock(struct rtl_hw *hw); -void rtl8125_oob_mutex_unlock(struct rtl_hw *hw); +void rtl_oob_mutex_lock(struct rtl_hw *hw); +void rtl_oob_mutex_unlock(struct rtl_hw *hw); void rtl_disable_rxdvgate(struct rtl_hw *hw); @@ -60,6 +60,24 @@ void rtl_clear_tally_stats(struct rtl_hw *hw); int rtl_tally_init(struct rte_eth_dev *dev); void rtl_tally_free(struct rte_eth_dev *dev); +bool rtl_is_8125(struct rtl_hw *hw); + +u32 rtl_eri_read(struct rtl_hw *hw, int addr, int len, int type); +int rtl_eri_write(struct rtl_hw *hw, int addr, int len, u32 value, int type); + +u32 rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr); +void rtl_csi_other_fun_write(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr, + u32 value); +void rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, + u16 clearmask, u16 setmask); +void rtl8168_clear_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); +void rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); + +extern const struct rtl_hw_ops rtl8168g_ops; +extern const struct rtl_hw_ops rtl8168h_ops; +extern const struct rtl_hw_ops rtl8168ep_ops; +extern const struct rtl_hw_ops rtl8168fp_ops; +extern const struct rtl_hw_ops rtl8168m_ops; extern const struct rtl_hw_ops rtl8125a_ops; extern const struct rtl_hw_ops rtl8125b_ops; extern const struct rtl_hw_ops rtl8125bp_ops; @@ -67,7 +85,8 @@ extern const struct rtl_hw_ops rtl8125d_ops; extern const struct rtl_hw_ops rtl8126a_ops; extern const struct rtl_hw_ops rtl8168kb_ops; -#define NO_BASE_ADDRESS 0x00000000 +#define NO_BASE_ADDRESS 0x00000000 +#define RTL8168FP_OOBMAC_BASE 0xBAF70000 /* Channel wait count */ #define RTL_CHANNEL_WAIT_COUNT 20000 @@ -80,15 +99,24 @@ extern const struct rtl_hw_ops rtl8168kb_ops; #define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M) ((_M)->HwHasWrRamCodeToMicroP ? 1 : 0) /* Tx NO CLOSE */ -#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000 -#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2 0xFFFF -#define MAX_TX_NO_CLOSE_DESC_PTR_V3 0x100000000 -#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3 0xFFFFFFFF -#define MAX_TX_NO_CLOSE_DESC_PTR_V4 0x80000000 -#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4 0x7FFFFFFF -#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF +#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000 +#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2 0xFFFF +#define MAX_TX_NO_CLOSE_DESC_PTR_V3 0x100000000 +#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3 0xFFFFFFFF +#define MAX_TX_NO_CLOSE_DESC_PTR_V4 0x80000000 +#define MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4 0x7FFFFFFF +#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF /* Ram code version */ +#define NIC_RAMCODE_VERSION_CFG_METHOD_21 (0x0042) +#define NIC_RAMCODE_VERSION_CFG_METHOD_24 (0x0001) +#define NIC_RAMCODE_VERSION_CFG_METHOD_23 (0x0015) +#define NIC_RAMCODE_VERSION_CFG_METHOD_26 (0x0012) +#define NIC_RAMCODE_VERSION_CFG_METHOD_28 (0x0019) +#define NIC_RAMCODE_VERSION_CFG_METHOD_29 (0x0083) +#define NIC_RAMCODE_VERSION_CFG_METHOD_31 (0x0003) +#define NIC_RAMCODE_VERSION_CFG_METHOD_35 (0x0027) +#define NIC_RAMCODE_VERSION_CFG_METHOD_36 (0x0000) #define NIC_RAMCODE_VERSION_CFG_METHOD_48 (0x0b11) #define NIC_RAMCODE_VERSION_CFG_METHOD_49 (0x0b33) #define NIC_RAMCODE_VERSION_CFG_METHOD_50 (0x0b17) @@ -104,12 +132,4 @@ extern const struct rtl_hw_ops rtl8168kb_ops; #define RTL_MAC_MCU_PAGE_SIZE 256 #define RTL_DEFAULT_MTU 1500 -enum effuse { - EFUSE_NOT_SUPPORT = 0, - EFUSE_SUPPORT_V1, - EFUSE_SUPPORT_V2, - EFUSE_SUPPORT_V3, - EFUSE_SUPPORT_V4, -}; - #endif /* R8169_HW_H */ diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c index cc8efe80f2..ce16ab3242 100644 --- a/drivers/net/r8169/r8169_phy.c +++ b/drivers/net/r8169/r8169_phy.c @@ -13,6 +13,7 @@ #include "r8169_hw.h" #include "r8169_phy.h" #include "r8169_logs.h" +#include "r8169_dash.h" static void rtl_clear_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask, @@ -68,7 +69,7 @@ rtl_map_phy_ocp_addr(u16 PageNum, u8 RegNum) } static u32 -rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr) +rtl_mdio_real_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr) { u32 data32; int i, value = 0; @@ -77,8 +78,8 @@ rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr) data32 <<= OCPR_Addr_Reg_shift; RTL_W32(hw, PHYOCP, data32); - for (i = 0; i < 100; i++) { - rte_delay_us(1); + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); if (RTL_R32(hw, PHYOCP) & OCPR_Flag) break; @@ -91,27 +92,33 @@ rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr) u32 rtl_mdio_direct_read_phy_ocp(struct rtl_hw *hw, u32 RegAddr) { - return rtl_mdio_real_read_phy_ocp(hw, RegAddr); + return rtl_mdio_real_direct_read_phy_ocp(hw, RegAddr); } -static u32 -rtl_mdio_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr) +u32 +rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr) { u16 ocp_addr; ocp_addr = rtl_map_phy_ocp_addr(PageNum, RegAddr); - return rtl_mdio_direct_read_phy_ocp(hw, ocp_addr); + return rtl_mdio_real_direct_read_phy_ocp(hw, ocp_addr); } static u32 rtl_mdio_real_read(struct rtl_hw *hw, u32 RegAddr) { - return rtl_mdio_read_phy_ocp(hw, hw->cur_page, RegAddr); + return rtl_mdio_real_read_phy_ocp(hw, hw->cur_page, RegAddr); +} + +u32 +rtl_mdio_read(struct rtl_hw *hw, u32 RegAddr) +{ + return rtl_mdio_real_read(hw, RegAddr); } static void -rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value) +rtl_mdio_real_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value) { u32 data32; int i; @@ -121,8 +128,8 @@ rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value) data32 |= OCPR_Write | value; RTL_W32(hw, PHYOCP, data32); - for (i = 0; i < 100; i++) { - rte_delay_us(1); + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); if (!(RTL_R32(hw, PHYOCP) & OCPR_Flag)) break; @@ -132,11 +139,11 @@ rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value) void rtl_mdio_direct_write_phy_ocp(struct rtl_hw *hw, u32 RegAddr, u32 value) { - rtl_mdio_real_write_phy_ocp(hw, RegAddr, value); + rtl_mdio_real_direct_write_phy_ocp(hw, RegAddr, value); } -static void -rtl_mdio_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value) +void +rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value) { u16 ocp_addr; @@ -148,15 +155,11 @@ rtl_mdio_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, u32 value) static void rtl_mdio_real_write(struct rtl_hw *hw, u32 RegAddr, u32 value) { - if (RegAddr == 0x1F) + if (RegAddr == 0x1F) { hw->cur_page = value; - rtl_mdio_write_phy_ocp(hw, hw->cur_page, RegAddr, value); -} - -u32 -rtl_mdio_read(struct rtl_hw *hw, u32 RegAddr) -{ - return rtl_mdio_real_read(hw, RegAddr); + return; + } + rtl_mdio_real_write_phy_ocp(hw, hw->cur_page, RegAddr, value); } void @@ -189,37 +192,67 @@ rtl_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask) rtl_clear_and_set_eth_phy_ocp_bit(hw, addr, 0, mask); } +static u8 +rtl8168_check_ephy_addr(struct rtl_hw *hw, int addr) +{ + if (hw->mcfg != CFG_METHOD_35 && hw->mcfg != CFG_METHOD_36) + goto exit; + + if (addr & (BIT_6 | BIT_5)) + rtl8168_clear_and_set_mcu_ocp_bit(hw, 0xDE28, (BIT_1 | BIT_0), + (addr >> 5) & (BIT_1 | BIT_0)); + + addr &= 0x1F; + +exit: + return addr; +} + void rtl_ephy_write(struct rtl_hw *hw, int addr, int value) { int i; + unsigned int mask; - RTL_W32(hw, EPHYAR, EPHYAR_Write | - (addr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift | + if (rtl_is_8125(hw)) { + mask = EPHYAR_Reg_Mask_v2; + } else { + mask = EPHYAR_Reg_Mask; + addr = rtl8168_check_ephy_addr(hw, addr); + } + + RTL_W32(hw, EPHYAR, EPHYAR_Write | (addr & mask) << EPHYAR_Reg_shift | (value & EPHYAR_Data_Mask)); - for (i = 0; i < 10; i++) { - rte_delay_us(100); + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); /* Check if the NIC has completed EPHY write */ if (!(RTL_R32(hw, EPHYAR) & EPHYAR_Flag)) break; } - rte_delay_us(20); + rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); } -static u16 +u16 rtl_ephy_read(struct rtl_hw *hw, int addr) { int i; u16 value = 0xffff; + unsigned int mask; + + if (rtl_is_8125(hw)) { + mask = EPHYAR_Reg_Mask_v2; + } else { + mask = EPHYAR_Reg_Mask; + addr = rtl8168_check_ephy_addr(hw, addr); + } - RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & EPHYAR_Reg_Mask_v2) << - EPHYAR_Reg_shift); + RTL_W32(hw, EPHYAR, EPHYAR_Read | (addr & mask) << EPHYAR_Reg_shift); - for (i = 0; i < 10; i++) { - rte_delay_us(100); + for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) { + rte_delay_us(RTL_CHANNEL_WAIT_TIME); /* Check if the NIC has completed EPHY read */ if (RTL_R32(hw, EPHYAR) & EPHYAR_Flag) { @@ -228,7 +261,7 @@ rtl_ephy_read(struct rtl_hw *hw, int addr) } } - rte_delay_us(20); + rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME); return value; } @@ -264,18 +297,66 @@ rtl_set_phy_mcu_patch_request(struct rtl_hw *hw) u16 wait_cnt; bool bool_success = TRUE; - rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mdio_write(hw, 0x1f, 0x0B82); + rtl_set_eth_phy_bit(hw, 0x10, BIT_4); + + rtl_mdio_write(hw, 0x1f, 0x0B80); + wait_cnt = 0; + do { + gphy_val = rtl_mdio_read(hw, 0x10); + rte_delay_us(100); + wait_cnt++; + } while (!(gphy_val & BIT_6) && (wait_cnt < 1000)); - wait_cnt = 0; - do { - gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800); - rte_delay_us(100); - wait_cnt++; - } while (!(gphy_val & BIT_6) && (wait_cnt < 1000)); + if (!(gphy_val & BIT_6) && wait_cnt == 1000) + bool_success = FALSE; - if (!(gphy_val & BIT_6) && wait_cnt == 1000) - bool_success = FALSE; + rtl_mdio_write(hw, 0x1f, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_set_eth_phy_ocp_bit(hw, 0xB820, BIT_4); + + wait_cnt = 0; + do { + gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800); + rte_delay_us(100); + wait_cnt++; + } while (!(gphy_val & BIT_6) && (wait_cnt < 1000)); + if (!(gphy_val & BIT_6) && wait_cnt == 1000) + bool_success = FALSE; + break; + } if (!bool_success) PMD_INIT_LOG(NOTICE, "%s fail.", __func__); @@ -289,17 +370,66 @@ rtl_clear_phy_mcu_patch_request(struct rtl_hw *hw) u16 wait_cnt; bool bool_success = TRUE; - rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mdio_write(hw, 0x1f, 0x0B82); + rtl_clear_eth_phy_bit(hw, 0x10, BIT_4); + + rtl_mdio_write(hw, 0x1f, 0x0B80); + wait_cnt = 0; + do { + gphy_val = rtl_mdio_read(hw, 0x10); + rte_delay_us(100); + wait_cnt++; + } while ((gphy_val & BIT_6) && (wait_cnt < 1000)); + + if ((gphy_val & BIT_6) && wait_cnt == 1000) + bool_success = FALSE; - wait_cnt = 0; - do { - gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800); - rte_delay_us(100); - wait_cnt++; - } while ((gphy_val & BIT_6) && (wait_cnt < 1000)); + rtl_mdio_write(hw, 0x1f, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_clear_eth_phy_ocp_bit(hw, 0xB820, BIT_4); + + wait_cnt = 0; + do { + gphy_val = rtl_mdio_direct_read_phy_ocp(hw, 0xB800); + rte_delay_us(100); + wait_cnt++; + } while ((gphy_val & BIT_6) && (wait_cnt < 1000)); - if ((gphy_val & BIT_6) && wait_cnt == 1000) - bool_success = FALSE; + if ((gphy_val & BIT_6) && wait_cnt == 1000) + bool_success = FALSE; + break; + } if (!bool_success) PMD_INIT_LOG(NOTICE, "%s fail.", __func__); @@ -335,6 +465,11 @@ rtl_is_phy_disable_mode_enabled(struct rtl_hw *hw) u8 phy_disable_mode_enabled = FALSE; switch (hw->HwSuppCheckPhyDisableModeVer) { + case 1: + if (rtl_mac_ocp_read(hw, 0xDC20) & BIT_1) + phy_disable_mode_enabled = TRUE; + break; + case 2: case 3: if (RTL_R8(hw, 0xF2) & BIT_5) phy_disable_mode_enabled = TRUE; @@ -350,6 +485,11 @@ rtl_is_gpio_low(struct rtl_hw *hw) u8 gpio_low = FALSE; switch (hw->HwSuppCheckPhyDisableModeVer) { + case 1: + case 2: + if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_9)) + gpio_low = TRUE; + break; case 3: if (!(rtl_mac_ocp_read(hw, 0xDC04) & BIT_13)) gpio_low = TRUE; @@ -377,14 +517,41 @@ rtl_wait_phy_ups_resume(struct rtl_hw *hw, u16 PhyState) int i = 0; switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + do { + tmp_phy_state = rtl_mdio_real_read_phy_ocp(hw, 0x0A42, 0x10); + tmp_phy_state &= 0x7; + rte_delay_ms(1); + i++; + } while ((i < 100) && (tmp_phy_state != PhyState)); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: do { tmp_phy_state = rtl_mdio_direct_read_phy_ocp(hw, 0xA420); tmp_phy_state &= 0x7; rte_delay_ms(1); i++; } while ((i < 100) && (tmp_phy_state != PhyState)); + break; } } @@ -395,13 +562,43 @@ rtl_phy_power_up(struct rtl_hw *hw) return; rtl_mdio_write(hw, 0x1F, 0x0000); + rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE); + /* Wait mdc/mdio ready */ + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + rte_delay_ms(10); + break; + } + /* Wait ups resume (phy state 3) */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_wait_phy_ups_resume(hw, 3); + break; } } @@ -409,9 +606,36 @@ void rtl_powerup_pll(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) | BIT_7 | BIT_6); + break; } rtl_phy_power_up(hw); @@ -420,8 +644,67 @@ rtl_powerup_pll(struct rtl_hw *hw) static void rtl_phy_power_down(struct rtl_hw *hw) { + u32 csi_tmp; + + /* MCU PME intr masks */ + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC); + csi_tmp &= ~(BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7); + rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC); + break; + case CFG_METHOD_25: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC); + csi_tmp &= ~(BIT_3 | BIT_6); + rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC); + break; + } + rtl_mdio_write(hw, 0x1F, 0x0000); - rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN); + + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN); + break; + default: + rtl_mdio_write(hw, MII_BMCR, BMCR_PDOWN); + break; + } } void @@ -432,10 +715,75 @@ rtl_powerdown_pll(struct rtl_hw *hw) rtl_phy_power_down(hw); + if (!hw->HwIcVerUnknown) { + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7); + break; + } + } + switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - RTL_W8(hw, PMCH, RTL_R8(hw, PMCH) & ~BIT_7); + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~BIT_6); + RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_6); break; } } @@ -470,12 +818,16 @@ rtl_xmii_reset_enable(struct rtl_hw *hw) rtl_mdio_write(hw, 0x1F, 0x0000); rtl_mdio_write(hw, MII_ADVERTISE, rtl_mdio_read(hw, MII_ADVERTISE) & - ~(ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF | - ADVERTISE_100FULL)); + ~(ADVERTISE_10HALF | ADVERTISE_10FULL | + ADVERTISE_100HALF | ADVERTISE_100FULL)); rtl_mdio_write(hw, MII_CTRL1000, rtl_mdio_read(hw, MII_CTRL1000) & ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL)); - rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4) & - ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL)); + + if (rtl_is_8125(hw)) + rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, + rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4) & + ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL)); + rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); if (rtl_wait_phy_reset_complete(hw) == 0) @@ -488,7 +840,7 @@ rtl8125_set_hw_phy_before_init_phy_mcu(struct rtl_hw *hw) u16 phy_reg_value; switch (hw->mcfg) { - case CFG_METHOD_4: + case CFG_METHOD_50: rtl_mdio_direct_write_phy_ocp(hw, 0xBF86, 0x9000); rtl_set_eth_phy_ocp_bit(hw, 0xC402, BIT_10); @@ -516,8 +868,41 @@ rtl_get_hw_phy_mcu_code_ver(struct rtl_hw *hw) u16 hw_ram_code_ver = ~0; switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x801E); + hw_ram_code_ver = rtl_mdio_read(hw, 0x14); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E); hw_ram_code_ver = rtl_mdio_direct_read_phy_ocp(hw, 0xA438); break; @@ -547,8 +932,42 @@ static void rtl_write_hw_phy_mcu_code_ver(struct rtl_hw *hw) { switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + rtl_mdio_write(hw, 0x1F, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x801E); + rtl_mdio_write(hw, 0x14, hw->sw_ram_code_ver); + rtl_mdio_write(hw, 0x1F, 0x0000); + hw->hw_ram_code_ver = hw->sw_ram_code_ver; + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x801E); rtl_mdio_direct_write_phy_ocp(hw, 0xA438, hw->sw_ram_code_ver); hw->hw_ram_code_ver = hw->sw_ram_code_ver; @@ -560,6 +979,11 @@ static void rtl_enable_phy_disable_mode(struct rtl_hw *hw) { switch (hw->HwSuppCheckPhyDisableModeVer) { + case 1: + rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) | + BIT_1); + break; + case 2: case 3: RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_5); break; @@ -570,6 +994,11 @@ static void rtl_disable_phy_disable_mode(struct rtl_hw *hw) { switch (hw->HwSuppCheckPhyDisableModeVer) { + case 1: + rtl_mac_ocp_write(hw, 0xDC20, rtl_mac_ocp_read(hw, 0xDC20) & + ~BIT_1); + break; + case 2: case 3: RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_5); break; @@ -578,6 +1007,107 @@ rtl_disable_phy_disable_mode(struct rtl_hw *hw) rte_delay_ms(1); } +static int +rtl8168_phy_ram_code_check(struct rtl_hw *hw) +{ + u16 phy_reg_value; + int retval = TRUE; + + if (hw->mcfg == CFG_METHOD_21) { + rtl_mdio_write(hw, 0x1f, 0x0A40); + phy_reg_value = rtl_mdio_read(hw, 0x10); + phy_reg_value &= ~BIT_11; + rtl_mdio_write(hw, 0x10, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A00); + phy_reg_value = rtl_mdio_read(hw, 0x10); + phy_reg_value &= ~(BIT_12 | BIT_13 | BIT_14 | BIT_15); + rtl_mdio_write(hw, 0x10, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8010); + phy_reg_value = rtl_mdio_read(hw, 0x14); + phy_reg_value &= ~BIT_11; + rtl_mdio_write(hw, 0x14, phy_reg_value); + + retval = rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A40); + rtl_mdio_write(hw, 0x10, 0x0140); + + rtl_mdio_write(hw, 0x1f, 0x0A4A); + phy_reg_value = rtl_mdio_read(hw, 0x13); + phy_reg_value &= ~BIT_6; + phy_reg_value |= BIT_7; + rtl_mdio_write(hw, 0x13, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A44); + phy_reg_value = rtl_mdio_read(hw, 0x14); + phy_reg_value |= BIT_2; + rtl_mdio_write(hw, 0x14, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A50); + phy_reg_value = rtl_mdio_read(hw, 0x11); + phy_reg_value |= (BIT_11 | BIT_12); + rtl_mdio_write(hw, 0x11, phy_reg_value); + + retval = rtl_clear_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A40); + rtl_mdio_write(hw, 0x10, 0x1040); + + rtl_mdio_write(hw, 0x1f, 0x0A4A); + phy_reg_value = rtl_mdio_read(hw, 0x13); + phy_reg_value &= ~(BIT_6 | BIT_7); + rtl_mdio_write(hw, 0x13, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A44); + phy_reg_value = rtl_mdio_read(hw, 0x14); + phy_reg_value &= ~BIT_2; + rtl_mdio_write(hw, 0x14, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A50); + phy_reg_value = rtl_mdio_read(hw, 0x11); + phy_reg_value &= ~(BIT_11 | BIT_12); + rtl_mdio_write(hw, 0x11, phy_reg_value); + + rtl_mdio_write(hw, 0x1f, 0x0A43); + rtl_mdio_write(hw, 0x13, 0x8010); + phy_reg_value = rtl_mdio_read(hw, 0x14); + phy_reg_value |= BIT_11; + rtl_mdio_write(hw, 0x14, phy_reg_value); + + retval = rtl_set_phy_mcu_patch_request(hw); + + rtl_mdio_write(hw, 0x1f, 0x0A20); + phy_reg_value = rtl_mdio_read(hw, 0x13); + if (phy_reg_value & BIT_11) { + if (phy_reg_value & BIT_10) + retval = FALSE; + } + + retval = rtl_clear_phy_mcu_patch_request(hw); + + rte_delay_ms(2); + } + + rtl_mdio_write(hw, 0x1F, 0x0000); + + return retval; +} + +static void +rtl8168_set_phy_ram_code_check_fail_flag(struct rtl_hw *hw) +{ + u16 tmp_ushort; + + if (hw->mcfg == CFG_METHOD_21) { + tmp_ushort = rtl_mac_ocp_read(hw, 0xD3C0); + tmp_ushort |= BIT_0; + rtl_mac_ocp_write(hw, 0xD3C0, tmp_ushort); + } +} + static void rtl_init_hw_phy_mcu(struct rtl_hw *hw) { @@ -589,6 +1119,11 @@ rtl_init_hw_phy_mcu(struct rtl_hw *hw) if (rtl_check_hw_phy_mcu_code_ver(hw)) return; + if (!rtl_is_8125(hw) && !rtl8168_phy_ram_code_check(hw)) { + rtl8168_set_phy_ram_code_check_fail_flag(hw); + return; + } + if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(hw) && rtl_is_in_phy_disable_mode(hw)) require_disable_phy_disable_mode = TRUE; @@ -611,44 +1146,107 @@ static void rtl_disable_aldps(struct rtl_hw *hw) { u16 tmp_ushort; - u32 timeout, wait_cnt; - - tmp_ushort = rtl_mdio_real_read_phy_ocp(hw, 0xA430); - if (tmp_ushort & BIT_2) { - timeout = 0; - wait_cnt = 200; - rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2); + u32 timeout = 0; + u32 wait_cnt = 200; - do { - rte_delay_us(100); - - tmp_ushort = rtl_mac_ocp_read(hw, 0xE908); - - timeout++; - } while (!(tmp_ushort & BIT_7) && timeout < wait_cnt); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430); + if (tmp_ushort & BIT_2) + rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + tmp_ushort = rtl_mdio_real_direct_read_phy_ocp(hw, 0xA430); + if (tmp_ushort & BIT_2) { + rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_2); + + do { + rte_delay_us(100); + tmp_ushort = rtl_mac_ocp_read(hw, 0xE908); + timeout++; + } while (!(tmp_ushort & BIT_7) && timeout < wait_cnt); + } + break; } } static bool rtl_is_adv_eee_enabled(struct rtl_hw *hw) { + bool enabled = false; + switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_55: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + rtl_mdio_write(hw, 0x1F, 0x0A43); + if (rtl_mdio_read(hw, 0x10) & BIT_15) + enabled = true; + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: if (rtl_mdio_direct_read_phy_ocp(hw, 0xA430) & BIT_15) - return true; + enabled = true; break; default: break; } - return false; + return enabled; } static void _rtl_disable_adv_eee(struct rtl_hw *hw) { bool lock; + u16 data; if (rtl_is_adv_eee_enabled(hw)) lock = true; @@ -658,9 +1256,70 @@ _rtl_disable_adv_eee(struct rtl_hw *hw) if (lock) rtl_set_phy_mcu_patch_request(hw); - rtl_clear_mac_ocp_bit(hw, 0xE052, BIT_0); - rtl_clear_eth_phy_ocp_bit(hw, 0xA442, (BIT_12 | BIT_13)); - rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_15); + switch (hw->mcfg) { + case CFG_METHOD_25: + rtl_eri_write(hw, 0x1EA, 1, 0x00, ERIAR_ExGMAC); + + rtl_mdio_write(hw, 0x1F, 0x0A42); + data = rtl_mdio_read(hw, 0x16); + data &= ~BIT_1; + rtl_mdio_write(hw, 0x16, data); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_26: + data = rtl_mac_ocp_read(hw, 0xE052); + data &= ~BIT_0; + rtl_mac_ocp_write(hw, 0xE052, data); + + rtl_mdio_write(hw, 0x1F, 0x0A42); + data = rtl_mdio_read(hw, 0x16); + data &= ~BIT_1; + rtl_mdio_write(hw, 0x16, data); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_27: + case CFG_METHOD_28: + data = rtl_mac_ocp_read(hw, 0xE052); + data &= ~BIT_0; + rtl_mac_ocp_write(hw, 0xE052, data); + break; + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + data = rtl_mac_ocp_read(hw, 0xE052); + data &= ~BIT_0; + rtl_mac_ocp_write(hw, 0xE052, data); + + rtl_mdio_write(hw, 0x1F, 0x0A43); + data = rtl_mdio_read(hw, 0x10) & ~(BIT_15); + rtl_mdio_write(hw, 0x10, data); + + rtl_mdio_write(hw, 0x1F, 0x0A44); + data = rtl_mdio_read(hw, 0x11) & ~(BIT_12 | BIT_13 | BIT_14); + rtl_mdio_write(hw, 0x11, data); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_clear_mac_ocp_bit(hw, 0xE052, BIT_0); + rtl_clear_eth_phy_ocp_bit(hw, 0xA442, (BIT_12 | BIT_13)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA430, BIT_15); + break; + } if (lock) rtl_clear_phy_mcu_patch_request(hw); @@ -669,25 +1328,42 @@ _rtl_disable_adv_eee(struct rtl_hw *hw) static void rtl_disable_adv_eee(struct rtl_hw *hw) { + if (hw->mcfg < CFG_METHOD_25 || hw->mcfg == CFG_METHOD_37) + return; + switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: case CFG_METHOD_48: case CFG_METHOD_49: case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: - rtl8125_oob_mutex_lock(hw); + rtl_oob_mutex_lock(hw); break; } _rtl_disable_adv_eee(hw); switch (hw->mcfg) { + case CFG_METHOD_23: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: case CFG_METHOD_48: case CFG_METHOD_49: case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: - rtl8125_oob_mutex_unlock(hw); + rtl_oob_mutex_unlock(hw); break; } } @@ -695,7 +1371,39 @@ rtl_disable_adv_eee(struct rtl_hw *hw) static void rtl_disable_eee(struct rtl_hw *hw) { + u16 data; + u32 csi_tmp; + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC); + csi_tmp &= ~(BIT_1 | BIT_0); + rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC); + rtl_mdio_write(hw, 0x1F, 0x0A43); + data = rtl_mdio_read(hw, 0x11); + if (hw->mcfg == CFG_METHOD_36) + rtl_mdio_write(hw, 0x11, data | BIT_4); + else + rtl_mdio_write(hw, 0x11, data & ~BIT_4); + rtl_mdio_write(hw, 0x1F, 0x0A5D); + rtl_mdio_write(hw, 0x10, 0x0000); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; case CFG_METHOD_48: case CFG_METHOD_49: case CFG_METHOD_52: @@ -712,7 +1420,11 @@ rtl_disable_eee(struct rtl_hw *hw) break; case CFG_METHOD_50: case CFG_METHOD_51: - case CFG_METHOD_53 ... CFG_METHOD_57: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0)); rtl_set_eth_phy_ocp_bit(hw, 0xA432, BIT_4); @@ -723,7 +1435,9 @@ rtl_disable_eee(struct rtl_hw *hw) rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_7); rtl_clear_eth_phy_ocp_bit(hw, 0xA4A2, BIT_9); break; - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0)); rtl_clear_eth_phy_ocp_bit(hw, 0xA5D0, (MDIO_EEE_100TX | MDIO_EEE_1000T)); @@ -740,6 +1454,19 @@ rtl_disable_eee(struct rtl_hw *hw) break; } + switch (hw->mcfg) { + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + rtl_mdio_write(hw, 0x1F, 0x0A42); + rtl_clear_eth_phy_bit(hw, 0x14, BIT_7); + rtl_mdio_write(hw, 0x1F, 0x0A4A); + rtl_clear_eth_phy_bit(hw, 0x11, BIT_9); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + } + /* Advanced EEE */ rtl_disable_adv_eee(hw); } @@ -749,24 +1476,32 @@ rtl_hw_phy_config(struct rtl_hw *hw) { rtl_xmii_reset_enable(hw); + if (HW_DASH_SUPPORT_TYPE_3(hw) && hw->HwPkgDet == 0x06) + return; + rtl8125_set_hw_phy_before_init_phy_mcu(hw); rtl_init_hw_phy_mcu(hw); hw->hw_ops.hw_phy_config(hw); - switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - rtl_disable_aldps(hw); - break; - } + rtl_disable_aldps(hw); /* Legacy force mode (chap 22) */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: - default: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: rtl_clear_eth_phy_ocp_bit(hw, 0xA5B4, BIT_15); break; } @@ -784,7 +1519,11 @@ rtl_phy_restart_nway(struct rtl_hw *hw) return; rtl_mdio_write(hw, 0x1F, 0x0000); - rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); + if (rtl_is_8125(hw)) + rtl_mdio_write(hw, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); + else + rtl_mdio_write(hw, MII_BMCR, BMCR_RESET | BMCR_ANENABLE | + BMCR_ANRESTART); } static void @@ -819,11 +1558,45 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv) int rc = -EINVAL; /* Disable giga lite */ - rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9); - rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_0); + switch (hw->mcfg) { + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_35: + case CFG_METHOD_36: + rtl_mdio_write(hw, 0x1F, 0x0A42); + rtl_clear_eth_phy_bit(hw, 0x14, BIT_9); + rtl_mdio_write(hw, 0x1F, 0x0A40); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + rtl_mdio_write(hw, 0x1F, 0x0A42); + rtl_clear_eth_phy_bit(hw, 0x14, BIT_9 | BIT_7); + rtl_mdio_write(hw, 0x1F, 0x0A40); + rtl_mdio_write(hw, 0x1F, 0x0000); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9); + rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_0); - if (HW_SUPP_PHY_LINK_SPEED_5000M(hw)) - rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_1); + if (HW_SUPP_PHY_LINK_SPEED_5000M(hw)) + rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, BIT_1); + break; + } if (!rtl_is_speed_mode_valid(speed)) { speed = hw->HwSuppMaxPhyLinkSpeed; @@ -833,8 +1606,10 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv) giga_ctrl = rtl_mdio_read(hw, MII_CTRL1000); giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); - ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4); - ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL); + if (rtl_is_8125(hw)) { + ctrl_2500 = rtl_mdio_direct_read_phy_ocp(hw, 0xA5D4); + ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL | RTK_ADVERTISE_5000FULL); + } if (autoneg == AUTONEG_ENABLE) { /* N-way force */ @@ -867,7 +1642,8 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u32 adv) rtl_mdio_write(hw, 0x1f, 0x0000); rtl_mdio_write(hw, MII_ADVERTISE, auto_nego); rtl_mdio_write(hw, MII_CTRL1000, giga_ctrl); - rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, ctrl_2500); + if (rtl_is_8125(hw)) + rtl_mdio_direct_write_phy_ocp(hw, 0xA5D4, ctrl_2500); rtl_phy_restart_nway(hw); rte_delay_ms(20); } else { @@ -897,3 +1673,27 @@ rtl_set_speed(struct rtl_hw *hw) return ret; } + +void +rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask, + u16 setmask) +{ + u16 phy_reg_value; + + phy_reg_value = rtl_mdio_read(hw, addr); + phy_reg_value &= ~clearmask; + phy_reg_value |= setmask; + rtl_mdio_write(hw, addr, phy_reg_value); +} + +void +rtl_clear_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask) +{ + rtl_clear_and_set_eth_phy_bit(hw, addr, mask, 0); +} + +void +rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask) +{ + rtl_clear_and_set_eth_phy_bit(hw, addr, 0, mask); +} diff --git a/drivers/net/r8169/r8169_phy.h b/drivers/net/r8169/r8169_phy.h index 4d553f9712..ea1facba5b 100644 --- a/drivers/net/r8169/r8169_phy.h +++ b/drivers/net/r8169/r8169_phy.h @@ -109,6 +109,8 @@ #define MDIO_EEE_2_5GT 0x0001 #define MDIO_EEE_5GT 0x0002 +#define HW_SUPP_SERDES_PHY(_M) ((_M)->HwSuppSerDesPhyVer > 0) + void rtl_clear_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); void rtl_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); @@ -124,6 +126,7 @@ void rtl_clear_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); void rtl_set_eth_phy_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask); void rtl_ephy_write(struct rtl_hw *hw, int addr, int value); +u16 rtl_ephy_read(struct rtl_hw *hw, int addr); void rtl_clear_and_set_pcie_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask, u16 setmask); @@ -144,4 +147,12 @@ void rtl_hw_phy_config(struct rtl_hw *hw); int rtl_set_speed(struct rtl_hw *hw); +u32 rtl_mdio_real_read_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr); +void rtl_mdio_real_write_phy_ocp(struct rtl_hw *hw, u16 PageNum, u32 RegAddr, + u32 value); +void rtl_clear_and_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 clearmask, + u16 setmask); +void rtl_clear_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask); +void rtl_set_eth_phy_bit(struct rtl_hw *hw, u8 addr, u16 mask); + #endif /* R8169_PHY_H */ diff --git a/drivers/net/r8169/r8169_rxtx.c b/drivers/net/r8169/r8169_rxtx.c index 57b97338d4..eee91a639e 100644 --- a/drivers/net/r8169/r8169_rxtx.c +++ b/drivers/net/r8169/r8169_rxtx.c @@ -41,10 +41,6 @@ struct rtl_tx_desc { RTE_ATOMIC(u32) opts1; u32 opts2; u64 addr; - u32 reserved0; - u32 reserved1; - u32 reserved2; - u32 reserved3; }; /* Struct RxDesc in kernel r8169 */ @@ -187,6 +183,9 @@ enum _DescStatusBit { #define LSOPKTSIZE_MAX 0xffffU #define MSS_MAX 0x07ffu /* MSS value */ +typedef void (*rtl_clear_rdu_func)(struct rtl_hw *); +static rtl_clear_rdu_func rtl_clear_rdu; + /* ---------------------------------RX---------------------------------- */ static void @@ -384,8 +383,8 @@ rtl_alloc_rx_queue_mbufs(struct rtl_rx_queue *rxq) return 0; } -static int -rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads) +static void +rtl8125_hw_set_features(struct rtl_hw *hw, uint64_t offloads) { u16 cp_cmd; u32 rx_config; @@ -406,8 +405,35 @@ rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads) cp_cmd &= ~RxChkSum; RTL_W16(hw, CPlusCmd, cp_cmd); +} - return 0; +static void +rtl8168_hw_set_features(struct rtl_hw *hw, uint64_t offloads) +{ + u16 cp_cmd; + + cp_cmd = RTL_R16(hw, CPlusCmd); + + if (offloads & RTE_ETH_RX_OFFLOAD_CHECKSUM) + cp_cmd |= RxChkSum; + else + cp_cmd &= ~RxChkSum; + + if (offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) + cp_cmd |= RxVlan; + else + cp_cmd &= ~RxVlan; + + RTL_W16(hw, CPlusCmd, cp_cmd); +} + +static void +rtl_hw_set_features(struct rtl_hw *hw, uint64_t offloads) +{ + if (rtl_is_8125(hw)) + rtl8125_hw_set_features(hw, offloads); + else + rtl8168_hw_set_features(hw, offloads); } static void @@ -421,6 +447,18 @@ rtl_hw_set_rx_packet_filter(struct rtl_hw *hw) RTL_W32(hw, RxConfig, rx_mode | (RTL_R32(hw, RxConfig))); } +static void +rtl8125_clear_rdu(struct rtl_hw *hw) +{ + RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail)); +} + +static void +rtl8168_clear_rdu(struct rtl_hw *hw) +{ + RTL_W16(hw, IntrStatus, (RxOK | RxErr | RxDescUnavail)); +} + int rtl_rx_init(struct rte_eth_dev *dev) { @@ -428,7 +466,7 @@ rtl_rx_init(struct rte_eth_dev *dev) struct rtl_hw *hw = &adapter->hw; struct rtl_rx_queue *rxq; int ret; - u32 max_rx_pkt_size; + u32 csi_tmp, max_rx_pkt_size; rxq = dev->data->rx_queues[0]; @@ -463,6 +501,37 @@ rtl_rx_init(struct rte_eth_dev *dev) rtl_enable_cfg9346_write(hw); + switch (hw->mcfg) { + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + /* RX ftr mcu enable */ + csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC); + csi_tmp &= ~BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + csi_tmp |= BIT_0; + rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC); + + /* RSS disable */ + rtl_eri_write(hw, 0xC0, 2, 0x0000, ERIAR_ExGMAC); /* queue num = 1 */ + rtl_eri_write(hw, 0xB8, 4, 0x00000000, ERIAR_ExGMAC); + break; + } + /* RX accept type and csum vlan offload */ rtl_hw_set_features(hw, rxq->offloads); @@ -477,6 +546,11 @@ rtl_rx_init(struct rte_eth_dev *dev) dev->data->rx_queue_state[0] = RTE_ETH_QUEUE_STATE_STARTED; + if (rtl_is_8125(hw)) + rtl_clear_rdu = rtl8125_clear_rdu; + else + rtl_clear_rdu = rtl8168_clear_rdu; + return 0; } @@ -527,10 +601,10 @@ rtl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) uint16_t nb_rx = 0; uint16_t nb_hold = 0; uint16_t tail = rxq->rx_tail; + uint16_t pkt_len = 0; const uint16_t nb_rx_desc = rxq->nb_rx_desc; uint32_t opts1; uint32_t opts2; - uint16_t pkt_len = 0; uint64_t dma_addr; hw_ring = rxq->hw_ring; @@ -632,7 +706,7 @@ rtl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) rte_wmb(); /* Clear RDU */ - RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail)); + rtl_clear_rdu(hw); nb_hold = 0; } @@ -829,7 +903,7 @@ rtl_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, rte_wmb(); /* Clear RDU */ - RTL_W32(hw, ISR0_8125, (RxOK | RxErr | RxDescUnavail)); + rtl_clear_rdu(hw); nb_hold = 0; } @@ -941,7 +1015,7 @@ rtl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, txq = rte_zmalloc_socket("r8169 TX queue", sizeof(struct rtl_tx_queue), RTE_CACHE_LINE_SIZE, socket_id); - if (txq == NULL) { + if (!txq) { PMD_INIT_LOG(ERR, "Cannot allocate Tx queue structure"); return -ENOMEM; } @@ -995,6 +1069,44 @@ rtl_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, return 0; } +static void +rtl8125_set_tx_tag_num(struct rtl_hw *hw) +{ + u32 mac_ocp_data; + + mac_ocp_data = rtl_mac_ocp_read(hw, 0xE614); + mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8); + switch (hw->mcfg) { + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_53: + mac_ocp_data |= (2 << 8); + break; + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: + if (hw->EnableTxNoClose) + mac_ocp_data |= (4 << 8); + else + mac_ocp_data |= (3 << 8); + break; + default: + mac_ocp_data |= (3 << 8); + break; + } + rtl_mac_ocp_write(hw, 0xE614, mac_ocp_data); +} + +/* Set MTPS: Max Tx Pkt Size */ +static void +rtl8168_set_mtps(struct rtl_hw *hw) +{ + if (hw->mtu > RTE_ETHER_MTU) + RTL_W8(hw, MTPS, 0x27); + else + RTL_W8(hw, MTPS, 0x3F); +} + int rtl_tx_init(struct rte_eth_dev *dev) { @@ -1010,10 +1122,45 @@ rtl_tx_init(struct rte_eth_dev *dev) rtl_enable_cfg9346_write(hw); + if (rtl_is_8125(hw)) + rtl8125_set_tx_tag_num(hw); + else + rtl8168_set_mtps(hw); + /* Set TDFNR: TX Desc Fetch NumbeR */ switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_57: - case CFG_METHOD_69 ... CFG_METHOD_71: + case CFG_METHOD_21: + case CFG_METHOD_22: + case CFG_METHOD_23: + case CFG_METHOD_24: + case CFG_METHOD_25: + case CFG_METHOD_26: + case CFG_METHOD_27: + case CFG_METHOD_28: + case CFG_METHOD_29: + case CFG_METHOD_30: + case CFG_METHOD_31: + case CFG_METHOD_32: + case CFG_METHOD_33: + case CFG_METHOD_34: + case CFG_METHOD_35: + case CFG_METHOD_36: + case CFG_METHOD_37: + RTL_W8(hw, TDFNR, 0x4); + break; + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: + case CFG_METHOD_54: + case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_69: + case CFG_METHOD_70: + case CFG_METHOD_71: RTL_W8(hw, TDFNR, 0x10); break; } @@ -1187,7 +1334,12 @@ rtl_xmit_pkt(struct rtl_hw *hw, struct rtl_tx_queue *txq, rtl_setup_csum_offload(tx_pkt, tx_ol_flags, opts); switch (hw->mcfg) { - case CFG_METHOD_48 ... CFG_METHOD_53: + case CFG_METHOD_48: + case CFG_METHOD_49: + case CFG_METHOD_50: + case CFG_METHOD_51: + case CFG_METHOD_52: + case CFG_METHOD_53: rtl8125_ptp_patch(tx_pkt); break; } @@ -1270,7 +1422,7 @@ rtl_get_opts1(struct rtl_tx_desc *txd) } static void -rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq) +rtl8125_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq) { struct rtl_tx_entry *sw_ring = txq->sw_ring; struct rtl_tx_entry *txe; @@ -1282,7 +1434,7 @@ rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq) uint32_t tx_left; uint32_t tx_desc_closed, next_hw_desc_clo_ptr0; - if (txq == NULL) + if (!txq) return; if (enable_tx_no_close) { @@ -1319,8 +1471,54 @@ rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq) txq->tx_head = head; } -int -rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) +static void +rtl8168_tx_clean(struct rtl_hw *hw __rte_unused, struct rtl_tx_queue *txq) +{ + struct rtl_tx_entry *sw_ring = txq->sw_ring; + struct rtl_tx_entry *txe; + struct rtl_tx_desc *txd; + const uint16_t nb_tx_desc = txq->nb_tx_desc; + const int tx_tail = txq->tx_tail % nb_tx_desc; + int head = txq->tx_head; + uint16_t desc_freed = 0; + + if (!txq) + return; + + while (1) { + txd = &txq->hw_ring[head]; + + if (rtl_get_opts1(txd) & DescOwn) + break; + + txe = &sw_ring[head]; + if (txe->mbuf) { + rte_pktmbuf_free_seg(txe->mbuf); + txe->mbuf = NULL; + } + + head = (head + 1) % nb_tx_desc; + desc_freed++; + + if (head == tx_tail) + break; + } + + txq->tx_free += desc_freed; + txq->tx_head = head; +} + +static void +rtl_tx_clean(struct rtl_hw *hw, struct rtl_tx_queue *txq) +{ + if (rtl_is_8125(hw)) + rtl8125_tx_clean(hw, txq); + else + rtl8168_tx_clean(hw, txq); +} + +static int +rtl8125_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) { struct rtl_tx_queue *txq = tx_queue; struct rtl_hw *hw = txq->hw; @@ -1336,7 +1534,7 @@ rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) uint32_t status; uint32_t tx_desc_closed, next_hw_desc_clo_ptr0; - if (txq == NULL) + if (!txq) return -ENODEV; if (enable_tx_no_close) { @@ -1385,8 +1583,70 @@ rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) return count; } +static int +rtl8168_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) +{ + struct rtl_tx_queue *txq = tx_queue; + struct rtl_tx_entry *sw_ring = txq->sw_ring; + struct rtl_tx_entry *txe; + struct rtl_tx_desc *txd; + const uint16_t nb_tx_desc = txq->nb_tx_desc; + const int tx_tail = txq->tx_tail % nb_tx_desc; + int head = txq->tx_head; + uint16_t desc_freed = 0; + int count = 0; + uint32_t status; + + if (!txq) + return -ENODEV; + + while (1) { + txd = &txq->hw_ring[head]; + + status = rtl_get_opts1(txd); + + if (status & DescOwn) + break; + + txe = &sw_ring[head]; + if (txe->mbuf) { + rte_pktmbuf_free_seg(txe->mbuf); + txe->mbuf = NULL; + } + + head = (head + 1) % nb_tx_desc; + desc_freed++; + + if (status & LastFrag) { + count++; + if ((uint32_t)count == free_cnt) + break; + } + + if (head == tx_tail) + break; + } + + txq->tx_free += desc_freed; + txq->tx_head = head; + + return count; +} + +int +rtl_tx_done_cleanup(void *tx_queue, uint32_t free_cnt) +{ + struct rtl_tx_queue *txq = tx_queue; + struct rtl_hw *hw = txq->hw; + + if (rtl_is_8125(hw)) + return rtl8125_tx_done_cleanup(tx_queue, free_cnt); + else + return rtl8168_tx_done_cleanup(tx_queue, free_cnt); +} + static void -rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq) +rtl8125_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq) { if (hw->EnableTxNoClose) if (hw->HwSuppTxNoCloseVer > 3) @@ -1397,6 +1657,21 @@ rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq) RTL_W16(hw, TPPOLL_8125, BIT_0); } +static void +rtl8168_doorbell(struct rtl_hw *hw) +{ + RTL_W8(hw, TxPoll, NPQ); +} + +static void +rtl_doorbell(struct rtl_hw *hw, struct rtl_tx_queue *txq) +{ + if (rtl_is_8125(hw)) + rtl8125_doorbell(hw, txq); + else + rtl8168_doorbell(hw); +} + /* PMD transmit function */ uint16_t rtl_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/8] net/r8169: update HW configurations for 8125 and 8126 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 3/8] net/r8169: add support for RTL8127 Howard Wang ` (5 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/base/rtl8125b.c | 4 + drivers/net/r8169/base/rtl8125bp_mcu.c | 172 +-- drivers/net/r8169/base/rtl8125d.c | 99 +- drivers/net/r8169/base/rtl8125d_mcu.c | 1471 ++++++++++++++++++------ drivers/net/r8169/base/rtl8125d_mcu.h | 1 + drivers/net/r8169/base/rtl8126a.c | 8 +- drivers/net/r8169/base/rtl8126a_mcu.c | 888 ++++++++------ drivers/net/r8169/r8169_hw.h | 6 +- 8 files changed, 1791 insertions(+), 858 deletions(-) diff --git a/drivers/net/r8169/base/rtl8125b.c b/drivers/net/r8169/base/rtl8125b.c index 353b3a2466..06cd125bcf 100644 --- a/drivers/net/r8169/base/rtl8125b.c +++ b/drivers/net/r8169/base/rtl8125b.c @@ -336,6 +336,10 @@ rtl_hw_phy_config_8125b_2(struct rtl_hw *hw) (BIT_13 | BIT_10 | BIT_9 | BIT_8), (BIT_15 | BIT_14 | BIT_12 | BIT_11)); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8015); + rtl_set_eth_phy_ocp_bit(hw, 0xB87E, BIT_8); + rtl_mdio_direct_read_phy_ocp(hw, 0xB906); + rtl_set_eth_phy_ocp_bit(hw, 0xA424, BIT_3); } diff --git a/drivers/net/r8169/base/rtl8125bp_mcu.c b/drivers/net/r8169/base/rtl8125bp_mcu.c index 69ec072d5a..05e04dbf84 100644 --- a/drivers/net/r8169/base/rtl8125bp_mcu.c +++ b/drivers/net/r8169/base/rtl8125bp_mcu.c @@ -15,63 +15,20 @@ void rtl_set_mac_mcu_8125bp_1(struct rtl_hw *hw) { static const u16 mcu_patch_code_8125bp_1[] = { - 0xE003, 0xE007, 0xE01A, 0x1BC8, 0x46EB, 0xC302, 0xBB00, 0x0F14, 0xC211, - 0x400A, 0xF00A, 0xC20F, 0x400A, 0xF007, 0x73A4, 0xC20C, 0x400A, 0xF102, - 0x48B0, 0x9B20, 0x1B00, 0x9BA0, 0xC602, 0xBE00, 0x4364, 0xE6E0, 0xE6E2, - 0xC01C, 0xB406, 0x1000, 0xF016, 0xC61F, 0x400E, 0xF012, 0x218E, 0x25BE, - 0x1300, 0xF007, 0x7340, 0xC618, 0x400E, 0xF102, 0x48B0, 0x8320, 0xB400, - 0x2402, 0x1000, 0xF003, 0x7342, 0x8322, 0xB000, 0xE007, 0x7322, 0x9B42, - 0x7320, 0x9B40, 0x0300, 0x0300, 0xB006, 0xC302, 0xBB00, 0x413E, 0xE6E0, - 0xC01C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x1171, 0x0B17, 0x0816, 0x1108 + 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, + 0x73A4, 0xC20C, 0x400A, 0xF102, 0x48B0, 0x9B20, 0x1B00, 0x9BA0, 0xC602, + 0xBE00, 0x4364, 0xE6E0, 0xE6E2, 0xC01C, 0xB406, 0x1000, 0xF016, 0xC61F, + 0x400E, 0xF012, 0x218E, 0x25BE, 0x1300, 0xF007, 0x7340, 0xC618, 0x400E, + 0xF102, 0x48B0, 0x8320, 0xB400, 0x2402, 0x1000, 0xF003, 0x7342, 0x8322, + 0xB000, 0xE007, 0x7322, 0x9B42, 0x7320, 0x9B40, 0x0300, 0x0300, 0xB006, + 0xC302, 0xBB00, 0x413E, 0xE6E0, 0xC01C, 0x49D1, 0xC602, 0xBE00, 0x3F94, + 0x49D1, 0xC602, 0xBE00, 0x4030, 0xC602, 0xBE00, 0x3FDA, 0xC102, 0xB900, + 0x401A, 0xC102, 0xB900, 0x0000, 0xC002, 0xB800, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0x6936, 0x0A18, 0x0C02, 0x0D21 }; rtl_hw_disable_mac_mcu_bps(hw); @@ -84,109 +41,46 @@ rtl_set_mac_mcu_8125bp_1(struct rtl_hw *hw) rtl_mac_ocp_write(hw, 0xFC28, 0x0f10); rtl_mac_ocp_write(hw, 0xFC2A, 0x435c); rtl_mac_ocp_write(hw, 0xFC2C, 0x4112); + rtl_mac_ocp_write(hw, 0xFC2E, 0x3F92); + rtl_mac_ocp_write(hw, 0xFC30, 0x402E); + rtl_mac_ocp_write(hw, 0xFC32, 0x3FD6); + rtl_mac_ocp_write(hw, 0xFC34, 0x4018); - rtl_mac_ocp_write(hw, 0xFC48, 0x0007); + rtl_mac_ocp_write(hw, 0xFC48, 0x007F); } void rtl_set_mac_mcu_8125bp_2(struct rtl_hw *hw) { static const u16 mcu_patch_code_8125bp_2[] = { - 0xE010, 0xE033, 0xE046, 0xE04A, 0xE04C, 0xE04E, 0xE050, 0xE052, 0xE054, - 0xE056, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xB406, 0x1000, + 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, 0xC618, 0x400E, 0xF102, 0x48B0, 0x8320, 0xB400, 0x2402, 0x1000, 0xF003, 0x7342, 0x8322, 0xB000, 0xE007, 0x7322, 0x9B42, 0x7320, 0x9B40, 0x0300, 0x0300, 0xB006, 0xC302, 0xBB00, 0x4168, 0xE6E0, 0xC01C, 0xC211, 0x400A, 0xF00A, 0xC20F, 0x400A, 0xF007, 0x73A4, 0xC20C, 0x400A, 0xF102, 0x48B0, 0x9B20, 0x1B00, 0x9BA0, 0xC602, 0xBE00, 0x4392, 0xE6E0, 0xE6E2, 0xC01C, - 0x4166, 0x9CF6, 0xC002, 0xB800, 0x143C, 0xC602, 0xBE00, 0x0000, 0xC602, - 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC102, - 0xB900, 0x0000, 0xC002, 0xB800, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, - 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, - 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1171, - 0x0B18, 0x030D, 0x0A2A + 0x4166, 0x9CF6, 0xC002, 0xB800, 0x143C, 0x49D1, 0xC602, 0xBE00, 0x3FC4, + 0x49D1, 0xC602, 0xBE00, 0x405A, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC102, 0xB900, 0x0000, 0xC002, 0xB800, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 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)); + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + rtl_mac_ocp_write(hw, 0xFC28, 0x413C); rtl_mac_ocp_write(hw, 0xFC2A, 0x438A); rtl_mac_ocp_write(hw, 0xFC2C, 0x143A); - rtl_mac_ocp_write(hw, 0xFC48, 0x0007); + rtl_mac_ocp_write(hw, 0xFC2E, 0x3FC2); + rtl_mac_ocp_write(hw, 0xFC30, 0x4058); + + rtl_mac_ocp_write(hw, 0xFC48, 0x001F); } /* ------------------------------------PHY 8125BP--------------------------------------- */ diff --git a/drivers/net/r8169/base/rtl8125d.c b/drivers/net/r8169/base/rtl8125d.c index 5a00733498..3d4b60abc9 100644 --- a/drivers/net/r8169/base/rtl8125d.c +++ b/drivers/net/r8169/base/rtl8125d.c @@ -39,17 +39,22 @@ rtl_hw_phy_config_8125d_1(struct rtl_hw *hw) rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF8E, 0x3C00, 0x2800); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x4000); - rtl_set_eth_phy_ocp_bit(hw, 0xBCD8, (BIT_15 | BIT_14)); + rtl_set_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x4000); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC80, 0x001F, 0x0004); - rtl_set_eth_phy_ocp_bit(hw, 0xBC82, (BIT_15 | BIT_14 | BIT_13)); - rtl_set_eth_phy_ocp_bit(hw, 0xBC82, (BIT_12 | BIT_11 | BIT_10)); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_15 | BIT_14 | BIT_13); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_12 | BIT_11 | BIT_10); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC80, 0x001F, 0x0005); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC82, 0x00E0, 0x0040); - rtl_set_eth_phy_ocp_bit(hw, 0xBC82, (BIT_4 | BIT_3 | BIT_2)); - rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, (BIT_15 | BIT_14)); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_4 | BIT_3 | BIT_2); + rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x8000); - rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, (BIT_15 | BIT_14)); + rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); + + rtl_clear_eth_phy_ocp_bit(hw, 0xBD70, BIT_8); + rtl_set_eth_phy_ocp_bit(hw, 0xA466, BIT_1); + rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x836a); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, 0xFF00); rtl_clear_phy_mcu_patch_request(hw); @@ -72,7 +77,17 @@ rtl_hw_phy_config_8125d_1(struct rtl_hw *hw) rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0600); } - rtl_clear_eth_phy_ocp_bit(hw, 0xAD40, (BIT_5 | BIT_4)); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAC7E, 0x01FC, 0x00B4); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8105); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x7A00); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8117); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x3A00); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8103); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x7400); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8115); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x3400); + + rtl_clear_eth_phy_ocp_bit(hw, 0xAD40, BIT_5 | BIT_4); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAD66, 0x000F, 0x0007); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAD68, 0xF000, 0x8000); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAD68, 0x0F00, 0x0500); @@ -136,25 +151,25 @@ rtl_hw_phy_config_8125d_1(struct rtl_hw *hw) rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC3A, 0x000F, 0x0006); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8064); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8067); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x806A); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x806D); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8070); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8073); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8076); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8079); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x807C); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x807F); - rtl_clear_eth_phy_ocp_bit(hw, 0xA438, (BIT_10 | BIT_9 | BIT_8)); + rtl_clear_eth_phy_ocp_bit(hw, 0xA438, BIT_10 | BIT_9 | BIT_8); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBFA0, 0xFF70, 0x5500); rtl_mdio_direct_write_phy_ocp(hw, 0xBFA2, 0x9D00); @@ -183,6 +198,11 @@ rtl_hw_phy_config_8125d_1(struct rtl_hw *hw) rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x1700); } + rtl_clear_eth_phy_ocp_bit(hw, 0xA4E0, BIT_15); + + rtl_clear_eth_phy_ocp_bit(hw, 0xA5D4, BIT_5); + rtl_clear_eth_phy_ocp_bit(hw, 0xA654, BIT_11); + rtl_set_eth_phy_ocp_bit(hw, 0xA430, BIT_12 | BIT_0); rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_7); } @@ -191,6 +211,49 @@ static void rtl_hw_phy_config_8125d_2(struct rtl_hw *hw) { rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11); + + rtl_set_phy_mcu_patch_request(hw); + + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x4000); + rtl_set_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x4000); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC80, 0x001F, 0x0004); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_15 | BIT_14 | BIT_13); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_12 | BIT_11 | BIT_10); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC80, 0x001F, 0x0005); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBC82, 0x00E0, 0x0040); + rtl_set_eth_phy_ocp_bit(hw, 0xBC82, BIT_4 | BIT_3 | BIT_2); + rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBCD8, 0xC000, 0x8000); + rtl_clear_eth_phy_ocp_bit(hw, 0xBCD8, BIT_15 | BIT_14); + + rtl_clear_phy_mcu_patch_request(hw); + + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xAC7E, 0x01FC, 0x00B4); + + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8105); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x7A00); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8117); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x3A00); + + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8103); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x7400); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8115); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x3400); + + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FEB); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0500); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FEA); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0700); + + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x80D6); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0xEF00); + + rtl_clear_eth_phy_ocp_bit(hw, 0xA5D4, BIT_5); + rtl_clear_eth_phy_ocp_bit(hw, 0xA654, BIT_11); + + rtl_set_eth_phy_ocp_bit(hw, 0xA430, BIT_12 | BIT_0); + rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_7); } static void @@ -230,7 +293,7 @@ hw_phy_mcu_config_8125d(struct rtl_hw *hw) rtl_set_phy_mcu_8125d_1(hw); break; case CFG_METHOD_57: - /* Nothing to do */ + rtl_set_phy_mcu_8125d_2(hw); break; } } diff --git a/drivers/net/r8169/base/rtl8125d_mcu.c b/drivers/net/r8169/base/rtl8125d_mcu.c index 2081eb34e8..8f01b5414e 100644 --- a/drivers/net/r8169/base/rtl8125d_mcu.c +++ b/drivers/net/r8169/base/rtl8125d_mcu.c @@ -124,8 +124,8 @@ static const u16 phy_mcu_ram_code_8125d_1_1[] = { 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x8018, 0xa438, 0x1800, 0xa438, 0x8021, 0xa438, 0x1800, 0xa438, 0x8029, 0xa438, 0x1800, 0xa438, 0x8031, - 0xa438, 0x1800, 0xa438, 0x8035, 0xa438, 0x1800, 0xa438, 0x8035, - 0xa438, 0x1800, 0xa438, 0x8035, 0xa438, 0xd711, 0xa438, 0x6081, + 0xa438, 0x1800, 0xa438, 0x8035, 0xa438, 0x1800, 0xa438, 0x819c, + 0xa438, 0x1800, 0xa438, 0x81e9, 0xa438, 0xd711, 0xa438, 0x6081, 0xa438, 0x8904, 0xa438, 0x1800, 0xa438, 0x2021, 0xa438, 0xa904, 0xa438, 0x1800, 0xa438, 0x2021, 0xa438, 0xd75f, 0xa438, 0x4083, 0xa438, 0xd503, 0xa438, 0xa908, 0xa438, 0x87f0, 0xa438, 0x1000, @@ -134,363 +134,593 @@ static const u16 phy_mcu_ram_code_8125d_1_1[] = { 0xa438, 0x1434, 0xa438, 0x1800, 0xa438, 0x14a5, 0xa438, 0xc504, 0xa438, 0xce20, 0xa438, 0xcf01, 0xa438, 0xd70a, 0xa438, 0x4005, 0xa438, 0xcf02, 0xa438, 0x1800, 0xa438, 0x1c50, 0xa438, 0xa980, - 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x14f3, 0xa436, 0xA026, - 0xa438, 0xffff, 0xa436, 0xA024, 0xa438, 0xffff, 0xa436, 0xA022, - 0xa438, 0xffff, 0xa436, 0xA020, 0xa438, 0x14f2, 0xa436, 0xA006, + 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x14f3, 0xa438, 0xd75e, + 0xa438, 0x67b1, 0xa438, 0xd504, 0xa438, 0xd71e, 0xa438, 0x65bb, + 0xa438, 0x63da, 0xa438, 0x61f9, 0xa438, 0x0cf0, 0xa438, 0x0c10, + 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0808, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0x0cf0, 0xa438, 0x0470, 0xa438, 0x0cf0, + 0xa438, 0x0430, 0xa438, 0x0cf0, 0xa438, 0x0410, 0xa438, 0xf02a, + 0xa438, 0x0cf0, 0xa438, 0x0c20, 0xa438, 0xd505, 0xa438, 0x0c0f, + 0xa438, 0x0804, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0x0cf0, + 0xa438, 0x0470, 0xa438, 0x0cf0, 0xa438, 0x0430, 0xa438, 0x0cf0, + 0xa438, 0x0420, 0xa438, 0xf01c, 0xa438, 0x0cf0, 0xa438, 0x0c40, + 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0802, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0x0cf0, 0xa438, 0x0470, 0xa438, 0x0cf0, + 0xa438, 0x0450, 0xa438, 0x0cf0, 0xa438, 0x0440, 0xa438, 0xf00e, + 0xa438, 0x0cf0, 0xa438, 0x0c80, 0xa438, 0xd505, 0xa438, 0x0c0f, + 0xa438, 0x0801, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0x0cf0, + 0xa438, 0x04b0, 0xa438, 0x0cf0, 0xa438, 0x0490, 0xa438, 0x0cf0, + 0xa438, 0x0480, 0xa438, 0xd501, 0xa438, 0xce00, 0xa438, 0xd500, + 0xa438, 0xc48e, 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd718, + 0xa438, 0x5faf, 0xa438, 0xd504, 0xa438, 0x8e01, 0xa438, 0x8c0f, + 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x17e0, 0xa438, 0xd504, + 0xa438, 0xd718, 0xa438, 0x4074, 0xa438, 0x6195, 0xa438, 0xf005, + 0xa438, 0x60f5, 0xa438, 0x0c03, 0xa438, 0x0d00, 0xa438, 0xf009, + 0xa438, 0x0c03, 0xa438, 0x0d01, 0xa438, 0xf006, 0xa438, 0x0c03, + 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c03, 0xa438, 0x0d03, + 0xa438, 0xd500, 0xa438, 0xd706, 0xa438, 0x2529, 0xa438, 0x809c, + 0xa438, 0xd718, 0xa438, 0x607b, 0xa438, 0x40da, 0xa438, 0xf00f, + 0xa438, 0x431a, 0xa438, 0xf021, 0xa438, 0xd718, 0xa438, 0x617b, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0x1000, 0xa438, 0x1ad1, + 0xa438, 0xd718, 0xa438, 0x608e, 0xa438, 0xd73e, 0xa438, 0x5f34, + 0xa438, 0xf020, 0xa438, 0xf053, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0x1000, 0xa438, 0x1ad1, 0xa438, 0xd718, 0xa438, 0x608e, + 0xa438, 0xd73e, 0xa438, 0x5f34, 0xa438, 0xf023, 0xa438, 0xf067, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0x1000, 0xa438, 0x1ad1, + 0xa438, 0xd718, 0xa438, 0x608e, 0xa438, 0xd73e, 0xa438, 0x5f34, + 0xa438, 0xf026, 0xa438, 0xf07b, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0x1000, 0xa438, 0x1ad1, 0xa438, 0xd718, 0xa438, 0x608e, + 0xa438, 0xd73e, 0xa438, 0x5f34, 0xa438, 0xf029, 0xa438, 0xf08f, + 0xa438, 0x1000, 0xa438, 0x8173, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0xd73e, 0xa438, 0x7fb4, 0xa438, 0x1000, 0xa438, 0x8188, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd718, 0xa438, 0x5fae, + 0xa438, 0xf028, 0xa438, 0x1000, 0xa438, 0x8173, 0xa438, 0x1000, + 0xa438, 0x1a41, 0xa438, 0xd73e, 0xa438, 0x7fb4, 0xa438, 0x1000, + 0xa438, 0x8188, 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd718, + 0xa438, 0x5fae, 0xa438, 0xf039, 0xa438, 0x1000, 0xa438, 0x8173, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd73e, 0xa438, 0x7fb4, + 0xa438, 0x1000, 0xa438, 0x8188, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0xd718, 0xa438, 0x5fae, 0xa438, 0xf04a, 0xa438, 0x1000, + 0xa438, 0x8173, 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd73e, + 0xa438, 0x7fb4, 0xa438, 0x1000, 0xa438, 0x8188, 0xa438, 0x1000, + 0xa438, 0x1a41, 0xa438, 0xd718, 0xa438, 0x5fae, 0xa438, 0xf05b, + 0xa438, 0xd719, 0xa438, 0x4119, 0xa438, 0xd504, 0xa438, 0xac01, + 0xa438, 0xae01, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a2f, + 0xa438, 0xf00a, 0xa438, 0xd719, 0xa438, 0x4118, 0xa438, 0xd504, + 0xa438, 0xac11, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa410, + 0xa438, 0xce00, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0xd718, 0xa438, 0x5fb0, 0xa438, 0xd505, 0xa438, 0xd719, + 0xa438, 0x4079, 0xa438, 0xa80f, 0xa438, 0xf05d, 0xa438, 0x4b98, + 0xa438, 0xa808, 0xa438, 0xf05a, 0xa438, 0xd719, 0xa438, 0x4119, + 0xa438, 0xd504, 0xa438, 0xac02, 0xa438, 0xae01, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a2f, 0xa438, 0xf00a, 0xa438, 0xd719, + 0xa438, 0x4118, 0xa438, 0xd504, 0xa438, 0xac22, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0xa420, 0xa438, 0xce00, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd718, 0xa438, 0x5fb0, + 0xa438, 0xd505, 0xa438, 0xd719, 0xa438, 0x4079, 0xa438, 0xa80f, + 0xa438, 0xf03f, 0xa438, 0x47d8, 0xa438, 0xa804, 0xa438, 0xf03c, + 0xa438, 0xd719, 0xa438, 0x4119, 0xa438, 0xd504, 0xa438, 0xac04, + 0xa438, 0xae01, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a2f, + 0xa438, 0xf00a, 0xa438, 0xd719, 0xa438, 0x4118, 0xa438, 0xd504, + 0xa438, 0xac44, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa440, + 0xa438, 0xce00, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a41, + 0xa438, 0xd718, 0xa438, 0x5fb0, 0xa438, 0xd505, 0xa438, 0xd719, + 0xa438, 0x4079, 0xa438, 0xa80f, 0xa438, 0xf021, 0xa438, 0x4418, + 0xa438, 0xa802, 0xa438, 0xf01e, 0xa438, 0xd719, 0xa438, 0x4119, + 0xa438, 0xd504, 0xa438, 0xac08, 0xa438, 0xae01, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a2f, 0xa438, 0xf00a, 0xa438, 0xd719, + 0xa438, 0x4118, 0xa438, 0xd504, 0xa438, 0xac88, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0xa480, 0xa438, 0xce00, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a41, 0xa438, 0xd718, 0xa438, 0x5fb0, + 0xa438, 0xd505, 0xa438, 0xd719, 0xa438, 0x4079, 0xa438, 0xa80f, + 0xa438, 0xf003, 0xa438, 0x4058, 0xa438, 0xa801, 0xa438, 0x1800, + 0xa438, 0x16ed, 0xa438, 0xd73e, 0xa438, 0xd505, 0xa438, 0x3088, + 0xa438, 0x817a, 0xa438, 0x6193, 0xa438, 0x6132, 0xa438, 0x60d1, + 0xa438, 0x3298, 0xa438, 0x8185, 0xa438, 0xf00a, 0xa438, 0xa808, + 0xa438, 0xf008, 0xa438, 0xa804, 0xa438, 0xf006, 0xa438, 0xa802, + 0xa438, 0xf004, 0xa438, 0xa801, 0xa438, 0xf002, 0xa438, 0xa80f, + 0xa438, 0xd500, 0xa438, 0x0800, 0xa438, 0xd505, 0xa438, 0xd75e, + 0xa438, 0x6211, 0xa438, 0xd71e, 0xa438, 0x619b, 0xa438, 0x611a, + 0xa438, 0x6099, 0xa438, 0x0c0f, 0xa438, 0x0808, 0xa438, 0xf009, + 0xa438, 0x0c0f, 0xa438, 0x0804, 0xa438, 0xf006, 0xa438, 0x0c0f, + 0xa438, 0x0802, 0xa438, 0xf003, 0xa438, 0x0c0f, 0xa438, 0x0801, + 0xa438, 0xd500, 0xa438, 0x0800, 0xa438, 0xd500, 0xa438, 0xc48d, + 0xa438, 0xd504, 0xa438, 0x8d03, 0xa438, 0xd701, 0xa438, 0x4045, + 0xa438, 0xad02, 0xa438, 0xd504, 0xa438, 0xd706, 0xa438, 0x2529, + 0xa438, 0x81ad, 0xa438, 0xd718, 0xa438, 0x607b, 0xa438, 0x40da, + 0xa438, 0xf013, 0xa438, 0x441a, 0xa438, 0xf02d, 0xa438, 0xd718, + 0xa438, 0x61fb, 0xa438, 0xbb01, 0xa438, 0xd75e, 0xa438, 0x6171, + 0xa438, 0x0cf0, 0xa438, 0x0c10, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0x0cf0, 0xa438, 0x0410, 0xa438, 0xce00, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0808, 0xa438, 0xf02a, 0xa438, 0xbb02, + 0xa438, 0xd75e, 0xa438, 0x6171, 0xa438, 0x0cf0, 0xa438, 0x0c20, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0x0cf0, 0xa438, 0x0420, + 0xa438, 0xce00, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0804, + 0xa438, 0xf01c, 0xa438, 0xbb04, 0xa438, 0xd75e, 0xa438, 0x6171, + 0xa438, 0x0cf0, 0xa438, 0x0c40, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0x0cf0, 0xa438, 0x0440, 0xa438, 0xce00, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0802, 0xa438, 0xf00e, 0xa438, 0xbb08, + 0xa438, 0xd75e, 0xa438, 0x6171, 0xa438, 0x0cf0, 0xa438, 0x0c80, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0x0cf0, 0xa438, 0x0480, + 0xa438, 0xce00, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0801, + 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x1616, 0xa436, 0xA026, + 0xa438, 0xffff, 0xa436, 0xA024, 0xa438, 0x15d8, 0xa436, 0xA022, + 0xa438, 0x161f, 0xa436, 0xA020, 0xa438, 0x14f2, 0xa436, 0xA006, 0xa438, 0x1c4f, 0xa436, 0xA004, 0xa438, 0x1433, 0xa436, 0xA002, 0xa438, 0x13c1, 0xa436, 0xA000, 0xa438, 0x2020, 0xa436, 0xA008, - 0xa438, 0x1f00, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, + 0xa438, 0x7f00, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, 0xa438, 0x07f8, 0xa436, 0xA014, 0xa438, 0xd04d, 0xa438, 0x8904, - 0xa438, 0x813C, 0xa438, 0xA13D, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x813C, 0xa438, 0xA13D, 0xa438, 0xcc01, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA152, 0xa438, 0x1384, 0xa436, 0xA154, 0xa438, 0x1fa8, 0xa436, 0xA156, 0xa438, 0x218B, - 0xa436, 0xA158, 0xa438, 0x21B8, 0xa436, 0xA15A, 0xa438, 0x3fff, + 0xa436, 0xA158, 0xa438, 0x21B8, 0xa436, 0xA15A, 0xa438, 0x021c, 0xa436, 0xA15C, 0xa438, 0x3fff, 0xa436, 0xA15E, 0xa438, 0x3fff, - 0xa436, 0xA160, 0xa438, 0x3fff, 0xa436, 0xA150, 0xa438, 0x000f, - 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x1ff8, - 0xa436, 0xA014, 0xa438, 0x001c, 0xa438, 0xce15, 0xa438, 0xd105, - 0xa438, 0xa410, 0xa438, 0x8320, 0xa438, 0xFFD7, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa436, 0xA164, 0xa438, 0x0260, 0xa436, 0xA166, - 0xa438, 0x0add, 0xa436, 0xA168, 0xa438, 0x05CC, 0xa436, 0xA16A, - 0xa438, 0x05C5, 0xa436, 0xA16C, 0xa438, 0x0429, 0xa436, 0xA16E, - 0xa438, 0x07B6, 0xa436, 0xA170, 0xa438, 0x0259, 0xa436, 0xA172, - 0xa438, 0x3fff, 0xa436, 0xA162, 0xa438, 0x003f, 0xa436, 0xA016, - 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, - 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x8023, - 0xa438, 0x1800, 0xa438, 0x80e6, 0xa438, 0x1800, 0xa438, 0x80f0, - 0xa438, 0x1800, 0xa438, 0x80f8, 0xa438, 0x1800, 0xa438, 0x816c, - 0xa438, 0x1800, 0xa438, 0x817d, 0xa438, 0x1800, 0xa438, 0x818b, - 0xa438, 0xa801, 0xa438, 0x9308, 0xa438, 0xb201, 0xa438, 0xb301, + 0xa436, 0xA160, 0xa438, 0x3fff, 0xa436, 0xA150, 0xa438, 0x001f, + 0xa436, 0xA016, 0xa438, 0x0010, 0xa436, 0xA012, 0xa438, 0x0000, + 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, + 0xa438, 0x8013, 0xa438, 0x1800, 0xa438, 0x803a, 0xa438, 0x1800, + 0xa438, 0x8045, 0xa438, 0x1800, 0xa438, 0x8049, 0xa438, 0x1800, + 0xa438, 0x804d, 0xa438, 0x1800, 0xa438, 0x8059, 0xa438, 0x1800, + 0xa438, 0x805d, 0xa438, 0xc2ff, 0xa438, 0x1800, 0xa438, 0x0042, + 0xa438, 0x1000, 0xa438, 0x02e5, 0xa438, 0x1000, 0xa438, 0x02b4, + 0xa438, 0xd701, 0xa438, 0x40e3, 0xa438, 0xd700, 0xa438, 0x5f6c, + 0xa438, 0x1000, 0xa438, 0x8021, 0xa438, 0x1800, 0xa438, 0x0073, + 0xa438, 0x1800, 0xa438, 0x0084, 0xa438, 0xd701, 0xa438, 0x4061, + 0xa438, 0xba0f, 0xa438, 0xf004, 0xa438, 0x4060, 0xa438, 0x1000, + 0xa438, 0x802a, 0xa438, 0xba10, 0xa438, 0x0800, 0xa438, 0xd700, + 0xa438, 0x60bb, 0xa438, 0x611c, 0xa438, 0x0c0f, 0xa438, 0x1a01, + 0xa438, 0xf00a, 0xa438, 0x60fc, 0xa438, 0x0c0f, 0xa438, 0x1a02, + 0xa438, 0xf006, 0xa438, 0x0c0f, 0xa438, 0x1a04, 0xa438, 0xf003, + 0xa438, 0x0c0f, 0xa438, 0x1a08, 0xa438, 0x0800, 0xa438, 0x0c0f, + 0xa438, 0x0504, 0xa438, 0xad02, 0xa438, 0x1000, 0xa438, 0x02c0, + 0xa438, 0xd700, 0xa438, 0x5fac, 0xa438, 0x1000, 0xa438, 0x8021, + 0xa438, 0x1800, 0xa438, 0x0139, 0xa438, 0x9a1f, 0xa438, 0x8bf0, + 0xa438, 0x1800, 0xa438, 0x02df, 0xa438, 0x9a1f, 0xa438, 0x9910, + 0xa438, 0x1800, 0xa438, 0x02d7, 0xa438, 0xad02, 0xa438, 0x8d01, + 0xa438, 0x9a1f, 0xa438, 0x9910, 0xa438, 0x9860, 0xa438, 0xcb00, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0x85f0, 0xa438, 0xd500, + 0xa438, 0x1800, 0xa438, 0x015c, 0xa438, 0x8580, 0xa438, 0x8d02, + 0xa438, 0x1800, 0xa438, 0x018f, 0xa438, 0x0c0f, 0xa438, 0x0503, + 0xa438, 0xad02, 0xa438, 0x1800, 0xa438, 0x00dd, 0xa436, 0xA08E, + 0xa438, 0x00db, 0xa436, 0xA08C, 0xa438, 0x018e, 0xa436, 0xA08A, + 0xa438, 0x015a, 0xa436, 0xA088, 0xa438, 0x02d6, 0xa436, 0xA086, + 0xa438, 0x02de, 0xa436, 0xA084, 0xa438, 0x0137, 0xa436, 0xA082, + 0xa438, 0x0071, 0xa436, 0xA080, 0xa438, 0x0041, 0xa436, 0xA090, + 0xa438, 0x00ff, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, + 0xa438, 0x1ff8, 0xa436, 0xA014, 0xa438, 0x001c, 0xa438, 0xce15, + 0xa438, 0xd105, 0xa438, 0xa410, 0xa438, 0x8320, 0xa438, 0xFFD7, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA164, 0xa438, 0x0260, + 0xa436, 0xA166, 0xa438, 0x0add, 0xa436, 0xA168, 0xa438, 0x05CC, + 0xa436, 0xA16A, 0xa438, 0x05C5, 0xa436, 0xA16C, 0xa438, 0x0429, + 0xa436, 0xA16E, 0xa438, 0x07B6, 0xa436, 0xA170, 0xa438, 0x0259, + 0xa436, 0xA172, 0xa438, 0x3fff, 0xa436, 0xA162, 0xa438, 0x003f, + 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x0000, + 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, + 0xa438, 0x8023, 0xa438, 0x1800, 0xa438, 0x814c, 0xa438, 0x1800, + 0xa438, 0x8156, 0xa438, 0x1800, 0xa438, 0x815e, 0xa438, 0x1800, + 0xa438, 0x8210, 0xa438, 0x1800, 0xa438, 0x8221, 0xa438, 0x1800, + 0xa438, 0x822f, 0xa438, 0xa801, 0xa438, 0x9308, 0xa438, 0xb201, + 0xa438, 0xb301, 0xa438, 0xd701, 0xa438, 0x4000, 0xa438, 0xd2ff, + 0xa438, 0xb302, 0xa438, 0xd200, 0xa438, 0xb201, 0xa438, 0xb309, 0xa438, 0xd701, 0xa438, 0x4000, 0xa438, 0xd2ff, 0xa438, 0xb302, - 0xa438, 0xd200, 0xa438, 0xb201, 0xa438, 0xb309, 0xa438, 0xd701, - 0xa438, 0x4000, 0xa438, 0xd2ff, 0xa438, 0xb302, 0xa438, 0xd200, - 0xa438, 0xa800, 0xa438, 0x1800, 0xa438, 0x0031, 0xa438, 0xd700, - 0xa438, 0x4543, 0xa438, 0xd71f, 0xa438, 0x40fe, 0xa438, 0xd1b7, - 0xa438, 0xd049, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd700, - 0xa438, 0x5fbb, 0xa438, 0xa220, 0xa438, 0x8501, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0x0c70, 0xa438, 0x0b00, 0xa438, 0x0c07, - 0xa438, 0x0604, 0xa438, 0x9503, 0xa438, 0xa510, 0xa438, 0xce49, - 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x8520, 0xa438, 0xa520, - 0xa438, 0xa501, 0xa438, 0xd105, 0xa438, 0xd047, 0xa438, 0x1000, - 0xa438, 0x109e, 0xa438, 0xd707, 0xa438, 0x6087, 0xa438, 0xd700, - 0xa438, 0x5f7b, 0xa438, 0xffe9, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0x8501, 0xa438, 0xd707, 0xa438, 0x5e08, 0xa438, 0x8530, - 0xa438, 0xba20, 0xa438, 0xf00c, 0xa438, 0xd700, 0xa438, 0x4098, - 0xa438, 0xd1ef, 0xa438, 0xd047, 0xa438, 0xf003, 0xa438, 0xd1db, - 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd700, - 0xa438, 0x5fbb, 0xa438, 0x8980, 0xa438, 0xd704, 0xa438, 0x40a3, - 0xa438, 0xd702, 0xa438, 0x4060, 0xa438, 0x8410, 0xa438, 0xf002, - 0xa438, 0xa410, 0xa438, 0xce02, 0xa438, 0x1000, 0xa438, 0x10be, - 0xa438, 0xcd81, 0xa438, 0xd412, 0xa438, 0x1000, 0xa438, 0x1069, - 0xa438, 0xcd82, 0xa438, 0xd40e, 0xa438, 0x1000, 0xa438, 0x1069, - 0xa438, 0xcd83, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd71f, - 0xa438, 0x5fb4, 0xa438, 0xa00a, 0xa438, 0xa340, 0xa438, 0x0c06, - 0xa438, 0x0102, 0xa438, 0xa240, 0xa438, 0xa290, 0xa438, 0xa324, - 0xa438, 0xab02, 0xa438, 0xd13e, 0xa438, 0xd05a, 0xa438, 0xd13e, - 0xa438, 0xd06b, 0xa438, 0xcd84, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0xd706, 0xa438, 0x6079, 0xa438, 0xd700, 0xa438, 0x5f5c, - 0xa438, 0xcd8a, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, - 0xa438, 0x6079, 0xa438, 0xd700, 0xa438, 0x5f5d, 0xa438, 0xcd8b, - 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xcd8c, 0xa438, 0xd700, - 0xa438, 0x6050, 0xa438, 0xab04, 0xa438, 0xd700, 0xa438, 0x4083, - 0xa438, 0xd160, 0xa438, 0xd04b, 0xa438, 0xf003, 0xa438, 0xd193, - 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd700, - 0xa438, 0x5fbb, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x8410, - 0xa438, 0xd71f, 0xa438, 0x5f94, 0xa438, 0xb920, 0xa438, 0x1000, - 0xa438, 0x109e, 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, - 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd71f, 0xa438, 0x6105, - 0xa438, 0x6054, 0xa438, 0xfffb, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0xd706, 0xa438, 0x5fb9, 0xa438, 0xfff0, 0xa438, 0xa410, - 0xa438, 0xb820, 0xa438, 0xcd85, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0xbb20, - 0xa438, 0xd105, 0xa438, 0xd042, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0xd706, 0xa438, 0x5fbb, 0xa438, 0x5f85, 0xa438, 0xd700, - 0xa438, 0x5f5b, 0xa438, 0xd700, 0xa438, 0x6090, 0xa438, 0xd700, - 0xa438, 0x4043, 0xa438, 0xaa20, 0xa438, 0xcd86, 0xa438, 0xd700, - 0xa438, 0x6083, 0xa438, 0xd1c7, 0xa438, 0xd045, 0xa438, 0xf003, - 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0xd700, 0xa438, 0x5fbb, 0xa438, 0x0c18, 0xa438, 0x0108, - 0xa438, 0x0c3f, 0xa438, 0x0609, 0xa438, 0x0cfb, 0xa438, 0x0729, - 0xa438, 0xa308, 0xa438, 0x8320, 0xa438, 0xd105, 0xa438, 0xd042, + 0xa438, 0xd200, 0xa438, 0xa800, 0xa438, 0x1800, 0xa438, 0x0031, + 0xa438, 0xd700, 0xa438, 0x4543, 0xa438, 0xd71f, 0xa438, 0x40fe, + 0xa438, 0xd1b7, 0xa438, 0xd049, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd700, 0xa438, 0x5fbb, 0xa438, 0xa220, 0xa438, 0x8501, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c70, 0xa438, 0x0b00, + 0xa438, 0x0c07, 0xa438, 0x0604, 0xa438, 0x9503, 0xa438, 0xa510, + 0xa438, 0xce49, 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x8520, + 0xa438, 0xa520, 0xa438, 0xa501, 0xa438, 0xd105, 0xa438, 0xd047, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd707, 0xa438, 0x6087, + 0xa438, 0xd700, 0xa438, 0x5f7b, 0xa438, 0xffe9, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0x8501, 0xa438, 0xd707, 0xa438, 0x5e08, + 0xa438, 0x8530, 0xa438, 0xba20, 0xa438, 0xf00c, 0xa438, 0xd700, + 0xa438, 0x4098, 0xa438, 0xd1ef, 0xa438, 0xd047, 0xa438, 0xf003, + 0xa438, 0xd1db, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd700, 0xa438, 0x5fbb, 0xa438, 0x8980, 0xa438, 0xd702, + 0xa438, 0x6126, 0xa438, 0xd704, 0xa438, 0x4063, 0xa438, 0xd702, + 0xa438, 0x6060, 0xa438, 0xd702, 0xa438, 0x6077, 0xa438, 0x8410, + 0xa438, 0xf002, 0xa438, 0xa410, 0xa438, 0xce02, 0xa438, 0x1000, + 0xa438, 0x10be, 0xa438, 0xcd81, 0xa438, 0xd412, 0xa438, 0x1000, + 0xa438, 0x1069, 0xa438, 0xcd82, 0xa438, 0xd40e, 0xa438, 0x1000, + 0xa438, 0x1069, 0xa438, 0xcd83, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd71f, 0xa438, 0x5fb4, 0xa438, 0xd702, 0xa438, 0x6c26, + 0xa438, 0xd704, 0xa438, 0x4063, 0xa438, 0xd702, 0xa438, 0x6060, + 0xa438, 0xd702, 0xa438, 0x6b77, 0xa438, 0xa340, 0xa438, 0x0c06, + 0xa438, 0x0102, 0xa438, 0xce01, 0xa438, 0x1000, 0xa438, 0x10be, + 0xa438, 0xa240, 0xa438, 0xa902, 0xa438, 0xa204, 0xa438, 0xa280, + 0xa438, 0xa364, 0xa438, 0xab02, 0xa438, 0x8380, 0xa438, 0xa00a, + 0xa438, 0xcd8d, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, + 0xa438, 0x5fb5, 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0xd71f, 0xa438, 0x6065, 0xa438, 0x7c74, + 0xa438, 0xfffb, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0xa410, + 0xa438, 0x8902, 0xa438, 0xa120, 0xa438, 0xa380, 0xa438, 0xce02, + 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x8280, 0xa438, 0xa324, + 0xa438, 0xab02, 0xa438, 0xa00a, 0xa438, 0x8118, 0xa438, 0x863f, + 0xa438, 0x87fb, 0xa438, 0xcd8e, 0xa438, 0xd193, 0xa438, 0xd047, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x10a3, + 0xa438, 0xd700, 0xa438, 0x5f7b, 0xa438, 0xa280, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x10a3, 0xa438, 0xd706, + 0xa438, 0x5f78, 0xa438, 0xa210, 0xa438, 0xd700, 0xa438, 0x6083, + 0xa438, 0xd101, 0xa438, 0xd047, 0xa438, 0xf003, 0xa438, 0xd160, + 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, + 0xa438, 0x10a3, 0xa438, 0xd700, 0xa438, 0x5f7b, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x10a3, 0xa438, 0xd706, + 0xa438, 0x5f79, 0xa438, 0x8120, 0xa438, 0xbb20, 0xa438, 0xf04c, + 0xa438, 0xa00a, 0xa438, 0xa340, 0xa438, 0x0c06, 0xa438, 0x0102, + 0xa438, 0xa240, 0xa438, 0xa290, 0xa438, 0xa324, 0xa438, 0xab02, + 0xa438, 0xd13e, 0xa438, 0xd05a, 0xa438, 0xd13e, 0xa438, 0xd06b, + 0xa438, 0xcd84, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, + 0xa438, 0x6079, 0xa438, 0xd700, 0xa438, 0x5f5c, 0xa438, 0xcd8a, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, 0xa438, 0x6079, + 0xa438, 0xd700, 0xa438, 0x5f5d, 0xa438, 0xcd8b, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0xcd8c, 0xa438, 0xd700, 0xa438, 0x6050, + 0xa438, 0xab04, 0xa438, 0xd700, 0xa438, 0x4083, 0xa438, 0xd160, + 0xa438, 0xd04b, 0xa438, 0xf003, 0xa438, 0xd193, 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd700, 0xa438, 0x5fbb, - 0xa438, 0x1800, 0xa438, 0x08f7, 0xa438, 0x1000, 0xa438, 0x109e, - 0xa438, 0x1000, 0xa438, 0x10a3, 0xa438, 0xd700, 0xa438, 0x607b, - 0xa438, 0xd700, 0xa438, 0x5f2b, 0xa438, 0x1800, 0xa438, 0x0a81, - 0xa438, 0xd700, 0xa438, 0x40bd, 0xa438, 0xd707, 0xa438, 0x4065, - 0xa438, 0x1800, 0xa438, 0x1121, 0xa438, 0x1800, 0xa438, 0x1124, - 0xa438, 0xd705, 0xa438, 0x627d, 0xa438, 0xd704, 0xa438, 0x6192, - 0xa438, 0xa00a, 0xa438, 0xd704, 0xa438, 0x41c7, 0xa438, 0xd700, - 0xa438, 0x3691, 0xa438, 0x810c, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa570, 0xa438, 0x9503, 0xa438, 0xf006, 0xa438, 0x800a, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x8410, 0xa438, 0xd71f, + 0xa438, 0x5f94, 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x109e, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0xd71f, 0xa438, 0x6105, 0xa438, 0x6054, + 0xa438, 0xfffb, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, + 0xa438, 0x5fb9, 0xa438, 0xfff0, 0xa438, 0xa410, 0xa438, 0xb820, + 0xa438, 0xcd85, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd71f, + 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0xbb20, 0xa438, 0xd105, + 0xa438, 0xd042, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd706, + 0xa438, 0x5fbb, 0xa438, 0x5f85, 0xa438, 0xd700, 0xa438, 0x5f5b, + 0xa438, 0xd700, 0xa438, 0x6090, 0xa438, 0xd700, 0xa438, 0x4043, + 0xa438, 0xaa20, 0xa438, 0xcd86, 0xa438, 0xd700, 0xa438, 0x6083, + 0xa438, 0xd1c7, 0xa438, 0xd045, 0xa438, 0xf003, 0xa438, 0xd17a, + 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd700, + 0xa438, 0x5fbb, 0xa438, 0x0c18, 0xa438, 0x0108, 0xa438, 0x0c3f, + 0xa438, 0x0609, 0xa438, 0x0cfb, 0xa438, 0x0729, 0xa438, 0xa308, + 0xa438, 0x8320, 0xa438, 0xd105, 0xa438, 0xd042, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0xd700, 0xa438, 0x5fbb, 0xa438, 0x1800, + 0xa438, 0x08f7, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, + 0xa438, 0x10a3, 0xa438, 0xd700, 0xa438, 0x607b, 0xa438, 0xd700, + 0xa438, 0x5f2b, 0xa438, 0x1800, 0xa438, 0x0a81, 0xa438, 0xd700, + 0xa438, 0x40bd, 0xa438, 0xd707, 0xa438, 0x4065, 0xa438, 0x1800, + 0xa438, 0x1121, 0xa438, 0x1800, 0xa438, 0x1124, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8f80, 0xa438, 0x9503, 0xa438, 0xd705, + 0xa438, 0x641d, 0xa438, 0xd704, 0xa438, 0x62b2, 0xa438, 0xd702, + 0xa438, 0x4116, 0xa438, 0xce15, 0xa438, 0x1000, 0xa438, 0x10be, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f40, 0xa438, 0x9503, + 0xa438, 0xa00a, 0xa438, 0xd704, 0xa438, 0x4247, 0xa438, 0xd700, + 0xa438, 0x3691, 0xa438, 0x8183, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa570, 0xa438, 0x9503, 0xa438, 0xf00a, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xaf40, 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8570, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x1108, - 0xa438, 0xcd64, 0xa438, 0xd704, 0xa438, 0x3398, 0xa438, 0x8166, + 0xa438, 0xcd64, 0xa438, 0xd704, 0xa438, 0x3398, 0xa438, 0x8203, 0xa438, 0xd71f, 0xa438, 0x620e, 0xa438, 0xd704, 0xa438, 0x6096, 0xa438, 0xd705, 0xa438, 0x6051, 0xa438, 0xf004, 0xa438, 0xd705, 0xa438, 0x605d, 0xa438, 0xf008, 0xa438, 0xd706, 0xa438, 0x609d, 0xa438, 0xd705, 0xa438, 0x405f, 0xa438, 0xf003, 0xa438, 0xd700, - 0xa438, 0x5a9b, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc7aa, - 0xa438, 0x9503, 0xa438, 0xd71f, 0xa438, 0x674e, 0xa438, 0xd704, + 0xa438, 0x58fb, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc7aa, + 0xa438, 0x9503, 0xa438, 0xd71f, 0xa438, 0x6d2e, 0xa438, 0xd704, 0xa438, 0x6096, 0xa438, 0xd705, 0xa438, 0x6051, 0xa438, 0xf005, 0xa438, 0xd705, 0xa438, 0x607d, 0xa438, 0x1800, 0xa438, 0x0cc7, 0xa438, 0xd706, 0xa438, 0x60bd, 0xa438, 0xd705, 0xa438, 0x407f, - 0xa438, 0x1800, 0xa438, 0x0e42, 0xa438, 0xce04, 0xa438, 0x1000, - 0xa438, 0x10be, 0xa438, 0xd702, 0xa438, 0x40a4, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0x8e20, 0xa438, 0x9503, 0xa438, 0xd702, - 0xa438, 0x40a5, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8e40, - 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x11a4, 0xa438, 0x1000, + 0xa438, 0x1800, 0xa438, 0x0e42, 0xa438, 0xd702, 0xa438, 0x40a4, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8e20, 0xa438, 0x9503, + 0xa438, 0xd702, 0xa438, 0x40a5, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8e40, 0xa438, 0x9503, 0xa438, 0xd705, 0xa438, 0x659d, + 0xa438, 0xd704, 0xa438, 0x62b2, 0xa438, 0xd702, 0xa438, 0x4116, + 0xa438, 0xce15, 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8f40, 0xa438, 0x9503, 0xa438, 0xa00a, + 0xa438, 0xd704, 0xa438, 0x4247, 0xa438, 0xd700, 0xa438, 0x3691, + 0xa438, 0x81de, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa570, + 0xa438, 0x9503, 0xa438, 0xf00a, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xaf40, 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8570, 0xa438, 0x9503, 0xa438, 0xd706, + 0xa438, 0x60e4, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0cf0, + 0xa438, 0x07a0, 0xa438, 0x9503, 0xa438, 0xf005, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x87f0, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x1108, 0xa438, 0xcd61, - 0xa438, 0xd704, 0xa438, 0x3398, 0xa438, 0x8166, 0xa438, 0xd704, + 0xa438, 0xd704, 0xa438, 0x3398, 0xa438, 0x8203, 0xa438, 0xd704, 0xa438, 0x6096, 0xa438, 0xd705, 0xa438, 0x6051, 0xa438, 0xf005, 0xa438, 0xd705, 0xa438, 0x607d, 0xa438, 0x1800, 0xa438, 0x0cc7, - 0xa438, 0xd71f, 0xa438, 0x60ee, 0xa438, 0xd706, 0xa438, 0x7bdd, - 0xa438, 0xd705, 0xa438, 0x5b9f, 0xa438, 0x1800, 0xa438, 0x0e42, - 0xa438, 0x1800, 0xa438, 0x0b5f, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xd71f, 0xa438, 0x61ce, 0xa438, 0xd706, 0xa438, 0x767d, + 0xa438, 0xd705, 0xa438, 0x563f, 0xa438, 0x1800, 0xa438, 0x0e42, + 0xa438, 0x800a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae40, + 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0c47, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xaf80, 0xa438, 0x9503, 0xa438, 0x1800, + 0xa438, 0x0b5f, 0xa438, 0x607c, 0xa438, 0x1800, 0xa438, 0x027a, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae01, 0xa438, 0x9503, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd702, 0xa438, 0x5fa3, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8e01, 0xa438, 0x9503, + 0xa438, 0x1800, 0xa438, 0x027d, 0xa438, 0x1000, 0xa438, 0x10be, + 0xa438, 0xd702, 0xa438, 0x40a5, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8e40, 0xa438, 0x9503, 0xa438, 0xd73e, 0xa438, 0x6065, + 0xa438, 0x1800, 0xa438, 0x0cea, 0xa438, 0x1800, 0xa438, 0x0cf4, + 0xa438, 0xd701, 0xa438, 0x6fd1, 0xa438, 0xd71f, 0xa438, 0x6eee, + 0xa438, 0xd707, 0xa438, 0x4d0f, 0xa438, 0xd73e, 0xa438, 0x4cc5, + 0xa438, 0xd705, 0xa438, 0x4c99, 0xa438, 0xd704, 0xa438, 0x6c57, + 0xa438, 0xd702, 0xa438, 0x6c11, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8c20, 0xa438, 0xa608, 0xa438, 0x9503, 0xa438, 0xa201, + 0xa438, 0xa804, 0xa438, 0xd704, 0xa438, 0x40a7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa620, 0xa438, 0x9503, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xac40, 0xa438, 0x9503, 0xa438, 0x800a, + 0xa438, 0x8290, 0xa438, 0x8306, 0xa438, 0x8b02, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8570, 0xa438, 0x9503, 0xa438, 0xce00, + 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0xcd99, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0x1000, 0xa438, 0x10cc, 0xa438, 0xd701, + 0xa438, 0x69f1, 0xa438, 0xd71f, 0xa438, 0x690e, 0xa438, 0xd73e, + 0xa438, 0x5ee6, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x87f0, + 0xa438, 0x9503, 0xa438, 0xce46, 0xa438, 0x1000, 0xa438, 0x10be, + 0xa438, 0xa00a, 0xa438, 0xd704, 0xa438, 0x40a7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa570, 0xa438, 0x9503, 0xa438, 0xcd9a, + 0xa438, 0xd700, 0xa438, 0x6078, 0xa438, 0xd700, 0xa438, 0x609a, + 0xa438, 0xd109, 0xa438, 0xd074, 0xa438, 0xf003, 0xa438, 0xd109, + 0xa438, 0xd075, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0x1000, + 0xa438, 0x10cc, 0xa438, 0xd701, 0xa438, 0x65b1, 0xa438, 0xd71f, + 0xa438, 0x64ce, 0xa438, 0xd700, 0xa438, 0x5efe, 0xa438, 0xce00, + 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8608, 0xa438, 0x8c40, 0xa438, 0x9503, 0xa438, 0x8201, + 0xa438, 0x800a, 0xa438, 0x8290, 0xa438, 0x8306, 0xa438, 0x8b02, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc7aa, 0xa438, 0x8570, + 0xa438, 0x8d08, 0xa438, 0x9503, 0xa438, 0xcd9b, 0xa438, 0x1800, + 0xa438, 0x0c8b, 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd705, + 0xa438, 0x61d9, 0xa438, 0xd704, 0xa438, 0x4193, 0xa438, 0x800a, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae40, 0xa438, 0x9503, + 0xa438, 0x1800, 0xa438, 0x0c47, 0xa438, 0x1800, 0xa438, 0x0df8, + 0xa438, 0x1800, 0xa438, 0x8339, 0xa438, 0x0800, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8d08, 0xa438, 0x8f02, 0xa438, 0x8c40, + 0xa438, 0x9503, 0xa438, 0x8201, 0xa438, 0xa804, 0xa438, 0xd704, + 0xa438, 0x40a7, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa620, + 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x8290, 0xa438, 0x8306, + 0xa438, 0x8b02, 0xa438, 0x8010, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8570, 0xa438, 0x9503, 0xa438, 0xaa03, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xac20, 0xa438, 0xa608, 0xa438, 0x9503, + 0xa438, 0xce00, 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0xcd95, + 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd701, 0xa438, 0x7b91, + 0xa438, 0xd71f, 0xa438, 0x7aae, 0xa438, 0xd701, 0xa438, 0x7ab0, + 0xa438, 0xd704, 0xa438, 0x7ef3, 0xa438, 0xd701, 0xa438, 0x5eb3, + 0xa438, 0x84b0, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa608, + 0xa438, 0xc700, 0xa438, 0x9503, 0xa438, 0xce54, 0xa438, 0x1000, + 0xa438, 0x10be, 0xa438, 0xa290, 0xa438, 0xa304, 0xa438, 0xab02, + 0xa438, 0xd700, 0xa438, 0x6050, 0xa438, 0xab04, 0xa438, 0x0c38, + 0xa438, 0x0608, 0xa438, 0xaa0b, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8d01, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae40, + 0xa438, 0x9503, 0xa438, 0xd702, 0xa438, 0x40a4, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8e20, 0xa438, 0x9503, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8c20, 0xa438, 0x9503, 0xa438, 0xd700, + 0xa438, 0x6078, 0xa438, 0xd700, 0xa438, 0x609a, 0xa438, 0xd109, + 0xa438, 0xd074, 0xa438, 0xf003, 0xa438, 0xd109, 0xa438, 0xd075, + 0xa438, 0xd704, 0xa438, 0x62b2, 0xa438, 0xd702, 0xa438, 0x4116, + 0xa438, 0xce54, 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8f40, 0xa438, 0x9503, 0xa438, 0xa00a, + 0xa438, 0xd704, 0xa438, 0x4247, 0xa438, 0xd700, 0xa438, 0x3691, + 0xa438, 0x8326, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa570, + 0xa438, 0x9503, 0xa438, 0xf00a, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xaf40, 0xa438, 0x9503, 0xa438, 0x800a, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8570, 0xa438, 0x9503, 0xa438, 0x1000, + 0xa438, 0x109e, 0xa438, 0xd704, 0xa438, 0x60f3, 0xa438, 0xd71f, + 0xa438, 0x618e, 0xa438, 0xd700, 0xa438, 0x5b5e, 0xa438, 0x1800, + 0xa438, 0x0deb, 0xa438, 0x800a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xae40, 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0c47, - 0xa438, 0x607c, 0xa438, 0x1800, 0xa438, 0x027a, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0xae01, 0xa438, 0x9503, 0xa438, 0x1000, - 0xa438, 0x109e, 0xa438, 0xd702, 0xa438, 0x5fa3, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0x8e01, 0xa438, 0x9503, 0xa438, 0x1800, - 0xa438, 0x027d, 0xa438, 0x1000, 0xa438, 0x10be, 0xa438, 0xd702, - 0xa438, 0x40a5, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8e40, - 0xa438, 0x9503, 0xa438, 0xd73e, 0xa438, 0x6065, 0xa438, 0x1800, - 0xa438, 0x0cea, 0xa438, 0x1800, 0xa438, 0x0cf4, 0xa438, 0xa290, - 0xa438, 0xa304, 0xa438, 0xab02, 0xa438, 0xd700, 0xa438, 0x6050, - 0xa438, 0xab04, 0xa438, 0x0c38, 0xa438, 0x0608, 0xa438, 0xaa0b, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8d01, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0xae40, 0xa438, 0x9503, 0xa438, 0xd702, - 0xa438, 0x40a4, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8e20, - 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x6078, 0xa438, 0xd700, - 0xa438, 0x609a, 0xa438, 0xd109, 0xa438, 0xd074, 0xa438, 0xf003, - 0xa438, 0xd109, 0xa438, 0xd075, 0xa438, 0xd704, 0xa438, 0x6192, - 0xa438, 0xa00a, 0xa438, 0xd704, 0xa438, 0x41c7, 0xa438, 0xd700, - 0xa438, 0x3691, 0xa438, 0x81bc, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa570, 0xa438, 0x9503, 0xa438, 0xf006, 0xa438, 0x800a, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8570, 0xa438, 0x9503, - 0xa438, 0x1000, 0xa438, 0x109e, 0xa438, 0xd704, 0xa438, 0x60f3, - 0xa438, 0xd71f, 0xa438, 0x60ee, 0xa438, 0xd700, 0xa438, 0x5cfe, - 0xa438, 0x1800, 0xa438, 0x0deb, 0xa438, 0x1800, 0xa438, 0x0c47, - 0xa438, 0x1800, 0xa438, 0x0df8, 0xa436, 0xA10E, 0xa438, 0x0dc5, - 0xa436, 0xA10C, 0xa438, 0x0ce8, 0xa436, 0xA10A, 0xa438, 0x0279, - 0xa436, 0xA108, 0xa438, 0x0b19, 0xa436, 0xA106, 0xa438, 0x111f, - 0xa436, 0xA104, 0xa438, 0x0a7b, 0xa436, 0xA102, 0xa438, 0x0ba3, - 0xa436, 0xA100, 0xa438, 0x0022, 0xa436, 0xA110, 0xa438, 0x00ff, - 0xa436, 0xb87c, 0xa438, 0x859b, 0xa436, 0xb87e, 0xa438, 0xaf85, - 0xa438, 0xb3af, 0xa438, 0x863b, 0xa438, 0xaf86, 0xa438, 0x4caf, - 0xa438, 0x8688, 0xa438, 0xaf86, 0xa438, 0xceaf, 0xa438, 0x8744, - 0xa438, 0xaf87, 0xa438, 0x68af, 0xa438, 0x8781, 0xa438, 0xbf5e, - 0xa438, 0x7202, 0xa438, 0x5f7e, 0xa438, 0xac28, 0xa438, 0x68e1, - 0xa438, 0x84e6, 0xa438, 0xad28, 0xa438, 0x09bf, 0xa438, 0x5e75, - 0xa438, 0x025f, 0xa438, 0x7eac, 0xa438, 0x2d59, 0xa438, 0xe18f, - 0xa438, 0xebad, 0xa438, 0x2809, 0xa438, 0xbf5e, 0xa438, 0x7502, - 0xa438, 0x5f7e, 0xa438, 0xac2e, 0xa438, 0x50e1, 0xa438, 0x84e6, - 0xa438, 0xac28, 0xa438, 0x08bf, 0xa438, 0x873e, 0xa438, 0x025f, - 0xa438, 0x3cae, 0xa438, 0x06bf, 0xa438, 0x873e, 0xa438, 0x025f, - 0xa438, 0x33bf, 0xa438, 0x8741, 0xa438, 0x025f, 0xa438, 0x33ee, - 0xa438, 0x8fea, 0xa438, 0x02e1, 0xa438, 0x84e4, 0xa438, 0xad28, - 0xa438, 0x14e1, 0xa438, 0x8fe8, 0xa438, 0xad28, 0xa438, 0x17e1, - 0xa438, 0x84e5, 0xa438, 0x11e5, 0xa438, 0x84e5, 0xa438, 0xa10c, - 0xa438, 0x04ee, 0xa438, 0x84e5, 0xa438, 0x0002, 0xa438, 0x4977, - 0xa438, 0xee84, 0xa438, 0xdc03, 0xa438, 0xae1d, 0xa438, 0xe18f, - 0xa438, 0xe811, 0xa438, 0xe58f, 0xa438, 0xe8ae, 0xa438, 0x14bf, - 0xa438, 0x873e, 0xa438, 0x025f, 0xa438, 0x3cbf, 0xa438, 0x8741, - 0xa438, 0x025f, 0xa438, 0x3cee, 0xa438, 0x8fea, 0xa438, 0x01ee, - 0xa438, 0x84e4, 0xa438, 0x00af, 0xa438, 0x50c1, 0xa438, 0x1f00, - 0xa438, 0xbf5a, 0xa438, 0x6102, 0xa438, 0x5f5f, 0xa438, 0xbf5a, - 0xa438, 0x5e02, 0xa438, 0x5f3c, 0xa438, 0xaf45, 0xa438, 0x7be0, - 0xa438, 0x8012, 0xa438, 0xad23, 0xa438, 0x141f, 0xa438, 0x001f, - 0xa438, 0x22d1, 0xa438, 0x00bf, 0xa438, 0x3fcf, 0xa438, 0x0261, - 0xa438, 0x3412, 0xa438, 0xa204, 0xa438, 0xf6ee, 0xa438, 0x8317, - 0xa438, 0x00e0, 0xa438, 0x8012, 0xa438, 0xad24, 0xa438, 0x141f, - 0xa438, 0x001f, 0xa438, 0x22d1, 0xa438, 0x00bf, 0xa438, 0x3fd7, - 0xa438, 0x0261, 0xa438, 0x3412, 0xa438, 0xa204, 0xa438, 0xf6ee, - 0xa438, 0x8317, 0xa438, 0x00ef, 0xa438, 0x96fe, 0xa438, 0xfdfc, - 0xa438, 0xaf42, 0xa438, 0x9802, 0xa438, 0x56ec, 0xa438, 0xf70b, - 0xa438, 0xac13, 0xa438, 0x0fbf, 0xa438, 0x5e75, 0xa438, 0x025f, - 0xa438, 0x7eac, 0xa438, 0x280c, 0xa438, 0xe2ff, 0xa438, 0xcfad, - 0xa438, 0x32ee, 0xa438, 0x0257, 0xa438, 0x05af, 0xa438, 0x00a4, - 0xa438, 0x0286, 0xa438, 0xaaae, 0xa438, 0xeff8, 0xa438, 0xf9ef, - 0xa438, 0x5902, 0xa438, 0x1fe1, 0xa438, 0xbf59, 0xa438, 0x4d02, - 0xa438, 0x5f3c, 0xa438, 0xac13, 0xa438, 0x09bf, 0xa438, 0x5e75, - 0xa438, 0x025f, 0xa438, 0x7ea1, 0xa438, 0x00f4, 0xa438, 0xbf59, - 0xa438, 0x4d02, 0xa438, 0x5f33, 0xa438, 0xef95, 0xa438, 0xfdfc, - 0xa438, 0x04bf, 0xa438, 0x5e72, 0xa438, 0x025f, 0xa438, 0x7eac, - 0xa438, 0x284a, 0xa438, 0xe184, 0xa438, 0xe6ad, 0xa438, 0x2809, - 0xa438, 0xbf5e, 0xa438, 0x7502, 0xa438, 0x5f7e, 0xa438, 0xac2d, - 0xa438, 0x3be1, 0xa438, 0x8feb, 0xa438, 0xad28, 0xa438, 0x09bf, - 0xa438, 0x5e75, 0xa438, 0x025f, 0xa438, 0x7eac, 0xa438, 0x2e32, - 0xa438, 0xe184, 0xa438, 0xe6ac, 0xa438, 0x2808, 0xa438, 0xbf87, - 0xa438, 0x3e02, 0xa438, 0x5f3c, 0xa438, 0xae06, 0xa438, 0xbf87, - 0xa438, 0x3e02, 0xa438, 0x5f33, 0xa438, 0xbf87, 0xa438, 0x4102, - 0xa438, 0x5f33, 0xa438, 0xee8f, 0xa438, 0xea04, 0xa438, 0xbf5e, - 0xa438, 0x4e02, 0xa438, 0x5f7e, 0xa438, 0xad28, 0xa438, 0x1f02, - 0xa438, 0x4b12, 0xa438, 0xae1a, 0xa438, 0xbf87, 0xa438, 0x3e02, - 0xa438, 0x5f3c, 0xa438, 0xbf87, 0xa438, 0x4102, 0xa438, 0x5f3c, - 0xa438, 0xee8f, 0xa438, 0xea03, 0xa438, 0xbf5e, 0xa438, 0x2a02, - 0xa438, 0x5f33, 0xa438, 0xee84, 0xa438, 0xe701, 0xa438, 0xaf4a, - 0xa438, 0x7444, 0xa438, 0xac0e, 0xa438, 0x55ac, 0xa438, 0x0ebf, - 0xa438, 0x5e75, 0xa438, 0x025f, 0xa438, 0x7ead, 0xa438, 0x2d0b, - 0xa438, 0xbf5e, 0xa438, 0x36e1, 0xa438, 0x8fe9, 0xa438, 0x025f, - 0xa438, 0x5fae, 0xa438, 0x09bf, 0xa438, 0x5e36, 0xa438, 0xe184, - 0xa438, 0xe102, 0xa438, 0x5f5f, 0xa438, 0xee8f, 0xa438, 0xe800, - 0xa438, 0xaf49, 0xa438, 0xcdbf, 0xa438, 0x595c, 0xa438, 0x025f, - 0xa438, 0x7ea1, 0xa438, 0x0203, 0xa438, 0xaf87, 0xa438, 0x79d1, - 0xa438, 0x00af, 0xa438, 0x877c, 0xa438, 0xe181, 0xa438, 0x941f, - 0xa438, 0x00af, 0xa438, 0x3ff7, 0xa438, 0xac4e, 0xa438, 0x06ac, - 0xa438, 0x4003, 0xa438, 0xaf24, 0xa438, 0x97af, 0xa438, 0x2467, - 0xa436, 0xb85e, 0xa438, 0x5082, 0xa436, 0xb860, 0xa438, 0x4575, - 0xa436, 0xb862, 0xa438, 0x425F, 0xa436, 0xb864, 0xa438, 0x0096, - 0xa436, 0xb886, 0xa438, 0x4A44, 0xa436, 0xb888, 0xa438, 0x49c4, - 0xa436, 0xb88a, 0xa438, 0x3FF2, 0xa436, 0xb88c, 0xa438, 0x245C, - 0xa436, 0xb838, 0xa438, 0x00ff, 0xb820, 0x0010, 0xa466, 0x0001, - 0xa436, 0x836a, 0xa438, 0x0001, 0xa436, 0x843d, 0xa438, 0xaf84, - 0xa438, 0xa6af, 0xa438, 0x8540, 0xa438, 0xaf85, 0xa438, 0xaeaf, - 0xa438, 0x85b5, 0xa438, 0xaf87, 0xa438, 0x7daf, 0xa438, 0x8784, - 0xa438, 0xaf87, 0xa438, 0x87af, 0xa438, 0x87e5, 0xa438, 0x0066, - 0xa438, 0x0a03, 0xa438, 0x6607, 0xa438, 0x2666, 0xa438, 0x1c00, - 0xa438, 0x660d, 0xa438, 0x0166, 0xa438, 0x1004, 0xa438, 0x6616, - 0xa438, 0x0566, 0xa438, 0x1f06, 0xa438, 0x6a5d, 0xa438, 0x2766, - 0xa438, 0x1900, 0xa438, 0x6625, 0xa438, 0x2466, 0xa438, 0x2820, - 0xa438, 0x662b, 0xa438, 0x2466, 0xa438, 0x4600, 0xa438, 0x664c, - 0xa438, 0x0166, 0xa438, 0x4902, 0xa438, 0x8861, 0xa438, 0x0388, - 0xa438, 0x5e05, 0xa438, 0x886d, 0xa438, 0x0588, 0xa438, 0x7005, - 0xa438, 0x8873, 0xa438, 0x0588, 0xa438, 0x7605, 0xa438, 0x8879, - 0xa438, 0x0588, 0xa438, 0x7c05, 0xa438, 0x887f, 0xa438, 0x0588, - 0xa438, 0x8205, 0xa438, 0x8885, 0xa438, 0x0588, 0xa438, 0x881e, - 0xa438, 0x13ad, 0xa438, 0x2841, 0xa438, 0xbf64, 0xa438, 0xf102, - 0xa438, 0x6b9d, 0xa438, 0xad28, 0xa438, 0x03af, 0xa438, 0x15fc, - 0xa438, 0xbf65, 0xa438, 0xcb02, 0xa438, 0x6b9d, 0xa438, 0x0d11, - 0xa438, 0xf62f, 0xa438, 0xef31, 0xa438, 0xd202, 0xa438, 0xbf88, - 0xa438, 0x6402, 0xa438, 0x6b52, 0xa438, 0xe082, 0xa438, 0x020d, - 0xa438, 0x01f6, 0xa438, 0x271b, 0xa438, 0x03aa, 0xa438, 0x0182, - 0xa438, 0xe082, 0xa438, 0x010d, 0xa438, 0x01f6, 0xa438, 0x271b, - 0xa438, 0x03aa, 0xa438, 0x0782, 0xa438, 0xbf88, 0xa438, 0x6402, - 0xa438, 0x6b5b, 0xa438, 0xaf15, 0xa438, 0xf9bf, 0xa438, 0x65cb, - 0xa438, 0x026b, 0xa438, 0x9d0d, 0xa438, 0x11f6, 0xa438, 0x2fef, - 0xa438, 0x31e0, 0xa438, 0x8ff7, 0xa438, 0x0d01, 0xa438, 0xf627, - 0xa438, 0x1b03, 0xa438, 0xaa20, 0xa438, 0xe18f, 0xa438, 0xf4d0, - 0xa438, 0x00bf, 0xa438, 0x6587, 0xa438, 0x026b, 0xa438, 0x7ee1, - 0xa438, 0x8ff5, 0xa438, 0xbf65, 0xa438, 0x8a02, 0xa438, 0x6b7e, - 0xa438, 0xe18f, 0xa438, 0xf6bf, 0xa438, 0x6584, 0xa438, 0x026b, - 0xa438, 0x7eaf, 0xa438, 0x15fc, 0xa438, 0xe18f, 0xa438, 0xf1d0, - 0xa438, 0x00bf, 0xa438, 0x6587, 0xa438, 0x026b, 0xa438, 0x7ee1, - 0xa438, 0x8ff2, 0xa438, 0xbf65, 0xa438, 0x8a02, 0xa438, 0x6b7e, - 0xa438, 0xe18f, 0xa438, 0xf3bf, 0xa438, 0x6584, 0xa438, 0xaf15, - 0xa438, 0xfcd1, 0xa438, 0x07bf, 0xa438, 0x65ce, 0xa438, 0x026b, - 0xa438, 0x7ed1, 0xa438, 0x0cbf, 0xa438, 0x65d1, 0xa438, 0x026b, - 0xa438, 0x7ed1, 0xa438, 0x03bf, 0xa438, 0x885e, 0xa438, 0x026b, - 0xa438, 0x7ed1, 0xa438, 0x05bf, 0xa438, 0x8867, 0xa438, 0x026b, - 0xa438, 0x7ed1, 0xa438, 0x07bf, 0xa438, 0x886a, 0xa438, 0x026b, - 0xa438, 0x7ebf, 0xa438, 0x6a6c, 0xa438, 0x026b, 0xa438, 0x5b02, - 0xa438, 0x62b5, 0xa438, 0xbf6a, 0xa438, 0x0002, 0xa438, 0x6b5b, - 0xa438, 0xbf64, 0xa438, 0x4e02, 0xa438, 0x6b9d, 0xa438, 0xac28, - 0xa438, 0x0bbf, 0xa438, 0x6412, 0xa438, 0x026b, 0xa438, 0x9da1, - 0xa438, 0x0502, 0xa438, 0xaeec, 0xa438, 0xd104, 0xa438, 0xbf65, - 0xa438, 0xce02, 0xa438, 0x6b7e, 0xa438, 0xd104, 0xa438, 0xbf65, - 0xa438, 0xd102, 0xa438, 0x6b7e, 0xa438, 0xd102, 0xa438, 0xbf88, - 0xa438, 0x6702, 0xa438, 0x6b7e, 0xa438, 0xd104, 0xa438, 0xbf88, - 0xa438, 0x6a02, 0xa438, 0x6b7e, 0xa438, 0xaf62, 0xa438, 0x72f6, - 0xa438, 0x0af6, 0xa438, 0x09af, 0xa438, 0x34e3, 0xa438, 0x0285, - 0xa438, 0xbe02, 0xa438, 0x106c, 0xa438, 0xaf10, 0xa438, 0x6bf8, - 0xa438, 0xfaef, 0xa438, 0x69e0, 0xa438, 0x804c, 0xa438, 0xac25, - 0xa438, 0x17e0, 0xa438, 0x8040, 0xa438, 0xad25, 0xa438, 0x1a02, - 0xa438, 0x85ed, 0xa438, 0xe080, 0xa438, 0x40ac, 0xa438, 0x2511, - 0xa438, 0xbf87, 0xa438, 0x6502, 0xa438, 0x6b5b, 0xa438, 0xae09, - 0xa438, 0x0287, 0xa438, 0x2402, 0xa438, 0x875a, 0xa438, 0x0287, - 0xa438, 0x4fef, 0xa438, 0x96fe, 0xa438, 0xfc04, 0xa438, 0xf8e0, - 0xa438, 0x8019, 0xa438, 0xad20, 0xa438, 0x11e0, 0xa438, 0x8fe3, - 0xa438, 0xac20, 0xa438, 0x0502, 0xa438, 0x860a, 0xa438, 0xae03, - 0xa438, 0x0286, 0xa438, 0x7802, 0xa438, 0x86c1, 0xa438, 0x0287, - 0xa438, 0x4ffc, 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x79fb, - 0xa438, 0xbf87, 0xa438, 0x6802, 0xa438, 0x6b9d, 0xa438, 0x5c20, - 0xa438, 0x000d, 0xa438, 0x4da1, 0xa438, 0x0151, 0xa438, 0xbf87, - 0xa438, 0x6802, 0xa438, 0x6b9d, 0xa438, 0x5c07, 0xa438, 0xffe3, - 0xa438, 0x8fe4, 0xa438, 0x1b31, 0xa438, 0x9f41, 0xa438, 0x0d48, - 0xa438, 0xe38f, 0xa438, 0xe51b, 0xa438, 0x319f, 0xa438, 0x38bf, - 0xa438, 0x876b, 0xa438, 0x026b, 0xa438, 0x9d5c, 0xa438, 0x07ff, - 0xa438, 0xe38f, 0xa438, 0xe61b, 0xa438, 0x319f, 0xa438, 0x280d, - 0xa438, 0x48e3, 0xa438, 0x8fe7, 0xa438, 0x1b31, 0xa438, 0x9f1f, - 0xa438, 0xbf87, 0xa438, 0x6e02, 0xa438, 0x6b9d, 0xa438, 0x5c07, - 0xa438, 0xffe3, 0xa438, 0x8fe8, 0xa438, 0x1b31, 0xa438, 0x9f0f, - 0xa438, 0x0d48, 0xa438, 0xe38f, 0xa438, 0xe91b, 0xa438, 0x319f, - 0xa438, 0x06ee, 0xa438, 0x8fe3, 0xa438, 0x01ae, 0xa438, 0x04ee, - 0xa438, 0x8fe3, 0xa438, 0x00ff, 0xa438, 0xef97, 0xa438, 0xfdfc, + 0xa438, 0x1800, 0xa438, 0x0df8, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8608, 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0e2b, + 0xa436, 0xA10E, 0xa438, 0x0d14, 0xa436, 0xA10C, 0xa438, 0x0ce8, + 0xa436, 0xA10A, 0xa438, 0x0279, 0xa436, 0xA108, 0xa438, 0x0b19, + 0xa436, 0xA106, 0xa438, 0x111f, 0xa436, 0xA104, 0xa438, 0x0a7b, + 0xa436, 0xA102, 0xa438, 0x0ba3, 0xa436, 0xA100, 0xa438, 0x0022, + 0xa436, 0xA110, 0xa438, 0x00ff, 0xa436, 0xb87c, 0xa438, 0x859b, + 0xa436, 0xb87e, 0xa438, 0xaf85, 0xa438, 0xb3af, 0xa438, 0x863b, + 0xa438, 0xaf86, 0xa438, 0x4caf, 0xa438, 0x8688, 0xa438, 0xaf86, + 0xa438, 0xceaf, 0xa438, 0x8744, 0xa438, 0xaf87, 0xa438, 0x68af, + 0xa438, 0x8781, 0xa438, 0xbf5e, 0xa438, 0x7202, 0xa438, 0x5f7e, + 0xa438, 0xac28, 0xa438, 0x68e1, 0xa438, 0x84e6, 0xa438, 0xad28, + 0xa438, 0x09bf, 0xa438, 0x5e75, 0xa438, 0x025f, 0xa438, 0x7eac, + 0xa438, 0x2d59, 0xa438, 0xe18f, 0xa438, 0xebad, 0xa438, 0x2809, + 0xa438, 0xbf5e, 0xa438, 0x7502, 0xa438, 0x5f7e, 0xa438, 0xac2e, + 0xa438, 0x50e1, 0xa438, 0x84e6, 0xa438, 0xac28, 0xa438, 0x08bf, + 0xa438, 0x873e, 0xa438, 0x025f, 0xa438, 0x3cae, 0xa438, 0x06bf, + 0xa438, 0x873e, 0xa438, 0x025f, 0xa438, 0x33bf, 0xa438, 0x8741, + 0xa438, 0x025f, 0xa438, 0x33ee, 0xa438, 0x8fea, 0xa438, 0x02e1, + 0xa438, 0x84e4, 0xa438, 0xad28, 0xa438, 0x14e1, 0xa438, 0x8fe8, + 0xa438, 0xad28, 0xa438, 0x17e1, 0xa438, 0x84e5, 0xa438, 0x11e5, + 0xa438, 0x84e5, 0xa438, 0xa10c, 0xa438, 0x04ee, 0xa438, 0x84e5, + 0xa438, 0x0002, 0xa438, 0x4977, 0xa438, 0xee84, 0xa438, 0xdc03, + 0xa438, 0xae1d, 0xa438, 0xe18f, 0xa438, 0xe811, 0xa438, 0xe58f, + 0xa438, 0xe8ae, 0xa438, 0x14bf, 0xa438, 0x873e, 0xa438, 0x025f, + 0xa438, 0x3cbf, 0xa438, 0x8741, 0xa438, 0x025f, 0xa438, 0x3cee, + 0xa438, 0x8fea, 0xa438, 0x01ee, 0xa438, 0x84e4, 0xa438, 0x00af, + 0xa438, 0x50c1, 0xa438, 0x1f00, 0xa438, 0xbf5a, 0xa438, 0x6102, + 0xa438, 0x5f5f, 0xa438, 0xbf5a, 0xa438, 0x5e02, 0xa438, 0x5f3c, + 0xa438, 0xaf45, 0xa438, 0x7be0, 0xa438, 0x8012, 0xa438, 0xad23, + 0xa438, 0x141f, 0xa438, 0x001f, 0xa438, 0x22d1, 0xa438, 0x00bf, + 0xa438, 0x3fcf, 0xa438, 0x0261, 0xa438, 0x3412, 0xa438, 0xa204, + 0xa438, 0xf6ee, 0xa438, 0x8317, 0xa438, 0x00e0, 0xa438, 0x8012, + 0xa438, 0xad24, 0xa438, 0x141f, 0xa438, 0x001f, 0xa438, 0x22d1, + 0xa438, 0x00bf, 0xa438, 0x3fd7, 0xa438, 0x0261, 0xa438, 0x3412, + 0xa438, 0xa204, 0xa438, 0xf6ee, 0xa438, 0x8317, 0xa438, 0x00ef, + 0xa438, 0x96fe, 0xa438, 0xfdfc, 0xa438, 0xaf42, 0xa438, 0x9802, + 0xa438, 0x56ec, 0xa438, 0xf70b, 0xa438, 0xac13, 0xa438, 0x0fbf, + 0xa438, 0x5e75, 0xa438, 0x025f, 0xa438, 0x7eac, 0xa438, 0x280c, + 0xa438, 0xe2ff, 0xa438, 0xcfad, 0xa438, 0x32ee, 0xa438, 0x0257, + 0xa438, 0x05af, 0xa438, 0x00a4, 0xa438, 0x0286, 0xa438, 0xaaae, + 0xa438, 0xeff8, 0xa438, 0xf9ef, 0xa438, 0x5902, 0xa438, 0x1fe1, + 0xa438, 0xbf59, 0xa438, 0x4d02, 0xa438, 0x5f3c, 0xa438, 0xac13, + 0xa438, 0x09bf, 0xa438, 0x5e75, 0xa438, 0x025f, 0xa438, 0x7ea1, + 0xa438, 0x00f4, 0xa438, 0xbf59, 0xa438, 0x4d02, 0xa438, 0x5f33, + 0xa438, 0xef95, 0xa438, 0xfdfc, 0xa438, 0x04bf, 0xa438, 0x5e72, + 0xa438, 0x025f, 0xa438, 0x7eac, 0xa438, 0x284a, 0xa438, 0xe184, + 0xa438, 0xe6ad, 0xa438, 0x2809, 0xa438, 0xbf5e, 0xa438, 0x7502, + 0xa438, 0x5f7e, 0xa438, 0xac2d, 0xa438, 0x3be1, 0xa438, 0x8feb, + 0xa438, 0xad28, 0xa438, 0x09bf, 0xa438, 0x5e75, 0xa438, 0x025f, + 0xa438, 0x7eac, 0xa438, 0x2e32, 0xa438, 0xe184, 0xa438, 0xe6ac, + 0xa438, 0x2808, 0xa438, 0xbf87, 0xa438, 0x3e02, 0xa438, 0x5f3c, + 0xa438, 0xae06, 0xa438, 0xbf87, 0xa438, 0x3e02, 0xa438, 0x5f33, + 0xa438, 0xbf87, 0xa438, 0x4102, 0xa438, 0x5f33, 0xa438, 0xee8f, + 0xa438, 0xea04, 0xa438, 0xbf5e, 0xa438, 0x4e02, 0xa438, 0x5f7e, + 0xa438, 0xad28, 0xa438, 0x1f02, 0xa438, 0x4b12, 0xa438, 0xae1a, + 0xa438, 0xbf87, 0xa438, 0x3e02, 0xa438, 0x5f3c, 0xa438, 0xbf87, + 0xa438, 0x4102, 0xa438, 0x5f3c, 0xa438, 0xee8f, 0xa438, 0xea03, + 0xa438, 0xbf5e, 0xa438, 0x2a02, 0xa438, 0x5f33, 0xa438, 0xee84, + 0xa438, 0xe701, 0xa438, 0xaf4a, 0xa438, 0x7444, 0xa438, 0xac0e, + 0xa438, 0x55ac, 0xa438, 0x0ebf, 0xa438, 0x5e75, 0xa438, 0x025f, + 0xa438, 0x7ead, 0xa438, 0x2d0b, 0xa438, 0xbf5e, 0xa438, 0x36e1, + 0xa438, 0x8fe9, 0xa438, 0x025f, 0xa438, 0x5fae, 0xa438, 0x09bf, + 0xa438, 0x5e36, 0xa438, 0xe184, 0xa438, 0xe102, 0xa438, 0x5f5f, + 0xa438, 0xee8f, 0xa438, 0xe800, 0xa438, 0xaf49, 0xa438, 0xcdbf, + 0xa438, 0x595c, 0xa438, 0x025f, 0xa438, 0x7ea1, 0xa438, 0x0203, + 0xa438, 0xaf87, 0xa438, 0x79d1, 0xa438, 0x00af, 0xa438, 0x877c, + 0xa438, 0xe181, 0xa438, 0x941f, 0xa438, 0x00af, 0xa438, 0x3ff7, + 0xa438, 0xac4e, 0xa438, 0x06ac, 0xa438, 0x4003, 0xa438, 0xaf24, + 0xa438, 0x97af, 0xa438, 0x2467, 0xa436, 0xb85e, 0xa438, 0x5082, + 0xa436, 0xb860, 0xa438, 0x4575, 0xa436, 0xb862, 0xa438, 0x425F, + 0xa436, 0xb864, 0xa438, 0x0096, 0xa436, 0xb886, 0xa438, 0x4A44, + 0xa436, 0xb888, 0xa438, 0x49c4, 0xa436, 0xb88a, 0xa438, 0x3FF2, + 0xa436, 0xb88c, 0xa438, 0x245C, 0xa436, 0xb838, 0xa438, 0x00ff, + 0xb820, 0x0010, 0xa436, 0x843d, 0xa438, 0xaf84, 0xa438, 0xa6af, + 0xa438, 0x8540, 0xa438, 0xaf85, 0xa438, 0xaeaf, 0xa438, 0x85b5, + 0xa438, 0xaf87, 0xa438, 0x7daf, 0xa438, 0x8784, 0xa438, 0xaf87, + 0xa438, 0x87af, 0xa438, 0x87e5, 0xa438, 0x0066, 0xa438, 0x0a03, + 0xa438, 0x6607, 0xa438, 0x2666, 0xa438, 0x1c00, 0xa438, 0x660d, + 0xa438, 0x0166, 0xa438, 0x1004, 0xa438, 0x6616, 0xa438, 0x0566, + 0xa438, 0x1f06, 0xa438, 0x6a5d, 0xa438, 0x2766, 0xa438, 0x1900, + 0xa438, 0x6625, 0xa438, 0x2466, 0xa438, 0x2820, 0xa438, 0x662b, + 0xa438, 0x2466, 0xa438, 0x4600, 0xa438, 0x664c, 0xa438, 0x0166, + 0xa438, 0x4902, 0xa438, 0x8861, 0xa438, 0x0388, 0xa438, 0x5e05, + 0xa438, 0x886d, 0xa438, 0x0588, 0xa438, 0x7005, 0xa438, 0x8873, + 0xa438, 0x0588, 0xa438, 0x7605, 0xa438, 0x8879, 0xa438, 0x0588, + 0xa438, 0x7c05, 0xa438, 0x887f, 0xa438, 0x0588, 0xa438, 0x8205, + 0xa438, 0x8885, 0xa438, 0x0588, 0xa438, 0x881e, 0xa438, 0x13ad, + 0xa438, 0x2841, 0xa438, 0xbf64, 0xa438, 0xf102, 0xa438, 0x6b9d, + 0xa438, 0xad28, 0xa438, 0x03af, 0xa438, 0x15fc, 0xa438, 0xbf65, + 0xa438, 0xcb02, 0xa438, 0x6b9d, 0xa438, 0x0d11, 0xa438, 0xf62f, + 0xa438, 0xef31, 0xa438, 0xd202, 0xa438, 0xbf88, 0xa438, 0x6402, + 0xa438, 0x6b52, 0xa438, 0xe082, 0xa438, 0x020d, 0xa438, 0x01f6, + 0xa438, 0x271b, 0xa438, 0x03aa, 0xa438, 0x0182, 0xa438, 0xe082, + 0xa438, 0x010d, 0xa438, 0x01f6, 0xa438, 0x271b, 0xa438, 0x03aa, + 0xa438, 0x0782, 0xa438, 0xbf88, 0xa438, 0x6402, 0xa438, 0x6b5b, + 0xa438, 0xaf15, 0xa438, 0xf9bf, 0xa438, 0x65cb, 0xa438, 0x026b, + 0xa438, 0x9d0d, 0xa438, 0x11f6, 0xa438, 0x2fef, 0xa438, 0x31e0, + 0xa438, 0x8ff7, 0xa438, 0x0d01, 0xa438, 0xf627, 0xa438, 0x1b03, + 0xa438, 0xaa20, 0xa438, 0xe18f, 0xa438, 0xf4d0, 0xa438, 0x00bf, + 0xa438, 0x6587, 0xa438, 0x026b, 0xa438, 0x7ee1, 0xa438, 0x8ff5, + 0xa438, 0xbf65, 0xa438, 0x8a02, 0xa438, 0x6b7e, 0xa438, 0xe18f, + 0xa438, 0xf6bf, 0xa438, 0x6584, 0xa438, 0x026b, 0xa438, 0x7eaf, + 0xa438, 0x15fc, 0xa438, 0xe18f, 0xa438, 0xf1d0, 0xa438, 0x00bf, + 0xa438, 0x6587, 0xa438, 0x026b, 0xa438, 0x7ee1, 0xa438, 0x8ff2, + 0xa438, 0xbf65, 0xa438, 0x8a02, 0xa438, 0x6b7e, 0xa438, 0xe18f, + 0xa438, 0xf3bf, 0xa438, 0x6584, 0xa438, 0xaf15, 0xa438, 0xfcd1, + 0xa438, 0x07bf, 0xa438, 0x65ce, 0xa438, 0x026b, 0xa438, 0x7ed1, + 0xa438, 0x0cbf, 0xa438, 0x65d1, 0xa438, 0x026b, 0xa438, 0x7ed1, + 0xa438, 0x03bf, 0xa438, 0x885e, 0xa438, 0x026b, 0xa438, 0x7ed1, + 0xa438, 0x05bf, 0xa438, 0x8867, 0xa438, 0x026b, 0xa438, 0x7ed1, + 0xa438, 0x07bf, 0xa438, 0x886a, 0xa438, 0x026b, 0xa438, 0x7ebf, + 0xa438, 0x6a6c, 0xa438, 0x026b, 0xa438, 0x5b02, 0xa438, 0x62b5, + 0xa438, 0xbf6a, 0xa438, 0x0002, 0xa438, 0x6b5b, 0xa438, 0xbf64, + 0xa438, 0x4e02, 0xa438, 0x6b9d, 0xa438, 0xac28, 0xa438, 0x0bbf, + 0xa438, 0x6412, 0xa438, 0x026b, 0xa438, 0x9da1, 0xa438, 0x0502, + 0xa438, 0xaeec, 0xa438, 0xd104, 0xa438, 0xbf65, 0xa438, 0xce02, + 0xa438, 0x6b7e, 0xa438, 0xd104, 0xa438, 0xbf65, 0xa438, 0xd102, + 0xa438, 0x6b7e, 0xa438, 0xd102, 0xa438, 0xbf88, 0xa438, 0x6702, + 0xa438, 0x6b7e, 0xa438, 0xd104, 0xa438, 0xbf88, 0xa438, 0x6a02, + 0xa438, 0x6b7e, 0xa438, 0xaf62, 0xa438, 0x72f6, 0xa438, 0x0af6, + 0xa438, 0x09af, 0xa438, 0x34e3, 0xa438, 0x0285, 0xa438, 0xbe02, + 0xa438, 0x106c, 0xa438, 0xaf10, 0xa438, 0x6bf8, 0xa438, 0xfaef, + 0xa438, 0x69e0, 0xa438, 0x804c, 0xa438, 0xac25, 0xa438, 0x17e0, + 0xa438, 0x8040, 0xa438, 0xad25, 0xa438, 0x1a02, 0xa438, 0x85ed, + 0xa438, 0xe080, 0xa438, 0x40ac, 0xa438, 0x2511, 0xa438, 0xbf87, + 0xa438, 0x6502, 0xa438, 0x6b5b, 0xa438, 0xae09, 0xa438, 0x0287, + 0xa438, 0x2402, 0xa438, 0x875a, 0xa438, 0x0287, 0xa438, 0x4fef, + 0xa438, 0x96fe, 0xa438, 0xfc04, 0xa438, 0xf8e0, 0xa438, 0x8019, + 0xa438, 0xad20, 0xa438, 0x11e0, 0xa438, 0x8fe3, 0xa438, 0xac20, + 0xa438, 0x0502, 0xa438, 0x860a, 0xa438, 0xae03, 0xa438, 0x0286, + 0xa438, 0x7802, 0xa438, 0x86c1, 0xa438, 0x0287, 0xa438, 0x4ffc, 0xa438, 0x04f8, 0xa438, 0xf9ef, 0xa438, 0x79fb, 0xa438, 0xbf87, 0xa438, 0x6802, 0xa438, 0x6b9d, 0xa438, 0x5c20, 0xa438, 0x000d, - 0xa438, 0x4da1, 0xa438, 0x0020, 0xa438, 0xbf87, 0xa438, 0x6802, - 0xa438, 0x6b9d, 0xa438, 0x5c06, 0xa438, 0x000d, 0xa438, 0x49e3, - 0xa438, 0x8fea, 0xa438, 0x1b31, 0xa438, 0x9f0e, 0xa438, 0xbf87, - 0xa438, 0x7102, 0xa438, 0x6b5b, 0xa438, 0xbf87, 0xa438, 0x7702, - 0xa438, 0x6b5b, 0xa438, 0xae0c, 0xa438, 0xbf87, 0xa438, 0x7102, - 0xa438, 0x6b52, 0xa438, 0xbf87, 0xa438, 0x7702, 0xa438, 0x6b52, - 0xa438, 0xee8f, 0xa438, 0xe300, 0xa438, 0xffef, 0xa438, 0x97fd, - 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xef79, 0xa438, 0xfbbf, - 0xa438, 0x8768, 0xa438, 0x026b, 0xa438, 0x9d5c, 0xa438, 0x2000, - 0xa438, 0x0d4d, 0xa438, 0xa101, 0xa438, 0x4abf, 0xa438, 0x8768, + 0xa438, 0x4da1, 0xa438, 0x0151, 0xa438, 0xbf87, 0xa438, 0x6802, + 0xa438, 0x6b9d, 0xa438, 0x5c07, 0xa438, 0xffe3, 0xa438, 0x8fe4, + 0xa438, 0x1b31, 0xa438, 0x9f41, 0xa438, 0x0d48, 0xa438, 0xe38f, + 0xa438, 0xe51b, 0xa438, 0x319f, 0xa438, 0x38bf, 0xa438, 0x876b, 0xa438, 0x026b, 0xa438, 0x9d5c, 0xa438, 0x07ff, 0xa438, 0xe38f, - 0xa438, 0xeb1b, 0xa438, 0x319f, 0xa438, 0x3a0d, 0xa438, 0x48e3, - 0xa438, 0x8fec, 0xa438, 0x1b31, 0xa438, 0x9f31, 0xa438, 0xbf87, - 0xa438, 0x6b02, 0xa438, 0x6b9d, 0xa438, 0xe38f, 0xa438, 0xed1b, - 0xa438, 0x319f, 0xa438, 0x240d, 0xa438, 0x48e3, 0xa438, 0x8fee, - 0xa438, 0x1b31, 0xa438, 0x9f1b, 0xa438, 0xbf87, 0xa438, 0x6e02, - 0xa438, 0x6b9d, 0xa438, 0xe38f, 0xa438, 0xef1b, 0xa438, 0x319f, - 0xa438, 0x0ebf, 0xa438, 0x8774, 0xa438, 0x026b, 0xa438, 0x5bbf, - 0xa438, 0x877a, 0xa438, 0x026b, 0xa438, 0x5bae, 0xa438, 0x00ff, - 0xa438, 0xef97, 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xef79, - 0xa438, 0xfbe0, 0xa438, 0x8019, 0xa438, 0xad20, 0xa438, 0x1cee, - 0xa438, 0x8fe3, 0xa438, 0x00bf, 0xa438, 0x8771, 0xa438, 0x026b, - 0xa438, 0x52bf, 0xa438, 0x8777, 0xa438, 0x026b, 0xa438, 0x52bf, - 0xa438, 0x8774, 0xa438, 0x026b, 0xa438, 0x52bf, 0xa438, 0x877a, - 0xa438, 0x026b, 0xa438, 0x52ff, 0xa438, 0xef97, 0xa438, 0xfc04, - 0xa438, 0xf8e0, 0xa438, 0x8040, 0xa438, 0xf625, 0xa438, 0xe480, - 0xa438, 0x40fc, 0xa438, 0x04f8, 0xa438, 0xe080, 0xa438, 0x4cf6, - 0xa438, 0x25e4, 0xa438, 0x804c, 0xa438, 0xfc04, 0xa438, 0x55a4, - 0xa438, 0xbaf0, 0xa438, 0xa64a, 0xa438, 0xf0a6, 0xa438, 0x4cf0, - 0xa438, 0xa64e, 0xa438, 0x66a4, 0xa438, 0xb655, 0xa438, 0xa4b6, - 0xa438, 0x00ac, 0xa438, 0x0e11, 0xa438, 0xac0e, 0xa438, 0xee80, - 0xa438, 0x4c3a, 0xa438, 0xaf07, 0xa438, 0xd0af, 0xa438, 0x26d0, - 0xa438, 0xa201, 0xa438, 0x0ebf, 0xa438, 0x663d, 0xa438, 0x026b, - 0xa438, 0x52bf, 0xa438, 0x6643, 0xa438, 0x026b, 0xa438, 0x52ae, - 0xa438, 0x11bf, 0xa438, 0x6643, 0xa438, 0x026b, 0xa438, 0x5bd4, - 0xa438, 0x0054, 0xa438, 0xb4fe, 0xa438, 0xbf66, 0xa438, 0x3d02, - 0xa438, 0x6b5b, 0xa438, 0xd300, 0xa438, 0x020d, 0xa438, 0xf6a2, - 0xa438, 0x0405, 0xa438, 0xe081, 0xa438, 0x47ae, 0xa438, 0x03e0, - 0xa438, 0x8148, 0xa438, 0xac23, 0xa438, 0x02ae, 0xa438, 0x0268, - 0xa438, 0xf01a, 0xa438, 0x10ad, 0xa438, 0x2f04, 0xa438, 0xd100, - 0xa438, 0xae05, 0xa438, 0xad2c, 0xa438, 0x02d1, 0xa438, 0x0f1f, - 0xa438, 0x00a2, 0xa438, 0x0407, 0xa438, 0x3908, 0xa438, 0xad2f, - 0xa438, 0x02d1, 0xa438, 0x0002, 0xa438, 0x0e1c, 0xa438, 0x2b01, - 0xa438, 0xad3a, 0xa438, 0xc9af, 0xa438, 0x0dee, 0xa438, 0xa000, - 0xa438, 0x2702, 0xa438, 0x1beb, 0xa438, 0xe18f, 0xa438, 0xe1ac, - 0xa438, 0x2819, 0xa438, 0xee8f, 0xa438, 0xe101, 0xa438, 0x1f44, - 0xa438, 0xbf65, 0xa438, 0x9302, 0xa438, 0x6b9d, 0xa438, 0xe58f, - 0xa438, 0xe21f, 0xa438, 0x44d1, 0xa438, 0x02bf, 0xa438, 0x6593, - 0xa438, 0x026b, 0xa438, 0x7ee0, 0xa438, 0x82b1, 0xa438, 0xae49, - 0xa438, 0xa001, 0xa438, 0x0502, 0xa438, 0x1c4d, 0xa438, 0xae41, - 0xa438, 0xa002, 0xa438, 0x0502, 0xa438, 0x1c90, 0xa438, 0xae39, - 0xa438, 0xa003, 0xa438, 0x0502, 0xa438, 0x1c9d, 0xa438, 0xae31, - 0xa438, 0xa004, 0xa438, 0x0502, 0xa438, 0x1cbc, 0xa438, 0xae29, - 0xa438, 0xa005, 0xa438, 0x1e02, 0xa438, 0x1cc9, 0xa438, 0xe080, - 0xa438, 0xdfac, 0xa438, 0x2013, 0xa438, 0xac21, 0xa438, 0x10ac, - 0xa438, 0x220d, 0xa438, 0xe18f, 0xa438, 0xe2bf, 0xa438, 0x6593, - 0xa438, 0x026b, 0xa438, 0x7eee, 0xa438, 0x8fe1, 0xa438, 0x00ae, - 0xa438, 0x08a0, 0xa438, 0x0605, 0xa438, 0x021d, 0xa438, 0x07ae, - 0xa438, 0x00e0, 0xa438, 0x82b1, 0xa438, 0xaf1b, 0xa438, 0xe910, - 0xa438, 0xbf4a, 0xa438, 0x99bf, 0xa438, 0x4a00, 0xa438, 0xa86a, - 0xa438, 0xfdad, 0xa438, 0x5eca, 0xa438, 0xad5e, 0xa438, 0x88bd, - 0xa438, 0x2c99, 0xa438, 0xbd2c, 0xa438, 0x33bd, 0xa438, 0x3222, - 0xa438, 0xbd32, 0xa438, 0x11bd, 0xa438, 0x3200, 0xa438, 0xbd32, - 0xa438, 0x77bd, 0xa438, 0x3266, 0xa438, 0xbd32, 0xa438, 0x55bd, - 0xa438, 0x3244, 0xa438, 0xbd32, 0xa436, 0xb818, 0xa438, 0x15c5, - 0xa436, 0xb81a, 0xa438, 0x6255, 0xa436, 0xb81c, 0xa438, 0x34e1, - 0xa436, 0xb81e, 0xa438, 0x1068, 0xa436, 0xb850, 0xa438, 0x07cc, - 0xa436, 0xb852, 0xa438, 0x26ca, 0xa436, 0xb878, 0xa438, 0x0dbf, - 0xa436, 0xb884, 0xa438, 0x1BB1, 0xa436, 0xb832, 0xa438, 0x00ff, - 0xa436, 0x0000, 0xa438, 0x0000, 0xB82E, 0x0000, 0xa436, 0x8023, - 0xa438, 0x0000, 0xa436, 0x801E, 0xa438, 0x0023, 0xB820, 0x0000, - 0xFFFF, 0xFFFF + 0xa438, 0xe61b, 0xa438, 0x319f, 0xa438, 0x280d, 0xa438, 0x48e3, + 0xa438, 0x8fe7, 0xa438, 0x1b31, 0xa438, 0x9f1f, 0xa438, 0xbf87, + 0xa438, 0x6e02, 0xa438, 0x6b9d, 0xa438, 0x5c07, 0xa438, 0xffe3, + 0xa438, 0x8fe8, 0xa438, 0x1b31, 0xa438, 0x9f0f, 0xa438, 0x0d48, + 0xa438, 0xe38f, 0xa438, 0xe91b, 0xa438, 0x319f, 0xa438, 0x06ee, + 0xa438, 0x8fe3, 0xa438, 0x01ae, 0xa438, 0x04ee, 0xa438, 0x8fe3, + 0xa438, 0x00ff, 0xa438, 0xef97, 0xa438, 0xfdfc, 0xa438, 0x04f8, + 0xa438, 0xf9ef, 0xa438, 0x79fb, 0xa438, 0xbf87, 0xa438, 0x6802, + 0xa438, 0x6b9d, 0xa438, 0x5c20, 0xa438, 0x000d, 0xa438, 0x4da1, + 0xa438, 0x0020, 0xa438, 0xbf87, 0xa438, 0x6802, 0xa438, 0x6b9d, + 0xa438, 0x5c06, 0xa438, 0x000d, 0xa438, 0x49e3, 0xa438, 0x8fea, + 0xa438, 0x1b31, 0xa438, 0x9f0e, 0xa438, 0xbf87, 0xa438, 0x7102, + 0xa438, 0x6b5b, 0xa438, 0xbf87, 0xa438, 0x7702, 0xa438, 0x6b5b, + 0xa438, 0xae0c, 0xa438, 0xbf87, 0xa438, 0x7102, 0xa438, 0x6b52, + 0xa438, 0xbf87, 0xa438, 0x7702, 0xa438, 0x6b52, 0xa438, 0xee8f, + 0xa438, 0xe300, 0xa438, 0xffef, 0xa438, 0x97fd, 0xa438, 0xfc04, + 0xa438, 0xf8f9, 0xa438, 0xef79, 0xa438, 0xfbbf, 0xa438, 0x8768, + 0xa438, 0x026b, 0xa438, 0x9d5c, 0xa438, 0x2000, 0xa438, 0x0d4d, + 0xa438, 0xa101, 0xa438, 0x4abf, 0xa438, 0x8768, 0xa438, 0x026b, + 0xa438, 0x9d5c, 0xa438, 0x07ff, 0xa438, 0xe38f, 0xa438, 0xeb1b, + 0xa438, 0x319f, 0xa438, 0x3a0d, 0xa438, 0x48e3, 0xa438, 0x8fec, + 0xa438, 0x1b31, 0xa438, 0x9f31, 0xa438, 0xbf87, 0xa438, 0x6b02, + 0xa438, 0x6b9d, 0xa438, 0xe38f, 0xa438, 0xed1b, 0xa438, 0x319f, + 0xa438, 0x240d, 0xa438, 0x48e3, 0xa438, 0x8fee, 0xa438, 0x1b31, + 0xa438, 0x9f1b, 0xa438, 0xbf87, 0xa438, 0x6e02, 0xa438, 0x6b9d, + 0xa438, 0xe38f, 0xa438, 0xef1b, 0xa438, 0x319f, 0xa438, 0x0ebf, + 0xa438, 0x8774, 0xa438, 0x026b, 0xa438, 0x5bbf, 0xa438, 0x877a, + 0xa438, 0x026b, 0xa438, 0x5bae, 0xa438, 0x00ff, 0xa438, 0xef97, + 0xa438, 0xfdfc, 0xa438, 0x04f8, 0xa438, 0xef79, 0xa438, 0xfbe0, + 0xa438, 0x8019, 0xa438, 0xad20, 0xa438, 0x1cee, 0xa438, 0x8fe3, + 0xa438, 0x00bf, 0xa438, 0x8771, 0xa438, 0x026b, 0xa438, 0x52bf, + 0xa438, 0x8777, 0xa438, 0x026b, 0xa438, 0x52bf, 0xa438, 0x8774, + 0xa438, 0x026b, 0xa438, 0x52bf, 0xa438, 0x877a, 0xa438, 0x026b, + 0xa438, 0x52ff, 0xa438, 0xef97, 0xa438, 0xfc04, 0xa438, 0xf8e0, + 0xa438, 0x8040, 0xa438, 0xf625, 0xa438, 0xe480, 0xa438, 0x40fc, + 0xa438, 0x04f8, 0xa438, 0xe080, 0xa438, 0x4cf6, 0xa438, 0x25e4, + 0xa438, 0x804c, 0xa438, 0xfc04, 0xa438, 0x55a4, 0xa438, 0xbaf0, + 0xa438, 0xa64a, 0xa438, 0xf0a6, 0xa438, 0x4cf0, 0xa438, 0xa64e, + 0xa438, 0x66a4, 0xa438, 0xb655, 0xa438, 0xa4b6, 0xa438, 0x00ac, + 0xa438, 0x0e66, 0xa438, 0xac0e, 0xa438, 0xee80, 0xa438, 0x4c3a, + 0xa438, 0xaf07, 0xa438, 0xd0af, 0xa438, 0x26d0, 0xa438, 0xa201, + 0xa438, 0x0ebf, 0xa438, 0x663d, 0xa438, 0x026b, 0xa438, 0x52bf, + 0xa438, 0x6643, 0xa438, 0x026b, 0xa438, 0x52ae, 0xa438, 0x11bf, + 0xa438, 0x6643, 0xa438, 0x026b, 0xa438, 0x5bd4, 0xa438, 0x0054, + 0xa438, 0xb4fe, 0xa438, 0xbf66, 0xa438, 0x3d02, 0xa438, 0x6b5b, + 0xa438, 0xd300, 0xa438, 0x020d, 0xa438, 0xf6a2, 0xa438, 0x0405, + 0xa438, 0xe081, 0xa438, 0x47ae, 0xa438, 0x03e0, 0xa438, 0x8148, + 0xa438, 0xac23, 0xa438, 0x02ae, 0xa438, 0x0268, 0xa438, 0xf01a, + 0xa438, 0x10ad, 0xa438, 0x2f04, 0xa438, 0xd100, 0xa438, 0xae05, + 0xa438, 0xad2c, 0xa438, 0x02d1, 0xa438, 0x0f1f, 0xa438, 0x00a2, + 0xa438, 0x0407, 0xa438, 0x3908, 0xa438, 0xad2f, 0xa438, 0x02d1, + 0xa438, 0x0002, 0xa438, 0x0e1c, 0xa438, 0x2b01, 0xa438, 0xad3a, + 0xa438, 0xc9af, 0xa438, 0x0dee, 0xa438, 0xa000, 0xa438, 0x2702, + 0xa438, 0x1beb, 0xa438, 0xe18f, 0xa438, 0xe1ac, 0xa438, 0x2819, + 0xa438, 0xee8f, 0xa438, 0xe101, 0xa438, 0x1f44, 0xa438, 0xbf65, + 0xa438, 0x9302, 0xa438, 0x6b9d, 0xa438, 0xe58f, 0xa438, 0xe21f, + 0xa438, 0x44d1, 0xa438, 0x02bf, 0xa438, 0x6593, 0xa438, 0x026b, + 0xa438, 0x7ee0, 0xa438, 0x82b1, 0xa438, 0xae49, 0xa438, 0xa001, + 0xa438, 0x0502, 0xa438, 0x1c4d, 0xa438, 0xae41, 0xa438, 0xa002, + 0xa438, 0x0502, 0xa438, 0x1c90, 0xa438, 0xae39, 0xa438, 0xa003, + 0xa438, 0x0502, 0xa438, 0x1c9d, 0xa438, 0xae31, 0xa438, 0xa004, + 0xa438, 0x0502, 0xa438, 0x1cbc, 0xa438, 0xae29, 0xa438, 0xa005, + 0xa438, 0x1e02, 0xa438, 0x1cc9, 0xa438, 0xe080, 0xa438, 0xdfac, + 0xa438, 0x2013, 0xa438, 0xac21, 0xa438, 0x10ac, 0xa438, 0x220d, + 0xa438, 0xe18f, 0xa438, 0xe2bf, 0xa438, 0x6593, 0xa438, 0x026b, + 0xa438, 0x7eee, 0xa438, 0x8fe1, 0xa438, 0x00ae, 0xa438, 0x08a0, + 0xa438, 0x0605, 0xa438, 0x021d, 0xa438, 0x07ae, 0xa438, 0x00e0, + 0xa438, 0x82b1, 0xa438, 0xaf1b, 0xa438, 0xe910, 0xa438, 0xbf4a, + 0xa438, 0x99bf, 0xa438, 0x4a00, 0xa438, 0xa86a, 0xa438, 0xfdad, + 0xa438, 0x5eca, 0xa438, 0xad5e, 0xa438, 0x88bd, 0xa438, 0x2c99, + 0xa438, 0xbd2c, 0xa438, 0x33bd, 0xa438, 0x3222, 0xa438, 0xbd32, + 0xa438, 0x11bd, 0xa438, 0x3200, 0xa438, 0xbd32, 0xa438, 0x77bd, + 0xa438, 0x3266, 0xa438, 0xbd32, 0xa438, 0x55bd, 0xa438, 0x3244, + 0xa438, 0xbd32, 0xa436, 0xb818, 0xa438, 0x15c5, 0xa436, 0xb81a, + 0xa438, 0x6255, 0xa436, 0xb81c, 0xa438, 0x34e1, 0xa436, 0xb81e, + 0xa438, 0x1068, 0xa436, 0xb850, 0xa438, 0x07cc, 0xa436, 0xb852, + 0xa438, 0x26ca, 0xa436, 0xb878, 0xa438, 0x0dbf, 0xa436, 0xb884, + 0xa438, 0x1BB1, 0xa436, 0xb832, 0xa438, 0x00ff, 0xa436, 0x0000, + 0xa438, 0x0000, 0xB82E, 0x0000, 0xa436, 0x8023, 0xa438, 0x0000, + 0xa436, 0x801E, 0xa438, 0x0031, 0xB820, 0x0000, 0xFFFF, 0xFFFF }; - static const u16 phy_mcu_ram_code_8125d_1_2[] = { 0xb892, 0x0000, 0xB88E, 0xC28F, 0xB890, 0x252D, 0xB88E, 0xC290, 0xB890, 0xC924, 0xB88E, 0xC291, 0xB890, 0xC92E, 0xB88E, 0xC292, @@ -525,10 +755,143 @@ static const u16 phy_mcu_ram_code_8125d_1_2[] = { 0xB890, 0x9F3A, 0xB88E, 0xC2CB, 0xB890, 0x9F3A, 0xB88E, 0xC2CC, 0xB890, 0x4430, 0xFFFF, 0xFFFF }; - static const u16 phy_mcu_ram_code_8125d_1_3[] = { 0xa436, 0xacca, 0xa438, 0x0104, 0xa436, 0xaccc, 0xa438, 0x8000, 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x0fff, + 0xa436, 0xacce, 0xa438, 0xfd47, 0xa436, 0xacd0, 0xa438, 0x0fff, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xe56f, 0xa436, 0xacd0, 0xa438, 0x01c0, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xed97, 0xa436, 0xacd0, 0xa438, 0x01c8, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xf5bf, 0xa436, 0xacd0, 0xa438, 0x01d0, + 0xa436, 0xacce, 0xa438, 0xfb07, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb0f, 0xa436, 0xacd0, 0xa438, 0x01d8, + 0xa436, 0xacce, 0xa438, 0xa087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0xa00f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0xa807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0xa88f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0xb027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0xb02f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0xb847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0xb84f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0xfb17, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb1f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xa017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0xa01f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0xa837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0xa83f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0xb097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0xb05f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0xb857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0xb89f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0xfb27, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb2f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x8087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x800f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x8807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x888f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x9027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x902f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x9847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x984f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0xa0a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0xa8af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0xa067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0xa86f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb37, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb3f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x8017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x801f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x8837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x883f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x9097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x905f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x9857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x989f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0xb0b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0xb8bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0xb077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0xb87f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb47, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb4f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x6087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x600f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x6807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x688f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x7027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x702f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x7847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x784f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0x80a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x88af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x8067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x886f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb57, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb5f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x6017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x601f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x6837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x683f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x7097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x705f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x7857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x789f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0x90b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x98bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x9077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x987f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb67, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb6f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x4087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x400f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x4807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x488f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x5027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x502f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x5847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x584f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0x60a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x68af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x6067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x686f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb77, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb7f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x4017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x401f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x4837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x483f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x5097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x505f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x5857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x589f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0x70b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x78bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x7077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x787f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb87, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb8f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x40a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x48af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x4067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x486f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb97, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb9f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x50b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x58bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x5077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x587f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfba7, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfbaf, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x2067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x286f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfbb7, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfbbf, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x3077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x387f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfff9, 0xa436, 0xacd0, 0xa438, 0x17ff, + 0xa436, 0xacce, 0xa438, 0xfff9, 0xa436, 0xacd0, 0xa438, 0x17ff, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x0fff, 0xa436, 0xacce, 0xa438, 0xfff8, 0xa436, 0xacd0, 0xa438, 0x0fff, 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, @@ -568,9 +931,413 @@ static const u16 phy_mcu_ram_code_8125d_1_3[] = { 0xa436, 0xacce, 0xa438, 0x98bf, 0xa436, 0xacd0, 0xa438, 0x01b8, 0xa436, 0xacce, 0xa438, 0x9077, 0xa436, 0xacd0, 0xa438, 0x1171, 0xa436, 0xacce, 0xa438, 0x987f, 0xa436, 0xacd0, 0xa438, 0x1179, - 0xa436, 0xacca, 0xa438, 0x0004, 0xa436, 0xacc6, 0xa438, 0x0015, + 0xa436, 0xacca, 0xa438, 0x0004, 0xa436, 0xacc6, 0xa438, 0x0008, + 0xa436, 0xacc8, 0xa438, 0xc000, 0xa436, 0xacc6, 0xa438, 0x0015, + 0xa436, 0xacc8, 0xa438, 0xc043, 0xa436, 0xacc8, 0xa438, 0x0000, + 0xB820, 0x0000, 0xFFFF, 0xFFFF +}; + +static const u16 phy_mcu_ram_code_8125d_2_1[] = { + 0xa436, 0x8023, 0xa438, 0x3801, 0xa436, 0xB82E, 0xa438, 0x0001, + 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x807e, 0xa438, 0x1800, 0xa438, 0x80be, + 0xa438, 0x1800, 0xa438, 0x81c8, 0xa438, 0x1800, 0xa438, 0x81c8, + 0xa438, 0x1800, 0xa438, 0x81c8, 0xa438, 0x1800, 0xa438, 0x81c8, + 0xa438, 0x1800, 0xa438, 0x81c8, 0xa438, 0xd500, 0xa438, 0xc48d, + 0xa438, 0xd504, 0xa438, 0x8d03, 0xa438, 0xd701, 0xa438, 0x4045, + 0xa438, 0xad02, 0xa438, 0xd504, 0xa438, 0xd706, 0xa438, 0x2529, + 0xa438, 0x8021, 0xa438, 0xd718, 0xa438, 0x607b, 0xa438, 0x40da, + 0xa438, 0xf01b, 0xa438, 0x461a, 0xa438, 0xf045, 0xa438, 0xd718, + 0xa438, 0x62fb, 0xa438, 0xbb01, 0xa438, 0xd75e, 0xa438, 0x6271, + 0xa438, 0x0cf0, 0xa438, 0x0c10, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0xd70c, 0xa438, 0x6187, 0xa438, 0x0cf0, 0xa438, 0x0470, + 0xa438, 0x0cf0, 0xa438, 0x0430, 0xa438, 0x0cf0, 0xa438, 0x0410, + 0xa438, 0xce00, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0808, + 0xa438, 0xf002, 0xa438, 0xa4f0, 0xa438, 0xf042, 0xa438, 0xbb02, + 0xa438, 0xd75e, 0xa438, 0x6271, 0xa438, 0x0cf0, 0xa438, 0x0c20, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xd70c, 0xa438, 0x6187, + 0xa438, 0x0cf0, 0xa438, 0x0470, 0xa438, 0x0cf0, 0xa438, 0x0430, + 0xa438, 0x0cf0, 0xa438, 0x0420, 0xa438, 0xce00, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0804, 0xa438, 0xf002, 0xa438, 0xa4f0, + 0xa438, 0xf02c, 0xa438, 0xbb04, 0xa438, 0xd75e, 0xa438, 0x6271, + 0xa438, 0x0cf0, 0xa438, 0x0c40, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0xd70c, 0xa438, 0x6187, 0xa438, 0x0cf0, 0xa438, 0x0470, + 0xa438, 0x0cf0, 0xa438, 0x0450, 0xa438, 0x0cf0, 0xa438, 0x0440, + 0xa438, 0xce00, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0802, + 0xa438, 0xf002, 0xa438, 0xa4f0, 0xa438, 0xf016, 0xa438, 0xbb08, + 0xa438, 0xd75e, 0xa438, 0x6271, 0xa438, 0x0cf0, 0xa438, 0x0c80, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xd70c, 0xa438, 0x6187, + 0xa438, 0x0cf0, 0xa438, 0x04b0, 0xa438, 0x0cf0, 0xa438, 0x0490, + 0xa438, 0x0cf0, 0xa438, 0x0480, 0xa438, 0xce00, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0801, 0xa438, 0xf002, 0xa438, 0xa4f0, + 0xa438, 0xce00, 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x165a, + 0xa438, 0xd75e, 0xa438, 0x67b1, 0xa438, 0xd504, 0xa438, 0xd71e, + 0xa438, 0x65bb, 0xa438, 0x63da, 0xa438, 0x61f9, 0xa438, 0x0cf0, + 0xa438, 0x0c10, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0808, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xd70c, 0xa438, 0x6087, + 0xa438, 0x0cf0, 0xa438, 0x0410, 0xa438, 0xf02c, 0xa438, 0xa4f0, + 0xa438, 0xf02a, 0xa438, 0x0cf0, 0xa438, 0x0c20, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0804, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0xd70c, 0xa438, 0x6087, 0xa438, 0x0cf0, 0xa438, 0x0420, + 0xa438, 0xf01e, 0xa438, 0xa4f0, 0xa438, 0xf01c, 0xa438, 0x0cf0, + 0xa438, 0x0c40, 0xa438, 0xd505, 0xa438, 0x0c0f, 0xa438, 0x0802, + 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xd70c, 0xa438, 0x6087, + 0xa438, 0x0cf0, 0xa438, 0x0440, 0xa438, 0xf010, 0xa438, 0xa4f0, + 0xa438, 0xf00e, 0xa438, 0x0cf0, 0xa438, 0x0c80, 0xa438, 0xd505, + 0xa438, 0x0c0f, 0xa438, 0x0801, 0xa438, 0xd501, 0xa438, 0xce01, + 0xa438, 0xd70c, 0xa438, 0x6087, 0xa438, 0x0cf0, 0xa438, 0x0480, + 0xa438, 0xf002, 0xa438, 0xa4f0, 0xa438, 0x1800, 0xa438, 0x168c, + 0xa438, 0xd500, 0xa438, 0xd706, 0xa438, 0x2529, 0xa438, 0x80c8, + 0xa438, 0xd718, 0xa438, 0x607b, 0xa438, 0x40da, 0xa438, 0xf00f, + 0xa438, 0x431a, 0xa438, 0xf021, 0xa438, 0xd718, 0xa438, 0x617b, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0x1000, 0xa438, 0x1b1a, + 0xa438, 0xd718, 0xa438, 0x608e, 0xa438, 0xd73e, 0xa438, 0x5f34, + 0xa438, 0xf020, 0xa438, 0xf053, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0x1000, 0xa438, 0x1b1a, 0xa438, 0xd718, 0xa438, 0x608e, + 0xa438, 0xd73e, 0xa438, 0x5f34, 0xa438, 0xf023, 0xa438, 0xf067, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0x1000, 0xa438, 0x1b1a, + 0xa438, 0xd718, 0xa438, 0x608e, 0xa438, 0xd73e, 0xa438, 0x5f34, + 0xa438, 0xf026, 0xa438, 0xf07b, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0x1000, 0xa438, 0x1b1a, 0xa438, 0xd718, 0xa438, 0x608e, + 0xa438, 0xd73e, 0xa438, 0x5f34, 0xa438, 0xf029, 0xa438, 0xf08f, + 0xa438, 0x1000, 0xa438, 0x819f, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0xd73e, 0xa438, 0x7fb4, 0xa438, 0x1000, 0xa438, 0x81b4, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd718, 0xa438, 0x5fae, + 0xa438, 0xf028, 0xa438, 0x1000, 0xa438, 0x819f, 0xa438, 0x1000, + 0xa438, 0x1a8a, 0xa438, 0xd73e, 0xa438, 0x7fb4, 0xa438, 0x1000, + 0xa438, 0x81b4, 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd718, + 0xa438, 0x5fae, 0xa438, 0xf039, 0xa438, 0x1000, 0xa438, 0x819f, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd73e, 0xa438, 0x7fb4, + 0xa438, 0x1000, 0xa438, 0x81b4, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0xd718, 0xa438, 0x5fae, 0xa438, 0xf04a, 0xa438, 0x1000, + 0xa438, 0x819f, 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd73e, + 0xa438, 0x7fb4, 0xa438, 0x1000, 0xa438, 0x81b4, 0xa438, 0x1000, + 0xa438, 0x1a8a, 0xa438, 0xd718, 0xa438, 0x5fae, 0xa438, 0xf05b, + 0xa438, 0xd719, 0xa438, 0x4119, 0xa438, 0xd504, 0xa438, 0xac01, + 0xa438, 0xae01, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a78, + 0xa438, 0xf00a, 0xa438, 0xd719, 0xa438, 0x4118, 0xa438, 0xd504, + 0xa438, 0xac11, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa410, + 0xa438, 0xce00, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0xd718, 0xa438, 0x5fb0, 0xa438, 0xd505, 0xa438, 0xd719, + 0xa438, 0x4079, 0xa438, 0xa80f, 0xa438, 0xf05d, 0xa438, 0x4b98, + 0xa438, 0xa808, 0xa438, 0xf05a, 0xa438, 0xd719, 0xa438, 0x4119, + 0xa438, 0xd504, 0xa438, 0xac02, 0xa438, 0xae01, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a78, 0xa438, 0xf00a, 0xa438, 0xd719, + 0xa438, 0x4118, 0xa438, 0xd504, 0xa438, 0xac22, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0xa420, 0xa438, 0xce00, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd718, 0xa438, 0x5fb0, + 0xa438, 0xd505, 0xa438, 0xd719, 0xa438, 0x4079, 0xa438, 0xa80f, + 0xa438, 0xf03f, 0xa438, 0x47d8, 0xa438, 0xa804, 0xa438, 0xf03c, + 0xa438, 0xd719, 0xa438, 0x4119, 0xa438, 0xd504, 0xa438, 0xac04, + 0xa438, 0xae01, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a78, + 0xa438, 0xf00a, 0xa438, 0xd719, 0xa438, 0x4118, 0xa438, 0xd504, + 0xa438, 0xac44, 0xa438, 0xd501, 0xa438, 0xce01, 0xa438, 0xa440, + 0xa438, 0xce00, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1a8a, + 0xa438, 0xd718, 0xa438, 0x5fb0, 0xa438, 0xd505, 0xa438, 0xd719, + 0xa438, 0x4079, 0xa438, 0xa80f, 0xa438, 0xf021, 0xa438, 0x4418, + 0xa438, 0xa802, 0xa438, 0xf01e, 0xa438, 0xd719, 0xa438, 0x4119, + 0xa438, 0xd504, 0xa438, 0xac08, 0xa438, 0xae01, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a78, 0xa438, 0xf00a, 0xa438, 0xd719, + 0xa438, 0x4118, 0xa438, 0xd504, 0xa438, 0xac88, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0xa480, 0xa438, 0xce00, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1a8a, 0xa438, 0xd718, 0xa438, 0x5fb0, + 0xa438, 0xd505, 0xa438, 0xd719, 0xa438, 0x4079, 0xa438, 0xa80f, + 0xa438, 0xf003, 0xa438, 0x4058, 0xa438, 0xa801, 0xa438, 0x1800, + 0xa438, 0x1736, 0xa438, 0xd73e, 0xa438, 0xd505, 0xa438, 0x3088, + 0xa438, 0x81a6, 0xa438, 0x6193, 0xa438, 0x6132, 0xa438, 0x60d1, + 0xa438, 0x3298, 0xa438, 0x81b1, 0xa438, 0xf00a, 0xa438, 0xa808, + 0xa438, 0xf008, 0xa438, 0xa804, 0xa438, 0xf006, 0xa438, 0xa802, + 0xa438, 0xf004, 0xa438, 0xa801, 0xa438, 0xf002, 0xa438, 0xa80f, + 0xa438, 0xd500, 0xa438, 0x0800, 0xa438, 0xd505, 0xa438, 0xd75e, + 0xa438, 0x6211, 0xa438, 0xd71e, 0xa438, 0x619b, 0xa438, 0x611a, + 0xa438, 0x6099, 0xa438, 0x0c0f, 0xa438, 0x0808, 0xa438, 0xf009, + 0xa438, 0x0c0f, 0xa438, 0x0804, 0xa438, 0xf006, 0xa438, 0x0c0f, + 0xa438, 0x0802, 0xa438, 0xf003, 0xa438, 0x0c0f, 0xa438, 0x0801, + 0xa438, 0xd500, 0xa438, 0x0800, 0xa436, 0xA026, 0xa438, 0xffff, + 0xa436, 0xA024, 0xa438, 0xffff, 0xa436, 0xA022, 0xa438, 0xffff, + 0xa436, 0xA020, 0xa438, 0xffff, 0xa436, 0xA006, 0xa438, 0xffff, + 0xa436, 0xA004, 0xa438, 0x16ab, 0xa436, 0xA002, 0xa438, 0x1663, + 0xa436, 0xA000, 0xa438, 0x1608, 0xa436, 0xA008, 0xa438, 0x0700, + 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, 0xa438, 0x07f8, + 0xa436, 0xA014, 0xa438, 0xcc01, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa436, 0xA152, 0xa438, 0x021c, 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, 0x8013, + 0xa438, 0x1800, 0xa438, 0x803a, 0xa438, 0x1800, 0xa438, 0x8045, + 0xa438, 0x1800, 0xa438, 0x8049, 0xa438, 0x1800, 0xa438, 0x804d, + 0xa438, 0x1800, 0xa438, 0x8059, 0xa438, 0x1800, 0xa438, 0x805d, + 0xa438, 0xc2ff, 0xa438, 0x1800, 0xa438, 0x0042, 0xa438, 0x1000, + 0xa438, 0x02e5, 0xa438, 0x1000, 0xa438, 0x02b4, 0xa438, 0xd701, + 0xa438, 0x40e3, 0xa438, 0xd700, 0xa438, 0x5f6c, 0xa438, 0x1000, + 0xa438, 0x8021, 0xa438, 0x1800, 0xa438, 0x0073, 0xa438, 0x1800, + 0xa438, 0x0084, 0xa438, 0xd701, 0xa438, 0x4061, 0xa438, 0xba0f, + 0xa438, 0xf004, 0xa438, 0x4060, 0xa438, 0x1000, 0xa438, 0x802a, + 0xa438, 0xba10, 0xa438, 0x0800, 0xa438, 0xd700, 0xa438, 0x60bb, + 0xa438, 0x611c, 0xa438, 0x0c0f, 0xa438, 0x1a01, 0xa438, 0xf00a, + 0xa438, 0x60fc, 0xa438, 0x0c0f, 0xa438, 0x1a02, 0xa438, 0xf006, + 0xa438, 0x0c0f, 0xa438, 0x1a04, 0xa438, 0xf003, 0xa438, 0x0c0f, + 0xa438, 0x1a08, 0xa438, 0x0800, 0xa438, 0x0c0f, 0xa438, 0x0504, + 0xa438, 0xad02, 0xa438, 0x1000, 0xa438, 0x02c0, 0xa438, 0xd700, + 0xa438, 0x5fac, 0xa438, 0x1000, 0xa438, 0x8021, 0xa438, 0x1800, + 0xa438, 0x0139, 0xa438, 0x9a1f, 0xa438, 0x8bf0, 0xa438, 0x1800, + 0xa438, 0x02df, 0xa438, 0x9a1f, 0xa438, 0x9910, 0xa438, 0x1800, + 0xa438, 0x02d7, 0xa438, 0xad02, 0xa438, 0x8d01, 0xa438, 0x9a1f, + 0xa438, 0x9910, 0xa438, 0x9860, 0xa438, 0xcb00, 0xa438, 0xd501, + 0xa438, 0xce01, 0xa438, 0x85f0, 0xa438, 0xd500, 0xa438, 0x1800, + 0xa438, 0x015c, 0xa438, 0x8580, 0xa438, 0x8d02, 0xa438, 0x1800, + 0xa438, 0x018f, 0xa438, 0x0c0f, 0xa438, 0x0503, 0xa438, 0xad02, + 0xa438, 0x1800, 0xa438, 0x00dd, 0xa436, 0xA08E, 0xa438, 0x00db, + 0xa436, 0xA08C, 0xa438, 0x018e, 0xa436, 0xA08A, 0xa438, 0x015a, + 0xa436, 0xA088, 0xa438, 0x02d6, 0xa436, 0xA086, 0xa438, 0x02de, + 0xa436, 0xA084, 0xa438, 0x0137, 0xa436, 0xA082, 0xa438, 0x0071, + 0xa436, 0xA080, 0xa438, 0x0041, 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, 0x808a, 0xa438, 0x1800, + 0xa438, 0x80a1, 0xa438, 0x1800, 0xa438, 0x80b4, 0xa438, 0x1800, + 0xa438, 0x8104, 0xa438, 0x1800, 0xa438, 0x810b, 0xa438, 0x1800, + 0xa438, 0x810f, 0xa438, 0x8980, 0xa438, 0xd702, 0xa438, 0x6126, + 0xa438, 0xd704, 0xa438, 0x4063, 0xa438, 0xd702, 0xa438, 0x6060, + 0xa438, 0xd702, 0xa438, 0x6077, 0xa438, 0x1800, 0xa438, 0x0c29, + 0xa438, 0x1800, 0xa438, 0x0c2b, 0xa438, 0x1000, 0xa438, 0x115a, + 0xa438, 0xd71f, 0xa438, 0x5fb4, 0xa438, 0xd702, 0xa438, 0x6c46, + 0xa438, 0xd704, 0xa438, 0x4063, 0xa438, 0xd702, 0xa438, 0x6060, + 0xa438, 0xd702, 0xa438, 0x6b97, 0xa438, 0xa340, 0xa438, 0x0c06, + 0xa438, 0x0102, 0xa438, 0xce01, 0xa438, 0x1000, 0xa438, 0x117a, + 0xa438, 0xa240, 0xa438, 0xa902, 0xa438, 0xa204, 0xa438, 0xa280, + 0xa438, 0xa364, 0xa438, 0xab02, 0xa438, 0x8380, 0xa438, 0xa00a, + 0xa438, 0xcd8d, 0xa438, 0x1000, 0xa438, 0x115a, 0xa438, 0xd706, + 0xa438, 0x5fb5, 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x115a, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x115a, 0xa438, 0xd71f, 0xa438, 0x6065, 0xa438, 0x7c74, + 0xa438, 0xfffb, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x115a, + 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0xa410, + 0xa438, 0x8902, 0xa438, 0xa120, 0xa438, 0xa380, 0xa438, 0xce02, + 0xa438, 0x1000, 0xa438, 0x117a, 0xa438, 0x8280, 0xa438, 0xa324, + 0xa438, 0xab02, 0xa438, 0xa00a, 0xa438, 0x8118, 0xa438, 0x863f, + 0xa438, 0x87fb, 0xa438, 0xcd8e, 0xa438, 0xd193, 0xa438, 0xd047, + 0xa438, 0x1000, 0xa438, 0x115a, 0xa438, 0x1000, 0xa438, 0x115f, + 0xa438, 0xd700, 0xa438, 0x5f7b, 0xa438, 0xa280, 0xa438, 0x1000, + 0xa438, 0x115a, 0xa438, 0x1000, 0xa438, 0x115f, 0xa438, 0xd706, + 0xa438, 0x5f78, 0xa438, 0xa210, 0xa438, 0xd700, 0xa438, 0x6083, + 0xa438, 0xd101, 0xa438, 0xd047, 0xa438, 0xf003, 0xa438, 0xd160, + 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x115a, 0xa438, 0x1000, + 0xa438, 0x115f, 0xa438, 0xd700, 0xa438, 0x5f7b, 0xa438, 0x1000, + 0xa438, 0x115a, 0xa438, 0x1000, 0xa438, 0x115f, 0xa438, 0xd706, + 0xa438, 0x5f79, 0xa438, 0x8120, 0xa438, 0xbb20, 0xa438, 0x1800, + 0xa438, 0x0c8b, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f80, + 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0c3c, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8f80, 0xa438, 0x9503, 0xa438, 0xd704, + 0xa438, 0x6192, 0xa438, 0xd702, 0xa438, 0x4116, 0xa438, 0xce04, + 0xa438, 0x1000, 0xa438, 0x117a, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8f40, 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0b3d, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xaf40, 0xa438, 0x9503, + 0xa438, 0x1800, 0xa438, 0x0b48, 0xa438, 0xd704, 0xa438, 0x6192, + 0xa438, 0xd702, 0xa438, 0x4116, 0xa438, 0xce04, 0xa438, 0x1000, + 0xa438, 0x117a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f40, + 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x1269, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xaf40, 0xa438, 0x9503, 0xa438, 0x1800, + 0xa438, 0x1274, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa608, + 0xa438, 0xc700, 0xa438, 0x9503, 0xa438, 0xce54, 0xa438, 0x1000, + 0xa438, 0x117a, 0xa438, 0xa290, 0xa438, 0xa304, 0xa438, 0xab02, + 0xa438, 0xd700, 0xa438, 0x6050, 0xa438, 0xab04, 0xa438, 0x0c38, + 0xa438, 0x0608, 0xa438, 0xaa0b, 0xa438, 0xd702, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8d01, 0xa438, 0xae40, 0xa438, 0x4044, + 0xa438, 0x8e20, 0xa438, 0x9503, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8c20, 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x6078, + 0xa438, 0xd700, 0xa438, 0x609a, 0xa438, 0xd109, 0xa438, 0xd074, + 0xa438, 0xf003, 0xa438, 0xd109, 0xa438, 0xd075, 0xa438, 0x1000, + 0xa438, 0x115a, 0xa438, 0xd704, 0xa438, 0x6252, 0xa438, 0xd702, + 0xa438, 0x4116, 0xa438, 0xce54, 0xa438, 0x1000, 0xa438, 0x117a, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f40, 0xa438, 0x9503, + 0xa438, 0xa00a, 0xa438, 0xd704, 0xa438, 0x41e7, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa570, 0xa438, 0x9503, 0xa438, 0xf00a, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xaf40, 0xa438, 0x9503, + 0xa438, 0x800a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8570, + 0xa438, 0x9503, 0xa438, 0xd704, 0xa438, 0x60f3, 0xa438, 0xd71f, + 0xa438, 0x60ee, 0xa438, 0xd700, 0xa438, 0x5bbe, 0xa438, 0x1800, + 0xa438, 0x0e71, 0xa438, 0x1800, 0xa438, 0x0e7c, 0xa438, 0x1800, + 0xa438, 0x0e7e, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xaf80, + 0xa438, 0x9503, 0xa438, 0xcd62, 0xa438, 0x1800, 0xa438, 0x0bd2, + 0xa438, 0x800a, 0xa438, 0x8306, 0xa438, 0x1800, 0xa438, 0x0cb6, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8608, 0xa438, 0x8c20, + 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x0eb9, 0xa436, 0xA10E, + 0xa438, 0x0eb5, 0xa436, 0xA10C, 0xa438, 0x0cb5, 0xa436, 0xA10A, + 0xa438, 0x0bd1, 0xa436, 0xA108, 0xa438, 0x0e37, 0xa436, 0xA106, + 0xa438, 0x1267, 0xa436, 0xA104, 0xa438, 0x0b3b, 0xa436, 0xA102, + 0xa438, 0x0c38, 0xa436, 0xA100, 0xa438, 0x0c24, 0xa436, 0xA110, + 0xa438, 0x00ff, 0xa436, 0xb87c, 0xa438, 0x85bf, 0xa436, 0xb87e, + 0xa438, 0xaf85, 0xa438, 0xd7af, 0xa438, 0x85fb, 0xa438, 0xaf86, + 0xa438, 0x10af, 0xa438, 0x8638, 0xa438, 0xaf86, 0xa438, 0x47af, + 0xa438, 0x8647, 0xa438, 0xaf86, 0xa438, 0x47af, 0xa438, 0x8647, + 0xa438, 0xbf85, 0xa438, 0xf802, 0xa438, 0x627f, 0xa438, 0xbf61, + 0xa438, 0xc702, 0xa438, 0x627f, 0xa438, 0xae0c, 0xa438, 0xbf85, + 0xa438, 0xf802, 0xa438, 0x6276, 0xa438, 0xbf61, 0xa438, 0xc702, + 0xa438, 0x6276, 0xa438, 0xee85, 0xa438, 0x4200, 0xa438, 0xaf1b, + 0xa438, 0x2333, 0xa438, 0xa484, 0xa438, 0xbf86, 0xa438, 0x0a02, + 0xa438, 0x627f, 0xa438, 0xbf86, 0xa438, 0x0d02, 0xa438, 0x627f, + 0xa438, 0xaf1b, 0xa438, 0x8422, 0xa438, 0xa484, 0xa438, 0x66ac, + 0xa438, 0x0ef8, 0xa438, 0xfbef, 0xa438, 0x79fb, 0xa438, 0xe080, + 0xa438, 0x16ad, 0xa438, 0x230f, 0xa438, 0xee85, 0xa438, 0x4200, + 0xa438, 0x1f44, 0xa438, 0xbf86, 0xa438, 0x30d7, 0xa438, 0x0008, + 0xa438, 0x0264, 0xa438, 0xa3ff, 0xa438, 0xef97, 0xa438, 0xfffc, + 0xa438, 0x0485, 0xa438, 0xf861, 0xa438, 0xc786, 0xa438, 0x0a86, + 0xa438, 0x0de1, 0xa438, 0x8feb, 0xa438, 0xe583, 0xa438, 0x20e1, + 0xa438, 0x8fea, 0xa438, 0xe583, 0xa438, 0x21af, 0xa438, 0x41a7, + 0xa436, 0xb85e, 0xa438, 0x1b05, 0xa436, 0xb860, 0xa438, 0x1b78, + 0xa436, 0xb862, 0xa438, 0x1a08, 0xa436, 0xb864, 0xa438, 0x419F, + 0xa436, 0xb886, 0xa438, 0xffff, 0xa436, 0xb888, 0xa438, 0xffff, + 0xa436, 0xb88a, 0xa438, 0xffff, 0xa436, 0xb88c, 0xa438, 0xffff, + 0xa436, 0xb838, 0xa438, 0x000f, 0xb820, 0x0010, 0xa436, 0x0000, + 0xa438, 0x0000, 0xB82E, 0x0000, 0xa436, 0x8023, 0xa438, 0x0000, + 0xa436, 0x801E, 0xa438, 0x0008, 0xB820, 0x0000, 0xFFFF, 0xFFFF +}; + +static const u16 phy_mcu_ram_code_8125d_2_2[] = { + 0xa436, 0xacca, 0xa438, 0x0104, 0xa436, 0xaccc, 0xa438, 0x8000, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x0fff, + 0xa436, 0xacce, 0xa438, 0xfd47, 0xa436, 0xacd0, 0xa438, 0x0fff, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xe56f, 0xa436, 0xacd0, 0xa438, 0x01c0, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xed97, 0xa436, 0xacd0, 0xa438, 0x01c8, + 0xa436, 0xacce, 0xa438, 0xffff, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xf5bf, 0xa436, 0xacd0, 0xa438, 0x01d0, + 0xa436, 0xacce, 0xa438, 0xfb07, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb0f, 0xa436, 0xacd0, 0xa438, 0x01d8, + 0xa436, 0xacce, 0xa438, 0xa087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0xa00f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0xa807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0xa88f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0xb027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0xb02f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0xb847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0xb84f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0xfb17, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb1f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xa017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0xa01f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0xa837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0xa83f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0xb097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0xb05f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0xb857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0xb89f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0xfb27, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb2f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x8087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x800f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x8807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x888f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x9027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x902f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x9847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x984f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0xa0a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0xa8af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0xa067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0xa86f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb37, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb3f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x8017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x801f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x8837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x883f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x9097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x905f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x9857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x989f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0xb0b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0xb8bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0xb077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0xb87f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb47, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb4f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x6087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x600f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x6807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x688f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x7027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x702f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x7847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x784f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0x80a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x88af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x8067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x886f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb57, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb5f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x6017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x601f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x6837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x683f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x7097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x705f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x7857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x789f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0x90b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x98bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x9077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x987f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb67, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb6f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x4087, 0xa436, 0xacd0, 0xa438, 0x0180, + 0xa436, 0xacce, 0xa438, 0x400f, 0xa436, 0xacd0, 0xa438, 0x0108, + 0xa436, 0xacce, 0xa438, 0x4807, 0xa436, 0xacd0, 0xa438, 0x0100, + 0xa436, 0xacce, 0xa438, 0x488f, 0xa436, 0xacd0, 0xa438, 0x0188, + 0xa436, 0xacce, 0xa438, 0x5027, 0xa436, 0xacd0, 0xa438, 0x0120, + 0xa436, 0xacce, 0xa438, 0x502f, 0xa436, 0xacd0, 0xa438, 0x0128, + 0xa436, 0xacce, 0xa438, 0x5847, 0xa436, 0xacd0, 0xa438, 0x0140, + 0xa436, 0xacce, 0xa438, 0x584f, 0xa436, 0xacd0, 0xa438, 0x0148, + 0xa436, 0xacce, 0xa438, 0x60a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x68af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x6067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x686f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb77, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb7f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x4017, 0xa436, 0xacd0, 0xa438, 0x0110, + 0xa436, 0xacce, 0xa438, 0x401f, 0xa436, 0xacd0, 0xa438, 0x0118, + 0xa436, 0xacce, 0xa438, 0x4837, 0xa436, 0xacd0, 0xa438, 0x0130, + 0xa436, 0xacce, 0xa438, 0x483f, 0xa436, 0xacd0, 0xa438, 0x0138, + 0xa436, 0xacce, 0xa438, 0x5097, 0xa436, 0xacd0, 0xa438, 0x0190, + 0xa436, 0xacce, 0xa438, 0x505f, 0xa436, 0xacd0, 0xa438, 0x0158, + 0xa436, 0xacce, 0xa438, 0x5857, 0xa436, 0xacd0, 0xa438, 0x0150, + 0xa436, 0xacce, 0xa438, 0x589f, 0xa436, 0xacd0, 0xa438, 0x0198, + 0xa436, 0xacce, 0xa438, 0x70b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x78bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x7077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x787f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfb87, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb8f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x40a7, 0xa436, 0xacd0, 0xa438, 0x01a0, + 0xa436, 0xacce, 0xa438, 0x48af, 0xa436, 0xacd0, 0xa438, 0x01a8, + 0xa436, 0xacce, 0xa438, 0x4067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x486f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfb97, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfb9f, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x50b7, 0xa436, 0xacd0, 0xa438, 0x01b0, + 0xa436, 0xacce, 0xa438, 0x58bf, 0xa436, 0xacd0, 0xa438, 0x01b8, + 0xa436, 0xacce, 0xa438, 0x5077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x587f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfba7, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfbaf, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x2067, 0xa436, 0xacd0, 0xa438, 0x0161, + 0xa436, 0xacce, 0xa438, 0x286f, 0xa436, 0xacd0, 0xa438, 0x0169, + 0xa436, 0xacce, 0xa438, 0xfbb7, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0xfbbf, 0xa436, 0xacd0, 0xa438, 0x07ff, + 0xa436, 0xacce, 0xa438, 0x3077, 0xa436, 0xacd0, 0xa438, 0x0171, + 0xa436, 0xacce, 0xa438, 0x387f, 0xa436, 0xacd0, 0xa438, 0x0179, + 0xa436, 0xacce, 0xa438, 0xfff9, 0xa436, 0xacd0, 0xa438, 0x17ff, + 0xa436, 0xacce, 0xa438, 0xfff9, 0xa436, 0xacd0, 0xa438, 0x17ff, + 0xa436, 0xacca, 0xa438, 0x0004, 0xa436, 0xacc6, 0xa438, 0x0008, 0xa436, 0xacc8, 0xa438, 0xc000, 0xa436, 0xacc8, 0xa438, 0x0000, - 0xFFFF, 0xFFFF + 0xB820, 0x0000, 0xFFFF, 0xFFFF }; static void @@ -594,6 +1361,20 @@ rtl_real_set_phy_mcu_8125d_1_3(struct rtl_hw *hw) ARRAY_SIZE(phy_mcu_ram_code_8125d_1_3)); } +static void +rtl_real_set_phy_mcu_8125d_2_1(struct rtl_hw *hw) +{ + rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_8125d_2_1, + ARRAY_SIZE(phy_mcu_ram_code_8125d_2_1)); +} + +static void +rtl_real_set_phy_mcu_8125d_2_2(struct rtl_hw *hw) +{ + rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_8125d_2_2, + ARRAY_SIZE(phy_mcu_ram_code_8125d_2_2)); +} + void rtl_set_phy_mcu_8125d_1(struct rtl_hw *hw) { @@ -615,3 +1396,19 @@ rtl_set_phy_mcu_8125d_1(struct rtl_hw *hw) rtl_clear_phy_mcu_patch_request(hw); } + +void +rtl_set_phy_mcu_8125d_2(struct rtl_hw *hw) +{ + rtl_set_phy_mcu_patch_request(hw); + + rtl_real_set_phy_mcu_8125d_2_1(hw); + + rtl_clear_phy_mcu_patch_request(hw); + + rtl_set_phy_mcu_patch_request(hw); + + rtl_real_set_phy_mcu_8125d_2_2(hw); + + rtl_clear_phy_mcu_patch_request(hw); +} diff --git a/drivers/net/r8169/base/rtl8125d_mcu.h b/drivers/net/r8169/base/rtl8125d_mcu.h index ac7096ad2d..82b70e5b53 100644 --- a/drivers/net/r8169/base/rtl8125d_mcu.h +++ b/drivers/net/r8169/base/rtl8125d_mcu.h @@ -9,5 +9,6 @@ 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); #endif /* RTL8125D_MCU_H */ diff --git a/drivers/net/r8169/base/rtl8126a.c b/drivers/net/r8169/base/rtl8126a.c index 84354b6d32..cd6ac5e4e9 100644 --- a/drivers/net/r8169/base/rtl8126a.c +++ b/drivers/net/r8169/base/rtl8126a.c @@ -41,8 +41,6 @@ static void rtl_hw_phy_config_8126a_1(struct rtl_hw *hw) { rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11); - - RTL_W16(hw, EEE_TXIDLE_TIMER_8125, hw->mtu + RTE_ETHER_HDR_LEN + 0x20); } static void @@ -50,8 +48,6 @@ rtl_hw_phy_config_8126a_2(struct rtl_hw *hw) { rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11); - RTL_W16(hw, EEE_TXIDLE_TIMER_8125, hw->mtu + RTE_ETHER_HDR_LEN + 0x20); - rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x80BF); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0xED00); @@ -333,8 +329,6 @@ rtl_hw_phy_config_8126a_3(struct rtl_hw *hw) { rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11); - RTL_W16(hw, EEE_TXIDLE_TIMER_8125, hw->mtu + RTE_ETHER_HDR_LEN + 0x20); - rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8183); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x5900); rtl_set_eth_phy_ocp_bit(hw, 0xA654, BIT_11); @@ -470,7 +464,7 @@ rtl_hw_phy_config_8126a_3(struct rtl_hw *hw) rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0001); rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x03F1); - rtl_set_eth_phy_ocp_bit(hw, 0xA430, (BIT_1 | BIT_0)); + rtl_set_eth_phy_ocp_bit(hw, 0xA430, BIT_1 | BIT_0); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB54C, 0xFFC0, 0x3700); } diff --git a/drivers/net/r8169/base/rtl8126a_mcu.c b/drivers/net/r8169/base/rtl8126a_mcu.c index df27cd0331..ba8112d723 100644 --- a/drivers/net/r8169/base/rtl8126a_mcu.c +++ b/drivers/net/r8169/base/rtl8126a_mcu.c @@ -40,13 +40,83 @@ rtl_set_mac_mcu_8126a_1(struct rtl_hw *hw) void rtl_set_mac_mcu_8126a_2(struct rtl_hw *hw) { + static const u16 mcu_patch_code[] = { + 0xE010, 0xE02C, 0xE04E, 0xE0A4, 0xE0A8, 0xE0AB, 0xE0AE, 0xE0B1, 0xE0B3, + 0xE0B5, 0xE0B7, 0xE0B9, 0xE0BB, 0xE0BD, 0xE0BF, 0xE0C1, 0xC716, 0xC616, + 0x9EE0, 0xC616, 0x65C0, 0x1500, 0xF009, 0xC714, 0x66E0, 0x41B5, 0x8EE0, + 0xC611, 0x75C0, 0x4858, 0x9DC0, 0xC707, 0xC608, 0x9EE0, 0xC608, 0xC502, + 0xBD00, 0x0100, 0xE86C, 0xE000, 0xA000, 0xB404, 0xB430, 0xC070, 0xE926, + 0xC2FE, 0x400A, 0xF11A, 0x63A4, 0x1A00, 0x49B0, 0xF002, 0x4820, 0x49B1, + 0xF002, 0x4821, 0x49B2, 0xF002, 0x4822, 0x49B3, 0xF002, 0x4823, 0xC411, + 0x6380, 0x48B0, 0x8B80, 0x6320, 0x41DA, 0x8B20, 0x6380, 0x4830, 0x8B80, + 0xE003, 0x73A4, 0x9B20, 0xC302, 0xBB00, 0x4A18, 0xC070, 0xE022, 0xC054, + 0x7102, 0x4992, 0xF149, 0x4893, 0x9902, 0x1B1F, 0xC74E, 0x72E0, 0x2521, + 0x48A5, 0x0B01, 0x1C4F, 0x9C00, 0x2121, 0x1D01, 0x41AA, 0x2521, 0x9DE0, + 0x4856, 0x9DE0, 0x1CCF, 0xE839, 0x48D6, 0x9DE0, 0x7102, 0x4996, 0xF1FE, + 0x4814, 0x9902, 0x1CFF, 0x0C01, 0x1400, 0xF00C, 0x7102, 0x4996, 0xF0FB, + 0x7102, 0x4990, 0xF0FE, 0x1C1F, 0xE826, 0x7102, 0x4992, 0xF004, 0x4813, + 0x9902, 0xE01D, 0x1300, 0xF104, 0x4817, 0x9902, 0xE018, 0x4894, 0x9902, + 0x4995, 0xF00B, 0x121F, 0xF0F3, 0x131E, 0xF003, 0x4998, 0xF0EF, 0x0201, + 0x4818, 0x9902, 0xE7C9, 0x1200, 0xF0E9, 0x4998, 0xF002, 0x1B01, 0x0A01, + 0x4898, 0x9902, 0xE7C0, 0xC00A, 0xC606, 0xBE00, 0x0C01, 0x1400, 0xF1FE, + 0xFF80, 0x2362, 0xD456, 0xD404, 0xE400, 0x4166, 0x9CF6, 0xC002, 0xB800, + 0x14A6, 0x49D1, 0xC602, 0xBE00, 0x4160, 0x49D1, 0xC602, 0xBE00, 0x41E6, + 0x49D1, 0xC602, 0xBE00, 0x4282, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0x6847, 0x0A18, 0x0C02, 0x0B30 + }; + rtl_hw_disable_mac_mcu_bps(hw); + + rtl_write_mac_mcu_ram_code(hw, mcu_patch_code, + ARRAY_SIZE(mcu_patch_code)); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC2C, 0x2360); + rtl_mac_ocp_write(hw, 0xFC2E, 0x14A4); + rtl_mac_ocp_write(hw, 0xFC30, 0x415E); + rtl_mac_ocp_write(hw, 0xFC32, 0x41E4); + rtl_mac_ocp_write(hw, 0xFC34, 0x4280); + + rtl_mac_ocp_write(hw, 0xFC48, 0x007C); } void rtl_set_mac_mcu_8126a_3(struct rtl_hw *hw) { + static const u16 mcu_patch_code[] = { + 0xE010, 0xE02C, 0xE04E, 0xE052, 0xE055, 0xE058, 0xE05B, 0xE05D, 0xE05F, + 0xE061, 0xE063, 0xE065, 0xE067, 0xE069, 0xE06B, 0xE06D, 0xC716, 0xC616, + 0x9EE0, 0xC616, 0x65C0, 0x1500, 0xF009, 0xC714, 0x66E0, 0x41B5, 0x8EE0, + 0xC611, 0x75C0, 0x4858, 0x9DC0, 0xC707, 0xC608, 0x9EE0, 0xC608, 0xC502, + 0xBD00, 0x0100, 0xE86C, 0xE000, 0xA000, 0xB404, 0xB430, 0xC070, 0xE926, + 0xC2FE, 0x400A, 0xF11A, 0x63A4, 0x1A00, 0x49B0, 0xF002, 0x4820, 0x49B1, + 0xF002, 0x4821, 0x49B2, 0xF002, 0x4822, 0x49B3, 0xF002, 0x4823, 0xC411, + 0x6380, 0x48B0, 0x8B80, 0x6320, 0x41DA, 0x8B20, 0x6380, 0x4830, 0x8B80, + 0xE003, 0x73A4, 0x9B20, 0xC302, 0xBB00, 0x55E2, 0xC070, 0xE022, 0x4166, + 0x9CF6, 0xC602, 0xBE00, 0x14A6, 0x49D1, 0xC602, 0xBE00, 0x4178, 0x49D1, + 0xC602, 0xBE00, 0x41FE, 0x49D1, 0xC602, 0xBE00, 0x429A, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, + 0x0000, 0x6847, 0x0B18, 0x0C02, 0x0D10 + }; + rtl_hw_disable_mac_mcu_bps(hw); + + rtl_write_mac_mcu_ram_code(hw, mcu_patch_code, + ARRAY_SIZE(mcu_patch_code)); + + rtl_mac_ocp_write(hw, 0xFC26, 0x8000); + + rtl_mac_ocp_write(hw, 0xFC2C, 0x14A4); + rtl_mac_ocp_write(hw, 0xFC2E, 0x4176); + rtl_mac_ocp_write(hw, 0xFC30, 0x41FC); + rtl_mac_ocp_write(hw, 0xFC32, 0x4298); + + rtl_mac_ocp_write(hw, 0xFC48, 0x003C); } /* ------------------------------------PHY 8126A------------------------------------- */ @@ -2418,87 +2488,193 @@ static const u16 phy_mcu_ram_code_8126a_3_1[] = { 0xa438, 0x907f, 0xa438, 0x91a3, 0xa438, 0x9306, 0xa438, 0xb118, 0xa438, 0x1800, 0xa438, 0x2147, 0xa438, 0x907f, 0xa438, 0x9209, 0xa438, 0x91a3, 0xa438, 0x9306, 0xa438, 0xb118, 0xa438, 0x1800, - 0xa438, 0x203c, 0xa436, 0xA026, 0xa438, 0xffff, 0xa436, 0xA024, - 0xa438, 0x2033, 0xa436, 0xA022, 0xa438, 0x213f, 0xa436, 0xA020, - 0xa438, 0x144c, 0xa436, 0xA006, 0xa438, 0x1b98, 0xa436, 0xA004, - 0xa438, 0x138b, 0xa436, 0xA002, 0xa438, 0x10c4, 0xa436, 0xA000, - 0xa438, 0x1079, 0xa436, 0xA008, 0xa438, 0x7f00, 0xa436, 0xA016, - 0xa438, 0x0000, 0xa436, 0xA012, 0xa438, 0x0ff8, 0xa436, 0xA014, - 0xa438, 0xd04d, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x203c, 0xa438, 0xd707, 0xa438, 0x4121, 0xa438, 0xd706, + 0xa438, 0x40fc, 0xa438, 0xd70a, 0xa438, 0x40b5, 0xa438, 0xd028, + 0xa438, 0xd1c1, 0xa438, 0x1800, 0xa438, 0x8057, 0xa438, 0xd07b, + 0xa438, 0xd1c5, 0xa438, 0xd503, 0xa438, 0xa108, 0xa438, 0xd505, + 0xa438, 0x8103, 0xa438, 0xd504, 0xa438, 0xa002, 0xa438, 0xa302, + 0xa438, 0xd707, 0xa438, 0x4061, 0xa438, 0xd503, 0xa438, 0x8b01, + 0xa438, 0xd500, 0xa438, 0xc48a, 0xa438, 0xd503, 0xa438, 0xcc09, + 0xa438, 0xcd58, 0xa438, 0xaf01, 0xa438, 0xd500, 0xa438, 0xbe10, + 0xa438, 0x1000, 0xa438, 0x1739, 0xa438, 0xd719, 0xa438, 0x606c, + 0xa438, 0xd704, 0xa438, 0x645c, 0xa438, 0xd75e, 0xa438, 0x604d, + 0xa438, 0xfff8, 0xa438, 0x9e10, 0xa438, 0x1000, 0xa438, 0x1739, + 0xa438, 0xd719, 0xa438, 0x606c, 0xa438, 0xd704, 0xa438, 0x631c, + 0xa438, 0xd75e, 0xa438, 0x404d, 0xa438, 0xfff8, 0xa438, 0xd504, + 0xa438, 0xaa18, 0xa438, 0xa001, 0xa438, 0xa1e0, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1739, 0xa438, 0xd719, 0xa438, 0x7fac, + 0xa438, 0xd504, 0xa438, 0xa001, 0xa438, 0xd500, 0xa438, 0x1000, + 0xa438, 0x1739, 0xa438, 0xd704, 0xa438, 0x5f5c, 0xa438, 0xd719, + 0xa438, 0x3aaf, 0xa438, 0x8091, 0xa438, 0xf016, 0xa438, 0xd707, + 0xa438, 0x6121, 0xa438, 0x1000, 0xa438, 0x16d8, 0xa438, 0xd503, + 0xa438, 0xcd59, 0xa438, 0xaf01, 0xa438, 0xd500, 0xa438, 0x1800, + 0xa438, 0x0ddc, 0xa438, 0xd503, 0xa438, 0x8040, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x16d8, 0xa438, 0xd503, 0xa438, 0xcd5a, + 0xa438, 0xaf01, 0xa438, 0xd500, 0xa438, 0x1800, 0xa438, 0x0dbf, + 0xa438, 0xd504, 0xa438, 0xa008, 0xa438, 0xa204, 0xa438, 0xd500, + 0xa438, 0x1000, 0xa438, 0x1739, 0xa438, 0xd701, 0xa438, 0x5fa0, + 0xa438, 0xd503, 0xa438, 0xa082, 0xa438, 0xd500, 0xa438, 0xd71e, + 0xa438, 0x4097, 0xa438, 0xd078, 0xa438, 0xd1aa, 0xa438, 0xf003, + 0xa438, 0xd078, 0xa438, 0xd1aa, 0xa438, 0xd707, 0xa438, 0x40c1, + 0xa438, 0xd706, 0xa438, 0x409c, 0xa438, 0xd70a, 0xa438, 0x4055, + 0xa438, 0xf010, 0xa438, 0xd706, 0xa438, 0x6065, 0xa438, 0xcc89, + 0xa438, 0xf002, 0xa438, 0xcc8b, 0xa438, 0x1000, 0xa438, 0x0b7b, + 0xa438, 0xd705, 0xa438, 0x2ad0, 0xa438, 0x80ca, 0xa438, 0xf003, + 0xa438, 0x1000, 0xa438, 0x0b81, 0xa438, 0x1000, 0xa438, 0x0b87, + 0xa438, 0x1000, 0xa438, 0x0c53, 0xa438, 0x1800, 0xa438, 0x12d7, + 0xa436, 0xA026, 0xa438, 0x125d, 0xa436, 0xA024, 0xa438, 0x2033, + 0xa436, 0xA022, 0xa438, 0x213f, 0xa436, 0xA020, 0xa438, 0x144c, + 0xa436, 0xA006, 0xa438, 0x1b98, 0xa436, 0xA004, 0xa438, 0x138b, + 0xa436, 0xA002, 0xa438, 0x10c4, 0xa436, 0xA000, 0xa438, 0x1079, + 0xa436, 0xA008, 0xa438, 0xff00, 0xa436, 0xA016, 0xa438, 0x0000, + 0xa436, 0xA012, 0xa438, 0x0ff8, 0xa436, 0xA014, 0xa438, 0xd04d, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa436, 0xA152, 0xa438, 0x12dc, 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, 0x0020, - 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, - 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, - 0xa438, 0x8022, 0xa438, 0x1800, 0xa438, 0x8112, 0xa438, 0x1800, - 0xa438, 0x8206, 0xa438, 0x1800, 0xa438, 0x8433, 0xa438, 0x1800, - 0xa438, 0x84ed, 0xa438, 0x1800, 0xa438, 0x8583, 0xa438, 0xd706, - 0xa438, 0x60a9, 0xa438, 0xd700, 0xa438, 0x60a1, 0xa438, 0x1800, - 0xa438, 0x0962, 0xa438, 0x1800, 0xa438, 0x0962, 0xa438, 0x1800, - 0xa438, 0x0982, 0xa438, 0x800a, 0xa438, 0x0c1f, 0xa438, 0x0d00, - 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1800, - 0xa438, 0x0f99, 0xa438, 0xd70d, 0xa438, 0x40fd, 0xa438, 0xd702, - 0xa438, 0x40a0, 0xa438, 0xd70c, 0xa438, 0x4066, 0xa438, 0x8710, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA152, + 0xa438, 0x12dc, 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, 0x0020, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x8022, + 0xa438, 0x1800, 0xa438, 0x8233, 0xa438, 0x1800, 0xa438, 0x8332, + 0xa438, 0x1800, 0xa438, 0x855f, 0xa438, 0x1800, 0xa438, 0x8619, + 0xa438, 0x1800, 0xa438, 0x86af, 0xa438, 0xd706, 0xa438, 0x60a9, + 0xa438, 0xd700, 0xa438, 0x60a1, 0xa438, 0x1800, 0xa438, 0x0962, + 0xa438, 0x1800, 0xa438, 0x0962, 0xa438, 0x1800, 0xa438, 0x0982, + 0xa438, 0x800a, 0xa438, 0x0c1f, 0xa438, 0x0d00, 0xa438, 0x8dc0, + 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1800, 0xa438, 0x0f99, + 0xa438, 0xd702, 0xa438, 0x6201, 0xa438, 0xd702, 0xa438, 0x40a0, + 0xa438, 0xd70d, 0xa438, 0x419d, 0xa438, 0x1800, 0xa438, 0x802c, + 0xa438, 0xd701, 0xa438, 0x611a, 0xa438, 0x8710, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8280, 0xa438, 0x8780, 0xa438, 0x9503, 0xa438, 0xf002, 0xa438, 0xa710, 0xa438, 0x9580, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa304, 0xa438, 0x9503, 0xa438, 0x0c1f, 0xa438, 0x0d07, 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, - 0xa438, 0xcb81, 0xa438, 0xd70c, 0xa438, 0x4882, 0xa438, 0xd706, - 0xa438, 0x407a, 0xa438, 0xd70c, 0xa438, 0x4807, 0xa438, 0xd706, + 0xa438, 0xcb81, 0xa438, 0xd70c, 0xa438, 0x48e2, 0xa438, 0xd706, + 0xa438, 0x407a, 0xa438, 0xd70c, 0xa438, 0x4867, 0xa438, 0xd706, 0xa438, 0x405a, 0xa438, 0x8910, 0xa438, 0xa210, 0xa438, 0xd704, 0xa438, 0x611c, 0xa438, 0x0cc0, 0xa438, 0x0080, 0xa438, 0x0c03, 0xa438, 0x0101, 0xa438, 0x0ce0, 0xa438, 0x03a0, 0xa438, 0xccb5, 0xa438, 0x0cc0, 0xa438, 0x0080, 0xa438, 0x0c03, 0xa438, 0x0102, 0xa438, 0x0ce0, 0xa438, 0x0340, 0xa438, 0xcc52, 0xa438, 0xd706, - 0xa438, 0x42ba, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c1f, + 0xa438, 0x42da, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c1f, 0xa438, 0x0f1c, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x5fb3, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f1f, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x7f33, 0xa438, 0x8190, 0xa438, 0x8204, - 0xa438, 0xf016, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c1f, - 0xa438, 0x0f1b, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd70c, 0xa438, 0x5fb3, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0x8f1f, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd70c, 0xa438, 0x7f33, 0xa438, 0xd70c, 0xa438, 0x6047, - 0xa438, 0xf002, 0xa438, 0xf00c, 0xa438, 0xd403, 0xa438, 0xcb82, - 0xa438, 0x1000, 0xa438, 0x1203, 0xa438, 0xd40a, 0xa438, 0x1000, - 0xa438, 0x1203, 0xa438, 0xd70c, 0xa438, 0x4247, 0xa438, 0x1000, - 0xa438, 0x131d, 0xa438, 0x8a40, 0xa438, 0x1000, 0xa438, 0x120e, - 0xa438, 0xa104, 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8104, - 0xa438, 0x1000, 0xa438, 0x1217, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa704, 0xa438, 0x9503, 0xa438, 0xcb88, 0xa438, 0xf012, + 0xa438, 0x1800, 0xa438, 0x8087, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c1f, 0xa438, 0x0f1b, 0xa438, 0x9503, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x5fb3, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8f1f, 0xa438, 0x9503, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x7f33, 0xa438, 0xd70c, + 0xa438, 0x6067, 0xa438, 0x1800, 0xa438, 0x8087, 0xa438, 0x1800, + 0xa438, 0x8092, 0xa438, 0xd403, 0xa438, 0x1000, 0xa438, 0x1203, + 0xa438, 0xcb82, 0xa438, 0xd40a, 0xa438, 0x1000, 0xa438, 0x1203, + 0xa438, 0xd70c, 0xa438, 0x4267, 0xa438, 0x1000, 0xa438, 0x131d, + 0xa438, 0x8a40, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa104, + 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8104, 0xa438, 0x1000, + 0xa438, 0x1217, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa704, + 0xa438, 0x9503, 0xa438, 0xcb88, 0xa438, 0x1800, 0xa438, 0x81b7, + 0xa438, 0xd702, 0xa438, 0x6161, 0xa438, 0xd702, 0xa438, 0x40a0, + 0xa438, 0xd70d, 0xa438, 0x40fd, 0xa438, 0x1800, 0xa438, 0x80b0, + 0xa438, 0xd701, 0xa438, 0x607a, 0xa438, 0x1800, 0xa438, 0x80b0, + 0xa438, 0x1800, 0xa438, 0x81a6, 0xa438, 0xa210, 0xa438, 0x8a10, + 0xa438, 0xd706, 0xa438, 0x643e, 0xa438, 0x0c1f, 0xa438, 0x0d04, + 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x0cc0, + 0xa438, 0x0040, 0xa438, 0x0c03, 0xa438, 0x0102, 0xa438, 0x0ce0, + 0xa438, 0x03e0, 0xa438, 0xccce, 0xa438, 0xa00a, 0xa438, 0xa280, + 0xa438, 0xd110, 0xa438, 0xd04c, 0xa438, 0xcba0, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x8710, + 0xa438, 0xaa0f, 0xa438, 0xa130, 0xa438, 0xaa2f, 0xa438, 0xa2d5, + 0xa438, 0xa405, 0xa438, 0xa720, 0xa438, 0xa00a, 0xa438, 0xcba1, + 0xa438, 0x1800, 0xa438, 0x80fa, 0xa438, 0xd704, 0xa438, 0x3cf1, + 0xa438, 0x80db, 0xa438, 0x0c1f, 0xa438, 0x0d02, 0xa438, 0x1800, + 0xa438, 0x80dd, 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0x0cc0, + 0xa438, 0x0d40, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x8710, + 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa108, 0xa438, 0x1000, + 0xa438, 0x1220, 0xa438, 0x8108, 0xa438, 0xa203, 0xa438, 0x8a2f, + 0xa438, 0xa130, 0xa438, 0x8204, 0xa438, 0xa140, 0xa438, 0x1000, + 0xa438, 0x1220, 0xa438, 0x8140, 0xa438, 0x1000, 0xa438, 0x1217, + 0xa438, 0xcba2, 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xa204, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fa7, + 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, + 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd71f, 0xa438, 0x6145, 0xa438, 0x6074, 0xa438, 0x1800, + 0xa438, 0x8104, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, + 0xa438, 0x5fa7, 0xa438, 0x1800, 0xa438, 0x80fe, 0xa438, 0xb820, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x7fa5, + 0xa438, 0x9820, 0xa438, 0x9b01, 0xa438, 0xd402, 0xa438, 0x1000, + 0xa438, 0x1203, 0xa438, 0xd701, 0xa438, 0x33b1, 0xa438, 0x8124, + 0xa438, 0xd701, 0xa438, 0x60b5, 0xa438, 0xd706, 0xa438, 0x6069, + 0xa438, 0x1800, 0xa438, 0x8126, 0xa438, 0x1800, 0xa438, 0x8196, + 0xa438, 0xd70c, 0xa438, 0x40ab, 0xa438, 0x800a, 0xa438, 0x8110, + 0xa438, 0x8284, 0xa438, 0x8404, 0xa438, 0xa710, 0xa438, 0x8120, + 0xa438, 0x8241, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa104, + 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8104, 0xa438, 0x1000, + 0xa438, 0x1217, 0xa438, 0xaa2f, 0xa438, 0xcba3, 0xa438, 0xd70c, + 0xa438, 0x438b, 0xa438, 0xa284, 0xa438, 0xd078, 0xa438, 0x800a, + 0xa438, 0x8110, 0xa438, 0xa284, 0xa438, 0x8404, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa108, 0xa438, 0x9503, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x0c1f, 0xa438, 0x0f19, 0xa438, 0x9503, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x5fb3, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f1f, 0xa438, 0x9503, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, 0xa438, 0x7f33, + 0xa438, 0x0c1f, 0xa438, 0x0d07, 0xa438, 0x8dc0, 0xa438, 0x1000, + 0xa438, 0x12b5, 0xa438, 0x8110, 0xa438, 0xa284, 0xa438, 0xa404, + 0xa438, 0xa00a, 0xa438, 0xcba4, 0xa438, 0xd70c, 0xa438, 0x40a1, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xad10, 0xa438, 0x9503, + 0xa438, 0xd70c, 0xa438, 0x414b, 0xa438, 0x0cc0, 0xa438, 0x0080, + 0xa438, 0x0c03, 0xa438, 0x0102, 0xa438, 0x0ce0, 0xa438, 0x0340, + 0xa438, 0xcc52, 0xa438, 0x1800, 0xa438, 0x8175, 0xa438, 0x80c0, + 0xa438, 0x8103, 0xa438, 0x83e0, 0xa438, 0x8cff, 0xa438, 0x60ba, + 0xa438, 0xd110, 0xa438, 0xd041, 0xa438, 0x1800, 0xa438, 0x817c, + 0xa438, 0xd193, 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xa110, 0xa438, 0xcba5, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5faa, + 0xa438, 0xa180, 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa402, + 0xa438, 0xcba6, 0xa438, 0x60ba, 0xa438, 0xd1f5, 0xa438, 0xd045, + 0xa438, 0x1800, 0xa438, 0x8192, 0xa438, 0xd1f5, 0xa438, 0xd049, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, + 0xa438, 0x8710, 0xa438, 0xa00a, 0xa438, 0xa190, 0xa438, 0xa204, + 0xa438, 0xa280, 0xa438, 0xa404, 0xa438, 0xcba7, 0xa438, 0xbb80, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x5fb4, + 0xa438, 0xb920, 0xa438, 0x9b80, 0xa438, 0x1800, 0xa438, 0x81e5, 0xa438, 0xa210, 0xa438, 0xa00a, 0xa438, 0xaa40, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa104, 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8104, 0xa438, 0x1000, 0xa438, 0x1217, 0xa438, 0xa190, 0xa438, 0xa284, 0xa438, 0xa404, 0xa438, 0x8a10, 0xa438, 0x8a80, 0xa438, 0xcb84, 0xa438, 0xd13e, 0xa438, 0xd05a, 0xa438, 0xd13e, 0xa438, 0xd06b, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x3559, 0xa438, 0x80b0, 0xa438, 0xfffb, 0xa438, 0xd700, - 0xa438, 0x604b, 0xa438, 0xcb8a, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd700, 0xa438, 0x3659, 0xa438, 0x80b9, 0xa438, 0xfffb, - 0xa438, 0xd700, 0xa438, 0x606b, 0xa438, 0xcb8b, 0xa438, 0x5eeb, - 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa402, 0xa438, 0xcb8c, - 0xa438, 0xd706, 0xa438, 0x609a, 0xa438, 0xd1b7, 0xa438, 0xd049, - 0xa438, 0xf003, 0xa438, 0xd160, 0xa438, 0xd04b, 0xa438, 0x1000, - 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb8d, - 0xa438, 0x8710, 0xa438, 0xd71f, 0xa438, 0x5fd4, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x7fb4, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, - 0xa438, 0x6105, 0xa438, 0x6054, 0xa438, 0xfffb, 0xa438, 0x1000, - 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fab, 0xa438, 0xfff0, - 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, 0xa438, 0xd114, - 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0xd704, 0xa438, 0x5f76, 0xa438, 0xd700, - 0xa438, 0x5f34, 0xa438, 0xd700, 0xa438, 0x6081, 0xa438, 0xd706, - 0xa438, 0x405a, 0xa438, 0xa480, 0xa438, 0xcb86, 0xa438, 0xd706, - 0xa438, 0x609a, 0xa438, 0xd1c8, 0xa438, 0xd045, 0xa438, 0xf003, + 0xa438, 0x3559, 0xa438, 0x81c2, 0xa438, 0x1800, 0xa438, 0x81bb, + 0xa438, 0xd700, 0xa438, 0x604b, 0xa438, 0xcb8a, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x3659, 0xa438, 0x81cc, + 0xa438, 0x1800, 0xa438, 0x81c5, 0xa438, 0xd700, 0xa438, 0x606b, + 0xa438, 0xcb8b, 0xa438, 0x5ecb, 0xa438, 0xd700, 0xa438, 0x6041, + 0xa438, 0xa402, 0xa438, 0xcb8c, 0xa438, 0xd706, 0xa438, 0x60ba, + 0xa438, 0xd179, 0xa438, 0xd049, 0xa438, 0x1800, 0xa438, 0x81dc, + 0xa438, 0xd160, 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb8d, 0xa438, 0x8710, + 0xa438, 0xd71f, 0xa438, 0x5fd4, 0xa438, 0xb920, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x6145, + 0xa438, 0x6074, 0xa438, 0x1800, 0xa438, 0x81ea, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fab, 0xa438, 0x1800, + 0xa438, 0x81e4, 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x7fa5, 0xa438, 0x9820, + 0xa438, 0xd114, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd704, 0xa438, 0x5f76, + 0xa438, 0xd700, 0xa438, 0x5f34, 0xa438, 0xd700, 0xa438, 0x6081, + 0xa438, 0xd706, 0xa438, 0x405a, 0xa438, 0xa480, 0xa438, 0xcb86, + 0xa438, 0xd706, 0xa438, 0x60fa, 0xa438, 0xd700, 0xa438, 0x60e1, + 0xa438, 0xd1c8, 0xa438, 0xd045, 0xa438, 0x1800, 0xa438, 0x8218, 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x0cc0, 0xa438, 0x0000, 0xa438, 0x0c03, 0xa438, 0x0101, 0xa438, 0x0ce0, 0xa438, 0x0320, - 0xa438, 0xcc29, 0xa438, 0xa208, 0xa438, 0x8204, 0xa438, 0xd114, + 0xa438, 0xcc29, 0xa438, 0xa208, 0xa438, 0x8204, 0xa438, 0xd704, + 0xa438, 0x40f5, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa280, + 0xa438, 0x8780, 0xa438, 0x9503, 0xa438, 0x8e04, 0xa438, 0xd114, 0xa438, 0xd040, 0xa438, 0xd700, 0xa438, 0x5ff4, 0xa438, 0x1800, 0xa438, 0x0c3e, 0xa438, 0xd706, 0xa438, 0x609d, 0xa438, 0xd417, 0xa438, 0x1000, 0xa438, 0x1203, 0xa438, 0x1000, 0xa438, 0x126b, @@ -2512,319 +2688,323 @@ static const u16 phy_mcu_ram_code_8126a_3_1[] = { 0xa438, 0xa404, 0xa438, 0x800a, 0xa438, 0x8718, 0xa438, 0x9b10, 0xa438, 0x9b20, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x7fb5, 0xa438, 0xcb51, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd71f, 0xa438, 0x5f94, 0xa438, 0xd706, 0xa438, 0x6089, - 0xa438, 0xd141, 0xa438, 0xd043, 0xa438, 0xf003, 0xa438, 0xd141, - 0xa438, 0xd044, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x60e5, 0xa438, 0xd704, - 0xa438, 0x60be, 0xa438, 0xd706, 0xa438, 0x29b1, 0xa438, 0x8156, - 0xa438, 0xf002, 0xa438, 0xa880, 0xa438, 0xa00a, 0xa438, 0xa190, - 0xa438, 0x8220, 0xa438, 0xa280, 0xa438, 0xa404, 0xa438, 0xa620, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc5aa, 0xa438, 0x9503, - 0xa438, 0xd700, 0xa438, 0x6061, 0xa438, 0xa402, 0xa438, 0xa480, - 0xa438, 0xcb52, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x5fba, 0xa438, 0xd704, 0xa438, 0x5f76, 0xa438, 0xb920, - 0xa438, 0xcb53, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, - 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0xa00a, 0xa438, 0xa190, - 0xa438, 0xa280, 0xa438, 0x8220, 0xa438, 0xa404, 0xa438, 0xb580, - 0xa438, 0xd700, 0xa438, 0x40a1, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa602, 0xa438, 0x9503, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa310, 0xa438, 0x9503, 0xa438, 0xcb60, 0xa438, 0xd1c8, - 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0xaa10, 0xa438, 0xd70c, 0xa438, 0x2833, - 0xa438, 0x818f, 0xa438, 0xf003, 0xa438, 0x1000, 0xa438, 0x1330, - 0xa438, 0xd70c, 0xa438, 0x40a6, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa140, 0xa438, 0x9503, 0xa438, 0xd70c, 0xa438, 0x40a3, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xac20, 0xa438, 0x9503, - 0xa438, 0xa90c, 0xa438, 0xaa80, 0xa438, 0x0c1f, 0xa438, 0x0d07, - 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0xa00a, + 0xa438, 0xd71f, 0xa438, 0x5f94, 0xa438, 0xd706, 0xa438, 0x61a9, + 0xa438, 0xd702, 0xa438, 0x40a1, 0xa438, 0xd706, 0xa438, 0x4079, + 0xa438, 0xd706, 0xa438, 0x609d, 0xa438, 0xd141, 0xa438, 0xd043, + 0xa438, 0xf006, 0xa438, 0xd101, 0xa438, 0xd040, 0xa438, 0xf003, + 0xa438, 0xd141, 0xa438, 0xd044, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x60e5, + 0xa438, 0xd704, 0xa438, 0x60be, 0xa438, 0xd706, 0xa438, 0x29b1, + 0xa438, 0x8280, 0xa438, 0xf002, 0xa438, 0xa880, 0xa438, 0xa00a, + 0xa438, 0xa190, 0xa438, 0x8220, 0xa438, 0xa280, 0xa438, 0xa404, + 0xa438, 0xa620, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc5aa, + 0xa438, 0x9503, 0xa438, 0xd700, 0xa438, 0x6061, 0xa438, 0xa402, + 0xa438, 0xa480, 0xa438, 0xcb52, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fba, 0xa438, 0xd704, 0xa438, 0x5f76, + 0xa438, 0xb920, 0xa438, 0xcb53, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd71f, 0xa438, 0x7fb4, 0xa438, 0x9920, 0xa438, 0xa00a, 0xa438, 0xa190, 0xa438, 0xa280, 0xa438, 0x8220, 0xa438, 0xa404, - 0xa438, 0xb580, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc500, - 0xa438, 0x9503, 0xa438, 0x83e0, 0xa438, 0x8e01, 0xa438, 0xd700, - 0xa438, 0x40a1, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa602, - 0xa438, 0x9503, 0xa438, 0xd14a, 0xa438, 0xd058, 0xa438, 0x1000, - 0xa438, 0x12d7, 0xa438, 0xd70c, 0xa438, 0x4063, 0xa438, 0x1000, - 0xa438, 0x12ea, 0xa438, 0xcb6f, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd704, 0xa438, 0x2e70, 0xa438, 0x81fd, 0xa438, 0xd71f, - 0xa438, 0x676e, 0xa438, 0xd704, 0xa438, 0x3868, 0xa438, 0x81d8, - 0xa438, 0xd706, 0xa438, 0x61c2, 0xa438, 0xd70c, 0xa438, 0x2f18, - 0xa438, 0x81de, 0xa438, 0xd700, 0xa438, 0x5d35, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0xc5aa, 0xa438, 0x9503, 0xa438, 0x0ce0, - 0xa438, 0x0320, 0xa438, 0x1800, 0xa438, 0x81e4, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0xc5aa, 0xa438, 0x9503, 0xa438, 0x1800, - 0xa438, 0x8202, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc5aa, - 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x8204, 0xa438, 0x1000, - 0xa438, 0x12d7, 0xa438, 0xae02, 0xa438, 0xd70c, 0xa438, 0x4063, - 0xa438, 0x1000, 0xa438, 0x12ea, 0xa438, 0xcb61, 0xa438, 0x1000, - 0xa438, 0x126b, 0xa438, 0xd704, 0xa438, 0x2e70, 0xa438, 0x81fd, - 0xa438, 0xd704, 0xa438, 0x3868, 0xa438, 0x8202, 0xa438, 0xd706, - 0xa438, 0x61a2, 0xa438, 0xd71f, 0xa438, 0x612e, 0xa438, 0xd70c, - 0xa438, 0x2f18, 0xa438, 0x8204, 0xa438, 0x1800, 0xa438, 0x81e4, - 0xa438, 0x8e02, 0xa438, 0x1800, 0xa438, 0x0f99, 0xa438, 0x1800, - 0xa438, 0x0e31, 0xa438, 0x1800, 0xa438, 0x8480, 0xa438, 0x1800, - 0xa438, 0x0e07, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70c, - 0xa438, 0x5fa4, 0xa438, 0xa706, 0xa438, 0xd70c, 0xa438, 0x404b, - 0xa438, 0xa880, 0xa438, 0x8801, 0xa438, 0x8e01, 0xa438, 0xca50, - 0xa438, 0x1000, 0xa438, 0x82a9, 0xa438, 0xca51, 0xa438, 0xd70e, - 0xa438, 0x2210, 0xa438, 0x82a7, 0xa438, 0xd70c, 0xa438, 0x4084, - 0xa438, 0xd705, 0xa438, 0x5efd, 0xa438, 0xf007, 0xa438, 0x1000, - 0xa438, 0x17c2, 0xa438, 0xd70c, 0xa438, 0x5ce2, 0xa438, 0x1800, - 0xa438, 0x1692, 0xa438, 0xd70c, 0xa438, 0x605a, 0xa438, 0x9a10, - 0xa438, 0x8e40, 0xa438, 0x8404, 0xa438, 0x1000, 0xa438, 0x1827, - 0xa438, 0x8e80, 0xa438, 0xca62, 0xa438, 0xd705, 0xa438, 0x3084, - 0xa438, 0x8289, 0xa438, 0xba10, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x1000, 0xa438, 0x8382, 0xa438, 0x0c03, 0xa438, 0x0100, - 0xa438, 0xd702, 0xa438, 0x4638, 0xa438, 0xd1c4, 0xa438, 0xd044, - 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0x8108, 0xa438, 0x0c1f, - 0xa438, 0x0907, 0xa438, 0x8940, 0xa438, 0x1000, 0xa438, 0x17db, - 0xa438, 0xa0c4, 0xa438, 0x8610, 0xa438, 0x8030, 0xa438, 0x8706, - 0xa438, 0x0c07, 0xa438, 0x0b06, 0xa438, 0x8410, 0xa438, 0xa980, - 0xa438, 0xa702, 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0x1000, + 0xa438, 0xb580, 0xa438, 0xd700, 0xa438, 0x40a1, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa602, 0xa438, 0x9503, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa310, 0xa438, 0x9503, 0xa438, 0xcb60, + 0xa438, 0xd101, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x126b, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xaa10, 0xa438, 0xd70c, + 0xa438, 0x2833, 0xa438, 0x82b9, 0xa438, 0xf003, 0xa438, 0x1000, + 0xa438, 0x1330, 0xa438, 0xd70c, 0xa438, 0x40a6, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa140, 0xa438, 0x9503, 0xa438, 0xd70c, + 0xa438, 0x40a3, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xac20, + 0xa438, 0x9503, 0xa438, 0xa90c, 0xa438, 0xaa80, 0xa438, 0x0c1f, + 0xa438, 0x0d07, 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, + 0xa438, 0xa00a, 0xa438, 0xa190, 0xa438, 0xa280, 0xa438, 0x8220, + 0xa438, 0xa404, 0xa438, 0xb580, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xc500, 0xa438, 0x9503, 0xa438, 0x83e0, 0xa438, 0x8e01, + 0xa438, 0xd700, 0xa438, 0x40a1, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa602, 0xa438, 0x9503, 0xa438, 0xd14a, 0xa438, 0xd058, + 0xa438, 0x1000, 0xa438, 0x12d7, 0xa438, 0xd70c, 0xa438, 0x4063, + 0xa438, 0x1000, 0xa438, 0x12ea, 0xa438, 0xcb6f, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd704, 0xa438, 0x2e70, 0xa438, 0x8327, + 0xa438, 0xd71f, 0xa438, 0x676e, 0xa438, 0xd704, 0xa438, 0x3868, + 0xa438, 0x8302, 0xa438, 0xd706, 0xa438, 0x61c2, 0xa438, 0xd70c, + 0xa438, 0x2f18, 0xa438, 0x8308, 0xa438, 0xd700, 0xa438, 0x5d35, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc5aa, 0xa438, 0x9503, + 0xa438, 0x0ce0, 0xa438, 0x0320, 0xa438, 0x1800, 0xa438, 0x830e, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xc5aa, 0xa438, 0x9503, + 0xa438, 0x1800, 0xa438, 0x832e, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xc5aa, 0xa438, 0x9503, 0xa438, 0x1800, 0xa438, 0x8330, + 0xa438, 0x1000, 0xa438, 0x12d7, 0xa438, 0xae02, 0xa438, 0xd70c, + 0xa438, 0x4063, 0xa438, 0x1000, 0xa438, 0x12ea, 0xa438, 0xcb61, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd704, 0xa438, 0x2e70, + 0xa438, 0x8327, 0xa438, 0xd704, 0xa438, 0x3868, 0xa438, 0x832e, + 0xa438, 0xd706, 0xa438, 0x61e2, 0xa438, 0xd71f, 0xa438, 0x612e, + 0xa438, 0xd70c, 0xa438, 0x2f18, 0xa438, 0x8330, 0xa438, 0x1800, + 0xa438, 0x830e, 0xa438, 0x8e02, 0xa438, 0x1800, 0xa438, 0x0f99, + 0xa438, 0xae04, 0xa438, 0x8310, 0xa438, 0x1800, 0xa438, 0x0e31, + 0xa438, 0x1800, 0xa438, 0x85ac, 0xa438, 0x1800, 0xa438, 0x0e07, + 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70c, 0xa438, 0x5fa4, + 0xa438, 0xa706, 0xa438, 0xd70c, 0xa438, 0x404b, 0xa438, 0xa880, + 0xa438, 0x8801, 0xa438, 0x8e01, 0xa438, 0xca50, 0xa438, 0x1000, + 0xa438, 0x83d5, 0xa438, 0xca51, 0xa438, 0xd70e, 0xa438, 0x2210, + 0xa438, 0x83d3, 0xa438, 0xd70c, 0xa438, 0x4084, 0xa438, 0xd705, + 0xa438, 0x5efd, 0xa438, 0xf007, 0xa438, 0x1000, 0xa438, 0x17c2, + 0xa438, 0xd70c, 0xa438, 0x5ce2, 0xa438, 0x1800, 0xa438, 0x1692, + 0xa438, 0xd70c, 0xa438, 0x605a, 0xa438, 0x9a10, 0xa438, 0x8e40, + 0xa438, 0x8404, 0xa438, 0x1000, 0xa438, 0x1827, 0xa438, 0x8e80, + 0xa438, 0xca62, 0xa438, 0xd705, 0xa438, 0x3084, 0xa438, 0x83b5, + 0xa438, 0xba10, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x1000, + 0xa438, 0x84ae, 0xa438, 0x0c03, 0xa438, 0x0100, 0xa438, 0xd702, + 0xa438, 0x4638, 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, - 0xa438, 0x5f7c, 0xa438, 0x0c07, 0xa438, 0x0b06, 0xa438, 0xa030, - 0xa438, 0xa610, 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa501, - 0xa438, 0xa108, 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0xca63, - 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0xd702, 0xa438, 0x6078, - 0xa438, 0x9920, 0xa438, 0xf003, 0xa438, 0xb920, 0xa438, 0xa880, - 0xa438, 0x9a10, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, - 0xa438, 0x17e8, 0xa438, 0xd71f, 0xa438, 0x5f73, 0xa438, 0xf011, - 0xa438, 0xd70c, 0xa438, 0x409b, 0xa438, 0x9920, 0xa438, 0x9a10, - 0xa438, 0xfff5, 0xa438, 0x80fe, 0xa438, 0x8610, 0xa438, 0x8501, - 0xa438, 0x8980, 0xa438, 0x8702, 0xa438, 0xa410, 0xa438, 0xa940, - 0xa438, 0x81c0, 0xa438, 0xae80, 0xa438, 0x1800, 0xa438, 0x822e, - 0xa438, 0x8804, 0xa438, 0xa704, 0xa438, 0x8788, 0xa438, 0xff82, - 0xa438, 0xbb08, 0xa438, 0x0c1f, 0xa438, 0x0907, 0xa438, 0x8940, - 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0x8701, 0xa438, 0x8502, - 0xa438, 0xa0f4, 0xa438, 0xa610, 0xa438, 0xd700, 0xa438, 0x6061, - 0xa438, 0xa002, 0xa438, 0xa501, 0xa438, 0x8706, 0xa438, 0x8410, - 0xa438, 0xa980, 0xa438, 0xca64, 0xa438, 0xd110, 0xa438, 0xd040, - 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0x8804, 0xa438, 0xa706, - 0xa438, 0x1800, 0xa438, 0x820a, 0xa438, 0x1800, 0xa438, 0x147c, - 0xa438, 0xd705, 0xa438, 0x405f, 0xa438, 0xf037, 0xa438, 0xd701, - 0xa438, 0x4259, 0xa438, 0xd705, 0xa438, 0x6234, 0xa438, 0xd70c, - 0xa438, 0x41c6, 0xa438, 0xd70d, 0xa438, 0x419d, 0xa438, 0xd70d, - 0xa438, 0x417e, 0xa438, 0xd704, 0xa438, 0x6127, 0xa438, 0x2951, - 0xa438, 0x82c0, 0xa438, 0xd70c, 0xa438, 0x4083, 0xa438, 0xd70c, - 0xa438, 0x2e81, 0xa438, 0x82c0, 0xa438, 0xf0c2, 0xa438, 0x80fe, - 0xa438, 0x8610, 0xa438, 0x8501, 0xa438, 0x8704, 0xa438, 0x0c30, - 0xa438, 0x0410, 0xa438, 0xac02, 0xa438, 0xa502, 0xa438, 0x8980, - 0xa438, 0xca60, 0xa438, 0xa004, 0xa438, 0xd70c, 0xa438, 0x6065, - 0xa438, 0x1800, 0xa438, 0x82d0, 0xa438, 0x8004, 0xa438, 0xa804, - 0xa438, 0x0c0f, 0xa438, 0x0602, 0xa438, 0x0c70, 0xa438, 0x0730, - 0xa438, 0xa708, 0xa438, 0xd704, 0xa438, 0x609c, 0xa438, 0x0c1f, - 0xa438, 0x0912, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x090e, - 0xa438, 0xa940, 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0xa780, - 0xa438, 0xf0a0, 0xa438, 0xd704, 0xa438, 0x63ab, 0xa438, 0xd705, - 0xa438, 0x4371, 0xa438, 0xd702, 0xa438, 0x339c, 0xa438, 0x8381, - 0xa438, 0x8788, 0xa438, 0x8704, 0xa438, 0x0c1f, 0xa438, 0x0907, - 0xa438, 0x8940, 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0x8410, - 0xa438, 0xa0f4, 0xa438, 0xa610, 0xa438, 0xd700, 0xa438, 0x6061, - 0xa438, 0xa002, 0xa438, 0xa501, 0xa438, 0xa706, 0xa438, 0x8804, - 0xa438, 0xa980, 0xa438, 0xd70c, 0xa438, 0x6085, 0xa438, 0x8701, - 0xa438, 0x8502, 0xa438, 0x8c02, 0xa438, 0xf082, 0xa438, 0xd70c, - 0xa438, 0x60c5, 0xa438, 0xd702, 0xa438, 0x6053, 0xa438, 0xf07d, - 0xa438, 0x1800, 0xa438, 0x837e, 0xa438, 0xd70d, 0xa438, 0x4d1b, - 0xa438, 0xba10, 0xa438, 0xae40, 0xa438, 0x0cfc, 0xa438, 0x03b4, - 0xa438, 0x0cfc, 0xa438, 0x05b4, 0xa438, 0xd1c4, 0xa438, 0xd044, - 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0x8706, 0xa438, 0x8280, - 0xa438, 0xace0, 0xa438, 0xa680, 0xa438, 0xa240, 0xa438, 0x1000, - 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd702, - 0xa438, 0x5f79, 0xa438, 0x8240, 0xa438, 0xd702, 0xa438, 0x6898, - 0xa438, 0xd702, 0xa438, 0x4957, 0xa438, 0x1800, 0xa438, 0x8370, - 0xa438, 0xa1c0, 0xa438, 0x0c3f, 0xa438, 0x0220, 0xa438, 0x0cfc, - 0xa438, 0x030c, 0xa438, 0x0cfc, 0xa438, 0x050c, 0xa438, 0x8108, - 0xa438, 0x8640, 0xa438, 0xa120, 0xa438, 0xa640, 0xa438, 0x0c03, - 0xa438, 0x0101, 0xa438, 0xa110, 0xa438, 0xd1c4, 0xa438, 0xd044, - 0xa438, 0xca84, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, - 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0xd702, - 0xa438, 0x60fc, 0xa438, 0x8210, 0xa438, 0x0ce0, 0xa438, 0x0320, - 0xa438, 0x0ce0, 0xa438, 0x0520, 0xa438, 0xf002, 0xa438, 0xa210, - 0xa438, 0xd1c4, 0xa438, 0xd043, 0xa438, 0x1000, 0xa438, 0x17be, + 0xa438, 0x5f7c, 0xa438, 0x8108, 0xa438, 0x0c1f, 0xa438, 0x0907, + 0xa438, 0x8940, 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0xa0c4, + 0xa438, 0x8610, 0xa438, 0x8030, 0xa438, 0x8706, 0xa438, 0x0c07, + 0xa438, 0x0b06, 0xa438, 0x8410, 0xa438, 0xa980, 0xa438, 0xa702, + 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f7c, - 0xa438, 0x8233, 0xa438, 0x0cfc, 0xa438, 0x036c, 0xa438, 0x0cfc, - 0xa438, 0x056c, 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0xca85, + 0xa438, 0x0c07, 0xa438, 0x0b06, 0xa438, 0xa030, 0xa438, 0xa610, + 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa501, 0xa438, 0xa108, + 0xa438, 0xd1c4, 0xa438, 0xd045, 0xa438, 0xca63, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, + 0xa438, 0x5f7c, 0xa438, 0xd702, 0xa438, 0x6078, 0xa438, 0x9920, + 0xa438, 0xf003, 0xa438, 0xb920, 0xa438, 0xa880, 0xa438, 0x9a10, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0xa680, 0xa438, 0xa240, + 0xa438, 0xd71f, 0xa438, 0x5f73, 0xa438, 0xf011, 0xa438, 0xd70c, + 0xa438, 0x409b, 0xa438, 0x9920, 0xa438, 0x9a10, 0xa438, 0xfff5, + 0xa438, 0x80fe, 0xa438, 0x8610, 0xa438, 0x8501, 0xa438, 0x8980, + 0xa438, 0x8702, 0xa438, 0xa410, 0xa438, 0xa940, 0xa438, 0x81c0, + 0xa438, 0xae80, 0xa438, 0x1800, 0xa438, 0x835a, 0xa438, 0x8804, + 0xa438, 0xa704, 0xa438, 0x8788, 0xa438, 0xff82, 0xa438, 0xbb08, + 0xa438, 0x0c1f, 0xa438, 0x0907, 0xa438, 0x8940, 0xa438, 0x1000, + 0xa438, 0x17db, 0xa438, 0x8701, 0xa438, 0x8502, 0xa438, 0xa0f4, + 0xa438, 0xa610, 0xa438, 0xd700, 0xa438, 0x6061, 0xa438, 0xa002, + 0xa438, 0xa501, 0xa438, 0x8706, 0xa438, 0x8410, 0xa438, 0xa980, + 0xa438, 0xca64, 0xa438, 0xd110, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, + 0xa438, 0x5f7c, 0xa438, 0x8804, 0xa438, 0xa706, 0xa438, 0x1800, + 0xa438, 0x8336, 0xa438, 0x1800, 0xa438, 0x147c, 0xa438, 0xd705, + 0xa438, 0x405f, 0xa438, 0xf037, 0xa438, 0xd701, 0xa438, 0x4259, + 0xa438, 0xd705, 0xa438, 0x6234, 0xa438, 0xd70c, 0xa438, 0x41c6, + 0xa438, 0xd70d, 0xa438, 0x419d, 0xa438, 0xd70d, 0xa438, 0x417e, + 0xa438, 0xd704, 0xa438, 0x6127, 0xa438, 0x2951, 0xa438, 0x83ec, + 0xa438, 0xd70c, 0xa438, 0x4083, 0xa438, 0xd70c, 0xa438, 0x2e81, + 0xa438, 0x83ec, 0xa438, 0xf0c2, 0xa438, 0x80fe, 0xa438, 0x8610, + 0xa438, 0x8501, 0xa438, 0x8704, 0xa438, 0x0c30, 0xa438, 0x0410, + 0xa438, 0xac02, 0xa438, 0xa502, 0xa438, 0x8980, 0xa438, 0xca60, + 0xa438, 0xa004, 0xa438, 0xd70c, 0xa438, 0x6065, 0xa438, 0x1800, + 0xa438, 0x83fc, 0xa438, 0x8004, 0xa438, 0xa804, 0xa438, 0x0c0f, + 0xa438, 0x0602, 0xa438, 0x0c70, 0xa438, 0x0730, 0xa438, 0xa708, + 0xa438, 0xd704, 0xa438, 0x609c, 0xa438, 0x0c1f, 0xa438, 0x0912, + 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x090e, 0xa438, 0xa940, + 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0xa780, 0xa438, 0xf0a0, + 0xa438, 0xd704, 0xa438, 0x63ab, 0xa438, 0xd705, 0xa438, 0x4371, + 0xa438, 0xd702, 0xa438, 0x339c, 0xa438, 0x84ad, 0xa438, 0x8788, + 0xa438, 0x8704, 0xa438, 0x0c1f, 0xa438, 0x0907, 0xa438, 0x8940, + 0xa438, 0x1000, 0xa438, 0x17db, 0xa438, 0x8410, 0xa438, 0xa0f4, + 0xa438, 0xa610, 0xa438, 0xd700, 0xa438, 0x6061, 0xa438, 0xa002, + 0xa438, 0xa501, 0xa438, 0xa706, 0xa438, 0x8804, 0xa438, 0xa980, + 0xa438, 0xd70c, 0xa438, 0x6085, 0xa438, 0x8701, 0xa438, 0x8502, + 0xa438, 0x8c02, 0xa438, 0xf082, 0xa438, 0xd70c, 0xa438, 0x60c5, + 0xa438, 0xd702, 0xa438, 0x6053, 0xa438, 0xf07d, 0xa438, 0x1800, + 0xa438, 0x84aa, 0xa438, 0xd70d, 0xa438, 0x4d1b, 0xa438, 0xba10, + 0xa438, 0xae40, 0xa438, 0x0cfc, 0xa438, 0x03b4, 0xa438, 0x0cfc, + 0xa438, 0x05b4, 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, + 0xa438, 0x5f7c, 0xa438, 0x8706, 0xa438, 0x8280, 0xa438, 0xace0, + 0xa438, 0xa680, 0xa438, 0xa240, 0xa438, 0x1000, 0xa438, 0x17be, + 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd702, 0xa438, 0x5f79, + 0xa438, 0x8240, 0xa438, 0xd702, 0xa438, 0x6898, 0xa438, 0xd702, + 0xa438, 0x4957, 0xa438, 0x1800, 0xa438, 0x849c, 0xa438, 0xa1c0, + 0xa438, 0x0c3f, 0xa438, 0x0220, 0xa438, 0x0cfc, 0xa438, 0x030c, + 0xa438, 0x0cfc, 0xa438, 0x050c, 0xa438, 0x8108, 0xa438, 0x8640, + 0xa438, 0xa120, 0xa438, 0xa640, 0xa438, 0x0c03, 0xa438, 0x0101, + 0xa438, 0xa110, 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0xca84, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd702, 0xa438, 0x5f79, 0xa438, 0x8240, 0xa438, 0x0cfc, - 0xa438, 0x0390, 0xa438, 0x0cfc, 0xa438, 0x0590, 0xa438, 0xd702, - 0xa438, 0x6058, 0xa438, 0xf002, 0xa438, 0xfec8, 0xa438, 0x81c0, - 0xa438, 0x8880, 0xa438, 0x8706, 0xa438, 0xca61, 0xa438, 0xd1c4, - 0xa438, 0xd054, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, - 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f7d, 0xa438, 0xa706, - 0xa438, 0xf004, 0xa438, 0x8788, 0xa438, 0xa404, 0xa438, 0x8702, - 0xa438, 0x0800, 0xa438, 0x8443, 0xa438, 0x8303, 0xa438, 0x8280, - 0xa438, 0x9920, 0xa438, 0x8ce0, 0xa438, 0x8004, 0xa438, 0xa1c0, - 0xa438, 0xd70e, 0xa438, 0x404a, 0xa438, 0xa280, 0xa438, 0xd702, - 0xa438, 0x3bd0, 0xa438, 0x8392, 0xa438, 0x0c3f, 0xa438, 0x0223, - 0xa438, 0xf003, 0xa438, 0x0c3f, 0xa438, 0x0220, 0xa438, 0x0cfc, - 0xa438, 0x0308, 0xa438, 0x0cfc, 0xa438, 0x0508, 0xa438, 0x8108, - 0xa438, 0x8640, 0xa438, 0xa120, 0xa438, 0xa640, 0xa438, 0xd702, - 0xa438, 0x6077, 0xa438, 0x8103, 0xa438, 0xf003, 0xa438, 0x0c03, - 0xa438, 0x0101, 0xa438, 0xa110, 0xa438, 0xd702, 0xa438, 0x6077, - 0xa438, 0xa108, 0xa438, 0xf006, 0xa438, 0xd704, 0xa438, 0x6077, - 0xa438, 0x8108, 0xa438, 0xf002, 0xa438, 0xa108, 0xa438, 0xd193, - 0xa438, 0xd045, 0xa438, 0xca82, 0xa438, 0x1000, 0xa438, 0x17be, - 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f3c, 0xa438, 0xd702, 0xa438, 0x60fc, + 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0xd702, 0xa438, 0x60fc, 0xa438, 0x8210, 0xa438, 0x0ce0, 0xa438, 0x0320, 0xa438, 0x0ce0, 0xa438, 0x0520, 0xa438, 0xf002, 0xa438, 0xa210, 0xa438, 0xd1c4, - 0xa438, 0xd043, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70e, + 0xa438, 0xd043, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, + 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f7c, 0xa438, 0x8233, + 0xa438, 0x0cfc, 0xa438, 0x036c, 0xa438, 0x0cfc, 0xa438, 0x056c, + 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0xca85, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, + 0xa438, 0x5f7c, 0xa438, 0xa680, 0xa438, 0xa240, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd702, + 0xa438, 0x5f79, 0xa438, 0x8240, 0xa438, 0x0cfc, 0xa438, 0x0390, + 0xa438, 0x0cfc, 0xa438, 0x0590, 0xa438, 0xd702, 0xa438, 0x6058, + 0xa438, 0xf002, 0xa438, 0xfec8, 0xa438, 0x81c0, 0xa438, 0x8880, + 0xa438, 0x8706, 0xa438, 0xca61, 0xa438, 0xd1c4, 0xa438, 0xd054, + 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0x1000, 0xa438, 0x17e8, + 0xa438, 0xd70c, 0xa438, 0x5f7d, 0xa438, 0xa706, 0xa438, 0xf004, + 0xa438, 0x8788, 0xa438, 0xa404, 0xa438, 0x8702, 0xa438, 0x0800, + 0xa438, 0x8443, 0xa438, 0x8303, 0xa438, 0x8280, 0xa438, 0x9920, + 0xa438, 0x8ce0, 0xa438, 0x8004, 0xa438, 0xa1c0, 0xa438, 0xd70e, + 0xa438, 0x404a, 0xa438, 0xa280, 0xa438, 0xd702, 0xa438, 0x3bd0, + 0xa438, 0x84be, 0xa438, 0x0c3f, 0xa438, 0x0223, 0xa438, 0xf003, + 0xa438, 0x0c3f, 0xa438, 0x0220, 0xa438, 0x0cfc, 0xa438, 0x0308, + 0xa438, 0x0cfc, 0xa438, 0x0508, 0xa438, 0x8108, 0xa438, 0x8640, + 0xa438, 0xa120, 0xa438, 0xa640, 0xa438, 0xd702, 0xa438, 0x6077, + 0xa438, 0x8103, 0xa438, 0xf003, 0xa438, 0x0c03, 0xa438, 0x0101, + 0xa438, 0xa110, 0xa438, 0xd702, 0xa438, 0x6077, 0xa438, 0xa108, + 0xa438, 0xf006, 0xa438, 0xd704, 0xa438, 0x6077, 0xa438, 0x8108, + 0xa438, 0xf002, 0xa438, 0xa108, 0xa438, 0xd193, 0xa438, 0xd045, + 0xa438, 0xca82, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, - 0xa438, 0x5f3c, 0xa438, 0xd702, 0xa438, 0x3bd0, 0xa438, 0x83d0, - 0xa438, 0x0c3f, 0xa438, 0x020c, 0xa438, 0xf002, 0xa438, 0x823f, - 0xa438, 0x0cfc, 0xa438, 0x034c, 0xa438, 0x0cfc, 0xa438, 0x054c, - 0xa438, 0xd1c4, 0xa438, 0xd044, 0xa438, 0x1000, 0xa438, 0x17be, - 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd70c, 0xa438, 0x5f3c, 0xa438, 0x820c, 0xa438, 0xa360, - 0xa438, 0xa560, 0xa438, 0xd1c4, 0xa438, 0xd043, 0xa438, 0xca83, + 0xa438, 0x5f3c, 0xa438, 0xd702, 0xa438, 0x60fc, 0xa438, 0x8210, + 0xa438, 0x0ce0, 0xa438, 0x0320, 0xa438, 0x0ce0, 0xa438, 0x0520, + 0xa438, 0xf002, 0xa438, 0xa210, 0xa438, 0xd1c4, 0xa438, 0xd043, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f3c, - 0xa438, 0xd70e, 0xa438, 0x406a, 0xa438, 0x8680, 0xa438, 0xf002, - 0xa438, 0xa680, 0xa438, 0xa240, 0xa438, 0x0c0f, 0xa438, 0x0604, - 0xa438, 0x0c70, 0xa438, 0x0750, 0xa438, 0xa708, 0xa438, 0xd704, - 0xa438, 0x609c, 0xa438, 0x0c1f, 0xa438, 0x0914, 0xa438, 0xf003, - 0xa438, 0x0c1f, 0xa438, 0x0910, 0xa438, 0xa940, 0xa438, 0x1000, - 0xa438, 0x17db, 0xa438, 0xa780, 0xa438, 0x1000, 0xa438, 0x17be, - 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, - 0xa438, 0xd702, 0xa438, 0x399c, 0xa438, 0x8403, 0xa438, 0x8240, - 0xa438, 0x8788, 0xa438, 0xd702, 0xa438, 0x63f8, 0xa438, 0xd705, - 0xa438, 0x643c, 0xa438, 0xa402, 0xa438, 0xf012, 0xa438, 0x8402, - 0xa438, 0xd705, 0xa438, 0x611b, 0xa438, 0xa401, 0xa438, 0xa302, - 0xa438, 0xd702, 0xa438, 0x417d, 0xa438, 0xa440, 0xa438, 0xa280, - 0xa438, 0xf008, 0xa438, 0x8401, 0xa438, 0x8302, 0xa438, 0xd70c, - 0xa438, 0x6060, 0xa438, 0xa301, 0xa438, 0xf002, 0xa438, 0x8301, - 0xa438, 0xd70c, 0xa438, 0x4080, 0xa438, 0xd70e, 0xa438, 0x604a, - 0xa438, 0xff5f, 0xa438, 0xd705, 0xa438, 0x3cdd, 0xa438, 0x8432, - 0xa438, 0xff5b, 0xa438, 0x0cfc, 0xa438, 0x0390, 0xa438, 0x0cfc, - 0xa438, 0x0590, 0xa438, 0x0800, 0xa438, 0xd704, 0xa438, 0x60f9, - 0xa438, 0xd704, 0xa438, 0x6958, 0xa438, 0xd706, 0xa438, 0x6902, - 0xa438, 0x1800, 0xa438, 0x1001, 0xa438, 0xa220, 0xa438, 0xa404, - 0xa438, 0xd704, 0xa438, 0x4054, 0xa438, 0xa740, 0xa438, 0xa504, - 0xa438, 0xd704, 0xa438, 0x40b5, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa003, 0xa438, 0x9503, 0xa438, 0x8190, 0xa438, 0xcb91, - 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd704, 0xa438, 0x7fb9, - 0xa438, 0x8220, 0xa438, 0x8404, 0xa438, 0xa280, 0xa438, 0xa110, - 0xa438, 0xd706, 0xa438, 0x4041, 0xa438, 0xa180, 0xa438, 0x1000, - 0xa438, 0x130c, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x850f, - 0xa438, 0x9503, 0xa438, 0x0c1f, 0xa438, 0x0d08, 0xa438, 0x0cc0, - 0xa438, 0x0d80, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1000, - 0xa438, 0x10af, 0xa438, 0xd704, 0xa438, 0x615f, 0xa438, 0xd70c, - 0xa438, 0x6103, 0xa438, 0x8504, 0xa438, 0xd704, 0xa438, 0x40b5, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8003, 0xa438, 0x9503, - 0xa438, 0xcb92, 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd706, - 0xa438, 0x7fa3, 0xa438, 0x8280, 0xa438, 0x8190, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0x0c0f, 0xa438, 0x050a, 0xa438, 0x9503, - 0xa438, 0x0c1f, 0xa438, 0x0d00, 0xa438, 0x8dc0, 0xa438, 0x1000, - 0xa438, 0x12b5, 0xa438, 0x1800, 0xa438, 0x1001, 0xa438, 0x0c1f, - 0xa438, 0x0d00, 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, - 0xa438, 0x800a, 0xa438, 0xd705, 0xa438, 0x40b9, 0xa438, 0xd70c, - 0xa438, 0x6063, 0xa438, 0xa020, 0xa438, 0xf003, 0xa438, 0xd705, - 0xa438, 0x8020, 0xa438, 0xa504, 0xa438, 0xd704, 0xa438, 0x40b5, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa003, 0xa438, 0x9503, - 0xa438, 0xd704, 0xa438, 0x4054, 0xa438, 0xa740, 0xa438, 0x8190, - 0xa438, 0xcb93, 0xa438, 0xd700, 0xa438, 0x6063, 0xa438, 0xd704, - 0xa438, 0x609c, 0xa438, 0xd14b, 0xa438, 0xd040, 0xa438, 0xf003, - 0xa438, 0xd120, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x10af, - 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xa008, 0xa438, 0xd706, - 0xa438, 0x4040, 0xa438, 0xa002, 0xa438, 0xd705, 0xa438, 0x4079, - 0xa438, 0x1000, 0xa438, 0x1313, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0x85f0, 0xa438, 0x9503, 0xa438, 0xd705, 0xa438, 0x40d9, - 0xa438, 0xd70c, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d09, - 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d0a, 0xa438, 0x0cc0, - 0xa438, 0x0d80, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1000, - 0xa438, 0x10af, 0xa438, 0x8020, 0xa438, 0xd705, 0xa438, 0x4199, + 0xa438, 0xd702, 0xa438, 0x3bd0, 0xa438, 0x84fc, 0xa438, 0x0c3f, + 0xa438, 0x020c, 0xa438, 0xf002, 0xa438, 0x823f, 0xa438, 0x0cfc, + 0xa438, 0x034c, 0xa438, 0x0cfc, 0xa438, 0x054c, 0xa438, 0xd1c4, + 0xa438, 0xd044, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70e, + 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd70c, + 0xa438, 0x5f3c, 0xa438, 0x820c, 0xa438, 0xa360, 0xa438, 0xa560, + 0xa438, 0xd1c4, 0xa438, 0xd043, 0xa438, 0xca83, 0xa438, 0x1000, + 0xa438, 0x17be, 0xa438, 0xd70e, 0xa438, 0x606a, 0xa438, 0x1000, + 0xa438, 0x17e8, 0xa438, 0xd70c, 0xa438, 0x5f3c, 0xa438, 0xd70e, + 0xa438, 0x406a, 0xa438, 0x8680, 0xa438, 0xf002, 0xa438, 0xa680, + 0xa438, 0xa240, 0xa438, 0x0c0f, 0xa438, 0x0604, 0xa438, 0x0c70, + 0xa438, 0x0750, 0xa438, 0xa708, 0xa438, 0xd704, 0xa438, 0x609c, + 0xa438, 0x0c1f, 0xa438, 0x0914, 0xa438, 0xf003, 0xa438, 0x0c1f, + 0xa438, 0x0910, 0xa438, 0xa940, 0xa438, 0x1000, 0xa438, 0x17db, + 0xa438, 0xa780, 0xa438, 0x1000, 0xa438, 0x17be, 0xa438, 0xd70e, + 0xa438, 0x606a, 0xa438, 0x1000, 0xa438, 0x17e8, 0xa438, 0xd702, + 0xa438, 0x399c, 0xa438, 0x852f, 0xa438, 0x8240, 0xa438, 0x8788, + 0xa438, 0xd702, 0xa438, 0x63f8, 0xa438, 0xd705, 0xa438, 0x643c, + 0xa438, 0xa402, 0xa438, 0xf012, 0xa438, 0x8402, 0xa438, 0xd705, + 0xa438, 0x611b, 0xa438, 0xa401, 0xa438, 0xa302, 0xa438, 0xd702, + 0xa438, 0x417d, 0xa438, 0xa440, 0xa438, 0xa280, 0xa438, 0xf008, + 0xa438, 0x8401, 0xa438, 0x8302, 0xa438, 0xd70c, 0xa438, 0x6060, + 0xa438, 0xa301, 0xa438, 0xf002, 0xa438, 0x8301, 0xa438, 0xd70c, + 0xa438, 0x4080, 0xa438, 0xd70e, 0xa438, 0x604a, 0xa438, 0xff5f, + 0xa438, 0xd705, 0xa438, 0x3cdd, 0xa438, 0x855e, 0xa438, 0xff5b, + 0xa438, 0x0cfc, 0xa438, 0x0390, 0xa438, 0x0cfc, 0xa438, 0x0590, + 0xa438, 0x0800, 0xa438, 0xd704, 0xa438, 0x60f9, 0xa438, 0xd704, + 0xa438, 0x6958, 0xa438, 0xd706, 0xa438, 0x6902, 0xa438, 0x1800, + 0xa438, 0x1001, 0xa438, 0xa220, 0xa438, 0xa404, 0xa438, 0xd704, + 0xa438, 0x4054, 0xa438, 0xa740, 0xa438, 0xa504, 0xa438, 0xd704, + 0xa438, 0x40b5, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0xa003, + 0xa438, 0x9503, 0xa438, 0x8190, 0xa438, 0xcb91, 0xa438, 0x1000, + 0xa438, 0x10af, 0xa438, 0xd704, 0xa438, 0x7fb9, 0xa438, 0x8220, + 0xa438, 0x8404, 0xa438, 0xa280, 0xa438, 0xa110, 0xa438, 0xd706, + 0xa438, 0x4041, 0xa438, 0xa180, 0xa438, 0x1000, 0xa438, 0x130c, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x850f, 0xa438, 0x9503, + 0xa438, 0x0c1f, 0xa438, 0x0d08, 0xa438, 0x0cc0, 0xa438, 0x0d80, + 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd704, 0xa438, 0x615f, 0xa438, 0xd70c, 0xa438, 0x6103, 0xa438, 0x8504, 0xa438, 0xd704, 0xa438, 0x40b5, 0xa438, 0x0c03, - 0xa438, 0x1502, 0xa438, 0x8003, 0xa438, 0x9503, 0xa438, 0xcb94, - 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd706, 0xa438, 0x7fa2, - 0xa438, 0x800a, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x85f0, - 0xa438, 0x9503, 0xa438, 0xd705, 0xa438, 0x40b9, 0xa438, 0x0c1f, - 0xa438, 0x0d00, 0xa438, 0x8dc0, 0xa438, 0xf005, 0xa438, 0x0c1f, - 0xa438, 0x0d07, 0xa438, 0x8dc0, 0xa438, 0xa190, 0xa438, 0x1000, - 0xa438, 0x12b5, 0xa438, 0xd705, 0xa438, 0x39cc, 0xa438, 0x84eb, - 0xa438, 0x1800, 0xa438, 0x1001, 0xa438, 0x1800, 0xa438, 0x819d, - 0xa438, 0xcb13, 0xa438, 0xd706, 0xa438, 0x6089, 0xa438, 0xd1b8, - 0xa438, 0xd04a, 0xa438, 0xf003, 0xa438, 0xd11c, 0xa438, 0xd04b, - 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd701, 0xa438, 0x67d5, - 0xa438, 0xd700, 0xa438, 0x5f74, 0xa438, 0xd70c, 0xa438, 0x610c, - 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x6846, - 0xa438, 0xd706, 0xa438, 0x647b, 0xa438, 0xfffa, 0xa438, 0x1000, - 0xa438, 0x1330, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c1f, - 0xa438, 0x0f16, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd70c, 0xa438, 0x5fb3, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0x8f1f, 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd70c, 0xa438, 0x7f33, 0xa438, 0x1000, 0xa438, 0x12b5, - 0xa438, 0x0c07, 0xa438, 0x0c02, 0xa438, 0x0cc0, 0xa438, 0x0080, - 0xa438, 0xd14a, 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x1800, 0xa438, 0x84fd, - 0xa438, 0x800a, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8001, 0xa438, 0x1000, - 0xa438, 0x1217, 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0x1800, - 0xa438, 0x04ed, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, - 0xa438, 0x5fab, 0xa438, 0xba08, 0xa438, 0x1000, 0xa438, 0x126b, - 0xa438, 0xd71f, 0xa438, 0x7f8b, 0xa438, 0x9a08, 0xa438, 0x1800, - 0xa438, 0x0581, 0xa438, 0x800a, 0xa438, 0xd702, 0xa438, 0x6555, + 0xa438, 0x1502, 0xa438, 0x8003, 0xa438, 0x9503, 0xa438, 0xcb92, + 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd706, 0xa438, 0x7fa3, + 0xa438, 0x8280, 0xa438, 0x8190, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x0c0f, 0xa438, 0x050a, 0xa438, 0x9503, 0xa438, 0x0c1f, + 0xa438, 0x0d00, 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, + 0xa438, 0x1800, 0xa438, 0x1001, 0xa438, 0x0c1f, 0xa438, 0x0d00, + 0xa438, 0x8dc0, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x800a, + 0xa438, 0xd705, 0xa438, 0x40b9, 0xa438, 0xd70c, 0xa438, 0x6063, + 0xa438, 0xa020, 0xa438, 0xf003, 0xa438, 0xd705, 0xa438, 0x8020, + 0xa438, 0xa504, 0xa438, 0xd704, 0xa438, 0x40b5, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0xa003, 0xa438, 0x9503, 0xa438, 0xd704, + 0xa438, 0x4054, 0xa438, 0xa740, 0xa438, 0x8190, 0xa438, 0xcb93, + 0xa438, 0xd700, 0xa438, 0x6063, 0xa438, 0xd704, 0xa438, 0x609c, + 0xa438, 0xd14b, 0xa438, 0xd040, 0xa438, 0xf003, 0xa438, 0xd120, + 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x10af, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0xa008, 0xa438, 0xd706, 0xa438, 0x4040, + 0xa438, 0xa002, 0xa438, 0xd705, 0xa438, 0x4079, 0xa438, 0x1000, + 0xa438, 0x1313, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x85f0, + 0xa438, 0x9503, 0xa438, 0xd705, 0xa438, 0x40d9, 0xa438, 0xd70c, + 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d09, 0xa438, 0xf003, + 0xa438, 0x0c1f, 0xa438, 0x0d0a, 0xa438, 0x0cc0, 0xa438, 0x0d80, + 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x1000, 0xa438, 0x10af, + 0xa438, 0x8020, 0xa438, 0xd705, 0xa438, 0x4199, 0xa438, 0xd704, + 0xa438, 0x615f, 0xa438, 0xd70c, 0xa438, 0x6103, 0xa438, 0x8504, + 0xa438, 0xd704, 0xa438, 0x40b5, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0x8003, 0xa438, 0x9503, 0xa438, 0xcb94, 0xa438, 0x1000, + 0xa438, 0x10af, 0xa438, 0xd706, 0xa438, 0x7fa2, 0xa438, 0x800a, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x85f0, 0xa438, 0x9503, + 0xa438, 0xd705, 0xa438, 0x40b9, 0xa438, 0x0c1f, 0xa438, 0x0d00, + 0xa438, 0x8dc0, 0xa438, 0xf005, 0xa438, 0x0c1f, 0xa438, 0x0d07, + 0xa438, 0x8dc0, 0xa438, 0xa190, 0xa438, 0x1000, 0xa438, 0x12b5, + 0xa438, 0xd705, 0xa438, 0x39cc, 0xa438, 0x8617, 0xa438, 0x1800, + 0xa438, 0x1001, 0xa438, 0x1800, 0xa438, 0x82c7, 0xa438, 0xcb13, + 0xa438, 0xd706, 0xa438, 0x6089, 0xa438, 0xd1b8, 0xa438, 0xd04a, + 0xa438, 0xf003, 0xa438, 0xd11c, 0xa438, 0xd04b, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd701, 0xa438, 0x67d5, 0xa438, 0xd700, + 0xa438, 0x5f74, 0xa438, 0xd70c, 0xa438, 0x610c, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x6846, 0xa438, 0xd706, + 0xa438, 0x647b, 0xa438, 0xfffa, 0xa438, 0x1000, 0xa438, 0x1330, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x0c1f, 0xa438, 0x0f16, + 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, + 0xa438, 0x5fb3, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8f1f, + 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd70c, + 0xa438, 0x7f33, 0xa438, 0x1000, 0xa438, 0x12b5, 0xa438, 0x0c07, + 0xa438, 0x0c02, 0xa438, 0x0cc0, 0xa438, 0x0080, 0xa438, 0xd14a, + 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0x1800, 0xa438, 0x8629, 0xa438, 0x800a, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8004, 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8001, 0xa438, 0x1000, 0xa438, 0x1217, - 0xa438, 0xa00a, 0xa438, 0xa780, 0xa438, 0xcb14, 0xa438, 0xd1b8, - 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0x6286, 0xa438, 0xd706, 0xa438, 0x5f5b, - 0xa438, 0x800a, 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x1220, 0xa438, 0x8001, 0xa438, 0x1000, - 0xa438, 0x1217, 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0x1800, - 0xa438, 0x8545, 0xa438, 0xa00a, 0xa438, 0x9308, 0xa438, 0xb210, - 0xa438, 0xb301, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd701, - 0xa438, 0x5fa4, 0xa438, 0xb302, 0xa438, 0x9210, 0xa438, 0xd409, - 0xa438, 0x1000, 0xa438, 0x1203, 0xa438, 0xd103, 0xa438, 0xd04c, + 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0x1800, 0xa438, 0x04ed, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, 0xa438, 0x5fab, + 0xa438, 0xba08, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd71f, + 0xa438, 0x7f8b, 0xa438, 0x9a08, 0xa438, 0x1800, 0xa438, 0x0581, + 0xa438, 0x800a, 0xa438, 0xd702, 0xa438, 0x6555, 0xa438, 0x1000, + 0xa438, 0x120e, 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x1220, + 0xa438, 0x8004, 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x1220, + 0xa438, 0x8001, 0xa438, 0x1000, 0xa438, 0x1217, 0xa438, 0xa00a, + 0xa438, 0xa780, 0xa438, 0xcb14, 0xa438, 0xd1b8, 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, - 0xa438, 0x1800, 0xa438, 0x0581, 0xa438, 0xd70c, 0xa438, 0x60b3, - 0xa438, 0x1800, 0xa438, 0x8587, 0xa438, 0x1800, 0xa438, 0x001a, - 0xa438, 0x1800, 0xa438, 0x12cb, 0xa436, 0xA10E, 0xa438, 0x12cf, - 0xa436, 0xA10C, 0xa438, 0x04f8, 0xa436, 0xA10A, 0xa438, 0x1003, - 0xa436, 0xA108, 0xa438, 0x15fb, 0xa436, 0xA106, 0xa438, 0x0d2b, - 0xa436, 0xA104, 0xa438, 0x0ecb, 0xa436, 0xA102, 0xa438, 0x1119, - 0xa436, 0xA100, 0xa438, 0x0960, 0xa436, 0xA110, 0xa438, 0x00ff, - 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x1ff8, - 0xa436, 0xA014, 0xa438, 0xa704, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x819d, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa436, 0xA164, 0xa438, 0x119F, 0xa436, 0xA166, - 0xa438, 0x3fff, 0xa436, 0xA168, 0xa438, 0x3fff, 0xa436, 0xA16A, - 0xa438, 0x11A1, 0xa436, 0xA16C, 0xa438, 0x3fff, 0xa436, 0xA16E, - 0xa438, 0x3fff, 0xa436, 0xA170, 0xa438, 0x3fff, 0xa436, 0xA172, - 0xa438, 0x3fff, 0xa436, 0xA162, 0xa438, 0x0009, 0xa436, 0xb87c, - 0xa438, 0x8a63, 0xa436, 0xb87e, 0xa438, 0xaf8a, 0xa438, 0x7baf, - 0xa438, 0x8ab6, 0xa438, 0xaf8a, 0xa438, 0xd6af, 0xa438, 0x8ae4, - 0xa438, 0xaf8a, 0xa438, 0xf2af, 0xa438, 0x8b07, 0xa438, 0xaf8b, - 0xa438, 0x07af, 0xa438, 0x8b07, 0xa438, 0xad35, 0xa438, 0x27bf, - 0xa438, 0x7308, 0xa438, 0x027b, 0xa438, 0x07ac, 0xa438, 0x280d, - 0xa438, 0xbf73, 0xa438, 0x0b02, 0xa438, 0x7b07, 0xa438, 0xac28, - 0xa438, 0x04d0, 0xa438, 0x05ae, 0xa438, 0x02d0, 0xa438, 0x01d1, - 0xa438, 0x01d3, 0xa438, 0x04ee, 0xa438, 0x8640, 0xa438, 0x00ee, - 0xa438, 0x8641, 0xa438, 0x00af, 0xa438, 0x6aa6, 0xa438, 0xd100, - 0xa438, 0xd300, 0xa438, 0xee86, 0xa438, 0x4001, 0xa438, 0xee86, - 0xa438, 0x4124, 0xa438, 0xd00f, 0xa438, 0xaf6a, 0xa438, 0xa6bf, - 0xa438, 0x739e, 0xa438, 0x027b, 0xa438, 0x07ad, 0xa438, 0x280b, - 0xa438, 0xe18f, 0xa438, 0xfdad, 0xa438, 0x2805, 0xa438, 0xe08f, - 0xa438, 0xfeae, 0xa438, 0x03e0, 0xa438, 0x8fff, 0xa438, 0xe489, - 0xa438, 0xe7e0, 0xa438, 0x89e7, 0xa438, 0xaf67, 0xa438, 0x9fa0, - 0xa438, 0x9402, 0xa438, 0xae03, 0xa438, 0xa0b5, 0xa438, 0x03af, - 0xa438, 0x0d89, 0xa438, 0xaf0d, 0xa438, 0xafa0, 0xa438, 0x9402, - 0xa438, 0xae03, 0xa438, 0xa0b5, 0xa438, 0x03af, 0xa438, 0x0c64, - 0xa438, 0xaf0c, 0xa438, 0xcce0, 0xa438, 0x8013, 0xa438, 0x026b, - 0xa438, 0xa4ad, 0xa438, 0x2109, 0xa438, 0x0264, 0xa438, 0x47bf, - 0xa438, 0x769b, 0xa438, 0x027a, 0xa438, 0xbcaf, 0xa438, 0x6562, + 0xa438, 0x6286, 0xa438, 0xd706, 0xa438, 0x5f5b, 0xa438, 0x800a, + 0xa438, 0x1000, 0xa438, 0x120e, 0xa438, 0xa004, 0xa438, 0x1000, + 0xa438, 0x1220, 0xa438, 0x8004, 0xa438, 0xa001, 0xa438, 0x1000, + 0xa438, 0x1220, 0xa438, 0x8001, 0xa438, 0x1000, 0xa438, 0x1217, + 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0x1800, 0xa438, 0x8671, + 0xa438, 0xa00a, 0xa438, 0x9308, 0xa438, 0xb210, 0xa438, 0xb301, + 0xa438, 0x1000, 0xa438, 0x126b, 0xa438, 0xd701, 0xa438, 0x5fa4, + 0xa438, 0xb302, 0xa438, 0x9210, 0xa438, 0xd409, 0xa438, 0x1000, + 0xa438, 0x1203, 0xa438, 0xd103, 0xa438, 0xd04c, 0xa438, 0x1000, + 0xa438, 0x126b, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x1800, + 0xa438, 0x0581, 0xa438, 0xd70c, 0xa438, 0x60b3, 0xa438, 0x1800, + 0xa438, 0x86b3, 0xa438, 0x1800, 0xa438, 0x001a, 0xa438, 0x1800, + 0xa438, 0x12cb, 0xa436, 0xA10E, 0xa438, 0x12cf, 0xa436, 0xA10C, + 0xa438, 0x04f8, 0xa436, 0xA10A, 0xa438, 0x1003, 0xa436, 0xA108, + 0xa438, 0x15fb, 0xa436, 0xA106, 0xa438, 0x0d2b, 0xa436, 0xA104, + 0xa438, 0x0ecb, 0xa436, 0xA102, 0xa438, 0x1119, 0xa436, 0xA100, + 0xa438, 0x0960, 0xa436, 0xA110, 0xa438, 0x00ff, 0xa436, 0xA016, + 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x1ff8, 0xa436, 0xA014, + 0xa438, 0xa704, 0xa438, 0x82c7, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa436, 0xA164, 0xa438, 0x119F, 0xa436, 0xA166, 0xa438, 0x11A1, + 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, 0x8a63, + 0xa436, 0xb87e, 0xa438, 0xaf8a, 0xa438, 0x7baf, 0xa438, 0x8ab6, + 0xa438, 0xaf8a, 0xa438, 0xd6af, 0xa438, 0x8ae4, 0xa438, 0xaf8a, + 0xa438, 0xf2af, 0xa438, 0x8b01, 0xa438, 0xaf8b, 0xa438, 0x0aaf, + 0xa438, 0x8b10, 0xa438, 0xad35, 0xa438, 0x27bf, 0xa438, 0x7308, + 0xa438, 0x027b, 0xa438, 0x07ac, 0xa438, 0x280d, 0xa438, 0xbf73, + 0xa438, 0x0b02, 0xa438, 0x7b07, 0xa438, 0xac28, 0xa438, 0x04d0, + 0xa438, 0x05ae, 0xa438, 0x02d0, 0xa438, 0x01d1, 0xa438, 0x01d3, + 0xa438, 0x04ee, 0xa438, 0x8640, 0xa438, 0x00ee, 0xa438, 0x8641, + 0xa438, 0x00af, 0xa438, 0x6aa6, 0xa438, 0xd100, 0xa438, 0xd300, + 0xa438, 0xee86, 0xa438, 0x4001, 0xa438, 0xee86, 0xa438, 0x4124, + 0xa438, 0xd00f, 0xa438, 0xaf6a, 0xa438, 0xa6bf, 0xa438, 0x739e, + 0xa438, 0x027b, 0xa438, 0x07ad, 0xa438, 0x280b, 0xa438, 0xe18f, + 0xa438, 0xfdad, 0xa438, 0x2805, 0xa438, 0xe08f, 0xa438, 0xfeae, + 0xa438, 0x03e0, 0xa438, 0x8fff, 0xa438, 0xe489, 0xa438, 0xe7e0, + 0xa438, 0x89e7, 0xa438, 0xaf67, 0xa438, 0x9fa0, 0xa438, 0x9402, + 0xa438, 0xae03, 0xa438, 0xa0b5, 0xa438, 0x03af, 0xa438, 0x0d89, + 0xa438, 0xaf0d, 0xa438, 0xafa0, 0xa438, 0x9402, 0xa438, 0xae03, + 0xa438, 0xa0b5, 0xa438, 0x03af, 0xa438, 0x0c64, 0xa438, 0xaf0c, + 0xa438, 0xcce0, 0xa438, 0x86a5, 0xa438, 0xad25, 0xa438, 0x0602, + 0xa438, 0x6ba4, 0xa438, 0x0265, 0xa438, 0x4faf, 0xa438, 0x6e9a, + 0xa438, 0xac24, 0xa438, 0x03af, 0xa438, 0x6bb4, 0xa438, 0xaf6b, + 0xa438, 0xb602, 0xa438, 0x7ae8, 0xa438, 0xaf6c, 0xa438, 0xa100, 0xa436, 0xb85e, 0xa438, 0x6A7F, 0xa436, 0xb860, 0xa438, 0x679C, 0xa436, 0xb862, 0xa438, 0x0d86, 0xa436, 0xb864, 0xa438, 0x0c61, - 0xa436, 0xb886, 0xa438, 0x6553, 0xa436, 0xb888, 0xa438, 0xffff, - 0xa436, 0xb88a, 0xa438, 0xffff, 0xa436, 0xb88c, 0xa438, 0xffff, - 0xa436, 0xb838, 0xa438, 0x001f, 0xb820, 0x0010, 0xa436, 0x8629, + 0xa436, 0xb886, 0xa438, 0x6E7C, 0xa436, 0xb888, 0xa438, 0x6BAE, + 0xa436, 0xb88a, 0xa438, 0x6C9B, 0xa436, 0xb88c, 0xa438, 0xffff, + 0xa436, 0xb838, 0xa438, 0x007f, 0xb820, 0x0010, 0xa436, 0x8629, 0xa438, 0xaf86, 0xa438, 0x41af, 0xa438, 0x8644, 0xa438, 0xaf88, 0xa438, 0x0caf, 0xa438, 0x8813, 0xa438, 0xaf88, 0xa438, 0x4baf, 0xa438, 0x884b, 0xa438, 0xaf88, 0xa438, 0x4baf, 0xa438, 0x884b, diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h index 7cc4ee527f..36a7b57c97 100644 --- a/drivers/net/r8169/r8169_hw.h +++ b/drivers/net/r8169/r8169_hw.h @@ -123,11 +123,11 @@ extern const struct rtl_hw_ops rtl8168kb_ops; #define NIC_RAMCODE_VERSION_CFG_METHOD_51 (0x0b99) #define NIC_RAMCODE_VERSION_CFG_METHOD_54 (0x0013) #define NIC_RAMCODE_VERSION_CFG_METHOD_55 (0x0001) -#define NIC_RAMCODE_VERSION_CFG_METHOD_56 (0x0016) -#define NIC_RAMCODE_VERSION_CFG_METHOD_57 (0x0001) +#define NIC_RAMCODE_VERSION_CFG_METHOD_56 (0x0027) +#define NIC_RAMCODE_VERSION_CFG_METHOD_57 (0x0027) #define NIC_RAMCODE_VERSION_CFG_METHOD_69 (0x0023) #define NIC_RAMCODE_VERSION_CFG_METHOD_70 (0x0033) -#define NIC_RAMCODE_VERSION_CFG_METHOD_71 (0x0051) +#define NIC_RAMCODE_VERSION_CFG_METHOD_71 (0x0060) #define RTL_MAC_MCU_PAGE_SIZE 256 #define RTL_DEFAULT_MTU 1500 -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/8] net/r8169: add support for RTL8127 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang 2025-06-10 6:01 ` [PATCH 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 4/8] net/r8169: remove cmac feature for RTL8125AP Howard Wang ` (4 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 4/8] net/r8169: remove cmac feature for RTL8125AP 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang 2025-06-10 6:01 ` [PATCH 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang 2025-06-10 6:01 ` [PATCH 3/8] net/r8169: add support for RTL8127 Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 5/8] net/r8169: add RTL8127AP dash support Howard Wang ` (3 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/r8169_dash.c | 23 +++++++++++------------ drivers/net/r8169/r8169_dash.h | 1 + 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/net/r8169/r8169_dash.c b/drivers/net/r8169/r8169_dash.c index c26d7a5280..1fdbe5c4ae 100644 --- a/drivers/net/r8169/r8169_dash.c +++ b/drivers/net/r8169/r8169_dash.c @@ -63,18 +63,23 @@ _rtl_check_dash(struct rtl_hw *hw) if (!hw->AllowAccessDashOcp) return 0; - if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_3(hw) || - HW_DASH_SUPPORT_TYPE_4(hw)) { + switch (hw->HwSuppDashVer) { + case 2: + if (rtl_is_8125(hw)) + return 0; + /* Fall through */ + case 3: + case 4: if (rtl_ocp_read(hw, 0x128, 1) & BIT_0) return 1; else return 0; - } else if (HW_DASH_SUPPORT_TYPE_1(hw)) { + case 1: if (rtl_ocp_read(hw, 0x10, 2) & 0x00008000) return 1; else return 0; - } else { + default: return 0; } } @@ -193,7 +198,7 @@ rtl8168_csi_to_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value) static void rtl_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value) { - if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) + if (HW_DASH_SUPPORT_TYPE_2(hw)) RTL_CMAC_W8(hw, reg, value); else if (HW_DASH_SUPPORT_TYPE_3(hw)) rtl8168_csi_to_cmac_w8(hw, reg, value); @@ -202,7 +207,7 @@ rtl_cmac_w8(struct rtl_hw *hw, u32 reg, u8 value) static u8 rtl_cmac_r8(struct rtl_hw *hw, u32 reg) { - if (HW_DASH_SUPPORT_TYPE_2(hw) || HW_DASH_SUPPORT_TYPE_4(hw)) + if (HW_DASH_SUPPORT_TYPE_2(hw)) return RTL_CMAC_R8(hw, reg); else if (HW_DASH_SUPPORT_TYPE_3(hw)) return rtl8168_csi_to_cmac_r8(hw, reg); @@ -270,9 +275,6 @@ rtl8125_notify_dash_oob_cmac(struct rtl_hw *hw, u32 cmd) static void rtl8125_notify_dash_oob_ipc2(struct rtl_hw *hw, u32 cmd) { - if (!HW_DASH_SUPPORT_TYPE_4(hw)) - return; - rtl_ocp_write(hw, IB2SOC_DATA, 4, cmd); rtl_ocp_write(hw, IB2SOC_CMD, 4, 0x00); rtl_ocp_write(hw, IB2SOC_SET, 4, 0x01); @@ -554,9 +556,6 @@ rtl8125_driver_stop(struct rtl_hw *hw) if (!hw->AllowAccessDashOcp) return; - if (HW_DASH_SUPPORT_CMAC(hw)) - rtl_dash2_disable_txrx(hw); - rtl8125_notify_dash_oob(hw, OOB_CMD_DRIVER_STOP); rtl_wait_dash_fw_ready(hw); diff --git a/drivers/net/r8169/r8169_dash.h b/drivers/net/r8169/r8169_dash.h index 47c5d6906e..7c31658573 100644 --- a/drivers/net/r8169/r8169_dash.h +++ b/drivers/net/r8169/r8169_dash.h @@ -20,6 +20,7 @@ #define HW_DASH_SUPPORT_TYPE_3(_M) ((_M)->HwSuppDashVer == 3) #define HW_DASH_SUPPORT_TYPE_4(_M) ((_M)->HwSuppDashVer == 4) #define HW_DASH_SUPPORT_CMAC(_M) (HW_DASH_SUPPORT_TYPE_2(_M) || HW_DASH_SUPPORT_TYPE_3(_M)) +#define HW_DASH_SUPPORT_IPC2(_M) (HW_DASH_SUPPORT_TYPE_4(_M)) #define HW_DASH_SUPPORT_GET_FIRMWARE_VERSION(_M) (HW_DASH_SUPPORT_TYPE_2(_M) || \ HW_DASH_SUPPORT_TYPE_3(_M) || \ HW_DASH_SUPPORT_TYPE_4(_M)) -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 5/8] net/r8169: add RTL8127AP dash support 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang ` (2 preceding siblings ...) 2025-06-10 6:01 ` [PATCH 4/8] net/r8169: remove cmac feature for RTL8125AP Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 6/8] net/r8169: add support for RTL8125CP Howard Wang ` (2 subsequent siblings) 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/r8169_dash.c | 1 + drivers/net/r8169/r8169_hw.c | 32 ++++++++++---------------------- drivers/net/r8169/r8169_phy.c | 34 ++-------------------------------- 3 files changed, 13 insertions(+), 54 deletions(-) diff --git a/drivers/net/r8169/r8169_dash.c b/drivers/net/r8169/r8169_dash.c index 1fdbe5c4ae..384344373f 100644 --- a/drivers/net/r8169/r8169_dash.c +++ b/drivers/net/r8169/r8169_dash.c @@ -32,6 +32,7 @@ rtl_is_allow_access_dash_ocp(struct rtl_hw *hw) break; case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_91: mac_ocp_data = rtl_mac_ocp_read(hw, 0xd4c0); if (mac_ocp_data == 0xffff || (mac_ocp_data & BIT_3)) allow_access = false; diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c index 002dc25ef7..e5a45f6810 100644 --- a/drivers/net/r8169/r8169_hw.c +++ b/drivers/net/r8169/r8169_hw.c @@ -334,6 +334,7 @@ rtl_oob_mutex_lock(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_91: ocp_reg_mutex_oob = 0x110; ocp_reg_mutex_ib = 0x114; ocp_reg_mutex_prio = 0x11C; @@ -392,6 +393,7 @@ rtl_oob_mutex_unlock(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_91: ocp_reg_mutex_ib = 0x114; ocp_reg_mutex_prio = 0x11C; break; @@ -1057,15 +1059,7 @@ rtl8125_hw_config(struct rtl_hw *hw) 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_oob_mutex_lock(hw); /* MAC_PWRDWN_CR0 */ rtl_mac_ocp_write(hw, 0xE0C0, 0x4000); @@ -1073,15 +1067,7 @@ rtl8125_hw_config(struct rtl_hw *hw) rtl_set_mac_ocp_bit(hw, 0xE052, (BIT_6 | BIT_5)); rtl_clear_mac_ocp_bit(hw, 0xE052, (BIT_3 | BIT_7)); - 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_oob_mutex_unlock(hw); /* * DMY_PWR_REG_0 @@ -1574,9 +1560,12 @@ rtl_init_software_variable(struct rtl_hw *hw) break; case CFG_METHOD_48: case CFG_METHOD_49: + case CFG_METHOD_91: tmp = (u8)rtl_mac_ocp_read(hw, 0xD006); if (tmp == 0x02 || tmp == 0x04) hw->HwSuppDashVer = 2; + else if (tmp == 0x03) + hw->HwSuppDashVer = 4; break; case CFG_METHOD_54: case CFG_METHOD_55: @@ -1615,6 +1604,8 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_23: case CFG_METHOD_27: case CFG_METHOD_28: + case CFG_METHOD_54: + case CFG_METHOD_55: hw->HwSuppOcpChannelVer = 2; break; case CFG_METHOD_31: @@ -1625,13 +1616,10 @@ rtl_init_software_variable(struct rtl_hw *hw) break; case CFG_METHOD_48: case CFG_METHOD_49: + case CFG_METHOD_91: if (HW_DASH_SUPPORT_DASH(hw)) hw->HwSuppOcpChannelVer = 2; break; - case CFG_METHOD_54: - case CFG_METHOD_55: - hw->HwSuppOcpChannelVer = 2; - break; default: hw->HwSuppOcpChannelVer = 0; break; diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c index 44ffd49a56..677bca7800 100644 --- a/drivers/net/r8169/r8169_phy.c +++ b/drivers/net/r8169/r8169_phy.c @@ -1207,41 +1207,11 @@ rtl_disable_adv_eee(struct rtl_hw *hw) if (hw->mcfg < CFG_METHOD_25 || hw->mcfg == CFG_METHOD_37) return; - switch (hw->mcfg) { - case CFG_METHOD_23: - case CFG_METHOD_27: - case CFG_METHOD_28: - case CFG_METHOD_31: - case CFG_METHOD_32: - case CFG_METHOD_33: - case CFG_METHOD_34: - case CFG_METHOD_48: - case CFG_METHOD_49: - case CFG_METHOD_52: - case CFG_METHOD_54: - case CFG_METHOD_55: - rtl_oob_mutex_lock(hw); - break; - } + rtl_oob_mutex_lock(hw); _rtl_disable_adv_eee(hw); - switch (hw->mcfg) { - case CFG_METHOD_23: - case CFG_METHOD_27: - case CFG_METHOD_28: - case CFG_METHOD_31: - case CFG_METHOD_32: - case CFG_METHOD_33: - case CFG_METHOD_34: - case CFG_METHOD_48: - case CFG_METHOD_49: - case CFG_METHOD_52: - case CFG_METHOD_54: - case CFG_METHOD_55: - rtl_oob_mutex_unlock(hw); - break; - } + rtl_oob_mutex_unlock(hw); } static void -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 6/8] net/r8169: add support for RTL8125CP 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang ` (3 preceding siblings ...) 2025-06-10 6:01 ` [PATCH 5/8] net/r8169: add RTL8127AP dash support Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 7/8] net/r8169: add support for RTL8127ATF serdes interface Howard Wang 2025-06-10 6:01 ` [PATCH 8/8] net/r8169: update HW configuration for 8127 Howard Wang 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/base/rtl8125cp.c | 73 ++++++++++++++++++++++++ drivers/net/r8169/base/rtl8125cp_mcu.c | 78 ++++++++++++++++++++++++++ drivers/net/r8169/base/rtl8125cp_mcu.h | 10 ++++ drivers/net/r8169/meson.build | 2 + drivers/net/r8169/r8169_compat.h | 1 + drivers/net/r8169/r8169_ethdev.c | 2 + drivers/net/r8169/r8169_hw.c | 43 ++++++++++++-- drivers/net/r8169/r8169_hw.h | 2 + drivers/net/r8169/r8169_phy.c | 38 ++++--------- 9 files changed, 217 insertions(+), 32 deletions(-) create mode 100644 drivers/net/r8169/base/rtl8125cp.c create mode 100644 drivers/net/r8169/base/rtl8125cp_mcu.c create mode 100644 drivers/net/r8169/base/rtl8125cp_mcu.h diff --git a/drivers/net/r8169/base/rtl8125cp.c b/drivers/net/r8169/base/rtl8125cp.c new file mode 100644 index 0000000000..aabee94f4c --- /dev/null +++ b/drivers/net/r8169/base/rtl8125cp.c @@ -0,0 +1,73 @@ +/* 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 "rtl8125cp_mcu.h" + +/* For RTL8125CP, CFG_METHOD_58 */ + +static void +hw_init_rxcfg_8125cp(struct rtl_hw *hw) +{ + RTL_W32(hw, RxConfig, Rx_Fetch_Number_8 | Rx_Close_Multiple | + RxCfg_pause_slot_en | (RX_DMA_BURST_256 << RxCfgDMAShift)); +} + +static void +hw_ephy_config_8125cp(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_58: + /* nothing to do */ + break; + } +} + +static void +rtl_hw_phy_config_8125cp_1(struct rtl_hw *hw) +{ + rtl_set_eth_phy_ocp_bit(hw, 0xA442, BIT_11); + + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xad0e, 0x007F, 0x000B); + rtl_set_eth_phy_ocp_bit(hw, 0xad78, BIT_4); +} + +static void +hw_phy_config_8125cp(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_58: + rtl_hw_phy_config_8125cp_1(hw); + break; + } +} + +static void +hw_mac_mcu_config_8125cp(struct rtl_hw *hw) +{ + if (hw->NotWrMcuPatchCode) + return; + + rtl_hw_disable_mac_mcu_bps(hw); +} + +static void +hw_phy_mcu_config_8125cp(struct rtl_hw *hw) +{ + switch (hw->mcfg) { + case CFG_METHOD_58: + rtl_set_phy_mcu_8125cp_1(hw); + break; + } +} + +const struct rtl_hw_ops rtl8125cp_ops = { + .hw_init_rxcfg = hw_init_rxcfg_8125cp, + .hw_ephy_config = hw_ephy_config_8125cp, + .hw_phy_config = hw_phy_config_8125cp, + .hw_mac_mcu_config = hw_mac_mcu_config_8125cp, + .hw_phy_mcu_config = hw_phy_mcu_config_8125cp, +}; diff --git a/drivers/net/r8169/base/rtl8125cp_mcu.c b/drivers/net/r8169/base/rtl8125cp_mcu.c new file mode 100644 index 0000000000..e4609f46de --- /dev/null +++ b/drivers/net/r8169/base/rtl8125cp_mcu.c @@ -0,0 +1,78 @@ +/* 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 "rtl8125cp_mcu.h" + +/* For RTL8125CP, CFG_METHOD_58 */ + +/* ------------------------------------MAC 8125CP------------------------------------- */ + +/* No mac mcu patch code */ + +/* ------------------------------------PHY 8125CP------------------------------------- */ + +static const u16 phy_mcu_ram_code_8125cp_1_1[] = { + 0xa436, 0x8023, 0xa438, 0x2300, 0xa436, 0xB82E, 0xa438, 0x0001, + 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, + 0xa438, 0x07f8, 0xa436, 0xA014, 0xa438, 0xcc01, 0xa438, 0x2166, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa436, 0xA152, 0xa438, 0x021c, + 0xa436, 0xA154, 0xa438, 0x2170, 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, 0x0003, + 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x0000, + 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, + 0xa438, 0x801b, 0xa438, 0x1800, 0xa438, 0x802b, 0xa438, 0x1800, + 0xa438, 0x8031, 0xa438, 0x1800, 0xa438, 0x8031, 0xa438, 0x1800, + 0xa438, 0x8031, 0xa438, 0x1800, 0xa438, 0x8031, 0xa438, 0x1800, + 0xa438, 0x8031, 0xa438, 0x800a, 0xa438, 0x8530, 0xa438, 0x0c03, + 0xa438, 0x1502, 0xa438, 0x8d10, 0xa438, 0x9503, 0xa438, 0xd700, + 0xa438, 0x6050, 0xa438, 0xaa20, 0xa438, 0x1800, 0xa438, 0x0d53, + 0xa438, 0xd707, 0xa438, 0x40f6, 0xa438, 0x8901, 0xa438, 0xd704, + 0xa438, 0x6091, 0xa438, 0x8306, 0xa438, 0x8b02, 0xa438, 0x8290, + 0xa438, 0x1000, 0xa438, 0x0e4d, 0xa438, 0x1000, 0xa438, 0x1277, + 0xa438, 0xd704, 0xa438, 0x7e77, 0xa438, 0x1800, 0xa438, 0x0dc5, + 0xa438, 0xd700, 0xa438, 0x4063, 0xa438, 0x1800, 0xa438, 0x0d15, + 0xa438, 0x1800, 0xa438, 0x0d18, 0xa436, 0xA10E, 0xa438, 0xffff, + 0xa436, 0xA10C, 0xa438, 0xffff, 0xa436, 0xA10A, 0xa438, 0xffff, + 0xa436, 0xA108, 0xa438, 0xffff, 0xa436, 0xA106, 0xa438, 0xffff, + 0xa436, 0xA104, 0xa438, 0x0d13, 0xa436, 0xA102, 0xa438, 0x0dbf, + 0xa436, 0xA100, 0xa438, 0x0d52, 0xa436, 0xA110, 0xa438, 0x0007, + 0xa436, 0xb87c, 0xa438, 0x85bd, 0xa436, 0xb87e, 0xa438, 0xaf85, + 0xa438, 0xd5af, 0xa438, 0x85fb, 0xa438, 0xaf85, 0xa438, 0xfbaf, + 0xa438, 0x85fb, 0xa438, 0xaf85, 0xa438, 0xfbaf, 0xa438, 0x85fb, + 0xa438, 0xaf85, 0xa438, 0xfbaf, 0xa438, 0x85fb, 0xa438, 0xac28, + 0xa438, 0x0bd4, 0xa438, 0x0294, 0xa438, 0xbf85, 0xa438, 0xf802, + 0xa438, 0x61c2, 0xa438, 0xae09, 0xa438, 0xd414, 0xa438, 0x50bf, + 0xa438, 0x85f8, 0xa438, 0x0261, 0xa438, 0xc2bf, 0xa438, 0x60de, + 0xa438, 0x0261, 0xa438, 0xe1bf, 0xa438, 0x80cf, 0xa438, 0xaf24, + 0xa438, 0xe8f0, 0xa438, 0xac52, 0xa436, 0xb85e, 0xa438, 0x24e5, + 0xa436, 0xb860, 0xa438, 0xffff, 0xa436, 0xb862, 0xa438, 0xffff, + 0xa436, 0xb864, 0xa438, 0xffff, 0xa436, 0xb886, 0xa438, 0xffff, + 0xa436, 0xb888, 0xa438, 0xffff, 0xa436, 0xb88a, 0xa438, 0xffff, + 0xa436, 0xb88c, 0xa438, 0xffff, 0xa436, 0xb838, 0xa438, 0x0001, + 0xb820, 0x0010, 0xB82E, 0x0000, 0xa436, 0x8023, 0xa438, 0x0000, + 0xB820, 0x0000, 0xFFFF, 0xFFFF +}; + +static void +rtl_real_set_phy_mcu_8125cp_1_1(struct rtl_hw *hw) +{ + rtl_set_phy_mcu_ram_code(hw, phy_mcu_ram_code_8125cp_1_1, + ARRAY_SIZE(phy_mcu_ram_code_8125cp_1_1)); +} + +void +rtl_set_phy_mcu_8125cp_1(struct rtl_hw *hw) +{ + rtl_set_phy_mcu_patch_request(hw); + + rtl_real_set_phy_mcu_8125cp_1_1(hw); + + rtl_clear_phy_mcu_patch_request(hw); +} diff --git a/drivers/net/r8169/base/rtl8125cp_mcu.h b/drivers/net/r8169/base/rtl8125cp_mcu.h new file mode 100644 index 0000000000..8114dab2b9 --- /dev/null +++ b/drivers/net/r8169/base/rtl8125cp_mcu.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef RTL8125CP_MCU_H +#define RTL8125CP_MCU_H + +void rtl_set_phy_mcu_8125cp_1(struct rtl_hw *hw); + +#endif /* RTL8125CP_MCU_H */ diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build index 5662ecf0f5..e139452416 100644 --- a/drivers/net/r8169/meson.build +++ b/drivers/net/r8169/meson.build @@ -15,6 +15,8 @@ sources = files( 'base/rtl8125bp_mcu.c', 'base/rtl8125d.c', 'base/rtl8125d_mcu.c', + 'base/rtl8125cp.c', + 'base/rtl8125cp_mcu.c', 'base/rtl8126a.c', 'base/rtl8126a_mcu.c', 'base/rtl8168kb.c', diff --git a/drivers/net/r8169/r8169_compat.h b/drivers/net/r8169/r8169_compat.h index 8d06120518..e085f6242a 100644 --- a/drivers/net/r8169/r8169_compat.h +++ b/drivers/net/r8169/r8169_compat.h @@ -514,6 +514,7 @@ enum RTL_chipset_name { RTL8168KB, RTL8125BP, RTL8125D, + RTL8125CP, RTL8126A, RTL8168EP, RTL8168FP, diff --git a/drivers/net/r8169/r8169_ethdev.c b/drivers/net/r8169/r8169_ethdev.c index 1f4c7eb885..8071e14412 100644 --- a/drivers/net/r8169/r8169_ethdev.c +++ b/drivers/net/r8169/r8169_ethdev.c @@ -160,6 +160,7 @@ _rtl_setup_link(struct rte_eth_dev *dev) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: speed_mode = SPEED_2500; break; case CFG_METHOD_69: @@ -435,6 +436,7 @@ rtl_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) case RTL8125B: case RTL8125BP: case RTL8125D: + case RTL8125CP: dev_info->speed_capa |= RTE_ETH_LINK_SPEED_2_5G; break; } diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c index e5a45f6810..c131353ef8 100644 --- a/drivers/net/r8169/r8169_hw.c +++ b/drivers/net/r8169/r8169_hw.c @@ -334,6 +334,7 @@ rtl_oob_mutex_lock(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_58: case CFG_METHOD_91: ocp_reg_mutex_oob = 0x110; ocp_reg_mutex_ib = 0x114; @@ -393,6 +394,7 @@ rtl_oob_mutex_unlock(struct rtl_hw *hw) case CFG_METHOD_52: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_58: case CFG_METHOD_91: ocp_reg_mutex_ib = 0x114; ocp_reg_mutex_prio = 0x11C; @@ -645,6 +647,7 @@ rtl_stop_all_request(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -698,6 +701,7 @@ rtl_wait_txrx_fifo_empty(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -807,6 +811,7 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: if (enable) { RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7); @@ -818,6 +823,7 @@ rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable) break; case CFG_METHOD_70: case CFG_METHOD_71: + case CFG_METHOD_91: if (enable) { RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) | BIT_3); RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0); @@ -877,6 +883,7 @@ rtl_hw_clear_timer_int(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -999,6 +1006,7 @@ rtl8125_hw_config(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_70: case CFG_METHOD_71: case CFG_METHOD_91: @@ -1006,18 +1014,14 @@ rtl8125_hw_config(struct rtl_hw *hw) break; } - if (hw->mcfg >= CFG_METHOD_91) { + if (hw->mcfg == CFG_METHOD_58 || 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); + mac_ocp_data |= ((0x02 & 0x03) << 4); rtl_mac_ocp_write(hw, 0xE63E, mac_ocp_data); /* @@ -1279,6 +1283,10 @@ rtl_set_hw_ops(struct rtl_hw *hw) case CFG_METHOD_57: hw->hw_ops = rtl8125d_ops; return 0; + /* 8125CP */ + case CFG_METHOD_58: + hw->hw_ops = rtl8125cp_ops; + return 0; /* 8126A */ case CFG_METHOD_69: case CFG_METHOD_70: @@ -1324,6 +1332,7 @@ rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1531,6 +1540,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: speed_mode = SPEED_2500; break; case CFG_METHOD_69: @@ -1606,6 +1616,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_28: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_58: hw->HwSuppOcpChannelVer = 2; break; case CFG_METHOD_31: @@ -1683,6 +1694,9 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_57: hw->chipset_name = RTL8125D; break; + case CFG_METHOD_58: + hw->chipset_name = RTL8125CP; + break; case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1728,6 +1742,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1745,6 +1760,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: hw->HwSuppMaxPhyLinkSpeed = SPEED_2500; break; case CFG_METHOD_69: @@ -1773,6 +1789,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_91: hw->HwSuppTxNoCloseVer = 6; break; @@ -1882,6 +1899,9 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_57: hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_57; break; + case CFG_METHOD_58: + hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_58; + break; case CFG_METHOD_69: hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_69; break; @@ -1932,6 +1952,7 @@ rtl_init_software_variable(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_91: hw->HwSuppIntMitiVer = 6; break; @@ -1976,6 +1997,7 @@ rtl_exit_realwow(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -2108,6 +2130,7 @@ rtl_disable_ups(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -2477,6 +2500,14 @@ rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev) hw->HwIcVerUnknown = TRUE; } break; + case 0x70800000: + if (ic_version_id == 0x00000000) { + hw->mcfg = CFG_METHOD_58; + } else { + hw->mcfg = CFG_METHOD_58; + hw->HwIcVerUnknown = TRUE; + } + break; case 0x64800000: if (ic_version_id == 0x00000000) { hw->mcfg = CFG_METHOD_69; diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h index f775c1a547..6f2d38ac81 100644 --- a/drivers/net/r8169/r8169_hw.h +++ b/drivers/net/r8169/r8169_hw.h @@ -91,6 +91,7 @@ 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; +extern const struct rtl_hw_ops rtl8125cp_ops; #define NO_BASE_ADDRESS 0x00000000 #define RTL8168FP_OOBMAC_BASE 0xBAF70000 @@ -132,6 +133,7 @@ extern const struct rtl_hw_ops rtl8127_ops; #define NIC_RAMCODE_VERSION_CFG_METHOD_55 (0x0001) #define NIC_RAMCODE_VERSION_CFG_METHOD_56 (0x0027) #define NIC_RAMCODE_VERSION_CFG_METHOD_57 (0x0027) +#define NIC_RAMCODE_VERSION_CFG_METHOD_58 (0x0008) #define NIC_RAMCODE_VERSION_CFG_METHOD_69 (0x0023) #define NIC_RAMCODE_VERSION_CFG_METHOD_70 (0x0033) #define NIC_RAMCODE_VERSION_CFG_METHOD_71 (0x0060) diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c index 677bca7800..cc06c7b55a 100644 --- a/drivers/net/r8169/r8169_phy.c +++ b/drivers/net/r8169/r8169_phy.c @@ -495,6 +495,7 @@ rtl_wait_phy_ups_resume(struct rtl_hw *hw, u16 PhyState) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -529,32 +530,7 @@ rtl_phy_power_up(struct rtl_hw *hw) } /* Wait ups resume (phy state 3) */ - 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_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: - case CFG_METHOD_91: - rtl_wait_phy_ups_resume(hw, 3); - break; - } + rtl_wait_phy_ups_resume(hw, 3); } void @@ -586,6 +562,7 @@ rtl_powerup_pll(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -652,6 +629,7 @@ rtl_phy_power_down(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -699,6 +677,7 @@ rtl_powerdown_pll(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -738,6 +717,7 @@ rtl_powerdown_pll(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1103,6 +1083,7 @@ rtl_is_adv_eee_enabled(struct rtl_hw *hw) case CFG_METHOD_53: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1187,6 +1168,9 @@ _rtl_disable_adv_eee(struct rtl_hw *hw) case CFG_METHOD_53: case CFG_METHOD_54: case CFG_METHOD_55: + case CFG_METHOD_56: + case CFG_METHOD_57: + case CFG_METHOD_58: case CFG_METHOD_69: case CFG_METHOD_70: case CFG_METHOD_71: @@ -1272,6 +1256,7 @@ rtl_disable_eee(struct rtl_hw *hw) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: rtl_clear_mac_ocp_bit(hw, 0xE040, (BIT_1 | BIT_0)); rtl_set_eth_phy_ocp_bit(hw, 0xA432, BIT_4); @@ -1432,6 +1417,7 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv) case CFG_METHOD_55: case CFG_METHOD_56: case CFG_METHOD_57: + case CFG_METHOD_58: mask |= BIT_0; rtl_clear_eth_phy_ocp_bit(hw, 0xA428, BIT_9); rtl_clear_eth_phy_ocp_bit(hw, 0xA5EA, mask); -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 7/8] net/r8169: add support for RTL8127ATF serdes interface 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang ` (4 preceding siblings ...) 2025-06-10 6:01 ` [PATCH 6/8] net/r8169: add support for RTL8125CP Howard Wang @ 2025-06-10 6:01 ` Howard Wang 2025-06-10 6:01 ` [PATCH 8/8] net/r8169: update HW configuration for 8127 Howard Wang 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/meson.build | 1 + drivers/net/r8169/r8169_ethdev.h | 3 + drivers/net/r8169/r8169_fiber.c | 201 +++++++++++++++++++++++++++++++ drivers/net/r8169/r8169_fiber.h | 42 +++++++ drivers/net/r8169/r8169_hw.c | 93 +++++++++----- drivers/net/r8169/r8169_hw.h | 2 +- drivers/net/r8169/r8169_phy.c | 14 ++- 7 files changed, 324 insertions(+), 32 deletions(-) create mode 100644 drivers/net/r8169/r8169_fiber.c create mode 100644 drivers/net/r8169/r8169_fiber.h diff --git a/drivers/net/r8169/meson.build b/drivers/net/r8169/meson.build index e139452416..ed644059f5 100644 --- a/drivers/net/r8169/meson.build +++ b/drivers/net/r8169/meson.build @@ -7,6 +7,7 @@ sources = files( 'r8169_rxtx.c', 'r8169_phy.c', 'r8169_dash.c', + 'r8169_fiber.c', 'base/rtl8125a.c', 'base/rtl8125a_mcu.c', 'base/rtl8125b.c', diff --git a/drivers/net/r8169/r8169_ethdev.h b/drivers/net/r8169/r8169_ethdev.h index bc65ccf68a..84a233dfed 100644 --- a/drivers/net/r8169/r8169_ethdev.h +++ b/drivers/net/r8169/r8169_ethdev.h @@ -90,6 +90,9 @@ struct rtl_hw { u8 AllowAccessDashOcp; u8 HwPkgDet; u8 HwSuppSerDesPhyVer; + + /* Fiber */ + u32 HwFiberModeVer; }; struct rtl_sw_stats { diff --git a/drivers/net/r8169/r8169_fiber.c b/drivers/net/r8169/r8169_fiber.c new file mode 100644 index 0000000000..9108fa6bba --- /dev/null +++ b/drivers/net/r8169/r8169_fiber.c @@ -0,0 +1,201 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#include <stdio.h> +#include <errno.h> +#include <stdint.h> + +#include <rte_ether.h> +#include <ethdev_driver.h> + +#include "r8169_fiber.h" + +static bool +rtl8127_wait_8127_sds_cmd_done(struct rtl_hw *hw) +{ + u32 timeout = 0; + u32 waitcount = 100; + + do { + if (RTL_R16(hw, R8127_SDS_8127_CMD) & R8127_SDS_8127_CMD_IN) + rte_delay_us(1); + else + return true; + } while (++timeout < waitcount); + + return false; +} + +static u16 +rtl8127_sds_phy_read_8127(struct rtl_hw *hw, u16 index, u16 page, u16 reg) +{ + RTL_W16(hw, R8127_SDS_8127_ADDR, + R8127_MAKE_SDS_8127_ADDR(index, page, reg)); + RTL_W16(hw, R8127_SDS_8127_CMD, R8127_SDS_8127_CMD_IN); + + if (rtl8127_wait_8127_sds_cmd_done(hw)) + return RTL_R16(hw, R8127_SDS_8127_DATA_OUT); + else + return 0xffff; +} + +static void +rtl8127_sds_phy_write_8127(struct rtl_hw *hw, u16 index, u16 page, u16 reg, + u16 val) +{ + RTL_W16(hw, R8127_SDS_8127_DATA_IN, val); + RTL_W16(hw, R8127_SDS_8127_ADDR, + R8127_MAKE_SDS_8127_ADDR(index, page, reg)); + RTL_W16(hw, R8127_SDS_8127_CMD, + R8127_SDS_8127_CMD_IN | R8127_SDS_8127_WE_IN); + + rtl8127_wait_8127_sds_cmd_done(hw); +} + +static void +rtl8127_clear_and_set_sds_phy_bit(struct rtl_hw *hw, u16 index, u16 page, + u16 addr, u16 clearmask, u16 setmask) +{ + u16 val; + + val = rtl8127_sds_phy_read_8127(hw, index, page, addr); + val &= ~clearmask; + val |= setmask; + rtl8127_sds_phy_write_8127(hw, index, page, addr, val); +} + +static void +rtl8127_clear_sds_phy_bit(struct rtl_hw *hw, u16 index, u16 page, + u16 addr, u16 mask) +{ + rtl8127_clear_and_set_sds_phy_bit(hw, index, page, addr, mask, 0); +} + +static void +rtl8127_set_sds_phy_bit(struct rtl_hw *hw, u16 index, u16 page, u16 addr, + u16 mask) +{ + rtl8127_clear_and_set_sds_phy_bit(hw, index, page, addr, 0, mask); +} + +static void +rtl8127_sds_phy_reset_8127(struct rtl_hw *hw) +{ + RTL_W8(hw, 0x2350, RTL_R8(hw, 0x2350) & ~BIT_0); + rte_delay_us(1); + + RTL_W16(hw, 0x233A, 0x801F); + RTL_W8(hw, 0x2350, RTL_R8(hw, 0x2350) | BIT_0); + rte_delay_us(10); +} + +static void +rtl8127_sds_phy_reset(struct rtl_hw *hw) +{ + switch (hw->HwFiberModeVer) { + case FIBER_MODE_RTL8127ATF: + rtl8127_sds_phy_reset_8127(hw); + break; + default: + break; + } +} + +static void +rtl8127_set_sds_phy_caps_1g_8127(struct rtl_hw *hw) +{ + u16 val; + + rtl8127_set_sds_phy_bit(hw, 0, 1, 31, BIT_3); + rtl8127_clear_and_set_sds_phy_bit(hw, 0, 2, 0, BIT_13 | BIT_12 | BIT_6, + BIT_12 | BIT_6); + RTL_W16(hw, 0x233A, 0x8004); + + val = RTL_R16(hw, 0x233E); + val &= (BIT_13 | BIT_12 | BIT_1 | BIT_0); + val |= BIT_1; + RTL_W16(hw, 0x233E, val); + + rtl_mdio_direct_write_phy_ocp(hw, 0xC40A, 0x0); + rtl_mdio_direct_write_phy_ocp(hw, 0xC466, 0x0); + rtl_mdio_direct_write_phy_ocp(hw, 0xC808, 0x0); + rtl_mdio_direct_write_phy_ocp(hw, 0xC80A, 0x0); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xC804, 0x000F, 0x000C); +} + +static void +rtl8127_sds_phy_exit_1g_8127(struct rtl_hw *hw) +{ + rtl8127_clear_sds_phy_bit(hw, 0, 1, 31, BIT_3); + rtl8127_clear_and_set_sds_phy_bit(hw, 0, 2, 0, BIT_13 | BIT_12 | BIT_6, + BIT_6); + + rtl8127_sds_phy_reset(hw); +} + +static void +rtl8127_set_sds_phy_caps_10g_8127(struct rtl_hw *hw) +{ + u16 val; + + RTL_W16(hw, 0x233A, 0x801A); + + val = RTL_R16(hw, 0x233E); + val &= (BIT_13 | BIT_12 | BIT_1 | BIT_0); + val |= BIT_12; + RTL_W16(hw, 0x233E, val); + + rtl_mdio_direct_write_phy_ocp(hw, 0xC40A, 0x0); + rtl_mdio_direct_write_phy_ocp(hw, 0xC466, 0x3); + rtl_mdio_direct_write_phy_ocp(hw, 0xC808, 0x0); + rtl_mdio_direct_write_phy_ocp(hw, 0xC80A, 0x0); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xC804, 0x000F, 0x000C); +} + +static void +rtl8127_set_sds_phy_caps_8127(struct rtl_hw *hw) +{ + rtl8127_sds_phy_exit_1g_8127(hw); + + switch (hw->speed) { + case SPEED_10000: + rtl8127_set_sds_phy_caps_10g_8127(hw); + break; + case SPEED_1000: + rtl8127_set_sds_phy_caps_1g_8127(hw); + break; + default: + break; + } +} + +static void +rtl8127_set_sds_phy_caps(struct rtl_hw *hw) +{ + switch (hw->HwFiberModeVer) { + case FIBER_MODE_RTL8127ATF: + rtl8127_set_sds_phy_caps_8127(hw); + break; + default: + break; + } +} + +static void +rtl8127_hw_sds_phy_config(struct rtl_hw *hw) +{ + rtl8127_set_sds_phy_caps(hw); +} + +void +rtl8127_hw_fiber_phy_config(struct rtl_hw *hw) +{ + switch (hw->HwFiberModeVer) { + case FIBER_MODE_RTL8127ATF: + rtl8127_hw_sds_phy_config(hw); + break; + default: + break; + } +} diff --git a/drivers/net/r8169/r8169_fiber.h b/drivers/net/r8169/r8169_fiber.h new file mode 100644 index 0000000000..52bafc7e4c --- /dev/null +++ b/drivers/net/r8169/r8169_fiber.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2024 Realtek Corporation. All rights reserved + */ + +#ifndef R8169_FIBER_H +#define R8169_FIBER_H + +#include <stdint.h> + +#include <bus_pci_driver.h> +#include <rte_ethdev.h> +#include <rte_ethdev_core.h> + +#include "r8169_compat.h" +#include "r8169_ethdev.h" +#include "r8169_phy.h" +#include "r8169_hw.h" + +enum { + FIBER_MODE_NIC_ONLY = 0, + FIBER_MODE_RTL8127ATF, + FIBER_MODE_MAX +}; + +#define HW_FIBER_MODE_ENABLED(_M) ((_M)->HwFiberModeVer > 0) + +/* sds address */ +#define R8127_SDS_8127_CMD 0x2348 +#define R8127_SDS_8127_ADDR 0x234A +#define R8127_SDS_8127_DATA_IN 0x234C +#define R8127_SDS_8127_DATA_OUT 0x234E + +#define R8127_MAKE_SDS_8127_ADDR(_index, _page, _reg) \ + (((_index) << 11) | ((_page) << 5) | (_reg)) + +/* sds command */ +#define R8127_SDS_8127_CMD_IN BIT_0 +#define R8127_SDS_8127_WE_IN BIT_1 + +void rtl8127_hw_fiber_phy_config(struct rtl_hw *hw); + +#endif /* R8169_FIBER_H */ diff --git a/drivers/net/r8169/r8169_hw.c b/drivers/net/r8169/r8169_hw.c index c131353ef8..e25336ac19 100644 --- a/drivers/net/r8169/r8169_hw.c +++ b/drivers/net/r8169/r8169_hw.c @@ -12,6 +12,7 @@ #include "r8169_hw.h" #include "r8169_logs.h" #include "r8169_dash.h" +#include "r8169_fiber.h" static u32 rtl_eri_read_with_oob_base_address(struct rtl_hw *hw, int addr, int len, @@ -1439,18 +1440,28 @@ rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt) } bool -rtl_is_speed_mode_valid(u32 speed) -{ - switch (speed) { - case SPEED_10000: - case SPEED_5000: - case SPEED_2500: - case SPEED_1000: - case SPEED_100: - case SPEED_10: - return true; - default: - return false; +rtl_is_speed_mode_valid(struct rtl_hw *hw, u32 speed) +{ + if (HW_FIBER_MODE_ENABLED(hw)) { + switch (speed) { + case SPEED_10000: + case SPEED_1000: + return true; + default: + return false; + } + } else { + switch (speed) { + case SPEED_10000: + case SPEED_5000: + case SPEED_2500: + case SPEED_1000: + case SPEED_100: + case SPEED_10: + return true; + default: + return false; + } } } @@ -1482,9 +1493,9 @@ void rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, enum rtl_fc_mode fc) { - u64 adv; + u64 adv = 0; - if (!rtl_is_speed_mode_valid(speed)) + if (!rtl_is_speed_mode_valid(hw, speed)) speed = hw->HwSuppMaxPhyLinkSpeed; if (!rtl_is_duplex_mode_valid(duplex)) @@ -1495,22 +1506,34 @@ rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, speed = RTE_MIN(speed, hw->HwSuppMaxPhyLinkSpeed); - adv = 0; - switch (speed) { - case SPEED_10000: - adv |= ADVERTISE_10000_FULL; - /* Fall through */ - case SPEED_5000: - adv |= ADVERTISE_5000_FULL; - /* Fall through */ - case SPEED_2500: - adv |= ADVERTISE_2500_FULL; - /* Fall through */ - default: - adv |= (ADVERTISE_10_HALF | ADVERTISE_10_FULL | - ADVERTISE_100_HALF | ADVERTISE_100_FULL | - ADVERTISE_1000_HALF | ADVERTISE_1000_FULL); - break; + if (HW_FIBER_MODE_ENABLED(hw)) { + switch (speed) { + case SPEED_10000: + adv |= ADVERTISE_10000_FULL; + /* Fall through */ + case SPEED_1000: + adv |= ADVERTISE_1000_FULL; + break; + default: + break; + } + } else { + switch (speed) { + case SPEED_10000: + adv |= ADVERTISE_10000_FULL; + /* Fall through */ + case SPEED_5000: + adv |= ADVERTISE_5000_FULL; + /* Fall through */ + case SPEED_2500: + adv |= ADVERTISE_2500_FULL; + /* Fall through */ + default: + adv |= (ADVERTISE_10_HALF | ADVERTISE_10_FULL | + ADVERTISE_100_HALF | ADVERTISE_100_FULL | + ADVERTISE_1000_HALF | ADVERTISE_1000_FULL); + break; + } } hw->autoneg = autoneg; @@ -1962,6 +1985,16 @@ rtl_init_software_variable(struct rtl_hw *hw) break; } + switch (hw->mcfg) { + case CFG_METHOD_91: + tmp = (u8)rtl_mac_ocp_read(hw, 0xD006); + if (tmp == 0x07) + hw->HwFiberModeVer = FIBER_MODE_RTL8127ATF; + break; + default: + break; + } + rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, rtl_fc_full); hw->mtu = RTL_DEFAULT_MTU; diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h index 6f2d38ac81..558ffaac95 100644 --- a/drivers/net/r8169/r8169_hw.h +++ b/drivers/net/r8169/r8169_hw.h @@ -47,7 +47,7 @@ void rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, void rtl_hw_initialize(struct rtl_hw *hw); -bool rtl_is_speed_mode_valid(u32 speed); +bool rtl_is_speed_mode_valid(struct rtl_hw *hw, u32 speed); void rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev); int rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea); diff --git a/drivers/net/r8169/r8169_phy.c b/drivers/net/r8169/r8169_phy.c index cc06c7b55a..e547b44137 100644 --- a/drivers/net/r8169/r8169_phy.c +++ b/drivers/net/r8169/r8169_phy.c @@ -14,6 +14,7 @@ #include "r8169_phy.h" #include "r8169_logs.h" #include "r8169_dash.h" +#include "r8169_fiber.h" static u16 rtl_map_phy_ocp_addr(u16 PageNum, u8 RegNum) @@ -1327,6 +1328,9 @@ rtl_hw_phy_config(struct rtl_hw *hw) if (rtl_is_8125(hw)) rtl_clear_eth_phy_ocp_bit(hw, 0xA5B4, BIT_15); + if (HW_FIBER_MODE_ENABLED(hw)) + rtl8127_hw_fiber_phy_config(hw); + rtl_mdio_write(hw, 0x1F, 0x0000); if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(hw)) @@ -1424,12 +1428,15 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv) break; } - if (!rtl_is_speed_mode_valid(speed)) { + if (!rtl_is_speed_mode_valid(hw, speed)) { speed = hw->HwSuppMaxPhyLinkSpeed; duplex = DUPLEX_FULL; adv |= hw->advertising; } + if (HW_FIBER_MODE_ENABLED(hw)) + goto set_speed; + giga_ctrl = rtl_mdio_read(hw, MII_CTRL1000); giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); if (rtl_is_8125(hw)) { @@ -1482,11 +1489,16 @@ rtl_set_speed_xmii(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex, u64 adv) else goto out; } + +set_speed: hw->autoneg = autoneg; hw->speed = speed; hw->duplex = duplex; hw->advertising = adv; + if (HW_FIBER_MODE_ENABLED(hw)) + rtl8127_hw_fiber_phy_config(hw); + rc = 0; out: return rc; -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 8/8] net/r8169: update HW configuration for 8127 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang ` (5 preceding siblings ...) 2025-06-10 6:01 ` [PATCH 7/8] net/r8169: add support for RTL8127ATF serdes interface Howard Wang @ 2025-06-10 6:01 ` Howard Wang 6 siblings, 0 replies; 8+ messages in thread From: Howard Wang @ 2025-06-10 6:01 UTC (permalink / raw) To: dev; +Cc: pro_nic_dpdk, Howard Wang Signed-off-by: Howard Wang <howard_wang@realsil.com.cn> --- drivers/net/r8169/base/rtl8127.c | 44 ++++++++--- drivers/net/r8169/base/rtl8127_mcu.c | 109 ++++++++++++--------------- drivers/net/r8169/r8169_hw.h | 2 +- drivers/net/r8169/r8169_phy.c | 1 - 4 files changed, 80 insertions(+), 76 deletions(-) diff --git a/drivers/net/r8169/base/rtl8127.c b/drivers/net/r8169/base/rtl8127.c index fac6165931..9e79255e3c 100644 --- a/drivers/net/r8169/base/rtl8127.c +++ b/drivers/net/r8169/base/rtl8127.c @@ -102,6 +102,13 @@ rtl_hw_phy_config_8127a_1(struct rtl_hw *hw) rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x83EF); rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0x0E00); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF38, 0x01F0, 0x0160); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF3A, 0x001F, 0x0014); + rtl_clear_eth_phy_ocp_bit(hw, 0xBF28, 0x6000); + rtl_clear_eth_phy_ocp_bit(hw, 0xBF2C, 0xC000); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF28, 0x1FFF, 0x0187); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xBF2A, 0x003F, 0x0003); + 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); @@ -205,7 +212,7 @@ rtl_hw_phy_config_8127a_1(struct rtl_hw *hw) 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_clear_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); @@ -241,6 +248,16 @@ rtl_hw_phy_config_8127a_1(struct rtl_hw *hw) 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, 0xB87C, 0x8FED); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x4E00); + + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88AC); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x2300); + rtl_set_eth_phy_ocp_bit(hw, 0xBF0C, 0x3800); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88DE); + rtl_clear_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x80B4); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x5195); rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x8370); rtl_mdio_direct_write_phy_ocp(hw, 0xA438, 0x8671); @@ -300,21 +317,24 @@ rtl_hw_phy_config_8127a_1(struct rtl_hw *hw) 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, 0xB87E, 0xFFFF); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF2); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0A4A); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF4); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xAA5A); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF6); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0x0A4A); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x8FF8); + rtl_mdio_direct_write_phy_ocp(hw, 0xB87E, 0xAA5A); rtl_mdio_direct_write_phy_ocp(hw, 0xB87C, 0x88D5); rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xB87E, 0xFF00, 0x0200); + rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x84BB); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x0A00); + rtl_mdio_direct_write_phy_ocp(hw, 0xA436, 0x84C0); + rtl_clear_and_set_eth_phy_ocp_bit(hw, 0xA438, 0xFF00, 0x1600); + rtl_set_eth_phy_ocp_bit(hw, 0xA430, BIT_1 | BIT_0); } diff --git a/drivers/net/r8169/base/rtl8127_mcu.c b/drivers/net/r8169/base/rtl8127_mcu.c index 44e6d96d9e..facbae8132 100644 --- a/drivers/net/r8169/base/rtl8127_mcu.c +++ b/drivers/net/r8169/base/rtl8127_mcu.c @@ -11,58 +11,47 @@ /* ------------------------------------MAC 8127------------------------------------- */ -static void -_rtl_set_mac_mcu_8127a_1(struct rtl_hw *hw) +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 + 0xE010, 0xE023, 0xE036, 0xE049, 0xE05C, 0xE075, 0xE0B1, 0xE117, 0xE11B, + 0xE11D, 0xE11F, 0xE121, 0xE123, 0xE125, 0xE127, 0xE129, 0x7020, 0xB405, + 0xB404, 0xC50F, 0x74A0, 0xC50E, 0x4025, 0xF005, 0x4850, 0x4025, 0xF002, + 0xE002, 0x4809, 0xB004, 0xB005, 0xC502, 0xBD00, 0x1522, 0xD006, 0x0004, + 0x7760, 0xB405, 0xB404, 0xC50F, 0x74A0, 0xC50E, 0x4025, 0xF005, 0x4850, + 0x4025, 0xF002, 0xE002, 0x4879, 0xB004, 0xB005, 0xC002, 0xB800, 0x41E2, + 0xD006, 0x0004, 0x7160, 0xB405, 0xB404, 0xC50F, 0x74A0, 0xC50E, 0x4025, + 0xF005, 0x4850, 0x4025, 0xF002, 0xE002, 0x4819, 0xB004, 0xB005, 0xC302, + 0xBB00, 0x508E, 0xD006, 0x0004, 0x7720, 0xB405, 0xB404, 0xC50F, 0x74A0, + 0xC50E, 0x4025, 0xF005, 0x4850, 0x4025, 0xF002, 0xE002, 0x4879, 0xB004, + 0xB005, 0xC102, 0xB900, 0x50F8, 0xD006, 0x0004, 0x61A9, 0xB403, 0xB404, + 0xC313, 0x7460, 0xC312, 0x4023, 0xF005, 0x4830, 0x4023, 0xF002, 0xE003, + 0x4997, 0xF003, 0xC00A, 0xE002, 0xC009, 0xB004, 0xB003, 0xC102, 0xB900, + 0x34FC, 0xD006, 0x0004, 0x02AF, 0x041F, 0xB407, 0xB406, 0xB405, 0xB404, + 0xB403, 0xB402, 0xB401, 0xB400, 0x49D2, 0xF116, 0xC62F, 0x77C0, 0x49F9, + 0xF020, 0x49FA, 0xF11E, 0x49F2, 0xF102, 0xE01B, 0x48F2, 0x9FC0, 0xC625, + 0x75C2, 0x4852, 0x9DC2, 0xC122, 0x7020, 0x4801, 0x4802, 0x9820, 0xE00F, + 0xC61A, 0x77C0, 0x49F2, 0xF10B, 0xC618, 0x77C0, 0x49F2, 0xF007, 0x48F2, + 0x9FC0, 0xC611, 0x75C2, 0x48D2, 0x9DC2, 0xB000, 0xB001, 0xB002, 0xB003, + 0xB004, 0xB005, 0xB006, 0xB007, 0x9D6C, 0xC502, 0xBD00, 0x0168, 0xE024, + 0xC010, 0xD410, 0xD460, 0xB407, 0xB406, 0xB405, 0xB404, 0xB403, 0xB402, + 0xB401, 0xB400, 0xC152, 0x7020, 0x4981, 0xF043, 0xC050, 0x7100, 0xB401, + 0xC14C, 0x489E, 0x481D, 0x9900, 0xC24A, 0x7340, 0x49B7, 0xF135, 0xC144, + 0x9900, 0xC245, 0x7340, 0xC447, 0x401C, 0xF109, 0x734C, 0x1301, 0xF12B, + 0xC343, 0x9B40, 0xC33E, 0x9B40, 0xE022, 0xC63A, 0x77C0, 0x48F4, 0x48F5, + 0x48F9, 0x48FA, 0x9FC0, 0xC231, 0x7344, 0x48B4, 0x9B44, 0xC22E, 0x7340, + 0x4830, 0x48B1, 0x4832, 0x483C, 0x48BD, 0x48BE, 0x48BF, 0x9B40, 0xC223, + 0xC32A, 0x9B48, 0xC327, 0x9B46, 0xC324, 0x9B40, 0xC321, 0x9B42, 0xC31E, + 0x9B40, 0xE005, 0xC113, 0x7020, 0x4881, 0x9820, 0xB001, 0xC010, 0x9900, + 0xB000, 0xB001, 0xB002, 0xB003, 0xB004, 0xB005, 0xB006, 0xB007, 0x2125, + 0xC102, 0xB900, 0x1A6C, 0xD410, 0xC000, 0xE86C, 0xB600, 0xB800, 0xB40A, + 0xE024, 0x5A00, 0x5A81, 0x0073, 0x5A80, 0x0042, 0x0001, 0xC104, 0xC202, + 0xBA00, 0x1A2E, 0xC896, 0xC302, 0xBB00, 0x0000, 0xC002, 0xB800, 0x0000, + 0xC002, 0xB800, 0x0000, 0xC502, 0xBD00, 0x0000, 0xC102, 0xB900, 0x0000, + 0xC102, 0xB900, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, + 0x6961, 0x0019, 0x050C, 0x140C }; entry_cnt = ARRAY_SIZE(mcu_patch_code); @@ -76,20 +65,16 @@ _rtl_set_mac_mcu_8127a_1(struct rtl_hw *hw) 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); + rtl_mac_ocp_write(hw, 0xFC28, 0x1520); + rtl_mac_ocp_write(hw, 0xFC2A, 0x41E0); + rtl_mac_ocp_write(hw, 0xFC2C, 0x508C); + rtl_mac_ocp_write(hw, 0xFC2E, 0x50F6); + rtl_mac_ocp_write(hw, 0xFC30, 0x34FA); + rtl_mac_ocp_write(hw, 0xFC32, 0x0166); + rtl_mac_ocp_write(hw, 0xFC34, 0x1A6A); + rtl_mac_ocp_write(hw, 0xFC36, 0x1A2C); - if (tmp != 0x04) - return; - _rtl_set_mac_mcu_8127a_1(hw); + rtl_mac_ocp_write(hw, 0xFC48, 0x00FF); } /* ------------------------------------PHY 8127------------------------------------- */ diff --git a/drivers/net/r8169/r8169_hw.h b/drivers/net/r8169/r8169_hw.h index 558ffaac95..ffd2914b10 100644 --- a/drivers/net/r8169/r8169_hw.h +++ b/drivers/net/r8169/r8169_hw.h @@ -137,7 +137,7 @@ extern const struct rtl_hw_ops rtl8125cp_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 NIC_RAMCODE_VERSION_CFG_METHOD_91 (0x0036) #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 e547b44137..9da3a9d41b 100644 --- a/drivers/net/r8169/r8169_phy.c +++ b/drivers/net/r8169/r8169_phy.c @@ -682,7 +682,6 @@ 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; } -- 2.34.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-06-10 6:02 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-06-10 6:01 [PATCH 1/8] net/r8169: add support for RTL8168 series Howard Wang 2025-06-10 6:01 ` [PATCH 2/8] net/r8169: update HW configurations for 8125 and 8126 Howard Wang 2025-06-10 6:01 ` [PATCH 3/8] net/r8169: add support for RTL8127 Howard Wang 2025-06-10 6:01 ` [PATCH 4/8] net/r8169: remove cmac feature for RTL8125AP Howard Wang 2025-06-10 6:01 ` [PATCH 5/8] net/r8169: add RTL8127AP dash support Howard Wang 2025-06-10 6:01 ` [PATCH 6/8] net/r8169: add support for RTL8125CP Howard Wang 2025-06-10 6:01 ` [PATCH 7/8] net/r8169: add support for RTL8127ATF serdes interface Howard Wang 2025-06-10 6:01 ` [PATCH 8/8] net/r8169: update HW configuration for 8127 Howard Wang
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).