Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2024 Realtek Corporation. All rights reserved
3 : : */
4 : :
5 : : #include "../r8169_compat.h"
6 : : #include "../r8169_dash.h"
7 : : #include "../r8169_hw.h"
8 : : #include "../r8169_phy.h"
9 : : #include "rtl8168ep.h"
10 : :
11 : : /* For RTL8168EP, CFG_METHOD_23,27,28 */
12 : :
13 : : /* -------------------------------------MAC 8168EP------------------------------------ */
14 : :
15 : : static void
16 : 0 : rtl8168_set_mac_mcu_8168ep_1(struct rtl_hw *hw)
17 : : {
18 : : u16 i;
19 : : static const u16 mcu_patch_code_8168ep_1[] = {
20 : : 0xE008, 0xE0D3, 0xE0D6, 0xE0D9, 0xE0DB, 0xE0DD, 0xE0DF, 0xE0E1, 0xC251,
21 : : 0x7340, 0x49B1, 0xF010, 0x1D02, 0x8D40, 0xC202, 0xBA00, 0x2C3A, 0xC0F0,
22 : : 0xE8DE, 0x2000, 0x8000, 0xC0B6, 0x268C, 0x752C, 0x49D4, 0xF112, 0xE025,
23 : : 0xC2F6, 0x7146, 0xC2F5, 0x7340, 0x49BE, 0xF103, 0xC7F2, 0xE002, 0xC7F1,
24 : : 0x304F, 0x6226, 0x49A1, 0xF1F0, 0x7222, 0x49A0, 0xF1ED, 0x2525, 0x1F28,
25 : : 0x3097, 0x3091, 0x9A36, 0x752C, 0x21DC, 0x25BC, 0xC6E2, 0x77C0, 0x1304,
26 : : 0xF014, 0x1303, 0xF014, 0x1302, 0xF014, 0x1301, 0xF014, 0x49D4, 0xF103,
27 : : 0xC3D7, 0xBB00, 0xC618, 0x67C6, 0x752E, 0x22D7, 0x26DD, 0x1505, 0xF013,
28 : : 0xC60A, 0xBE00, 0xC309, 0xBB00, 0xC308, 0xBB00, 0xC307, 0xBB00, 0xC306,
29 : : 0xBB00, 0x25C8, 0x25A6, 0x25AC, 0x25B2, 0x25B8, 0xCD08, 0x0000, 0xC0BC,
30 : : 0xC2FF, 0x7340, 0x49B0, 0xF04E, 0x1F46, 0x308F, 0xC3F7, 0x1C04, 0xE84D,
31 : : 0x1401, 0xF147, 0x7226, 0x49A7, 0xF044, 0x7222, 0x2525, 0x1F30, 0x3097,
32 : : 0x3091, 0x7340, 0xC4EA, 0x401C, 0xF006, 0xC6E8, 0x75C0, 0x49D7, 0xF105,
33 : : 0xE036, 0x1D08, 0x8DC1, 0x0208, 0x6640, 0x2764, 0x1606, 0xF12F, 0x6346,
34 : : 0x133B, 0xF12C, 0x9B34, 0x1B18, 0x3093, 0xC32A, 0x1C10, 0xE82A, 0x1401,
35 : : 0xF124, 0x1A36, 0x308A, 0x7322, 0x25B5, 0x0B0E, 0x1C00, 0xE82C, 0xC71F,
36 : : 0x4027, 0xF11A, 0xE838, 0x1F42, 0x308F, 0x1B08, 0xE824, 0x7236, 0x7746,
37 : : 0x1700, 0xF00D, 0xC313, 0x401F, 0xF103, 0x1F00, 0x9F46, 0x7744, 0x449F,
38 : : 0x445F, 0xE817, 0xC70A, 0x4027, 0xF105, 0xC302, 0xBB00, 0x2E08, 0x2DC2,
39 : : 0xC7FF, 0xBF00, 0xCDB8, 0xFFFF, 0x0C02, 0xA554, 0xA5DC, 0x402F, 0xF105,
40 : : 0x1400, 0xF1FA, 0x1C01, 0xE002, 0x1C00, 0xFF80, 0x49B0, 0xF004, 0x0B01,
41 : : 0xA1D3, 0xE003, 0x0B02, 0xA5D3, 0x3127, 0x3720, 0x0B02, 0xA5D3, 0x3127,
42 : : 0x3720, 0x1300, 0xF1FB, 0xFF80, 0x7322, 0x25B5, 0x1E28, 0x30DE, 0x30D9,
43 : : 0x7264, 0x1E11, 0x2368, 0x3116, 0xFF80, 0x1B7E, 0xC602, 0xBE00, 0x06A6,
44 : : 0x1B7E, 0xC602, 0xBE00, 0x0764, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
45 : : 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
46 : : 0x0000
47 : : };
48 : :
49 : 0 : rtl_hw_disable_mac_mcu_bps(hw);
50 : :
51 [ # # ]: 0 : for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_1); i++)
52 : 0 : rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_1[i]);
53 : :
54 : 0 : rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
55 : :
56 : 0 : rtl_mac_ocp_write(hw, 0xFC28, 0x2549);
57 : 0 : rtl_mac_ocp_write(hw, 0xFC2A, 0x06A5);
58 : 0 : rtl_mac_ocp_write(hw, 0xFC2C, 0x0763);
59 : 0 : }
60 : :
61 : : static void
62 : 0 : rtl8168_set_mac_mcu_8168ep_2(struct rtl_hw *hw)
63 : : {
64 : : u16 i;
65 : : static const u16 mcu_patch_code_8168ep_2[] = {
66 : : 0xE008, 0xE017, 0xE052, 0xE056, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xC50F,
67 : : 0x76A4, 0x49E3, 0xF007, 0x49C0, 0xF103, 0xC607, 0xBE00, 0xC606, 0xBE00,
68 : : 0xC602, 0xBE00, 0x0BDA, 0x0BB6, 0x0BBA, 0xDC00, 0xB400, 0xB401, 0xB402,
69 : : 0xB403, 0xB404, 0xC02E, 0x7206, 0x49AE, 0xF1FE, 0xC12B, 0x9904, 0xC12A,
70 : : 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF117, 0xC123, 0xC223,
71 : : 0xC323, 0xE808, 0xC322, 0xE806, 0xC321, 0xE804, 0xC320, 0xE802, 0xE00C,
72 : : 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x990A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE,
73 : : 0xF1FE, 0xFF80, 0xB004, 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002,
74 : : 0xB800, 0x1FC8, 0xE000, 0xE8E0, 0xF128, 0x0002, 0xFFFF, 0xF000, 0x8001,
75 : : 0x8002, 0x8003, 0x8004, 0x48C1, 0x48C2, 0xC502, 0xBD00, 0x0490, 0xC602,
76 : : 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602,
77 : : 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
78 : : };
79 : :
80 : 0 : rtl_hw_disable_mac_mcu_bps(hw);
81 : :
82 [ # # ]: 0 : for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_2); i++)
83 : 0 : rtl_mac_ocp_write(hw, 0xF800 + i * 2, mcu_patch_code_8168ep_2[i]);
84 : :
85 : 0 : rtl_mac_ocp_write(hw, 0xFC26, 0x8000);
86 : :
87 : 0 : rtl_mac_ocp_write(hw, 0xFC28, 0x0BB3);
88 [ # # ]: 0 : if (!rtl8168_check_dash_other_fun_present(hw))
89 : 0 : rtl_mac_ocp_write(hw, 0xFC2A, 0x1FC7);
90 : 0 : }
91 : :
92 : : /* ------------------------------------PHY 8168FP------------------------------------- */
93 : :
94 : : static void
95 : 0 : rtl8168_set_phy_mcu_8168ep_2(struct rtl_hw *hw)
96 : : {
97 : : unsigned int gphy_val;
98 : :
99 : 0 : rtl_set_phy_mcu_patch_request(hw);
100 : :
101 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A43);
102 : 0 : rtl_mdio_write(hw, 0x13, 0x8146);
103 : 0 : rtl_mdio_write(hw, 0x14, 0x8700);
104 : 0 : rtl_mdio_write(hw, 0x13, 0xB82E);
105 : 0 : rtl_mdio_write(hw, 0x14, 0x0001);
106 : :
107 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
108 : :
109 : 0 : rtl_mdio_write(hw, 0x13, 0x83DD);
110 : 0 : rtl_mdio_write(hw, 0x14, 0xAF83);
111 : 0 : rtl_mdio_write(hw, 0x14, 0xE9AF);
112 : 0 : rtl_mdio_write(hw, 0x14, 0x83EE);
113 : 0 : rtl_mdio_write(hw, 0x14, 0xAF83);
114 : 0 : rtl_mdio_write(hw, 0x14, 0xF1A1);
115 : 0 : rtl_mdio_write(hw, 0x14, 0x83F4);
116 : 0 : rtl_mdio_write(hw, 0x14, 0xD149);
117 : 0 : rtl_mdio_write(hw, 0x14, 0xAF06);
118 : 0 : rtl_mdio_write(hw, 0x14, 0x47AF);
119 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
120 : 0 : rtl_mdio_write(hw, 0x14, 0xAF00);
121 : 0 : rtl_mdio_write(hw, 0x14, 0x00AF);
122 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
123 : :
124 : 0 : rtl_mdio_write(hw, 0x13, 0xB818);
125 : 0 : rtl_mdio_write(hw, 0x14, 0x0645);
126 : :
127 : 0 : rtl_mdio_write(hw, 0x13, 0xB81A);
128 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
129 : :
130 : 0 : rtl_mdio_write(hw, 0x13, 0xB81C);
131 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
132 : :
133 : 0 : rtl_mdio_write(hw, 0x13, 0xB81E);
134 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
135 : :
136 : 0 : rtl_mdio_write(hw, 0x13, 0xB832);
137 : 0 : rtl_mdio_write(hw, 0x14, 0x0001);
138 : :
139 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
140 : 0 : rtl_mdio_write(hw, 0x13, 0x0000);
141 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
142 : 0 : rtl_mdio_write(hw, 0x1f, 0x0B82);
143 : 0 : gphy_val = rtl_mdio_read(hw, 0x17);
144 : 0 : gphy_val &= ~BIT_0;
145 : 0 : rtl_mdio_write(hw, 0x17, gphy_val);
146 : 0 : rtl_mdio_write(hw, 0x1f, 0x0A43);
147 : 0 : rtl_mdio_write(hw, 0x13, 0x8146);
148 : 0 : rtl_mdio_write(hw, 0x14, 0x0000);
149 : :
150 : 0 : rtl_clear_phy_mcu_patch_request(hw);
151 : 0 : }
152 : :
153 : : void
154 : 0 : hw_mac_mcu_config_8168ep(struct rtl_hw *hw)
155 : : {
156 [ # # ]: 0 : if (hw->NotWrMcuPatchCode)
157 : : return;
158 : :
159 [ # # # ]: 0 : switch (hw->mcfg) {
160 : 0 : case CFG_METHOD_27:
161 : 0 : rtl8168_set_mac_mcu_8168ep_1(hw);
162 : 0 : break;
163 : 0 : case CFG_METHOD_28:
164 : 0 : rtl8168_set_mac_mcu_8168ep_2(hw);
165 : 0 : break;
166 : : }
167 : : }
168 : :
169 : : void
170 : 0 : hw_phy_mcu_config_8168ep(struct rtl_hw *hw)
171 : : {
172 [ # # ]: 0 : switch (hw->mcfg) {
173 : 0 : case CFG_METHOD_28:
174 : 0 : rtl8168_set_phy_mcu_8168ep_2(hw);
175 : 0 : break;
176 : : }
177 : 0 : }
|