Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

r8169: add support for RTL8125B

Add support for RTL8125B rev.b. In my tests 2.5Gbps worked well
w/o firmware, however for a stable link at 1Gbps firmware revision
0.0.2 is needed.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Heiner Kallweit and committed by
David S. Miller
0439297b b3ba9ae8

+141 -23
+1
drivers/net/ethernet/realtek/r8169.h
··· 65 65 RTL_GIGA_MAC_VER_52, 66 66 RTL_GIGA_MAC_VER_60, 67 67 RTL_GIGA_MAC_VER_61, 68 + RTL_GIGA_MAC_VER_63, 68 69 RTL_GIGA_MAC_NONE 69 70 }; 70 71
+87 -23
drivers/net/ethernet/realtek/r8169_main.c
··· 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. */ ··· 147 146 [RTL_GIGA_MAC_VER_52] = {"RTL8168fp/RTL8117", FIRMWARE_8168FP_3}, 148 147 [RTL_GIGA_MAC_VER_60] = {"RTL8125A" }, 149 148 [RTL_GIGA_MAC_VER_61] = {"RTL8125A", FIRMWARE_8125A_3}, 149 + /* reserve 62 for CFG_METHOD_4 in the vendor driver */ 150 + [RTL_GIGA_MAC_VER_63] = {"RTL8125B", FIRMWARE_8125B_2}, 150 151 }; 151 152 152 153 static const struct pci_device_id rtl8169_pci_tbl[] = { ··· 338 335 IntrStatus_8125 = 0x3c, 339 336 TxPoll_8125 = 0x90, 340 337 MAC0_BKP = 0x19e0, 338 + EEE_TXIDLE_TIMER_8125 = 0x6048, 341 339 }; 342 340 343 341 #define RX_VLAN_INNER_8125 BIT(22) ··· 659 655 MODULE_FIRMWARE(FIRMWARE_8107E_1); 660 656 MODULE_FIRMWARE(FIRMWARE_8107E_2); 661 657 MODULE_FIRMWARE(FIRMWARE_8125A_3); 658 + MODULE_FIRMWARE(FIRMWARE_8125B_2); 662 659 663 660 static inline struct device *tp_to_dev(struct rtl8169_private *tp) 664 661 { ··· 971 966 case RTL_GIGA_MAC_VER_31: 972 967 r8168dp_2_mdio_write(tp, location, val); 973 968 break; 974 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61: 969 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 975 970 r8168g_mdio_write(tp, location, val); 976 971 break; 977 972 default: ··· 988 983 case RTL_GIGA_MAC_VER_28: 989 984 case RTL_GIGA_MAC_VER_31: 990 985 return r8168dp_2_mdio_read(tp, location); 991 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61: 986 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 992 987 return r8168g_mdio_read(tp, location); 993 988 default: 994 989 return r8169_mdio_read(tp, location); ··· 1394 1389 break; 1395 1390 case RTL_GIGA_MAC_VER_34: 1396 1391 case RTL_GIGA_MAC_VER_37: 1397 - case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_61: 1392 + case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63: 1398 1393 options = RTL_R8(tp, Config2) & ~PME_SIGNAL; 1399 1394 if (wolopts) 1400 1395 options |= PME_SIGNAL; ··· 1940 1935 u16 val; 1941 1936 enum mac_version ver; 1942 1937 } mac_info[] = { 1943 - /* 8125 family. */ 1938 + /* 8125B family. */ 1939 + { 0x7cf, 0x641, RTL_GIGA_MAC_VER_63 }, 1940 + 1941 + /* 8125A family. */ 1944 1942 { 0x7cf, 0x608, RTL_GIGA_MAC_VER_60 }, 1945 1943 { 0x7c8, 0x608, RTL_GIGA_MAC_VER_61 }, 1946 1944 ··· 2081 2073 r8168_mac_ocp_modify(tp, 0xeb62, 0, BIT(2) | BIT(1)); 2082 2074 } 2083 2075 2076 + static void rtl8125_set_eee_txidle_timer(struct rtl8169_private *tp) 2077 + { 2078 + RTL_W16(tp, EEE_TXIDLE_TIMER_8125, tp->dev->mtu + ETH_HLEN + 0x20); 2079 + } 2080 + 2081 + static void rtl8125b_config_eee_mac(struct rtl8169_private *tp) 2082 + { 2083 + rtl8125_set_eee_txidle_timer(tp); 2084 + r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0)); 2085 + } 2086 + 2084 2087 static void rtl_rar_exgmac_set(struct rtl8169_private *tp, u8 *addr) 2085 2088 { 2086 2089 const u16 w[] = { ··· 2193 2174 case RTL_GIGA_MAC_VER_32: 2194 2175 case RTL_GIGA_MAC_VER_33: 2195 2176 case RTL_GIGA_MAC_VER_34: 2196 - case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_61: 2177 + case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_63: 2197 2178 RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | 2198 2179 AcceptBroadcast | AcceptMulticast | AcceptMyPhys); 2199 2180 break; ··· 2227 2208 case RTL_GIGA_MAC_VER_46: 2228 2209 case RTL_GIGA_MAC_VER_47: 2229 2210 case RTL_GIGA_MAC_VER_48: 2230 - case RTL_GIGA_MAC_VER_50: 2231 - case RTL_GIGA_MAC_VER_51: 2232 - case RTL_GIGA_MAC_VER_52: 2233 - case RTL_GIGA_MAC_VER_60: 2234 - case RTL_GIGA_MAC_VER_61: 2211 + case RTL_GIGA_MAC_VER_50 ... RTL_GIGA_MAC_VER_63: 2235 2212 RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80); 2236 2213 break; 2237 2214 case RTL_GIGA_MAC_VER_40: ··· 2259 2244 case RTL_GIGA_MAC_VER_46: 2260 2245 case RTL_GIGA_MAC_VER_47: 2261 2246 case RTL_GIGA_MAC_VER_48: 2262 - case RTL_GIGA_MAC_VER_50: 2263 - case RTL_GIGA_MAC_VER_51: 2264 - case RTL_GIGA_MAC_VER_52: 2265 - case RTL_GIGA_MAC_VER_60: 2266 - case RTL_GIGA_MAC_VER_61: 2247 + case RTL_GIGA_MAC_VER_50 ... RTL_GIGA_MAC_VER_63: 2267 2248 RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0); 2268 2249 break; 2269 2250 case RTL_GIGA_MAC_VER_40: ··· 2290 2279 case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_52: 2291 2280 RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF); 2292 2281 break; 2293 - case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61: 2282 + case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63: 2294 2283 RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST); 2295 2284 break; 2296 2285 default: ··· 2453 2442 return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY; 2454 2443 } 2455 2444 2445 + DECLARE_RTL_COND(rtl_rxtx_empty_cond_2) 2446 + { 2447 + /* IntrMitigate has new functionality on RTL8125 */ 2448 + return (RTL_R16(tp, IntrMitigate) & 0x0103) == 0x0103; 2449 + } 2450 + 2456 2451 static void rtl_wait_txrx_fifo_empty(struct rtl8169_private *tp) 2457 2452 { 2458 2453 switch (tp->mac_version) { ··· 2468 2451 break; 2469 2452 case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61: 2470 2453 rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42); 2454 + break; 2455 + case RTL_GIGA_MAC_VER_63: 2456 + RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq); 2457 + rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42); 2458 + rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond_2, 100, 42); 2471 2459 break; 2472 2460 default: 2473 2461 break; ··· 3545 3523 /* disable new tx descriptor format */ 3546 3524 r8168_mac_ocp_modify(tp, 0xeb58, 0x0001, 0x0000); 3547 3525 3548 - r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400); 3549 - r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0020); 3526 + if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3527 + r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0200); 3528 + else 3529 + r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400); 3530 + 3531 + if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3532 + r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0000); 3533 + else 3534 + r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0020); 3535 + 3550 3536 r8168_mac_ocp_modify(tp, 0xc0b4, 0x0000, 0x000c); 3551 3537 r8168_mac_ocp_modify(tp, 0xeb6a, 0x00ff, 0x0033); 3552 3538 r8168_mac_ocp_modify(tp, 0xeb50, 0x03e0, 0x0040); 3553 3539 r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0030); 3554 3540 r8168_mac_ocp_modify(tp, 0xe040, 0x1000, 0x0000); 3541 + r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001); 3555 3542 r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403); 3556 - r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0067); 3543 + r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068); 3557 3544 r8168_mac_ocp_modify(tp, 0xc0ac, 0x0080, 0x1f00); 3558 3545 r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f); 3559 - r8168_mac_ocp_modify(tp, 0xe84c, 0x0000, 0x00c0); 3546 + 3560 3547 r8168_mac_ocp_modify(tp, 0xea1c, 0x0004, 0x0000); 3561 3548 r8168_mac_ocp_modify(tp, 0xeb54, 0x0000, 0x0001); 3562 3549 udelay(1); ··· 3576 3545 3577 3546 rtl_loop_wait_low(tp, &rtl_mac_ocp_e00e_cond, 1000, 10); 3578 3547 3579 - rtl8125a_config_eee_mac(tp); 3548 + if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3549 + rtl8125b_config_eee_mac(tp); 3550 + else 3551 + rtl8125a_config_eee_mac(tp); 3580 3552 3581 3553 RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN); 3582 3554 udelay(10); ··· 3651 3617 rtl_hw_start_8125_common(tp); 3652 3618 } 3653 3619 3620 + static void rtl_hw_start_8125b(struct rtl8169_private *tp) 3621 + { 3622 + static const struct ephy_info e_info_8125b[] = { 3623 + { 0x0b, 0xffff, 0xa908 }, 3624 + { 0x1e, 0xffff, 0x20eb }, 3625 + { 0x4b, 0xffff, 0xa908 }, 3626 + { 0x5e, 0xffff, 0x20eb }, 3627 + { 0x22, 0x0030, 0x0020 }, 3628 + { 0x62, 0x0030, 0x0020 }, 3629 + }; 3630 + 3631 + rtl_set_def_aspm_entry_latency(tp); 3632 + rtl_hw_aspm_clkreq_enable(tp, false); 3633 + 3634 + rtl_ephy_init(tp, e_info_8125b); 3635 + rtl_hw_start_8125_common(tp); 3636 + 3637 + rtl_hw_aspm_clkreq_enable(tp, true); 3638 + } 3639 + 3654 3640 static void rtl_hw_config(struct rtl8169_private *tp) 3655 3641 { 3656 3642 static const rtl_generic_fct hw_configs[] = { ··· 3721 3667 [RTL_GIGA_MAC_VER_52] = rtl_hw_start_8117, 3722 3668 [RTL_GIGA_MAC_VER_60] = rtl_hw_start_8125a_1, 3723 3669 [RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2, 3670 + [RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b, 3724 3671 }; 3725 3672 3726 3673 if (hw_configs[tp->mac_version]) ··· 3807 3752 dev->mtu = new_mtu; 3808 3753 netdev_update_features(dev); 3809 3754 rtl_jumbo_config(tp); 3755 + 3756 + switch (tp->mac_version) { 3757 + case RTL_GIGA_MAC_VER_61: 3758 + case RTL_GIGA_MAC_VER_63: 3759 + rtl8125_set_eee_txidle_timer(tp); 3760 + break; 3761 + default: 3762 + break; 3763 + } 3810 3764 3811 3765 return 0; 3812 3766 } ··· 3963 3899 RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq); 3964 3900 rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666); 3965 3901 break; 3966 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_61: 3902 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 3967 3903 rtl_enable_rxdvgate(tp); 3968 3904 fsleep(2000); 3969 3905 break; ··· 5139 5075 case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48: 5140 5076 rtl_hw_init_8168g(tp); 5141 5077 break; 5142 - case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_61: 5078 + case RTL_GIGA_MAC_VER_60 ... RTL_GIGA_MAC_VER_63: 5143 5079 rtl_hw_init_8125(tp); 5144 5080 break; 5145 5081 default:
+53
drivers/net/ethernet/realtek/r8169_phy_config.c
··· 97 97 phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000); 98 98 } 99 99 100 + static void rtl8125b_config_eee_phy(struct phy_device *phydev) 101 + { 102 + phy_modify_paged(phydev, 0xa6d, 0x12, 0x0001, 0x0000); 103 + phy_modify_paged(phydev, 0xa6d, 0x14, 0x0010, 0x0000); 104 + phy_modify_paged(phydev, 0xa42, 0x14, 0x0080, 0x0000); 105 + phy_modify_paged(phydev, 0xa4a, 0x11, 0x0200, 0x0000); 106 + } 107 + 100 108 static void rtl8169s_hw_phy_config(struct rtl8169_private *tp, 101 109 struct phy_device *phydev) 102 110 { ··· 1155 1147 rtl_writephy_batch(phydev, phy_reg_init); 1156 1148 } 1157 1149 1150 + static void rtl8125_legacy_force_mode(struct phy_device *phydev) 1151 + { 1152 + phy_modify_paged(phydev, 0xa5b, 0x12, BIT(15), 0); 1153 + } 1154 + 1158 1155 static void rtl8125a_1_hw_phy_config(struct rtl8169_private *tp, 1159 1156 struct phy_device *phydev) 1160 1157 { ··· 1263 1250 rtl8125a_config_eee_phy(phydev); 1264 1251 } 1265 1252 1253 + static void rtl8125b_hw_phy_config(struct rtl8169_private *tp, 1254 + struct phy_device *phydev) 1255 + { 1256 + r8169_apply_firmware(tp); 1257 + 1258 + phy_modify_paged(phydev, 0xa44, 0x11, 0x0000, 0x0800); 1259 + phy_modify_paged(phydev, 0xac4, 0x13, 0x00f0, 0x0090); 1260 + phy_modify_paged(phydev, 0xad3, 0x10, 0x0003, 0x0001); 1261 + 1262 + phy_write(phydev, 0x1f, 0x0b87); 1263 + phy_write(phydev, 0x16, 0x80f5); 1264 + phy_write(phydev, 0x17, 0x760e); 1265 + phy_write(phydev, 0x16, 0x8107); 1266 + phy_write(phydev, 0x17, 0x360e); 1267 + phy_write(phydev, 0x16, 0x8551); 1268 + phy_modify(phydev, 0x17, 0xff00, 0x0800); 1269 + phy_write(phydev, 0x1f, 0x0000); 1270 + 1271 + phy_modify_paged(phydev, 0xbf0, 0x10, 0xe000, 0xa000); 1272 + phy_modify_paged(phydev, 0xbf4, 0x13, 0x0f00, 0x0300); 1273 + 1274 + r8168g_phy_param(phydev, 0x8044, 0xffff, 0x2417); 1275 + r8168g_phy_param(phydev, 0x804a, 0xffff, 0x2417); 1276 + r8168g_phy_param(phydev, 0x8050, 0xffff, 0x2417); 1277 + r8168g_phy_param(phydev, 0x8056, 0xffff, 0x2417); 1278 + r8168g_phy_param(phydev, 0x805c, 0xffff, 0x2417); 1279 + r8168g_phy_param(phydev, 0x8062, 0xffff, 0x2417); 1280 + r8168g_phy_param(phydev, 0x8068, 0xffff, 0x2417); 1281 + r8168g_phy_param(phydev, 0x806e, 0xffff, 0x2417); 1282 + r8168g_phy_param(phydev, 0x8074, 0xffff, 0x2417); 1283 + r8168g_phy_param(phydev, 0x807a, 0xffff, 0x2417); 1284 + 1285 + phy_modify_paged(phydev, 0xa4c, 0x15, 0x0000, 0x0040); 1286 + phy_modify_paged(phydev, 0xbf8, 0x12, 0xe000, 0xa000); 1287 + 1288 + rtl8125_legacy_force_mode(phydev); 1289 + rtl8125b_config_eee_phy(phydev); 1290 + } 1291 + 1266 1292 void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev, 1267 1293 enum mac_version ver) 1268 1294 { ··· 1360 1308 [RTL_GIGA_MAC_VER_52] = rtl8117_hw_phy_config, 1361 1309 [RTL_GIGA_MAC_VER_60] = rtl8125a_1_hw_phy_config, 1362 1310 [RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config, 1311 + [RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config, 1363 1312 }; 1364 1313 1365 1314 if (phy_configs[ver])