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

Merge branch 'adds-support-for-lan887x-phy'

Divya Koppera says:

====================
Adds support for lan887x phy

Adds support for lan887x phy and accept autoneg configuration in
phy driver only when feature is enabled in supported list.

v2: https://lore.kernel.org/20240813181515.863208-1-divya.koppera@microchip.com
v1: https://lore.kernel.org/20240808145916.26006-1-Divya.Koppera@microchip.com
====================

Link: https://patch.msgid.link/20240821055906.27717-1-Divya.Koppera@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+580 -2
+576 -1
drivers/net/phy/microchip_t1.c
··· 12 12 13 13 #define PHY_ID_LAN87XX 0x0007c150 14 14 #define PHY_ID_LAN937X 0x0007c180 15 + #define PHY_ID_LAN887X 0x0007c1f0 15 16 16 17 /* External Register Control Register */ 17 18 #define LAN87XX_EXT_REG_CTL (0x14) ··· 95 94 /* SQI defines */ 96 95 #define LAN87XX_MAX_SQI 0x07 97 96 97 + /* Chiptop registers */ 98 + #define LAN887X_PMA_EXT_ABILITY_2 0x12 99 + #define LAN887X_PMA_EXT_ABILITY_2_1000T1 BIT(1) 100 + #define LAN887X_PMA_EXT_ABILITY_2_100T1 BIT(0) 101 + 102 + /* DSP 100M registers */ 103 + #define LAN887x_CDR_CONFIG1_100 0x0405 104 + #define LAN887x_LOCK1_EQLSR_CONFIG_100 0x0411 105 + #define LAN887x_SLV_HD_MUFAC_CONFIG_100 0x0417 106 + #define LAN887x_PLOCK_MUFAC_CONFIG_100 0x041c 107 + #define LAN887x_PROT_DISABLE_100 0x0425 108 + #define LAN887x_KF_LOOP_SAT_CONFIG_100 0x0454 109 + 110 + /* DSP 1000M registers */ 111 + #define LAN887X_LOCK1_EQLSR_CONFIG 0x0811 112 + #define LAN887X_LOCK3_EQLSR_CONFIG 0x0813 113 + #define LAN887X_PROT_DISABLE 0x0825 114 + #define LAN887X_FFE_GAIN6 0x0843 115 + #define LAN887X_FFE_GAIN7 0x0844 116 + #define LAN887X_FFE_GAIN8 0x0845 117 + #define LAN887X_FFE_GAIN9 0x0846 118 + #define LAN887X_ECHO_DELAY_CONFIG 0x08ec 119 + #define LAN887X_FFE_MAX_CONFIG 0x08ee 120 + 121 + /* PCS 1000M registers */ 122 + #define LAN887X_SCR_CONFIG_3 0x8043 123 + #define LAN887X_INFO_FLD_CONFIG_5 0x8048 124 + 125 + /* T1 afe registers */ 126 + #define LAN887X_ZQCAL_CONTROL_1 0x8080 127 + #define LAN887X_AFE_PORT_TESTBUS_CTRL2 0x8089 128 + #define LAN887X_AFE_PORT_TESTBUS_CTRL4 0x808b 129 + #define LAN887X_AFE_PORT_TESTBUS_CTRL6 0x808d 130 + #define LAN887X_TX_AMPLT_1000T1_REG 0x80b0 131 + #define LAN887X_INIT_COEFF_DFE1_100 0x0422 132 + 133 + /* PMA registers */ 134 + #define LAN887X_DSP_PMA_CONTROL 0x810e 135 + #define LAN887X_DSP_PMA_CONTROL_LNK_SYNC BIT(4) 136 + 137 + /* PCS 100M registers */ 138 + #define LAN887X_IDLE_ERR_TIMER_WIN 0x8204 139 + #define LAN887X_IDLE_ERR_CNT_THRESH 0x8213 140 + 141 + /* Misc registers */ 142 + #define LAN887X_REG_REG26 0x001a 143 + #define LAN887X_REG_REG26_HW_INIT_SEQ_EN BIT(8) 144 + 145 + /* Mis registers */ 146 + #define LAN887X_MIS_CFG_REG0 0xa00 147 + #define LAN887X_MIS_CFG_REG0_RCLKOUT_DIS BIT(5) 148 + #define LAN887X_MIS_CFG_REG0_MAC_MODE_SEL GENMASK(1, 0) 149 + 150 + #define LAN887X_MAC_MODE_RGMII 0x01 151 + #define LAN887X_MAC_MODE_SGMII 0x03 152 + 153 + #define LAN887X_MIS_DLL_CFG_REG0 0xa01 154 + #define LAN887X_MIS_DLL_CFG_REG1 0xa02 155 + 156 + #define LAN887X_MIS_DLL_DELAY_EN BIT(15) 157 + #define LAN887X_MIS_DLL_EN BIT(0) 158 + #define LAN887X_MIS_DLL_CONF (LAN887X_MIS_DLL_DELAY_EN |\ 159 + LAN887X_MIS_DLL_EN) 160 + 161 + #define LAN887X_MIS_CFG_REG2 0xa03 162 + #define LAN887X_MIS_CFG_REG2_FE_LPBK_EN BIT(2) 163 + 164 + #define LAN887X_MIS_PKT_STAT_REG0 0xa06 165 + #define LAN887X_MIS_PKT_STAT_REG1 0xa07 166 + #define LAN887X_MIS_PKT_STAT_REG3 0xa09 167 + #define LAN887X_MIS_PKT_STAT_REG4 0xa0a 168 + #define LAN887X_MIS_PKT_STAT_REG5 0xa0b 169 + #define LAN887X_MIS_PKT_STAT_REG6 0xa0c 170 + 171 + /* Chiptop common registers */ 172 + #define LAN887X_COMMON_LED3_LED2 0xc05 173 + #define LAN887X_COMMON_LED2_MODE_SEL_MASK GENMASK(4, 0) 174 + #define LAN887X_LED_LINK_ACT_ANY_SPEED 0x0 175 + 176 + /* MX chip top registers */ 177 + #define LAN887X_CHIP_SOFT_RST 0xf03f 178 + #define LAN887X_CHIP_SOFT_RST_RESET BIT(0) 179 + 180 + #define LAN887X_SGMII_CTL 0xf01a 181 + #define LAN887X_SGMII_CTL_SGMII_MUX_EN BIT(0) 182 + 183 + #define LAN887X_SGMII_PCS_CFG 0xf034 184 + #define LAN887X_SGMII_PCS_CFG_PCS_ENA BIT(9) 185 + 186 + #define LAN887X_EFUSE_READ_DAT9 0xf209 187 + #define LAN887X_EFUSE_READ_DAT9_SGMII_DIS BIT(9) 188 + #define LAN887X_EFUSE_READ_DAT9_MAC_MODE GENMASK(1, 0) 189 + 98 190 #define DRIVER_AUTHOR "Nisar Sayed <nisar.sayed@microchip.com>" 99 - #define DRIVER_DESC "Microchip LAN87XX/LAN937x T1 PHY driver" 191 + #define DRIVER_DESC "Microchip LAN87XX/LAN937x/LAN887x T1 PHY driver" 100 192 101 193 struct access_ereg_val { 102 194 u8 mode; ··· 197 103 u8 offset; 198 104 u16 val; 199 105 u16 mask; 106 + }; 107 + 108 + struct lan887x_hw_stat { 109 + const char *string; 110 + u8 mmd; 111 + u16 reg; 112 + u8 bits; 113 + }; 114 + 115 + static const struct lan887x_hw_stat lan887x_hw_stats[] = { 116 + { "TX Good Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG0, 14}, 117 + { "RX Good Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG1, 14}, 118 + { "RX ERR Count detected by PCS", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG3, 16}, 119 + { "TX CRC ERR Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG4, 8}, 120 + { "RX CRC ERR Count", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG5, 8}, 121 + { "RX ERR Count for SGMII MII2GMII", MDIO_MMD_VEND1, LAN887X_MIS_PKT_STAT_REG6, 8}, 122 + }; 123 + 124 + struct lan887x_regwr_map { 125 + u8 mmd; 126 + u16 reg; 127 + u16 val; 128 + }; 129 + 130 + struct lan887x_priv { 131 + u64 stats[ARRAY_SIZE(lan887x_hw_stats)]; 200 132 }; 201 133 202 134 static int lan937x_dsp_workaround(struct phy_device *phydev, u16 ereg, u8 bank) ··· 980 860 return LAN87XX_MAX_SQI; 981 861 } 982 862 863 + static int lan887x_rgmii_init(struct phy_device *phydev) 864 + { 865 + int ret; 866 + 867 + /* SGMII mux disable */ 868 + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 869 + LAN887X_SGMII_CTL, 870 + LAN887X_SGMII_CTL_SGMII_MUX_EN); 871 + if (ret < 0) 872 + return ret; 873 + 874 + /* Select MAC_MODE as RGMII */ 875 + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0, 876 + LAN887X_MIS_CFG_REG0_MAC_MODE_SEL, 877 + LAN887X_MAC_MODE_RGMII); 878 + if (ret < 0) 879 + return ret; 880 + 881 + /* Disable PCS */ 882 + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 883 + LAN887X_SGMII_PCS_CFG, 884 + LAN887X_SGMII_PCS_CFG_PCS_ENA); 885 + if (ret < 0) 886 + return ret; 887 + 888 + /* LAN887x Errata: RGMII rx clock active in SGMII mode 889 + * Disabled it for SGMII mode 890 + * Re-enabling it for RGMII mode 891 + */ 892 + return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 893 + LAN887X_MIS_CFG_REG0, 894 + LAN887X_MIS_CFG_REG0_RCLKOUT_DIS); 895 + } 896 + 897 + static int lan887x_sgmii_init(struct phy_device *phydev) 898 + { 899 + int ret; 900 + 901 + /* SGMII mux enable */ 902 + ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, 903 + LAN887X_SGMII_CTL, 904 + LAN887X_SGMII_CTL_SGMII_MUX_EN); 905 + if (ret < 0) 906 + return ret; 907 + 908 + /* Select MAC_MODE as SGMII */ 909 + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0, 910 + LAN887X_MIS_CFG_REG0_MAC_MODE_SEL, 911 + LAN887X_MAC_MODE_SGMII); 912 + if (ret < 0) 913 + return ret; 914 + 915 + /* LAN887x Errata: RGMII rx clock active in SGMII mode. 916 + * So disabling it for SGMII mode 917 + */ 918 + ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_CFG_REG0, 919 + LAN887X_MIS_CFG_REG0_RCLKOUT_DIS); 920 + if (ret < 0) 921 + return ret; 922 + 923 + /* Enable PCS */ 924 + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_SGMII_PCS_CFG, 925 + LAN887X_SGMII_PCS_CFG_PCS_ENA); 926 + } 927 + 928 + static int lan887x_config_rgmii_en(struct phy_device *phydev) 929 + { 930 + int txc; 931 + int rxc; 932 + int ret; 933 + 934 + ret = lan887x_rgmii_init(phydev); 935 + if (ret < 0) 936 + return ret; 937 + 938 + /* Control bit to enable/disable TX DLL delay line in signal path */ 939 + txc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0); 940 + if (txc < 0) 941 + return txc; 942 + 943 + /* Control bit to enable/disable RX DLL delay line in signal path */ 944 + rxc = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1); 945 + if (rxc < 0) 946 + return rxc; 947 + 948 + /* Configures the phy to enable RX/TX delay 949 + * RGMII - TX & RX delays are either added by MAC or not needed, 950 + * phy should not add 951 + * RGMII_ID - Configures phy to enable TX & RX delays, MAC shouldn't add 952 + * RGMII_RX_ID - Configures the PHY to enable the RX delay. 953 + * The MAC shouldn't add the RX delay 954 + * RGMII_TX_ID - Configures the PHY to enable the TX delay. 955 + * The MAC shouldn't add the TX delay in this case 956 + */ 957 + switch (phydev->interface) { 958 + case PHY_INTERFACE_MODE_RGMII: 959 + txc &= ~LAN887X_MIS_DLL_CONF; 960 + rxc &= ~LAN887X_MIS_DLL_CONF; 961 + break; 962 + case PHY_INTERFACE_MODE_RGMII_ID: 963 + txc |= LAN887X_MIS_DLL_CONF; 964 + rxc |= LAN887X_MIS_DLL_CONF; 965 + break; 966 + case PHY_INTERFACE_MODE_RGMII_RXID: 967 + txc &= ~LAN887X_MIS_DLL_CONF; 968 + rxc |= LAN887X_MIS_DLL_CONF; 969 + break; 970 + case PHY_INTERFACE_MODE_RGMII_TXID: 971 + txc |= LAN887X_MIS_DLL_CONF; 972 + rxc &= ~LAN887X_MIS_DLL_CONF; 973 + break; 974 + default: 975 + WARN_ONCE(1, "Invalid phydev interface %d\n", phydev->interface); 976 + return 0; 977 + } 978 + 979 + /* Configures the PHY to enable/disable RX delay in signal path */ 980 + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG1, 981 + LAN887X_MIS_DLL_CONF, rxc); 982 + if (ret < 0) 983 + return ret; 984 + 985 + /* Configures the PHY to enable/disable the TX delay in signal path */ 986 + return phy_modify_mmd(phydev, MDIO_MMD_VEND1, LAN887X_MIS_DLL_CFG_REG0, 987 + LAN887X_MIS_DLL_CONF, txc); 988 + } 989 + 990 + static int lan887x_config_phy_interface(struct phy_device *phydev) 991 + { 992 + int interface_mode; 993 + int sgmii_dis; 994 + int ret; 995 + 996 + /* Read sku efuse data for interfaces supported by sku */ 997 + ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, LAN887X_EFUSE_READ_DAT9); 998 + if (ret < 0) 999 + return ret; 1000 + 1001 + /* If interface_mode is 1 then efuse sets RGMII operations. 1002 + * If interface mode is 3 then efuse sets SGMII operations. 1003 + */ 1004 + interface_mode = ret & LAN887X_EFUSE_READ_DAT9_MAC_MODE; 1005 + /* SGMII disable is set for RGMII operations */ 1006 + sgmii_dis = ret & LAN887X_EFUSE_READ_DAT9_SGMII_DIS; 1007 + 1008 + switch (phydev->interface) { 1009 + case PHY_INTERFACE_MODE_RGMII: 1010 + case PHY_INTERFACE_MODE_RGMII_ID: 1011 + case PHY_INTERFACE_MODE_RGMII_RXID: 1012 + case PHY_INTERFACE_MODE_RGMII_TXID: 1013 + /* Reject RGMII settings for SGMII only sku */ 1014 + ret = -EOPNOTSUPP; 1015 + 1016 + if (!((interface_mode & LAN887X_MAC_MODE_SGMII) == 1017 + LAN887X_MAC_MODE_SGMII)) 1018 + ret = lan887x_config_rgmii_en(phydev); 1019 + break; 1020 + case PHY_INTERFACE_MODE_SGMII: 1021 + /* Reject SGMII setting for RGMII only sku */ 1022 + ret = -EOPNOTSUPP; 1023 + 1024 + if (!sgmii_dis) 1025 + ret = lan887x_sgmii_init(phydev); 1026 + break; 1027 + default: 1028 + /* Reject setting for unsupported interfaces */ 1029 + ret = -EOPNOTSUPP; 1030 + } 1031 + 1032 + return ret; 1033 + } 1034 + 1035 + static int lan887x_get_features(struct phy_device *phydev) 1036 + { 1037 + int ret; 1038 + 1039 + ret = genphy_c45_pma_read_abilities(phydev); 1040 + if (ret < 0) 1041 + return ret; 1042 + 1043 + /* Enable twisted pair */ 1044 + linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, phydev->supported); 1045 + 1046 + /* First patch only supports 100Mbps and 1000Mbps force-mode. 1047 + * T1 Auto-Negotiation (Clause 98 of IEEE 802.3) will be added later. 1048 + */ 1049 + linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported); 1050 + 1051 + return 0; 1052 + } 1053 + 1054 + static int lan887x_phy_init(struct phy_device *phydev) 1055 + { 1056 + int ret; 1057 + 1058 + /* Clear loopback */ 1059 + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, 1060 + LAN887X_MIS_CFG_REG2, 1061 + LAN887X_MIS_CFG_REG2_FE_LPBK_EN); 1062 + if (ret < 0) 1063 + return ret; 1064 + 1065 + /* Configure default behavior of led to link and activity for any 1066 + * speed 1067 + */ 1068 + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, 1069 + LAN887X_COMMON_LED3_LED2, 1070 + LAN887X_COMMON_LED2_MODE_SEL_MASK, 1071 + LAN887X_LED_LINK_ACT_ANY_SPEED); 1072 + if (ret < 0) 1073 + return ret; 1074 + 1075 + /* PHY interface setup */ 1076 + return lan887x_config_phy_interface(phydev); 1077 + } 1078 + 1079 + static int lan887x_phy_config(struct phy_device *phydev, 1080 + const struct lan887x_regwr_map *reg_map, int cnt) 1081 + { 1082 + int ret; 1083 + 1084 + for (int i = 0; i < cnt; i++) { 1085 + ret = phy_write_mmd(phydev, reg_map[i].mmd, 1086 + reg_map[i].reg, reg_map[i].val); 1087 + if (ret < 0) 1088 + return ret; 1089 + } 1090 + 1091 + return 0; 1092 + } 1093 + 1094 + static int lan887x_phy_setup(struct phy_device *phydev) 1095 + { 1096 + static const struct lan887x_regwr_map phy_cfg[] = { 1097 + /* PORT_AFE writes */ 1098 + {MDIO_MMD_PMAPMD, LAN887X_ZQCAL_CONTROL_1, 0x4008}, 1099 + {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL2, 0x0000}, 1100 + {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL6, 0x0040}, 1101 + /* 100T1_PCS_VENDOR writes */ 1102 + {MDIO_MMD_PCS, LAN887X_IDLE_ERR_CNT_THRESH, 0x0008}, 1103 + {MDIO_MMD_PCS, LAN887X_IDLE_ERR_TIMER_WIN, 0x800d}, 1104 + /* 100T1 DSP writes */ 1105 + {MDIO_MMD_VEND1, LAN887x_CDR_CONFIG1_100, 0x0ab1}, 1106 + {MDIO_MMD_VEND1, LAN887x_LOCK1_EQLSR_CONFIG_100, 0x5274}, 1107 + {MDIO_MMD_VEND1, LAN887x_SLV_HD_MUFAC_CONFIG_100, 0x0d74}, 1108 + {MDIO_MMD_VEND1, LAN887x_PLOCK_MUFAC_CONFIG_100, 0x0aea}, 1109 + {MDIO_MMD_VEND1, LAN887x_PROT_DISABLE_100, 0x0360}, 1110 + {MDIO_MMD_VEND1, LAN887x_KF_LOOP_SAT_CONFIG_100, 0x0c30}, 1111 + /* 1000T1 DSP writes */ 1112 + {MDIO_MMD_VEND1, LAN887X_LOCK1_EQLSR_CONFIG, 0x2a78}, 1113 + {MDIO_MMD_VEND1, LAN887X_LOCK3_EQLSR_CONFIG, 0x1368}, 1114 + {MDIO_MMD_VEND1, LAN887X_PROT_DISABLE, 0x1354}, 1115 + {MDIO_MMD_VEND1, LAN887X_FFE_GAIN6, 0x3C84}, 1116 + {MDIO_MMD_VEND1, LAN887X_FFE_GAIN7, 0x3ca5}, 1117 + {MDIO_MMD_VEND1, LAN887X_FFE_GAIN8, 0x3ca5}, 1118 + {MDIO_MMD_VEND1, LAN887X_FFE_GAIN9, 0x3ca5}, 1119 + {MDIO_MMD_VEND1, LAN887X_ECHO_DELAY_CONFIG, 0x0024}, 1120 + {MDIO_MMD_VEND1, LAN887X_FFE_MAX_CONFIG, 0x227f}, 1121 + /* 1000T1 PCS writes */ 1122 + {MDIO_MMD_PCS, LAN887X_SCR_CONFIG_3, 0x1e00}, 1123 + {MDIO_MMD_PCS, LAN887X_INFO_FLD_CONFIG_5, 0x0fa1}, 1124 + }; 1125 + 1126 + return lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg)); 1127 + } 1128 + 1129 + static int lan887x_100M_setup(struct phy_device *phydev) 1130 + { 1131 + int ret; 1132 + 1133 + /* (Re)configure the speed/mode dependent T1 settings */ 1134 + if (phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_FORCE || 1135 + phydev->master_slave_set == MASTER_SLAVE_CFG_MASTER_PREFERRED){ 1136 + static const struct lan887x_regwr_map phy_cfg[] = { 1137 + {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8}, 1138 + {MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x0038}, 1139 + {MDIO_MMD_VEND1, LAN887X_INIT_COEFF_DFE1_100, 0x000f}, 1140 + }; 1141 + 1142 + ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg)); 1143 + } else { 1144 + static const struct lan887x_regwr_map phy_cfg[] = { 1145 + {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x0038}, 1146 + {MDIO_MMD_VEND1, LAN887X_INIT_COEFF_DFE1_100, 0x0014}, 1147 + }; 1148 + 1149 + ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg)); 1150 + } 1151 + if (ret < 0) 1152 + return ret; 1153 + 1154 + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26, 1155 + LAN887X_REG_REG26_HW_INIT_SEQ_EN); 1156 + } 1157 + 1158 + static int lan887x_1000M_setup(struct phy_device *phydev) 1159 + { 1160 + static const struct lan887x_regwr_map phy_cfg[] = { 1161 + {MDIO_MMD_PMAPMD, LAN887X_TX_AMPLT_1000T1_REG, 0x003f}, 1162 + {MDIO_MMD_PMAPMD, LAN887X_AFE_PORT_TESTBUS_CTRL4, 0x00b8}, 1163 + }; 1164 + int ret; 1165 + 1166 + /* (Re)configure the speed/mode dependent T1 settings */ 1167 + ret = lan887x_phy_config(phydev, phy_cfg, ARRAY_SIZE(phy_cfg)); 1168 + if (ret < 0) 1169 + return ret; 1170 + 1171 + return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL, 1172 + LAN887X_DSP_PMA_CONTROL_LNK_SYNC); 1173 + } 1174 + 1175 + static int lan887x_link_setup(struct phy_device *phydev) 1176 + { 1177 + int ret = -EINVAL; 1178 + 1179 + if (phydev->speed == SPEED_1000) 1180 + ret = lan887x_1000M_setup(phydev); 1181 + else if (phydev->speed == SPEED_100) 1182 + ret = lan887x_100M_setup(phydev); 1183 + 1184 + return ret; 1185 + } 1186 + 1187 + /* LAN887x Errata: speed configuration changes require soft reset 1188 + * and chip soft reset 1189 + */ 1190 + static int lan887x_phy_reset(struct phy_device *phydev) 1191 + { 1192 + int ret, val; 1193 + 1194 + /* Clear 1000M link sync */ 1195 + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, LAN887X_DSP_PMA_CONTROL, 1196 + LAN887X_DSP_PMA_CONTROL_LNK_SYNC); 1197 + if (ret < 0) 1198 + return ret; 1199 + 1200 + /* Clear 100M link sync */ 1201 + ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, LAN887X_REG_REG26, 1202 + LAN887X_REG_REG26_HW_INIT_SEQ_EN); 1203 + if (ret < 0) 1204 + return ret; 1205 + 1206 + /* Chiptop soft-reset to allow the speed/mode change */ 1207 + ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, LAN887X_CHIP_SOFT_RST, 1208 + LAN887X_CHIP_SOFT_RST_RESET); 1209 + if (ret < 0) 1210 + return ret; 1211 + 1212 + /* CL22 soft-reset to let the link re-train */ 1213 + ret = phy_modify(phydev, MII_BMCR, BMCR_RESET, BMCR_RESET); 1214 + if (ret < 0) 1215 + return ret; 1216 + 1217 + /* Wait for reset complete or timeout if > 10ms */ 1218 + return phy_read_poll_timeout(phydev, MII_BMCR, val, !(val & BMCR_RESET), 1219 + 5000, 10000, true); 1220 + } 1221 + 1222 + static int lan887x_phy_reconfig(struct phy_device *phydev) 1223 + { 1224 + int ret; 1225 + 1226 + linkmode_zero(phydev->advertising); 1227 + 1228 + ret = genphy_c45_pma_setup_forced(phydev); 1229 + if (ret < 0) 1230 + return ret; 1231 + 1232 + return lan887x_link_setup(phydev); 1233 + } 1234 + 1235 + static int lan887x_config_aneg(struct phy_device *phydev) 1236 + { 1237 + int ret; 1238 + 1239 + /* LAN887x Errata: speed configuration changes require soft reset 1240 + * and chip soft reset 1241 + */ 1242 + ret = lan887x_phy_reset(phydev); 1243 + if (ret < 0) 1244 + return ret; 1245 + 1246 + return lan887x_phy_reconfig(phydev); 1247 + } 1248 + 1249 + static int lan887x_probe(struct phy_device *phydev) 1250 + { 1251 + struct lan887x_priv *priv; 1252 + 1253 + priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); 1254 + if (!priv) 1255 + return -ENOMEM; 1256 + 1257 + phydev->priv = priv; 1258 + 1259 + return lan887x_phy_setup(phydev); 1260 + } 1261 + 1262 + static u64 lan887x_get_stat(struct phy_device *phydev, int i) 1263 + { 1264 + struct lan887x_hw_stat stat = lan887x_hw_stats[i]; 1265 + struct lan887x_priv *priv = phydev->priv; 1266 + int val; 1267 + u64 ret; 1268 + 1269 + if (stat.mmd) 1270 + val = phy_read_mmd(phydev, stat.mmd, stat.reg); 1271 + else 1272 + val = phy_read(phydev, stat.reg); 1273 + 1274 + if (val < 0) { 1275 + ret = U64_MAX; 1276 + } else { 1277 + val = val & ((1 << stat.bits) - 1); 1278 + priv->stats[i] += val; 1279 + ret = priv->stats[i]; 1280 + } 1281 + 1282 + return ret; 1283 + } 1284 + 1285 + static void lan887x_get_stats(struct phy_device *phydev, 1286 + struct ethtool_stats *stats, u64 *data) 1287 + { 1288 + for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++) 1289 + data[i] = lan887x_get_stat(phydev, i); 1290 + } 1291 + 1292 + static int lan887x_get_sset_count(struct phy_device *phydev) 1293 + { 1294 + return ARRAY_SIZE(lan887x_hw_stats); 1295 + } 1296 + 1297 + static void lan887x_get_strings(struct phy_device *phydev, u8 *data) 1298 + { 1299 + for (int i = 0; i < ARRAY_SIZE(lan887x_hw_stats); i++) 1300 + ethtool_puts(&data, lan887x_hw_stats[i].string); 1301 + } 1302 + 983 1303 static struct phy_driver microchip_t1_phy_driver[] = { 984 1304 { 985 1305 PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX), ··· 1454 894 .get_sqi_max = lan87xx_get_sqi_max, 1455 895 .cable_test_start = lan87xx_cable_test_start, 1456 896 .cable_test_get_status = lan87xx_cable_test_get_status, 897 + }, 898 + { 899 + PHY_ID_MATCH_MODEL(PHY_ID_LAN887X), 900 + .name = "Microchip LAN887x T1 PHY", 901 + .probe = lan887x_probe, 902 + .get_features = lan887x_get_features, 903 + .config_init = lan887x_phy_init, 904 + .config_aneg = lan887x_config_aneg, 905 + .get_stats = lan887x_get_stats, 906 + .get_sset_count = lan887x_get_sset_count, 907 + .get_strings = lan887x_get_strings, 908 + .suspend = genphy_suspend, 909 + .resume = genphy_resume, 910 + .read_status = genphy_c45_read_status, 1457 911 } 1458 912 }; 1459 913 ··· 1476 902 static struct mdio_device_id __maybe_unused microchip_t1_tbl[] = { 1477 903 { PHY_ID_MATCH_MODEL(PHY_ID_LAN87XX) }, 1478 904 { PHY_ID_MATCH_MODEL(PHY_ID_LAN937X) }, 905 + { PHY_ID_MATCH_MODEL(PHY_ID_LAN887X) }, 1479 906 { } 1480 907 }; 1481 908
+4 -1
drivers/net/phy/phy.c
··· 1089 1089 if (autoneg != AUTONEG_ENABLE && autoneg != AUTONEG_DISABLE) 1090 1090 return -EINVAL; 1091 1091 1092 - if (autoneg == AUTONEG_ENABLE && linkmode_empty(advertising)) 1092 + if (autoneg == AUTONEG_ENABLE && 1093 + (linkmode_empty(advertising) || 1094 + !linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, 1095 + phydev->supported))) 1093 1096 return -EINVAL; 1094 1097 1095 1098 if (autoneg == AUTONEG_DISABLE &&