LCOV - code coverage report
Current view: top level - drivers/net/r8169/base - rtl8168g.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 207 0.0 %
Date: 2025-07-01 21:32:37 Functions: 0 7 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 13 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 "../r8169_compat.h"
       6                 :            : #include "../r8169_hw.h"
       7                 :            : #include "../r8169_phy.h"
       8                 :            : #include "rtl8168g.h"
       9                 :            : 
      10                 :            : /* For RTL8168G,RTL8168GU, CFG_METHOD_21,22,24,25 */
      11                 :            : 
      12                 :            : static void
      13                 :          0 : hw_init_rxcfg_8168g(struct rtl_hw *hw)
      14                 :            : {
      15                 :          0 :         RTL_W32(hw, RxConfig, Rx_Single_fetch_V2 |
      16                 :            :                 (RX_DMA_BURST_unlimited << RxCfgDMAShift) | RxEarly_off_V2);
      17                 :          0 : }
      18                 :            : 
      19                 :            : static void
      20                 :          0 : hw_ephy_config_8168g(struct rtl_hw *hw)
      21                 :            : {
      22                 :            :         u16 ephy_data;
      23                 :            : 
      24      [ #  #  # ]:          0 :         switch (hw->mcfg) {
      25                 :          0 :         case CFG_METHOD_21:
      26                 :            :         case CFG_METHOD_22:
      27                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x00);
      28                 :          0 :                 ephy_data &= ~BIT_3;
      29                 :          0 :                 rtl_ephy_write(hw, 0x00, ephy_data);
      30                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x0C);
      31                 :          0 :                 ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
      32                 :            :                                BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
      33                 :          0 :                 ephy_data |= (BIT_5 | BIT_11);
      34                 :          0 :                 rtl_ephy_write(hw, 0x0C, ephy_data);
      35                 :            : 
      36                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x1E);
      37                 :          0 :                 ephy_data |= BIT_0;
      38                 :          0 :                 rtl_ephy_write(hw, 0x1E, ephy_data);
      39                 :            : 
      40                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x19);
      41                 :          0 :                 ephy_data &= ~BIT_15;
      42                 :          0 :                 rtl_ephy_write(hw, 0x19, ephy_data);
      43                 :          0 :                 break;
      44                 :          0 :         case CFG_METHOD_25:
      45                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x00);
      46                 :          0 :                 ephy_data &= ~BIT_3;
      47                 :          0 :                 rtl_ephy_write(hw, 0x00, ephy_data);
      48                 :          0 :                 ephy_data = rtl_ephy_read(hw, 0x0C);
      49                 :          0 :                 ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 |
      50                 :            :                                BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
      51                 :          0 :                 ephy_data |= (BIT_5 | BIT_11);
      52                 :          0 :                 rtl_ephy_write(hw, 0x0C, ephy_data);
      53                 :            : 
      54                 :          0 :                 rtl_ephy_write(hw, 0x19, 0x7C00);
      55                 :          0 :                 rtl_ephy_write(hw, 0x1E, 0x20EB);
      56                 :          0 :                 rtl_ephy_write(hw, 0x0D, 0x1666);
      57                 :          0 :                 rtl_ephy_write(hw, 0x00, 0x10A3);
      58                 :          0 :                 rtl_ephy_write(hw, 0x06, 0xF050);
      59                 :            : 
      60                 :          0 :                 rtl_set_pcie_phy_bit(hw, 0x04, BIT_4);
      61                 :          0 :                 rtl_clear_pcie_phy_bit(hw, 0x1D, BIT_14);
      62                 :          0 :                 break;
      63                 :            :         default:
      64                 :            :                 break;
      65                 :            :         }
      66                 :          0 : }
      67                 :            : 
      68                 :            : static void
      69                 :          0 : hw_phy_config_8168g_1(struct rtl_hw *hw)
      70                 :            : {
      71                 :            :         u16 gphy_val;
      72                 :            : 
      73                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A46);
      74                 :          0 :         gphy_val = rtl_mdio_read(hw, 0x10);
      75                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCC);
      76         [ #  # ]:          0 :         if (gphy_val & BIT_8)
      77                 :          0 :                 rtl_clear_eth_phy_bit(hw, 0x12, BIT_15);
      78                 :            :         else
      79                 :          0 :                 rtl_set_eth_phy_bit(hw, 0x12, BIT_15);
      80                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A46);
      81                 :          0 :         gphy_val = rtl_mdio_read(hw, 0x13);
      82                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0C41);
      83         [ #  # ]:          0 :         if (gphy_val & BIT_8)
      84                 :          0 :                 rtl_set_eth_phy_bit(hw, 0x15, BIT_1);
      85                 :            :         else
      86                 :          0 :                 rtl_clear_eth_phy_bit(hw, 0x15, BIT_1);
      87                 :            : 
      88                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A44);
      89                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2 | BIT_3);
      90                 :            : 
      91                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCC);
      92                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
      93                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A44);
      94                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
      95                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
      96                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
      97                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8084);
      98                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
      99                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
     100                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
     101                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
     102                 :            : 
     103                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A4B);
     104                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_2);
     105                 :            : 
     106                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     107                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8012);
     108                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
     109                 :            : 
     110                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0C42);
     111                 :          0 :         gphy_val = rtl_mdio_read(hw, 0x11);
     112                 :            :         gphy_val |= BIT_14;
     113                 :          0 :         gphy_val &= ~BIT_13;
     114                 :          0 :         rtl_mdio_write(hw, 0x11, gphy_val);
     115                 :            : 
     116                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     117                 :          0 :         rtl_mdio_write(hw, 0x13, 0x809A);
     118                 :          0 :         rtl_mdio_write(hw, 0x14, 0x8022);
     119                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80A0);
     120                 :          0 :         gphy_val = rtl_mdio_read(hw, 0x14) & 0x00FF;
     121                 :          0 :         gphy_val |= 0x1000;
     122                 :          0 :         rtl_mdio_write(hw, 0x14, gphy_val);
     123                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8088);
     124                 :          0 :         rtl_mdio_write(hw, 0x14, 0x9222);
     125                 :            : 
     126                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0000);
     127                 :          0 : }
     128                 :            : 
     129                 :            : static void
     130                 :          0 : hw_phy_config_8168g_2(struct rtl_hw *hw)
     131                 :            : {
     132                 :            :         u16 gphy_val;
     133                 :            : 
     134                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCC);
     135                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
     136                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A44);
     137                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
     138                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
     139                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     140                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8084);
     141                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
     142                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
     143                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
     144                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
     145                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     146                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8012);
     147                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
     148                 :            : 
     149                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0C42);
     150                 :          0 :         gphy_val = rtl_mdio_read(hw, 0x11);
     151                 :            :         gphy_val |= BIT_14;
     152                 :          0 :         gphy_val &= ~BIT_13;
     153                 :          0 :         rtl_mdio_write(hw, 0x11, gphy_val);
     154                 :          0 : }
     155                 :            : 
     156                 :            : static void
     157                 :          0 : hw_phy_config_8168g_3(struct rtl_hw *hw)
     158                 :            : {
     159                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCC);
     160                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~BIT_8);
     161                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A44);
     162                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_7);
     163                 :          0 :         rtl_mdio_write(hw, 0x11, rtl_mdio_read(hw, 0x11) | BIT_6);
     164                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     165                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8084);
     166                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) & ~(BIT_14 | BIT_13));
     167                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_12);
     168                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_1);
     169                 :          0 :         rtl_mdio_write(hw, 0x10, rtl_mdio_read(hw, 0x10) | BIT_0);
     170                 :            : 
     171                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     172                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8012);
     173                 :          0 :         rtl_mdio_write(hw, 0x14, rtl_mdio_read(hw, 0x14) | BIT_15);
     174                 :            : 
     175                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCE);
     176                 :          0 :         rtl_mdio_write(hw, 0x12, 0x8860);
     177                 :            : 
     178                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     179                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80F3);
     180                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8B00);
     181                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80F0);
     182                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x3A00);
     183                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80EF);
     184                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0500);
     185                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80F6);
     186                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6E00);
     187                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80EC);
     188                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6800);
     189                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80ED);
     190                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
     191                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80F2);
     192                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF400);
     193                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80F4);
     194                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8500);
     195                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     196                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8110);
     197                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xA800);
     198                 :          0 :         rtl_mdio_write(hw, 0x13, 0x810F);
     199                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x1D00);
     200                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8111);
     201                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xF500);
     202                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8113);
     203                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x6100);
     204                 :          0 :         rtl_mdio_write(hw, 0x13, 0x8115);
     205                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9200);
     206                 :          0 :         rtl_mdio_write(hw, 0x13, 0x810E);
     207                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0400);
     208                 :          0 :         rtl_mdio_write(hw, 0x13, 0x810C);
     209                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x7C00);
     210                 :          0 :         rtl_mdio_write(hw, 0x13, 0x810B);
     211                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x5A00);
     212                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0A43);
     213                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80D1);
     214                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xFF00);
     215                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80CD);
     216                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x9E00);
     217                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80D3);
     218                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x0E00);
     219                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80D5);
     220                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0xCA00);
     221                 :          0 :         rtl_mdio_write(hw, 0x13, 0x80D7);
     222                 :          0 :         rtl_mdio_write(hw, 0x14, (rtl_mdio_read(hw, 0x14) & ~0xFF00) | 0x8400);
     223                 :          0 : }
     224                 :            : 
     225                 :            : static void
     226                 :          0 : hw_phy_config_8168g(struct rtl_hw *hw)
     227                 :            : {
     228         [ #  # ]:          0 :         if (hw->mcfg == CFG_METHOD_21)
     229                 :          0 :                 hw_phy_config_8168g_1(hw);
     230         [ #  # ]:          0 :         else if (hw->mcfg == CFG_METHOD_24)
     231                 :          0 :                 hw_phy_config_8168g_2(hw);
     232         [ #  # ]:          0 :         else if (hw->mcfg == CFG_METHOD_25)
     233                 :          0 :                 hw_phy_config_8168g_3(hw);
     234                 :            : 
     235                 :            :         /* Disable EthPhyPPSW */
     236                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCD);
     237                 :          0 :         rtl_mdio_write(hw, 0x14, 0x5065);
     238                 :          0 :         rtl_mdio_write(hw, 0x14, 0xD065);
     239                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BC8);
     240                 :          0 :         rtl_mdio_write(hw, 0x11, 0x5655);
     241                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0BCD);
     242                 :          0 :         rtl_mdio_write(hw, 0x14, 0x1065);
     243                 :          0 :         rtl_mdio_write(hw, 0x14, 0x9065);
     244                 :          0 :         rtl_mdio_write(hw, 0x14, 0x1065);
     245                 :          0 :         rtl_mdio_write(hw, 0x1F, 0x0000);
     246                 :          0 : }
     247                 :            : 
     248                 :            : static void
     249                 :          0 : hw_config_8168g(struct rtl_hw *hw)
     250                 :            : {
     251                 :            :         u32 csi_tmp;
     252                 :            : 
     253                 :            :         /* Share fifo rx params */
     254                 :          0 :         rtl_eri_write(hw, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
     255                 :          0 :         rtl_eri_write(hw, 0xCC, 1, 0x38, ERIAR_ExGMAC);
     256                 :          0 :         rtl_eri_write(hw, 0xD0, 1, 0x48, ERIAR_ExGMAC);
     257                 :          0 :         rtl_eri_write(hw, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
     258                 :            : 
     259                 :            :         /* Adjust the trx fifo*/
     260                 :          0 :         rtl_eri_write(hw, 0xCA, 2, 0x0370, ERIAR_ExGMAC);
     261                 :          0 :         rtl_eri_write(hw, 0xEA, 1, 0x10, ERIAR_ExGMAC);
     262                 :            : 
     263                 :            :         /* Disable share fifo */
     264                 :          0 :         RTL_W32(hw, TxConfig, RTL_R32(hw, TxConfig) & ~BIT_7);
     265                 :            : 
     266                 :          0 :         RTL_W8(hw, Config3, RTL_R8(hw, Config3) & ~Beacon_en);
     267                 :            : 
     268                 :            :         /* EEE led enable */
     269                 :          0 :         RTL_W8(hw, 0x1B, RTL_R8(hw, 0x1B) & ~0x07);
     270                 :            : 
     271                 :          0 :         RTL_W8(hw, Config2, RTL_R8(hw, Config2) & ~PMSTS_En);
     272                 :            : 
     273                 :            :         /* CRC wake disable */
     274                 :          0 :         rtl_mac_ocp_write(hw, 0xC140, 0xFFFF);
     275                 :            : 
     276                 :          0 :         csi_tmp = rtl_eri_read(hw, 0x1B0, 4, ERIAR_ExGMAC);
     277                 :          0 :         csi_tmp &= ~BIT_12;
     278                 :          0 :         rtl_eri_write(hw, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
     279                 :            : 
     280                 :          0 :         csi_tmp = rtl_eri_read(hw, 0x2FC, 1, ERIAR_ExGMAC);
     281                 :          0 :         csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
     282                 :          0 :         csi_tmp |= BIT_0;
     283                 :          0 :         rtl_eri_write(hw, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
     284                 :            : 
     285                 :          0 :         csi_tmp = rtl_eri_read(hw, 0x1D0, 1, ERIAR_ExGMAC);
     286                 :          0 :         csi_tmp |= BIT_1;
     287                 :          0 :         rtl_eri_write(hw, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
     288                 :          0 : }
     289                 :            : 
     290                 :            : const struct rtl_hw_ops rtl8168g_ops = {
     291                 :            :         .hw_config         = hw_config_8168g,
     292                 :            :         .hw_init_rxcfg     = hw_init_rxcfg_8168g,
     293                 :            :         .hw_ephy_config    = hw_ephy_config_8168g,
     294                 :            :         .hw_phy_config     = hw_phy_config_8168g,
     295                 :            :         .hw_mac_mcu_config = hw_mac_mcu_config_8168g,
     296                 :            :         .hw_phy_mcu_config = hw_phy_mcu_config_8168g,
     297                 :            : };

Generated by: LCOV version 1.14