56
56
#define FIRMWARE_8107E_1 "rtl_nic/rtl8107e-1.fw"
57
57
#define FIRMWARE_8107E_2 "rtl_nic/rtl8107e-2.fw"
58
58
#define FIRMWARE_8125A_3 "rtl_nic/rtl8125a-3.fw"
59
+ #define FIRMWARE_8125B_2 "rtl_nic/rtl8125b-2.fw"
59
60
60
61
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
61
62
The RTL chips use a 64 element hash table based on the Ethernet CRC. */
@@ -146,6 +147,8 @@ static const struct {
146
147
[RTL_GIGA_MAC_VER_52 ] = {"RTL8168fp/RTL8117" , FIRMWARE_8168FP_3 },
147
148
[RTL_GIGA_MAC_VER_60 ] = {"RTL8125A" },
148
149
[RTL_GIGA_MAC_VER_61 ] = {"RTL8125A" , FIRMWARE_8125A_3 },
150
+ /* reserve 62 for CFG_METHOD_4 in the vendor driver */
151
+ [RTL_GIGA_MAC_VER_63 ] = {"RTL8125B" , FIRMWARE_8125B_2 },
149
152
};
150
153
151
154
static const struct pci_device_id rtl8169_pci_tbl [] = {
@@ -335,6 +338,7 @@ enum rtl8125_registers {
335
338
IntrStatus_8125 = 0x3c ,
336
339
TxPoll_8125 = 0x90 ,
337
340
MAC0_BKP = 0x19e0 ,
341
+ EEE_TXIDLE_TIMER_8125 = 0x6048 ,
338
342
};
339
343
340
344
#define RX_VLAN_INNER_8125 BIT(22)
@@ -655,6 +659,7 @@ MODULE_FIRMWARE(FIRMWARE_8168FP_3);
655
659
MODULE_FIRMWARE (FIRMWARE_8107E_1 );
656
660
MODULE_FIRMWARE (FIRMWARE_8107E_2 );
657
661
MODULE_FIRMWARE (FIRMWARE_8125A_3 );
662
+ MODULE_FIRMWARE (FIRMWARE_8125B_2 );
658
663
659
664
static inline struct device * tp_to_dev (struct rtl8169_private * tp )
660
665
{
@@ -966,7 +971,7 @@ static void rtl_writephy(struct rtl8169_private *tp, int location, int val)
966
971
case RTL_GIGA_MAC_VER_31 :
967
972
r8168dp_2_mdio_write (tp , location , val );
968
973
break ;
969
- case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61 :
974
+ case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63 :
970
975
r8168g_mdio_write (tp , location , val );
971
976
break ;
972
977
default :
@@ -983,7 +988,7 @@ static int rtl_readphy(struct rtl8169_private *tp, int location)
983
988
case RTL_GIGA_MAC_VER_28 :
984
989
case RTL_GIGA_MAC_VER_31 :
985
990
return r8168dp_2_mdio_read (tp , location );
986
- case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61 :
991
+ case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63 :
987
992
return r8168g_mdio_read (tp , location );
988
993
default :
989
994
return r8169_mdio_read (tp , location );
@@ -1389,7 +1394,7 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
1389
1394
break ;
1390
1395
case RTL_GIGA_MAC_VER_34 :
1391
1396
case RTL_GIGA_MAC_VER_37 :
1392
- case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_61 :
1397
+ case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63 :
1393
1398
options = RTL_R8 (tp , Config2 ) & ~PME_SIGNAL ;
1394
1399
if (wolopts )
1395
1400
options |= PME_SIGNAL ;
@@ -1935,7 +1940,10 @@ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
1935
1940
u16 val ;
1936
1941
enum mac_version ver ;
1937
1942
} mac_info [] = {
1938
- /* 8125 family. */
1943
+ /* 8125B family. */
1944
+ { 0x7cf , 0x641 , RTL_GIGA_MAC_VER_63 },
1945
+
1946
+ /* 8125A family. */
1939
1947
{ 0x7cf , 0x608 , RTL_GIGA_MAC_VER_60 },
1940
1948
{ 0x7c8 , 0x608 , RTL_GIGA_MAC_VER_61 },
1941
1949
@@ -2073,6 +2081,17 @@ static void rtl8125a_config_eee_mac(struct rtl8169_private *tp)
2073
2081
r8168_mac_ocp_modify (tp , 0xeb62 , 0 , BIT (2 ) | BIT (1 ));
2074
2082
}
2075
2083
2084
+ static void rtl8125_set_eee_txidle_timer (struct rtl8169_private * tp )
2085
+ {
2086
+ RTL_W16 (tp , EEE_TXIDLE_TIMER_8125 , tp -> dev -> mtu + ETH_HLEN + 0x20 );
2087
+ }
2088
+
2089
+ static void rtl8125b_config_eee_mac (struct rtl8169_private * tp )
2090
+ {
2091
+ rtl8125_set_eee_txidle_timer (tp );
2092
+ r8168_mac_ocp_modify (tp , 0xe040 , 0 , BIT (1 ) | BIT (0 ));
2093
+ }
2094
+
2076
2095
static void rtl_rar_exgmac_set (struct rtl8169_private * tp , u8 * addr )
2077
2096
{
2078
2097
const u16 w [] = {
@@ -2174,7 +2193,7 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
2174
2193
case RTL_GIGA_MAC_VER_32 :
2175
2194
case RTL_GIGA_MAC_VER_33 :
2176
2195
case RTL_GIGA_MAC_VER_34 :
2177
- case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_61 :
2196
+ case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_63 :
2178
2197
RTL_W32 (tp , RxConfig , RTL_R32 (tp , RxConfig ) |
2179
2198
AcceptBroadcast | AcceptMulticast | AcceptMyPhys );
2180
2199
break ;
@@ -2208,11 +2227,7 @@ static void rtl_pll_power_down(struct rtl8169_private *tp)
2208
2227
case RTL_GIGA_MAC_VER_46 :
2209
2228
case RTL_GIGA_MAC_VER_47 :
2210
2229
case RTL_GIGA_MAC_VER_48 :
2211
- case RTL_GIGA_MAC_VER_50 :
2212
- case RTL_GIGA_MAC_VER_51 :
2213
- case RTL_GIGA_MAC_VER_52 :
2214
- case RTL_GIGA_MAC_VER_60 :
2215
- case RTL_GIGA_MAC_VER_61 :
2230
+ case RTL_GIGA_MAC_VER_50 ... RTL_GIGA_MAC_VER_63 :
2216
2231
RTL_W8 (tp , PMCH , RTL_R8 (tp , PMCH ) & ~0x80 );
2217
2232
break ;
2218
2233
case RTL_GIGA_MAC_VER_40 :
@@ -2244,11 +2259,7 @@ static void rtl_pll_power_up(struct rtl8169_private *tp)
2244
2259
case RTL_GIGA_MAC_VER_46 :
2245
2260
case RTL_GIGA_MAC_VER_47 :
2246
2261
case RTL_GIGA_MAC_VER_48 :
2247
- case RTL_GIGA_MAC_VER_50 :
2248
- case RTL_GIGA_MAC_VER_51 :
2249
- case RTL_GIGA_MAC_VER_52 :
2250
- case RTL_GIGA_MAC_VER_60 :
2251
- case RTL_GIGA_MAC_VER_61 :
2262
+ case RTL_GIGA_MAC_VER_50 ... RTL_GIGA_MAC_VER_63 :
2252
2263
RTL_W8 (tp , PMCH , RTL_R8 (tp , PMCH ) | 0xc0 );
2253
2264
break ;
2254
2265
case RTL_GIGA_MAC_VER_40 :
@@ -2279,7 +2290,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
2279
2290
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_52 :
2280
2291
RTL_W32 (tp , RxConfig , RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF );
2281
2292
break ;
2282
- case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61 :
2293
+ case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63 :
2283
2294
RTL_W32 (tp , RxConfig , RX_FETCH_DFLT_8125 | RX_DMA_BURST );
2284
2295
break ;
2285
2296
default :
@@ -2442,6 +2453,12 @@ DECLARE_RTL_COND(rtl_rxtx_empty_cond)
2442
2453
return (RTL_R8 (tp , MCU ) & RXTX_EMPTY ) == RXTX_EMPTY ;
2443
2454
}
2444
2455
2456
+ DECLARE_RTL_COND (rtl_rxtx_empty_cond_2 )
2457
+ {
2458
+ /* IntrMitigate has new functionality on RTL8125 */
2459
+ return (RTL_R16 (tp , IntrMitigate ) & 0x0103 ) == 0x0103 ;
2460
+ }
2461
+
2445
2462
static void rtl_wait_txrx_fifo_empty (struct rtl8169_private * tp )
2446
2463
{
2447
2464
switch (tp -> mac_version ) {
@@ -2452,6 +2469,11 @@ static void rtl_wait_txrx_fifo_empty(struct rtl8169_private *tp)
2452
2469
case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61 :
2453
2470
rtl_loop_wait_high (tp , & rtl_rxtx_empty_cond , 100 , 42 );
2454
2471
break ;
2472
+ case RTL_GIGA_MAC_VER_63 :
2473
+ RTL_W8 (tp , ChipCmd , RTL_R8 (tp , ChipCmd ) | StopReq );
2474
+ rtl_loop_wait_high (tp , & rtl_rxtx_empty_cond , 100 , 42 );
2475
+ rtl_loop_wait_high (tp , & rtl_rxtx_empty_cond_2 , 100 , 42 );
2476
+ break ;
2455
2477
default :
2456
2478
break ;
2457
2479
}
@@ -3523,18 +3545,27 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
3523
3545
/* disable new tx descriptor format */
3524
3546
r8168_mac_ocp_modify (tp , 0xeb58 , 0x0001 , 0x0000 );
3525
3547
3526
- r8168_mac_ocp_modify (tp , 0xe614 , 0x0700 , 0x0400 );
3527
- r8168_mac_ocp_modify (tp , 0xe63e , 0x0c30 , 0x0020 );
3548
+ if (tp -> mac_version == RTL_GIGA_MAC_VER_63 )
3549
+ r8168_mac_ocp_modify (tp , 0xe614 , 0x0700 , 0x0200 );
3550
+ else
3551
+ r8168_mac_ocp_modify (tp , 0xe614 , 0x0700 , 0x0400 );
3552
+
3553
+ if (tp -> mac_version == RTL_GIGA_MAC_VER_63 )
3554
+ r8168_mac_ocp_modify (tp , 0xe63e , 0x0c30 , 0x0000 );
3555
+ else
3556
+ r8168_mac_ocp_modify (tp , 0xe63e , 0x0c30 , 0x0020 );
3557
+
3528
3558
r8168_mac_ocp_modify (tp , 0xc0b4 , 0x0000 , 0x000c );
3529
3559
r8168_mac_ocp_modify (tp , 0xeb6a , 0x00ff , 0x0033 );
3530
3560
r8168_mac_ocp_modify (tp , 0xeb50 , 0x03e0 , 0x0040 );
3531
3561
r8168_mac_ocp_modify (tp , 0xe056 , 0x00f0 , 0x0030 );
3532
3562
r8168_mac_ocp_modify (tp , 0xe040 , 0x1000 , 0x0000 );
3563
+ r8168_mac_ocp_modify (tp , 0xea1c , 0x0003 , 0x0001 );
3533
3564
r8168_mac_ocp_modify (tp , 0xe0c0 , 0x4f0f , 0x4403 );
3534
- r8168_mac_ocp_modify (tp , 0xe052 , 0x0080 , 0x0067 );
3565
+ r8168_mac_ocp_modify (tp , 0xe052 , 0x0080 , 0x0068 );
3535
3566
r8168_mac_ocp_modify (tp , 0xc0ac , 0x0080 , 0x1f00 );
3536
3567
r8168_mac_ocp_modify (tp , 0xd430 , 0x0fff , 0x047f );
3537
- r8168_mac_ocp_modify ( tp , 0xe84c , 0x0000 , 0x00c0 );
3568
+
3538
3569
r8168_mac_ocp_modify (tp , 0xea1c , 0x0004 , 0x0000 );
3539
3570
r8168_mac_ocp_modify (tp , 0xeb54 , 0x0000 , 0x0001 );
3540
3571
udelay (1 );
@@ -3545,7 +3576,10 @@ static void rtl_hw_start_8125_common(struct rtl8169_private *tp)
3545
3576
3546
3577
rtl_loop_wait_low (tp , & rtl_mac_ocp_e00e_cond , 1000 , 10 );
3547
3578
3548
- rtl8125a_config_eee_mac (tp );
3579
+ if (tp -> mac_version == RTL_GIGA_MAC_VER_63 )
3580
+ rtl8125b_config_eee_mac (tp );
3581
+ else
3582
+ rtl8125a_config_eee_mac (tp );
3549
3583
3550
3584
RTL_W32 (tp , MISC , RTL_R32 (tp , MISC ) & ~RXDV_GATED_EN );
3551
3585
udelay (10 );
@@ -3617,6 +3651,26 @@ static void rtl_hw_start_8125a_2(struct rtl8169_private *tp)
3617
3651
rtl_hw_start_8125_common (tp );
3618
3652
}
3619
3653
3654
+ static void rtl_hw_start_8125b (struct rtl8169_private * tp )
3655
+ {
3656
+ static const struct ephy_info e_info_8125b [] = {
3657
+ { 0x0b , 0xffff , 0xa908 },
3658
+ { 0x1e , 0xffff , 0x20eb },
3659
+ { 0x4b , 0xffff , 0xa908 },
3660
+ { 0x5e , 0xffff , 0x20eb },
3661
+ { 0x22 , 0x0030 , 0x0020 },
3662
+ { 0x62 , 0x0030 , 0x0020 },
3663
+ };
3664
+
3665
+ rtl_set_def_aspm_entry_latency (tp );
3666
+ rtl_hw_aspm_clkreq_enable (tp , false);
3667
+
3668
+ rtl_ephy_init (tp , e_info_8125b );
3669
+ rtl_hw_start_8125_common (tp );
3670
+
3671
+ rtl_hw_aspm_clkreq_enable (tp , true);
3672
+ }
3673
+
3620
3674
static void rtl_hw_config (struct rtl8169_private * tp )
3621
3675
{
3622
3676
static const rtl_generic_fct hw_configs [] = {
@@ -3667,6 +3721,7 @@ static void rtl_hw_config(struct rtl8169_private *tp)
3667
3721
[RTL_GIGA_MAC_VER_52 ] = rtl_hw_start_8117 ,
3668
3722
[RTL_GIGA_MAC_VER_60 ] = rtl_hw_start_8125a_1 ,
3669
3723
[RTL_GIGA_MAC_VER_61 ] = rtl_hw_start_8125a_2 ,
3724
+ [RTL_GIGA_MAC_VER_63 ] = rtl_hw_start_8125b ,
3670
3725
};
3671
3726
3672
3727
if (hw_configs [tp -> mac_version ])
@@ -3753,6 +3808,15 @@ static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
3753
3808
netdev_update_features (dev );
3754
3809
rtl_jumbo_config (tp );
3755
3810
3811
+ switch (tp -> mac_version ) {
3812
+ case RTL_GIGA_MAC_VER_61 :
3813
+ case RTL_GIGA_MAC_VER_63 :
3814
+ rtl8125_set_eee_txidle_timer (tp );
3815
+ break ;
3816
+ default :
3817
+ break ;
3818
+ }
3819
+
3756
3820
return 0 ;
3757
3821
}
3758
3822
@@ -3899,7 +3963,7 @@ static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
3899
3963
RTL_W8 (tp , ChipCmd , RTL_R8 (tp , ChipCmd ) | StopReq );
3900
3964
rtl_loop_wait_high (tp , & rtl_txcfg_empty_cond , 100 , 666 );
3901
3965
break ;
3902
- case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61 :
3966
+ case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63 :
3903
3967
rtl_enable_rxdvgate (tp );
3904
3968
fsleep (2000 );
3905
3969
break ;
@@ -5075,7 +5139,7 @@ static void rtl_hw_initialize(struct rtl8169_private *tp)
5075
5139
case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48 :
5076
5140
rtl_hw_init_8168g (tp );
5077
5141
break ;
5078
- case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61 :
5142
+ case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63 :
5079
5143
rtl_hw_init_8125 (tp );
5080
5144
break ;
5081
5145
default :
0 commit comments