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_hw.h"
7 : : #include "../r8169_phy.h"
8 : : #include "rtl8168ep.h"
9 : :
10 : : /* For RTL8168EP, CFG_METHOD_23,27,28 */
11 : :
12 : : static void
13 : 0 : hw_init_rxcfg_8168ep(struct rtl_hw *hw)
14 : : {
15 : 0 : RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
16 : : (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
17 : 0 : }
18 : :
19 : : static void
20 : 0 : hw_ephy_config_8168ep(struct rtl_hw *hw)
21 : : {
22 : : u16 ephy_data;
23 : :
24 [ # # # # ]: 0 : switch (hw->mcfg) {
25 : 0 : case CFG_METHOD_23:
26 : 0 : rtl_ephy_write(hw, 0x00, 0x10AB);
27 : 0 : rtl_ephy_write(hw, 0x06, 0xf030);
28 : 0 : rtl_ephy_write(hw, 0x08, 0x2006);
29 : 0 : rtl_ephy_write(hw, 0x0D, 0x1666);
30 : :
31 : 0 : ephy_data = rtl_ephy_read(hw, 0x0C);
32 : 0 : ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
33 : : BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
34 : 0 : rtl_ephy_write(hw, 0x0C, ephy_data);
35 : 0 : break;
36 : 0 : case CFG_METHOD_27:
37 : 0 : rtl_ephy_write(hw, 0x00, 0x10A3);
38 : 0 : rtl_ephy_write(hw, 0x19, 0xFC00);
39 : 0 : rtl_ephy_write(hw, 0x1E, 0x20EA);
40 : 0 : break;
41 : 0 : case CFG_METHOD_28:
42 : 0 : rtl_ephy_write(hw, 0x00, 0x10AB);
43 : 0 : rtl_ephy_write(hw, 0x19, 0xFC00);
44 : 0 : rtl_ephy_write(hw, 0x1E, 0x20EB);
45 : 0 : rtl_ephy_write(hw, 0x0D, 0x1666);
46 : 0 : rtl_clear_pcie_phy_bit(hw, 0x0B, BIT_0);
47 : 0 : rtl_set_pcie_phy_bit(hw, 0x1D, BIT_14);
48 : 0 : rtl_clear_and_set_pcie_phy_bit(hw, 0x0C, (BIT_13 | BIT_12 | BIT_11 |
49 : : BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5),
50 : : BIT_9 | BIT_4);
51 : 0 : break;
52 : : default:
53 : : break;
54 : : }
55 : 0 : }
56 : :
57 : : static void
58 : 0 : hw_phy_config_8168ep(struct rtl_hw *hw)
59 : : {
60 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_23) {
61 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
62 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) |
63 : : (BIT_3 | BIT_2));
64 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
65 : :
66 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
67 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
68 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
69 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
70 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
71 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
72 : 0 : rtl_mdio_write(hw, 0x13, 0x8084);
73 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) &
74 : : ~(BIT_14 | BIT_13));
75 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
76 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
77 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
78 : :
79 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A4B);
80 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2);
81 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
82 : :
83 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
84 : 0 : rtl_mdio_write(hw, 0x13, 0x8012);
85 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
86 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
87 : :
88 : 0 : rtl_mdio_write(hw, 0x1F, 0x0C42);
89 : 0 : rtl_clear_and_set_eth_phy_bit(hw, 0x11, BIT_13, BIT_14);
90 : 0 : rtl_mdio_write(hw, 0x1F, 0x0000);
91 : :
92 [ # # ]: 0 : } else if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) {
93 : 0 : rtl_mdio_write(hw, 0x1F, 0x0BCC);
94 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
95 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A44);
96 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
97 : 0 : rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
98 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
99 : 0 : rtl_mdio_write(hw, 0x13, 0x8084);
100 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
101 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
102 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
103 : 0 : rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
104 : :
105 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
106 : 0 : rtl_mdio_write(hw, 0x13, 0x8012);
107 : 0 : rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
108 : :
109 : 0 : rtl_mdio_write(hw, 0x1F, 0x0C42);
110 : 0 : rtl_mdio_write(hw, 0x11, (rtl_mdio_read(hw, 0x11) & ~BIT_13) | BIT_14);
111 : :
112 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
113 : 0 : rtl_mdio_write(hw, 0x13, 0x80F3);
114 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00);
115 : 0 : rtl_mdio_write(hw, 0x13, 0x80F0);
116 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00);
117 : 0 : rtl_mdio_write(hw, 0x13, 0x80EF);
118 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500);
119 : 0 : rtl_mdio_write(hw, 0x13, 0x80F6);
120 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00);
121 : 0 : rtl_mdio_write(hw, 0x13, 0x80EC);
122 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800);
123 : 0 : rtl_mdio_write(hw, 0x13, 0x80ED);
124 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
125 : 0 : rtl_mdio_write(hw, 0x13, 0x80F2);
126 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400);
127 : 0 : rtl_mdio_write(hw, 0x13, 0x80F4);
128 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500);
129 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
130 : 0 : rtl_mdio_write(hw, 0x13, 0x8110);
131 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800);
132 : 0 : rtl_mdio_write(hw, 0x13, 0x810F);
133 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00);
134 : 0 : rtl_mdio_write(hw, 0x13, 0x8111);
135 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500);
136 : 0 : rtl_mdio_write(hw, 0x13, 0x8113);
137 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100);
138 : 0 : rtl_mdio_write(hw, 0x13, 0x8115);
139 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200);
140 : 0 : rtl_mdio_write(hw, 0x13, 0x810E);
141 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400);
142 : 0 : rtl_mdio_write(hw, 0x13, 0x810C);
143 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
144 : 0 : rtl_mdio_write(hw, 0x13, 0x810B);
145 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00);
146 : 0 : rtl_mdio_write(hw, 0x1F, 0x0A43);
147 : 0 : rtl_mdio_write(hw, 0x13, 0x80D1);
148 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00);
149 : 0 : rtl_mdio_write(hw, 0x13, 0x80CD);
150 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00);
151 : 0 : rtl_mdio_write(hw, 0x13, 0x80D3);
152 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00);
153 : 0 : rtl_mdio_write(hw, 0x13, 0x80D5);
154 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00);
155 : 0 : rtl_mdio_write(hw, 0x13, 0x80D7);
156 : 0 : rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400);
157 : : }
158 : 0 : }
159 : :
160 : : static void
161 : 0 : hw_config_8168ep(struct rtl_hw *hw)
162 : : {
163 : : u16 mac_ocp_data;
164 : : u32 csi_tmp;
165 : :
166 : 0 : rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
167 : 0 : rtl_eri_write(hw, 0xCC, 1, 0x2F, ERIAR_ExGMAC);
168 : 0 : rtl_eri_write(hw, 0xD0, 1, 0x5F, ERIAR_ExGMAC);
169 : 0 : rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
170 : :
171 : : /* Adjust the trx fifo */
172 : 0 : rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
173 : 0 : rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
174 : :
175 : : /* Disable share fifo */
176 : 0 : RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
177 : :
178 : 0 : csi_tmp = rtl_eri_read(hw, 0xDC, 1, ERIAR_ExGMAC);
179 : 0 : csi_tmp &= ~BIT_0;
180 : 0 : rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
181 : 0 : csi_tmp |= BIT_0;
182 : 0 : rtl_eri_write(hw, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
183 : :
184 : 0 : RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
185 : :
186 : : /* EEE led enable */
187 : 0 : RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
188 : :
189 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_27 || hw->mcfg == CFG_METHOD_28) {
190 : 0 : rtl_oob_mutex_lock(hw);
191 : 0 : rtl_eri_write(hw, 0x5F0, 2, 0x4F87, ERIAR_ExGMAC);
192 : 0 : rtl_oob_mutex_unlock(hw);
193 : : }
194 : :
195 : 0 : rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
196 : 0 : rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
197 : :
198 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_28) {
199 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E2);
200 : 0 : mac_ocp_data &= 0xF000;
201 : 0 : mac_ocp_data |= 0xAFD;
202 : 0 : rtl_mac_ocp_write(hw, 0xD3E2, mac_ocp_data);
203 : :
204 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xD3E4);
205 : 0 : mac_ocp_data &= 0xFF00;
206 : 0 : rtl_mac_ocp_write(hw, 0xD3E4, mac_ocp_data);
207 : :
208 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xE860);
209 : 0 : mac_ocp_data |= BIT_7;
210 : 0 : rtl_mac_ocp_write(hw, 0xE860, mac_ocp_data);
211 : : }
212 : 0 : }
213 : :
214 : : const struct rtl_hw_ops rtl8168ep_ops = {
215 : : .hw_config = hw_config_8168ep,
216 : : .hw_init_rxcfg = hw_init_rxcfg_8168ep,
217 : : .hw_ephy_config = hw_ephy_config_8168ep,
218 : : .hw_phy_config = hw_phy_config_8168ep,
219 : : .hw_mac_mcu_config = hw_mac_mcu_config_8168ep,
220 : : .hw_phy_mcu_config = hw_phy_mcu_config_8168ep,
221 : : };
|