Lines Matching +full:mac +full:- +full:wol

1 // SPDX-License-Identifier: GPL-2.0+
53 #define PHY_IMASK_WOL BIT(15) /* Wake-on-LAN */
54 #define PHY_IMASK_ANC BIT(10) /* Auto-Neg complete */
55 #define PHY_IMASK_ADSC BIT(5) /* Link auto-downspeed detect */
117 /* WoL */
136 * it can safely re-enter loopback mode. Record the time when
156 * T = -2.5761e-11*(N^4) + 9.7332e-8*(N^3) + -1.9165e-4*(N^2) +
157 * 3.0762e-1*(N^1) + -5.2156e1
159 * where [-52.156, 137.961]C and N = [0, 1023].
168 * T = -25761e-12*(N^4) + 97332e-9*(N^3) + -191650e-6*(N^2) +
169 * 307620e-3*(N^1) + -52156
171 * where T = [-52156, 137961]mC and N = [0, 1023].
175 {4, -25761, 1000, 1},
177 {2, -191650, 1000, 1},
179 {0, -52156, 1, 1}
194 return -ENODATA; in gpy_hwmon_read()
226 struct device *dev = &phydev->mdio.dev; in gpy_hwmon_register()
253 struct gpy_priv *priv = phydev->priv; in gpy_mbox_read()
257 mutex_lock(&priv->mbox_lock); in gpy_mbox_read()
286 mutex_unlock(&priv->mbox_lock); in gpy_mbox_read()
298 __set_bit(PHY_INTERFACE_MODE_2500BASEX, phydev->possible_interfaces); in gpy21x_config_init()
299 __set_bit(PHY_INTERFACE_MODE_SGMII, phydev->possible_interfaces); in gpy21x_config_init()
306 struct device *dev = &phydev->mdio.dev; in gpy_probe()
311 if (!phydev->is_c45) { in gpy_probe()
319 return -ENOMEM; in gpy_probe()
320 phydev->priv = priv; in gpy_probe()
321 mutex_init(&priv->mbox_lock); in gpy_probe()
323 if (!device_property_present(dev, "maxlinear,use-broken-interrupts")) in gpy_probe()
324 phydev->dev_flags |= PHY_F_NO_IRQ; in gpy_probe()
329 priv->fw_major = FIELD_GET(PHY_FWV_MAJOR_MASK, fw_version); in gpy_probe()
330 priv->fw_minor = FIELD_GET(PHY_FWV_MINOR_MASK, fw_version); in gpy_probe()
338 priv->fw_major, priv->fw_minor, fw_version, in gpy_probe()
346 struct gpy_priv *priv = phydev->priv; in gpy_sgmii_need_reaneg()
350 if (priv->fw_major != ver_need_sgmii_reaneg[i].major) in gpy_sgmii_need_reaneg()
352 if (priv->fw_minor < ver_need_sgmii_reaneg[i].minor) in gpy_sgmii_need_reaneg()
375 phydev->speed = SPEED_2500; in gpy_2500basex_chk()
376 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in gpy_2500basex_chk()
429 if (phydev->autoneg == AUTONEG_DISABLE) { in gpy_config_aneg()
433 return phydev->duplex != DUPLEX_FULL in gpy_config_aneg()
438 ret = gpy_config_mdix(phydev, phydev->mdix_ctrl); in gpy_config_aneg()
448 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in gpy_config_aneg()
461 if (phydev->interface == PHY_INTERFACE_MODE_USXGMII || in gpy_config_aneg()
462 phydev->interface == PHY_INTERFACE_MODE_INTERNAL) in gpy_config_aneg()
465 /* No need to trigger re-ANEG if link speed is 2.5G or SGMII ANEG is in gpy_config_aneg()
475 * again, SGMII AN is not triggered and hence no new in-band message in gpy_config_aneg()
476 * from GPY to MAC side SGMII. in gpy_config_aneg()
478 * MAC. At this condition, once MAC side SGMII is up, MAC side SGMII in gpy_config_aneg()
479 * wouldn`t receive new in-band message from GPY with correct link in gpy_config_aneg()
493 if (phydev->state != PHY_UP) in gpy_config_aneg()
498 if (ret == -ETIMEDOUT) in gpy_config_aneg()
517 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in gpy_update_mdix()
520 phydev->mdix_ctrl = ETH_TP_MDI_X; in gpy_update_mdix()
522 phydev->mdix_ctrl = ETH_TP_MDI; in gpy_update_mdix()
529 phydev->mdix = ETH_TP_MDI_X; in gpy_update_mdix()
531 phydev->mdix = ETH_TP_MDI; in gpy_update_mdix()
541 if (phydev->interface == PHY_INTERFACE_MODE_USXGMII || in gpy_update_interface()
542 phydev->interface == PHY_INTERFACE_MODE_INTERNAL) in gpy_update_interface()
543 return -EINVAL; in gpy_update_interface()
545 /* Automatically switch SERDES interface between SGMII and 2500-BaseX in gpy_update_interface()
546 * according to speed. Disable ANEG in 2500-BaseX mode. in gpy_update_interface()
548 switch (phydev->speed) { in gpy_update_interface()
550 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in gpy_update_interface()
563 phydev->interface = PHY_INTERFACE_MODE_SGMII; in gpy_update_interface()
567 * if ANEG is disabled (in 2500-BaseX mode). in gpy_update_interface()
581 if (phydev->speed == SPEED_2500 || phydev->speed == SPEED_1000) { in gpy_update_interface()
598 phydev->speed = SPEED_UNKNOWN; in gpy_read_status()
599 phydev->duplex = DUPLEX_UNKNOWN; in gpy_read_status()
600 phydev->pause = 0; in gpy_read_status()
601 phydev->asym_pause = 0; in gpy_read_status()
603 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { in gpy_read_status()
612 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, ret); in gpy_read_status()
613 } else if (phydev->autoneg == AUTONEG_DISABLE) { in gpy_read_status()
614 linkmode_zero(phydev->lp_advertising); in gpy_read_status()
621 phydev->link = (ret & PHY_MIISTAT_LS) ? 1 : 0; in gpy_read_status()
622 phydev->duplex = (ret & PHY_MIISTAT_DPX) ? DUPLEX_FULL : DUPLEX_HALF; in gpy_read_status()
625 phydev->speed = SPEED_10; in gpy_read_status()
628 phydev->speed = SPEED_100; in gpy_read_status()
631 phydev->speed = SPEED_1000; in gpy_read_status()
634 phydev->speed = SPEED_2500; in gpy_read_status()
638 if (phydev->link) { in gpy_read_status()
649 struct gpy_priv *priv = phydev->priv; in gpy_config_intr()
657 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in gpy_config_intr()
660 if (priv->wolopts & WAKE_MAGIC) in gpy_config_intr()
663 if (priv->wolopts & WAKE_PHY) in gpy_config_intr()
709 struct ethtool_wolinfo *wol) in gpy_set_wol() argument
711 struct net_device *attach_dev = phydev->attached_dev; in gpy_set_wol()
712 struct gpy_priv *priv = phydev->priv; in gpy_set_wol()
715 if (wol->wolopts & WAKE_MAGIC) { in gpy_set_wol()
716 /* MAC address - Byte0:Byte1:Byte2:Byte3:Byte4:Byte5 in gpy_set_wol()
723 ((attach_dev->dev_addr[0] << 8) | in gpy_set_wol()
724 attach_dev->dev_addr[1])); in gpy_set_wol()
730 ((attach_dev->dev_addr[2] << 8) | in gpy_set_wol()
731 attach_dev->dev_addr[3])); in gpy_set_wol()
737 ((attach_dev->dev_addr[4] << 8) | in gpy_set_wol()
738 attach_dev->dev_addr[5])); in gpy_set_wol()
742 /* Enable the WOL interrupt */ in gpy_set_wol()
755 * Only WoL is enabled so clear all. in gpy_set_wol()
761 priv->wolopts |= WAKE_MAGIC; in gpy_set_wol()
770 /* Disable the WOL interrupt */ in gpy_set_wol()
775 priv->wolopts &= ~WAKE_MAGIC; in gpy_set_wol()
778 if (wol->wolopts & WAKE_PHY) { in gpy_set_wol()
792 priv->wolopts |= WAKE_PHY; in gpy_set_wol()
796 priv->wolopts &= ~WAKE_PHY; in gpy_set_wol()
802 struct ethtool_wolinfo *wol) in gpy_get_wol() argument
804 struct gpy_priv *priv = phydev->priv; in gpy_get_wol()
806 wol->supported = WAKE_MAGIC | WAKE_PHY; in gpy_get_wol()
807 wol->wolopts = priv->wolopts; in gpy_get_wol()
812 struct gpy_priv *priv = phydev->priv; in gpy_loopback()
820 return -EOPNOTSUPP; in gpy_loopback()
823 if (time_before64(now, priv->lb_dis_to)) in gpy_loopback()
824 msleep(jiffies64_to_msecs(priv->lb_dis_to - now)); in gpy_loopback()
839 priv->lb_dis_to = get_jiffies_64() + HZ * 3; in gpy_loopback()
847 struct gpy_priv *priv = phydev->priv; in gpy115_loopback()
852 if (priv->fw_minor > 0x76) in gpy115_loopback()
864 return -EINVAL; in gpy_led_brightness_set()
895 return -EINVAL; in gpy_led_hw_is_supported()
899 return -EOPNOTSUPP; in gpy_led_hw_is_supported()
910 return -EINVAL; in gpy_led_hw_control_get()
950 return -EINVAL; in gpy_led_hw_control_set()
993 return -EINVAL; in gpy_led_polarity_set()
1004 return -EINVAL; in gpy_led_polarity_set()
1014 return -EINVAL; in gpy_led_polarity_set()