LCOV - code coverage report
Current view: top level - drivers/net/r8169 - r8169_hw.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 1239 0.0 %
Date: 2025-07-01 21:32:37 Functions: 0 65 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 580 0.0 %

           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                 :            : #include "r8169_fiber.h"
      16                 :            : 
      17                 :            : static u32
      18                 :          0 : rtl_eri_read_with_oob_base_address(struct rtl_hw *hw, int addr, int len,
      19                 :            :                                    int type, const u32 base_address)
      20                 :            : {
      21                 :            :         int i, val_shift, shift = 0;
      22                 :            :         u32 value1 = 0;
      23                 :            :         u32 value2 = 0;
      24                 :            :         u32 eri_cmd, tmp, mask;
      25                 :          0 :         const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) |
      26                 :          0 :                                              (base_address & 0x000FFF);
      27                 :            : 
      28         [ #  # ]:          0 :         if (len > 4 || len <= 0)
      29                 :            :                 return -1;
      30                 :            : 
      31         [ #  # ]:          0 :         while (len > 0) {
      32                 :          0 :                 val_shift = addr % ERIAR_Addr_Align;
      33                 :          0 :                 addr = addr & ~0x3;
      34                 :            : 
      35                 :          0 :                 eri_cmd = ERIAR_Read | transformed_base_address |
      36                 :          0 :                           type << ERIAR_Type_shift |
      37                 :          0 :                           ERIAR_ByteEn << ERIAR_ByteEn_shift |
      38                 :          0 :                           (addr & 0x0FFF);
      39         [ #  # ]:          0 :                 if (addr & 0xF000) {
      40                 :            :                         tmp = addr & 0xF000;
      41                 :            :                         tmp >>= 12;
      42                 :          0 :                         eri_cmd |= (tmp << 20) & 0x00F00000;
      43                 :            :                 }
      44                 :            : 
      45                 :          0 :                 RTL_W32(hw, ERIAR, eri_cmd);
      46                 :            : 
      47         [ #  # ]:          0 :                 for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
      48                 :          0 :                         rte_delay_us(RTL_CHANNEL_WAIT_TIME);
      49                 :            : 
      50                 :            :                         /* Check if the NIC has completed ERI read */
      51         [ #  # ]:          0 :                         if (RTL_R32(hw, ERIAR) & ERIAR_Flag)
      52                 :            :                                 break;
      53                 :            :                 }
      54                 :            : 
      55         [ #  # ]:          0 :                 if (len == 1)
      56                 :          0 :                         mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
      57         [ #  # ]:          0 :                 else if (len == 2)
      58                 :          0 :                         mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
      59         [ #  # ]:          0 :                 else if (len == 3)
      60                 :          0 :                         mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
      61                 :            :                 else
      62                 :          0 :                         mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
      63                 :            : 
      64                 :          0 :                 value1 = RTL_R32(hw, ERIDR) & mask;
      65                 :          0 :                 value2 |= (value1 >> val_shift * 8) << shift * 8;
      66                 :            : 
      67         [ #  # ]:          0 :                 if (len <= 4 - val_shift) {
      68                 :            :                         len = 0;
      69                 :            :                 } else {
      70                 :          0 :                         len -= (4 - val_shift);
      71                 :            :                         shift = 4 - val_shift;
      72                 :          0 :                         addr += 4;
      73                 :            :                 }
      74                 :            :         }
      75                 :            : 
      76                 :          0 :         rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
      77                 :            : 
      78                 :          0 :         return value2;
      79                 :            : }
      80                 :            : 
      81                 :            : u32
      82                 :          0 : rtl_eri_read(struct rtl_hw *hw, int addr, int len, int type)
      83                 :            : {
      84                 :          0 :         return rtl_eri_read_with_oob_base_address(hw, addr, len, type, 0);
      85                 :            : }
      86                 :            : 
      87                 :            : static int
      88                 :          0 : rtl_eri_write_with_oob_base_address(struct rtl_hw *hw, int addr,
      89                 :            :                                     int len, u32 value, int type,
      90                 :            :                                     const u32 base_address)
      91                 :            : {
      92                 :            :         int i, val_shift, shift = 0;
      93                 :            :         u32 value1 = 0;
      94                 :            :         u32 eri_cmd, mask, tmp;
      95                 :          0 :         const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) |
      96                 :          0 :                                              (base_address & 0x000FFF);
      97                 :            : 
      98         [ #  # ]:          0 :         if (len > 4 || len <= 0)
      99                 :            :                 return -1;
     100                 :            : 
     101         [ #  # ]:          0 :         while (len > 0) {
     102                 :          0 :                 val_shift = addr % ERIAR_Addr_Align;
     103                 :          0 :                 addr = addr & ~0x3;
     104                 :            : 
     105         [ #  # ]:          0 :                 if (len == 1)
     106                 :          0 :                         mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
     107         [ #  # ]:          0 :                 else if (len == 2)
     108                 :          0 :                         mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     109         [ #  # ]:          0 :                 else if (len == 3)
     110                 :          0 :                         mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     111                 :            :                 else
     112                 :          0 :                         mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     113                 :            : 
     114                 :          0 :                 value1 = rtl_eri_read_with_oob_base_address(hw, addr, 4, type,
     115                 :          0 :                                                             base_address) & ~mask;
     116                 :          0 :                 value1 |= ((value << val_shift * 8) >> shift * 8);
     117                 :            : 
     118                 :          0 :                 RTL_W32(hw, ERIDR, value1);
     119                 :            : 
     120                 :          0 :                 eri_cmd = ERIAR_Write | transformed_base_address |
     121                 :          0 :                           type << ERIAR_Type_shift |
     122                 :          0 :                           ERIAR_ByteEn << ERIAR_ByteEn_shift |
     123                 :          0 :                           (addr & 0x0FFF);
     124         [ #  # ]:          0 :                 if (addr & 0xF000) {
     125                 :            :                         tmp = addr & 0xF000;
     126                 :            :                         tmp >>= 12;
     127                 :          0 :                         eri_cmd |= (tmp << 20) & 0x00F00000;
     128                 :            :                 }
     129                 :            : 
     130                 :          0 :                 RTL_W32(hw, ERIAR, eri_cmd);
     131                 :            : 
     132         [ #  # ]:          0 :                 for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
     133                 :          0 :                         rte_delay_us(RTL_CHANNEL_WAIT_TIME);
     134                 :            : 
     135                 :            :                         /* Check if the NIC has completed ERI write */
     136         [ #  # ]:          0 :                         if (!(RTL_R32(hw, ERIAR) & ERIAR_Flag))
     137                 :            :                                 break;
     138                 :            :                 }
     139                 :            : 
     140         [ #  # ]:          0 :                 if (len <= 4 - val_shift) {
     141                 :            :                         len = 0;
     142                 :            :                 } else {
     143                 :          0 :                         len -= (4 - val_shift);
     144                 :            :                         shift = 4 - val_shift;
     145                 :          0 :                         addr += 4;
     146                 :            :                 }
     147                 :            :         }
     148                 :            : 
     149                 :          0 :         rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
     150                 :            : 
     151                 :          0 :         return 0;
     152                 :            : }
     153                 :            : 
     154                 :            : int
     155                 :          0 : rtl_eri_write(struct rtl_hw *hw, int addr, int len, u32 value, int type)
     156                 :            : {
     157                 :          0 :         return rtl_eri_write_with_oob_base_address(hw, addr, len, value, type,
     158                 :            :                                                    NO_BASE_ADDRESS);
     159                 :            : }
     160                 :            : 
     161                 :            : static u32
     162                 :            : rtl_ocp_read_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
     163                 :            :                                    const u32 base_address)
     164                 :            : {
     165                 :          0 :         return rtl_eri_read_with_oob_base_address(hw, addr, len, ERIAR_OOB,
     166                 :            :                                                   base_address);
     167                 :            : }
     168                 :            : 
     169                 :            : static u32
     170                 :          0 : rtl8168_real_ocp_read(struct rtl_hw *hw, u16 addr, u8 len)
     171                 :            : {
     172                 :            :         int i, val_shift, shift = 0;
     173                 :            :         u32 value1, value2, mask;
     174                 :            : 
     175                 :            :         value1 = 0;
     176                 :            :         value2 = 0;
     177                 :            : 
     178         [ #  # ]:          0 :         if (len > 4 || len <= 0)
     179                 :            :                 return -1;
     180                 :            : 
     181         [ #  # ]:          0 :         while (len > 0) {
     182                 :          0 :                 val_shift = addr % 4;
     183                 :          0 :                 addr = addr & ~0x3;
     184                 :            : 
     185                 :          0 :                 RTL_W32(hw, OCPAR, (0x0F << 12) | (addr & 0xFFF));
     186                 :            : 
     187         [ #  # ]:          0 :                 for (i = 0; i < 20; i++) {
     188                 :          0 :                         rte_delay_us(100);
     189         [ #  # ]:          0 :                         if (RTL_R32(hw, OCPAR) & OCPAR_Flag)
     190                 :            :                                 break;
     191                 :            :                 }
     192                 :            : 
     193         [ #  # ]:          0 :                 if (len == 1)
     194                 :          0 :                         mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
     195         [ #  # ]:          0 :                 else if (len == 2)
     196                 :          0 :                         mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     197         [ #  # ]:          0 :                 else if (len == 3)
     198                 :          0 :                         mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     199                 :            :                 else
     200                 :          0 :                         mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     201                 :            : 
     202                 :          0 :                 value1 = RTL_R32(hw, OCPDR) & mask;
     203                 :          0 :                 value2 |= (value1 >> val_shift * 8) << shift * 8;
     204                 :            : 
     205         [ #  # ]:          0 :                 if (len <= 4 - val_shift) {
     206                 :            :                         len = 0;
     207                 :            :                 } else {
     208                 :          0 :                         len -= (4 - val_shift);
     209                 :            :                         shift = 4 - val_shift;
     210                 :          0 :                         addr += 4;
     211                 :            :                 }
     212                 :            :         }
     213                 :            : 
     214                 :          0 :         rte_delay_us(20);
     215                 :            : 
     216                 :          0 :         return value2;
     217                 :            : }
     218                 :            : 
     219                 :            : static int
     220                 :          0 : rtl8168_real_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value)
     221                 :            : {
     222                 :            :         int i, val_shift, shift = 0;
     223                 :            :         u32 mask, value1 = 0;
     224                 :            : 
     225         [ #  # ]:          0 :         if (len > 4 || len <= 0)
     226                 :            :                 return -1;
     227                 :            : 
     228         [ #  # ]:          0 :         while (len > 0) {
     229                 :          0 :                 val_shift = addr % 4;
     230                 :          0 :                 addr = addr & ~0x3;
     231                 :            : 
     232         [ #  # ]:          0 :                 if (len == 1)
     233                 :          0 :                         mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
     234         [ #  # ]:          0 :                 else if (len == 2)
     235                 :          0 :                         mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     236         [ #  # ]:          0 :                 else if (len == 3)
     237                 :          0 :                         mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     238                 :            :                 else
     239                 :          0 :                         mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
     240                 :            : 
     241                 :          0 :                 value1 = rtl_ocp_read(hw, addr, 4) & ~mask;
     242                 :          0 :                 value1 |= ((value << val_shift * 8) >> shift * 8);
     243                 :            : 
     244                 :          0 :                 RTL_W32(hw, OCPDR, value1);
     245                 :          0 :                 RTL_W32(hw, OCPAR, OCPAR_Flag | (0x0F << 12) | (addr & 0xFFF));
     246                 :            : 
     247         [ #  # ]:          0 :                 for (i = 0; i < 10; i++) {
     248                 :          0 :                         rte_delay_us(100);
     249                 :            : 
     250                 :            :                         /* Check if the RTL8168 has completed ERI write */
     251         [ #  # ]:          0 :                         if (!(RTL_R32(hw, OCPAR) & OCPAR_Flag))
     252                 :            :                                 break;
     253                 :            :                 }
     254                 :            : 
     255         [ #  # ]:          0 :                 if (len <= 4 - val_shift) {
     256                 :            :                         len = 0;
     257                 :            :                 } else {
     258                 :          0 :                         len -= (4 - val_shift);
     259                 :            :                         shift = 4 - val_shift;
     260                 :          0 :                         addr += 4;
     261                 :            :                 }
     262                 :            :         }
     263                 :            : 
     264                 :          0 :         rte_delay_us(20);
     265                 :            : 
     266                 :          0 :         return 0;
     267                 :            : }
     268                 :            : 
     269                 :            : u32
     270                 :          0 : rtl_ocp_read(struct rtl_hw *hw, u16 addr, u8 len)
     271                 :            : {
     272                 :            :         u32 value = 0;
     273                 :            : 
     274   [ #  #  #  # ]:          0 :         if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp)
     275                 :            :                 return 0xffffffff;
     276                 :            : 
     277         [ #  # ]:          0 :         if (hw->HwSuppOcpChannelVer == 2)
     278                 :          0 :                 value = rtl_ocp_read_with_oob_base_address(hw, addr, len,
     279                 :            :                                                            NO_BASE_ADDRESS);
     280         [ #  # ]:          0 :         else if (hw->HwSuppOcpChannelVer == 3)
     281                 :          0 :                 value = rtl_ocp_read_with_oob_base_address(hw, addr, len,
     282                 :            :                                                            RTL8168FP_OOBMAC_BASE);
     283                 :            :         else
     284                 :          0 :                 value = rtl8168_real_ocp_read(hw, addr, len);
     285                 :            : 
     286                 :            :         return value;
     287                 :            : }
     288                 :            : 
     289                 :            : static u32
     290                 :            : rtl_ocp_write_with_oob_base_address(struct rtl_hw *hw, u16 addr, u8 len,
     291                 :            :                                     u32 value, const u32 base_address)
     292                 :            : {
     293                 :          0 :         return rtl_eri_write_with_oob_base_address(hw, addr, len, value,
     294                 :            :                                                    ERIAR_OOB, base_address);
     295                 :            : }
     296                 :            : 
     297                 :            : void
     298                 :          0 : rtl_ocp_write(struct rtl_hw *hw, u16 addr, u8 len, u32 value)
     299                 :            : {
     300   [ #  #  #  # ]:          0 :         if (rtl_is_8125(hw) && !hw->AllowAccessDashOcp)
     301                 :            :                 return;
     302                 :            : 
     303         [ #  # ]:          0 :         if (hw->HwSuppOcpChannelVer == 2)
     304                 :          0 :                 rtl_ocp_write_with_oob_base_address(hw, addr, len, value,
     305                 :            :                                                     NO_BASE_ADDRESS);
     306         [ #  # ]:          0 :         else if (hw->HwSuppOcpChannelVer == 3)
     307                 :          0 :                 rtl_ocp_write_with_oob_base_address(hw, addr, len, value,
     308                 :            :                                                     RTL8168FP_OOBMAC_BASE);
     309                 :            :         else
     310                 :          0 :                 rtl8168_real_ocp_write(hw, addr, len, value);
     311                 :            : }
     312                 :            : 
     313                 :            : void
     314                 :          0 : rtl_oob_mutex_lock(struct rtl_hw *hw)
     315                 :            : {
     316                 :            :         u8 reg_16, reg_a0;
     317                 :            :         u16 ocp_reg_mutex_ib;
     318                 :            :         u16 ocp_reg_mutex_oob;
     319                 :            :         u16 ocp_reg_mutex_prio;
     320                 :            :         u32 wait_cnt_0, wait_cnt_1;
     321                 :            : 
     322         [ #  # ]:          0 :         if (!hw->DASH)
     323                 :            :                 return;
     324                 :            : 
     325         [ #  # ]:          0 :         switch (hw->mcfg) {
     326                 :          0 :         case CFG_METHOD_23:
     327                 :            :         case CFG_METHOD_27:
     328                 :            :         case CFG_METHOD_28:
     329                 :            :         case CFG_METHOD_31:
     330                 :            :         case CFG_METHOD_32:
     331                 :            :         case CFG_METHOD_33:
     332                 :            :         case CFG_METHOD_34:
     333                 :            :         case CFG_METHOD_48:
     334                 :            :         case CFG_METHOD_49:
     335                 :            :         case CFG_METHOD_52:
     336                 :            :         case CFG_METHOD_54:
     337                 :            :         case CFG_METHOD_55:
     338                 :            :         case CFG_METHOD_58:
     339                 :            :         case CFG_METHOD_91:
     340                 :            :                 ocp_reg_mutex_oob = 0x110;
     341                 :            :                 ocp_reg_mutex_ib = 0x114;
     342                 :            :                 ocp_reg_mutex_prio = 0x11C;
     343                 :            :                 break;
     344                 :            :         default:
     345                 :            :                 return;
     346                 :            :         }
     347                 :            : 
     348                 :          0 :         rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, BIT_0);
     349                 :          0 :         reg_16 = rtl_ocp_read(hw, ocp_reg_mutex_oob, 1);
     350                 :            :         wait_cnt_0 = 0;
     351         [ #  # ]:          0 :         while (reg_16) {
     352                 :          0 :                 reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
     353         [ #  # ]:          0 :                 if (reg_a0) {
     354                 :          0 :                         rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, 0x00);
     355                 :          0 :                         reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
     356                 :            :                         wait_cnt_1 = 0;
     357         [ #  # ]:          0 :                         while (reg_a0) {
     358                 :          0 :                                 reg_a0 = rtl_ocp_read(hw, ocp_reg_mutex_prio, 1);
     359                 :            : 
     360                 :          0 :                                 wait_cnt_1++;
     361                 :            : 
     362         [ #  # ]:          0 :                                 if (wait_cnt_1 > 2000)
     363                 :            :                                         break;
     364                 :            :                         };
     365                 :          0 :                         rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, BIT_0);
     366                 :            :                 }
     367                 :          0 :                 reg_16 = rtl_ocp_read(hw, ocp_reg_mutex_oob, 1);
     368                 :            : 
     369                 :          0 :                 wait_cnt_0++;
     370                 :            : 
     371         [ #  # ]:          0 :                 if (wait_cnt_0 > 2000)
     372                 :            :                         break;
     373                 :            :         };
     374                 :            : }
     375                 :            : 
     376                 :            : void
     377                 :          0 : rtl_oob_mutex_unlock(struct rtl_hw *hw)
     378                 :            : {
     379                 :            :         u16 ocp_reg_mutex_ib;
     380                 :            :         u16 ocp_reg_mutex_prio;
     381                 :            : 
     382         [ #  # ]:          0 :         if (!hw->DASH)
     383                 :            :                 return;
     384                 :            : 
     385         [ #  # ]:          0 :         switch (hw->mcfg) {
     386                 :          0 :         case CFG_METHOD_23:
     387                 :            :         case CFG_METHOD_27:
     388                 :            :         case CFG_METHOD_28:
     389                 :            :         case CFG_METHOD_31:
     390                 :            :         case CFG_METHOD_32:
     391                 :            :         case CFG_METHOD_33:
     392                 :            :         case CFG_METHOD_34:
     393                 :            :         case CFG_METHOD_48:
     394                 :            :         case CFG_METHOD_49:
     395                 :            :         case CFG_METHOD_52:
     396                 :            :         case CFG_METHOD_54:
     397                 :            :         case CFG_METHOD_55:
     398                 :            :         case CFG_METHOD_58:
     399                 :            :         case CFG_METHOD_91:
     400                 :            :                 ocp_reg_mutex_ib = 0x114;
     401                 :            :                 ocp_reg_mutex_prio = 0x11C;
     402                 :            :                 break;
     403                 :            :         default:
     404                 :            :                 return;
     405                 :            :         }
     406                 :            : 
     407                 :          0 :         rtl_ocp_write(hw, ocp_reg_mutex_prio, 1, BIT_0);
     408                 :          0 :         rtl_ocp_write(hw, ocp_reg_mutex_ib, 1, 0x00);
     409                 :            : }
     410                 :            : 
     411                 :            : void
     412                 :          0 : rtl_mac_ocp_write(struct rtl_hw *hw, u16 addr, u16 value)
     413                 :            : {
     414                 :            :         u32 data32;
     415                 :            : 
     416                 :          0 :         data32 = addr / 2;
     417                 :          0 :         data32 <<= OCPR_Addr_Reg_shift;
     418                 :          0 :         data32 += value;
     419                 :          0 :         data32 |= OCPR_Write;
     420                 :            : 
     421                 :          0 :         RTL_W32(hw, MACOCP, data32);
     422                 :          0 : }
     423                 :            : 
     424                 :            : u16
     425                 :          0 : rtl_mac_ocp_read(struct rtl_hw *hw, u16 addr)
     426                 :            : {
     427                 :            :         u32 data32;
     428                 :            :         u16 data16 = 0;
     429                 :            : 
     430                 :          0 :         data32 = addr / 2;
     431                 :          0 :         data32 <<= OCPR_Addr_Reg_shift;
     432                 :            : 
     433                 :          0 :         RTL_W32(hw, MACOCP, data32);
     434                 :          0 :         data16 = (u16)RTL_R32(hw, MACOCP);
     435                 :            : 
     436                 :          0 :         return data16;
     437                 :            : }
     438                 :            : 
     439                 :            : static void
     440                 :          0 : rtl_clear_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
     441                 :            :                           u16 setmask)
     442                 :            : {
     443                 :            :         u16 val;
     444                 :            : 
     445                 :          0 :         val = rtl_mac_ocp_read(hw, addr);
     446                 :          0 :         val &= ~clearmask;
     447                 :          0 :         val |= setmask;
     448                 :          0 :         rtl_mac_ocp_write(hw, addr, val);
     449                 :          0 : }
     450                 :            : 
     451                 :            : void
     452                 :          0 : rtl_clear_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
     453                 :            : {
     454                 :          0 :         rtl_clear_set_mac_ocp_bit(hw, addr, mask, 0);
     455                 :          0 : }
     456                 :            : 
     457                 :            : void
     458                 :          0 : rtl_set_mac_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
     459                 :            : {
     460                 :          0 :         rtl_clear_set_mac_ocp_bit(hw, addr, 0, mask);
     461                 :          0 : }
     462                 :            : 
     463                 :            : u32
     464                 :          0 : rtl_csi_other_fun_read(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr)
     465                 :            : {
     466                 :            :         u32 cmd;
     467                 :            :         int i;
     468                 :            :         u32 value = 0xffffffff;
     469                 :            : 
     470                 :          0 :         cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift |
     471                 :            :               (addr & CSIAR_Addr_Mask);
     472                 :            : 
     473         [ #  # ]:          0 :         if (multi_fun_sel_bit > 7)
     474                 :          0 :                 goto exit;
     475                 :            : 
     476                 :          0 :         cmd |= multi_fun_sel_bit << 16;
     477                 :            : 
     478                 :          0 :         RTL_W32(hw, CSIAR, cmd);
     479                 :            : 
     480         [ #  # ]:          0 :         for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
     481                 :          0 :                 rte_delay_us(RTL_CHANNEL_WAIT_TIME);
     482                 :            : 
     483                 :            :                 /* Check if the NIC has completed CSI read */
     484         [ #  # ]:          0 :                 if (RTL_R32(hw, CSIAR) & CSIAR_Flag) {
     485                 :          0 :                         value = (u32)RTL_R32(hw, CSIDR);
     486                 :          0 :                         break;
     487                 :            :                 }
     488                 :            :         }
     489                 :            : 
     490                 :          0 :         rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
     491                 :            : 
     492                 :          0 : exit:
     493                 :          0 :         return value;
     494                 :            : }
     495                 :            : 
     496                 :            : u32
     497                 :          0 : rtl_csi_read(struct rtl_hw *hw, u32 addr)
     498                 :            : {
     499                 :            :         u8 multi_fun_sel_bit;
     500                 :            : 
     501         [ #  # ]:          0 :         switch (hw->mcfg) {
     502                 :            :         case CFG_METHOD_26:
     503                 :            :         case CFG_METHOD_31:
     504                 :            :         case CFG_METHOD_32:
     505                 :            :         case CFG_METHOD_33:
     506                 :            :         case CFG_METHOD_34:
     507                 :            :                 multi_fun_sel_bit = 1;
     508                 :            :                 break;
     509                 :          0 :         default:
     510                 :            :                 multi_fun_sel_bit = 0;
     511                 :          0 :                 break;
     512                 :            :         }
     513                 :            : 
     514                 :          0 :         return rtl_csi_other_fun_read(hw, multi_fun_sel_bit, addr);
     515                 :            : }
     516                 :            : 
     517                 :            : void
     518                 :          0 : rtl_csi_other_fun_write(struct rtl_hw *hw, u8 multi_fun_sel_bit, u32 addr,
     519                 :            :                         u32 value)
     520                 :            : {
     521                 :            :         u32 cmd;
     522                 :            :         int i;
     523                 :            : 
     524                 :          0 :         RTL_W32(hw, CSIDR, value);
     525                 :          0 :         cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift |
     526                 :            :               (addr & CSIAR_Addr_Mask);
     527                 :            : 
     528         [ #  # ]:          0 :         if (multi_fun_sel_bit > 7)
     529                 :            :                 return;
     530                 :            : 
     531                 :          0 :         cmd |= multi_fun_sel_bit << 16;
     532                 :            : 
     533                 :          0 :         RTL_W32(hw, CSIAR, cmd);
     534                 :            : 
     535         [ #  # ]:          0 :         for (i = 0; i < RTL_CHANNEL_WAIT_COUNT; i++) {
     536                 :          0 :                 rte_delay_us(RTL_CHANNEL_WAIT_TIME);
     537                 :            : 
     538                 :            :                 /* Check if the NIC has completed CSI write */
     539         [ #  # ]:          0 :                 if (!(RTL_R32(hw, CSIAR) & CSIAR_Flag))
     540                 :            :                         break;
     541                 :            :         }
     542                 :            : 
     543                 :          0 :         rte_delay_us(RTL_CHANNEL_EXIT_DELAY_TIME);
     544                 :            : }
     545                 :            : 
     546                 :            : void
     547                 :          0 : rtl_csi_write(struct rtl_hw *hw, u32 addr, u32 value)
     548                 :            : {
     549                 :            :         u8 multi_fun_sel_bit;
     550                 :            : 
     551         [ #  # ]:          0 :         switch (hw->mcfg) {
     552                 :            :         case CFG_METHOD_26:
     553                 :            :         case CFG_METHOD_31:
     554                 :            :         case CFG_METHOD_32:
     555                 :            :         case CFG_METHOD_33:
     556                 :            :         case CFG_METHOD_34:
     557                 :            :                 multi_fun_sel_bit = 1;
     558                 :            :                 break;
     559                 :          0 :         default:
     560                 :            :                 multi_fun_sel_bit = 0;
     561                 :          0 :                 break;
     562                 :            :         }
     563                 :            : 
     564                 :          0 :         rtl_csi_other_fun_write(hw, multi_fun_sel_bit, addr, value);
     565                 :          0 : }
     566                 :            : 
     567                 :            : void
     568                 :          0 : rtl8168_clear_and_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 clearmask,
     569                 :            :                                   u16 setmask)
     570                 :            : {
     571                 :            :         u16 reg_value;
     572                 :            : 
     573                 :          0 :         reg_value = rtl_mac_ocp_read(hw, addr);
     574                 :          0 :         reg_value &= ~clearmask;
     575                 :          0 :         reg_value |= setmask;
     576                 :          0 :         rtl_mac_ocp_write(hw, addr, reg_value);
     577                 :          0 : }
     578                 :            : 
     579                 :            : void
     580                 :          0 : rtl8168_clear_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
     581                 :            : {
     582                 :          0 :         rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, mask, 0);
     583                 :          0 : }
     584                 :            : 
     585                 :            : void
     586                 :          0 : rtl8168_set_mcu_ocp_bit(struct rtl_hw *hw, u16 addr, u16 mask)
     587                 :            : {
     588                 :          0 :         rtl8168_clear_and_set_mcu_ocp_bit(hw, addr, 0, mask);
     589                 :          0 : }
     590                 :            : 
     591                 :            : static void
     592                 :          0 : rtl_enable_rxdvgate(struct rtl_hw *hw)
     593                 :            : {
     594                 :          0 :         RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) | BIT_3);
     595                 :            : 
     596         [ #  # ]:          0 :         if (!rtl_is_8125(hw))
     597                 :            :                 rte_delay_ms(2);
     598                 :          0 : }
     599                 :            : 
     600                 :            : void
     601                 :          0 : rtl_disable_rxdvgate(struct rtl_hw *hw)
     602                 :            : {
     603                 :          0 :         RTL_W8(hw, 0xF2, RTL_R8(hw, 0xF2) & ~BIT_3);
     604                 :            : 
     605         [ #  # ]:          0 :         if (!rtl_is_8125(hw))
     606                 :            :                 rte_delay_ms(2);
     607                 :          0 : }
     608                 :            : 
     609                 :            : static void
     610                 :          0 : rtl_stop_all_request(struct rtl_hw *hw)
     611                 :            : {
     612                 :            :         int i;
     613                 :            : 
     614   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
     615                 :            :         case CFG_METHOD_21:
     616                 :            :         case CFG_METHOD_22:
     617                 :            :         case CFG_METHOD_23:
     618                 :            :         case CFG_METHOD_24:
     619                 :            :         case CFG_METHOD_25:
     620                 :            :         case CFG_METHOD_26:
     621                 :            :         case CFG_METHOD_27:
     622                 :            :         case CFG_METHOD_28:
     623                 :            :         case CFG_METHOD_29:
     624                 :            :         case CFG_METHOD_30:
     625                 :            :         case CFG_METHOD_31:
     626                 :            :         case CFG_METHOD_32:
     627                 :            :         case CFG_METHOD_33:
     628                 :            :         case CFG_METHOD_34:
     629                 :            :         case CFG_METHOD_35:
     630                 :            :         case CFG_METHOD_36:
     631                 :            :         case CFG_METHOD_37:
     632                 :            :                 rte_delay_ms(2);
     633                 :            :                 break;
     634                 :          0 :         case CFG_METHOD_48:
     635                 :            :         case CFG_METHOD_49:
     636                 :            :         case CFG_METHOD_52:
     637                 :          0 :                 RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
     638         [ #  # ]:          0 :                 for (i = 0; i < 20; i++) {
     639                 :          0 :                         rte_delay_us(10);
     640         [ #  # ]:          0 :                         if (!(RTL_R8(hw, ChipCmd) & StopReq))
     641                 :            :                                 break;
     642                 :            :                 }
     643                 :            :                 break;
     644                 :          0 :         case CFG_METHOD_50:
     645                 :            :         case CFG_METHOD_51:
     646                 :            :         case CFG_METHOD_53:
     647                 :            :         case CFG_METHOD_54:
     648                 :            :         case CFG_METHOD_55:
     649                 :            :         case CFG_METHOD_56:
     650                 :            :         case CFG_METHOD_57:
     651                 :            :         case CFG_METHOD_58:
     652                 :            :         case CFG_METHOD_69:
     653                 :            :         case CFG_METHOD_70:
     654                 :            :         case CFG_METHOD_71:
     655                 :            :         case CFG_METHOD_91:
     656                 :          0 :                 RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) | StopReq);
     657                 :          0 :                 rte_delay_us(200);
     658                 :          0 :                 break;
     659                 :            :         }
     660                 :          0 : }
     661                 :            : 
     662                 :            : static void
     663                 :            : rtl_clear_stop_all_request(struct rtl_hw *hw)
     664                 :            : {
     665                 :          0 :         RTL_W8(hw, ChipCmd, RTL_R8(hw, ChipCmd) & (CmdTxEnb | CmdRxEnb));
     666                 :            : }
     667                 :            : 
     668                 :            : static void
     669                 :          0 : rtl_wait_txrx_fifo_empty(struct rtl_hw *hw)
     670                 :            : {
     671                 :            :         int i;
     672                 :            : 
     673         [ #  # ]:          0 :         if (rtl_is_8125(hw)) {
     674         [ #  # ]:          0 :                 for (i = 0; i < 3000; i++) {
     675                 :          0 :                         rte_delay_us(50);
     676         [ #  # ]:          0 :                         if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
     677                 :            :                             (Txfifo_empty | Rxfifo_empty))
     678                 :            :                                 break;
     679                 :            :                 }
     680                 :            :         } else {
     681         [ #  # ]:          0 :                 for (i = 0; i < 10; i++) {
     682                 :          0 :                         rte_delay_us(100);
     683         [ #  # ]:          0 :                         if (RTL_R32(hw, TxConfig) & BIT_11)
     684                 :            :                                 break;
     685                 :            :                 }
     686                 :            : 
     687         [ #  # ]:          0 :                 for (i = 0; i < 10; i++) {
     688                 :          0 :                         rte_delay_us(100);
     689         [ #  # ]:          0 :                         if ((RTL_R8(hw, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) ==
     690                 :            :                             (Txfifo_empty | Rxfifo_empty))
     691                 :            :                                 break;
     692                 :            :                 }
     693                 :            : 
     694                 :            :                 rte_delay_ms(1);
     695                 :            :         }
     696                 :            : 
     697         [ #  # ]:          0 :         switch (hw->mcfg) {
     698                 :            :         case CFG_METHOD_50:
     699                 :            :         case CFG_METHOD_51:
     700                 :            :         case CFG_METHOD_53:
     701                 :            :         case CFG_METHOD_54:
     702                 :            :         case CFG_METHOD_55:
     703                 :            :         case CFG_METHOD_56:
     704                 :            :         case CFG_METHOD_57:
     705                 :            :         case CFG_METHOD_58:
     706                 :            :         case CFG_METHOD_69:
     707                 :            :         case CFG_METHOD_70:
     708                 :            :         case CFG_METHOD_71:
     709                 :            :         case CFG_METHOD_91:
     710         [ #  # ]:          0 :                 for (i = 0; i < 3000; i++) {
     711                 :          0 :                         rte_delay_us(50);
     712         [ #  # ]:          0 :                         if ((RTL_R16(hw, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) ==
     713                 :            :                             (BIT_0 | BIT_1 | BIT_8))
     714                 :            :                                 break;
     715                 :            :                 }
     716                 :            :                 break;
     717                 :            :         }
     718                 :          0 : }
     719                 :            : 
     720                 :            : static void
     721                 :            : rtl_disable_rx_packet_filter(struct rtl_hw *hw)
     722                 :            : {
     723                 :          0 :         RTL_W32(hw, RxConfig, RTL_R32(hw, RxConfig) &
     724                 :            :                 ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast |
     725                 :            :                 AcceptMyPhys | AcceptAllPhys));
     726                 :            : }
     727                 :            : 
     728                 :            : void
     729                 :          0 : rtl_nic_reset(struct rtl_hw *hw)
     730                 :            : {
     731                 :            :         int i;
     732                 :            : 
     733                 :            :         rtl_disable_rx_packet_filter(hw);
     734                 :            : 
     735                 :          0 :         rtl_enable_rxdvgate(hw);
     736                 :            : 
     737                 :          0 :         rtl_stop_all_request(hw);
     738                 :            : 
     739                 :          0 :         rtl_wait_txrx_fifo_empty(hw);
     740                 :            : 
     741                 :            :         rtl_clear_stop_all_request(hw);
     742                 :            : 
     743                 :            :         /* Soft reset the chip. */
     744                 :          0 :         RTL_W8(hw, ChipCmd, CmdReset);
     745                 :            : 
     746                 :            :         /* Check that the chip has finished the reset. */
     747         [ #  # ]:          0 :         for (i = 100; i > 0; i--) {
     748                 :          0 :                 rte_delay_us(100);
     749         [ #  # ]:          0 :                 if ((RTL_R8(hw, ChipCmd) & CmdReset) == 0)
     750                 :            :                         break;
     751                 :            :         }
     752                 :          0 : }
     753                 :            : 
     754                 :            : void
     755                 :          0 : rtl_enable_cfg9346_write(struct rtl_hw *hw)
     756                 :            : {
     757                 :          0 :         RTL_W8(hw, Cfg9346, RTL_R8(hw, Cfg9346) | Cfg9346_Unlock);
     758                 :          0 : }
     759                 :            : 
     760                 :            : void
     761                 :          0 : rtl_disable_cfg9346_write(struct rtl_hw *hw)
     762                 :            : {
     763                 :          0 :         RTL_W8(hw, Cfg9346, RTL_R8(hw, Cfg9346) & ~Cfg9346_Unlock);
     764                 :          0 : }
     765                 :            : 
     766                 :            : static void
     767                 :            : rtl_enable_force_clkreq(struct rtl_hw *hw, bool enable)
     768                 :            : {
     769                 :            :         if (enable)
     770                 :            :                 RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) | BIT_7);
     771                 :            :         else
     772                 :          0 :                 RTL_W8(hw, 0xF1, RTL_R8(hw, 0xF1) & ~BIT_7);
     773                 :            : }
     774                 :            : 
     775                 :            : static void
     776                 :          0 : rtl_enable_aspm_clkreq_lock(struct rtl_hw *hw, bool enable)
     777                 :            : {
     778   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
     779                 :          0 :         case CFG_METHOD_21:
     780                 :            :         case CFG_METHOD_22:
     781                 :            :         case CFG_METHOD_23:
     782                 :            :         case CFG_METHOD_24:
     783                 :            :         case CFG_METHOD_25:
     784                 :            :         case CFG_METHOD_26:
     785                 :            :         case CFG_METHOD_27:
     786                 :            :         case CFG_METHOD_28:
     787                 :            :         case CFG_METHOD_29:
     788                 :            :         case CFG_METHOD_30:
     789                 :            :         case CFG_METHOD_31:
     790                 :            :         case CFG_METHOD_32:
     791                 :            :         case CFG_METHOD_33:
     792                 :            :         case CFG_METHOD_34:
     793                 :            :         case CFG_METHOD_35:
     794                 :            :         case CFG_METHOD_36:
     795                 :            :         case CFG_METHOD_37:
     796         [ #  # ]:          0 :                 if (enable) {
     797                 :          0 :                         RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7);
     798                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
     799                 :            :                 } else {
     800                 :          0 :                         RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7);
     801                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
     802                 :            :                 }
     803                 :          0 :                 rte_delay_us(10);
     804                 :          0 :                 break;
     805                 :          0 :         case CFG_METHOD_48:
     806                 :            :         case CFG_METHOD_49:
     807                 :            :         case CFG_METHOD_50:
     808                 :            :         case CFG_METHOD_51:
     809                 :            :         case CFG_METHOD_52:
     810                 :            :         case CFG_METHOD_53:
     811                 :            :         case CFG_METHOD_54:
     812                 :            :         case CFG_METHOD_55:
     813                 :            :         case CFG_METHOD_56:
     814                 :            :         case CFG_METHOD_57:
     815                 :            :         case CFG_METHOD_58:
     816                 :            :         case CFG_METHOD_69:
     817         [ #  # ]:          0 :                 if (enable) {
     818                 :          0 :                         RTL_W8(hw, Config2, RTL_R8(hw, Config2) | BIT_7);
     819                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
     820                 :            :                 } else {
     821                 :          0 :                         RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~BIT_7);
     822                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
     823                 :            :                 }
     824                 :            :                 break;
     825                 :          0 :         case CFG_METHOD_70:
     826                 :            :         case CFG_METHOD_71:
     827                 :            :         case CFG_METHOD_91:
     828         [ #  # ]:          0 :                 if (enable) {
     829                 :          0 :                         RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) | BIT_3);
     830                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) | BIT_0);
     831                 :            :                 } else {
     832                 :          0 :                         RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) & ~BIT_3);
     833                 :          0 :                         RTL_W8(hw, Config5, RTL_R8(hw, Config5) & ~BIT_0);
     834                 :            :                 }
     835                 :            :                 break;
     836                 :            :         }
     837                 :          0 : }
     838                 :            : 
     839                 :            : static void
     840                 :          0 : rtl_disable_l1_timeout(struct rtl_hw *hw)
     841                 :            : {
     842                 :          0 :         rtl_csi_write(hw, 0x890, rtl_csi_read(hw, 0x890) & ~BIT_0);
     843                 :          0 : }
     844                 :            : 
     845                 :            : static void
     846                 :          0 : rtl8125_disable_eee_plus(struct rtl_hw *hw)
     847                 :            : {
     848                 :          0 :         rtl_mac_ocp_write(hw, 0xE080, rtl_mac_ocp_read(hw, 0xE080) & ~BIT_1);
     849                 :          0 : }
     850                 :            : 
     851                 :            : static void
     852                 :          0 : rtl_hw_clear_timer_int(struct rtl_hw *hw)
     853                 :            : {
     854      [ #  #  # ]:          0 :         switch (hw->mcfg) {
     855                 :          0 :         case CFG_METHOD_21:
     856                 :            :         case CFG_METHOD_22:
     857                 :            :         case CFG_METHOD_23:
     858                 :            :         case CFG_METHOD_24:
     859                 :            :         case CFG_METHOD_25:
     860                 :            :         case CFG_METHOD_26:
     861                 :            :         case CFG_METHOD_27:
     862                 :            :         case CFG_METHOD_28:
     863                 :            :         case CFG_METHOD_29:
     864                 :            :         case CFG_METHOD_30:
     865                 :            :         case CFG_METHOD_31:
     866                 :            :         case CFG_METHOD_32:
     867                 :            :         case CFG_METHOD_33:
     868                 :            :         case CFG_METHOD_34:
     869                 :            :         case CFG_METHOD_35:
     870                 :            :         case CFG_METHOD_36:
     871                 :            :         case CFG_METHOD_37:
     872                 :          0 :                 RTL_W32(hw, TimeInt0, 0x0000);
     873                 :          0 :                 RTL_W32(hw, TimeInt1, 0x0000);
     874                 :          0 :                 RTL_W32(hw, TimeInt2, 0x0000);
     875                 :          0 :                 RTL_W32(hw, TimeInt3, 0x0000);
     876                 :            :                 break;
     877                 :          0 :         case CFG_METHOD_48:
     878                 :            :         case CFG_METHOD_49:
     879                 :            :         case CFG_METHOD_50:
     880                 :            :         case CFG_METHOD_51:
     881                 :            :         case CFG_METHOD_52:
     882                 :            :         case CFG_METHOD_53:
     883                 :            :         case CFG_METHOD_54:
     884                 :            :         case CFG_METHOD_55:
     885                 :            :         case CFG_METHOD_56:
     886                 :            :         case CFG_METHOD_57:
     887                 :            :         case CFG_METHOD_58:
     888                 :            :         case CFG_METHOD_69:
     889                 :            :         case CFG_METHOD_70:
     890                 :            :         case CFG_METHOD_71:
     891                 :            :         case CFG_METHOD_91:
     892                 :          0 :                 RTL_W32(hw, TIMER_INT0_8125, 0x0000);
     893                 :          0 :                 RTL_W32(hw, TIMER_INT1_8125, 0x0000);
     894                 :          0 :                 RTL_W32(hw, TIMER_INT2_8125, 0x0000);
     895                 :          0 :                 RTL_W32(hw, TIMER_INT3_8125, 0x0000);
     896                 :            :                 break;
     897                 :            :         }
     898                 :          0 : }
     899                 :            : 
     900                 :            : static void
     901                 :          0 : rtl8125_hw_clear_int_miti(struct rtl_hw *hw)
     902                 :            : {
     903                 :            :         int i;
     904                 :            : 
     905      [ #  #  # ]:          0 :         switch (hw->HwSuppIntMitiVer) {
     906                 :            :         case 3:
     907                 :            :         case 6:
     908                 :            :                 /* IntMITI_0-IntMITI_31 */
     909         [ #  # ]:          0 :                 for (i = 0xA00; i < 0xB00; i += 4)
     910                 :          0 :                         RTL_W32(hw, i, 0x0000);
     911                 :            :                 break;
     912                 :            :         case 4:
     913                 :            :         case 5:
     914                 :            :                 /* IntMITI_0-IntMITI_15 */
     915         [ #  # ]:          0 :                 for (i = 0xA00; i < 0xA80; i += 4)
     916                 :          0 :                         RTL_W32(hw, i, 0x0000);
     917                 :            : 
     918         [ #  # ]:          0 :                 if (hw->HwSuppIntMitiVer == 5)
     919                 :          0 :                         RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) &
     920                 :            :                                ~(INT_CFG0_TIMEOUT0_BYPASS_8125 |
     921                 :            :                                INT_CFG0_MITIGATION_BYPASS_8125 |
     922                 :            :                                INT_CFG0_RDU_BYPASS_8126));
     923                 :            :                 else
     924                 :          0 :                         RTL_W8(hw, INT_CFG0_8125, RTL_R8(hw, INT_CFG0_8125) &
     925                 :            :                                ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | INT_CFG0_MITIGATION_BYPASS_8125));
     926                 :            : 
     927                 :          0 :                 RTL_W16(hw, INT_CFG1_8125, 0x0000);
     928                 :            :                 break;
     929                 :            :         }
     930                 :          0 : }
     931                 :            : 
     932                 :            : static void
     933                 :          0 : rtl8125_hw_config(struct rtl_hw *hw)
     934                 :            : {
     935                 :            :         u32 mac_ocp_data;
     936                 :            : 
     937                 :          0 :         rtl_nic_reset(hw);
     938                 :            : 
     939                 :          0 :         rtl_enable_cfg9346_write(hw);
     940                 :            : 
     941                 :            :         /* Disable aspm clkreq internal */
     942                 :            :         rtl_enable_force_clkreq(hw, 0);
     943                 :          0 :         rtl_enable_aspm_clkreq_lock(hw, 0);
     944                 :            : 
     945                 :            :         /* Disable magic packet */
     946                 :          0 :         rtl_mac_ocp_write(hw, 0xC0B6, 0);
     947                 :            : 
     948                 :            :         /* Set DMA burst size and interframe gap time */
     949                 :          0 :         RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
     950                 :            :                 (InterFrameGap << TxInterFrameGapShift));
     951                 :            : 
     952         [ #  # ]:          0 :         if (hw->EnableTxNoClose)
     953                 :          0 :                 RTL_W32(hw, TxConfig, (RTL_R32(hw, TxConfig) | BIT_6));
     954                 :            : 
     955                 :            :         /* TCAM */
     956         [ #  # ]:          0 :         switch (hw->mcfg) {
     957                 :          0 :         case CFG_METHOD_48:
     958                 :            :         case CFG_METHOD_49:
     959                 :            :         case CFG_METHOD_50:
     960                 :            :         case CFG_METHOD_51:
     961                 :            :         case CFG_METHOD_52:
     962                 :            :         case CFG_METHOD_53:
     963                 :          0 :                 RTL_W16(hw, 0x382, 0x221B);
     964                 :            :                 break;
     965                 :            :         }
     966                 :            : 
     967         [ #  # ]:          0 :         switch (hw->mcfg) {
     968                 :          0 :         case CFG_METHOD_69:
     969                 :            :         case CFG_METHOD_70:
     970                 :            :         case CFG_METHOD_71:
     971                 :            :         case CFG_METHOD_91:
     972                 :          0 :                 rtl_disable_l1_timeout(hw);
     973                 :          0 :                 break;
     974                 :            :         }
     975                 :            : 
     976                 :            :         /* RSS_control_0 */
     977                 :          0 :         RTL_W32(hw, RSS_CTRL_8125, 0x00);
     978                 :            : 
     979                 :            :         /* VMQ_control */
     980                 :          0 :         RTL_W16(hw, Q_NUM_CTRL_8125, 0x0000);
     981                 :            : 
     982                 :            :         /* Disable speed down */
     983                 :          0 :         RTL_W8(hw, Config1, RTL_R8(hw, Config1) & ~0x10);
     984                 :            : 
     985                 :            :         /* CRC disable set */
     986                 :          0 :         rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
     987                 :          0 :         rtl_mac_ocp_write(hw, 0xC142, 0xFFFF);
     988                 :            : 
     989                 :            :         /* Disable new TX desc format */
     990                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB58);
     991         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71 ||
     992                 :            :             hw->mcfg == CFG_METHOD_91)
     993                 :          0 :                 mac_ocp_data &= ~(BIT_0 | BIT_1);
     994                 :            :         else
     995                 :          0 :                 mac_ocp_data &= ~BIT_0;
     996                 :          0 :         rtl_mac_ocp_write(hw, 0xEB58, mac_ocp_data);
     997                 :            : 
     998         [ #  # ]:          0 :         if (hw->mcfg >= CFG_METHOD_91) {
     999         [ #  # ]:          0 :                 if (hw->EnableTxNoClose)
    1000                 :          0 :                         RTL_W8(hw, 0x20E4, RTL_R8(hw, 0x20E4) | BIT_2);
    1001                 :            :                 else
    1002                 :          0 :                         RTL_W8(hw, 0x20E4, RTL_R8(hw, 0x20E4) & ~BIT_2);
    1003                 :            :         }
    1004                 :            : 
    1005         [ #  # ]:          0 :         switch (hw->mcfg) {
    1006                 :          0 :         case CFG_METHOD_54:
    1007                 :            :         case CFG_METHOD_55:
    1008                 :            :         case CFG_METHOD_56:
    1009                 :            :         case CFG_METHOD_57:
    1010                 :            :         case CFG_METHOD_58:
    1011                 :            :         case CFG_METHOD_70:
    1012                 :            :         case CFG_METHOD_71:
    1013                 :            :         case CFG_METHOD_91:
    1014                 :          0 :                 RTL_W8(hw, 0xD8, RTL_R8(hw, 0xD8) & ~EnableRxDescV4_0);
    1015                 :            :                 break;
    1016                 :            :         }
    1017                 :            : 
    1018         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_58 || hw->mcfg == CFG_METHOD_91) {
    1019                 :          0 :                 rtl_clear_mac_ocp_bit(hw, 0xE00C, BIT_12);
    1020                 :          0 :                 rtl_clear_mac_ocp_bit(hw, 0xC0C2, BIT_6);
    1021                 :            :         }
    1022                 :            : 
    1023                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xE63E);
    1024                 :          0 :         mac_ocp_data &= ~(BIT_5 | BIT_4);
    1025                 :          0 :         mac_ocp_data |= ((0x02 & 0x03) << 4);
    1026                 :          0 :         rtl_mac_ocp_write(hw, 0xE63E, mac_ocp_data);
    1027                 :            : 
    1028                 :            :         /*
    1029                 :            :          * FTR_MCU_CTRL
    1030                 :            :          * 3-2 txpla packet valid start
    1031                 :            :          */
    1032                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
    1033                 :          0 :         mac_ocp_data &= ~BIT_0;
    1034                 :          0 :         rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
    1035                 :          0 :         mac_ocp_data |= BIT_0;
    1036                 :          0 :         rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
    1037                 :            : 
    1038                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xC0B4);
    1039                 :            :         mac_ocp_data |= (BIT_3 | BIT_2);
    1040                 :          0 :         rtl_mac_ocp_write(hw, 0xC0B4, mac_ocp_data);
    1041                 :            : 
    1042                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB6A);
    1043                 :          0 :         mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 |
    1044                 :            :                           BIT_1 | BIT_0);
    1045                 :          0 :         mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0);
    1046                 :          0 :         rtl_mac_ocp_write(hw, 0xEB6A, mac_ocp_data);
    1047                 :            : 
    1048                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xEB50);
    1049                 :          0 :         mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5);
    1050                 :          0 :         mac_ocp_data |= BIT_6;
    1051                 :          0 :         rtl_mac_ocp_write(hw, 0xEB50, mac_ocp_data);
    1052                 :            : 
    1053                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xE056);
    1054                 :          0 :         mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4);
    1055                 :          0 :         rtl_mac_ocp_write(hw, 0xE056, mac_ocp_data);
    1056                 :            : 
    1057                 :            :         /* EEE_CR */
    1058                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xE040);
    1059                 :          0 :         mac_ocp_data &= ~BIT_12;
    1060                 :          0 :         rtl_mac_ocp_write(hw, 0xE040, mac_ocp_data);
    1061                 :            : 
    1062                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
    1063                 :          0 :         mac_ocp_data &= ~(BIT_1 | BIT_0);
    1064                 :          0 :         mac_ocp_data |= BIT_0;
    1065                 :          0 :         rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
    1066                 :            : 
    1067                 :          0 :         rtl_oob_mutex_lock(hw);
    1068                 :            : 
    1069                 :            :         /* MAC_PWRDWN_CR0 */
    1070                 :          0 :         rtl_mac_ocp_write(hw, 0xE0C0, 0x4000);
    1071                 :            : 
    1072                 :          0 :         rtl_set_mac_ocp_bit(hw, 0xE052, (BIT_6 | BIT_5));
    1073                 :          0 :         rtl_clear_mac_ocp_bit(hw, 0xE052, (BIT_3 | BIT_7));
    1074                 :            : 
    1075                 :          0 :         rtl_oob_mutex_unlock(hw);
    1076                 :            : 
    1077                 :            :         /*
    1078                 :            :          * DMY_PWR_REG_0
    1079                 :            :          * (1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask
    1080                 :            :          */
    1081                 :          0 :         rtl_set_mac_ocp_bit(hw, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 |
    1082                 :            :                                          BIT_11 | BIT_12));
    1083                 :            : 
    1084                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xD430);
    1085                 :          0 :         mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 |
    1086                 :            :                           BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
    1087                 :          0 :         mac_ocp_data |= 0x45F;
    1088                 :          0 :         rtl_mac_ocp_write(hw, 0xD430, mac_ocp_data);
    1089                 :            : 
    1090         [ #  # ]:          0 :         if (!hw->DASH)
    1091                 :          0 :                 RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) | BIT_6 | BIT_7);
    1092                 :            :         else
    1093                 :          0 :                 RTL_W8(hw, 0xD0, RTL_R8(hw, 0xD0) & ~(BIT_6 | BIT_7));
    1094                 :            : 
    1095         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_48 || hw->mcfg == CFG_METHOD_49 ||
    1096                 :            :             hw->mcfg == CFG_METHOD_52)
    1097                 :          0 :                 RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) | BIT_0);
    1098                 :            : 
    1099                 :          0 :         rtl8125_disable_eee_plus(hw);
    1100                 :            : 
    1101                 :          0 :         mac_ocp_data = rtl_mac_ocp_read(hw, 0xEA1C);
    1102                 :          0 :         mac_ocp_data &= ~BIT_2;
    1103         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_70 || hw->mcfg == CFG_METHOD_71 ||
    1104                 :            :             hw->mcfg == CFG_METHOD_91)
    1105                 :          0 :                 mac_ocp_data &= ~(BIT_9 | BIT_8);
    1106                 :          0 :         rtl_mac_ocp_write(hw, 0xEA1C, mac_ocp_data);
    1107                 :            : 
    1108                 :            :         /* Clear TCAM entries */
    1109                 :          0 :         rtl_set_mac_ocp_bit(hw, 0xEB54, BIT_0);
    1110                 :          0 :         rte_delay_us(1);
    1111                 :          0 :         rtl_clear_mac_ocp_bit(hw, 0xEB54, BIT_0);
    1112                 :            : 
    1113                 :          0 :         RTL_W16(hw, 0x1880, RTL_R16(hw, 0x1880) & ~(BIT_4 | BIT_5));
    1114                 :            : 
    1115         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_91)
    1116                 :          0 :                 rtl_clear_set_mac_ocp_bit(hw, 0xD40C, 0xE038, 0x8020);
    1117                 :            : 
    1118                 :            :         /* Other hw parameters */
    1119                 :          0 :         rtl_hw_clear_timer_int(hw);
    1120                 :            : 
    1121                 :          0 :         rtl8125_hw_clear_int_miti(hw);
    1122                 :            : 
    1123                 :          0 :         rtl_mac_ocp_write(hw, 0xE098, 0xC302);
    1124                 :            : 
    1125                 :          0 :         rtl_disable_cfg9346_write(hw);
    1126                 :            : 
    1127                 :          0 :         rte_delay_us(10);
    1128                 :          0 : }
    1129                 :            : 
    1130                 :            : static void
    1131                 :          0 : rtl8168_hw_config(struct rtl_hw *hw)
    1132                 :            : {
    1133                 :            :         u32 csi_tmp;
    1134                 :            :         int timeout;
    1135                 :            : 
    1136                 :          0 :         rtl_nic_reset(hw);
    1137                 :            : 
    1138                 :          0 :         rtl_enable_cfg9346_write(hw);
    1139                 :            : 
    1140                 :            :         /* Disable aspm clkreq internal */
    1141                 :            :         rtl_enable_force_clkreq(hw, 0);
    1142                 :          0 :         rtl_enable_aspm_clkreq_lock(hw, 0);
    1143                 :            : 
    1144                 :            :         /* Clear io_rdy_l23 */
    1145                 :          0 :         RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~BIT_1);
    1146                 :            : 
    1147                 :            :         /* Keep magic packet only */
    1148                 :          0 :         csi_tmp = rtl_eri_read(hw, 0xDE, 1, ERIAR_ExGMAC);
    1149                 :          0 :         csi_tmp &= BIT_0;
    1150                 :          0 :         rtl_eri_write(hw, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
    1151                 :            : 
    1152                 :            :         /* Set TxConfig to default */
    1153                 :          0 :         RTL_W32(hw, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
    1154                 :            :                 (InterFrameGap << TxInterFrameGapShift));
    1155                 :            : 
    1156                 :          0 :         hw->hw_ops.hw_config(hw);
    1157                 :            : 
    1158         [ #  # ]:          0 :         switch (hw->mcfg) {
    1159                 :          0 :         case CFG_METHOD_21:
    1160                 :            :         case CFG_METHOD_22:
    1161                 :            :         case CFG_METHOD_23:
    1162                 :            :         case CFG_METHOD_24:
    1163                 :            :         case CFG_METHOD_25:
    1164                 :            :         case CFG_METHOD_26:
    1165                 :            :         case CFG_METHOD_27:
    1166                 :            :         case CFG_METHOD_28:
    1167                 :          0 :                 rtl_eri_write(hw, 0x2F8, 2, 0x1D8F, ERIAR_ExGMAC);
    1168                 :          0 :                 break;
    1169                 :            :         }
    1170                 :            : 
    1171                 :          0 :         rtl_hw_clear_timer_int(hw);
    1172                 :            : 
    1173                 :            :         /* Clkreq exit masks */
    1174                 :          0 :         csi_tmp = rtl_eri_read(hw, 0xD4, 4, ERIAR_ExGMAC);
    1175                 :          0 :         csi_tmp |= (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
    1176                 :          0 :         rtl_eri_write(hw, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
    1177                 :            : 
    1178   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
    1179                 :          0 :         case CFG_METHOD_25:
    1180                 :          0 :                 rtl_mac_ocp_write(hw, 0xD3C0, 0x0B00);
    1181                 :          0 :                 rtl_mac_ocp_write(hw, 0xD3C2, 0x0000);
    1182                 :          0 :                 break;
    1183                 :          0 :         case CFG_METHOD_29:
    1184                 :            :         case CFG_METHOD_30:
    1185                 :            :         case CFG_METHOD_35:
    1186                 :            :         case CFG_METHOD_36:
    1187                 :            :         case CFG_METHOD_37:
    1188                 :          0 :                 rtl_mac_ocp_write(hw, 0xE098, 0x0AA2);
    1189                 :          0 :                 break;
    1190                 :          0 :         case CFG_METHOD_31:
    1191                 :            :         case CFG_METHOD_32:
    1192                 :            :         case CFG_METHOD_33:
    1193                 :            :         case CFG_METHOD_34:
    1194                 :          0 :                 rtl_mac_ocp_write(hw, 0xE098, 0xC302);
    1195                 :          0 :                 break;
    1196                 :            :         }
    1197                 :            : 
    1198         [ #  # ]:          0 :         switch (hw->mcfg) {
    1199                 :            :         case CFG_METHOD_21:
    1200                 :            :         case CFG_METHOD_22:
    1201                 :            :         case CFG_METHOD_24:
    1202                 :            :         case CFG_METHOD_25:
    1203                 :            :         case CFG_METHOD_26:
    1204         [ #  # ]:          0 :                 for (timeout = 0; timeout < 10; timeout++) {
    1205         [ #  # ]:          0 :                         if ((rtl_eri_read(hw, 0x1AE, 2, ERIAR_ExGMAC) & BIT_13) == 0)
    1206                 :            :                                 break;
    1207                 :            :                         rte_delay_ms(1);
    1208                 :            :                 }
    1209                 :            :                 break;
    1210                 :            :         }
    1211                 :            : 
    1212                 :          0 :         rtl_disable_cfg9346_write(hw);
    1213                 :            : 
    1214                 :          0 :         rte_delay_us(10);
    1215                 :          0 : }
    1216                 :            : 
    1217                 :            : void
    1218                 :          0 : rtl_hw_config(struct rtl_hw *hw)
    1219                 :            : {
    1220         [ #  # ]:          0 :         if (rtl_is_8125(hw))
    1221                 :          0 :                 rtl8125_hw_config(hw);
    1222                 :            :         else
    1223                 :          0 :                 rtl8168_hw_config(hw);
    1224                 :          0 : }
    1225                 :            : 
    1226                 :            : int
    1227                 :          0 : rtl_set_hw_ops(struct rtl_hw *hw)
    1228                 :            : {
    1229   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1230                 :            :         /* 8168G */
    1231                 :          0 :         case CFG_METHOD_21:
    1232                 :            :         case CFG_METHOD_22:
    1233                 :            :         /* 8168GU */
    1234                 :            :         case CFG_METHOD_24:
    1235                 :            :         case CFG_METHOD_25:
    1236                 :          0 :                 hw->hw_ops = rtl8168g_ops;
    1237                 :          0 :                 return 0;
    1238                 :            :         /* 8168EP */
    1239                 :          0 :         case CFG_METHOD_23:
    1240                 :            :         case CFG_METHOD_27:
    1241                 :            :         case CFG_METHOD_28:
    1242                 :          0 :                 hw->hw_ops = rtl8168ep_ops;
    1243                 :          0 :                 return 0;
    1244                 :            :         /* 8168H */
    1245                 :          0 :         case CFG_METHOD_29:
    1246                 :            :         case CFG_METHOD_30:
    1247                 :            :         case CFG_METHOD_35:
    1248                 :            :         case CFG_METHOD_36:
    1249                 :          0 :                 hw->hw_ops = rtl8168h_ops;
    1250                 :          0 :                 return 0;
    1251                 :            :         /* 8168FP */
    1252                 :          0 :         case CFG_METHOD_31:
    1253                 :            :         case CFG_METHOD_32:
    1254                 :            :         case CFG_METHOD_33:
    1255                 :            :         case CFG_METHOD_34:
    1256                 :          0 :                 hw->hw_ops = rtl8168fp_ops;
    1257                 :          0 :                 return 0;
    1258                 :            :         /* 8168M */
    1259                 :          0 :         case CFG_METHOD_37:
    1260                 :          0 :                 hw->hw_ops = rtl8168m_ops;
    1261                 :          0 :                 return 0;
    1262                 :            :         /* 8125A */
    1263                 :          0 :         case CFG_METHOD_48:
    1264                 :            :         case CFG_METHOD_49:
    1265                 :          0 :                 hw->hw_ops = rtl8125a_ops;
    1266                 :          0 :                 return 0;
    1267                 :            :         /* 8125B */
    1268                 :          0 :         case CFG_METHOD_50:
    1269                 :            :         case CFG_METHOD_51:
    1270                 :          0 :                 hw->hw_ops = rtl8125b_ops;
    1271                 :          0 :                 return 0;
    1272                 :            :         /* 8168KB */
    1273                 :          0 :         case CFG_METHOD_52:
    1274                 :            :         case CFG_METHOD_53:
    1275                 :          0 :                 hw->hw_ops = rtl8168kb_ops;
    1276                 :          0 :                 return 0;
    1277                 :            :         /* 8125BP */
    1278                 :          0 :         case CFG_METHOD_54:
    1279                 :            :         case CFG_METHOD_55:
    1280                 :          0 :                 hw->hw_ops = rtl8125bp_ops;
    1281                 :          0 :                 return 0;
    1282                 :            :         /* 8125D */
    1283                 :          0 :         case CFG_METHOD_56:
    1284                 :            :         case CFG_METHOD_57:
    1285                 :          0 :                 hw->hw_ops = rtl8125d_ops;
    1286                 :          0 :                 return 0;
    1287                 :            :         /* 8125CP */
    1288                 :          0 :         case CFG_METHOD_58:
    1289                 :          0 :                 hw->hw_ops = rtl8125cp_ops;
    1290                 :          0 :                 return 0;
    1291                 :            :         /* 8126A */
    1292                 :          0 :         case CFG_METHOD_69:
    1293                 :            :         case CFG_METHOD_70:
    1294                 :            :         case CFG_METHOD_71:
    1295                 :          0 :                 hw->hw_ops = rtl8126a_ops;
    1296                 :          0 :                 return 0;
    1297                 :          0 :         case CFG_METHOD_91:
    1298                 :          0 :                 hw->hw_ops = rtl8127_ops;
    1299                 :          0 :                 return 0;
    1300                 :            :         default:
    1301                 :            :                 return -ENOTSUP;
    1302                 :            :         }
    1303                 :            : }
    1304                 :            : 
    1305                 :            : void
    1306                 :          0 : rtl_hw_disable_mac_mcu_bps(struct rtl_hw *hw)
    1307                 :            : {
    1308                 :            :         u16 reg_addr;
    1309                 :            : 
    1310                 :          0 :         rtl_enable_cfg9346_write(hw);
    1311                 :          0 :         rtl_enable_aspm_clkreq_lock(hw, 0);
    1312                 :          0 :         rtl_disable_cfg9346_write(hw);
    1313                 :            : 
    1314      [ #  #  # ]:          0 :         switch (hw->mcfg) {
    1315                 :          0 :         case CFG_METHOD_29:
    1316                 :            :         case CFG_METHOD_30:
    1317                 :            :         case CFG_METHOD_31:
    1318                 :            :         case CFG_METHOD_32:
    1319                 :            :         case CFG_METHOD_33:
    1320                 :            :         case CFG_METHOD_34:
    1321                 :            :         case CFG_METHOD_35:
    1322                 :            :         case CFG_METHOD_36:
    1323                 :            :         case CFG_METHOD_37:
    1324                 :          0 :                 rtl_mac_ocp_write(hw, 0xFC38, 0x0000);
    1325                 :          0 :                 break;
    1326                 :          0 :         case CFG_METHOD_48:
    1327                 :            :         case CFG_METHOD_49:
    1328                 :            :         case CFG_METHOD_50:
    1329                 :            :         case CFG_METHOD_51:
    1330                 :            :         case CFG_METHOD_52:
    1331                 :            :         case CFG_METHOD_53:
    1332                 :            :         case CFG_METHOD_54:
    1333                 :            :         case CFG_METHOD_55:
    1334                 :            :         case CFG_METHOD_56:
    1335                 :            :         case CFG_METHOD_57:
    1336                 :            :         case CFG_METHOD_58:
    1337                 :            :         case CFG_METHOD_69:
    1338                 :            :         case CFG_METHOD_70:
    1339                 :            :         case CFG_METHOD_71:
    1340                 :            :         case CFG_METHOD_91:
    1341                 :          0 :                 rtl_mac_ocp_write(hw, 0xFC48, 0x0000);
    1342                 :          0 :                 break;
    1343                 :            :         }
    1344                 :            : 
    1345         [ #  # ]:          0 :         if (rtl_is_8125(hw)) {
    1346         [ #  # ]:          0 :                 for (reg_addr = 0xFC28; reg_addr < 0xFC48; reg_addr += 2)
    1347                 :          0 :                         rtl_mac_ocp_write(hw, reg_addr, 0x0000);
    1348                 :            :         } else {
    1349         [ #  # ]:          0 :                 for (reg_addr = 0xFC28; reg_addr < 0xFC38; reg_addr += 2)
    1350                 :          0 :                         rtl_mac_ocp_write(hw, reg_addr, 0x0000);
    1351                 :            :         }
    1352                 :            : 
    1353                 :            :         rte_delay_ms(3);
    1354                 :          0 :         rtl_mac_ocp_write(hw, 0xFC26, 0x0000);
    1355                 :          0 : }
    1356                 :            : 
    1357                 :            : static void
    1358                 :          0 : rtl_switch_mac_mcu_ram_code_page(struct rtl_hw *hw, u16 page)
    1359                 :            : {
    1360                 :            :         u16 tmp_ushort;
    1361                 :            : 
    1362                 :          0 :         page &= (BIT_1 | BIT_0);
    1363                 :          0 :         tmp_ushort = rtl_mac_ocp_read(hw, 0xE446);
    1364                 :          0 :         tmp_ushort &= ~(BIT_1 | BIT_0);
    1365                 :          0 :         tmp_ushort |= page;
    1366                 :          0 :         rtl_mac_ocp_write(hw, 0xE446, tmp_ushort);
    1367                 :          0 : }
    1368                 :            : 
    1369                 :            : static void
    1370                 :          0 : _rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
    1371                 :            : {
    1372                 :            :         u16 i;
    1373                 :            : 
    1374         [ #  # ]:          0 :         for (i = 0; i < entry_cnt; i++)
    1375                 :          0 :                 rtl_mac_ocp_write(hw, 0xF800 + i * 2, entry[i]);
    1376                 :          0 : }
    1377                 :            : 
    1378                 :            : static void
    1379                 :          0 : _rtl_write_mac_mcu_ram_code_with_page(struct rtl_hw *hw, const u16 *entry,
    1380                 :            :                                       u16 entry_cnt, u16 page_size)
    1381                 :            : {
    1382                 :            :         u16 i;
    1383                 :            :         u16 offset;
    1384                 :            :         u16 page;
    1385                 :            : 
    1386         [ #  # ]:          0 :         if (page_size == 0)
    1387                 :            :                 return;
    1388                 :            : 
    1389         [ #  # ]:          0 :         for (i = 0; i < entry_cnt; i++) {
    1390                 :          0 :                 offset = i % page_size;
    1391         [ #  # ]:          0 :                 if (offset == 0) {
    1392                 :          0 :                         page = (i / page_size);
    1393                 :          0 :                         rtl_switch_mac_mcu_ram_code_page(hw, page);
    1394                 :            :                 }
    1395                 :          0 :                 rtl_mac_ocp_write(hw, 0xF800 + offset * 2, entry[i]);
    1396                 :            :         }
    1397                 :            : }
    1398                 :            : 
    1399                 :            : static void
    1400                 :          0 : _rtl_set_hw_mcu_patch_code_ver(struct rtl_hw *hw, u64 ver)
    1401                 :            : {
    1402                 :            :         int i;
    1403                 :            : 
    1404                 :            :         /* Switch to page 2 */
    1405                 :          0 :         rtl_switch_mac_mcu_ram_code_page(hw, 2);
    1406                 :            : 
    1407         [ #  # ]:          0 :         for (i = 0; i < 8; i += 2) {
    1408                 :          0 :                 rtl_mac_ocp_write(hw, 0xF9F8 + 6 - i, (u16)ver);
    1409                 :          0 :                 ver >>= 16;
    1410                 :            :         }
    1411                 :            : 
    1412                 :            :         /* Switch back to page 0 */
    1413                 :          0 :         rtl_switch_mac_mcu_ram_code_page(hw, 0);
    1414                 :          0 : }
    1415                 :            : 
    1416                 :            : static void
    1417                 :            : rtl_set_hw_mcu_patch_code_ver(struct rtl_hw *hw, u64 ver)
    1418                 :            : {
    1419                 :          0 :         _rtl_set_hw_mcu_patch_code_ver(hw, ver);
    1420                 :            : 
    1421                 :          0 :         hw->hw_mcu_patch_code_ver = ver;
    1422                 :          0 : }
    1423                 :            : 
    1424                 :            : void
    1425                 :          0 : rtl_write_mac_mcu_ram_code(struct rtl_hw *hw, const u16 *entry, u16 entry_cnt)
    1426                 :            : {
    1427         [ #  # ]:          0 :         if (!HW_SUPPORT_MAC_MCU(hw))
    1428                 :            :                 return;
    1429         [ #  # ]:          0 :         if (!entry || entry_cnt == 0)
    1430                 :            :                 return;
    1431                 :            : 
    1432         [ #  # ]:          0 :         if (hw->MacMcuPageSize > 0)
    1433                 :          0 :                 _rtl_write_mac_mcu_ram_code_with_page(hw, entry, entry_cnt,
    1434                 :            :                                                       hw->MacMcuPageSize);
    1435                 :            :         else
    1436                 :          0 :                 _rtl_write_mac_mcu_ram_code(hw, entry, entry_cnt);
    1437                 :            : 
    1438         [ #  # ]:          0 :         if (hw->bin_mcu_patch_code_ver > 0)
    1439                 :            :                 rtl_set_hw_mcu_patch_code_ver(hw, hw->bin_mcu_patch_code_ver);
    1440                 :            : }
    1441                 :            : 
    1442                 :            : bool
    1443                 :          0 : rtl_is_speed_mode_valid(struct rtl_hw *hw, u32 speed)
    1444                 :            : {
    1445         [ #  # ]:          0 :         if (HW_FIBER_MODE_ENABLED(hw)) {
    1446         [ #  # ]:          0 :                 switch (speed) {
    1447                 :            :                 case SPEED_10000:
    1448                 :            :                 case SPEED_1000:
    1449                 :            :                         return true;
    1450                 :          0 :                 default:
    1451                 :          0 :                         return false;
    1452                 :            :                 }
    1453                 :            :         } else {
    1454         [ #  # ]:          0 :                 switch (speed) {
    1455                 :            :                 case SPEED_10000:
    1456                 :            :                 case SPEED_5000:
    1457                 :            :                 case SPEED_2500:
    1458                 :            :                 case SPEED_1000:
    1459                 :            :                 case SPEED_100:
    1460                 :            :                 case SPEED_10:
    1461                 :            :                         return true;
    1462                 :          0 :                 default:
    1463                 :          0 :                         return false;
    1464                 :            :                 }
    1465                 :            :         }
    1466                 :            : }
    1467                 :            : 
    1468                 :            : static bool
    1469                 :            : rtl_is_duplex_mode_valid(u8 duplex)
    1470                 :            : {
    1471         [ #  # ]:          0 :         switch (duplex) {
    1472                 :            :         case DUPLEX_FULL:
    1473                 :            :         case DUPLEX_HALF:
    1474                 :            :                 return true;
    1475                 :            :         default:
    1476                 :            :                 return false;
    1477                 :            :         }
    1478                 :            : }
    1479                 :            : 
    1480                 :            : static bool
    1481                 :            : rtl_is_autoneg_mode_valid(u32 autoneg)
    1482                 :            : {
    1483                 :            :         switch (autoneg) {
    1484                 :            :         case AUTONEG_ENABLE:
    1485                 :            :         case AUTONEG_DISABLE:
    1486                 :            :                 return true;
    1487                 :            :         default:
    1488                 :            :                 return false;
    1489                 :            :         }
    1490                 :            : }
    1491                 :            : 
    1492                 :            : void
    1493                 :          0 : rtl_set_link_option(struct rtl_hw *hw, u8 autoneg, u32 speed, u8 duplex,
    1494                 :            :                     enum rtl_fc_mode fc)
    1495                 :            : {
    1496                 :            :         u64 adv = 0;
    1497                 :            : 
    1498         [ #  # ]:          0 :         if (!rtl_is_speed_mode_valid(hw, speed))
    1499                 :          0 :                 speed = hw->HwSuppMaxPhyLinkSpeed;
    1500                 :            : 
    1501                 :            :         if (!rtl_is_duplex_mode_valid(duplex))
    1502                 :            :                 duplex = DUPLEX_FULL;
    1503                 :            : 
    1504                 :            :         if (!rtl_is_autoneg_mode_valid(autoneg))
    1505                 :            :                 autoneg = AUTONEG_ENABLE;
    1506                 :            : 
    1507                 :          0 :         speed = RTE_MIN(speed, hw->HwSuppMaxPhyLinkSpeed);
    1508                 :            : 
    1509         [ #  # ]:          0 :         if (HW_FIBER_MODE_ENABLED(hw)) {
    1510      [ #  #  # ]:          0 :                 switch (speed) {
    1511                 :          0 :                 case SPEED_10000:
    1512                 :            :                         adv |= ADVERTISE_10000_FULL;
    1513                 :            :                 /* Fall through */
    1514                 :          0 :                 case SPEED_1000:
    1515                 :          0 :                         adv |= ADVERTISE_1000_FULL;
    1516                 :          0 :                         break;
    1517                 :            :                 default:
    1518                 :            :                         break;
    1519                 :            :                 }
    1520                 :            :         } else {
    1521   [ #  #  #  # ]:          0 :                 switch (speed) {
    1522                 :          0 :                 case SPEED_10000:
    1523                 :            :                         adv |= ADVERTISE_10000_FULL;
    1524                 :            :                 /* Fall through */
    1525                 :          0 :                 case SPEED_5000:
    1526                 :          0 :                         adv |= ADVERTISE_5000_FULL;
    1527                 :            :                 /* Fall through */
    1528                 :          0 :                 case SPEED_2500:
    1529                 :          0 :                         adv |= ADVERTISE_2500_FULL;
    1530                 :            :                 /* Fall through */
    1531                 :          0 :                 default:
    1532                 :          0 :                         adv |= (ADVERTISE_10_HALF | ADVERTISE_10_FULL |
    1533                 :            :                                 ADVERTISE_100_HALF | ADVERTISE_100_FULL |
    1534                 :            :                                 ADVERTISE_1000_HALF | ADVERTISE_1000_FULL);
    1535                 :          0 :                         break;
    1536                 :            :                 }
    1537                 :            :         }
    1538                 :            : 
    1539                 :          0 :         hw->autoneg = autoneg;
    1540                 :          0 :         hw->speed = speed;
    1541                 :          0 :         hw->duplex = duplex;
    1542                 :          0 :         hw->advertising = adv;
    1543                 :          0 :         hw->fcpause = fc;
    1544                 :          0 : }
    1545                 :            : 
    1546                 :            : static void
    1547                 :          0 : rtl_init_software_variable(struct rtl_hw *hw)
    1548                 :            : {
    1549                 :            :         int tx_no_close_enable = 1;
    1550                 :            :         unsigned int speed_mode;
    1551                 :            :         unsigned int duplex_mode = DUPLEX_FULL;
    1552                 :            :         unsigned int autoneg_mode = AUTONEG_ENABLE;
    1553                 :            :         u32 tmp;
    1554                 :            : 
    1555         [ #  # ]:          0 :         switch (hw->mcfg) {
    1556                 :            :         case CFG_METHOD_48:
    1557                 :            :         case CFG_METHOD_49:
    1558                 :            :         case CFG_METHOD_50:
    1559                 :            :         case CFG_METHOD_51:
    1560                 :            :         case CFG_METHOD_52:
    1561                 :            :         case CFG_METHOD_53:
    1562                 :            :         case CFG_METHOD_54:
    1563                 :            :         case CFG_METHOD_55:
    1564                 :            :         case CFG_METHOD_56:
    1565                 :            :         case CFG_METHOD_57:
    1566                 :            :         case CFG_METHOD_58:
    1567                 :            :                 speed_mode = SPEED_2500;
    1568                 :            :                 break;
    1569                 :            :         case CFG_METHOD_69:
    1570                 :            :         case CFG_METHOD_70:
    1571                 :            :         case CFG_METHOD_71:
    1572                 :            :                 speed_mode = SPEED_5000;
    1573                 :            :                 break;
    1574                 :            :         case CFG_METHOD_91:
    1575                 :            :                 speed_mode = SPEED_10000;
    1576                 :            :                 break;
    1577                 :            :         default:
    1578                 :            :                 speed_mode = SPEED_1000;
    1579                 :            :                 break;
    1580                 :            :         }
    1581                 :            : 
    1582   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
                      # ]
    1583                 :          0 :         case CFG_METHOD_23:
    1584                 :            :         case CFG_METHOD_27:
    1585                 :            :         case CFG_METHOD_28:
    1586                 :          0 :                 hw->HwSuppDashVer = 2;
    1587                 :          0 :                 break;
    1588                 :          0 :         case CFG_METHOD_31:
    1589                 :            :         case CFG_METHOD_32:
    1590                 :            :         case CFG_METHOD_33:
    1591                 :            :         case CFG_METHOD_34:
    1592                 :          0 :                 hw->HwSuppDashVer = 3;
    1593                 :          0 :                 break;
    1594                 :          0 :         case CFG_METHOD_48:
    1595                 :            :         case CFG_METHOD_49:
    1596                 :            :         case CFG_METHOD_91:
    1597                 :          0 :                 tmp = (u8)rtl_mac_ocp_read(hw, 0xD006);
    1598         [ #  # ]:          0 :                 if (tmp == 0x02 || tmp == 0x04)
    1599                 :          0 :                         hw->HwSuppDashVer = 2;
    1600         [ #  # ]:          0 :                 else if (tmp == 0x03)
    1601                 :          0 :                         hw->HwSuppDashVer = 4;
    1602                 :            :                 break;
    1603                 :          0 :         case CFG_METHOD_54:
    1604                 :            :         case CFG_METHOD_55:
    1605                 :          0 :                 hw->HwSuppDashVer = 4;
    1606                 :          0 :                 break;
    1607                 :          0 :         default:
    1608                 :          0 :                 hw->HwSuppDashVer = 0;
    1609                 :          0 :                 break;
    1610                 :            :         }
    1611                 :            : 
    1612         [ #  # ]:          0 :         switch (hw->mcfg) {
    1613                 :          0 :         case CFG_METHOD_31:
    1614                 :            :         case CFG_METHOD_32:
    1615                 :            :         case CFG_METHOD_33:
    1616                 :            :         case CFG_METHOD_34:
    1617                 :          0 :                 tmp = rtl_mac_ocp_read(hw, 0xDC00);
    1618                 :          0 :                 hw->HwPkgDet = (tmp >> 3) & 0x0F;
    1619                 :          0 :                 break;
    1620                 :            :         }
    1621                 :            : 
    1622         [ #  # ]:          0 :         switch (hw->mcfg) {
    1623                 :          0 :         case CFG_METHOD_32:
    1624                 :            :         case CFG_METHOD_33:
    1625                 :            :         case CFG_METHOD_34:
    1626         [ #  # ]:          0 :                 if (hw->HwPkgDet == 0x06) {
    1627                 :          0 :                         tmp = rtl_eri_read(hw, 0xE6, 1, ERIAR_ExGMAC);
    1628         [ #  # ]:          0 :                         if (tmp == 0x02)
    1629                 :          0 :                                 hw->HwSuppSerDesPhyVer = 1;
    1630         [ #  # ]:          0 :                         else if (tmp == 0x00)
    1631                 :          0 :                                 hw->HwSuppSerDesPhyVer = 2;
    1632                 :            :                 }
    1633                 :            :                 break;
    1634                 :            :         }
    1635                 :            : 
    1636   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
    1637                 :          0 :         case CFG_METHOD_23:
    1638                 :            :         case CFG_METHOD_27:
    1639                 :            :         case CFG_METHOD_28:
    1640                 :            :         case CFG_METHOD_54:
    1641                 :            :         case CFG_METHOD_55:
    1642                 :            :         case CFG_METHOD_58:
    1643                 :          0 :                 hw->HwSuppOcpChannelVer = 2;
    1644                 :          0 :                 break;
    1645                 :          0 :         case CFG_METHOD_31:
    1646                 :            :         case CFG_METHOD_32:
    1647                 :            :         case CFG_METHOD_33:
    1648                 :            :         case CFG_METHOD_34:
    1649                 :          0 :                 hw->HwSuppOcpChannelVer = 3;
    1650                 :          0 :                 break;
    1651                 :          0 :         case CFG_METHOD_48:
    1652                 :            :         case CFG_METHOD_49:
    1653                 :            :         case CFG_METHOD_91:
    1654         [ #  # ]:          0 :                 if (HW_DASH_SUPPORT_DASH(hw))
    1655                 :          0 :                         hw->HwSuppOcpChannelVer = 2;
    1656                 :            :                 break;
    1657                 :          0 :         default:
    1658                 :          0 :                 hw->HwSuppOcpChannelVer = 0;
    1659                 :          0 :                 break;
    1660                 :            :         }
    1661                 :            : 
    1662         [ #  # ]:          0 :         if (rtl_is_8125(hw))
    1663                 :          0 :                 hw->AllowAccessDashOcp = rtl_is_allow_access_dash_ocp(hw);
    1664                 :            : 
    1665   [ #  #  #  # ]:          0 :         if (HW_DASH_SUPPORT_DASH(hw) && rtl_check_dash(hw))
    1666                 :          0 :                 hw->DASH = 1;
    1667                 :            :         else
    1668                 :          0 :                 hw->DASH = 0;
    1669                 :            : 
    1670         [ #  # ]:          0 :         if (HW_DASH_SUPPORT_TYPE_2(hw))
    1671                 :          0 :                 hw->cmac_ioaddr = hw->mmio_addr;
    1672                 :            : 
    1673   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1674                 :          0 :         case CFG_METHOD_21:
    1675                 :            :         case CFG_METHOD_22:
    1676                 :            :         case CFG_METHOD_24:
    1677                 :            :         case CFG_METHOD_25:
    1678                 :          0 :                 hw->chipset_name = RTL8168G;
    1679                 :          0 :                 break;
    1680                 :          0 :         case CFG_METHOD_23:
    1681                 :            :         case CFG_METHOD_27:
    1682                 :            :         case CFG_METHOD_28:
    1683                 :          0 :                 hw->chipset_name = RTL8168EP;
    1684                 :          0 :                 break;
    1685                 :          0 :         case CFG_METHOD_29:
    1686                 :            :         case CFG_METHOD_30:
    1687                 :            :         case CFG_METHOD_35:
    1688                 :            :         case CFG_METHOD_36:
    1689                 :          0 :                 hw->chipset_name = RTL8168H;
    1690                 :          0 :                 break;
    1691                 :          0 :         case CFG_METHOD_31:
    1692                 :            :         case CFG_METHOD_32:
    1693                 :            :         case CFG_METHOD_33:
    1694                 :            :         case CFG_METHOD_34:
    1695                 :          0 :                 hw->chipset_name = RTL8168FP;
    1696                 :          0 :                 break;
    1697                 :          0 :         case CFG_METHOD_37:
    1698                 :          0 :                 hw->chipset_name = RTL8168M;
    1699                 :          0 :                 break;
    1700                 :          0 :         case CFG_METHOD_48:
    1701                 :            :         case CFG_METHOD_49:
    1702                 :          0 :                 hw->chipset_name = RTL8125A;
    1703                 :          0 :                 break;
    1704                 :          0 :         case CFG_METHOD_50:
    1705                 :            :         case CFG_METHOD_51:
    1706                 :          0 :                 hw->chipset_name = RTL8125B;
    1707                 :          0 :                 break;
    1708                 :          0 :         case CFG_METHOD_52:
    1709                 :            :         case CFG_METHOD_53:
    1710                 :          0 :                 hw->chipset_name = RTL8168KB;
    1711                 :          0 :                 break;
    1712                 :          0 :         case CFG_METHOD_54:
    1713                 :            :         case CFG_METHOD_55:
    1714                 :          0 :                 hw->chipset_name = RTL8125BP;
    1715                 :          0 :                 break;
    1716                 :          0 :         case CFG_METHOD_56:
    1717                 :            :         case CFG_METHOD_57:
    1718                 :          0 :                 hw->chipset_name = RTL8125D;
    1719                 :          0 :                 break;
    1720                 :          0 :         case CFG_METHOD_58:
    1721                 :          0 :                 hw->chipset_name = RTL8125CP;
    1722                 :          0 :                 break;
    1723                 :          0 :         case CFG_METHOD_69:
    1724                 :            :         case CFG_METHOD_70:
    1725                 :            :         case CFG_METHOD_71:
    1726                 :          0 :                 hw->chipset_name = RTL8126A;
    1727                 :          0 :                 break;
    1728                 :          0 :         case CFG_METHOD_91:
    1729                 :          0 :                 hw->chipset_name = RTL8127;
    1730                 :          0 :                 break;
    1731                 :          0 :         default:
    1732                 :          0 :                 hw->chipset_name = UNKNOWN;
    1733                 :          0 :                 break;
    1734                 :            :         }
    1735                 :            : 
    1736                 :          0 :         hw->HwSuppNowIsOobVer = 1;
    1737                 :            : 
    1738      [ #  #  # ]:          0 :         switch (hw->mcfg) {
    1739                 :          0 :         case CFG_METHOD_21:
    1740                 :            :         case CFG_METHOD_22:
    1741                 :            :         case CFG_METHOD_24:
    1742                 :            :         case CFG_METHOD_25:
    1743                 :            :         case CFG_METHOD_26:
    1744                 :            :         case CFG_METHOD_29:
    1745                 :            :         case CFG_METHOD_30:
    1746                 :            :         case CFG_METHOD_35:
    1747                 :            :         case CFG_METHOD_36:
    1748                 :            :         case CFG_METHOD_37:
    1749                 :          0 :                 hw->HwSuppCheckPhyDisableModeVer = 2;
    1750                 :          0 :                 break;
    1751                 :          0 :         case CFG_METHOD_23:
    1752                 :            :         case CFG_METHOD_27:
    1753                 :            :         case CFG_METHOD_28:
    1754                 :            :         case CFG_METHOD_31:
    1755                 :            :         case CFG_METHOD_32:
    1756                 :            :         case CFG_METHOD_33:
    1757                 :            :         case CFG_METHOD_34:
    1758                 :            :         case CFG_METHOD_48:
    1759                 :            :         case CFG_METHOD_49:
    1760                 :            :         case CFG_METHOD_50:
    1761                 :            :         case CFG_METHOD_51:
    1762                 :            :         case CFG_METHOD_52:
    1763                 :            :         case CFG_METHOD_53:
    1764                 :            :         case CFG_METHOD_54:
    1765                 :            :         case CFG_METHOD_55:
    1766                 :            :         case CFG_METHOD_56:
    1767                 :            :         case CFG_METHOD_57:
    1768                 :            :         case CFG_METHOD_58:
    1769                 :            :         case CFG_METHOD_69:
    1770                 :            :         case CFG_METHOD_70:
    1771                 :            :         case CFG_METHOD_71:
    1772                 :            :         case CFG_METHOD_91:
    1773                 :          0 :                 hw->HwSuppCheckPhyDisableModeVer = 3;
    1774                 :          0 :                 break;
    1775                 :            :         }
    1776                 :            : 
    1777   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
    1778                 :          0 :         case CFG_METHOD_48:
    1779                 :            :         case CFG_METHOD_49:
    1780                 :            :         case CFG_METHOD_50:
    1781                 :            :         case CFG_METHOD_51:
    1782                 :            :         case CFG_METHOD_54:
    1783                 :            :         case CFG_METHOD_55:
    1784                 :            :         case CFG_METHOD_56:
    1785                 :            :         case CFG_METHOD_57:
    1786                 :            :         case CFG_METHOD_58:
    1787                 :          0 :                 hw->HwSuppMaxPhyLinkSpeed = SPEED_2500;
    1788                 :          0 :                 break;
    1789                 :          0 :         case CFG_METHOD_69:
    1790                 :            :         case CFG_METHOD_70:
    1791                 :            :         case CFG_METHOD_71:
    1792                 :          0 :                 hw->HwSuppMaxPhyLinkSpeed = SPEED_5000;
    1793                 :          0 :                 break;
    1794                 :          0 :         case CFG_METHOD_91:
    1795                 :          0 :                 hw->HwSuppMaxPhyLinkSpeed = SPEED_10000;
    1796                 :          0 :                 break;
    1797                 :          0 :         default:
    1798                 :          0 :                 hw->HwSuppMaxPhyLinkSpeed = SPEED_1000;
    1799                 :          0 :                 break;
    1800                 :            :         }
    1801                 :            : 
    1802   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
                      # ]
    1803                 :          0 :         case CFG_METHOD_48:
    1804                 :            :         case CFG_METHOD_49:
    1805                 :            :         case CFG_METHOD_50:
    1806                 :            :         case CFG_METHOD_51:
    1807                 :            :         case CFG_METHOD_52:
    1808                 :            :         case CFG_METHOD_53:
    1809                 :          0 :                 hw->HwSuppTxNoCloseVer = 3;
    1810                 :          0 :                 break;
    1811                 :          0 :         case CFG_METHOD_54:
    1812                 :            :         case CFG_METHOD_55:
    1813                 :            :         case CFG_METHOD_56:
    1814                 :            :         case CFG_METHOD_57:
    1815                 :            :         case CFG_METHOD_58:
    1816                 :            :         case CFG_METHOD_91:
    1817                 :          0 :                 hw->HwSuppTxNoCloseVer = 6;
    1818                 :          0 :                 break;
    1819                 :          0 :         case CFG_METHOD_69:
    1820                 :          0 :                 hw->HwSuppTxNoCloseVer = 4;
    1821                 :          0 :                 break;
    1822                 :          0 :         case CFG_METHOD_70:
    1823                 :            :         case CFG_METHOD_71:
    1824                 :          0 :                 hw->HwSuppTxNoCloseVer = 5;
    1825                 :          0 :                 break;
    1826                 :            :         }
    1827                 :            : 
    1828   [ #  #  #  # ]:          0 :         switch (hw->HwSuppTxNoCloseVer) {
    1829                 :          0 :         case 5:
    1830                 :            :         case 6:
    1831                 :          0 :                 hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V4;
    1832                 :          0 :                 break;
    1833                 :          0 :         case 4:
    1834                 :          0 :                 hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V3;
    1835                 :          0 :                 break;
    1836                 :          0 :         case 3:
    1837                 :          0 :                 hw->MaxTxDescPtrMask = MAX_TX_NO_CLOSE_DESC_PTR_MASK_V2;
    1838                 :          0 :                 break;
    1839                 :            :         default:
    1840                 :            :                 tx_no_close_enable = 0;
    1841                 :            :                 break;
    1842                 :            :         }
    1843                 :            : 
    1844   [ #  #  #  # ]:          0 :         if (hw->HwSuppTxNoCloseVer > 0 && tx_no_close_enable == 1)
    1845                 :          0 :                 hw->EnableTxNoClose = TRUE;
    1846                 :            : 
    1847      [ #  #  # ]:          0 :         switch (hw->HwSuppTxNoCloseVer) {
    1848                 :          0 :         case 4:
    1849                 :            :         case 5:
    1850                 :          0 :                 hw->hw_clo_ptr_reg = HW_CLO_PTR0_8126;
    1851                 :          0 :                 hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8126;
    1852                 :          0 :                 break;
    1853                 :          0 :         case 6:
    1854                 :          0 :                 hw->hw_clo_ptr_reg = HW_CLO_PTR0_8125BP;
    1855                 :          0 :                 hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8125BP;
    1856                 :          0 :                 break;
    1857                 :          0 :         default:
    1858                 :          0 :                 hw->hw_clo_ptr_reg = HW_CLO_PTR0_8125;
    1859                 :          0 :                 hw->sw_tail_ptr_reg = SW_TAIL_PTR0_8125;
    1860                 :          0 :                 break;
    1861                 :            :         }
    1862                 :            : 
    1863   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1864                 :          0 :         case CFG_METHOD_21:
    1865                 :            :         case CFG_METHOD_22:
    1866                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_21;
    1867                 :          0 :                 break;
    1868                 :          0 :         case CFG_METHOD_23:
    1869                 :            :         case CFG_METHOD_27:
    1870                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_23;
    1871                 :          0 :                 break;
    1872                 :          0 :         case CFG_METHOD_24:
    1873                 :            :         case CFG_METHOD_25:
    1874                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_24;
    1875                 :          0 :                 break;
    1876                 :          0 :         case CFG_METHOD_26:
    1877                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_26;
    1878                 :          0 :                 break;
    1879                 :          0 :         case CFG_METHOD_28:
    1880                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_28;
    1881                 :          0 :                 break;
    1882                 :          0 :         case CFG_METHOD_29:
    1883                 :            :         case CFG_METHOD_30:
    1884                 :            :         case CFG_METHOD_37:
    1885                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_29;
    1886                 :          0 :                 break;
    1887                 :          0 :         case CFG_METHOD_31:
    1888                 :            :         case CFG_METHOD_32:
    1889                 :            :         case CFG_METHOD_33:
    1890                 :            :         case CFG_METHOD_34:
    1891                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_31;
    1892                 :          0 :                 break;
    1893                 :          0 :         case CFG_METHOD_35:
    1894                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_35;
    1895                 :          0 :                 break;
    1896                 :          0 :         case CFG_METHOD_36:
    1897                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_36;
    1898                 :          0 :                 break;
    1899                 :          0 :         case CFG_METHOD_48:
    1900                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_48;
    1901                 :          0 :                 break;
    1902                 :          0 :         case CFG_METHOD_49:
    1903                 :            :         case CFG_METHOD_52:
    1904                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_49;
    1905                 :          0 :                 break;
    1906                 :          0 :         case CFG_METHOD_50:
    1907                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_50;
    1908                 :          0 :                 break;
    1909                 :          0 :         case CFG_METHOD_51:
    1910                 :            :         case CFG_METHOD_53:
    1911                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_51;
    1912                 :          0 :                 break;
    1913                 :          0 :         case CFG_METHOD_54:
    1914                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_54;
    1915                 :          0 :                 break;
    1916                 :          0 :         case CFG_METHOD_55:
    1917                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_55;
    1918                 :          0 :                 break;
    1919                 :          0 :         case CFG_METHOD_56:
    1920                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_56;
    1921                 :          0 :                 break;
    1922                 :          0 :         case CFG_METHOD_57:
    1923                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_57;
    1924                 :          0 :                 break;
    1925                 :          0 :         case CFG_METHOD_58:
    1926                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_58;
    1927                 :          0 :                 break;
    1928                 :          0 :         case CFG_METHOD_69:
    1929                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_69;
    1930                 :          0 :                 break;
    1931                 :          0 :         case CFG_METHOD_70:
    1932                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_70;
    1933                 :          0 :                 break;
    1934                 :          0 :         case CFG_METHOD_71:
    1935                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_71;
    1936                 :          0 :                 break;
    1937                 :          0 :         case CFG_METHOD_91:
    1938                 :          0 :                 hw->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_91;
    1939                 :          0 :                 break;
    1940                 :            :         }
    1941                 :            : 
    1942         [ #  # ]:          0 :         if (hw->HwIcVerUnknown) {
    1943                 :          0 :                 hw->NotWrRamCodeToMicroP = TRUE;
    1944                 :          0 :                 hw->NotWrMcuPatchCode = TRUE;
    1945                 :            :         }
    1946                 :            : 
    1947         [ #  # ]:          0 :         if (rtl_is_8125(hw)) {
    1948                 :          0 :                 hw->HwSuppMacMcuVer = 2;
    1949                 :          0 :                 hw->MacMcuPageSize = RTL_MAC_MCU_PAGE_SIZE;
    1950                 :          0 :                 hw->mcu_pme_setting = rtl_mac_ocp_read(hw, 0xE00A);
    1951                 :            :         }
    1952                 :            : 
    1953         [ #  # ]:          0 :         switch (hw->mcfg) {
    1954                 :          0 :         case CFG_METHOD_49:
    1955                 :            :         case CFG_METHOD_52:
    1956         [ #  # ]:          0 :                 if ((rtl_mac_ocp_read(hw, 0xD442) & BIT_5) &&
    1957         [ #  # ]:          0 :                     (rtl_mdio_direct_read_phy_ocp(hw, 0xD068) & BIT_1))
    1958                 :          0 :                         hw->RequirePhyMdiSwapPatch = TRUE;
    1959                 :            :                 break;
    1960                 :            :         }
    1961                 :            : 
    1962   [ #  #  #  #  :          0 :         switch (hw->mcfg) {
                      # ]
    1963                 :          0 :         case CFG_METHOD_48:
    1964                 :            :         case CFG_METHOD_49:
    1965                 :            :         case CFG_METHOD_52:
    1966                 :          0 :                 hw->HwSuppIntMitiVer = 3;
    1967                 :          0 :                 break;
    1968                 :          0 :         case CFG_METHOD_50:
    1969                 :            :         case CFG_METHOD_51:
    1970                 :            :         case CFG_METHOD_53:
    1971                 :            :         case CFG_METHOD_69:
    1972                 :          0 :                 hw->HwSuppIntMitiVer = 4;
    1973                 :          0 :                 break;
    1974                 :          0 :         case CFG_METHOD_54:
    1975                 :            :         case CFG_METHOD_55:
    1976                 :            :         case CFG_METHOD_56:
    1977                 :            :         case CFG_METHOD_57:
    1978                 :            :         case CFG_METHOD_58:
    1979                 :            :         case CFG_METHOD_91:
    1980                 :          0 :                 hw->HwSuppIntMitiVer = 6;
    1981                 :          0 :                 break;
    1982                 :          0 :         case CFG_METHOD_70:
    1983                 :            :         case CFG_METHOD_71:
    1984                 :          0 :                 hw->HwSuppIntMitiVer = 5;
    1985                 :          0 :                 break;
    1986                 :            :         }
    1987                 :            : 
    1988         [ #  # ]:          0 :         switch (hw->mcfg) {
    1989                 :          0 :         case CFG_METHOD_91:
    1990                 :          0 :                 tmp = (u8)rtl_mac_ocp_read(hw, 0xD006);
    1991         [ #  # ]:          0 :                 if (tmp == 0x07)
    1992                 :          0 :                         hw->HwFiberModeVer = FIBER_MODE_RTL8127ATF;
    1993                 :            :                 break;
    1994                 :            :         default:
    1995                 :            :                 break;
    1996                 :            :         }
    1997                 :            : 
    1998                 :          0 :         rtl_set_link_option(hw, autoneg_mode, speed_mode, duplex_mode, rtl_fc_full);
    1999                 :            : 
    2000                 :          0 :         hw->mtu = RTL_DEFAULT_MTU;
    2001                 :          0 : }
    2002                 :            : 
    2003                 :            : static void
    2004                 :          0 : rtl_exit_realwow(struct rtl_hw *hw)
    2005                 :            : {
    2006                 :            :         u32 csi_tmp;
    2007                 :            : 
    2008                 :            :         /* Disable realwow function */
    2009   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
    2010                 :          0 :         case CFG_METHOD_21:
    2011                 :            :         case CFG_METHOD_22:
    2012                 :          0 :                 RTL_W32(hw, MACOCP, 0x605E0000);
    2013                 :          0 :                 RTL_W32(hw, MACOCP, (0xE05E << 16) |
    2014                 :            :                                     (RTL_R32(hw, MACOCP) & 0xFFFE));
    2015                 :          0 :                 RTL_W32(hw, MACOCP, 0xE9720000);
    2016                 :          0 :                 RTL_W32(hw, MACOCP, 0xF2140010);
    2017                 :            :                 break;
    2018                 :          0 :         case CFG_METHOD_26:
    2019                 :          0 :                 RTL_W32(hw, MACOCP, 0xE05E00FF);
    2020                 :          0 :                 RTL_W32(hw, MACOCP, 0xE9720000);
    2021                 :          0 :                 rtl_mac_ocp_write(hw, 0xE428, 0x0010);
    2022                 :          0 :                 break;
    2023                 :          0 :         case CFG_METHOD_48:
    2024                 :            :         case CFG_METHOD_49:
    2025                 :            :         case CFG_METHOD_50:
    2026                 :            :         case CFG_METHOD_51:
    2027                 :            :         case CFG_METHOD_52:
    2028                 :            :         case CFG_METHOD_53:
    2029                 :            :         case CFG_METHOD_54:
    2030                 :            :         case CFG_METHOD_55:
    2031                 :            :         case CFG_METHOD_56:
    2032                 :            :         case CFG_METHOD_57:
    2033                 :            :         case CFG_METHOD_58:
    2034                 :            :         case CFG_METHOD_69:
    2035                 :            :         case CFG_METHOD_70:
    2036                 :            :         case CFG_METHOD_71:
    2037                 :            :         case CFG_METHOD_91:
    2038                 :          0 :                 rtl_mac_ocp_write(hw, 0xC0BC, 0x00FF);
    2039                 :          0 :                 break;
    2040                 :            :         }
    2041                 :            : 
    2042   [ #  #  #  # ]:          0 :         switch (hw->mcfg) {
    2043                 :          0 :         case CFG_METHOD_21:
    2044                 :            :         case CFG_METHOD_22:
    2045                 :          0 :                 rtl_eri_write(hw, 0x174, 2, 0x0000, ERIAR_ExGMAC);
    2046                 :          0 :                 rtl_mac_ocp_write(hw, 0xE428, 0x0010);
    2047                 :          0 :                 break;
    2048                 :          0 :         case CFG_METHOD_24:
    2049                 :            :         case CFG_METHOD_25:
    2050                 :            :         case CFG_METHOD_26:
    2051                 :            :         case CFG_METHOD_28:
    2052                 :            :         case CFG_METHOD_31:
    2053                 :            :         case CFG_METHOD_32:
    2054                 :            :         case CFG_METHOD_33:
    2055                 :            :         case CFG_METHOD_34:
    2056                 :          0 :                 rtl_eri_write(hw, 0x174, 2, 0x00FF, ERIAR_ExGMAC);
    2057                 :          0 :                 rtl_mac_ocp_write(hw, 0xE428, 0x0010);
    2058                 :          0 :                 break;
    2059                 :          0 :         case CFG_METHOD_29:
    2060                 :            :         case CFG_METHOD_30:
    2061                 :            :         case CFG_METHOD_35:
    2062                 :            :         case CFG_METHOD_36:
    2063                 :            :         case CFG_METHOD_37:
    2064                 :          0 :                 csi_tmp = rtl_eri_read(hw, 0x174, 2, ERIAR_ExGMAC);
    2065                 :          0 :                 csi_tmp &= ~BIT_8;
    2066                 :          0 :                 csi_tmp |= BIT_15;
    2067                 :          0 :                 rtl_eri_write(hw, 0x174, 2, csi_tmp, ERIAR_ExGMAC);
    2068                 :          0 :                 rtl_mac_ocp_write(hw, 0xE428, 0x0010);
    2069                 :          0 :                 break;
    2070                 :            :         }
    2071                 :          0 : }
    2072                 :            : 
    2073                 :            : static void
    2074                 :            : rtl_disable_now_is_oob(struct rtl_hw *hw)
    2075                 :            : {
    2076         [ #  # ]:          0 :         if (hw->HwSuppNowIsOobVer == 1)
    2077                 :          0 :                 RTL_W8(hw, MCUCmd_reg, RTL_R8(hw, MCUCmd_reg) & ~Now_is_oob);
    2078                 :            : }
    2079                 :            : 
    2080                 :            : static void
    2081                 :            : rtl_wait_ll_share_fifo_ready(struct rtl_hw *hw)
    2082                 :            : {
    2083                 :            :         int i;
    2084                 :            : 
    2085   [ #  #  #  # ]:          0 :         for (i = 0; i < 10; i++) {
    2086                 :          0 :                 rte_delay_us(100);
    2087   [ #  #  #  # ]:          0 :                 if (RTL_R16(hw, 0xD2) & BIT_9)
    2088                 :            :                         break;
    2089                 :            :         }
    2090                 :            : }
    2091                 :            : 
    2092                 :            : static void
    2093                 :          0 : rtl8168_switch_to_sgmii_mode(struct rtl_hw *hw)
    2094                 :            : {
    2095                 :          0 :         rtl_mac_ocp_write(hw, 0xEB00, 0x2);
    2096                 :          0 :         rtl8168_set_mcu_ocp_bit(hw, 0xEB16, BIT_1);
    2097                 :          0 : }
    2098                 :            : 
    2099                 :            : static void
    2100                 :          0 : rtl_exit_oob(struct rtl_hw *hw)
    2101                 :            : {
    2102                 :            :         u16 data16;
    2103                 :            : 
    2104                 :            :         rtl_disable_rx_packet_filter(hw);
    2105                 :            : 
    2106         [ #  # ]:          0 :         if (HW_SUPP_SERDES_PHY(hw)) {
    2107         [ #  # ]:          0 :                 if (hw->HwSuppSerDesPhyVer == 1)
    2108                 :          0 :                         rtl8168_switch_to_sgmii_mode(hw);
    2109                 :            :         }
    2110                 :            : 
    2111         [ #  # ]:          0 :         if (HW_DASH_SUPPORT_DASH(hw)) {
    2112                 :          0 :                 rtl_driver_start(hw);
    2113                 :          0 :                 rtl_dash2_disable_txrx(hw);
    2114                 :            :         }
    2115                 :            : 
    2116                 :          0 :         rtl_exit_realwow(hw);
    2117                 :            : 
    2118                 :          0 :         rtl_nic_reset(hw);
    2119                 :            : 
    2120                 :            :         rtl_disable_now_is_oob(hw);
    2121                 :            : 
    2122                 :          0 :         data16 = rtl_mac_ocp_read(hw, 0xE8DE) & ~BIT_14;
    2123                 :          0 :         rtl_mac_ocp_write(hw, 0xE8DE, data16);
    2124                 :            :         rtl_wait_ll_share_fifo_ready(hw);
    2125                 :            : 
    2126         [ #  # ]:          0 :         if (rtl_is_8125(hw)) {
    2127                 :          0 :                 rtl_mac_ocp_write(hw, 0xC0AA, 0x07D0);
    2128                 :            : 
    2129                 :          0 :                 rtl_mac_ocp_write(hw, 0xC0A6, 0x01B5);
    2130                 :            : 
    2131                 :          0 :                 rtl_mac_ocp_write(hw, 0xC01E, 0x5555);
    2132                 :            : 
    2133                 :            :         } else {
    2134                 :          0 :                 data16 = rtl_mac_ocp_read(hw, 0xE8DE) | BIT_15;
    2135                 :          0 :                 rtl_mac_ocp_write(hw, 0xE8DE, data16);
    2136                 :            :         }
    2137                 :            : 
    2138                 :            :         rtl_wait_ll_share_fifo_ready(hw);
    2139                 :          0 : }
    2140                 :            : 
    2141                 :            : static void
    2142                 :          0 : rtl_disable_ups(struct rtl_hw *hw)
    2143                 :            : {
    2144      [ #  #  # ]:          0 :         switch (hw->mcfg) {
    2145                 :          0 :         case CFG_METHOD_29:
    2146                 :            :         case CFG_METHOD_30:
    2147                 :            :         case CFG_METHOD_31:
    2148                 :            :         case CFG_METHOD_32:
    2149                 :            :         case CFG_METHOD_33:
    2150                 :            :         case CFG_METHOD_34:
    2151                 :            :         case CFG_METHOD_35:
    2152                 :            :         case CFG_METHOD_36:
    2153                 :          0 :                 rtl_mac_ocp_write(hw, 0xD400,
    2154                 :          0 :                                   rtl_mac_ocp_read(hw, 0xD400) & ~BIT_0);
    2155                 :          0 :                 break;
    2156                 :          0 :         case CFG_METHOD_48:
    2157                 :            :         case CFG_METHOD_49:
    2158                 :            :         case CFG_METHOD_50:
    2159                 :            :         case CFG_METHOD_51:
    2160                 :            :         case CFG_METHOD_52:
    2161                 :            :         case CFG_METHOD_53:
    2162                 :            :         case CFG_METHOD_54:
    2163                 :            :         case CFG_METHOD_55:
    2164                 :            :         case CFG_METHOD_56:
    2165                 :            :         case CFG_METHOD_57:
    2166                 :            :         case CFG_METHOD_58:
    2167                 :            :         case CFG_METHOD_69:
    2168                 :            :         case CFG_METHOD_70:
    2169                 :            :         case CFG_METHOD_71:
    2170                 :            :         case CFG_METHOD_91:
    2171                 :          0 :                 rtl_mac_ocp_write(hw, 0xD40A,
    2172                 :          0 :                                   rtl_mac_ocp_read(hw, 0xD40A) & ~BIT_4);
    2173                 :          0 :                 break;
    2174                 :            :         }
    2175                 :          0 : }
    2176                 :            : 
    2177                 :            : static void
    2178                 :          0 : rtl_disable_ocp_phy_power_saving(struct rtl_hw *hw)
    2179                 :            : {
    2180                 :            :         u16 val;
    2181                 :            : 
    2182      [ #  #  # ]:          0 :         switch (hw->mcfg) {
    2183                 :          0 :         case CFG_METHOD_25:
    2184                 :            :         case CFG_METHOD_26:
    2185                 :            :         case CFG_METHOD_27:
    2186                 :            :         case CFG_METHOD_28:
    2187                 :            :         case CFG_METHOD_29:
    2188                 :            :         case CFG_METHOD_30:
    2189                 :            :         case CFG_METHOD_31:
    2190                 :            :         case CFG_METHOD_32:
    2191                 :            :         case CFG_METHOD_33:
    2192                 :            :         case CFG_METHOD_34:
    2193                 :            :         case CFG_METHOD_35:
    2194                 :            :         case CFG_METHOD_36:
    2195                 :            :         case CFG_METHOD_37:
    2196                 :          0 :                 val = rtl_mdio_real_read_phy_ocp(hw, 0x0C41, 0x13);
    2197         [ #  # ]:          0 :                 if (val != 0x0500) {
    2198                 :          0 :                         rtl_set_phy_mcu_patch_request(hw);
    2199                 :          0 :                         rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0000);
    2200                 :          0 :                         rtl_mdio_real_write_phy_ocp(hw, 0x0C41, 0x13, 0x0500);
    2201                 :          0 :                         rtl_clear_phy_mcu_patch_request(hw);
    2202                 :            :                 }
    2203                 :            :                 break;
    2204                 :          0 :         case CFG_METHOD_48:
    2205                 :            :         case CFG_METHOD_49:
    2206                 :            :         case CFG_METHOD_52:
    2207                 :          0 :                 val = rtl_mdio_direct_read_phy_ocp(hw, 0xC416);
    2208         [ #  # ]:          0 :                 if (val != 0x0050) {
    2209                 :          0 :                         rtl_set_phy_mcu_patch_request(hw);
    2210                 :          0 :                         rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0000);
    2211                 :          0 :                         rtl_mdio_direct_write_phy_ocp(hw, 0xC416, 0x0500);
    2212                 :          0 :                         rtl_clear_phy_mcu_patch_request(hw);
    2213                 :            :                 }
    2214                 :            :                 break;
    2215                 :            :         }
    2216                 :          0 : }
    2217                 :            : 
    2218                 :            : static void
    2219                 :          0 : rtl8168_disable_dma_agg(struct rtl_hw *hw)
    2220                 :            : {
    2221         [ #  # ]:          0 :         switch (hw->mcfg) {
    2222                 :          0 :         case CFG_METHOD_29:
    2223                 :            :         case CFG_METHOD_30:
    2224                 :            :         case CFG_METHOD_31:
    2225                 :            :         case CFG_METHOD_32:
    2226                 :            :         case CFG_METHOD_33:
    2227                 :            :         case CFG_METHOD_34:
    2228                 :            :         case CFG_METHOD_35:
    2229                 :            :         case CFG_METHOD_36:
    2230                 :            :         case CFG_METHOD_37:
    2231                 :          0 :                 rtl_mac_ocp_write(hw, 0xE63E, rtl_mac_ocp_read(hw, 0xE63E) &
    2232                 :            :                                               ~(BIT_3 | BIT_2 | BIT_1));
    2233                 :          0 :                 rtl_mac_ocp_write(hw, 0xE63E,
    2234                 :          0 :                                   rtl_mac_ocp_read(hw, 0xE63E) | (BIT_0));
    2235                 :          0 :                 rtl_mac_ocp_write(hw, 0xE63E,
    2236                 :          0 :                                   rtl_mac_ocp_read(hw, 0xE63E) & ~(BIT_0));
    2237                 :          0 :                 rtl_mac_ocp_write(hw, 0xC094, 0x0);
    2238                 :          0 :                 rtl_mac_ocp_write(hw, 0xC09E, 0x0);
    2239                 :          0 :                 break;
    2240                 :            :         }
    2241                 :          0 : }
    2242                 :            : 
    2243                 :            : static void
    2244                 :          0 : rtl_hw_init(struct rtl_hw *hw)
    2245                 :            : {
    2246                 :            :         u32 csi_tmp;
    2247                 :            : 
    2248                 :            :         /* Disable aspm clkreq internal */
    2249                 :            :         rtl_enable_force_clkreq(hw, 0);
    2250                 :          0 :         rtl_enable_cfg9346_write(hw);
    2251                 :          0 :         rtl_enable_aspm_clkreq_lock(hw, 0);
    2252                 :          0 :         rtl_disable_cfg9346_write(hw);
    2253                 :            : 
    2254                 :          0 :         rtl_disable_ups(hw);
    2255                 :            : 
    2256                 :            :         /* Disable DMA aggregation */
    2257                 :          0 :         rtl8168_disable_dma_agg(hw);
    2258                 :            : 
    2259                 :          0 :         hw->hw_ops.hw_mac_mcu_config(hw);
    2260                 :            : 
    2261                 :            :         /* Disable ocp phy power saving */
    2262                 :          0 :         rtl_disable_ocp_phy_power_saving(hw);
    2263                 :            : 
    2264                 :            :         /* Set PCIE uncorrectable error status mask pcie 0x108 */
    2265                 :          0 :         csi_tmp = rtl_csi_read(hw, 0x108);
    2266                 :          0 :         csi_tmp |= BIT_20;
    2267                 :          0 :         rtl_csi_write(hw, 0x108, csi_tmp);
    2268                 :            : 
    2269                 :            :         /* MCU PME setting */
    2270      [ #  #  # ]:          0 :         switch (hw->mcfg) {
    2271                 :          0 :         case CFG_METHOD_21:
    2272                 :            :         case CFG_METHOD_22:
    2273                 :            :         case CFG_METHOD_23:
    2274                 :            :         case CFG_METHOD_24:
    2275                 :          0 :                 csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
    2276                 :          0 :                 csi_tmp |= (BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
    2277                 :          0 :                 rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
    2278                 :          0 :                 break;
    2279                 :          0 :         case CFG_METHOD_25:
    2280                 :            :         case CFG_METHOD_27:
    2281                 :            :         case CFG_METHOD_28:
    2282                 :            :         case CFG_METHOD_29:
    2283                 :            :         case CFG_METHOD_30:
    2284                 :            :         case CFG_METHOD_31:
    2285                 :            :         case CFG_METHOD_32:
    2286                 :            :         case CFG_METHOD_33:
    2287                 :            :         case CFG_METHOD_34:
    2288                 :            :         case CFG_METHOD_35:
    2289                 :            :         case CFG_METHOD_36:
    2290                 :            :         case CFG_METHOD_37:
    2291                 :          0 :                 csi_tmp = rtl_eri_read(hw, 0x1AB, 1, ERIAR_ExGMAC);
    2292                 :          0 :                 csi_tmp |= (BIT_3 | BIT_6);
    2293                 :          0 :                 rtl_eri_write(hw, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
    2294                 :          0 :                 break;
    2295                 :            :         }
    2296                 :          0 : }
    2297                 :            : 
    2298                 :            : void
    2299                 :          0 : rtl_hw_initialize(struct rtl_hw *hw)
    2300                 :            : {
    2301                 :          0 :         rtl_init_software_variable(hw);
    2302                 :            : 
    2303                 :          0 :         rtl_exit_oob(hw);
    2304                 :            : 
    2305                 :          0 :         rtl_hw_init(hw);
    2306                 :            : 
    2307                 :          0 :         rtl_nic_reset(hw);
    2308                 :          0 : }
    2309                 :            : 
    2310                 :            : void
    2311                 :          0 : rtl_get_mac_version(struct rtl_hw *hw, struct rte_pci_device *pci_dev)
    2312                 :            : {
    2313                 :            :         u32 reg, val32;
    2314                 :            :         u32 ic_version_id;
    2315                 :            : 
    2316                 :          0 :         val32 = RTL_R32(hw, TxConfig);
    2317                 :          0 :         reg = val32 & 0x7c800000;
    2318                 :          0 :         ic_version_id = val32 & 0x00700000;
    2319                 :            : 
    2320   [ #  #  #  #  :          0 :         switch (reg) {
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    2321                 :          0 :         case 0x30000000:
    2322                 :          0 :                 hw->mcfg = CFG_METHOD_1;
    2323                 :          0 :                 break;
    2324                 :          0 :         case 0x38000000:
    2325         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2326                 :          0 :                         hw->mcfg = CFG_METHOD_2;
    2327         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00500000) {
    2328                 :          0 :                         hw->mcfg = CFG_METHOD_3;
    2329                 :            :                 } else {
    2330                 :          0 :                         hw->mcfg = CFG_METHOD_3;
    2331                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2332                 :            :                 }
    2333                 :            :                 break;
    2334                 :          0 :         case 0x3C000000:
    2335         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2336                 :          0 :                         hw->mcfg = CFG_METHOD_4;
    2337         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00200000) {
    2338                 :          0 :                         hw->mcfg = CFG_METHOD_5;
    2339         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00400000) {
    2340                 :          0 :                         hw->mcfg = CFG_METHOD_6;
    2341                 :            :                 } else {
    2342                 :          0 :                         hw->mcfg = CFG_METHOD_6;
    2343                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2344                 :            :                 }
    2345                 :            :                 break;
    2346                 :          0 :         case 0x3C800000:
    2347         [ #  # ]:          0 :                 if (ic_version_id == 0x00100000) {
    2348                 :          0 :                         hw->mcfg = CFG_METHOD_7;
    2349         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00300000) {
    2350                 :          0 :                         hw->mcfg = CFG_METHOD_8;
    2351                 :            :                 } else {
    2352                 :          0 :                         hw->mcfg = CFG_METHOD_8;
    2353                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2354                 :            :                 }
    2355                 :            :                 break;
    2356                 :          0 :         case 0x28000000:
    2357         [ #  # ]:          0 :                 if (ic_version_id == 0x00100000) {
    2358                 :          0 :                         hw->mcfg = CFG_METHOD_9;
    2359         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00300000) {
    2360                 :          0 :                         hw->mcfg = CFG_METHOD_10;
    2361                 :            :                 } else {
    2362                 :          0 :                         hw->mcfg = CFG_METHOD_10;
    2363                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2364                 :            :                 }
    2365                 :            :                 break;
    2366                 :          0 :         case 0x28800000:
    2367         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2368                 :          0 :                         hw->mcfg = CFG_METHOD_11;
    2369         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00200000) {
    2370                 :          0 :                         hw->mcfg = CFG_METHOD_12;
    2371                 :          0 :                         RTL_W32(hw, 0xD0, RTL_R32(hw, 0xD0) | 0x00020000);
    2372         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00300000) {
    2373                 :          0 :                         hw->mcfg = CFG_METHOD_13;
    2374                 :            :                 } else {
    2375                 :          0 :                         hw->mcfg = CFG_METHOD_13;
    2376                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2377                 :            :                 }
    2378                 :            :                 break;
    2379                 :          0 :         case 0x2C000000:
    2380         [ #  # ]:          0 :                 if (ic_version_id == 0x00100000) {
    2381                 :          0 :                         hw->mcfg = CFG_METHOD_14;
    2382         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00200000) {
    2383                 :          0 :                         hw->mcfg = CFG_METHOD_15;
    2384                 :            :                 } else {
    2385                 :          0 :                         hw->mcfg = CFG_METHOD_15;
    2386                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2387                 :            :                 }
    2388                 :            :                 break;
    2389                 :          0 :         case 0x2C800000:
    2390         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2391                 :          0 :                         hw->mcfg = CFG_METHOD_16;
    2392         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2393                 :          0 :                         hw->mcfg = CFG_METHOD_17;
    2394                 :            :                 } else {
    2395                 :          0 :                         hw->mcfg = CFG_METHOD_17;
    2396                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2397                 :            :                 }
    2398                 :            :                 break;
    2399                 :          0 :         case 0x48000000:
    2400         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2401                 :          0 :                         hw->mcfg = CFG_METHOD_18;
    2402         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2403                 :          0 :                         hw->mcfg = CFG_METHOD_19;
    2404                 :            :                 } else {
    2405                 :          0 :                         hw->mcfg = CFG_METHOD_19;
    2406                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2407                 :            :                 }
    2408                 :            :                 break;
    2409                 :          0 :         case 0x48800000:
    2410         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2411                 :          0 :                         hw->mcfg = CFG_METHOD_20;
    2412                 :            :                 } else {
    2413                 :          0 :                         hw->mcfg = CFG_METHOD_20;
    2414                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2415                 :            :                 }
    2416                 :            :                 break;
    2417                 :          0 :         case 0x4C000000:
    2418         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2419                 :          0 :                         hw->mcfg = CFG_METHOD_21;
    2420         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2421                 :          0 :                         hw->mcfg = CFG_METHOD_22;
    2422                 :            :                 } else {
    2423                 :          0 :                         hw->mcfg = CFG_METHOD_22;
    2424                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2425                 :            :                 }
    2426                 :            :                 break;
    2427                 :          0 :         case 0x50000000:
    2428         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2429                 :          0 :                         hw->mcfg = CFG_METHOD_23;
    2430         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2431                 :          0 :                         hw->mcfg = CFG_METHOD_27;
    2432         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00200000) {
    2433                 :          0 :                         hw->mcfg = CFG_METHOD_28;
    2434                 :            :                 } else {
    2435                 :          0 :                         hw->mcfg = CFG_METHOD_28;
    2436                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2437                 :            :                 }
    2438                 :            :                 break;
    2439                 :          0 :         case 0x50800000:
    2440         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2441                 :          0 :                         hw->mcfg = CFG_METHOD_24;
    2442         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2443                 :          0 :                         hw->mcfg = CFG_METHOD_25;
    2444                 :            :                 } else {
    2445                 :          0 :                         hw->mcfg = CFG_METHOD_25;
    2446                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2447                 :            :                 }
    2448                 :            :                 break;
    2449                 :          0 :         case 0x5C800000:
    2450         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2451                 :          0 :                         hw->mcfg = CFG_METHOD_26;
    2452                 :            :                 } else {
    2453                 :          0 :                         hw->mcfg = CFG_METHOD_26;
    2454                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2455                 :            :                 }
    2456                 :            :                 break;
    2457                 :          0 :         case 0x54000000:
    2458         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2459                 :          0 :                         hw->mcfg = CFG_METHOD_29;
    2460         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00100000) {
    2461                 :          0 :                         hw->mcfg = CFG_METHOD_30;
    2462                 :            :                 } else {
    2463                 :          0 :                         hw->mcfg = CFG_METHOD_30;
    2464                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2465                 :            :                 }
    2466                 :            : 
    2467         [ #  # ]:          0 :                 if (hw->mcfg == CFG_METHOD_30) {
    2468         [ #  # ]:          0 :                         if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0100)
    2469                 :          0 :                                 hw->mcfg = CFG_METHOD_35;
    2470         [ #  # ]:          0 :                         else if ((rtl_mac_ocp_read(hw, 0xD006) & 0xFF00) == 0x0300)
    2471                 :          0 :                                 hw->mcfg = CFG_METHOD_36;
    2472                 :            :                 }
    2473                 :            :                 break;
    2474                 :          0 :         case 0x6C000000:
    2475         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2476                 :          0 :                         hw->mcfg = CFG_METHOD_37;
    2477                 :            :                 } else {
    2478                 :          0 :                         hw->mcfg = CFG_METHOD_37;
    2479                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2480                 :            :                 }
    2481                 :            :                 break;
    2482                 :          0 :         case 0x54800000:
    2483         [ #  # ]:          0 :                 if (ic_version_id == 0x00100000) {
    2484                 :          0 :                         hw->mcfg = CFG_METHOD_31;
    2485         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00200000) {
    2486                 :          0 :                         hw->mcfg = CFG_METHOD_32;
    2487         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00300000) {
    2488                 :          0 :                         hw->mcfg = CFG_METHOD_33;
    2489         [ #  # ]:          0 :                 } else if (ic_version_id == 0x00400000) {
    2490                 :          0 :                         hw->mcfg = CFG_METHOD_34;
    2491                 :            :                 } else {
    2492                 :          0 :                         hw->mcfg = CFG_METHOD_34;
    2493                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2494                 :            :                 }
    2495                 :            :                 break;
    2496                 :          0 :         case 0x60800000:
    2497         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2498                 :          0 :                         hw->mcfg = CFG_METHOD_48;
    2499         [ #  # ]:          0 :                 } else if (ic_version_id == 0x100000) {
    2500                 :          0 :                         hw->mcfg = CFG_METHOD_49;
    2501                 :            :                 } else {
    2502                 :          0 :                         hw->mcfg = CFG_METHOD_49;
    2503                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2504                 :            :                 }
    2505                 :            :                 break;
    2506                 :          0 :         case 0x64000000:
    2507         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2508                 :          0 :                         hw->mcfg = CFG_METHOD_50;
    2509         [ #  # ]:          0 :                 } else if (ic_version_id == 0x100000) {
    2510                 :          0 :                         hw->mcfg = CFG_METHOD_51;
    2511                 :            :                 } else {
    2512                 :          0 :                         hw->mcfg = CFG_METHOD_51;
    2513                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2514                 :            :                 }
    2515                 :            :                 break;
    2516                 :          0 :         case 0x68000000:
    2517         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2518                 :          0 :                         hw->mcfg = CFG_METHOD_54;
    2519         [ #  # ]:          0 :                 } else if (ic_version_id == 0x100000) {
    2520                 :          0 :                         hw->mcfg = CFG_METHOD_55;
    2521                 :            :                 } else {
    2522                 :          0 :                         hw->mcfg = CFG_METHOD_55;
    2523                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2524                 :            :                 }
    2525                 :            :                 break;
    2526                 :          0 :         case 0x68800000:
    2527         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2528                 :          0 :                         hw->mcfg = CFG_METHOD_56;
    2529         [ #  # ]:          0 :                 } else if (ic_version_id == 0x100000) {
    2530                 :          0 :                         hw->mcfg = CFG_METHOD_57;
    2531                 :            :                 } else {
    2532                 :          0 :                         hw->mcfg = CFG_METHOD_57;
    2533                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2534                 :            :                 }
    2535                 :            :                 break;
    2536                 :          0 :         case 0x70800000:
    2537         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2538                 :          0 :                         hw->mcfg = CFG_METHOD_58;
    2539                 :            :                 } else {
    2540                 :          0 :                         hw->mcfg = CFG_METHOD_58;
    2541                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2542                 :            :                 }
    2543                 :            :                 break;
    2544                 :          0 :         case 0x64800000:
    2545         [ #  # ]:          0 :                 if (ic_version_id == 0x00000000) {
    2546                 :          0 :                         hw->mcfg = CFG_METHOD_69;
    2547         [ #  # ]:          0 :                 } else if (ic_version_id == 0x100000) {
    2548                 :          0 :                         hw->mcfg = CFG_METHOD_70;
    2549         [ #  # ]:          0 :                 } else if (ic_version_id == 0x200000) {
    2550                 :          0 :                         hw->mcfg = CFG_METHOD_71;
    2551                 :            :                 } else {
    2552                 :          0 :                         hw->mcfg = CFG_METHOD_71;
    2553                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2554                 :            :                 }
    2555                 :            :                 break;
    2556                 :          0 :         case 0x6C800000:
    2557         [ #  # ]:          0 :                 if (ic_version_id == 0x100000) {
    2558                 :          0 :                         hw->mcfg = CFG_METHOD_91;
    2559                 :            :                 } else {
    2560                 :          0 :                         hw->mcfg = CFG_METHOD_91;
    2561                 :          0 :                         hw->HwIcVerUnknown = TRUE;
    2562                 :            :                 }
    2563                 :            :                 break;
    2564                 :          0 :         default:
    2565                 :          0 :                 PMD_INIT_LOG(NOTICE, "unknown chip version (%x)", reg);
    2566                 :          0 :                 hw->mcfg = CFG_METHOD_DEFAULT;
    2567                 :          0 :                 hw->HwIcVerUnknown = TRUE;
    2568                 :          0 :                 break;
    2569                 :            :         }
    2570                 :            : 
    2571         [ #  # ]:          0 :         if (pci_dev->id.device_id == 0x8162) {
    2572         [ #  # ]:          0 :                 if (hw->mcfg == CFG_METHOD_49)
    2573                 :          0 :                         hw->mcfg = CFG_METHOD_52;
    2574         [ #  # ]:          0 :                 else if (hw->mcfg == CFG_METHOD_51)
    2575                 :          0 :                         hw->mcfg = CFG_METHOD_53;
    2576                 :            :         }
    2577                 :          0 : }
    2578                 :            : 
    2579                 :            : int
    2580                 :          0 : rtl_get_mac_address(struct rtl_hw *hw, struct rte_ether_addr *ea)
    2581                 :            : {
    2582                 :            :         u8 mac_addr[RTE_ETHER_ADDR_LEN] = {0};
    2583                 :            : 
    2584         [ #  # ]:          0 :         if (rtl_is_8125(hw)) {
    2585                 :          0 :                 *(u32 *)&mac_addr[0] = RTL_R32(hw, BACKUP_ADDR0_8125);
    2586                 :          0 :                 *(u16 *)&mac_addr[4] = RTL_R16(hw, BACKUP_ADDR1_8125);
    2587                 :            :         } else {
    2588                 :          0 :                 *(u32 *)&mac_addr[0] = rtl_eri_read(hw, 0xE0, 4, ERIAR_ExGMAC);
    2589                 :          0 :                 *(u16 *)&mac_addr[4] = rtl_eri_read(hw, 0xE4, 2, ERIAR_ExGMAC);
    2590                 :            :         }
    2591                 :            : 
    2592                 :            :         rte_ether_addr_copy((struct rte_ether_addr *)mac_addr, ea);
    2593                 :            : 
    2594                 :          0 :         return 0;
    2595                 :            : }
    2596                 :            : 
    2597                 :            : /* Puts an ethernet address into a receive address register. */
    2598                 :            : void
    2599                 :          0 : rtl_rar_set(struct rtl_hw *hw, uint8_t *addr)
    2600                 :            : {
    2601                 :            :         uint32_t rar_low = 0;
    2602                 :            :         uint32_t rar_high = 0;
    2603                 :            : 
    2604                 :          0 :         rar_low = ((uint32_t)addr[0] | ((uint32_t)addr[1] << 8) |
    2605                 :          0 :                    ((uint32_t)addr[2] << 16) | ((uint32_t)addr[3] << 24));
    2606                 :            : 
    2607                 :          0 :         rar_high = ((uint32_t)addr[4] | ((uint32_t)addr[5] << 8));
    2608                 :            : 
    2609                 :          0 :         rtl_enable_cfg9346_write(hw);
    2610                 :            : 
    2611                 :          0 :         RTL_W32(hw, MAC0, rar_low);
    2612                 :          0 :         RTL_W32(hw, MAC4, rar_high);
    2613                 :            : 
    2614                 :          0 :         rtl_disable_cfg9346_write(hw);
    2615                 :          0 : }
    2616                 :            : 
    2617                 :            : void
    2618                 :          0 : rtl_get_tally_stats(struct rtl_hw *hw, struct rte_eth_stats *rte_stats)
    2619                 :            : {
    2620                 :            :         struct rtl_counters *counters;
    2621                 :            :         uint64_t paddr;
    2622                 :            :         u32 cmd;
    2623                 :            :         u32 wait_cnt;
    2624                 :            : 
    2625                 :          0 :         counters = hw->tally_vaddr;
    2626                 :          0 :         paddr = hw->tally_paddr;
    2627         [ #  # ]:          0 :         if (!counters)
    2628                 :            :                 return;
    2629                 :            : 
    2630                 :          0 :         RTL_W32(hw, CounterAddrHigh, (u64)paddr >> 32);
    2631                 :          0 :         cmd = (u64)paddr & DMA_BIT_MASK(32);
    2632                 :          0 :         RTL_W32(hw, CounterAddrLow, cmd);
    2633                 :          0 :         RTL_W32(hw, CounterAddrLow, cmd | CounterDump);
    2634                 :            : 
    2635                 :            :         wait_cnt = 0;
    2636         [ #  # ]:          0 :         while (RTL_R32(hw, CounterAddrLow) & CounterDump) {
    2637                 :          0 :                 rte_delay_us(10);
    2638                 :            : 
    2639                 :          0 :                 wait_cnt++;
    2640         [ #  # ]:          0 :                 if (wait_cnt > 20)
    2641                 :            :                         break;
    2642                 :            :         }
    2643                 :            : 
    2644                 :            :         /* RX errors */
    2645                 :          0 :         rte_stats->imissed = rte_le_to_cpu_64(counters->rx_missed);
    2646                 :          0 :         rte_stats->ierrors = rte_le_to_cpu_64(counters->rx_errors);
    2647                 :            : 
    2648                 :            :         /* TX errors */
    2649                 :          0 :         rte_stats->oerrors = rte_le_to_cpu_64(counters->tx_errors);
    2650                 :            : 
    2651                 :          0 :         rte_stats->ipackets = rte_le_to_cpu_64(counters->rx_packets);
    2652                 :          0 :         rte_stats->opackets = rte_le_to_cpu_64(counters->tx_packets);
    2653                 :            : }
    2654                 :            : 
    2655                 :            : void
    2656                 :          0 : rtl_clear_tally_stats(struct rtl_hw *hw)
    2657                 :            : {
    2658         [ #  # ]:          0 :         if (!hw->tally_paddr)
    2659                 :            :                 return;
    2660                 :            : 
    2661                 :          0 :         RTL_W32(hw, CounterAddrHigh, (u64)hw->tally_paddr >> 32);
    2662                 :          0 :         RTL_W32(hw, CounterAddrLow,
    2663                 :            :                 ((u64)hw->tally_paddr & (DMA_BIT_MASK(32))) | CounterReset);
    2664                 :            : }
    2665                 :            : 
    2666                 :            : int
    2667                 :          0 : rtl_tally_init(struct rte_eth_dev *dev)
    2668                 :            : {
    2669                 :          0 :         struct rtl_adapter *adapter = RTL_DEV_PRIVATE(dev);
    2670                 :          0 :         struct rtl_hw *hw = &adapter->hw;
    2671                 :            :         const struct rte_memzone *mz;
    2672                 :            : 
    2673                 :          0 :         mz = rte_eth_dma_zone_reserve(dev, "tally_counters", 0,
    2674                 :          0 :                                       sizeof(struct rtl_counters), 64, rte_socket_id());
    2675         [ #  # ]:          0 :         if (mz == NULL)
    2676                 :            :                 return -ENOMEM;
    2677                 :            : 
    2678                 :          0 :         hw->tally_vaddr = mz->addr;
    2679                 :          0 :         hw->tally_paddr = mz->iova;
    2680                 :            : 
    2681                 :            :         /* Fill tally addrs */
    2682                 :          0 :         RTL_W32(hw, CounterAddrHigh, (u64)hw->tally_paddr >> 32);
    2683                 :          0 :         RTL_W32(hw, CounterAddrLow, (u64)hw->tally_paddr & (DMA_BIT_MASK(32)));
    2684                 :            : 
    2685                 :            :         /* Reset the hw statistics */
    2686                 :          0 :         rtl_clear_tally_stats(hw);
    2687                 :            : 
    2688                 :          0 :         return 0;
    2689                 :            : }
    2690                 :            : 
    2691                 :            : void
    2692                 :          0 : rtl_tally_free(struct rte_eth_dev *dev)
    2693                 :            : {
    2694                 :          0 :         rte_eth_dma_zone_free(dev, "tally_counters", 0);
    2695                 :          0 : }
    2696                 :            : 
    2697                 :            : bool
    2698                 :          0 : rtl_is_8125(struct rtl_hw *hw)
    2699                 :            : {
    2700                 :          0 :         return hw->mcfg >= CFG_METHOD_48;
    2701                 :            : }
    2702                 :            : 
    2703                 :            : u64
    2704                 :          0 : rtl_get_hw_mcu_patch_code_ver(struct rtl_hw *hw)
    2705                 :            : {
    2706                 :            :         u64 ver;
    2707                 :            :         int i;
    2708                 :            : 
    2709                 :            :         /* Switch to page 2 */
    2710                 :          0 :         rtl_switch_mac_mcu_ram_code_page(hw, 2);
    2711                 :            : 
    2712                 :            :         ver = 0;
    2713         [ #  # ]:          0 :         for (i = 0; i < 8; i += 2) {
    2714                 :          0 :                 ver <<= 16;
    2715                 :          0 :                 ver |= rtl_mac_ocp_read(hw, 0xF9F8 + i);
    2716                 :            :         }
    2717                 :            : 
    2718                 :            :         /* Switch back to page 0 */
    2719                 :          0 :         rtl_switch_mac_mcu_ram_code_page(hw, 0);
    2720                 :            : 
    2721                 :          0 :         return ver;
    2722                 :            : }
    2723                 :            : 
    2724                 :            : u64
    2725                 :          0 : rtl_get_bin_mcu_patch_code_ver(const u16 *entry, u16 entry_cnt)
    2726                 :            : {
    2727                 :            :         u64 ver;
    2728                 :            :         int i;
    2729                 :            : 
    2730   [ #  #  #  # ]:          0 :         if (!entry || entry_cnt == 0 || entry_cnt < 4)
    2731                 :            :                 return 0;
    2732                 :            : 
    2733                 :            :         ver = 0;
    2734         [ #  # ]:          0 :         for (i = 0; i < 4; i++) {
    2735                 :          0 :                 ver <<= 16;
    2736                 :          0 :                 ver |= entry[entry_cnt - 4 + i];
    2737                 :            :         }
    2738                 :            : 
    2739                 :            :         return ver;
    2740                 :            : }

Generated by: LCOV version 1.14