Lines Matching +full:fiber +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
317 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in marvell_config_intr()
369 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); in marvell_config_aneg()
384 if (phydev->autoneg != AUTONEG_ENABLE || changed) { in marvell_config_aneg()
434 * marvell,reg-init property stored in the of_node for the phydev.
436 * marvell,reg-init = <reg-page reg mask value>,...;
438 * There may be one or more sets of <reg-page reg mask value>:
440 * reg-page: which register bank to use.
442 * mask: if non-zero, ANDed with existing register value.
451 if (!phydev->mdio.dev.of_node) in marvell_of_reg_init()
454 paddr = of_get_property(phydev->mdio.dev.of_node, in marvell_of_reg_init()
455 "marvell,reg-init", &len); in marvell_of_reg_init()
465 for (i = 0; i < len - 3; i += 4) { in marvell_of_reg_init()
508 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) in m88e1121_config_aneg_rgmii_delays()
511 else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) in m88e1121_config_aneg_rgmii_delays()
513 else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) in m88e1121_config_aneg_rgmii_delays()
536 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); in m88e1121_config_aneg()
546 if (phydev->autoneg != AUTONEG_ENABLE || changed) { in m88e1121_config_aneg()
577 * register for fiber link.
598 * marvell_config_aneg_fiber - restart auto-negotiation or write BMCR
601 * Description: If auto-negotiation is enabled, we configure the
602 * advertising, and then restart auto-negotiation. If it is not
603 * enabled, then we write the BMCR. Adapted for fiber link in
612 if (phydev->autoneg != AUTONEG_ENABLE) in marvell_config_aneg_fiber()
616 linkmode_and(phydev->advertising, phydev->advertising, in marvell_config_aneg_fiber()
617 phydev->supported); in marvell_config_aneg_fiber()
619 adv = linkmode_adv_to_fiber_adv_t(phydev->advertising); in marvell_config_aneg_fiber()
621 /* Setup fiber advertisement */ in marvell_config_aneg_fiber()
647 /* Do not touch the fiber page if we're in copper->sgmii mode */ in m88e1510_config_aneg()
648 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) in m88e1510_config_aneg()
651 /* Then the fiber link */ in m88e1510_config_aneg()
672 switch (MARVELL_PHY_FAMILY_ID(phydev->phy_id)) { in marvell_config_led()
684 if (phydev->dev_flags & MARVELL_PHY_LED0_LINK_LED1_ACTIVE) in marvell_config_led()
704 /* Set registers from marvell,reg-init DT property */ in marvell_config_init()
712 /* Enable Scrambler and Auto-Crossover */ in m88e3016_config_init()
723 u16 mode, in m88e1111_config_init_hwcfg_mode() argument
727 mode |= MII_M1111_HWCFG_FIBER_COPPER_AUTO; in m88e1111_config_init_hwcfg_mode()
733 mode); in m88e1111_config_init_hwcfg_mode()
740 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { in m88e1111_config_init_rgmii_delays()
742 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { in m88e1111_config_init_rgmii_delays()
744 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { in m88e1111_config_init_rgmii_delays()
829 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { in m88e1111_config_init()
835 if (phydev->interface == PHY_INTERFACE_MODE_RTBI) { in m88e1111_config_init()
869 return -E2BIG; in m88e1111_set_downshift()
876 val |= FIELD_PREP(MII_M1111_PHY_EXT_CR_DOWNSHIFT_MASK, cnt - 1); in m88e1111_set_downshift()
893 switch (tuna->id) { in m88e1111_get_tunable()
897 return -EOPNOTSUPP; in m88e1111_get_tunable()
904 switch (tuna->id) { in m88e1111_set_tunable()
908 return -EOPNOTSUPP; in m88e1111_set_tunable()
933 return -E2BIG; in m88e1011_set_downshift()
940 val |= FIELD_PREP(MII_M1011_PHY_SCR_DOWNSHIFT_MASK, cnt - 1); in m88e1011_set_downshift()
957 switch (tuna->id) { in m88e1011_get_tunable()
961 return -EOPNOTSUPP; in m88e1011_get_tunable()
968 switch (tuna->id) { in m88e1011_set_tunable()
972 return -EOPNOTSUPP; in m88e1011_set_tunable()
990 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); in m88e1116r_config_init()
1031 /* SGMII-to-Copper mode initialization */ in m88e1510_config_init()
1032 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { in m88e1510_config_init()
1038 /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ in m88e1510_config_init()
1045 /* PHY reset is necessary after changing MODE[2:0] */ in m88e1510_config_init()
1064 err = marvell_set_polarity(phydev, phydev->mdix_ctrl); in m88e1118_config_aneg()
1101 if (phydev->dev_flags & MARVELL_PHY_M1118_DNS323_LEDS) in m88e1118_config_init()
1154 if (phydev->dev_flags & MARVELL_PHY_M1145_FLAGS_RESISTANCE) { in m88e1145_config_init_rgmii()
1202 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { in m88e1145_config_init()
1208 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { in m88e1145_config_init()
1250 return -EINVAL; in m88e1540_get_fld()
1271 return -EBUSY; in m88e1540_set_fld()
1297 switch (tuna->id) { in m88e1540_get_tunable()
1303 return -EOPNOTSUPP; in m88e1540_get_tunable()
1310 switch (tuna->id) { in m88e1540_set_tunable()
1316 return -EOPNOTSUPP; in m88e1540_set_tunable()
1356 * @lpa: value of the MII_LPA register for fiber link
1372 int fiber, int status) in marvell_read_status_page_an() argument
1378 phydev->link = 0; in marvell_read_status_page_an()
1383 phydev->duplex = DUPLEX_FULL; in marvell_read_status_page_an()
1385 phydev->duplex = DUPLEX_HALF; in marvell_read_status_page_an()
1389 phydev->speed = SPEED_1000; in marvell_read_status_page_an()
1393 phydev->speed = SPEED_100; in marvell_read_status_page_an()
1397 phydev->speed = SPEED_10; in marvell_read_status_page_an()
1401 if (!fiber) { in marvell_read_status_page_an()
1412 /* The fiber link is only 1000M capable */ in marvell_read_status_page_an()
1413 fiber_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa); in marvell_read_status_page_an()
1415 if (phydev->duplex == DUPLEX_FULL) { in marvell_read_status_page_an()
1417 phydev->pause = 0; in marvell_read_status_page_an()
1418 phydev->asym_pause = 0; in marvell_read_status_page_an()
1420 phydev->pause = 1; in marvell_read_status_page_an()
1421 phydev->asym_pause = 1; in marvell_read_status_page_an()
1423 phydev->pause = 1; in marvell_read_status_page_an()
1424 phydev->asym_pause = 0; in marvell_read_status_page_an()
1443 int fiber; in marvell_read_status_page() local
1451 * and the PHY status register for fiber link status. in marvell_read_status_page()
1454 phydev->link = !!(status & MII_M1011_PHY_STATUS_LINK); in marvell_read_status_page()
1462 fiber = 1; in marvell_read_status_page()
1464 fiber = 0; in marvell_read_status_page()
1466 linkmode_zero(phydev->lp_advertising); in marvell_read_status_page()
1467 phydev->pause = 0; in marvell_read_status_page()
1468 phydev->asym_pause = 0; in marvell_read_status_page()
1469 phydev->speed = SPEED_UNKNOWN; in marvell_read_status_page()
1470 phydev->duplex = DUPLEX_UNKNOWN; in marvell_read_status_page()
1471 phydev->port = fiber ? PORT_FIBRE : PORT_TP; in marvell_read_status_page()
1473 if (phydev->autoneg == AUTONEG_ENABLE) in marvell_read_status_page()
1474 err = marvell_read_status_page_an(phydev, fiber, status); in marvell_read_status_page()
1483 * Some Marvell's phys have two modes: fiber and copper.
1486 * First, check the fiber link and status.
1487 * If the fiber link is down, check the copper link and status which
1494 /* Check the fiber mode first */ in marvell_read_status()
1496 phydev->supported) && in marvell_read_status()
1497 phydev->interface != PHY_INTERFACE_MODE_SGMII) { in marvell_read_status()
1506 /* If the fiber link is up, it is the selected and in marvell_read_status()
1508 * fiber page. Please to be careful about that, avoid in marvell_read_status()
1510 * could break the behaviour for some fiber phy like in marvell_read_status()
1513 if (phydev->link) in marvell_read_status()
1516 /* If fiber link is down, check and save copper mode state */ in marvell_read_status()
1531 * Some Marvell's phys have two modes: fiber and copper.
1538 /* Suspend the fiber mode first */ in marvell_suspend()
1540 phydev->supported)) { in marvell_suspend()
1566 * Some Marvell's phys have two modes: fiber and copper.
1573 /* Resume the fiber mode first */ in marvell_resume()
1575 phydev->supported)) { in marvell_resume()
1623 wol->supported = WAKE_MAGIC; in m88e1318_get_wol()
1624 wol->wolopts = 0; in m88e1318_get_wol()
1629 wol->wolopts |= WAKE_MAGIC; in m88e1318_get_wol()
1641 if (wol->wolopts & WAKE_MAGIC) { in m88e1318_set_wol()
1680 ((phydev->attached_dev->dev_addr[5] << 8) | in m88e1318_set_wol()
1681 phydev->attached_dev->dev_addr[4])); in m88e1318_set_wol()
1685 ((phydev->attached_dev->dev_addr[3] << 8) | in m88e1318_set_wol()
1686 phydev->attached_dev->dev_addr[2])); in m88e1318_set_wol()
1690 ((phydev->attached_dev->dev_addr[1] << 8) | in m88e1318_set_wol()
1691 phydev->attached_dev->dev_addr[0])); in m88e1318_set_wol()
1721 phydev->supported)) in marvell_get_sset_count()
1724 return ARRAY_SIZE(marvell_hw_stats) - NB_FIBER_STATS; in marvell_get_sset_count()
1741 struct marvell_priv *priv = phydev->priv; in marvell_get_stat()
1749 val = val & ((1 << stat.bits) - 1); in marvell_get_stat()
1750 priv->stats[i] += val; in marvell_get_stat()
1751 ret = priv->stats[i]; in marvell_get_stat()
1782 return -ETIMEDOUT; in marvell_vct5_wait_complete()
1801 amplitude = -amplitude; in marvell_vct5_amplitude()
1855 struct marvell_priv *priv = phydev->priv; in marvell_vct5_amplitude_graph()
1862 if (priv->first <= TDR_SHORT_CABLE_LENGTH) in marvell_vct5_amplitude_graph()
1886 for (distance = priv->first; in marvell_vct5_amplitude_graph()
1887 distance <= priv->last; in marvell_vct5_amplitude_graph()
1888 distance += priv->step) { in marvell_vct5_amplitude_graph()
1890 priv->pair); in marvell_vct5_amplitude_graph()
1914 /* If auto-negotiation is enabled, but not complete, the cable in marvell_cable_test_start_common()
1915 * test never completes. So disable auto-neg. in marvell_cable_test_start_common()
1944 struct marvell_priv *priv = phydev->priv; in marvell_vct7_cable_test_start()
1951 priv->cable_test_tdr = false; in marvell_vct7_cable_test_start()
1979 struct marvell_priv *priv = phydev->priv; in marvell_vct5_cable_test_tdr_start()
1982 priv->cable_test_tdr = true; in marvell_vct5_cable_test_tdr_start()
1983 priv->first = marvell_vct5_cm2distance(cfg->first); in marvell_vct5_cable_test_tdr_start()
1984 priv->last = marvell_vct5_cm2distance(cfg->last); in marvell_vct5_cable_test_tdr_start()
1985 priv->step = marvell_vct5_cm2distance(cfg->step); in marvell_vct5_cable_test_tdr_start()
1986 priv->pair = cfg->pair; in marvell_vct5_cable_test_tdr_start()
1988 if (priv->first > MII_VCT5_SAMPLE_POINT_DISTANCE_MAX) in marvell_vct5_cable_test_tdr_start()
1989 return -EINVAL; in marvell_vct5_cable_test_tdr_start()
1991 if (priv->last > MII_VCT5_SAMPLE_POINT_DISTANCE_MAX) in marvell_vct5_cable_test_tdr_start()
1992 return -EINVAL; in marvell_vct5_cable_test_tdr_start()
2009 marvell_vct5_distance2cm(priv->first), in marvell_vct5_cable_test_tdr_start()
2010 marvell_vct5_distance2cm(priv->last), in marvell_vct5_cable_test_tdr_start()
2011 marvell_vct5_distance2cm(priv->step)); in marvell_vct5_cable_test_tdr_start()
2117 struct marvell_priv *priv = phydev->priv; in marvell_vct7_cable_test_get_status()
2120 if (priv->cable_test_tdr) { in marvell_vct7_cable_test_get_status()
2181 *temp = ((val & MII_88E1121_MISC_TEST_TEMP_MASK) - 5) * 5000; in m88e1121_get_temp()
2199 return -EOPNOTSUPP; in m88e1121_hwmon_read()
2267 *temp = ((ret & MII_88E1510_TEMP_SENSOR_MASK) - 25) * 1000; in m88e1510_get_temp()
2284 MII_88E1510_MISC_TEST_TEMP_THRESHOLD_SHIFT) * 5) - 25; in m88e1510_get_temp_critical()
2336 return -EOPNOTSUPP; in m88e1510_hwmon_read()
2354 return -EOPNOTSUPP; in m88e1510_hwmon_write()
2444 *temp = (sum - 75) * 1000; in m88e6390_get_temp()
2474 return -EOPNOTSUPP; in m88e6390_hwmon_read()
2523 struct marvell_priv *priv = phydev->priv; in marvell_hwmon_name()
2524 struct device *dev = &phydev->mdio.dev; in marvell_hwmon_name()
2529 priv->hwmon_name = devm_kzalloc(dev, len, GFP_KERNEL); in marvell_hwmon_name()
2530 if (!priv->hwmon_name) in marvell_hwmon_name()
2531 return -ENOMEM; in marvell_hwmon_name()
2535 priv->hwmon_name[j++] = devname[i]; in marvell_hwmon_name()
2544 struct marvell_priv *priv = phydev->priv; in marvell_hwmon_probe()
2545 struct device *dev = &phydev->mdio.dev; in marvell_hwmon_probe()
2552 priv->hwmon_dev = devm_hwmon_device_register_with_info( in marvell_hwmon_probe()
2553 dev, priv->hwmon_name, phydev, chip, NULL); in marvell_hwmon_probe()
2555 return PTR_ERR_OR_ZERO(priv->hwmon_dev); in marvell_hwmon_probe()
2593 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in marvell_probe()
2595 return -ENOMEM; in marvell_probe()
2597 phydev->priv = priv; in marvell_probe()