at v6.19 3107 lines 86 kB view raw
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 370struct 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 */ 397static 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 */ 415static 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 */ 436static 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 */ 455static 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 */ 480static 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 */ 504static 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 */ 523static 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 */ 550static 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 618err_restore_page: 619 return phy_restore_page(phydev, old_page, ret); 620} 621 622static 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 677static int yt8511_read_page(struct phy_device *phydev) 678{ 679 return __phy_read(phydev, YT8511_PAGE_SELECT); 680}; 681 682static int yt8511_write_page(struct phy_device *phydev, int page) 683{ 684 return __phy_write(phydev, YT8511_PAGE_SELECT, page); 685}; 686 687static 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 746err_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 */ 757static 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 */ 778static 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 */ 796struct ytphy_cfg_reg_map { 797 u32 cfg; 798 u32 reg; 799}; 800 801static 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 839static 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 871err_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 882static 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 927static 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 */ 944struct ytphy_ldo_vol_map { 945 u32 vol; 946 u32 ds; 947 u32 cur; 948}; 949 950static 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 969static 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 979static 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 993static 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 */ 1048static 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 1166static 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 */ 1211static 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 */ 1268static 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 */ 1345static 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 1420err_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 */ 1430static 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 */ 1524static 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 1552err_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 */ 1569static 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 */ 1600static 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 */ 1611static 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 */ 1633static 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 */ 1662static 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 } 1694err_restore_page: 1695 return phy_restore_page(phydev, old_page, ret); 1696} 1697 1698static 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 1707static 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 1720static 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_FDX_ON_EN; 1745 1746 if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules)) 1747 val |= YT8521_LED_HDX_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 1762static 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 1798static 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 */ 1841static 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 */ 1896static 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 */ 1913static 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 */ 1953static 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 */ 1987static 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 */ 2046static 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 */ 2090static 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 */ 2147static 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 */ 2185static 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 2228err_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 */ 2238static 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 */ 2283static 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 2300err_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 */ 2310static 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 */ 2349static 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 */ 2397static 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 2416err_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 */ 2426static 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 */ 2451static 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 */ 2469static 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 */ 2491static 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 */ 2502static 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 2526err_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 */ 2536static 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 2718err_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 */ 2729static 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 2747err_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 */ 2757static 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 */ 2769static 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 */ 2820static 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 */ 2853static 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 */ 2879static 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 */ 2947static 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 */ 2967static 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 */ 2989static 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 3011static 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 .led_hw_is_supported = yt8521_led_hw_is_supported, 3052 .led_hw_control_set = yt8521_led_hw_control_set, 3053 .led_hw_control_get = yt8521_led_hw_control_get, 3054 }, 3055 { 3056 PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), 3057 .name = "YT8531S Gigabit Ethernet", 3058 .get_features = yt8521_get_features, 3059 .probe = yt8521_probe, 3060 .read_page = yt8521_read_page, 3061 .write_page = yt8521_write_page, 3062 .get_wol = ytphy_get_wol, 3063 .set_wol = ytphy_set_wol, 3064 .config_aneg = yt8521_config_aneg, 3065 .aneg_done = yt8521_aneg_done, 3066 .config_init = yt8521_config_init, 3067 .read_status = yt8521_read_status, 3068 .soft_reset = yt8521_soft_reset, 3069 .suspend = yt8521_suspend, 3070 .resume = yt8521_resume, 3071 }, 3072 { 3073 PHY_ID_MATCH_EXACT(PHY_ID_YT8821), 3074 .name = "YT8821 2.5Gbps PHY", 3075 .get_features = yt8821_get_features, 3076 .read_page = yt8521_read_page, 3077 .write_page = yt8521_write_page, 3078 .get_wol = ytphy_get_wol, 3079 .set_wol = ytphy_set_wol, 3080 .config_aneg = genphy_config_aneg, 3081 .aneg_done = yt8821_aneg_done, 3082 .config_init = yt8821_config_init, 3083 .get_rate_matching = yt8821_get_rate_matching, 3084 .read_status = yt8821_read_status, 3085 .soft_reset = yt8821_soft_reset, 3086 .suspend = yt8821_suspend, 3087 .resume = yt8821_resume, 3088 }, 3089}; 3090 3091module_phy_driver(motorcomm_phy_drvs); 3092 3093MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver"); 3094MODULE_AUTHOR("Peter Geis"); 3095MODULE_AUTHOR("Frank"); 3096MODULE_LICENSE("GPL"); 3097 3098static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { 3099 { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, 3100 { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, 3101 { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) }, 3102 { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, 3103 { PHY_ID_MATCH_EXACT(PHY_ID_YT8821) }, 3104 { /* sentinel */ } 3105}; 3106 3107MODULE_DEVICE_TABLE(mdio, motorcomm_tbl);