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

r8169: add support for RTL8126A

This adds support for the RTL8126A found on Asus z790 Maximus Formula.
It was successfully tested w/o the firmware at 1000Mbps. Firmware file
has been provided by Realtek and submitted to linux-firmware.
2.5G and 5G modes are untested.

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
3907f1ff e35ba581

+89 -24
+1
drivers/net/ethernet/realtek/r8169.h
··· 68 68 /* support for RTL_GIGA_MAC_VER_60 has been removed */ 69 69 RTL_GIGA_MAC_VER_61, 70 70 RTL_GIGA_MAC_VER_63, 71 + RTL_GIGA_MAC_VER_65, 71 72 RTL_GIGA_MAC_NONE 72 73 }; 73 74
+81 -24
drivers/net/ethernet/realtek/r8169_main.c
··· 55 55 #define FIRMWARE_8107E_2 "rtl_nic/rtl8107e-2.fw" 56 56 #define FIRMWARE_8125A_3 "rtl_nic/rtl8125a-3.fw" 57 57 #define FIRMWARE_8125B_2 "rtl_nic/rtl8125b-2.fw" 58 + #define FIRMWARE_8126A_2 "rtl_nic/rtl8126a-2.fw" 58 59 59 60 #define TX_DMA_BURST 7 /* Maximum PCI burst, '7' is unlimited */ 60 61 #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */ ··· 137 136 [RTL_GIGA_MAC_VER_61] = {"RTL8125A", FIRMWARE_8125A_3}, 138 137 /* reserve 62 for CFG_METHOD_4 in the vendor driver */ 139 138 [RTL_GIGA_MAC_VER_63] = {"RTL8125B", FIRMWARE_8125B_2}, 139 + [RTL_GIGA_MAC_VER_65] = {"RTL8126A", FIRMWARE_8126A_2}, 140 140 }; 141 141 142 142 static const struct pci_device_id rtl8169_pci_tbl[] = { ··· 160 158 { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024 }, 161 159 { 0x0001, 0x8168, PCI_ANY_ID, 0x2410 }, 162 160 { PCI_VDEVICE(REALTEK, 0x8125) }, 161 + { PCI_VDEVICE(REALTEK, 0x8126) }, 163 162 { PCI_VDEVICE(REALTEK, 0x3000) }, 164 163 {} 165 164 }; ··· 330 327 }; 331 328 332 329 enum rtl8125_registers { 330 + INT_CFG0_8125 = 0x34, 331 + #define INT_CFG0_ENABLE_8125 BIT(0) 332 + #define INT_CFG0_CLKREQEN BIT(3) 333 333 IntrMask_8125 = 0x38, 334 334 IntrStatus_8125 = 0x3c, 335 + INT_CFG1_8125 = 0x7a, 335 336 TxPoll_8125 = 0x90, 336 337 MAC0_BKP = 0x19e0, 337 338 EEE_TXIDLE_TIMER_8125 = 0x6048, ··· 1146 1139 case RTL_GIGA_MAC_VER_31: 1147 1140 r8168dp_2_mdio_write(tp, location, val); 1148 1141 break; 1149 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 1142 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65: 1150 1143 r8168g_mdio_write(tp, location, val); 1151 1144 break; 1152 1145 default: ··· 1161 1154 case RTL_GIGA_MAC_VER_28: 1162 1155 case RTL_GIGA_MAC_VER_31: 1163 1156 return r8168dp_2_mdio_read(tp, location); 1164 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 1157 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65: 1165 1158 return r8168g_mdio_read(tp, location); 1166 1159 default: 1167 1160 return r8169_mdio_read(tp, location); ··· 1347 1340 case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26: 1348 1341 case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30: 1349 1342 case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_37: 1350 - case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63: 1343 + case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_65: 1351 1344 if (enable) 1352 1345 RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~D3_NO_PLL_DOWN); 1353 1346 else ··· 1514 1507 break; 1515 1508 case RTL_GIGA_MAC_VER_34: 1516 1509 case RTL_GIGA_MAC_VER_37: 1517 - case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_63: 1510 + case RTL_GIGA_MAC_VER_39 ... RTL_GIGA_MAC_VER_65: 1518 1511 if (wolopts) 1519 1512 rtl_mod_config2(tp, 0, PME_SIGNAL); 1520 1513 else ··· 2080 2073 u16 val; 2081 2074 enum mac_version ver; 2082 2075 } mac_info[] = { 2076 + /* 8126A family. */ 2077 + { 0x7cf, 0x649, RTL_GIGA_MAC_VER_65 }, 2078 + 2083 2079 /* 8125B family. */ 2084 2080 { 0x7cf, 0x641, RTL_GIGA_MAC_VER_63 }, 2085 2081 ··· 2353 2343 RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST); 2354 2344 break; 2355 2345 case RTL_GIGA_MAC_VER_63: 2346 + case RTL_GIGA_MAC_VER_65: 2356 2347 RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST | 2357 2348 RX_PAUSE_SLOT_ON); 2358 2349 break; ··· 2540 2529 case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_61: 2541 2530 rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42); 2542 2531 break; 2543 - case RTL_GIGA_MAC_VER_63: 2532 + case RTL_GIGA_MAC_VER_63 ... RTL_GIGA_MAC_VER_65: 2544 2533 RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq); 2545 2534 rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42); 2546 2535 rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond_2, 100, 42); ··· 2783 2772 case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38: 2784 2773 rtl_eri_set_bits(tp, 0xd4, 0x0c00); 2785 2774 break; 2786 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 2775 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65: 2787 2776 r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80); 2788 2777 break; 2789 2778 default: ··· 2797 2786 case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38: 2798 2787 rtl_eri_clear_bits(tp, 0xd4, 0x1f00); 2799 2788 break; 2800 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 2789 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65: 2801 2790 r8168_mac_ocp_modify(tp, 0xc0ac, 0x1f80, 0); 2802 2791 break; 2803 2792 default: ··· 2807 2796 2808 2797 static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable) 2809 2798 { 2799 + u8 val8; 2800 + 2810 2801 if (tp->mac_version < RTL_GIGA_MAC_VER_32) 2811 2802 return; 2812 2803 ··· 2822 2809 return; 2823 2810 2824 2811 rtl_mod_config5(tp, 0, ASPM_en); 2825 - rtl_mod_config2(tp, 0, ClkReqEn); 2812 + switch (tp->mac_version) { 2813 + case RTL_GIGA_MAC_VER_65: 2814 + val8 = RTL_R8(tp, INT_CFG0_8125) | INT_CFG0_CLKREQEN; 2815 + RTL_W8(tp, INT_CFG0_8125, val8); 2816 + break; 2817 + default: 2818 + rtl_mod_config2(tp, 0, ClkReqEn); 2819 + break; 2820 + } 2826 2821 2827 2822 switch (tp->mac_version) { 2828 2823 case RTL_GIGA_MAC_VER_46 ... RTL_GIGA_MAC_VER_48: 2829 - case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63: 2824 + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65: 2830 2825 /* reset ephy tx/rx disable timer */ 2831 2826 r8168_mac_ocp_modify(tp, 0xe094, 0xff00, 0); 2832 2827 /* chip can trigger L1.2 */ ··· 2846 2825 } else { 2847 2826 switch (tp->mac_version) { 2848 2827 case RTL_GIGA_MAC_VER_46 ... RTL_GIGA_MAC_VER_48: 2849 - case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63: 2828 + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65: 2850 2829 r8168_mac_ocp_modify(tp, 0xe092, 0x00ff, 0); 2851 2830 break; 2852 2831 default: 2853 2832 break; 2854 2833 } 2855 2834 2856 - rtl_mod_config2(tp, ClkReqEn, 0); 2835 + switch (tp->mac_version) { 2836 + case RTL_GIGA_MAC_VER_65: 2837 + val8 = RTL_R8(tp, INT_CFG0_8125) & ~INT_CFG0_CLKREQEN; 2838 + RTL_W8(tp, INT_CFG0_8125, val8); 2839 + break; 2840 + default: 2841 + rtl_mod_config2(tp, ClkReqEn, 0); 2842 + break; 2843 + } 2857 2844 rtl_mod_config5(tp, ASPM_en, 0); 2858 2845 } 2859 2846 } ··· 3574 3545 /* disable new tx descriptor format */ 3575 3546 r8168_mac_ocp_modify(tp, 0xeb58, 0x0001, 0x0000); 3576 3547 3577 - if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3548 + if (tp->mac_version == RTL_GIGA_MAC_VER_65) 3549 + RTL_W8(tp, 0xD8, RTL_R8(tp, 0xD8) & ~0x02); 3550 + 3551 + if (tp->mac_version == RTL_GIGA_MAC_VER_65) 3552 + r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400); 3553 + else if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3578 3554 r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0200); 3579 3555 else 3580 - r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0400); 3556 + r8168_mac_ocp_modify(tp, 0xe614, 0x0700, 0x0300); 3581 3557 3582 3558 if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3583 3559 r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0000); ··· 3595 3561 r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0030); 3596 3562 r8168_mac_ocp_modify(tp, 0xe040, 0x1000, 0x0000); 3597 3563 r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001); 3564 + if (tp->mac_version == RTL_GIGA_MAC_VER_65) 3565 + r8168_mac_ocp_modify(tp, 0xea1c, 0x0300, 0x0000); 3566 + else 3567 + r8168_mac_ocp_modify(tp, 0xea1c, 0x0004, 0x0000); 3598 3568 r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403); 3599 3569 r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068); 3600 3570 r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f); ··· 3613 3575 3614 3576 rtl_loop_wait_low(tp, &rtl_mac_ocp_e00e_cond, 1000, 10); 3615 3577 3616 - if (tp->mac_version == RTL_GIGA_MAC_VER_63) 3617 - rtl8125b_config_eee_mac(tp); 3618 - else 3578 + if (tp->mac_version == RTL_GIGA_MAC_VER_61) 3619 3579 rtl8125a_config_eee_mac(tp); 3580 + else 3581 + rtl8125b_config_eee_mac(tp); 3620 3582 3621 3583 rtl_disable_rxdvgate(tp); 3622 3584 } ··· 3657 3619 3658 3620 rtl_set_def_aspm_entry_latency(tp); 3659 3621 rtl_ephy_init(tp, e_info_8125b); 3622 + rtl_hw_start_8125_common(tp); 3623 + } 3624 + 3625 + static void rtl_hw_start_8126a(struct rtl8169_private *tp) 3626 + { 3627 + rtl_set_def_aspm_entry_latency(tp); 3660 3628 rtl_hw_start_8125_common(tp); 3661 3629 } 3662 3630 ··· 3708 3664 [RTL_GIGA_MAC_VER_53] = rtl_hw_start_8117, 3709 3665 [RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2, 3710 3666 [RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b, 3667 + [RTL_GIGA_MAC_VER_65] = rtl_hw_start_8126a, 3711 3668 }; 3712 3669 3713 3670 if (hw_configs[tp->mac_version]) ··· 3719 3674 { 3720 3675 int i; 3721 3676 3677 + RTL_W8(tp, INT_CFG0_8125, 0x00); 3678 + 3722 3679 /* disable interrupt coalescing */ 3723 - for (i = 0xa00; i < 0xb00; i += 4) 3724 - RTL_W32(tp, i, 0); 3680 + switch (tp->mac_version) { 3681 + case RTL_GIGA_MAC_VER_61: 3682 + for (i = 0xa00; i < 0xb00; i += 4) 3683 + RTL_W32(tp, i, 0); 3684 + break; 3685 + case RTL_GIGA_MAC_VER_63: 3686 + case RTL_GIGA_MAC_VER_65: 3687 + for (i = 0xa00; i < 0xa80; i += 4) 3688 + RTL_W32(tp, i, 0); 3689 + RTL_W16(tp, INT_CFG1_8125, 0x0000); 3690 + break; 3691 + default: 3692 + break; 3693 + } 3725 3694 3726 3695 rtl_hw_config(tp); 3727 3696 } ··· 3813 3754 rtl_jumbo_config(tp); 3814 3755 3815 3756 switch (tp->mac_version) { 3816 - case RTL_GIGA_MAC_VER_61: 3817 - case RTL_GIGA_MAC_VER_63: 3757 + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65: 3818 3758 rtl8125_set_eee_txidle_timer(tp); 3819 3759 break; 3820 3760 default: ··· 3962 3904 RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq); 3963 3905 rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666); 3964 3906 break; 3965 - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_63: 3907 + case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_65: 3966 3908 rtl_enable_rxdvgate(tp); 3967 3909 fsleep(2000); 3968 3910 break; ··· 4113 4055 4114 4056 switch (tp->mac_version) { 4115 4057 case RTL_GIGA_MAC_VER_34: 4116 - case RTL_GIGA_MAC_VER_61: 4117 - case RTL_GIGA_MAC_VER_63: 4058 + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65: 4118 4059 padto = max_t(unsigned int, padto, ETH_ZLEN); 4119 4060 break; 4120 4061 default: ··· 5142 5085 case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48: 5143 5086 rtl_hw_init_8168g(tp); 5144 5087 break; 5145 - case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_63: 5088 + case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65: 5146 5089 rtl_hw_init_8125(tp); 5147 5090 break; 5148 5091 default:
+7
drivers/net/ethernet/realtek/r8169_phy_config.c
··· 1102 1102 rtl8125b_config_eee_phy(phydev); 1103 1103 } 1104 1104 1105 + static void rtl8126a_hw_phy_config(struct rtl8169_private *tp, 1106 + struct phy_device *phydev) 1107 + { 1108 + r8169_apply_firmware(tp); 1109 + } 1110 + 1105 1111 void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev, 1106 1112 enum mac_version ver) 1107 1113 { ··· 1158 1152 [RTL_GIGA_MAC_VER_53] = rtl8117_hw_phy_config, 1159 1153 [RTL_GIGA_MAC_VER_61] = rtl8125a_2_hw_phy_config, 1160 1154 [RTL_GIGA_MAC_VER_63] = rtl8125b_hw_phy_config, 1155 + [RTL_GIGA_MAC_VER_65] = rtl8126a_hw_phy_config, 1161 1156 }; 1162 1157 1163 1158 if (phy_configs[ver])