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 <stdio.h>
6 : : #include <errno.h>
7 : : #include <stdint.h>
8 : :
9 : : #include <rte_ether.h>
10 : : #include <ethdev_driver.h>
11 : :
12 : : #include "r8169_hw.h"
13 : : #include "r8169_logs.h"
14 : : #include "r8169_dash.h"
15 : :
16 : : static u32
17 : 0 : rtl_eri_read_with_oob_base_address(struct rtl_hw *hw, int addr, int len,
18 : : int type, const u32 base_address)
19 : : {
20 : : int i, val_shift, shift = 0;
21 : : u32 value1 = 0;
22 : : u32 value2 = 0;
23 : : u32 eri_cmd, tmp, mask;
24 : 0 : const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) |
25 : 0 : (base_address & 0x000FFF);
26 : :
27 [ # # ]: 0 : if (len > 4 || len <= 0)
28 : : return -1;
29 : :
30 [ # # ]: 0 : while (len > 0) {
31 : 0 : val_shift = addr % ERIAR_Addr_Align;
32 : 0 : addr = addr & ~0x3;
33 : :
34 : 0 : eri_cmd = ERIAR_Read | transformed_base_address |
35 : 0 : type << ERIAR_Type_shift |
36 : 0 : ERIAR_ByteEn << ERIAR_ByteEn_shift |
37 : 0 : (addr & 0x0FFF);
38 [ # # ]: 0 : if (addr & 0xF000) {
39 : : tmp = addr & 0xF000;
40 : : tmp >>= 12;
41 : 0 : eri_cmd |= (tmp << 20) & 0x00F00000;
42 : : }
43 : :
44 : 0 : RTL_W32(hw, ERIAR, eri_cmd);
45 : :
46 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
47 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
48 : :
49 : : /* Check if the NIC has completed ERI read */
50 [ # # ]: 0 : if (RTL_R32(hw, ERIAR) & ERIAR_Flag)
51 : : break;
52 : : }
53 : :
54 [ # # ]: 0 : if (len == 1)
55 : 0 : mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
56 [ # # ]: 0 : else if (len == 2)
57 : 0 : mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
58 [ # # ]: 0 : else if (len == 3)
59 : 0 : mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
60 : : else
61 : 0 : mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
62 : :
63 : 0 : value1 = RTL_R32(hw, ERIDR) & mask;
64 : 0 : value2 |= (value1 >> val_shift * 8) << shift * 8;
65 : :
66 [ # # ]: 0 : if (len <= 4 - val_shift) {
67 : : len = 0;
68 : : } else {
69 : 0 : len -= (4 - val_shift);
70 : : shift = 4 - val_shift;
71 : 0 : addr += 4;
72 : : }
73 : : }
74 : :
75 : 0 : rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
76 : :
77 : 0 : return value2;
78 : : }
79 : :
80 : : static int
81 : 0 : rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr,
82 : : int len, u32 value, int type, const u32 base_address)
83 : : {
84 : : int i, val_shift, shift = 0;
85 : : u32 value1 = 0;
86 : : u32 eri_cmd, mask, tmp;
87 : 0 : const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) |
88 : 0 : (base_address & 0x000FFF);
89 : :
90 [ # # ]: 0 : if (len > 4 || len <= 0)
91 : : return -1;
92 : :
93 [ # # ]: 0 : while (len > 0) {
94 : 0 : val_shift = addr % ERIAR_Addr_Align;
95 : 0 : addr = addr & ~0x3;
96 : :
97 [ # # ]: 0 : if (len == 1)
98 : 0 : mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
99 [ # # ]: 0 : else if (len == 2)
100 : 0 : mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
101 [ # # ]: 0 : else if (len == 3)
102 : 0 : mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
103 : : else
104 : 0 : mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
105 : :
106 : 0 : value1 = rtl_eri_read_with_oob_base_address(hw, addr, 4, type,
107 : 0 : base_address) & ~mask;
108 : 0 : value1 |= ((value << val_shift * 8) >> shift * 8);
109 : :
110 : 0 : RTL_W32(hw, ERIDR, value1);
111 : :
112 : 0 : eri_cmd = ERIAR_Write | transformed_base_address |
113 : 0 : type << ERIAR_Type_shift |
114 : 0 : ERIAR_ByteEn << ERIAR_ByteEn_shift |
115 : 0 : (addr & 0x0FFF);
116 [ # # ]: 0 : if (addr & 0xF000) {
117 : : tmp = addr & 0xF000;
118 : : tmp >>= 12;
119 : 0 : eri_cmd |= (tmp << 20) & 0x00F00000;
120 : : }
121 : :
122 : 0 : RTL_W32(hw, ERIAR, eri_cmd);
123 : :
124 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
125 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
126 : :
127 : : /* Check if the NIC has completed ERI write */
128 [ # # ]: 0 : if (!(RTL_R32(hw, ERIAR) & ERIAR_Flag))
129 : : break;
130 : : }
131 : :
132 [ # # ]: 0 : if (len <= 4 - val_shift) {
133 : : len = 0;
134 : : } else {
135 : 0 : len -= (4 - val_shift);
136 : : shift = 4 - val_shift;
137 : 0 : addr += 4;
138 : : }
139 : : }
140 : :
141 : 0 : rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
142 : :
143 : 0 : return 0;
144 : : }
145 : :
146 : : static u32
147 : : rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
148 : : const u32 base_address)
149 : : {
150 : 0 : return rtl_eri_read_with_oob_base_address(hw, addr, len, ERIAR_OOB,
151 : : base_address);
152 : : }
153 : :
154 : : u32
155 : 0 : rtl_ocp_read(struct rtl_hw *hw, u16 addr, u8 len)
156 : : {
157 : : u32 value = 0;
158 : :
159 [ # # ]: 0 : if (!hw->AllowAccessDashOcp)
160 : : return 0xffffffff;
161 : :
162 [ # # ]: 0 : if (hw->HwSuppOcpChannelVer == 2)
163 : 0 : value = rtl_ocp_read_with_oob_base_address(hw, addr, len, NO_BASE_ADDRESS);
164 : :
165 : : return value;
166 : : }
167 : :
168 : : static u32
169 : : rtl_ocp_write_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
170 : : u32 value, const u32 base_address)
171 : : {
172 : 0 : return rtl_eri_write_with_oob_base_address(hw, addr, len, value, ERIAR_OOB,
173 : : base_address);
174 : : }
175 : :
176 : : void
177 : 0 : rtl_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value)
178 : : {
179 [ # # ]: 0 : if (!hw->AllowAccessDashOcp)
180 : : return;
181 : :
182 [ # # ]: 0 : if (hw->HwSuppOcpChannelVer == 2)
183 : 0 : rtl_ocp_write_with_oob_base_address(hw, addr, len, value, NO_BASE_ADDRESS);
184 : : }
185 : :
186 : : void
187 : 0 : rtl8125_oob_mutex_lock(struct rtl_hw *hw)
188 : : {
189 : : u8 reg_16, reg_a0;
190 : : u16 ocp_reg_mutex_ib;
191 : : u16 ocp_reg_mutex_oob;
192 : : u16 ocp_reg_mutex_prio;
193 : : u32 wait_cnt_0, wait_cnt_1;
194 : :
195 [ # # ]: 0 : if (!hw->DASH)
196 : : return;
197 : :
198 [ # # ]: 0 : switch (hw->mcfg) {
199 : 0 : case CFG_METHOD_48:
200 : : case CFG_METHOD_49:
201 : : case CFG_METHOD_52:
202 : : case CFG_METHOD_54:
203 : : case CFG_METHOD_55:
204 : : ocp_reg_mutex_oob = 0x110;
205 : : ocp_reg_mutex_ib = 0x114;
206 : : ocp_reg_mutex_prio = 0x11C;
207 : : break;
208 : : default:
209 : : return;
210 : : }
211 : :
212 : 0 : rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, BIT_0);
213 : 0 : reg_16 = rtl_ocp_read(hw, ocp_reg_mutex_oob, 1);
214 : : wait_cnt_0 = 0;
215 [ # # ]: 0 : while (reg_16) {
216 : 0 : reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
217 [ # # ]: 0 : if (reg_a0) {
218 : 0 : rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, 0x00);
219 : 0 : reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
220 : : wait_cnt_1 = 0;
221 [ # # ]: 0 : while (reg_a0) {
222 : 0 : reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
223 : :
224 : 0 : wait_cnt_1++;
225 : :
226 [ # # ]: 0 : if (wait_cnt_1 > 2000)
227 : : break;
228 : : };
229 : 0 : rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, BIT_0);
230 : : }
231 : 0 : reg_16 = rtl_ocp_read(hw, ocp_reg_mutex_oob, 1);
232 : :
233 : 0 : wait_cnt_0++;
234 : :
235 [ # # ]: 0 : if (wait_cnt_0 > 2000)
236 : : break;
237 : : };
238 : : }
239 : :
240 : : void
241 : 0 : rtl8125_oob_mutex_unlock(struct rtl_hw *hw)
242 : : {
243 : : u16 ocp_reg_mutex_ib;
244 : : u16 ocp_reg_mutex_prio;
245 : :
246 [ # # ]: 0 : if (!hw->DASH)
247 : : return;
248 : :
249 [ # # ]: 0 : switch (hw->mcfg) {
250 : 0 : case CFG_METHOD_48:
251 : : case CFG_METHOD_49:
252 : : case CFG_METHOD_52:
253 : : case CFG_METHOD_54:
254 : : case CFG_METHOD_55:
255 : : ocp_reg_mutex_ib = 0x114;
256 : : ocp_reg_mutex_prio = 0x11C;
257 : : break;
258 : : default:
259 : : return;
260 : : }
261 : :
262 : 0 : rtl_ocp_write(hw, ocp_reg_mutex_prio, 1, BIT_0);
263 : 0 : rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, 0x00);
264 : : }
265 : :
266 : : void
267 : 0 : rtl_mac_ocp_write(struct rtl_hw *hw, u16 addr, u16 value)
268 : : {
269 : : u32 data32;
270 : :
271 : 0 : data32 = addr / 2;
272 : 0 : data32 <<= OCPR_Addr_Reg_shift;
273 : 0 : data32 += value;
274 : 0 : data32 |= OCPR_Write;
275 : :
276 : 0 : RTL_W32(hw, MACOCP, data32);
277 : 0 : }
278 : :
279 : : u16
280 : 0 : rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr)
281 : : {
282 : : u32 data32;
283 : : u16 data16 = 0;
284 : :
285 : 0 : data32 = addr / 2;
286 : 0 : data32 <<= OCPR_Addr_Reg_shift;
287 : :
288 : 0 : RTL_W32(hw, MACOCP, data32);
289 : 0 : data16 = (u16)RTL_R32(hw, MACOCP);
290 : :
291 : 0 : return data16;
292 : : }
293 : :
294 : : u32
295 : 0 : rtl_csi_read(struct rtl_hw *hw, u32 addr)
296 : : {
297 : : u32 cmd;
298 : : int i;
299 : : u32 value = 0;
300 : :
301 : 0 : cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift |
302 : : (addr & CSIAR_Addr_Mask);
303 : :
304 : 0 : RTL_W32(hw, CSIAR, cmd);
305 : :
306 [ # # ]: 0 : for (i = 0; i < 10; i++) {
307 : 0 : rte_delay_us(100);
308 : :
309 : : /* Check if the NIC has completed CSI read */
310 [ # # ]: 0 : if (RTL_R32(hw, CSIAR) & CSIAR_Flag) {
311 : 0 : value = RTL_R32(hw, CSIDR);
312 : 0 : break;
313 : : }
314 : : }
315 : :
316 : 0 : rte_delay_us(20);
317 : :
318 : 0 : return value;
319 : : }
320 : :
321 : : void
322 : 0 : rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
323 : : {
324 : : u32 cmd;
325 : : int i;
326 : :
327 : 0 : RTL_W32(hw, CSIDR, value);
328 : 0 : cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift |
329 : : (addr & CSIAR_Addr_Mask);
330 : :
331 : 0 : RTL_W32(hw, CSIAR, cmd);
332 : :
333 [ # # ]: 0 : for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
334 : 0 : rte_delay_us(RTL_CHANNEL_WAIT_TIME);
335 : :
336 : : /* Check if the NIC has completed CSI write */
337 [ # # ]: 0 : if (!(RTL_R32(hw, CSIAR) & CSIAR_Flag))
338 : : break;
339 : : }
340 : :
341 : 0 : rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
342 : 0 : }
343 : :
344 : : static void
345 : 0 : rtl_enable_rxdvgate(struct rtl_hw *hw)
346 : : {
347 [ # # ]: 0 : switch (hw->mcfg) {
348 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
349 : : case CFG_METHOD_69 ... CFG_METHOD_71:
350 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_3);
351 : : rte_delay_ms(2);
352 : : }
353 : 0 : }
354 : :
355 : : void
356 : 0 : rtl_disable_rxdvgate(struct rtl_hw *hw)
357 : : {
358 [ # # ]: 0 : switch (hw->mcfg) {
359 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
360 : : case CFG_METHOD_69 ... CFG_METHOD_71:
361 : 0 : RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_3);
362 : : rte_delay_ms(2);
363 : : }
364 : 0 : }
365 : :
366 : : static void
367 : 0 : rtl_stop_all_request(struct rtl_hw *hw)
368 : : {
369 : : int i;
370 : :
371 : 0 : RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
372 : :
373 [ # # ]: 0 : switch (hw->mcfg) {
374 : : case CFG_METHOD_48:
375 : : case CFG_METHOD_49:
376 : : case CFG_METHOD_52:
377 [ # # ]: 0 : for (i = 0; i < 20; i++) {
378 : 0 : rte_delay_us(10);
379 [ # # ]: 0 : if (!(RTL_R8(hw, ChipCmd) & StopReq))
380 : : break;
381 : : }
382 : :
383 : : break;
384 : 0 : default:
385 : 0 : rte_delay_us(200);
386 : 0 : break;
387 : : }
388 : :
389 : 0 : RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb));
390 : 0 : }
391 : :
392 : : static void
393 : 0 : rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
394 : : {
395 : : int i;
396 : :
397 [ # # ]: 0 : switch (hw->mcfg) {
398 : : case CFG_METHOD_48 ... CFG_METHOD_57:
399 : : case CFG_METHOD_69 ... CFG_METHOD_71:
400 [ # # ]: 0 : for (i = 0; i < 3000; i++) {
401 : 0 : rte_delay_us(50);
402 [ # # ]: 0 : if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
403 : : (Txfifo_empty | Rxfifo_empty))
404 : : break;
405 : : }
406 : : break;
407 : : }
408 : :
409 [ # # ]: 0 : switch (hw->mcfg) {
410 : : case CFG_METHOD_50:
411 : : case CFG_METHOD_51:
412 : : case CFG_METHOD_53 ... CFG_METHOD_57:
413 : : case CFG_METHOD_69 ... CFG_METHOD_71:
414 [ # # ]: 0 : for (i = 0; i < 3000; i++) {
415 : 0 : rte_delay_us(50);
416 [ # # ]: 0 : if ((RTL_R16(hw, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) ==
417 : : (BIT_0 | BIT_1 | BIT_8))
418 : : break;
419 : : }
420 : : break;
421 : : }
422 : 0 : }
423 : :
424 : : static void
425 : : rtl_disable_rx_packet_filter(struct rtl_hw *hw)
426 : : {
427 : 0 : RTL_W32(hw, RxConfig, RTL_R32(hw, RxConfig) &
428 : : ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast |
429 : : AcceptMyPhys | AcceptAllPhys));
430 : : }
431 : :
432 : : void
433 : 0 : rtl_nic_reset(struct rtl_hw *hw)
434 : : {
435 : : int i;
436 : :
437 : : rtl_disable_rx_packet_filter(hw);
438 : :
439 : 0 : rtl_enable_rxdvgate(hw);
440 : :
441 : 0 : rtl_stop_all_request(hw);
442 : :
443 : 0 : rtl_wait_txrx_fifo_empty(hw);
444 : :
445 : : rte_delay_ms(2);
446 : :
447 : : /* Soft reset the chip. */
448 : 0 : RTL_W8(hw, ChipCmd, CmdReset);
449 : :
450 : : /* Check that the chip has finished the reset. */
451 [ # # ]: 0 : for (i = 100; i > 0; i--) {
452 : 0 : rte_delay_us(100);
453 [ # # ]: 0 : if ((RTL_R8(hw, ChipCmd) & CmdReset) == 0)
454 : : break;
455 : : }
456 : 0 : }
457 : :
458 : : void
459 : 0 : rtl_enable_cfg9346_write(struct rtl_hw *hw)
460 : : {
461 : 0 : RTL_W8(hw, Cfg9346, RTL_R8(hw, Cfg9346) | Cfg9346_Unlock);
462 : 0 : }
463 : :
464 : : void
465 : 0 : rtl_disable_cfg9346_write(struct rtl_hw *hw)
466 : : {
467 : 0 : RTL_W8(hw, Cfg9346, RTL_R8(hw, Cfg9346) & ~Cfg9346_Unlock);
468 : 0 : }
469 : :
470 : : static void
471 : : rtl_enable_force_clkreq(struct rtl_hw *hw, bool enable)
472 : : {
473 : : if (enable)
474 : : RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7);
475 : : else
476 : 0 : RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7);
477 : : }
478 : :
479 : : static void
480 : 0 : rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
481 : : {
482 [ # # # ]: 0 : switch (hw->mcfg) {
483 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
484 : : case CFG_METHOD_69:
485 : 0 : rtl_enable_cfg9346_write(hw);
486 [ # # ]: 0 : if (enable) {
487 : 0 : RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7);
488 : 0 : RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
489 : : } else {
490 : 0 : RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7);
491 : 0 : RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
492 : : }
493 : 0 : rtl_disable_cfg9346_write(hw);
494 : 0 : break;
495 : 0 : case CFG_METHOD_70:
496 : : case CFG_METHOD_71:
497 : 0 : rtl_enable_cfg9346_write(hw);
498 [ # # ]: 0 : if (enable) {
499 : 0 : RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) | BIT_3);
500 : 0 : RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
501 : : } else {
502 : 0 : RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) & ~BIT_3);
503 : 0 : RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
504 : : }
505 : 0 : rtl_disable_cfg9346_write(hw);
506 : 0 : break;
507 : : }
508 : 0 : }
509 : :
510 : : static void
511 : 0 : rtl_disable_l1_timeout(struct rtl_hw *hw)
512 : : {
513 : 0 : rtl_csi_write(hw, 0x890, rtl_csi_read(hw, 0x890) & ~BIT_0);
514 : 0 : }
515 : :
516 : : static void
517 : 0 : rtl_disable_eee_plus(struct rtl_hw *hw)
518 : : {
519 [ # # ]: 0 : switch (hw->mcfg) {
520 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
521 : : case CFG_METHOD_69 ... CFG_METHOD_71:
522 : 0 : rtl_mac_ocp_write(hw, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1);
523 : 0 : break;
524 : :
525 : : default:
526 : : /* Not support EEEPlus */
527 : : break;
528 : : }
529 : 0 : }
530 : :
531 : : static void
532 : 0 : rtl_hw_clear_timer_int(struct rtl_hw *hw)
533 : : {
534 [ # # ]: 0 : switch (hw->mcfg) {
535 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
536 : : case CFG_METHOD_69 ... CFG_METHOD_71:
537 : 0 : RTL_W32(hw, TIMER_INT0_8125, 0x0000);
538 : 0 : RTL_W32(hw, TIMER_INT1_8125, 0x0000);
539 : 0 : RTL_W32(hw, TIMER_INT2_8125, 0x0000);
540 : 0 : RTL_W32(hw, TIMER_INT3_8125, 0x0000);
541 : : break;
542 : : }
543 : 0 : }
544 : :
545 : : static void
546 : 0 : rtl_hw_clear_int_miti(struct rtl_hw *hw)
547 : : {
548 : : int i;
549 : :
550 [ # # # ]: 0 : switch (hw->HwSuppIntMitiVer) {
551 : : case 3:
552 : : case 6:
553 : : /* IntMITI_0-IntMITI_31 */
554 [ # # ]: 0 : for (i = 0xA00; i < 0xB00; i += 4)
555 : 0 : RTL_W32(hw, i, 0x0000);
556 : : break;
557 : : case 4:
558 : : case 5:
559 : : /* IntMITI_0-IntMITI_15 */
560 [ # # ]: 0 : for (i = 0xA00; i < 0xA80; i += 4)
561 : 0 : RTL_W32(hw, i, 0x0000);
562 : :
563 [ # # ]: 0 : if (hw->HwSuppIntMitiVer == 5)
564 : 0 : RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) &
565 : : ~(INT_CFG0_TIMEOUT0_BYPASS_8125 |
566 : : INT_CFG0_MITIGATION_BYPASS_8125 |
567 : : INT_CFG0_RDU_BYPASS_8126));
568 : : else
569 : 0 : RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) &
570 : : ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | INT_CFG0_MITIGATION_BYPASS_8125));
571 : :
572 : 0 : RTL_W16(hw, INT_CFG1_8125, 0x0000);
573 : : break;
574 : : }
575 : 0 : }
576 : :
577 : : void
578 : 0 : rtl_hw_config(struct rtl_hw *hw)
579 : : {
580 : : u32 mac_ocp_data;
581 : :
582 : : /* Set RxConfig to default */
583 : 0 : RTL_W32(hw, RxConfig, (RX_DMA_BURST_unlimited << RxCfgDMAShift));
584 : :
585 : 0 : rtl_nic_reset(hw);
586 : :
587 : 0 : rtl_enable_cfg9346_write(hw);
588 : :
589 : : /* Disable aspm clkreq internal */
590 [ # # ]: 0 : switch (hw->mcfg) {
591 : : case CFG_METHOD_48 ... CFG_METHOD_57:
592 : : case CFG_METHOD_69 ... CFG_METHOD_71:
593 : : rtl_enable_force_clkreq(hw, 0);
594 : 0 : rtl_enable_aspm_clkreq_lock(hw, 0);
595 : 0 : break;
596 : : }
597 : :
598 : : /* Disable magic packet */
599 [ # # ]: 0 : switch (hw->mcfg) {
600 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
601 : : case CFG_METHOD_69 ... CFG_METHOD_71:
602 : : mac_ocp_data = 0;
603 : 0 : rtl_mac_ocp_write(hw, 0xC0B6, mac_ocp_data);
604 : 0 : break;
605 : : }
606 : :
607 : : /* Set DMA burst size and interframe gap time */
608 : 0 : RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
609 : : (InterFrameGap << TxInterFrameGapShift));
610 : :
611 [ # # ]: 0 : if (hw->EnableTxNoClose)
612 : 0 : RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | BIT_6));
613 : :
614 : : /* TCAM */
615 [ # # ]: 0 : switch (hw->mcfg) {
616 : 0 : case CFG_METHOD_48 ... CFG_METHOD_53:
617 : 0 : RTL_W16(hw, 0x382, 0x221B);
618 : : break;
619 : : }
620 : :
621 [ # # ]: 0 : switch (hw->mcfg) {
622 : 0 : case CFG_METHOD_69 ... CFG_METHOD_71:
623 : 0 : rtl_disable_l1_timeout(hw);
624 : 0 : break;
625 : : }
626 : :
627 [ # # ]: 0 : switch (hw->mcfg) {
628 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
629 : : case CFG_METHOD_69 ... CFG_METHOD_71:
630 : :
631 : : /* RSS_control_0 */
632 : 0 : RTL_W32(hw, RSS_CTRL_8125, 0x00);
633 : :
634 : : /* VMQ_control */
635 : 0 : RTL_W16(hw, Q_NUM_CTRL_8125, 0x0000);
636 : :
637 : : /* Disable speed down */
638 : 0 : RTL_W8(hw, Config1, RTL_R8(hw, Config1) & ~0x10);
639 : :
640 : : /* CRC disable set */
641 : 0 : rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
642 : 0 : rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
643 : :
644 : : /* New TX desc format */
645 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB58);
646 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
647 : 0 : mac_ocp_data &= ~(BIT_0 | BIT_1);
648 : 0 : mac_ocp_data |= BIT_0;
649 : 0 : rtl_mac_ocp_write(hw, 0xEB58, mac_ocp_data);
650 : :
651 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
652 : 0 : RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~BIT_1);
653 : :
654 : : /*
655 : : * MTPS
656 : : * 15-8 maximum tx use credit number
657 : : * 7-0 reserved for pcie product line
658 : : */
659 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xE614);
660 : 0 : mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8);
661 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_50 || hw->mcfg == CFG_METHOD_51 ||
662 : : hw->mcfg == CFG_METHOD_53)
663 : 0 : mac_ocp_data |= ((2 & 0x07) << 8);
664 [ # # ]: 0 : else if (hw->mcfg == CFG_METHOD_69 || hw->mcfg == CFG_METHOD_70 ||
665 : : hw->mcfg == CFG_METHOD_71)
666 : 0 : mac_ocp_data |= ((4 & 0x07) << 8);
667 : : else
668 : 0 : mac_ocp_data |= ((3 & 0x07) << 8);
669 : 0 : rtl_mac_ocp_write(hw, 0xE614, mac_ocp_data);
670 : :
671 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xE63E);
672 : 0 : mac_ocp_data &= ~(BIT_5 | BIT_4);
673 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
674 [ # # # # ]: 0 : hw->mcfg == CFG_METHOD_52 || hw->mcfg == CFG_METHOD_69 ||
675 [ # # ]: 0 : hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
676 : 0 : mac_ocp_data |= ((0x02 & 0x03) << 4);
677 : 0 : rtl_mac_ocp_write(hw, 0xE63E, mac_ocp_data);
678 : :
679 : : /*
680 : : * FTR_MCU_CTRL
681 : : * 3-2 txpla packet valid start
682 : : */
683 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
684 : 0 : mac_ocp_data &= ~BIT_0;
685 : 0 : rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
686 : 0 : mac_ocp_data |= BIT_0;
687 : 0 : rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
688 : :
689 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
690 : : mac_ocp_data |= (BIT_3 | BIT_2);
691 : 0 : rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
692 : :
693 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB6A);
694 : 0 : mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 |
695 : : BIT_0);
696 : 0 : mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0);
697 : 0 : rtl_mac_ocp_write(hw, 0xEB6A, mac_ocp_data);
698 : :
699 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB50);
700 : 0 : mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5);
701 : 0 : mac_ocp_data |= BIT_6;
702 : 0 : rtl_mac_ocp_write(hw, 0xEB50, mac_ocp_data);
703 : :
704 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xE056);
705 : 0 : mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4);
706 : 0 : rtl_mac_ocp_write(hw, 0xE056, mac_ocp_data);
707 : :
708 : : /* EEE_CR */
709 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xE040);
710 : 0 : mac_ocp_data &= ~BIT_12;
711 : 0 : rtl_mac_ocp_write(hw, 0xE040, mac_ocp_data);
712 : :
713 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
714 : 0 : mac_ocp_data &= ~(BIT_1 | BIT_0);
715 : 0 : mac_ocp_data |= BIT_0;
716 : 0 : rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
717 : :
718 [ # # ]: 0 : switch (hw->mcfg) {
719 : 0 : case CFG_METHOD_48:
720 : : case CFG_METHOD_49:
721 : : case CFG_METHOD_52:
722 : : case CFG_METHOD_54:
723 : : case CFG_METHOD_55:
724 : 0 : rtl8125_oob_mutex_lock(hw);
725 : 0 : break;
726 : : }
727 : :
728 : : /* MAC_PWRDWN_CR0 */
729 : 0 : rtl_mac_ocp_write(hw, 0xE0C0, 0x4000);
730 : :
731 : 0 : rtl_set_mac_ocp_bit(hw, 0xE052, (BIT_6 | BIT_5));
732 : 0 : rtl_clear_mac_ocp_bit(hw, 0xE052, (BIT_3 | BIT_7));
733 : :
734 [ # # ]: 0 : switch (hw->mcfg) {
735 : 0 : case CFG_METHOD_48:
736 : : case CFG_METHOD_49:
737 : : case CFG_METHOD_52:
738 : : case CFG_METHOD_54:
739 : : case CFG_METHOD_55:
740 : 0 : rtl8125_oob_mutex_unlock(hw);
741 : 0 : break;
742 : : }
743 : :
744 : : /*
745 : : * DMY_PWR_REG_0
746 : : * (1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask
747 : : */
748 : 0 : rtl_set_mac_ocp_bit(hw, 0xC0AC,
749 : : (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12));
750 : :
751 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xD430);
752 : 0 : mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 |
753 : : BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
754 : 0 : mac_ocp_data |= 0x45F;
755 : 0 : rtl_mac_ocp_write(hw, 0xD430, mac_ocp_data);
756 : :
757 [ # # ]: 0 : if (!hw->DASH)
758 : 0 : RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6 | BIT_7);
759 : : else
760 : 0 : RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~(BIT_6 | BIT_7));
761 : :
762 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
763 : : hw->mcfg == CFG_METHOD_52)
764 : 0 : RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0);
765 : :
766 : 0 : rtl_disable_eee_plus(hw);
767 : :
768 : 0 : mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
769 : 0 : mac_ocp_data &= ~BIT_2;
770 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71)
771 : 0 : mac_ocp_data &= ~(BIT_9 | BIT_8);
772 : 0 : rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
773 : :
774 : : /* Clear TCAM entries */
775 : 0 : rtl_set_mac_ocp_bit(hw, 0xEB54, BIT_0);
776 : 0 : rte_delay_us(1);
777 : 0 : rtl_clear_mac_ocp_bit(hw, 0xEB54, BIT_0);
778 : :
779 : 0 : RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5));
780 : :
781 [ # # ]: 0 : switch (hw->mcfg) {
782 : 0 : case CFG_METHOD_54 ... CFG_METHOD_57:
783 : 0 : RTL_W8(hw, 0xd8, RTL_R8(hw, 0xd8) & ~EnableRxDescV4_0);
784 : : break;
785 : : }
786 : : }
787 : :
788 : : /* Other hw parameters */
789 : 0 : rtl_hw_clear_timer_int(hw);
790 : :
791 : 0 : rtl_hw_clear_int_miti(hw);
792 : :
793 [ # # ]: 0 : switch (hw->mcfg) {
794 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
795 : : case CFG_METHOD_69 ... CFG_METHOD_71:
796 : 0 : rtl_mac_ocp_write(hw, 0xE098, 0xC302);
797 : 0 : break;
798 : : }
799 : :
800 : 0 : rtl_disable_cfg9346_write(hw);
801 : :
802 : 0 : rte_delay_us(10);
803 : 0 : }
804 : :
805 : : int
806 : 0 : rtl_set_hw_ops(struct rtl_hw *hw)
807 : : {
808 [ # # # # : 0 : switch (hw->mcfg) {
# # ]
809 : : /* 8125A */
810 : 0 : case CFG_METHOD_48:
811 : : case CFG_METHOD_49:
812 : 0 : hw->hw_ops = rtl8125a_ops;
813 : 0 : return 0;
814 : : /* 8125B */
815 : 0 : case CFG_METHOD_50:
816 : : case CFG_METHOD_51:
817 : 0 : hw->hw_ops = rtl8125b_ops;
818 : 0 : return 0;
819 : : /* 8125BP */
820 : 0 : case CFG_METHOD_54:
821 : : case CFG_METHOD_55:
822 : 0 : hw->hw_ops = rtl8125bp_ops;
823 : 0 : return 0;
824 : : /* 8125D */
825 : 0 : case CFG_METHOD_56:
826 : : case CFG_METHOD_57:
827 : 0 : hw->hw_ops = rtl8125d_ops;
828 : 0 : return 0;
829 : : /* 8126A */
830 : 0 : case CFG_METHOD_69 ... CFG_METHOD_71:
831 : 0 : hw->hw_ops = rtl8126a_ops;
832 : 0 : return 0;
833 : : default:
834 : : return -ENOTSUP;
835 : : }
836 : : }
837 : :
838 : : void
839 : 0 : rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw)
840 : : {
841 : : u16 reg_addr;
842 : :
843 : 0 : rtl_enable_aspm_clkreq_lock(hw, 0);
844 : :
845 [ # # ]: 0 : switch (hw->mcfg) {
846 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
847 : : case CFG_METHOD_69 ... CFG_METHOD_71:
848 : 0 : rtl_mac_ocp_write(hw, 0xFC48, 0x0000);
849 : 0 : break;
850 : : }
851 : :
852 [ # # ]: 0 : switch (hw->mcfg) {
853 : : case CFG_METHOD_48 ... CFG_METHOD_57:
854 : : case CFG_METHOD_69 ... CFG_METHOD_71:
855 [ # # ]: 0 : for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2)
856 : 0 : rtl_mac_ocp_write(hw, reg_addr, 0x0000);
857 : :
858 : : rte_delay_ms(3);
859 : :
860 : 0 : rtl_mac_ocp_write(hw, 0xFC26, 0x0000);
861 : 0 : break;
862 : : }
863 : 0 : }
864 : :
865 : : static void
866 : 0 : rtl_switch_mac_mcu_ram_code_page(struct rtl_hw *hw, u16 page)
867 : : {
868 : : u16 tmp_ushort;
869 : :
870 : 0 : page &= (BIT_1 | BIT_0);
871 : 0 : tmp_ushort = rtl_mac_ocp_read(hw, 0xE446);
872 : 0 : tmp_ushort &= ~(BIT_1 | BIT_0);
873 : 0 : tmp_ushort |= page;
874 : 0 : rtl_mac_ocp_write(hw, 0xE446, tmp_ushort);
875 : 0 : }
876 : :
877 : : static void
878 : 0 : _rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
879 : : {
880 : : u16 i;
881 : :
882 [ # # ]: 0 : for (i = 0; i < entry_cnt; i++)
883 : 0 : rtl_mac_ocp_write(hw, 0xF800 + i * 2, entry[i]);
884 : 0 : }
885 : :
886 : : static void
887 : 0 : _rtl_write_mac_mcu_ram_code_with_page(struct rtl_hw *hw, const u16 *entry,
888 : : u16 entry_cnt, u16 page_size)
889 : : {
890 : : u16 i;
891 : : u16 offset;
892 : : u16 page;
893 : :
894 [ # # ]: 0 : if (page_size == 0)
895 : : return;
896 : :
897 [ # # ]: 0 : for (i = 0; i < entry_cnt; i++) {
898 : 0 : offset = i % page_size;
899 [ # # ]: 0 : if (offset == 0) {
900 : 0 : page = (i / page_size);
901 : 0 : rtl_switch_mac_mcu_ram_code_page(hw, page);
902 : : }
903 : 0 : rtl_mac_ocp_write(hw, 0xF800 + offset * 2, entry[i]);
904 : : }
905 : : }
906 : :
907 : : void
908 : 0 : rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
909 : : {
910 [ # # ]: 0 : if (HW_SUPPORT_MAC_MCU(hw) == FALSE)
911 : : return;
912 [ # # ]: 0 : if (entry == NULL || entry_cnt == 0)
913 : : return;
914 : :
915 [ # # ]: 0 : if (hw->MacMcuPageSize > 0)
916 : 0 : _rtl_write_mac_mcu_ram_code_with_page(hw, entry, entry_cnt,
917 : : hw->MacMcuPageSize);
918 : : else
919 : 0 : _rtl_write_mac_mcu_ram_code(hw, entry, entry_cnt);
920 : : }
921 : :
922 : : bool
923 : 0 : rtl_is_speed_mode_valid(u32 speed)
924 : : {
925 [ # # ]: 0 : switch (speed) {
926 : : case SPEED_5000:
927 : : case SPEED_2500:
928 : : case SPEED_1000:
929 : : case SPEED_100:
930 : : case SPEED_10:
931 : : return true;
932 : 0 : default:
933 : 0 : return false;
934 : : }
935 : : }
936 : :
937 : : static bool
938 : : rtl_is_duplex_mode_valid(u8 duplex)
939 : : {
940 [ # # ]: 0 : switch (duplex) {
941 : : case DUPLEX_FULL:
942 : : case DUPLEX_HALF:
943 : : return true;
944 : : default:
945 : : return false;
946 : : }
947 : : }
948 : :
949 : : static bool
950 : : rtl_is_autoneg_mode_valid(u32 autoneg)
951 : : {
952 : : switch (autoneg) {
953 : : case AUTONEG_ENABLE:
954 : : case AUTONEG_DISABLE:
955 : : return true;
956 : : default:
957 : : return false;
958 : : }
959 : : }
960 : :
961 : : void
962 : 0 : rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex,
963 : : enum rtl_fc_mode fc)
964 : : {
965 : : u64 adv;
966 : :
967 [ # # ]: 0 : if (!rtl_is_speed_mode_valid(speed))
968 : : speed = SPEED_5000;
969 : :
970 : : if (!rtl_is_duplex_mode_valid(duplex))
971 : : duplex = DUPLEX_FULL;
972 : :
973 : : if (!rtl_is_autoneg_mode_valid(autoneg))
974 : : autoneg = AUTONEG_ENABLE;
975 : :
976 : 0 : speed = RTE_MIN(speed, hw->HwSuppMaxPhyLinkSpeed);
977 : :
978 : : adv = 0;
979 [ # # # ]: 0 : switch (speed) {
980 : 0 : case SPEED_5000:
981 : : adv |= ADVERTISE_5000_FULL;
982 : : /* Fall through */
983 : 0 : case SPEED_2500:
984 : 0 : adv |= ADVERTISE_2500_FULL;
985 : : /* Fall through */
986 : 0 : default:
987 : 0 : adv |= (ADVERTISE_10_HALF | ADVERTISE_10_FULL |
988 : : ADVERTISE_100_HALF | ADVERTISE_100_FULL |
989 : : ADVERTISE_1000_HALF | ADVERTISE_1000_FULL);
990 : : break;
991 : : }
992 : :
993 : 0 : hw->autoneg = autoneg;
994 : 0 : hw->speed = speed;
995 : 0 : hw->duplex = duplex;
996 : 0 : hw->advertising = adv;
997 : 0 : hw->fcpause = fc;
998 : 0 : }
999 : :
1000 : : static void
1001 : 0 : rtl_init_software_variable(struct rtl_hw *hw)
1002 : : {
1003 : : int tx_no_close_enable = 1;
1004 : : unsigned int speed_mode = SPEED_5000;
1005 : : unsigned int duplex_mode = DUPLEX_FULL;
1006 : : unsigned int autoneg_mode = AUTONEG_ENABLE;
1007 : : u8 tmp;
1008 : :
1009 [ # # # ]: 0 : switch (hw->mcfg) {
1010 : 0 : case CFG_METHOD_48:
1011 : : case CFG_METHOD_49:
1012 : 0 : tmp = (u8)rtl_mac_ocp_read(hw, 0xD006);
1013 [ # # ]: 0 : if (tmp == 0x02 || tmp == 0x04)
1014 : 0 : hw->HwSuppDashVer = 2;
1015 : : break;
1016 : 0 : case CFG_METHOD_54:
1017 : : case CFG_METHOD_55:
1018 : 0 : hw->HwSuppDashVer = 4;
1019 : 0 : break;
1020 : 0 : default:
1021 : 0 : hw->HwSuppDashVer = 0;
1022 : 0 : break;
1023 : : }
1024 : :
1025 [ # # # ]: 0 : switch (hw->mcfg) {
1026 : 0 : case CFG_METHOD_48:
1027 : : case CFG_METHOD_49:
1028 [ # # ]: 0 : if (HW_DASH_SUPPORT_DASH(hw))
1029 : 0 : hw->HwSuppOcpChannelVer = 2;
1030 : : break;
1031 : 0 : case CFG_METHOD_54:
1032 : : case CFG_METHOD_55:
1033 : 0 : hw->HwSuppOcpChannelVer = 2;
1034 : 0 : break;
1035 : : }
1036 : :
1037 : 0 : hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw);
1038 : :
1039 [ # # # # ]: 0 : if (HW_DASH_SUPPORT_DASH(hw) && rtl_check_dash(hw))
1040 : 0 : hw->DASH = 1;
1041 : : else
1042 : 0 : hw->DASH = 0;
1043 : :
1044 [ # # ]: 0 : if (HW_DASH_SUPPORT_TYPE_2(hw))
1045 : 0 : hw->cmac_ioaddr = hw->mmio_addr;
1046 : :
1047 [ # # # # : 0 : switch (hw->mcfg) {
# # # ]
1048 : 0 : case CFG_METHOD_48:
1049 : : case CFG_METHOD_49:
1050 : 0 : hw->chipset_name = RTL8125A;
1051 : 0 : break;
1052 : 0 : case CFG_METHOD_50:
1053 : : case CFG_METHOD_51:
1054 : 0 : hw->chipset_name = RTL8125B;
1055 : 0 : break;
1056 : 0 : case CFG_METHOD_52:
1057 : : case CFG_METHOD_53:
1058 : 0 : hw->chipset_name = RTL8168KB;
1059 : 0 : break;
1060 : 0 : case CFG_METHOD_54:
1061 : : case CFG_METHOD_55:
1062 : 0 : hw->chipset_name = RTL8125BP;
1063 : 0 : break;
1064 : 0 : case CFG_METHOD_56:
1065 : : case CFG_METHOD_57:
1066 : 0 : hw->chipset_name = RTL8125D;
1067 : 0 : break;
1068 : 0 : case CFG_METHOD_69 ... CFG_METHOD_71:
1069 : 0 : hw->chipset_name = RTL8126A;
1070 : 0 : break;
1071 : 0 : default:
1072 : 0 : hw->chipset_name = UNKNOWN;
1073 : 0 : break;
1074 : : }
1075 : :
1076 [ # # ]: 0 : switch (hw->mcfg) {
1077 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1078 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1079 : 0 : hw->HwSuppNowIsOobVer = 1;
1080 : : }
1081 : :
1082 [ # # ]: 0 : switch (hw->mcfg) {
1083 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1084 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1085 : 0 : hw->HwSuppCheckPhyDisableModeVer = 3;
1086 : : }
1087 : :
1088 [ # # # ]: 0 : switch (hw->mcfg) {
1089 : 0 : case CFG_METHOD_48 ... CFG_METHOD_51:
1090 : : case CFG_METHOD_54 ... CFG_METHOD_57:
1091 : 0 : hw->HwSuppMaxPhyLinkSpeed = SPEED_2500;
1092 : 0 : break;
1093 : 0 : case CFG_METHOD_69 ... CFG_METHOD_71:
1094 : 0 : hw->HwSuppMaxPhyLinkSpeed = SPEED_5000;
1095 : 0 : break;
1096 : 0 : default:
1097 : 0 : hw->HwSuppMaxPhyLinkSpeed = SPEED_1000;
1098 : 0 : break;
1099 : : }
1100 : :
1101 [ # # # # : 0 : switch (hw->mcfg) {
# ]
1102 : 0 : case CFG_METHOD_48 ... CFG_METHOD_53:
1103 : 0 : hw->HwSuppTxNoCloseVer = 3;
1104 : 0 : break;
1105 : 0 : case CFG_METHOD_54 ... CFG_METHOD_57:
1106 : 0 : hw->HwSuppTxNoCloseVer = 6;
1107 : 0 : break;
1108 : 0 : case CFG_METHOD_69:
1109 : 0 : hw->HwSuppTxNoCloseVer = 4;
1110 : 0 : break;
1111 : 0 : case CFG_METHOD_70:
1112 : : case CFG_METHOD_71:
1113 : 0 : hw->HwSuppTxNoCloseVer = 5;
1114 : 0 : break;
1115 : : }
1116 : :
1117 [ # # # # ]: 0 : switch (hw->HwSuppTxNoCloseVer) {
1118 : 0 : case 5:
1119 : : case 6:
1120 : 0 : hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4;
1121 : 0 : break;
1122 : 0 : case 4:
1123 : 0 : hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3;
1124 : 0 : break;
1125 : 0 : case 3:
1126 : 0 : hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2;
1127 : 0 : break;
1128 : : default:
1129 : : tx_no_close_enable = 0;
1130 : : break;
1131 : : }
1132 : :
1133 [ # # # # ]: 0 : if (hw->HwSuppTxNoCloseVer > 0 && tx_no_close_enable == 1)
1134 : 0 : hw->EnableTxNoClose = TRUE;
1135 : :
1136 [ # # # ]: 0 : switch (hw->HwSuppTxNoCloseVer) {
1137 : 0 : case 4:
1138 : : case 5:
1139 : 0 : hw->hw_clo_ptr_reg = HW_CLO_PTR0_8126;
1140 : 0 : hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8126;
1141 : 0 : break;
1142 : 0 : case 6:
1143 : 0 : hw->hw_clo_ptr_reg = HW_CLO_PTR0_8125BP;
1144 : 0 : hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8125BP;
1145 : 0 : break;
1146 : 0 : default:
1147 : 0 : hw->hw_clo_ptr_reg = HW_CLO_PTR0_8125;
1148 : 0 : hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8125;
1149 : 0 : break;
1150 : : }
1151 : :
1152 [ # # # # : 0 : switch (hw->mcfg) {
# # # # #
# # # ]
1153 : 0 : case CFG_METHOD_48:
1154 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_48;
1155 : 0 : break;
1156 : 0 : case CFG_METHOD_49:
1157 : : case CFG_METHOD_52:
1158 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_49;
1159 : 0 : break;
1160 : 0 : case CFG_METHOD_50:
1161 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_50;
1162 : 0 : break;
1163 : 0 : case CFG_METHOD_51:
1164 : : case CFG_METHOD_53:
1165 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_51;
1166 : 0 : break;
1167 : 0 : case CFG_METHOD_54:
1168 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_54;
1169 : 0 : break;
1170 : 0 : case CFG_METHOD_55:
1171 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_55;
1172 : 0 : break;
1173 : 0 : case CFG_METHOD_56:
1174 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_56;
1175 : 0 : break;
1176 : 0 : case CFG_METHOD_57:
1177 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_57;
1178 : 0 : break;
1179 : 0 : case CFG_METHOD_69:
1180 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_69;
1181 : 0 : break;
1182 : 0 : case CFG_METHOD_70:
1183 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_70;
1184 : 0 : break;
1185 : 0 : case CFG_METHOD_71:
1186 : 0 : hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_71;
1187 : 0 : break;
1188 : : }
1189 : :
1190 [ # # ]: 0 : if (hw->HwIcVerUnknown) {
1191 : 0 : hw->NotWrRamCodeToMicroP = TRUE;
1192 : 0 : hw->NotWrMcuPatchCode = TRUE;
1193 : : }
1194 : :
1195 [ # # ]: 0 : switch (hw->mcfg) {
1196 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1197 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1198 : 0 : hw->HwSuppMacMcuVer = 2;
1199 : 0 : break;
1200 : : }
1201 : :
1202 [ # # ]: 0 : switch (hw->mcfg) {
1203 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1204 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1205 : 0 : hw->MacMcuPageSize = RTL_MAC_MCU_PAGE_SIZE;
1206 : 0 : break;
1207 : : }
1208 : :
1209 [ # # ]: 0 : switch (hw->mcfg) {
1210 : 0 : case CFG_METHOD_49:
1211 : : case CFG_METHOD_52:
1212 [ # # ]: 0 : if ((rtl_mac_ocp_read(hw, 0xD442) & BIT_5) &&
1213 [ # # ]: 0 : (rtl_mdio_direct_read_phy_ocp(hw, 0xD068) & BIT_1))
1214 : 0 : hw->RequirePhyMdiSwapPatch = TRUE;
1215 : : break;
1216 : : }
1217 : :
1218 [ # # # # : 0 : switch (hw->mcfg) {
# ]
1219 : 0 : case CFG_METHOD_48:
1220 : : case CFG_METHOD_49:
1221 : : case CFG_METHOD_52:
1222 : 0 : hw->HwSuppIntMitiVer = 3;
1223 : 0 : break;
1224 : 0 : case CFG_METHOD_50:
1225 : : case CFG_METHOD_51:
1226 : : case CFG_METHOD_53:
1227 : : case CFG_METHOD_69:
1228 : 0 : hw->HwSuppIntMitiVer = 4;
1229 : 0 : break;
1230 : 0 : case CFG_METHOD_54 ... CFG_METHOD_57:
1231 : 0 : hw->HwSuppIntMitiVer = 6;
1232 : 0 : break;
1233 : 0 : case CFG_METHOD_70:
1234 : : case CFG_METHOD_71:
1235 : 0 : hw->HwSuppIntMitiVer = 5;
1236 : 0 : break;
1237 : : }
1238 : :
1239 : 0 : rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, rtl_fc_full);
1240 : :
1241 [ # # ]: 0 : switch (hw->mcfg) {
1242 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1243 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1244 : 0 : hw->mcu_pme_setting = rtl_mac_ocp_read(hw, 0xE00A);
1245 : 0 : break;
1246 : : }
1247 : :
1248 : 0 : hw->mtu = RTL_DEFAULT_MTU;
1249 : 0 : }
1250 : :
1251 : : static void
1252 : 0 : rtl_exit_realwow(struct rtl_hw *hw)
1253 : : {
1254 : : /* Disable realwow function */
1255 [ # # ]: 0 : switch (hw->mcfg) {
1256 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1257 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1258 : 0 : rtl_mac_ocp_write(hw, 0xC0BC, 0x00FF);
1259 : 0 : break;
1260 : : }
1261 : 0 : }
1262 : :
1263 : : static void
1264 : : rtl_disable_now_is_oob(struct rtl_hw *hw)
1265 : : {
1266 [ # # ]: 0 : if (hw->HwSuppNowIsOobVer == 1)
1267 : 0 : RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) & ~Now_is_oob);
1268 : : }
1269 : :
1270 : : static void
1271 : : rtl_wait_ll_share_fifo_ready(struct rtl_hw *hw)
1272 : : {
1273 : : int i;
1274 : :
1275 [ # # # # ]: 0 : for (i = 0; i < 10; i++) {
1276 : 0 : rte_delay_us(100);
1277 [ # # # # ]: 0 : if (RTL_R16(hw, 0xD2) & BIT_9)
1278 : : break;
1279 : : }
1280 : : }
1281 : :
1282 : : static void
1283 : 0 : rtl_exit_oob(struct rtl_hw *hw)
1284 : : {
1285 : : u16 data16;
1286 : :
1287 : : rtl_disable_rx_packet_filter(hw);
1288 : :
1289 [ # # ]: 0 : if (HW_DASH_SUPPORT_DASH(hw)) {
1290 : 0 : rtl8125_driver_start(hw);
1291 : 0 : rtl8125_dash2_disable_txrx(hw);
1292 : : }
1293 : :
1294 : 0 : rtl_exit_realwow(hw);
1295 : :
1296 : 0 : rtl_nic_reset(hw);
1297 : :
1298 [ # # ]: 0 : switch (hw->mcfg) {
1299 : : case CFG_METHOD_48 ... CFG_METHOD_57:
1300 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1301 : : rtl_disable_now_is_oob(hw);
1302 : :
1303 : 0 : data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14;
1304 : 0 : rtl_mac_ocp_write(hw, 0xE8DE, data16);
1305 : : rtl_wait_ll_share_fifo_ready(hw);
1306 : :
1307 : 0 : rtl_mac_ocp_write(hw, 0xC0AA, 0x07D0);
1308 : :
1309 : 0 : rtl_mac_ocp_write(hw, 0xC0A6, 0x01B5);
1310 : :
1311 : 0 : rtl_mac_ocp_write(hw, 0xC01E, 0x5555);
1312 : :
1313 : : rtl_wait_ll_share_fifo_ready(hw);
1314 : : break;
1315 : : }
1316 : 0 : }
1317 : :
1318 : : static void
1319 : 0 : rtl_disable_ups(struct rtl_hw *hw)
1320 : : {
1321 [ # # ]: 0 : switch (hw->mcfg) {
1322 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1323 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1324 : 0 : rtl_mac_ocp_write(hw, 0xD40A, rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4);
1325 : 0 : break;
1326 : : }
1327 : 0 : }
1328 : :
1329 : : static void
1330 : 0 : rtl8125_disable_ocp_phy_power_saving(struct rtl_hw *hw)
1331 : : {
1332 : : u16 val;
1333 : :
1334 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
1335 : : hw->mcfg == CFG_METHOD_52) {
1336 : 0 : val = rtl_mdio_direct_read_phy_ocp(hw, 0xC416);
1337 [ # # ]: 0 : if (val != 0x0050) {
1338 : 0 : rtl_set_phy_mcu_patch_request(hw);
1339 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0000);
1340 : 0 : rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0500);
1341 : 0 : rtl_clear_phy_mcu_patch_request(hw);
1342 : : }
1343 : : }
1344 : 0 : }
1345 : :
1346 : : static void
1347 : 0 : rtl_hw_init(struct rtl_hw *hw)
1348 : : {
1349 [ # # ]: 0 : switch (hw->mcfg) {
1350 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1351 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1352 : 0 : rtl_enable_aspm_clkreq_lock(hw, 0);
1353 : : rtl_enable_force_clkreq(hw, 0);
1354 : : break;
1355 : : }
1356 : :
1357 : 0 : rtl_disable_ups(hw);
1358 : :
1359 : 0 : hw->hw_ops.hw_mac_mcu_config(hw);
1360 : :
1361 : : /* Disable ocp phy power saving */
1362 : 0 : rtl8125_disable_ocp_phy_power_saving(hw);
1363 : 0 : }
1364 : :
1365 : : void
1366 : 0 : rtl_hw_initialize(struct rtl_hw *hw)
1367 : : {
1368 : 0 : rtl_init_software_variable(hw);
1369 : :
1370 : 0 : rtl_exit_oob(hw);
1371 : :
1372 : 0 : rtl_hw_init(hw);
1373 : :
1374 : 0 : rtl_nic_reset(hw);
1375 : 0 : }
1376 : :
1377 : : void
1378 : 0 : rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
1379 : : {
1380 : : u32 reg, val32;
1381 : : u32 ic_version_id;
1382 : :
1383 : 0 : val32 = RTL_R32(hw, TxConfig);
1384 : 0 : reg = val32 & 0x7c800000;
1385 : 0 : ic_version_id = val32 & 0x00700000;
1386 : :
1387 [ # # # # : 0 : switch (reg) {
# # ]
1388 : 0 : case 0x60800000:
1389 [ # # ]: 0 : if (ic_version_id == 0x00000000) {
1390 : 0 : hw->mcfg = CFG_METHOD_48;
1391 : :
1392 [ # # ]: 0 : } else if (ic_version_id == 0x100000) {
1393 : 0 : hw->mcfg = CFG_METHOD_49;
1394 : :
1395 : : } else {
1396 : 0 : hw->mcfg = CFG_METHOD_49;
1397 : 0 : hw->HwIcVerUnknown = TRUE;
1398 : : }
1399 : :
1400 : 0 : hw->efuse_ver = EFUSE_SUPPORT_V4;
1401 : 0 : break;
1402 : 0 : case 0x64000000:
1403 [ # # ]: 0 : if (ic_version_id == 0x00000000) {
1404 : 0 : hw->mcfg = CFG_METHOD_50;
1405 : :
1406 [ # # ]: 0 : } else if (ic_version_id == 0x100000) {
1407 : 0 : hw->mcfg = CFG_METHOD_51;
1408 : :
1409 : : } else {
1410 : 0 : hw->mcfg = CFG_METHOD_51;
1411 : 0 : hw->HwIcVerUnknown = TRUE;
1412 : : }
1413 : :
1414 : 0 : hw->efuse_ver = EFUSE_SUPPORT_V4;
1415 : 0 : break;
1416 : 0 : case 0x68000000:
1417 [ # # ]: 0 : if (ic_version_id == 0x00000000) {
1418 : 0 : hw->mcfg = CFG_METHOD_54;
1419 [ # # ]: 0 : } else if (ic_version_id == 0x100000) {
1420 : 0 : hw->mcfg = CFG_METHOD_55;
1421 : : } else {
1422 : 0 : hw->mcfg = CFG_METHOD_55;
1423 : 0 : hw->HwIcVerUnknown = TRUE;
1424 : : }
1425 : :
1426 : 0 : hw->efuse_ver = EFUSE_SUPPORT_V4;
1427 : 0 : break;
1428 : 0 : case 0x68800000:
1429 [ # # ]: 0 : if (ic_version_id == 0x00000000) {
1430 : 0 : hw->mcfg = CFG_METHOD_56;
1431 [ # # ]: 0 : } else if (ic_version_id == 0x100000) {
1432 : 0 : hw->mcfg = CFG_METHOD_57;
1433 : : } else {
1434 : 0 : hw->mcfg = CFG_METHOD_57;
1435 : 0 : hw->HwIcVerUnknown = TRUE;
1436 : : }
1437 : :
1438 : 0 : hw->efuse_ver = EFUSE_SUPPORT_V4;
1439 : 0 : break;
1440 : 0 : case 0x64800000:
1441 [ # # ]: 0 : if (ic_version_id == 0x00000000) {
1442 : 0 : hw->mcfg = CFG_METHOD_69;
1443 [ # # ]: 0 : } else if (ic_version_id == 0x100000) {
1444 : 0 : hw->mcfg = CFG_METHOD_70;
1445 [ # # ]: 0 : } else if (ic_version_id == 0x200000) {
1446 : 0 : hw->mcfg = CFG_METHOD_71;
1447 : : } else {
1448 : 0 : hw->mcfg = CFG_METHOD_71;
1449 : 0 : hw->HwIcVerUnknown = TRUE;
1450 : : }
1451 : :
1452 : 0 : hw->efuse_ver = EFUSE_SUPPORT_V4;
1453 : 0 : break;
1454 : 0 : default:
1455 : 0 : PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg);
1456 : 0 : hw->mcfg = CFG_METHOD_DEFAULT;
1457 : 0 : hw->HwIcVerUnknown = TRUE;
1458 : 0 : hw->efuse_ver = EFUSE_NOT_SUPPORT;
1459 : 0 : break;
1460 : : }
1461 : :
1462 [ # # ]: 0 : if (pci_dev->id.device_id == 0x8162) {
1463 [ # # ]: 0 : if (hw->mcfg == CFG_METHOD_49)
1464 : 0 : hw->mcfg = CFG_METHOD_52;
1465 [ # # ]: 0 : else if (hw->mcfg == CFG_METHOD_51)
1466 : 0 : hw->mcfg = CFG_METHOD_53;
1467 : : }
1468 : 0 : }
1469 : :
1470 : : int
1471 : 0 : rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea)
1472 : : {
1473 : : u8 mac_addr[MAC_ADDR_LEN];
1474 : :
1475 [ # # ]: 0 : switch (hw->mcfg) {
1476 : 0 : case CFG_METHOD_48 ... CFG_METHOD_57:
1477 : : case CFG_METHOD_69 ... CFG_METHOD_71:
1478 : 0 : *(u32 *)&mac_addr[0] = RTL_R32(hw, BACKUP_ADDR0_8125);
1479 : 0 : *(u16 *)&mac_addr[4] = RTL_R16(hw, BACKUP_ADDR1_8125);
1480 : 0 : break;
1481 : : default:
1482 : : break;
1483 : : }
1484 : :
1485 : : rte_ether_addr_copy((struct rte_ether_addr *)mac_addr, ea);
1486 : :
1487 : 0 : return 0;
1488 : : }
1489 : :
1490 : : void
1491 : 0 : rtl_rar_set(struct rtl_hw *hw, uint8_t *addr)
1492 : : {
1493 : : uint32_t rar_low = 0;
1494 : : uint32_t rar_high = 0;
1495 : :
1496 : 0 : rar_low = ((uint32_t)addr[0] | ((uint32_t)addr[1] << 8) |
1497 : 0 : ((uint32_t)addr[2] << 16) | ((uint32_t)addr[3] << 24));
1498 : :
1499 : 0 : rar_high = ((uint32_t)addr[4] | ((uint32_t)addr[5] << 8));
1500 : :
1501 : 0 : rtl_enable_cfg9346_write(hw);
1502 : :
1503 : 0 : RTL_W32(hw, MAC0, rar_low);
1504 : 0 : RTL_W32(hw, MAC4, rar_high);
1505 : :
1506 : 0 : rtl_disable_cfg9346_write(hw);
1507 : 0 : }
1508 : :
1509 : : void
1510 : 0 : rtl_get_tally_stats(struct rtl_hw *hw, struct rte_eth_stats *rte_stats)
1511 : : {
1512 : : struct rtl_counters *counters;
1513 : : uint64_t paddr;
1514 : : u32 cmd;
1515 : : u32 wait_cnt;
1516 : :
1517 : 0 : counters = hw->tally_vaddr;
1518 : 0 : paddr = hw->tally_paddr;
1519 [ # # ]: 0 : if (!counters)
1520 : : return;
1521 : :
1522 : 0 : RTL_W32(hw, CounterAddrHigh, (u64)paddr >> 32);
1523 : 0 : cmd = (u64)paddr & DMA_BIT_MASK(32);
1524 : 0 : RTL_W32(hw, CounterAddrLow, cmd);
1525 : 0 : RTL_W32(hw, CounterAddrLow, cmd | CounterDump);
1526 : :
1527 : : wait_cnt = 0;
1528 [ # # ]: 0 : while (RTL_R32(hw, CounterAddrLow) & CounterDump) {
1529 : 0 : rte_delay_us(10);
1530 : :
1531 : 0 : wait_cnt++;
1532 [ # # ]: 0 : if (wait_cnt > 20)
1533 : : break;
1534 : : }
1535 : :
1536 : : /* RX errors */
1537 : 0 : rte_stats->imissed = rte_le_to_cpu_64(counters->rx_missed);
1538 : 0 : rte_stats->ierrors = rte_le_to_cpu_64(counters->rx_errors);
1539 : :
1540 : : /* TX errors */
1541 : 0 : rte_stats->oerrors = rte_le_to_cpu_64(counters->tx_errors);
1542 : :
1543 : 0 : rte_stats->ipackets = rte_le_to_cpu_64(counters->rx_packets);
1544 : 0 : rte_stats->opackets = rte_le_to_cpu_64(counters->tx_packets);
1545 : : }
1546 : :
1547 : : void
1548 : 0 : rtl_clear_tally_stats(struct rtl_hw *hw)
1549 : : {
1550 [ # # ]: 0 : if (!hw->tally_paddr)
1551 : : return;
1552 : :
1553 : 0 : RTL_W32(hw, CounterAddrHigh, (u64)hw->tally_paddr >> 32);
1554 : 0 : RTL_W32(hw, CounterAddrLow,
1555 : : ((u64)hw->tally_paddr & (DMA_BIT_MASK(32))) | CounterReset);
1556 : : }
1557 : :
1558 : : int
1559 : 0 : rtl_tally_init(struct rte_eth_dev *dev)
1560 : : {
1561 : 0 : struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);
1562 : 0 : struct rtl_hw *hw = &adapter->hw;
1563 : : const struct rte_memzone *mz;
1564 : :
1565 : 0 : mz = rte_eth_dma_zone_reserve(dev, "tally_counters", 0,
1566 : 0 : sizeof(struct rtl_counters), 64, rte_socket_id());
1567 [ # # ]: 0 : if (mz == NULL)
1568 : : return -ENOMEM;
1569 : :
1570 : 0 : hw->tally_vaddr = mz->addr;
1571 : 0 : hw->tally_paddr = mz->iova;
1572 : :
1573 : : /* Fill tally addrs */
1574 : 0 : RTL_W32(hw, CounterAddrHigh, (u64)hw->tally_paddr >> 32);
1575 : 0 : RTL_W32(hw, CounterAddrLow, (u64)hw->tally_paddr & (DMA_BIT_MASK(32)));
1576 : :
1577 : : /* Reset the hw statistics */
1578 : 0 : rtl_clear_tally_stats(hw);
1579 : :
1580 : 0 : return 0;
1581 : : }
1582 : :
1583 : : void
1584 : 0 : rtl_tally_free(struct rte_eth_dev *dev)
1585 : : {
1586 : 0 : rte_eth_dma_zone_free(dev, "tally_counters", 0);
1587 : 0 : }
|