1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Motorcomm 8511/8521/8531/8531S/8821 PHY driver. 4 * 5 * Author: Peter Geis <pgwipeout@gmail.com> 6 * Author: Frank <Frank.Sae@motor-comm.com> 7 */ 8 9 #include <linux/etherdevice.h> 10 #include <linux/kernel.h> 11 #include <linux/module.h> 12 #include <linux/phy.h> 13 #include <linux/of.h> 14 15 #define PHY_ID_YT8511 0x0000010a 16 #define PHY_ID_YT8521 0x0000011a 17 #define PHY_ID_YT8531 0x4f51e91b 18 #define PHY_ID_YT8531S 0x4f51e91a 19 #define PHY_ID_YT8821 0x4f51ea19 20 /* YT8521/YT8531S/YT8821 Register Overview 21 * UTP Register space | FIBER Register space 22 * ------------------------------------------------------------ 23 * | UTP MII | FIBER MII | 24 * | UTP MMD | | 25 * | UTP Extended | FIBER Extended | 26 * ------------------------------------------------------------ 27 * | Common Extended | 28 * ------------------------------------------------------------ 29 */ 30 31 /* 0x10 ~ 0x15 , 0x1E and 0x1F are common MII registers of yt phy */ 32 33 /* Specific Function Control Register */ 34 #define YTPHY_SPECIFIC_FUNCTION_CONTROL_REG 0x10 35 36 /* 2b00 Manual MDI configuration 37 * 2b01 Manual MDIX configuration 38 * 2b10 Reserved 39 * 2b11 Enable automatic crossover for all modes *default* 40 */ 41 #define YTPHY_SFCR_MDI_CROSSOVER_MODE_MASK (BIT(6) | BIT(5)) 42 #define YTPHY_SFCR_CROSSOVER_EN BIT(3) 43 #define YTPHY_SFCR_SQE_TEST_EN BIT(2) 44 #define YTPHY_SFCR_POLARITY_REVERSAL_EN BIT(1) 45 #define YTPHY_SFCR_JABBER_DIS BIT(0) 46 47 /* Specific Status Register */ 48 #define YTPHY_SPECIFIC_STATUS_REG 0x11 49 #define YTPHY_SSR_SPEED_MASK ((0x3 << 14) | BIT(9)) 50 #define YTPHY_SSR_SPEED_10M ((0x0 << 14)) 51 #define YTPHY_SSR_SPEED_100M ((0x1 << 14)) 52 #define YTPHY_SSR_SPEED_1000M ((0x2 << 14)) 53 #define YTPHY_SSR_SPEED_10G ((0x3 << 14)) 54 #define YTPHY_SSR_SPEED_2500M ((0x0 << 14) | BIT(9)) 55 #define YTPHY_SSR_DUPLEX_OFFSET 13 56 #define YTPHY_SSR_DUPLEX BIT(13) 57 #define YTPHY_SSR_PAGE_RECEIVED BIT(12) 58 #define YTPHY_SSR_SPEED_DUPLEX_RESOLVED BIT(11) 59 #define YTPHY_SSR_LINK BIT(10) 60 #define YTPHY_SSR_MDIX_CROSSOVER BIT(6) 61 #define YTPHY_SSR_DOWNGRADE BIT(5) 62 #define YTPHY_SSR_TRANSMIT_PAUSE BIT(3) 63 #define YTPHY_SSR_RECEIVE_PAUSE BIT(2) 64 #define YTPHY_SSR_POLARITY BIT(1) 65 #define YTPHY_SSR_JABBER BIT(0) 66 67 /* Interrupt enable Register */ 68 #define YTPHY_INTERRUPT_ENABLE_REG 0x12 69 #define YTPHY_IER_WOL BIT(6) 70 71 /* Interrupt Status Register */ 72 #define YTPHY_INTERRUPT_STATUS_REG 0x13 73 #define YTPHY_ISR_AUTONEG_ERR BIT(15) 74 #define YTPHY_ISR_SPEED_CHANGED BIT(14) 75 #define YTPHY_ISR_DUPLEX_CHANGED BIT(13) 76 #define YTPHY_ISR_PAGE_RECEIVED BIT(12) 77 #define YTPHY_ISR_LINK_FAILED BIT(11) 78 #define YTPHY_ISR_LINK_SUCCESSED BIT(10) 79 #define YTPHY_ISR_WOL BIT(6) 80 #define YTPHY_ISR_WIRESPEED_DOWNGRADE BIT(5) 81 #define YTPHY_ISR_SERDES_LINK_FAILED BIT(3) 82 #define YTPHY_ISR_SERDES_LINK_SUCCESSED BIT(2) 83 #define YTPHY_ISR_POLARITY_CHANGED BIT(1) 84 #define YTPHY_ISR_JABBER_HAPPENED BIT(0) 85 86 /* Speed Auto Downgrade Control Register */ 87 #define YTPHY_SPEED_AUTO_DOWNGRADE_CONTROL_REG 0x14 88 #define YTPHY_SADCR_SPEED_DOWNGRADE_EN BIT(5) 89 90 /* If these bits are set to 3, the PHY attempts five times ( 3(set value) + 91 * additional 2) before downgrading, default 0x3 92 */ 93 #define YTPHY_SADCR_SPEED_RETRY_LIMIT (0x3 << 2) 94 95 /* Rx Error Counter Register */ 96 #define YTPHY_RX_ERROR_COUNTER_REG 0x15 97 98 /* Extended Register's Address Offset Register */ 99 #define YTPHY_PAGE_SELECT 0x1E 100 101 /* Extended Register's Data Register */ 102 #define YTPHY_PAGE_DATA 0x1F 103 104 /* FIBER Auto-Negotiation link partner ability */ 105 #define YTPHY_FLPA_PAUSE (0x3 << 7) 106 #define YTPHY_FLPA_ASYM_PAUSE (0x2 << 7) 107 108 #define YT8511_PAGE_SELECT 0x1e 109 #define YT8511_PAGE 0x1f 110 #define YT8511_EXT_CLK_GATE 0x0c 111 #define YT8511_EXT_DELAY_DRIVE 0x0d 112 #define YT8511_EXT_SLEEP_CTRL 0x27 113 114 /* 2b00 25m from pll 115 * 2b01 25m from xtl *default* 116 * 2b10 62.m from pll 117 * 2b11 125m from pll 118 */ 119 #define YT8511_CLK_125M (BIT(2) | BIT(1)) 120 #define YT8511_PLLON_SLP BIT(14) 121 122 /* RX Delay enabled = 1.8ns 1000T, 8ns 10/100T */ 123 #define YT8511_DELAY_RX BIT(0) 124 125 /* TX Gig-E Delay is bits 7:4, default 0x5 126 * TX Fast-E Delay is bits 15:12, default 0xf 127 * Delay = 150ps * N - 250ps 128 * On = 2000ps, off = 50ps 129 */ 130 #define YT8511_DELAY_GE_TX_EN (0xf << 4) 131 #define YT8511_DELAY_GE_TX_DIS (0x2 << 4) 132 #define YT8511_DELAY_FE_TX_EN (0xf << 12) 133 #define YT8511_DELAY_FE_TX_DIS (0x2 << 12) 134 135 /* Extended register is different from MMD Register and MII Register. 136 * We can use ytphy_read_ext/ytphy_write_ext/ytphy_modify_ext function to 137 * operate extended register. 138 * Extended Register start 139 */ 140 141 /* Phy gmii clock gating Register */ 142 #define YT8521_CLOCK_GATING_REG 0xC 143 #define YT8521_CGR_RX_CLK_EN BIT(12) 144 145 #define YT8521_EXTREG_SLEEP_CONTROL1_REG 0x27 146 #define YT8521_ESC1R_SLEEP_SW BIT(15) 147 #define YT8521_ESC1R_PLLON_SLP BIT(14) 148 149 /* Phy fiber Link timer cfg2 Register */ 150 #define YT8521_LINK_TIMER_CFG2_REG 0xA5 151 #define YT8521_LTCR_EN_AUTOSEN BIT(15) 152 153 /* 0xA000, 0xA001, 0xA003, 0xA006 ~ 0xA00A and 0xA012 are common ext registers 154 * of yt8521 phy. There is no need to switch reg space when operating these 155 * registers. 156 */ 157 158 #define YT8521_REG_SPACE_SELECT_REG 0xA000 159 #define YT8521_RSSR_SPACE_MASK BIT(1) 160 #define YT8521_RSSR_FIBER_SPACE (0x1 << 1) 161 #define YT8521_RSSR_UTP_SPACE (0x0 << 1) 162 #define YT8521_RSSR_TO_BE_ARBITRATED (0xFF) 163 164 #define YT8521_CHIP_CONFIG_REG 0xA001 165 #define YT8521_CCR_SW_RST BIT(15) 166 #define YT8531_RGMII_LDO_VOL_MASK GENMASK(5, 4) 167 #define YT8531_LDO_VOL_3V3 0x0 168 #define YT8531_LDO_VOL_1V8 0x2 169 170 /* 1b0 disable 1.9ns rxc clock delay *default* 171 * 1b1 enable 1.9ns rxc clock delay 172 */ 173 #define YT8521_CCR_RXC_DLY_EN BIT(8) 174 #define YT8521_CCR_RXC_DLY_1_900_NS 1900 175 176 #define YT8521_CCR_MODE_SEL_MASK (BIT(2) | BIT(1) | BIT(0)) 177 #define YT8521_CCR_MODE_UTP_TO_RGMII 0 178 #define YT8521_CCR_MODE_FIBER_TO_RGMII 1 179 #define YT8521_CCR_MODE_UTP_FIBER_TO_RGMII 2 180 #define YT8521_CCR_MODE_UTP_TO_SGMII 3 181 #define YT8521_CCR_MODE_SGPHY_TO_RGMAC 4 182 #define YT8521_CCR_MODE_SGMAC_TO_RGPHY 5 183 #define YT8521_CCR_MODE_UTP_TO_FIBER_AUTO 6 184 #define YT8521_CCR_MODE_UTP_TO_FIBER_FORCE 7 185 186 /* 3 phy polling modes,poll mode combines utp and fiber mode*/ 187 #define YT8521_MODE_FIBER 0x1 188 #define YT8521_MODE_UTP 0x2 189 #define YT8521_MODE_POLL 0x3 190 191 #define YT8521_RGMII_CONFIG1_REG 0xA003 192 /* 1b0 use original tx_clk_rgmii *default* 193 * 1b1 use inverted tx_clk_rgmii. 194 */ 195 #define YT8521_RC1R_TX_CLK_SEL_INVERTED BIT(14) 196 #define YT8521_RC1R_RX_DELAY_MASK GENMASK(13, 10) 197 #define YT8521_RC1R_FE_TX_DELAY_MASK GENMASK(7, 4) 198 #define YT8521_RC1R_GE_TX_DELAY_MASK GENMASK(3, 0) 199 #define YT8521_RC1R_RGMII_0_000_NS 0 200 #define YT8521_RC1R_RGMII_0_150_NS 1 201 #define YT8521_RC1R_RGMII_0_300_NS 2 202 #define YT8521_RC1R_RGMII_0_450_NS 3 203 #define YT8521_RC1R_RGMII_0_600_NS 4 204 #define YT8521_RC1R_RGMII_0_750_NS 5 205 #define YT8521_RC1R_RGMII_0_900_NS 6 206 #define YT8521_RC1R_RGMII_1_050_NS 7 207 #define YT8521_RC1R_RGMII_1_200_NS 8 208 #define YT8521_RC1R_RGMII_1_350_NS 9 209 #define YT8521_RC1R_RGMII_1_500_NS 10 210 #define YT8521_RC1R_RGMII_1_650_NS 11 211 #define YT8521_RC1R_RGMII_1_800_NS 12 212 #define YT8521_RC1R_RGMII_1_950_NS 13 213 #define YT8521_RC1R_RGMII_2_100_NS 14 214 #define YT8521_RC1R_RGMII_2_250_NS 15 215 216 /* LED CONFIG */ 217 #define YT8521_MAX_LEDS 3 218 #define YT8521_LED0_CFG_REG 0xA00C 219 #define YT8521_LED1_CFG_REG 0xA00D 220 #define YT8521_LED2_CFG_REG 0xA00E 221 #define YT8521_LED_ACT_BLK_IND BIT(13) 222 #define YT8521_LED_FDX_ON_EN BIT(12) 223 #define YT8521_LED_HDX_ON_EN BIT(11) 224 #define YT8521_LED_TXACT_BLK_EN BIT(10) 225 #define YT8521_LED_RXACT_BLK_EN BIT(9) 226 #define YT8521_LED_1000_ON_EN BIT(6) 227 #define YT8521_LED_100_ON_EN BIT(5) 228 #define YT8521_LED_10_ON_EN BIT(4) 229 230 #define YTPHY_MISC_CONFIG_REG 0xA006 231 #define YTPHY_MCR_FIBER_SPEED_MASK BIT(0) 232 #define YTPHY_MCR_FIBER_1000BX (0x1 << 0) 233 #define YTPHY_MCR_FIBER_100FX (0x0 << 0) 234 235 /* WOL MAC ADDR: MACADDR2(highest), MACADDR1(middle), MACADDR0(lowest) */ 236 #define YTPHY_WOL_MACADDR2_REG 0xA007 237 #define YTPHY_WOL_MACADDR1_REG 0xA008 238 #define YTPHY_WOL_MACADDR0_REG 0xA009 239 240 #define YTPHY_WOL_CONFIG_REG 0xA00A 241 #define YTPHY_WCR_INTR_SEL BIT(6) 242 #define YTPHY_WCR_ENABLE BIT(3) 243 244 /* 2b00 84ms 245 * 2b01 168ms *default* 246 * 2b10 336ms 247 * 2b11 672ms 248 */ 249 #define YTPHY_WCR_PULSE_WIDTH_MASK (BIT(2) | BIT(1)) 250 #define YTPHY_WCR_PULSE_WIDTH_672MS (BIT(2) | BIT(1)) 251 252 /* 1b0 Interrupt and WOL events is level triggered and active LOW *default* 253 * 1b1 Interrupt and WOL events is pulse triggered and active LOW 254 */ 255 #define YTPHY_WCR_TYPE_PULSE BIT(0) 256 257 #define YTPHY_PAD_DRIVE_STRENGTH_REG 0xA010 258 #define YT8531_RGMII_RXC_DS_MASK GENMASK(15, 13) 259 #define YT8531_RGMII_RXD_DS_HI_MASK BIT(12) /* Bit 2 of rxd_ds */ 260 #define YT8531_RGMII_RXD_DS_LOW_MASK GENMASK(5, 4) /* Bit 1/0 of rxd_ds */ 261 #define YT8531_RGMII_RX_DS_DEFAULT 0x3 262 263 #define YTPHY_SYNCE_CFG_REG 0xA012 264 #define YT8521_SCR_SYNCE_ENABLE BIT(5) 265 /* 1b0 output 25m clock 266 * 1b1 output 125m clock *default* 267 */ 268 #define YT8521_SCR_CLK_FRE_SEL_125M BIT(3) 269 #define YT8521_SCR_CLK_SRC_MASK GENMASK(2, 1) 270 #define YT8521_SCR_CLK_SRC_PLL_125M 0 271 #define YT8521_SCR_CLK_SRC_UTP_RX 1 272 #define YT8521_SCR_CLK_SRC_SDS_RX 2 273 #define YT8521_SCR_CLK_SRC_REF_25M 3 274 #define YT8531_SCR_SYNCE_ENABLE BIT(6) 275 /* 1b0 output 25m clock *default* 276 * 1b1 output 125m clock 277 */ 278 #define YT8531_SCR_CLK_FRE_SEL_125M BIT(4) 279 #define YT8531_SCR_CLK_SRC_MASK GENMASK(3, 1) 280 #define YT8531_SCR_CLK_SRC_PLL_125M 0 281 #define YT8531_SCR_CLK_SRC_UTP_RX 1 282 #define YT8531_SCR_CLK_SRC_SDS_RX 2 283 #define YT8531_SCR_CLK_SRC_CLOCK_FROM_DIGITAL 3 284 #define YT8531_SCR_CLK_SRC_REF_25M 4 285 #define YT8531_SCR_CLK_SRC_SSC_25M 5 286 287 #define YT8821_SDS_EXT_CSR_CTRL_REG 0x23 288 #define YT8821_SDS_EXT_CSR_VCO_LDO_EN BIT(15) 289 #define YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN BIT(8) 290 291 #define YT8821_UTP_EXT_PI_CTRL_REG 0x56 292 #define YT8821_UTP_EXT_PI_RST_N_FIFO BIT(5) 293 #define YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE BIT(4) 294 #define YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE BIT(3) 295 #define YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE BIT(2) 296 #define YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE BIT(1) 297 #define YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE BIT(0) 298 299 #define YT8821_UTP_EXT_VCT_CFG6_CTRL_REG 0x97 300 #define YT8821_UTP_EXT_FECHO_AMP_TH_HUGE GENMASK(15, 8) 301 302 #define YT8821_UTP_EXT_ECHO_CTRL_REG 0x336 303 #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000 GENMASK(14, 8) 304 305 #define YT8821_UTP_EXT_GAIN_CTRL_REG 0x340 306 #define YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000 GENMASK(6, 0) 307 308 #define YT8821_UTP_EXT_RPDN_CTRL_REG 0x34E 309 #define YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 BIT(15) 310 #define YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 BIT(7) 311 #define YT8821_UTP_EXT_RPDN_IPR_SHT_2500 GENMASK(6, 0) 312 313 #define YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG 0x36A 314 #define YT8821_UTP_EXT_TH_20DB_2500 GENMASK(15, 0) 315 316 #define YT8821_UTP_EXT_TRACE_CTRL_REG 0x372 317 #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 GENMASK(14, 8) 318 #define YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500 GENMASK(6, 0) 319 320 #define YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG 0x374 321 #define YT8821_UTP_EXT_ALPHA_SHT_2500 GENMASK(14, 8) 322 #define YT8821_UTP_EXT_IPR_LNG_2500 GENMASK(6, 0) 323 324 #define YT8821_UTP_EXT_PLL_CTRL_REG 0x450 325 #define YT8821_UTP_EXT_PLL_SPARE_CFG GENMASK(7, 0) 326 327 #define YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG 0x466 328 #define YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG GENMASK(14, 8) 329 #define YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG GENMASK(6, 0) 330 331 #define YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG 0x467 332 #define YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG GENMASK(14, 8) 333 #define YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG GENMASK(6, 0) 334 335 #define YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG 0x468 336 #define YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG GENMASK(14, 8) 337 #define YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG GENMASK(6, 0) 338 339 #define YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG 0x469 340 #define YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG GENMASK(14, 8) 341 #define YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG GENMASK(6, 0) 342 343 #define YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG 0x4B3 344 #define YT8821_UTP_EXT_MU_COARSE_FR_F_FFE GENMASK(14, 12) 345 #define YT8821_UTP_EXT_MU_COARSE_FR_F_FBE GENMASK(10, 8) 346 347 #define YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG 0x4B5 348 #define YT8821_UTP_EXT_MU_FINE_FR_F_FFE GENMASK(14, 12) 349 #define YT8821_UTP_EXT_MU_FINE_FR_F_FBE GENMASK(10, 8) 350 351 #define YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG 0x4D2 352 #define YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER GENMASK(7, 4) 353 #define YT8821_UTP_EXT_VGA_LPF1_CAP_2500 GENMASK(3, 0) 354 355 #define YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG 0x4D3 356 #define YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER GENMASK(7, 4) 357 #define YT8821_UTP_EXT_VGA_LPF2_CAP_2500 GENMASK(3, 0) 358 359 #define YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG 0x660 360 #define YT8821_UTP_EXT_NFR_TX_ABILITY BIT(3) 361 /* Extended Register end */ 362 363 #define YTPHY_DTS_OUTPUT_CLK_DIS 0 364 #define YTPHY_DTS_OUTPUT_CLK_25M 25000000 365 #define YTPHY_DTS_OUTPUT_CLK_125M 125000000 366 367 #define YT8821_CHIP_MODE_AUTO_BX2500_SGMII 0 368 #define YT8821_CHIP_MODE_FORCE_BX2500 1 369 370 struct yt8521_priv { 371 /* combo_advertising is used for case of YT8521 in combo mode, 372 * this means that yt8521 may work in utp or fiber mode which depends 373 * on which media is connected (YT8521_RSSR_TO_BE_ARBITRATED). 374 */ 375 __ETHTOOL_DECLARE_LINK_MODE_MASK(combo_advertising); 376 377 /* YT8521_MODE_FIBER / YT8521_MODE_UTP / YT8521_MODE_POLL*/ 378 u8 polling_mode; 379 u8 strap_mode; /* 8 working modes */ 380 /* current reg page of yt8521 phy: 381 * YT8521_RSSR_UTP_SPACE 382 * YT8521_RSSR_FIBER_SPACE 383 * YT8521_RSSR_TO_BE_ARBITRATED 384 */ 385 u8 reg_page; 386 }; 387 388 /** 389 * ytphy_read_ext() - read a PHY's extended register 390 * @phydev: a pointer to a &struct phy_device 391 * @regnum: register number to read 392 * 393 * NOTE:The caller must have taken the MDIO bus lock. 394 * 395 * returns the value of regnum reg or negative error code 396 */ 397 static int ytphy_read_ext(struct phy_device *phydev, u16 regnum) 398 { 399 int ret; 400 401 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); 402 if (ret < 0) 403 return ret; 404 405 return __phy_read(phydev, YTPHY_PAGE_DATA); 406 } 407 408 /** 409 * ytphy_read_ext_with_lock() - read a PHY's extended register 410 * @phydev: a pointer to a &struct phy_device 411 * @regnum: register number to read 412 * 413 * returns the value of regnum reg or negative error code 414 */ 415 static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum) 416 { 417 int ret; 418 419 phy_lock_mdio_bus(phydev); 420 ret = ytphy_read_ext(phydev, regnum); 421 phy_unlock_mdio_bus(phydev); 422 423 return ret; 424 } 425 426 /** 427 * ytphy_write_ext() - write a PHY's extended register 428 * @phydev: a pointer to a &struct phy_device 429 * @regnum: register number to write 430 * @val: value to write to @regnum 431 * 432 * NOTE:The caller must have taken the MDIO bus lock. 433 * 434 * returns 0 or negative error code 435 */ 436 static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val) 437 { 438 int ret; 439 440 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); 441 if (ret < 0) 442 return ret; 443 444 return __phy_write(phydev, YTPHY_PAGE_DATA, val); 445 } 446 447 /** 448 * ytphy_write_ext_with_lock() - write a PHY's extended register 449 * @phydev: a pointer to a &struct phy_device 450 * @regnum: register number to write 451 * @val: value to write to @regnum 452 * 453 * returns 0 or negative error code 454 */ 455 static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum, 456 u16 val) 457 { 458 int ret; 459 460 phy_lock_mdio_bus(phydev); 461 ret = ytphy_write_ext(phydev, regnum, val); 462 phy_unlock_mdio_bus(phydev); 463 464 return ret; 465 } 466 467 /** 468 * ytphy_modify_ext() - bits modify a PHY's extended register 469 * @phydev: a pointer to a &struct phy_device 470 * @regnum: register number to write 471 * @mask: bit mask of bits to clear 472 * @set: bit mask of bits to set 473 * 474 * NOTE: Convenience function which allows a PHY's extended register to be 475 * modified as new register value = (old register value & ~mask) | set. 476 * The caller must have taken the MDIO bus lock. 477 * 478 * returns 0 or negative error code 479 */ 480 static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask, 481 u16 set) 482 { 483 int ret; 484 485 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum); 486 if (ret < 0) 487 return ret; 488 489 return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set); 490 } 491 492 /** 493 * ytphy_modify_ext_with_lock() - bits modify a PHY's extended register 494 * @phydev: a pointer to a &struct phy_device 495 * @regnum: register number to write 496 * @mask: bit mask of bits to clear 497 * @set: bit mask of bits to set 498 * 499 * NOTE: Convenience function which allows a PHY's extended register to be 500 * modified as new register value = (old register value & ~mask) | set. 501 * 502 * returns 0 or negative error code 503 */ 504 static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum, 505 u16 mask, u16 set) 506 { 507 int ret; 508 509 phy_lock_mdio_bus(phydev); 510 ret = ytphy_modify_ext(phydev, regnum, mask, set); 511 phy_unlock_mdio_bus(phydev); 512 513 return ret; 514 } 515 516 /** 517 * ytphy_get_wol() - report whether wake-on-lan is enabled 518 * @phydev: a pointer to a &struct phy_device 519 * @wol: a pointer to a &struct ethtool_wolinfo 520 * 521 * NOTE: YTPHY_WOL_CONFIG_REG is common ext reg. 522 */ 523 static void ytphy_get_wol(struct phy_device *phydev, 524 struct ethtool_wolinfo *wol) 525 { 526 int wol_config; 527 528 wol->supported = WAKE_MAGIC; 529 wol->wolopts = 0; 530 531 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); 532 if (wol_config < 0) 533 return; 534 535 if (wol_config & YTPHY_WCR_ENABLE) 536 wol->wolopts |= WAKE_MAGIC; 537 } 538 539 /** 540 * ytphy_set_wol() - turn wake-on-lan on or off 541 * @phydev: a pointer to a &struct phy_device 542 * @wol: a pointer to a &struct ethtool_wolinfo 543 * 544 * NOTE: YTPHY_WOL_CONFIG_REG, YTPHY_WOL_MACADDR2_REG, YTPHY_WOL_MACADDR1_REG 545 * and YTPHY_WOL_MACADDR0_REG are common ext reg. The 546 * YTPHY_INTERRUPT_ENABLE_REG of UTP is special, fiber also use this register. 547 * 548 * returns 0 or negative errno code 549 */ 550 static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) 551 { 552 struct net_device *p_attached_dev; 553 const u16 mac_addr_reg[] = { 554 YTPHY_WOL_MACADDR2_REG, 555 YTPHY_WOL_MACADDR1_REG, 556 YTPHY_WOL_MACADDR0_REG, 557 }; 558 const u8 *mac_addr; 559 int old_page; 560 int ret = 0; 561 u16 mask; 562 u16 val; 563 u8 i; 564 565 if (wol->wolopts & WAKE_MAGIC) { 566 p_attached_dev = phydev->attached_dev; 567 if (!p_attached_dev) 568 return -ENODEV; 569 570 mac_addr = (const u8 *)p_attached_dev->dev_addr; 571 if (!is_valid_ether_addr(mac_addr)) 572 return -EINVAL; 573 574 /* lock mdio bus then switch to utp reg space */ 575 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); 576 if (old_page < 0) 577 goto err_restore_page; 578 579 /* Store the device address for the magic packet */ 580 for (i = 0; i < 3; i++) { 581 ret = ytphy_write_ext(phydev, mac_addr_reg[i], 582 ((mac_addr[i * 2] << 8)) | 583 (mac_addr[i * 2 + 1])); 584 if (ret < 0) 585 goto err_restore_page; 586 } 587 588 /* Enable WOL feature */ 589 mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL; 590 val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; 591 val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS; 592 ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val); 593 if (ret < 0) 594 goto err_restore_page; 595 596 /* Enable WOL interrupt */ 597 ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0, 598 YTPHY_IER_WOL); 599 if (ret < 0) 600 goto err_restore_page; 601 602 } else { 603 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); 604 if (old_page < 0) 605 goto err_restore_page; 606 607 /* Disable WOL feature */ 608 mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; 609 ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0); 610 611 /* Disable WOL interrupt */ 612 ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 613 YTPHY_IER_WOL, 0); 614 if (ret < 0) 615 goto err_restore_page; 616 } 617 618 err_restore_page: 619 return phy_restore_page(phydev, old_page, ret); 620 } 621 622 static int yt8531_set_wol(struct phy_device *phydev, 623 struct ethtool_wolinfo *wol) 624 { 625 const u16 mac_addr_reg[] = { 626 YTPHY_WOL_MACADDR2_REG, 627 YTPHY_WOL_MACADDR1_REG, 628 YTPHY_WOL_MACADDR0_REG, 629 }; 630 const u8 *mac_addr; 631 u16 mask, val; 632 int ret; 633 u8 i; 634 635 if (wol->wolopts & WAKE_MAGIC) { 636 mac_addr = phydev->attached_dev->dev_addr; 637 638 /* Store the device address for the magic packet */ 639 for (i = 0; i < 3; i++) { 640 ret = ytphy_write_ext_with_lock(phydev, mac_addr_reg[i], 641 ((mac_addr[i * 2] << 8)) | 642 (mac_addr[i * 2 + 1])); 643 if (ret < 0) 644 return ret; 645 } 646 647 /* Enable WOL feature */ 648 mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL; 649 val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; 650 val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS; 651 ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG, 652 mask, val); 653 if (ret < 0) 654 return ret; 655 656 /* Enable WOL interrupt */ 657 ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0, 658 YTPHY_IER_WOL); 659 if (ret < 0) 660 return ret; 661 } else { 662 /* Disable WOL feature */ 663 mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL; 664 ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG, 665 mask, 0); 666 667 /* Disable WOL interrupt */ 668 ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 669 YTPHY_IER_WOL, 0); 670 if (ret < 0) 671 return ret; 672 } 673 674 return 0; 675 } 676 677 static int yt8511_read_page(struct phy_device *phydev) 678 { 679 return __phy_read(phydev, YT8511_PAGE_SELECT); 680 }; 681 682 static int yt8511_write_page(struct phy_device *phydev, int page) 683 { 684 return __phy_write(phydev, YT8511_PAGE_SELECT, page); 685 }; 686 687 static int yt8511_config_init(struct phy_device *phydev) 688 { 689 int oldpage, ret = 0; 690 unsigned int ge, fe; 691 692 oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE); 693 if (oldpage < 0) 694 goto err_restore_page; 695 696 /* set rgmii delay mode */ 697 switch (phydev->interface) { 698 case PHY_INTERFACE_MODE_RGMII: 699 ge = YT8511_DELAY_GE_TX_DIS; 700 fe = YT8511_DELAY_FE_TX_DIS; 701 break; 702 case PHY_INTERFACE_MODE_RGMII_RXID: 703 ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_DIS; 704 fe = YT8511_DELAY_FE_TX_DIS; 705 break; 706 case PHY_INTERFACE_MODE_RGMII_TXID: 707 ge = YT8511_DELAY_GE_TX_EN; 708 fe = YT8511_DELAY_FE_TX_EN; 709 break; 710 case PHY_INTERFACE_MODE_RGMII_ID: 711 ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN; 712 fe = YT8511_DELAY_FE_TX_EN; 713 break; 714 default: /* do not support other modes */ 715 ret = -EOPNOTSUPP; 716 goto err_restore_page; 717 } 718 719 ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge); 720 if (ret < 0) 721 goto err_restore_page; 722 723 /* set clock mode to 125mhz */ 724 ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M); 725 if (ret < 0) 726 goto err_restore_page; 727 728 /* fast ethernet delay is in a separate page */ 729 ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE); 730 if (ret < 0) 731 goto err_restore_page; 732 733 ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe); 734 if (ret < 0) 735 goto err_restore_page; 736 737 /* leave pll enabled in sleep */ 738 ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL); 739 if (ret < 0) 740 goto err_restore_page; 741 742 ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP); 743 if (ret < 0) 744 goto err_restore_page; 745 746 err_restore_page: 747 return phy_restore_page(phydev, oldpage, ret); 748 } 749 750 /** 751 * yt8521_read_page() - read reg page 752 * @phydev: a pointer to a &struct phy_device 753 * 754 * returns current reg space of yt8521 (YT8521_RSSR_FIBER_SPACE/ 755 * YT8521_RSSR_UTP_SPACE) or negative errno code 756 */ 757 static int yt8521_read_page(struct phy_device *phydev) 758 { 759 int old_page; 760 761 old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG); 762 if (old_page < 0) 763 return old_page; 764 765 if ((old_page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE) 766 return YT8521_RSSR_FIBER_SPACE; 767 768 return YT8521_RSSR_UTP_SPACE; 769 }; 770 771 /** 772 * yt8521_write_page() - write reg page 773 * @phydev: a pointer to a &struct phy_device 774 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to write. 775 * 776 * returns 0 or negative errno code 777 */ 778 static int yt8521_write_page(struct phy_device *phydev, int page) 779 { 780 int mask = YT8521_RSSR_SPACE_MASK; 781 int set; 782 783 if ((page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE) 784 set = YT8521_RSSR_FIBER_SPACE; 785 else 786 set = YT8521_RSSR_UTP_SPACE; 787 788 return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set); 789 }; 790 791 /** 792 * struct ytphy_cfg_reg_map - map a config value to a register value 793 * @cfg: value in device configuration 794 * @reg: value in the register 795 */ 796 struct ytphy_cfg_reg_map { 797 u32 cfg; 798 u32 reg; 799 }; 800 801 static const struct ytphy_cfg_reg_map ytphy_rgmii_delays[] = { 802 /* for tx delay / rx delay with YT8521_CCR_RXC_DLY_EN is not set. */ 803 { 0, YT8521_RC1R_RGMII_0_000_NS }, 804 { 150, YT8521_RC1R_RGMII_0_150_NS }, 805 { 300, YT8521_RC1R_RGMII_0_300_NS }, 806 { 450, YT8521_RC1R_RGMII_0_450_NS }, 807 { 600, YT8521_RC1R_RGMII_0_600_NS }, 808 { 750, YT8521_RC1R_RGMII_0_750_NS }, 809 { 900, YT8521_RC1R_RGMII_0_900_NS }, 810 { 1050, YT8521_RC1R_RGMII_1_050_NS }, 811 { 1200, YT8521_RC1R_RGMII_1_200_NS }, 812 { 1350, YT8521_RC1R_RGMII_1_350_NS }, 813 { 1500, YT8521_RC1R_RGMII_1_500_NS }, 814 { 1650, YT8521_RC1R_RGMII_1_650_NS }, 815 { 1800, YT8521_RC1R_RGMII_1_800_NS }, 816 { 1950, YT8521_RC1R_RGMII_1_950_NS }, /* default tx/rx delay */ 817 { 2100, YT8521_RC1R_RGMII_2_100_NS }, 818 { 2250, YT8521_RC1R_RGMII_2_250_NS }, 819 820 /* only for rx delay with YT8521_CCR_RXC_DLY_EN is set. */ 821 { 0 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_000_NS }, 822 { 150 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_150_NS }, 823 { 300 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_300_NS }, 824 { 450 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_450_NS }, 825 { 600 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_600_NS }, 826 { 750 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_750_NS }, 827 { 900 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_900_NS }, 828 { 1050 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_050_NS }, 829 { 1200 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_200_NS }, 830 { 1350 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_350_NS }, 831 { 1500 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_500_NS }, 832 { 1650 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_650_NS }, 833 { 1800 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_800_NS }, 834 { 1950 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_950_NS }, 835 { 2100 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_100_NS }, 836 { 2250 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_250_NS } 837 }; 838 839 static u32 ytphy_get_delay_reg_value(struct phy_device *phydev, 840 const char *prop_name, 841 const struct ytphy_cfg_reg_map *tbl, 842 int tb_size, 843 u16 *rxc_dly_en, 844 u32 dflt) 845 { 846 struct device_node *node = phydev->mdio.dev.of_node; 847 int tb_size_half = tb_size / 2; 848 u32 val; 849 int i; 850 851 if (of_property_read_u32(node, prop_name, &val)) 852 goto err_dts_val; 853 854 /* when rxc_dly_en is NULL, it is get the delay for tx, only half of 855 * tb_size is valid. 856 */ 857 if (!rxc_dly_en) 858 tb_size = tb_size_half; 859 860 for (i = 0; i < tb_size; i++) { 861 if (tbl[i].cfg == val) { 862 if (rxc_dly_en && i < tb_size_half) 863 *rxc_dly_en = 0; 864 return tbl[i].reg; 865 } 866 } 867 868 phydev_warn(phydev, "Unsupported value %d for %s using default (%u)\n", 869 val, prop_name, dflt); 870 871 err_dts_val: 872 /* when rxc_dly_en is not NULL, it is get the delay for rx. 873 * The rx default in dts and ytphy_rgmii_clk_delay_config is 1950 ps, 874 * so YT8521_CCR_RXC_DLY_EN should not be set. 875 */ 876 if (rxc_dly_en) 877 *rxc_dly_en = 0; 878 879 return dflt; 880 } 881 882 static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev) 883 { 884 int tb_size = ARRAY_SIZE(ytphy_rgmii_delays); 885 u16 rxc_dly_en = YT8521_CCR_RXC_DLY_EN; 886 u32 rx_reg, tx_reg; 887 u16 mask, val = 0; 888 int ret; 889 890 rx_reg = ytphy_get_delay_reg_value(phydev, "rx-internal-delay-ps", 891 ytphy_rgmii_delays, tb_size, 892 &rxc_dly_en, 893 YT8521_RC1R_RGMII_1_950_NS); 894 tx_reg = ytphy_get_delay_reg_value(phydev, "tx-internal-delay-ps", 895 ytphy_rgmii_delays, tb_size, NULL, 896 YT8521_RC1R_RGMII_1_950_NS); 897 898 switch (phydev->interface) { 899 case PHY_INTERFACE_MODE_RGMII: 900 rxc_dly_en = 0; 901 break; 902 case PHY_INTERFACE_MODE_RGMII_RXID: 903 val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg); 904 break; 905 case PHY_INTERFACE_MODE_RGMII_TXID: 906 rxc_dly_en = 0; 907 val |= FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg); 908 break; 909 case PHY_INTERFACE_MODE_RGMII_ID: 910 val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg) | 911 FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg); 912 break; 913 default: /* do not support other modes */ 914 return -EOPNOTSUPP; 915 } 916 917 ret = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, 918 YT8521_CCR_RXC_DLY_EN, rxc_dly_en); 919 if (ret < 0) 920 return ret; 921 922 /* Generally, it is not necessary to adjust YT8521_RC1R_FE_TX_DELAY */ 923 mask = YT8521_RC1R_RX_DELAY_MASK | YT8521_RC1R_GE_TX_DELAY_MASK; 924 return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val); 925 } 926 927 static int ytphy_rgmii_clk_delay_config_with_lock(struct phy_device *phydev) 928 { 929 int ret; 930 931 phy_lock_mdio_bus(phydev); 932 ret = ytphy_rgmii_clk_delay_config(phydev); 933 phy_unlock_mdio_bus(phydev); 934 935 return ret; 936 } 937 938 /** 939 * struct ytphy_ldo_vol_map - map a current value to a register value 940 * @vol: ldo voltage 941 * @ds: value in the register 942 * @cur: value in device configuration 943 */ 944 struct ytphy_ldo_vol_map { 945 u32 vol; 946 u32 ds; 947 u32 cur; 948 }; 949 950 static const struct ytphy_ldo_vol_map yt8531_ldo_vol[] = { 951 {.vol = YT8531_LDO_VOL_1V8, .ds = 0, .cur = 1200}, 952 {.vol = YT8531_LDO_VOL_1V8, .ds = 1, .cur = 2100}, 953 {.vol = YT8531_LDO_VOL_1V8, .ds = 2, .cur = 2700}, 954 {.vol = YT8531_LDO_VOL_1V8, .ds = 3, .cur = 2910}, 955 {.vol = YT8531_LDO_VOL_1V8, .ds = 4, .cur = 3110}, 956 {.vol = YT8531_LDO_VOL_1V8, .ds = 5, .cur = 3600}, 957 {.vol = YT8531_LDO_VOL_1V8, .ds = 6, .cur = 3970}, 958 {.vol = YT8531_LDO_VOL_1V8, .ds = 7, .cur = 4350}, 959 {.vol = YT8531_LDO_VOL_3V3, .ds = 0, .cur = 3070}, 960 {.vol = YT8531_LDO_VOL_3V3, .ds = 1, .cur = 4080}, 961 {.vol = YT8531_LDO_VOL_3V3, .ds = 2, .cur = 4370}, 962 {.vol = YT8531_LDO_VOL_3V3, .ds = 3, .cur = 4680}, 963 {.vol = YT8531_LDO_VOL_3V3, .ds = 4, .cur = 5020}, 964 {.vol = YT8531_LDO_VOL_3V3, .ds = 5, .cur = 5450}, 965 {.vol = YT8531_LDO_VOL_3V3, .ds = 6, .cur = 5740}, 966 {.vol = YT8531_LDO_VOL_3V3, .ds = 7, .cur = 6140}, 967 }; 968 969 static u32 yt8531_get_ldo_vol(struct phy_device *phydev) 970 { 971 u32 val; 972 973 val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG); 974 val = FIELD_GET(YT8531_RGMII_LDO_VOL_MASK, val); 975 976 return val <= YT8531_LDO_VOL_1V8 ? val : YT8531_LDO_VOL_1V8; 977 } 978 979 static int yt8531_get_ds_map(struct phy_device *phydev, u32 cur) 980 { 981 u32 vol; 982 int i; 983 984 vol = yt8531_get_ldo_vol(phydev); 985 for (i = 0; i < ARRAY_SIZE(yt8531_ldo_vol); i++) { 986 if (yt8531_ldo_vol[i].vol == vol && yt8531_ldo_vol[i].cur == cur) 987 return yt8531_ldo_vol[i].ds; 988 } 989 990 return -EINVAL; 991 } 992 993 static int yt8531_set_ds(struct phy_device *phydev) 994 { 995 struct device_node *node = phydev->mdio.dev.of_node; 996 u32 ds_field_low, ds_field_hi, val; 997 int ret, ds; 998 999 /* set rgmii rx clk driver strength */ 1000 if (!of_property_read_u32(node, "motorcomm,rx-clk-drv-microamp", &val)) { 1001 ds = yt8531_get_ds_map(phydev, val); 1002 if (ds < 0) 1003 return dev_err_probe(&phydev->mdio.dev, ds, 1004 "No matching current value was found.\n"); 1005 } else { 1006 ds = YT8531_RGMII_RX_DS_DEFAULT; 1007 } 1008 1009 ret = ytphy_modify_ext_with_lock(phydev, 1010 YTPHY_PAD_DRIVE_STRENGTH_REG, 1011 YT8531_RGMII_RXC_DS_MASK, 1012 FIELD_PREP(YT8531_RGMII_RXC_DS_MASK, ds)); 1013 if (ret < 0) 1014 return ret; 1015 1016 /* set rgmii rx data driver strength */ 1017 if (!of_property_read_u32(node, "motorcomm,rx-data-drv-microamp", &val)) { 1018 ds = yt8531_get_ds_map(phydev, val); 1019 if (ds < 0) 1020 return dev_err_probe(&phydev->mdio.dev, ds, 1021 "No matching current value was found.\n"); 1022 } else { 1023 ds = YT8531_RGMII_RX_DS_DEFAULT; 1024 } 1025 1026 ds_field_hi = FIELD_GET(BIT(2), ds); 1027 ds_field_hi = FIELD_PREP(YT8531_RGMII_RXD_DS_HI_MASK, ds_field_hi); 1028 1029 ds_field_low = FIELD_GET(GENMASK(1, 0), ds); 1030 ds_field_low = FIELD_PREP(YT8531_RGMII_RXD_DS_LOW_MASK, ds_field_low); 1031 1032 ret = ytphy_modify_ext_with_lock(phydev, 1033 YTPHY_PAD_DRIVE_STRENGTH_REG, 1034 YT8531_RGMII_RXD_DS_LOW_MASK | YT8531_RGMII_RXD_DS_HI_MASK, 1035 ds_field_low | ds_field_hi); 1036 if (ret < 0) 1037 return ret; 1038 1039 return 0; 1040 } 1041 1042 /** 1043 * yt8521_probe() - read chip config then set suitable polling_mode 1044 * @phydev: a pointer to a &struct phy_device 1045 * 1046 * returns 0 or negative errno code 1047 */ 1048 static int yt8521_probe(struct phy_device *phydev) 1049 { 1050 struct device_node *node = phydev->mdio.dev.of_node; 1051 struct device *dev = &phydev->mdio.dev; 1052 struct yt8521_priv *priv; 1053 int chip_config; 1054 u16 mask, val; 1055 u32 freq; 1056 int ret; 1057 1058 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 1059 if (!priv) 1060 return -ENOMEM; 1061 1062 phydev->priv = priv; 1063 1064 chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG); 1065 if (chip_config < 0) 1066 return chip_config; 1067 1068 priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK; 1069 switch (priv->strap_mode) { 1070 case YT8521_CCR_MODE_FIBER_TO_RGMII: 1071 case YT8521_CCR_MODE_SGPHY_TO_RGMAC: 1072 case YT8521_CCR_MODE_SGMAC_TO_RGPHY: 1073 priv->polling_mode = YT8521_MODE_FIBER; 1074 priv->reg_page = YT8521_RSSR_FIBER_SPACE; 1075 phydev->port = PORT_FIBRE; 1076 break; 1077 case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII: 1078 case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO: 1079 case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE: 1080 priv->polling_mode = YT8521_MODE_POLL; 1081 priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED; 1082 phydev->port = PORT_NONE; 1083 break; 1084 case YT8521_CCR_MODE_UTP_TO_SGMII: 1085 case YT8521_CCR_MODE_UTP_TO_RGMII: 1086 priv->polling_mode = YT8521_MODE_UTP; 1087 priv->reg_page = YT8521_RSSR_UTP_SPACE; 1088 phydev->port = PORT_TP; 1089 break; 1090 } 1091 /* set default reg space */ 1092 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 1093 ret = ytphy_write_ext_with_lock(phydev, 1094 YT8521_REG_SPACE_SELECT_REG, 1095 priv->reg_page); 1096 if (ret < 0) 1097 return ret; 1098 } 1099 1100 if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq)) 1101 freq = YTPHY_DTS_OUTPUT_CLK_DIS; 1102 1103 if (phydev->drv->phy_id == PHY_ID_YT8521) { 1104 switch (freq) { 1105 case YTPHY_DTS_OUTPUT_CLK_DIS: 1106 mask = YT8521_SCR_SYNCE_ENABLE; 1107 val = 0; 1108 break; 1109 case YTPHY_DTS_OUTPUT_CLK_25M: 1110 mask = YT8521_SCR_SYNCE_ENABLE | 1111 YT8521_SCR_CLK_SRC_MASK | 1112 YT8521_SCR_CLK_FRE_SEL_125M; 1113 val = YT8521_SCR_SYNCE_ENABLE | 1114 FIELD_PREP(YT8521_SCR_CLK_SRC_MASK, 1115 YT8521_SCR_CLK_SRC_REF_25M); 1116 break; 1117 case YTPHY_DTS_OUTPUT_CLK_125M: 1118 mask = YT8521_SCR_SYNCE_ENABLE | 1119 YT8521_SCR_CLK_SRC_MASK | 1120 YT8521_SCR_CLK_FRE_SEL_125M; 1121 val = YT8521_SCR_SYNCE_ENABLE | 1122 YT8521_SCR_CLK_FRE_SEL_125M | 1123 FIELD_PREP(YT8521_SCR_CLK_SRC_MASK, 1124 YT8521_SCR_CLK_SRC_PLL_125M); 1125 break; 1126 default: 1127 phydev_warn(phydev, "Freq err:%u\n", freq); 1128 return -EINVAL; 1129 } 1130 } else if (phydev->drv->phy_id == PHY_ID_YT8531S) { 1131 switch (freq) { 1132 case YTPHY_DTS_OUTPUT_CLK_DIS: 1133 mask = YT8531_SCR_SYNCE_ENABLE; 1134 val = 0; 1135 break; 1136 case YTPHY_DTS_OUTPUT_CLK_25M: 1137 mask = YT8531_SCR_SYNCE_ENABLE | 1138 YT8531_SCR_CLK_SRC_MASK | 1139 YT8531_SCR_CLK_FRE_SEL_125M; 1140 val = YT8531_SCR_SYNCE_ENABLE | 1141 FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, 1142 YT8531_SCR_CLK_SRC_REF_25M); 1143 break; 1144 case YTPHY_DTS_OUTPUT_CLK_125M: 1145 mask = YT8531_SCR_SYNCE_ENABLE | 1146 YT8531_SCR_CLK_SRC_MASK | 1147 YT8531_SCR_CLK_FRE_SEL_125M; 1148 val = YT8531_SCR_SYNCE_ENABLE | 1149 YT8531_SCR_CLK_FRE_SEL_125M | 1150 FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, 1151 YT8531_SCR_CLK_SRC_PLL_125M); 1152 break; 1153 default: 1154 phydev_warn(phydev, "Freq err:%u\n", freq); 1155 return -EINVAL; 1156 } 1157 } else { 1158 phydev_warn(phydev, "PHY id err\n"); 1159 return -EINVAL; 1160 } 1161 1162 return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask, 1163 val); 1164 } 1165 1166 static int yt8531_probe(struct phy_device *phydev) 1167 { 1168 struct device_node *node = phydev->mdio.dev.of_node; 1169 u16 mask, val; 1170 u32 freq; 1171 1172 if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq)) 1173 freq = YTPHY_DTS_OUTPUT_CLK_DIS; 1174 1175 switch (freq) { 1176 case YTPHY_DTS_OUTPUT_CLK_DIS: 1177 mask = YT8531_SCR_SYNCE_ENABLE; 1178 val = 0; 1179 break; 1180 case YTPHY_DTS_OUTPUT_CLK_25M: 1181 mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK | 1182 YT8531_SCR_CLK_FRE_SEL_125M; 1183 val = YT8531_SCR_SYNCE_ENABLE | 1184 FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, 1185 YT8531_SCR_CLK_SRC_REF_25M); 1186 break; 1187 case YTPHY_DTS_OUTPUT_CLK_125M: 1188 mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK | 1189 YT8531_SCR_CLK_FRE_SEL_125M; 1190 val = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_FRE_SEL_125M | 1191 FIELD_PREP(YT8531_SCR_CLK_SRC_MASK, 1192 YT8531_SCR_CLK_SRC_PLL_125M); 1193 break; 1194 default: 1195 phydev_warn(phydev, "Freq err:%u\n", freq); 1196 return -EINVAL; 1197 } 1198 1199 return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask, 1200 val); 1201 } 1202 1203 /** 1204 * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp 1205 * @phydev: a pointer to a &struct phy_device 1206 * 1207 * NOTE:The caller must have taken the MDIO bus lock. 1208 * 1209 * returns 0 or negative errno code 1210 */ 1211 static int ytphy_utp_read_lpa(struct phy_device *phydev) 1212 { 1213 int lpa, lpagb; 1214 1215 if (phydev->autoneg == AUTONEG_ENABLE) { 1216 if (!phydev->autoneg_complete) { 1217 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, 1218 0); 1219 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0); 1220 return 0; 1221 } 1222 1223 if (phydev->is_gigabit_capable) { 1224 lpagb = __phy_read(phydev, MII_STAT1000); 1225 if (lpagb < 0) 1226 return lpagb; 1227 1228 if (lpagb & LPA_1000MSFAIL) { 1229 int adv = __phy_read(phydev, MII_CTRL1000); 1230 1231 if (adv < 0) 1232 return adv; 1233 1234 if (adv & CTL1000_ENABLE_MASTER) 1235 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); 1236 else 1237 phydev_err(phydev, "Master/Slave resolution failed\n"); 1238 return -ENOLINK; 1239 } 1240 1241 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, 1242 lpagb); 1243 } 1244 1245 lpa = __phy_read(phydev, MII_LPA); 1246 if (lpa < 0) 1247 return lpa; 1248 1249 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); 1250 } else { 1251 linkmode_zero(phydev->lp_advertising); 1252 } 1253 1254 return 0; 1255 } 1256 1257 /** 1258 * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber 1259 * mode, adjust speed and duplex. 1260 * @phydev: a pointer to a &struct phy_device 1261 * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG 1262 * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode) 1263 * 1264 * NOTE:The caller must have taken the MDIO bus lock. 1265 * 1266 * returns 0 1267 */ 1268 static int yt8521_adjust_status(struct phy_device *phydev, int status, 1269 bool is_utp) 1270 { 1271 int speed_mode, duplex; 1272 int speed; 1273 int err; 1274 int lpa; 1275 1276 if (is_utp) 1277 duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET; 1278 else 1279 duplex = DUPLEX_FULL; /* for fiber, it always DUPLEX_FULL */ 1280 1281 speed_mode = status & YTPHY_SSR_SPEED_MASK; 1282 1283 switch (speed_mode) { 1284 case YTPHY_SSR_SPEED_10M: 1285 if (is_utp) 1286 speed = SPEED_10; 1287 else 1288 /* for fiber, it will never run here, default to 1289 * SPEED_UNKNOWN 1290 */ 1291 speed = SPEED_UNKNOWN; 1292 break; 1293 case YTPHY_SSR_SPEED_100M: 1294 speed = SPEED_100; 1295 break; 1296 case YTPHY_SSR_SPEED_1000M: 1297 speed = SPEED_1000; 1298 break; 1299 default: 1300 speed = SPEED_UNKNOWN; 1301 break; 1302 } 1303 1304 phydev->speed = speed; 1305 phydev->duplex = duplex; 1306 1307 if (is_utp) { 1308 err = ytphy_utp_read_lpa(phydev); 1309 if (err < 0) 1310 return err; 1311 1312 phy_resolve_aneg_pause(phydev); 1313 } else { 1314 lpa = __phy_read(phydev, MII_LPA); 1315 if (lpa < 0) 1316 return lpa; 1317 1318 /* only support 1000baseX Full */ 1319 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, 1320 phydev->lp_advertising, lpa & LPA_1000XFULL); 1321 1322 if (!(lpa & YTPHY_FLPA_PAUSE)) { 1323 phydev->pause = 0; 1324 phydev->asym_pause = 0; 1325 } else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) { 1326 phydev->pause = 1; 1327 phydev->asym_pause = 1; 1328 } else { 1329 phydev->pause = 1; 1330 phydev->asym_pause = 0; 1331 } 1332 } 1333 1334 return 0; 1335 } 1336 1337 /** 1338 * yt8521_read_status_paged() - determines the speed and duplex of one page 1339 * @phydev: a pointer to a &struct phy_device 1340 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to 1341 * operate. 1342 * 1343 * returns 1 (utp or fiber link),0 (no link) or negative errno code 1344 */ 1345 static int yt8521_read_status_paged(struct phy_device *phydev, int page) 1346 { 1347 int fiber_latch_val; 1348 int fiber_curr_val; 1349 int old_page; 1350 int ret = 0; 1351 int status; 1352 int link; 1353 1354 linkmode_zero(phydev->lp_advertising); 1355 phydev->duplex = DUPLEX_UNKNOWN; 1356 phydev->speed = SPEED_UNKNOWN; 1357 phydev->asym_pause = 0; 1358 phydev->pause = 0; 1359 1360 /* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber 1361 * respectively. but for utp/fiber combo mode, reg space should be 1362 * arbitrated based on media priority. by default, utp takes 1363 * priority. reg space should be properly set before read 1364 * YTPHY_SPECIFIC_STATUS_REG. 1365 */ 1366 1367 page &= YT8521_RSSR_SPACE_MASK; 1368 old_page = phy_select_page(phydev, page); 1369 if (old_page < 0) 1370 goto err_restore_page; 1371 1372 /* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex 1373 * of the PHY is actually using. 1374 */ 1375 ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG); 1376 if (ret < 0) 1377 goto err_restore_page; 1378 1379 status = ret; 1380 link = !!(status & YTPHY_SSR_LINK); 1381 1382 /* When PHY is in fiber mode, speed transferred from 1000Mbps to 1383 * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so 1384 * we need check MII_BMSR to identify such case. 1385 */ 1386 if (page == YT8521_RSSR_FIBER_SPACE) { 1387 ret = __phy_read(phydev, MII_BMSR); 1388 if (ret < 0) 1389 goto err_restore_page; 1390 1391 fiber_latch_val = ret; 1392 ret = __phy_read(phydev, MII_BMSR); 1393 if (ret < 0) 1394 goto err_restore_page; 1395 1396 fiber_curr_val = ret; 1397 if (link && fiber_latch_val != fiber_curr_val) { 1398 link = 0; 1399 phydev_info(phydev, 1400 "%s, fiber link down detect, latch = %04x, curr = %04x\n", 1401 __func__, fiber_latch_val, fiber_curr_val); 1402 } 1403 } else { 1404 /* Read autonegotiation status */ 1405 ret = __phy_read(phydev, MII_BMSR); 1406 if (ret < 0) 1407 goto err_restore_page; 1408 1409 phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0; 1410 } 1411 1412 if (link) { 1413 if (page == YT8521_RSSR_UTP_SPACE) 1414 yt8521_adjust_status(phydev, status, true); 1415 else 1416 yt8521_adjust_status(phydev, status, false); 1417 } 1418 return phy_restore_page(phydev, old_page, link); 1419 1420 err_restore_page: 1421 return phy_restore_page(phydev, old_page, ret); 1422 } 1423 1424 /** 1425 * yt8521_read_status() - determines the negotiated speed and duplex 1426 * @phydev: a pointer to a &struct phy_device 1427 * 1428 * returns 0 or negative errno code 1429 */ 1430 static int yt8521_read_status(struct phy_device *phydev) 1431 { 1432 struct yt8521_priv *priv = phydev->priv; 1433 int link_fiber = 0; 1434 int link_utp; 1435 int link; 1436 int ret; 1437 1438 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 1439 link = yt8521_read_status_paged(phydev, priv->reg_page); 1440 if (link < 0) 1441 return link; 1442 } else { 1443 /* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is 1444 * needed. by default, utp is higher priority. 1445 */ 1446 1447 link_utp = yt8521_read_status_paged(phydev, 1448 YT8521_RSSR_UTP_SPACE); 1449 if (link_utp < 0) 1450 return link_utp; 1451 1452 if (!link_utp) { 1453 link_fiber = yt8521_read_status_paged(phydev, 1454 YT8521_RSSR_FIBER_SPACE); 1455 if (link_fiber < 0) 1456 return link_fiber; 1457 } 1458 1459 link = link_utp || link_fiber; 1460 } 1461 1462 if (link) { 1463 if (phydev->link == 0) { 1464 /* arbitrate reg space based on linkup media type. */ 1465 if (priv->polling_mode == YT8521_MODE_POLL && 1466 priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) { 1467 if (link_fiber) 1468 priv->reg_page = 1469 YT8521_RSSR_FIBER_SPACE; 1470 else 1471 priv->reg_page = YT8521_RSSR_UTP_SPACE; 1472 1473 ret = ytphy_write_ext_with_lock(phydev, 1474 YT8521_REG_SPACE_SELECT_REG, 1475 priv->reg_page); 1476 if (ret < 0) 1477 return ret; 1478 1479 phydev->port = link_fiber ? PORT_FIBRE : PORT_TP; 1480 1481 phydev_info(phydev, "%s, link up, media: %s\n", 1482 __func__, 1483 (phydev->port == PORT_TP) ? 1484 "UTP" : "Fiber"); 1485 } 1486 } 1487 phydev->link = 1; 1488 } else { 1489 if (phydev->link == 1) { 1490 phydev_info(phydev, "%s, link down, media: %s\n", 1491 __func__, (phydev->port == PORT_TP) ? 1492 "UTP" : "Fiber"); 1493 1494 /* When in YT8521_MODE_POLL mode, need prepare for next 1495 * arbitration. 1496 */ 1497 if (priv->polling_mode == YT8521_MODE_POLL) { 1498 priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED; 1499 phydev->port = PORT_NONE; 1500 } 1501 } 1502 1503 phydev->link = 0; 1504 } 1505 1506 return 0; 1507 } 1508 1509 /** 1510 * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page 1511 * @phydev: the phy_device struct 1512 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate 1513 * @mask: bit mask of bits to clear 1514 * @set: bit mask of bits to set 1515 * 1516 * NOTE: Convenience function which allows a PHY's BMCR register to be 1517 * modified as new register value = (old register value & ~mask) | set. 1518 * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space 1519 * has MII_BMCR. poll mode combines utp and faber,so need do both. 1520 * If it is reset, it will wait for completion. 1521 * 1522 * returns 0 or negative errno code 1523 */ 1524 static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page, 1525 u16 mask, u16 set) 1526 { 1527 int max_cnt = 500; /* the max wait time of reset ~ 500 ms */ 1528 int old_page; 1529 int ret = 0; 1530 1531 old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK); 1532 if (old_page < 0) 1533 goto err_restore_page; 1534 1535 ret = __phy_modify(phydev, MII_BMCR, mask, set); 1536 if (ret < 0) 1537 goto err_restore_page; 1538 1539 /* If it is reset, need to wait for the reset to complete */ 1540 if (set == BMCR_RESET) { 1541 while (max_cnt--) { 1542 usleep_range(1000, 1100); 1543 ret = __phy_read(phydev, MII_BMCR); 1544 if (ret < 0) 1545 goto err_restore_page; 1546 1547 if (!(ret & BMCR_RESET)) 1548 return phy_restore_page(phydev, old_page, 0); 1549 } 1550 } 1551 1552 err_restore_page: 1553 return phy_restore_page(phydev, old_page, ret); 1554 } 1555 1556 /** 1557 * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register 1558 * @phydev: the phy_device struct 1559 * @mask: bit mask of bits to clear 1560 * @set: bit mask of bits to set 1561 * 1562 * NOTE: Convenience function which allows a PHY's BMCR register to be 1563 * modified as new register value = (old register value & ~mask) | set. 1564 * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space 1565 * has MII_BMCR. poll mode combines utp and faber,so need do both. 1566 * 1567 * returns 0 or negative errno code 1568 */ 1569 static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask, 1570 u16 set) 1571 { 1572 struct yt8521_priv *priv = phydev->priv; 1573 int ret; 1574 1575 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 1576 ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask, 1577 set); 1578 if (ret < 0) 1579 return ret; 1580 } else { 1581 ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE, 1582 mask, set); 1583 if (ret < 0) 1584 return ret; 1585 1586 ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE, 1587 mask, set); 1588 if (ret < 0) 1589 return ret; 1590 } 1591 return 0; 1592 } 1593 1594 /** 1595 * yt8521_soft_reset() - called to issue a PHY software reset 1596 * @phydev: a pointer to a &struct phy_device 1597 * 1598 * returns 0 or negative errno code 1599 */ 1600 static int yt8521_soft_reset(struct phy_device *phydev) 1601 { 1602 return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET); 1603 } 1604 1605 /** 1606 * yt8521_suspend() - suspend the hardware 1607 * @phydev: a pointer to a &struct phy_device 1608 * 1609 * returns 0 or negative errno code 1610 */ 1611 static int yt8521_suspend(struct phy_device *phydev) 1612 { 1613 int wol_config; 1614 1615 /* YTPHY_WOL_CONFIG_REG is common ext reg */ 1616 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); 1617 if (wol_config < 0) 1618 return wol_config; 1619 1620 /* if wol enable, do nothing */ 1621 if (wol_config & YTPHY_WCR_ENABLE) 1622 return 0; 1623 1624 return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN); 1625 } 1626 1627 /** 1628 * yt8521_resume() - resume the hardware 1629 * @phydev: a pointer to a &struct phy_device 1630 * 1631 * returns 0 or negative errno code 1632 */ 1633 static int yt8521_resume(struct phy_device *phydev) 1634 { 1635 int ret; 1636 int wol_config; 1637 1638 /* disable auto sleep */ 1639 ret = ytphy_modify_ext_with_lock(phydev, 1640 YT8521_EXTREG_SLEEP_CONTROL1_REG, 1641 YT8521_ESC1R_SLEEP_SW, 0); 1642 if (ret < 0) 1643 return ret; 1644 1645 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG); 1646 if (wol_config < 0) 1647 return wol_config; 1648 1649 /* if wol enable, do nothing */ 1650 if (wol_config & YTPHY_WCR_ENABLE) 1651 return 0; 1652 1653 return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0); 1654 } 1655 1656 /** 1657 * yt8521_config_init() - called to initialize the PHY 1658 * @phydev: a pointer to a &struct phy_device 1659 * 1660 * returns 0 or negative errno code 1661 */ 1662 static int yt8521_config_init(struct phy_device *phydev) 1663 { 1664 struct device_node *node = phydev->mdio.dev.of_node; 1665 int old_page; 1666 int ret = 0; 1667 1668 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); 1669 if (old_page < 0) 1670 goto err_restore_page; 1671 1672 /* set rgmii delay mode */ 1673 if (phydev->interface != PHY_INTERFACE_MODE_SGMII) { 1674 ret = ytphy_rgmii_clk_delay_config(phydev); 1675 if (ret < 0) 1676 goto err_restore_page; 1677 } 1678 1679 if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) { 1680 /* disable auto sleep */ 1681 ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG, 1682 YT8521_ESC1R_SLEEP_SW, 0); 1683 if (ret < 0) 1684 goto err_restore_page; 1685 } 1686 1687 if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) { 1688 /* enable RXC clock when no wire plug */ 1689 ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG, 1690 YT8521_CGR_RX_CLK_EN, 0); 1691 if (ret < 0) 1692 goto err_restore_page; 1693 } 1694 err_restore_page: 1695 return phy_restore_page(phydev, old_page, ret); 1696 } 1697 1698 static const unsigned long supported_trgs = (BIT(TRIGGER_NETDEV_FULL_DUPLEX) | 1699 BIT(TRIGGER_NETDEV_HALF_DUPLEX) | 1700 BIT(TRIGGER_NETDEV_LINK) | 1701 BIT(TRIGGER_NETDEV_LINK_10) | 1702 BIT(TRIGGER_NETDEV_LINK_100) | 1703 BIT(TRIGGER_NETDEV_LINK_1000) | 1704 BIT(TRIGGER_NETDEV_RX) | 1705 BIT(TRIGGER_NETDEV_TX)); 1706 1707 static int yt8521_led_hw_is_supported(struct phy_device *phydev, u8 index, 1708 unsigned long rules) 1709 { 1710 if (index >= YT8521_MAX_LEDS) 1711 return -EINVAL; 1712 1713 /* All combinations of the supported triggers are allowed */ 1714 if (rules & ~supported_trgs) 1715 return -EOPNOTSUPP; 1716 1717 return 0; 1718 } 1719 1720 static int yt8521_led_hw_control_set(struct phy_device *phydev, u8 index, 1721 unsigned long rules) 1722 { 1723 u16 val = 0; 1724 1725 if (index >= YT8521_MAX_LEDS) 1726 return -EINVAL; 1727 1728 if (test_bit(TRIGGER_NETDEV_LINK, &rules)) { 1729 val |= YT8521_LED_10_ON_EN; 1730 val |= YT8521_LED_100_ON_EN; 1731 val |= YT8521_LED_1000_ON_EN; 1732 } 1733 1734 if (test_bit(TRIGGER_NETDEV_LINK_10, &rules)) 1735 val |= YT8521_LED_10_ON_EN; 1736 1737 if (test_bit(TRIGGER_NETDEV_LINK_100, &rules)) 1738 val |= YT8521_LED_100_ON_EN; 1739 1740 if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules)) 1741 val |= YT8521_LED_1000_ON_EN; 1742 1743 if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules)) 1744 val |= YT8521_LED_HDX_ON_EN; 1745 1746 if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules)) 1747 val |= YT8521_LED_FDX_ON_EN; 1748 1749 if (test_bit(TRIGGER_NETDEV_TX, &rules) || 1750 test_bit(TRIGGER_NETDEV_RX, &rules)) 1751 val |= YT8521_LED_ACT_BLK_IND; 1752 1753 if (test_bit(TRIGGER_NETDEV_TX, &rules)) 1754 val |= YT8521_LED_TXACT_BLK_EN; 1755 1756 if (test_bit(TRIGGER_NETDEV_RX, &rules)) 1757 val |= YT8521_LED_RXACT_BLK_EN; 1758 1759 return ytphy_write_ext(phydev, YT8521_LED0_CFG_REG + index, val); 1760 } 1761 1762 static int yt8521_led_hw_control_get(struct phy_device *phydev, u8 index, 1763 unsigned long *rules) 1764 { 1765 int val; 1766 1767 if (index >= YT8521_MAX_LEDS) 1768 return -EINVAL; 1769 1770 val = ytphy_read_ext(phydev, YT8521_LED0_CFG_REG + index); 1771 if (val < 0) 1772 return val; 1773 1774 if (val & YT8521_LED_TXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND) 1775 __set_bit(TRIGGER_NETDEV_TX, rules); 1776 1777 if (val & YT8521_LED_RXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND) 1778 __set_bit(TRIGGER_NETDEV_RX, rules); 1779 1780 if (val & YT8521_LED_FDX_ON_EN) 1781 __set_bit(TRIGGER_NETDEV_FULL_DUPLEX, rules); 1782 1783 if (val & YT8521_LED_HDX_ON_EN) 1784 __set_bit(TRIGGER_NETDEV_HALF_DUPLEX, rules); 1785 1786 if (val & YT8521_LED_1000_ON_EN) 1787 __set_bit(TRIGGER_NETDEV_LINK_1000, rules); 1788 1789 if (val & YT8521_LED_100_ON_EN) 1790 __set_bit(TRIGGER_NETDEV_LINK_100, rules); 1791 1792 if (val & YT8521_LED_10_ON_EN) 1793 __set_bit(TRIGGER_NETDEV_LINK_10, rules); 1794 1795 return 0; 1796 } 1797 1798 static int yt8531_config_init(struct phy_device *phydev) 1799 { 1800 struct device_node *node = phydev->mdio.dev.of_node; 1801 int ret; 1802 1803 ret = ytphy_rgmii_clk_delay_config_with_lock(phydev); 1804 if (ret < 0) 1805 return ret; 1806 1807 if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) { 1808 /* disable auto sleep */ 1809 ret = ytphy_modify_ext_with_lock(phydev, 1810 YT8521_EXTREG_SLEEP_CONTROL1_REG, 1811 YT8521_ESC1R_SLEEP_SW, 0); 1812 if (ret < 0) 1813 return ret; 1814 } 1815 1816 if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) { 1817 /* enable RXC clock when no wire plug */ 1818 ret = ytphy_modify_ext_with_lock(phydev, 1819 YT8521_CLOCK_GATING_REG, 1820 YT8521_CGR_RX_CLK_EN, 0); 1821 if (ret < 0) 1822 return ret; 1823 } 1824 1825 ret = yt8531_set_ds(phydev); 1826 if (ret < 0) 1827 return ret; 1828 1829 return 0; 1830 } 1831 1832 /** 1833 * yt8531_link_change_notify() - Adjust the tx clock direction according to 1834 * the current speed and dts config. 1835 * @phydev: a pointer to a &struct phy_device 1836 * 1837 * NOTE: This function is only used to adapt to VF2 with JH7110 SoC. Please 1838 * keep "motorcomm,tx-clk-adj-enabled" not exist in dts when the soc is not 1839 * JH7110. 1840 */ 1841 static void yt8531_link_change_notify(struct phy_device *phydev) 1842 { 1843 struct device_node *node = phydev->mdio.dev.of_node; 1844 bool tx_clk_1000_inverted = false; 1845 bool tx_clk_100_inverted = false; 1846 bool tx_clk_10_inverted = false; 1847 bool tx_clk_adj_enabled = false; 1848 u16 val = 0; 1849 int ret; 1850 1851 if (of_property_read_bool(node, "motorcomm,tx-clk-adj-enabled")) 1852 tx_clk_adj_enabled = true; 1853 1854 if (!tx_clk_adj_enabled) 1855 return; 1856 1857 if (of_property_read_bool(node, "motorcomm,tx-clk-10-inverted")) 1858 tx_clk_10_inverted = true; 1859 if (of_property_read_bool(node, "motorcomm,tx-clk-100-inverted")) 1860 tx_clk_100_inverted = true; 1861 if (of_property_read_bool(node, "motorcomm,tx-clk-1000-inverted")) 1862 tx_clk_1000_inverted = true; 1863 1864 if (phydev->speed < 0) 1865 return; 1866 1867 switch (phydev->speed) { 1868 case SPEED_1000: 1869 if (tx_clk_1000_inverted) 1870 val = YT8521_RC1R_TX_CLK_SEL_INVERTED; 1871 break; 1872 case SPEED_100: 1873 if (tx_clk_100_inverted) 1874 val = YT8521_RC1R_TX_CLK_SEL_INVERTED; 1875 break; 1876 case SPEED_10: 1877 if (tx_clk_10_inverted) 1878 val = YT8521_RC1R_TX_CLK_SEL_INVERTED; 1879 break; 1880 default: 1881 return; 1882 } 1883 1884 ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG, 1885 YT8521_RC1R_TX_CLK_SEL_INVERTED, val); 1886 if (ret < 0) 1887 phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret); 1888 } 1889 1890 /** 1891 * yt8521_prepare_fiber_features() - A small helper function that setup 1892 * fiber's features. 1893 * @phydev: a pointer to a &struct phy_device 1894 * @dst: a pointer to store fiber's features 1895 */ 1896 static void yt8521_prepare_fiber_features(struct phy_device *phydev, 1897 unsigned long *dst) 1898 { 1899 linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst); 1900 linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst); 1901 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst); 1902 linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst); 1903 } 1904 1905 /** 1906 * yt8521_fiber_setup_forced - configures/forces speed from @phydev 1907 * @phydev: target phy_device struct 1908 * 1909 * NOTE:The caller must have taken the MDIO bus lock. 1910 * 1911 * returns 0 or negative errno code 1912 */ 1913 static int yt8521_fiber_setup_forced(struct phy_device *phydev) 1914 { 1915 u16 val; 1916 int ret; 1917 1918 if (phydev->speed == SPEED_1000) 1919 val = YTPHY_MCR_FIBER_1000BX; 1920 else if (phydev->speed == SPEED_100) 1921 val = YTPHY_MCR_FIBER_100FX; 1922 else 1923 return -EINVAL; 1924 1925 ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); 1926 if (ret < 0) 1927 return ret; 1928 1929 /* disable Fiber auto sensing */ 1930 ret = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG, 1931 YT8521_LTCR_EN_AUTOSEN, 0); 1932 if (ret < 0) 1933 return ret; 1934 1935 ret = ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG, 1936 YTPHY_MCR_FIBER_SPEED_MASK, val); 1937 if (ret < 0) 1938 return ret; 1939 1940 return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, 1941 YT8521_CCR_SW_RST, 0); 1942 } 1943 1944 /** 1945 * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation 1946 * @phydev: target phy_device struct 1947 * @restart: whether aneg restart is requested 1948 * 1949 * NOTE:The caller must have taken the MDIO bus lock. 1950 * 1951 * returns 0 or negative errno code 1952 */ 1953 static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart) 1954 { 1955 int ret; 1956 1957 if (!restart) { 1958 /* Advertisement hasn't changed, but maybe aneg was never on to 1959 * begin with? Or maybe phy was isolated? 1960 */ 1961 ret = __phy_read(phydev, MII_BMCR); 1962 if (ret < 0) 1963 return ret; 1964 1965 if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE)) 1966 restart = true; 1967 } 1968 /* Enable and Restart Autonegotiation 1969 * Don't isolate the PHY if we're negotiating 1970 */ 1971 if (restart) 1972 return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, 1973 BMCR_ANENABLE | BMCR_ANRESTART); 1974 1975 return 0; 1976 } 1977 1978 /** 1979 * yt8521_fiber_config_aneg - restart auto-negotiation or write 1980 * YTPHY_MISC_CONFIG_REG. 1981 * @phydev: target phy_device struct 1982 * 1983 * NOTE:The caller must have taken the MDIO bus lock. 1984 * 1985 * returns 0 or negative errno code 1986 */ 1987 static int yt8521_fiber_config_aneg(struct phy_device *phydev) 1988 { 1989 int err, changed = 0; 1990 int bmcr; 1991 u16 adv; 1992 1993 if (phydev->autoneg != AUTONEG_ENABLE) 1994 return yt8521_fiber_setup_forced(phydev); 1995 1996 /* enable Fiber auto sensing */ 1997 err = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG, 1998 0, YT8521_LTCR_EN_AUTOSEN); 1999 if (err < 0) 2000 return err; 2001 2002 err = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG, 2003 YT8521_CCR_SW_RST, 0); 2004 if (err < 0) 2005 return err; 2006 2007 bmcr = __phy_read(phydev, MII_BMCR); 2008 if (bmcr < 0) 2009 return bmcr; 2010 2011 /* When it is coming from fiber forced mode, add bmcr power down 2012 * and power up to let aneg work fine. 2013 */ 2014 if (!(bmcr & BMCR_ANENABLE)) { 2015 __phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN); 2016 usleep_range(1000, 1100); 2017 __phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0); 2018 } 2019 2020 adv = linkmode_adv_to_mii_adv_x(phydev->advertising, 2021 ETHTOOL_LINK_MODE_1000baseX_Full_BIT); 2022 2023 /* Setup fiber advertisement */ 2024 err = __phy_modify_changed(phydev, MII_ADVERTISE, 2025 ADVERTISE_1000XHALF | ADVERTISE_1000XFULL | 2026 ADVERTISE_1000XPAUSE | 2027 ADVERTISE_1000XPSE_ASYM, 2028 adv); 2029 if (err < 0) 2030 return err; 2031 2032 if (err > 0) 2033 changed = 1; 2034 2035 return ytphy_check_and_restart_aneg(phydev, changed); 2036 } 2037 2038 /** 2039 * ytphy_setup_master_slave 2040 * @phydev: target phy_device struct 2041 * 2042 * NOTE: The caller must have taken the MDIO bus lock. 2043 * 2044 * returns 0 or negative errno code 2045 */ 2046 static int ytphy_setup_master_slave(struct phy_device *phydev) 2047 { 2048 u16 ctl = 0; 2049 2050 if (!phydev->is_gigabit_capable) 2051 return 0; 2052 2053 switch (phydev->master_slave_set) { 2054 case MASTER_SLAVE_CFG_MASTER_PREFERRED: 2055 ctl |= CTL1000_PREFER_MASTER; 2056 break; 2057 case MASTER_SLAVE_CFG_SLAVE_PREFERRED: 2058 break; 2059 case MASTER_SLAVE_CFG_MASTER_FORCE: 2060 ctl |= CTL1000_AS_MASTER; 2061 fallthrough; 2062 case MASTER_SLAVE_CFG_SLAVE_FORCE: 2063 ctl |= CTL1000_ENABLE_MASTER; 2064 break; 2065 case MASTER_SLAVE_CFG_UNKNOWN: 2066 case MASTER_SLAVE_CFG_UNSUPPORTED: 2067 return 0; 2068 default: 2069 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); 2070 return -EOPNOTSUPP; 2071 } 2072 2073 return __phy_modify_changed(phydev, MII_CTRL1000, 2074 (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER | 2075 CTL1000_PREFER_MASTER), ctl); 2076 } 2077 2078 /** 2079 * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters 2080 * @phydev: target phy_device struct 2081 * 2082 * NOTE: Writes MII_ADVERTISE with the appropriate values, 2083 * after sanitizing the values to make sure we only advertise 2084 * what is supported. Returns < 0 on error, 0 if the PHY's advertisement 2085 * hasn't changed, and > 0 if it has changed. 2086 * The caller must have taken the MDIO bus lock. 2087 * 2088 * returns 0 or negative errno code 2089 */ 2090 static int ytphy_utp_config_advert(struct phy_device *phydev) 2091 { 2092 int err, bmsr, changed = 0; 2093 u32 adv; 2094 2095 /* Only allow advertising what this PHY supports */ 2096 linkmode_and(phydev->advertising, phydev->advertising, 2097 phydev->supported); 2098 2099 adv = linkmode_adv_to_mii_adv_t(phydev->advertising); 2100 2101 /* Setup standard advertisement */ 2102 err = __phy_modify_changed(phydev, MII_ADVERTISE, 2103 ADVERTISE_ALL | ADVERTISE_100BASE4 | 2104 ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM, 2105 adv); 2106 if (err < 0) 2107 return err; 2108 if (err > 0) 2109 changed = 1; 2110 2111 bmsr = __phy_read(phydev, MII_BMSR); 2112 if (bmsr < 0) 2113 return bmsr; 2114 2115 /* Per 802.3-2008, Section 22.2.4.2.16 Extended status all 2116 * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a 2117 * logical 1. 2118 */ 2119 if (!(bmsr & BMSR_ESTATEN)) 2120 return changed; 2121 2122 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); 2123 2124 err = __phy_modify_changed(phydev, MII_CTRL1000, 2125 ADVERTISE_1000FULL | ADVERTISE_1000HALF, 2126 adv); 2127 if (err < 0) 2128 return err; 2129 if (err > 0) 2130 changed = 1; 2131 2132 return changed; 2133 } 2134 2135 /** 2136 * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR 2137 * @phydev: target phy_device struct 2138 * @changed: whether autoneg is requested 2139 * 2140 * NOTE: If auto-negotiation is enabled, we configure the 2141 * advertising, and then restart auto-negotiation. If it is not 2142 * enabled, then we write the BMCR. 2143 * The caller must have taken the MDIO bus lock. 2144 * 2145 * returns 0 or negative errno code 2146 */ 2147 static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed) 2148 { 2149 int err; 2150 u16 ctl; 2151 2152 err = ytphy_setup_master_slave(phydev); 2153 if (err < 0) 2154 return err; 2155 else if (err) 2156 changed = true; 2157 2158 if (phydev->autoneg != AUTONEG_ENABLE) { 2159 /* configures/forces speed/duplex from @phydev */ 2160 2161 ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); 2162 2163 return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK | 2164 BMCR_ISOLATE | BMCR_PDOWN), ctl); 2165 } 2166 2167 err = ytphy_utp_config_advert(phydev); 2168 if (err < 0) /* error */ 2169 return err; 2170 else if (err) 2171 changed = true; 2172 2173 return ytphy_check_and_restart_aneg(phydev, changed); 2174 } 2175 2176 /** 2177 * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg 2178 * of one page 2179 * @phydev: a pointer to a &struct phy_device 2180 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to 2181 * operate. 2182 * 2183 * returns 0 or negative errno code 2184 */ 2185 static int yt8521_config_aneg_paged(struct phy_device *phydev, int page) 2186 { 2187 __ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported); 2188 struct yt8521_priv *priv = phydev->priv; 2189 int old_page; 2190 int ret = 0; 2191 2192 page &= YT8521_RSSR_SPACE_MASK; 2193 2194 old_page = phy_select_page(phydev, page); 2195 if (old_page < 0) 2196 goto err_restore_page; 2197 2198 /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED, 2199 * phydev->advertising should be updated. 2200 */ 2201 if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) { 2202 linkmode_zero(fiber_supported); 2203 yt8521_prepare_fiber_features(phydev, fiber_supported); 2204 2205 /* prepare fiber_supported, then setup advertising. */ 2206 if (page == YT8521_RSSR_FIBER_SPACE) { 2207 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, 2208 fiber_supported); 2209 linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, 2210 fiber_supported); 2211 linkmode_and(phydev->advertising, 2212 priv->combo_advertising, fiber_supported); 2213 } else { 2214 /* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */ 2215 linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, 2216 fiber_supported); 2217 linkmode_andnot(phydev->advertising, 2218 priv->combo_advertising, 2219 fiber_supported); 2220 } 2221 } 2222 2223 if (page == YT8521_RSSR_FIBER_SPACE) 2224 ret = yt8521_fiber_config_aneg(phydev); 2225 else 2226 ret = ytphy_utp_config_aneg(phydev, false); 2227 2228 err_restore_page: 2229 return phy_restore_page(phydev, old_page, ret); 2230 } 2231 2232 /** 2233 * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged 2234 * @phydev: a pointer to a &struct phy_device 2235 * 2236 * returns 0 or negative errno code 2237 */ 2238 static int yt8521_config_aneg(struct phy_device *phydev) 2239 { 2240 struct yt8521_priv *priv = phydev->priv; 2241 int ret; 2242 2243 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 2244 ret = yt8521_config_aneg_paged(phydev, priv->reg_page); 2245 if (ret < 0) 2246 return ret; 2247 } else { 2248 /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED, 2249 * phydev->advertising need to be saved at first run. 2250 * Because it contains the advertising which supported by both 2251 * mac and yt8521(utp and fiber). 2252 */ 2253 if (linkmode_empty(priv->combo_advertising)) { 2254 linkmode_copy(priv->combo_advertising, 2255 phydev->advertising); 2256 } 2257 2258 ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE); 2259 if (ret < 0) 2260 return ret; 2261 2262 ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE); 2263 if (ret < 0) 2264 return ret; 2265 2266 /* we don't known which will be link, so restore 2267 * phydev->advertising as default value. 2268 */ 2269 linkmode_copy(phydev->advertising, priv->combo_advertising); 2270 } 2271 return 0; 2272 } 2273 2274 /** 2275 * yt8521_aneg_done_paged() - determines the auto negotiation result of one 2276 * page. 2277 * @phydev: a pointer to a &struct phy_device 2278 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to 2279 * operate. 2280 * 2281 * returns 0(no link)or 1(fiber or utp link) or negative errno code 2282 */ 2283 static int yt8521_aneg_done_paged(struct phy_device *phydev, int page) 2284 { 2285 int old_page; 2286 int ret = 0; 2287 int link; 2288 2289 old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK); 2290 if (old_page < 0) 2291 goto err_restore_page; 2292 2293 ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG); 2294 if (ret < 0) 2295 goto err_restore_page; 2296 2297 link = !!(ret & YTPHY_SSR_LINK); 2298 ret = link; 2299 2300 err_restore_page: 2301 return phy_restore_page(phydev, old_page, ret); 2302 } 2303 2304 /** 2305 * yt8521_aneg_done() - determines the auto negotiation result 2306 * @phydev: a pointer to a &struct phy_device 2307 * 2308 * returns 0(no link)or 1(fiber or utp link) or negative errno code 2309 */ 2310 static int yt8521_aneg_done(struct phy_device *phydev) 2311 { 2312 struct yt8521_priv *priv = phydev->priv; 2313 int link_fiber = 0; 2314 int link_utp; 2315 int link; 2316 2317 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 2318 link = yt8521_aneg_done_paged(phydev, priv->reg_page); 2319 } else { 2320 link_utp = yt8521_aneg_done_paged(phydev, 2321 YT8521_RSSR_UTP_SPACE); 2322 if (link_utp < 0) 2323 return link_utp; 2324 2325 if (!link_utp) { 2326 link_fiber = yt8521_aneg_done_paged(phydev, 2327 YT8521_RSSR_FIBER_SPACE); 2328 if (link_fiber < 0) 2329 return link_fiber; 2330 } 2331 link = link_fiber || link_utp; 2332 phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n", 2333 __func__, link_fiber, link_utp); 2334 } 2335 2336 return link; 2337 } 2338 2339 /** 2340 * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers 2341 * @phydev: target phy_device struct 2342 * 2343 * NOTE: Reads the PHY's abilities and populates 2344 * phydev->supported accordingly. 2345 * The caller must have taken the MDIO bus lock. 2346 * 2347 * returns 0 or negative errno code 2348 */ 2349 static int ytphy_utp_read_abilities(struct phy_device *phydev) 2350 { 2351 int val; 2352 2353 linkmode_set_bit_array(phy_basic_ports_array, 2354 ARRAY_SIZE(phy_basic_ports_array), 2355 phydev->supported); 2356 2357 val = __phy_read(phydev, MII_BMSR); 2358 if (val < 0) 2359 return val; 2360 2361 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, 2362 val & BMSR_ANEGCAPABLE); 2363 2364 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported, 2365 val & BMSR_100FULL); 2366 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported, 2367 val & BMSR_100HALF); 2368 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported, 2369 val & BMSR_10FULL); 2370 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported, 2371 val & BMSR_10HALF); 2372 2373 if (val & BMSR_ESTATEN) { 2374 val = __phy_read(phydev, MII_ESTATUS); 2375 if (val < 0) 2376 return val; 2377 2378 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, 2379 phydev->supported, val & ESTATUS_1000_TFULL); 2380 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, 2381 phydev->supported, val & ESTATUS_1000_THALF); 2382 linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, 2383 phydev->supported, val & ESTATUS_1000_XFULL); 2384 } 2385 2386 return 0; 2387 } 2388 2389 /** 2390 * yt8521_get_features_paged() - read supported link modes for one page 2391 * @phydev: a pointer to a &struct phy_device 2392 * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to 2393 * operate. 2394 * 2395 * returns 0 or negative errno code 2396 */ 2397 static int yt8521_get_features_paged(struct phy_device *phydev, int page) 2398 { 2399 int old_page; 2400 int ret = 0; 2401 2402 page &= YT8521_RSSR_SPACE_MASK; 2403 old_page = phy_select_page(phydev, page); 2404 if (old_page < 0) 2405 goto err_restore_page; 2406 2407 if (page == YT8521_RSSR_FIBER_SPACE) { 2408 linkmode_zero(phydev->supported); 2409 yt8521_prepare_fiber_features(phydev, phydev->supported); 2410 } else { 2411 ret = ytphy_utp_read_abilities(phydev); 2412 if (ret < 0) 2413 goto err_restore_page; 2414 } 2415 2416 err_restore_page: 2417 return phy_restore_page(phydev, old_page, ret); 2418 } 2419 2420 /** 2421 * yt8521_get_features - switch reg space then call yt8521_get_features_paged 2422 * @phydev: target phy_device struct 2423 * 2424 * returns 0 or negative errno code 2425 */ 2426 static int yt8521_get_features(struct phy_device *phydev) 2427 { 2428 struct yt8521_priv *priv = phydev->priv; 2429 int ret; 2430 2431 if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) { 2432 ret = yt8521_get_features_paged(phydev, priv->reg_page); 2433 } else { 2434 ret = yt8521_get_features_paged(phydev, 2435 YT8521_RSSR_UTP_SPACE); 2436 if (ret < 0) 2437 return ret; 2438 2439 /* add fiber's features to phydev->supported */ 2440 yt8521_prepare_fiber_features(phydev, phydev->supported); 2441 } 2442 return ret; 2443 } 2444 2445 /** 2446 * yt8821_get_features - read mmd register to get 2.5G capability 2447 * @phydev: target phy_device struct 2448 * 2449 * Returns: 0 or negative errno code 2450 */ 2451 static int yt8821_get_features(struct phy_device *phydev) 2452 { 2453 int ret; 2454 2455 ret = genphy_c45_pma_read_ext_abilities(phydev); 2456 if (ret < 0) 2457 return ret; 2458 2459 return genphy_read_abilities(phydev); 2460 } 2461 2462 /** 2463 * yt8821_get_rate_matching - read register to get phy chip mode 2464 * @phydev: target phy_device struct 2465 * @iface: PHY data interface type 2466 * 2467 * Returns: rate matching type or negative errno code 2468 */ 2469 static int yt8821_get_rate_matching(struct phy_device *phydev, 2470 phy_interface_t iface) 2471 { 2472 int val; 2473 2474 val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG); 2475 if (val < 0) 2476 return val; 2477 2478 if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) == 2479 YT8821_CHIP_MODE_FORCE_BX2500) 2480 return RATE_MATCH_PAUSE; 2481 2482 return RATE_MATCH_NONE; 2483 } 2484 2485 /** 2486 * yt8821_aneg_done() - determines the auto negotiation result 2487 * @phydev: a pointer to a &struct phy_device 2488 * 2489 * Returns: 0(no link)or 1(utp link) or negative errno code 2490 */ 2491 static int yt8821_aneg_done(struct phy_device *phydev) 2492 { 2493 return yt8521_aneg_done_paged(phydev, YT8521_RSSR_UTP_SPACE); 2494 } 2495 2496 /** 2497 * yt8821_serdes_init() - serdes init 2498 * @phydev: a pointer to a &struct phy_device 2499 * 2500 * Returns: 0 or negative errno code 2501 */ 2502 static int yt8821_serdes_init(struct phy_device *phydev) 2503 { 2504 int old_page; 2505 int ret = 0; 2506 u16 mask; 2507 u16 set; 2508 2509 old_page = phy_select_page(phydev, YT8521_RSSR_FIBER_SPACE); 2510 if (old_page < 0) { 2511 phydev_err(phydev, "Failed to select page: %d\n", 2512 old_page); 2513 goto err_restore_page; 2514 } 2515 2516 ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0); 2517 if (ret < 0) 2518 goto err_restore_page; 2519 2520 mask = YT8821_SDS_EXT_CSR_VCO_LDO_EN | 2521 YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN; 2522 set = YT8821_SDS_EXT_CSR_VCO_LDO_EN; 2523 ret = ytphy_modify_ext(phydev, YT8821_SDS_EXT_CSR_CTRL_REG, mask, 2524 set); 2525 2526 err_restore_page: 2527 return phy_restore_page(phydev, old_page, ret); 2528 } 2529 2530 /** 2531 * yt8821_utp_init() - utp init 2532 * @phydev: a pointer to a &struct phy_device 2533 * 2534 * Returns: 0 or negative errno code 2535 */ 2536 static int yt8821_utp_init(struct phy_device *phydev) 2537 { 2538 int old_page; 2539 int ret = 0; 2540 u16 mask; 2541 u16 save; 2542 u16 set; 2543 2544 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); 2545 if (old_page < 0) { 2546 phydev_err(phydev, "Failed to select page: %d\n", 2547 old_page); 2548 goto err_restore_page; 2549 } 2550 2551 mask = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 | 2552 YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 | 2553 YT8821_UTP_EXT_RPDN_IPR_SHT_2500; 2554 set = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 | 2555 YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500; 2556 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_RPDN_CTRL_REG, 2557 mask, set); 2558 if (ret < 0) 2559 goto err_restore_page; 2560 2561 mask = YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER | 2562 YT8821_UTP_EXT_VGA_LPF1_CAP_2500; 2563 ret = ytphy_modify_ext(phydev, 2564 YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG, 2565 mask, 0); 2566 if (ret < 0) 2567 goto err_restore_page; 2568 2569 mask = YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER | 2570 YT8821_UTP_EXT_VGA_LPF2_CAP_2500; 2571 ret = ytphy_modify_ext(phydev, 2572 YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG, 2573 mask, 0); 2574 if (ret < 0) 2575 goto err_restore_page; 2576 2577 mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 | 2578 YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500; 2579 set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500, 0x5a) | 2580 FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500, 0x3c); 2581 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_TRACE_CTRL_REG, 2582 mask, set); 2583 if (ret < 0) 2584 goto err_restore_page; 2585 2586 mask = YT8821_UTP_EXT_IPR_LNG_2500; 2587 set = FIELD_PREP(YT8821_UTP_EXT_IPR_LNG_2500, 0x6c); 2588 ret = ytphy_modify_ext(phydev, 2589 YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG, 2590 mask, set); 2591 if (ret < 0) 2592 goto err_restore_page; 2593 2594 mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000; 2595 set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000, 0x2a); 2596 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_ECHO_CTRL_REG, 2597 mask, set); 2598 if (ret < 0) 2599 goto err_restore_page; 2600 2601 mask = YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000; 2602 set = FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000, 0x22); 2603 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_GAIN_CTRL_REG, 2604 mask, set); 2605 if (ret < 0) 2606 goto err_restore_page; 2607 2608 mask = YT8821_UTP_EXT_TH_20DB_2500; 2609 set = FIELD_PREP(YT8821_UTP_EXT_TH_20DB_2500, 0x8000); 2610 ret = ytphy_modify_ext(phydev, 2611 YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG, 2612 mask, set); 2613 if (ret < 0) 2614 goto err_restore_page; 2615 2616 mask = YT8821_UTP_EXT_MU_COARSE_FR_F_FFE | 2617 YT8821_UTP_EXT_MU_COARSE_FR_F_FBE; 2618 set = FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FFE, 0x7) | 2619 FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FBE, 0x7); 2620 ret = ytphy_modify_ext(phydev, 2621 YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG, 2622 mask, set); 2623 if (ret < 0) 2624 goto err_restore_page; 2625 2626 mask = YT8821_UTP_EXT_MU_FINE_FR_F_FFE | 2627 YT8821_UTP_EXT_MU_FINE_FR_F_FBE; 2628 set = FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FFE, 0x2) | 2629 FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FBE, 0x2); 2630 ret = ytphy_modify_ext(phydev, 2631 YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG, 2632 mask, set); 2633 if (ret < 0) 2634 goto err_restore_page; 2635 2636 /* save YT8821_UTP_EXT_PI_CTRL_REG's val for use later */ 2637 ret = ytphy_read_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG); 2638 if (ret < 0) 2639 goto err_restore_page; 2640 2641 save = ret; 2642 2643 mask = YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE | 2644 YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE | 2645 YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE | 2646 YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE | 2647 YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE; 2648 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, 2649 mask, 0); 2650 if (ret < 0) 2651 goto err_restore_page; 2652 2653 /* restore YT8821_UTP_EXT_PI_CTRL_REG's val */ 2654 ret = ytphy_write_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, save); 2655 if (ret < 0) 2656 goto err_restore_page; 2657 2658 mask = YT8821_UTP_EXT_FECHO_AMP_TH_HUGE; 2659 set = FIELD_PREP(YT8821_UTP_EXT_FECHO_AMP_TH_HUGE, 0x38); 2660 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_VCT_CFG6_CTRL_REG, 2661 mask, set); 2662 if (ret < 0) 2663 goto err_restore_page; 2664 2665 mask = YT8821_UTP_EXT_NFR_TX_ABILITY; 2666 set = YT8821_UTP_EXT_NFR_TX_ABILITY; 2667 ret = ytphy_modify_ext(phydev, 2668 YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG, 2669 mask, set); 2670 if (ret < 0) 2671 goto err_restore_page; 2672 2673 mask = YT8821_UTP_EXT_PLL_SPARE_CFG; 2674 set = FIELD_PREP(YT8821_UTP_EXT_PLL_SPARE_CFG, 0xe9); 2675 ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PLL_CTRL_REG, 2676 mask, set); 2677 if (ret < 0) 2678 goto err_restore_page; 2679 2680 mask = YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG | 2681 YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG; 2682 set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG, 0x64) | 2683 FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG, 0x64); 2684 ret = ytphy_modify_ext(phydev, 2685 YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG, 2686 mask, set); 2687 if (ret < 0) 2688 goto err_restore_page; 2689 2690 mask = YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG | 2691 YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG; 2692 set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG, 0x64) | 2693 FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG, 0x64); 2694 ret = ytphy_modify_ext(phydev, 2695 YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG, 2696 mask, set); 2697 if (ret < 0) 2698 goto err_restore_page; 2699 2700 mask = YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG | 2701 YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG; 2702 set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG, 0x64) | 2703 FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG, 0x64); 2704 ret = ytphy_modify_ext(phydev, 2705 YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG, 2706 mask, set); 2707 if (ret < 0) 2708 goto err_restore_page; 2709 2710 mask = YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG | 2711 YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG; 2712 set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG, 0x64) | 2713 FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG, 0x64); 2714 ret = ytphy_modify_ext(phydev, 2715 YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG, 2716 mask, set); 2717 2718 err_restore_page: 2719 return phy_restore_page(phydev, old_page, ret); 2720 } 2721 2722 /** 2723 * yt8821_auto_sleep_config() - phy auto sleep config 2724 * @phydev: a pointer to a &struct phy_device 2725 * @enable: true enable auto sleep, false disable auto sleep 2726 * 2727 * Returns: 0 or negative errno code 2728 */ 2729 static int yt8821_auto_sleep_config(struct phy_device *phydev, 2730 bool enable) 2731 { 2732 int old_page; 2733 int ret = 0; 2734 2735 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE); 2736 if (old_page < 0) { 2737 phydev_err(phydev, "Failed to select page: %d\n", 2738 old_page); 2739 goto err_restore_page; 2740 } 2741 2742 ret = ytphy_modify_ext(phydev, 2743 YT8521_EXTREG_SLEEP_CONTROL1_REG, 2744 YT8521_ESC1R_SLEEP_SW, 2745 enable ? 1 : 0); 2746 2747 err_restore_page: 2748 return phy_restore_page(phydev, old_page, ret); 2749 } 2750 2751 /** 2752 * yt8821_soft_reset() - soft reset utp and serdes 2753 * @phydev: a pointer to a &struct phy_device 2754 * 2755 * Returns: 0 or negative errno code 2756 */ 2757 static int yt8821_soft_reset(struct phy_device *phydev) 2758 { 2759 return ytphy_modify_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG, 2760 YT8521_CCR_SW_RST, 0); 2761 } 2762 2763 /** 2764 * yt8821_config_init() - phy initializatioin 2765 * @phydev: a pointer to a &struct phy_device 2766 * 2767 * Returns: 0 or negative errno code 2768 */ 2769 static int yt8821_config_init(struct phy_device *phydev) 2770 { 2771 u8 mode = YT8821_CHIP_MODE_AUTO_BX2500_SGMII; 2772 int ret; 2773 u16 set; 2774 2775 if (phydev->interface == PHY_INTERFACE_MODE_2500BASEX) 2776 mode = YT8821_CHIP_MODE_FORCE_BX2500; 2777 2778 set = FIELD_PREP(YT8521_CCR_MODE_SEL_MASK, mode); 2779 ret = ytphy_modify_ext_with_lock(phydev, 2780 YT8521_CHIP_CONFIG_REG, 2781 YT8521_CCR_MODE_SEL_MASK, 2782 set); 2783 if (ret < 0) 2784 return ret; 2785 2786 __set_bit(PHY_INTERFACE_MODE_2500BASEX, 2787 phydev->possible_interfaces); 2788 2789 if (mode == YT8821_CHIP_MODE_AUTO_BX2500_SGMII) { 2790 __set_bit(PHY_INTERFACE_MODE_SGMII, 2791 phydev->possible_interfaces); 2792 2793 phydev->rate_matching = RATE_MATCH_NONE; 2794 } else if (mode == YT8821_CHIP_MODE_FORCE_BX2500) { 2795 phydev->rate_matching = RATE_MATCH_PAUSE; 2796 } 2797 2798 ret = yt8821_serdes_init(phydev); 2799 if (ret < 0) 2800 return ret; 2801 2802 ret = yt8821_utp_init(phydev); 2803 if (ret < 0) 2804 return ret; 2805 2806 /* disable auto sleep */ 2807 ret = yt8821_auto_sleep_config(phydev, false); 2808 if (ret < 0) 2809 return ret; 2810 2811 /* soft reset */ 2812 return yt8821_soft_reset(phydev); 2813 } 2814 2815 /** 2816 * yt8821_adjust_status() - update speed and duplex to phydev 2817 * @phydev: a pointer to a &struct phy_device 2818 * @val: read from YTPHY_SPECIFIC_STATUS_REG 2819 */ 2820 static void yt8821_adjust_status(struct phy_device *phydev, int val) 2821 { 2822 int speed, duplex; 2823 int speed_mode; 2824 2825 duplex = FIELD_GET(YTPHY_SSR_DUPLEX, val); 2826 speed_mode = val & YTPHY_SSR_SPEED_MASK; 2827 switch (speed_mode) { 2828 case YTPHY_SSR_SPEED_10M: 2829 speed = SPEED_10; 2830 break; 2831 case YTPHY_SSR_SPEED_100M: 2832 speed = SPEED_100; 2833 break; 2834 case YTPHY_SSR_SPEED_1000M: 2835 speed = SPEED_1000; 2836 break; 2837 case YTPHY_SSR_SPEED_2500M: 2838 speed = SPEED_2500; 2839 break; 2840 default: 2841 speed = SPEED_UNKNOWN; 2842 break; 2843 } 2844 2845 phydev->speed = speed; 2846 phydev->duplex = duplex; 2847 } 2848 2849 /** 2850 * yt8821_update_interface() - update interface per current speed 2851 * @phydev: a pointer to a &struct phy_device 2852 */ 2853 static void yt8821_update_interface(struct phy_device *phydev) 2854 { 2855 if (!phydev->link) 2856 return; 2857 2858 switch (phydev->speed) { 2859 case SPEED_2500: 2860 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; 2861 break; 2862 case SPEED_1000: 2863 case SPEED_100: 2864 case SPEED_10: 2865 phydev->interface = PHY_INTERFACE_MODE_SGMII; 2866 break; 2867 default: 2868 phydev_warn(phydev, "phy speed err :%d\n", phydev->speed); 2869 break; 2870 } 2871 } 2872 2873 /** 2874 * yt8821_read_status() - determines the negotiated speed and duplex 2875 * @phydev: a pointer to a &struct phy_device 2876 * 2877 * Returns: 0 or negative errno code 2878 */ 2879 static int yt8821_read_status(struct phy_device *phydev) 2880 { 2881 int link; 2882 int ret; 2883 int val; 2884 2885 ret = ytphy_write_ext_with_lock(phydev, 2886 YT8521_REG_SPACE_SELECT_REG, 2887 YT8521_RSSR_UTP_SPACE); 2888 if (ret < 0) 2889 return ret; 2890 2891 ret = genphy_read_status(phydev); 2892 if (ret < 0) 2893 return ret; 2894 2895 if (phydev->autoneg_complete) { 2896 ret = genphy_c45_read_lpa(phydev); 2897 if (ret < 0) 2898 return ret; 2899 } 2900 2901 ret = phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG); 2902 if (ret < 0) 2903 return ret; 2904 2905 val = ret; 2906 2907 link = val & YTPHY_SSR_LINK; 2908 if (link) 2909 yt8821_adjust_status(phydev, val); 2910 2911 if (link) { 2912 if (phydev->link == 0) 2913 phydev_dbg(phydev, 2914 "%s, phy addr: %d, link up\n", 2915 __func__, phydev->mdio.addr); 2916 phydev->link = 1; 2917 } else { 2918 if (phydev->link == 1) 2919 phydev_dbg(phydev, 2920 "%s, phy addr: %d, link down\n", 2921 __func__, phydev->mdio.addr); 2922 phydev->link = 0; 2923 } 2924 2925 val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG); 2926 if (val < 0) 2927 return val; 2928 2929 if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) == 2930 YT8821_CHIP_MODE_AUTO_BX2500_SGMII) 2931 yt8821_update_interface(phydev); 2932 2933 return 0; 2934 } 2935 2936 /** 2937 * yt8821_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register 2938 * @phydev: the phy_device struct 2939 * @mask: bit mask of bits to clear 2940 * @set: bit mask of bits to set 2941 * 2942 * NOTE: Convenience function which allows a PHY's BMCR register to be 2943 * modified as new register value = (old register value & ~mask) | set. 2944 * 2945 * Returns: 0 or negative errno code 2946 */ 2947 static int yt8821_modify_utp_fiber_bmcr(struct phy_device *phydev, 2948 u16 mask, u16 set) 2949 { 2950 int ret; 2951 2952 ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE, 2953 mask, set); 2954 if (ret < 0) 2955 return ret; 2956 2957 return yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE, 2958 mask, set); 2959 } 2960 2961 /** 2962 * yt8821_suspend() - suspend the hardware 2963 * @phydev: a pointer to a &struct phy_device 2964 * 2965 * Returns: 0 or negative errno code 2966 */ 2967 static int yt8821_suspend(struct phy_device *phydev) 2968 { 2969 int wol_config; 2970 2971 wol_config = ytphy_read_ext_with_lock(phydev, 2972 YTPHY_WOL_CONFIG_REG); 2973 if (wol_config < 0) 2974 return wol_config; 2975 2976 /* if wol enable, do nothing */ 2977 if (wol_config & YTPHY_WCR_ENABLE) 2978 return 0; 2979 2980 return yt8821_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN); 2981 } 2982 2983 /** 2984 * yt8821_resume() - resume the hardware 2985 * @phydev: a pointer to a &struct phy_device 2986 * 2987 * Returns: 0 or negative errno code 2988 */ 2989 static int yt8821_resume(struct phy_device *phydev) 2990 { 2991 int wol_config; 2992 int ret; 2993 2994 /* disable auto sleep */ 2995 ret = yt8821_auto_sleep_config(phydev, false); 2996 if (ret < 0) 2997 return ret; 2998 2999 wol_config = ytphy_read_ext_with_lock(phydev, 3000 YTPHY_WOL_CONFIG_REG); 3001 if (wol_config < 0) 3002 return wol_config; 3003 3004 /* if wol enable, do nothing */ 3005 if (wol_config & YTPHY_WCR_ENABLE) 3006 return 0; 3007 3008 return yt8821_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0); 3009 } 3010 3011 static struct phy_driver motorcomm_phy_drvs[] = { 3012 { 3013 PHY_ID_MATCH_EXACT(PHY_ID_YT8511), 3014 .name = "YT8511 Gigabit Ethernet", 3015 .config_init = yt8511_config_init, 3016 .suspend = genphy_suspend, 3017 .resume = genphy_resume, 3018 .read_page = yt8511_read_page, 3019 .write_page = yt8511_write_page, 3020 }, 3021 { 3022 PHY_ID_MATCH_EXACT(PHY_ID_YT8521), 3023 .name = "YT8521 Gigabit Ethernet", 3024 .get_features = yt8521_get_features, 3025 .probe = yt8521_probe, 3026 .read_page = yt8521_read_page, 3027 .write_page = yt8521_write_page, 3028 .get_wol = ytphy_get_wol, 3029 .set_wol = ytphy_set_wol, 3030 .config_aneg = yt8521_config_aneg, 3031 .aneg_done = yt8521_aneg_done, 3032 .config_init = yt8521_config_init, 3033 .read_status = yt8521_read_status, 3034 .soft_reset = yt8521_soft_reset, 3035 .suspend = yt8521_suspend, 3036 .resume = yt8521_resume, 3037 .led_hw_is_supported = yt8521_led_hw_is_supported, 3038 .led_hw_control_set = yt8521_led_hw_control_set, 3039 .led_hw_control_get = yt8521_led_hw_control_get, 3040 }, 3041 { 3042 PHY_ID_MATCH_EXACT(PHY_ID_YT8531), 3043 .name = "YT8531 Gigabit Ethernet", 3044 .probe = yt8531_probe, 3045 .config_init = yt8531_config_init, 3046 .suspend = genphy_suspend, 3047 .resume = genphy_resume, 3048 .get_wol = ytphy_get_wol, 3049 .set_wol = yt8531_set_wol, 3050 .link_change_notify = yt8531_link_change_notify, 3051 }, 3052 { 3053 PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), 3054 .name = "YT8531S Gigabit Ethernet", 3055 .get_features = yt8521_get_features, 3056 .probe = yt8521_probe, 3057 .read_page = yt8521_read_page, 3058 .write_page = yt8521_write_page, 3059 .get_wol = ytphy_get_wol, 3060 .set_wol = ytphy_set_wol, 3061 .config_aneg = yt8521_config_aneg, 3062 .aneg_done = yt8521_aneg_done, 3063 .config_init = yt8521_config_init, 3064 .read_status = yt8521_read_status, 3065 .soft_reset = yt8521_soft_reset, 3066 .suspend = yt8521_suspend, 3067 .resume = yt8521_resume, 3068 }, 3069 { 3070 PHY_ID_MATCH_EXACT(PHY_ID_YT8821), 3071 .name = "YT8821 2.5Gbps PHY", 3072 .get_features = yt8821_get_features, 3073 .read_page = yt8521_read_page, 3074 .write_page = yt8521_write_page, 3075 .get_wol = ytphy_get_wol, 3076 .set_wol = ytphy_set_wol, 3077 .config_aneg = genphy_config_aneg, 3078 .aneg_done = yt8821_aneg_done, 3079 .config_init = yt8821_config_init, 3080 .get_rate_matching = yt8821_get_rate_matching, 3081 .read_status = yt8821_read_status, 3082 .soft_reset = yt8821_soft_reset, 3083 .suspend = yt8821_suspend, 3084 .resume = yt8821_resume, 3085 }, 3086 }; 3087 3088 module_phy_driver(motorcomm_phy_drvs); 3089 3090 MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver"); 3091 MODULE_AUTHOR("Peter Geis"); 3092 MODULE_AUTHOR("Frank"); 3093 MODULE_LICENSE("GPL"); 3094 3095 static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { 3096 { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, 3097 { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, 3098 { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) }, 3099 { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, 3100 { PHY_ID_MATCH_EXACT(PHY_ID_YT8821) }, 3101 { /* sentinel */ } 3102 }; 3103 3104 MODULE_DEVICE_TABLE(mdio, motorcomm_tbl); 3105