Lines Matching +full:5 +full:g +full:- +full:usxgmii

1 // SPDX-License-Identifier: GPL-2.0+
52 #define PHY_IMASK_WOL BIT(15) /* Wake-on-LAN */
53 #define PHY_IMASK_ANC BIT(10) /* Auto-Neg complete */
54 #define PHY_IMASK_ADSC BIT(5) /* Link auto-downspeed detect */
112 * it can safely re-enter loopback mode. Record the time when
132 * T = -2.5761e-11*(N^4) + 9.7332e-8*(N^3) + -1.9165e-4*(N^2) +
133 * 3.0762e-1*(N^1) + -5.2156e1
135 * where [-52.156, 137.961]C and N = [0, 1023].
144 * T = -25761e-12*(N^4) + 97332e-9*(N^3) + -191650e-6*(N^2) +
145 * 307620e-3*(N^1) + -52156
147 * where T = [-52156, 137961]mC and N = [0, 1023].
151 {4, -25761, 1000, 1},
153 {2, -191650, 1000, 1},
155 {0, -52156, 1, 1}
170 return -ENODATA; in gpy_hwmon_read()
202 struct device *dev = &phydev->mdio.dev; in gpy_hwmon_register()
226 struct gpy_priv *priv = phydev->priv; in gpy_mbox_read()
230 mutex_lock(&priv->mbox_lock); in gpy_mbox_read()
259 mutex_unlock(&priv->mbox_lock); in gpy_mbox_read()
279 struct device *dev = &phydev->mdio.dev; in gpy_probe()
284 if (!phydev->is_c45) { in gpy_probe()
292 return -ENOMEM; in gpy_probe()
293 phydev->priv = priv; in gpy_probe()
294 mutex_init(&priv->mbox_lock); in gpy_probe()
296 if (!device_property_present(dev, "maxlinear,use-broken-interrupts")) in gpy_probe()
297 phydev->dev_flags |= PHY_F_NO_IRQ; in gpy_probe()
302 priv->fw_major = FIELD_GET(PHY_FWV_MAJOR_MASK, fw_version); in gpy_probe()
303 priv->fw_minor = FIELD_GET(PHY_FWV_MINOR_MASK, fw_version); in gpy_probe()
311 priv->fw_major, priv->fw_minor, fw_version, in gpy_probe()
319 struct gpy_priv *priv = phydev->priv; in gpy_sgmii_need_reaneg()
323 if (priv->fw_major != ver_need_sgmii_reaneg[i].major) in gpy_sgmii_need_reaneg()
325 if (priv->fw_minor < ver_need_sgmii_reaneg[i].minor) in gpy_sgmii_need_reaneg()
348 phydev->speed = SPEED_2500; in gpy_2500basex_chk()
349 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in gpy_2500basex_chk()
402 if (phydev->autoneg == AUTONEG_DISABLE) { in gpy_config_aneg()
406 return phydev->duplex != DUPLEX_FULL in gpy_config_aneg()
411 ret = gpy_config_mdix(phydev, phydev->mdix_ctrl); in gpy_config_aneg()
421 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in gpy_config_aneg()
434 if (phydev->interface == PHY_INTERFACE_MODE_USXGMII || in gpy_config_aneg()
435 phydev->interface == PHY_INTERFACE_MODE_INTERNAL) in gpy_config_aneg()
438 /* No need to trigger re-ANEG if link speed is 2.5G or SGMII ANEG is in gpy_config_aneg()
448 * again, SGMII AN is not triggered and hence no new in-band message in gpy_config_aneg()
452 * wouldn`t receive new in-band message from GPY with correct link in gpy_config_aneg()
466 if (phydev->state != PHY_UP) in gpy_config_aneg()
471 if (ret == -ETIMEDOUT) in gpy_config_aneg()
490 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in gpy_update_mdix()
493 phydev->mdix_ctrl = ETH_TP_MDI_X; in gpy_update_mdix()
495 phydev->mdix_ctrl = ETH_TP_MDI; in gpy_update_mdix()
502 phydev->mdix = ETH_TP_MDI_X; in gpy_update_mdix()
504 phydev->mdix = ETH_TP_MDI; in gpy_update_mdix()
513 /* Interface mode is fixed for USXGMII and integrated PHY */ in gpy_update_interface()
514 if (phydev->interface == PHY_INTERFACE_MODE_USXGMII || in gpy_update_interface()
515 phydev->interface == PHY_INTERFACE_MODE_INTERNAL) in gpy_update_interface()
516 return -EINVAL; in gpy_update_interface()
518 /* Automatically switch SERDES interface between SGMII and 2500-BaseX in gpy_update_interface()
519 * according to speed. Disable ANEG in 2500-BaseX mode. in gpy_update_interface()
521 switch (phydev->speed) { in gpy_update_interface()
523 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in gpy_update_interface()
536 phydev->interface = PHY_INTERFACE_MODE_SGMII; in gpy_update_interface()
540 * if ANEG is disabled (in 2500-BaseX mode). in gpy_update_interface()
554 if (phydev->speed == SPEED_2500 || phydev->speed == SPEED_1000) { in gpy_update_interface()
571 phydev->speed = SPEED_UNKNOWN; in gpy_read_status()
572 phydev->duplex = DUPLEX_UNKNOWN; in gpy_read_status()
573 phydev->pause = 0; in gpy_read_status()
574 phydev->asym_pause = 0; in gpy_read_status()
576 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in gpy_read_status()
581 /* Read the link partner's 1G advertisement */ in gpy_read_status()
585 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, ret); in gpy_read_status()
586 } else if (phydev->autoneg == AUTONEG_DISABLE) { in gpy_read_status()
587 linkmode_zero(phydev->lp_advertising); in gpy_read_status()
594 phydev->link = (ret & PHY_MIISTAT_LS) ? 1 : 0; in gpy_read_status()
595 phydev->duplex = (ret & PHY_MIISTAT_DPX) ? DUPLEX_FULL : DUPLEX_HALF; in gpy_read_status()
598 phydev->speed = SPEED_10; in gpy_read_status()
601 phydev->speed = SPEED_100; in gpy_read_status()
604 phydev->speed = SPEED_1000; in gpy_read_status()
607 phydev->speed = SPEED_2500; in gpy_read_status()
611 if (phydev->link) { in gpy_read_status()
624 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in gpy_config_intr()
650 * unstuck (e.g. by changing the pinmux to GPIO input) during that time in gpy_handle_interrupt()
672 struct net_device *attach_dev = phydev->attached_dev; in gpy_set_wol()
675 if (wol->wolopts & WAKE_MAGIC) { in gpy_set_wol()
676 /* MAC address - Byte0:Byte1:Byte2:Byte3:Byte4:Byte5 in gpy_set_wol()
683 ((attach_dev->dev_addr[0] << 8) | in gpy_set_wol()
684 attach_dev->dev_addr[1])); in gpy_set_wol()
690 ((attach_dev->dev_addr[2] << 8) | in gpy_set_wol()
691 attach_dev->dev_addr[3])); in gpy_set_wol()
697 ((attach_dev->dev_addr[4] << 8) | in gpy_set_wol()
698 attach_dev->dev_addr[5])); in gpy_set_wol()
729 if (wol->wolopts & WAKE_PHY) { in gpy_set_wol()
755 wol->supported = WAKE_MAGIC | WAKE_PHY; in gpy_get_wol()
756 wol->wolopts = 0; in gpy_get_wol()
760 wol->wolopts |= WAKE_MAGIC; in gpy_get_wol()
764 wol->wolopts |= WAKE_PHY; in gpy_get_wol()
769 struct gpy_priv *priv = phydev->priv; in gpy_loopback()
777 if (time_before64(now, priv->lb_dis_to)) in gpy_loopback()
778 msleep(jiffies64_to_msecs(priv->lb_dis_to - now)); in gpy_loopback()
793 priv->lb_dis_to = get_jiffies_64() + HZ * 3; in gpy_loopback()
801 struct gpy_priv *priv = phydev->priv; in gpy115_loopback()
806 if (priv->fw_minor > 0x76) in gpy115_loopback()