Lines Matching +full:rx +full:- +full:internal +full:- +full:delay +full:- +full:ps
1 // SPDX-License-Identifier: GPL-2.0+
9 * Copyright (c) 2010-2013 Micrel, Inc.
30 #include <linux/delay.h>
183 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
187 if (type && type->interrupt_level_mask) in kszphy_config_intr()
188 mask = type->interrupt_level_mask; in kszphy_config_intr()
200 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
265 return -EINVAL; in kszphy_setup_led()
285 * unique (non-broadcast) address on a shared bus.
326 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
329 if (priv->rmii_ref_clk_sel) { in kszphy_config_reset()
330 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
338 if (priv->led_mode >= 0) in kszphy_config_reset()
339 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
346 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
352 type = priv->type; in kszphy_config_init()
354 if (type->has_broadcast_disable) in kszphy_config_init()
357 if (type->has_nand_tree_disable) in kszphy_config_init()
365 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
367 return of_property_read_bool(of_node, "micrel,fiber-mode"); in ksz8041_fiber_mode()
376 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
380 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
382 phydev->supported); in ksz8041_config_init()
383 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
385 phydev->advertising); in ksz8041_config_init()
386 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
394 /* Skip auto-negotiation in fiber mode */ in ksz8041_config_aneg()
395 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
396 phydev->speed = SPEED_100; in ksz8041_config_aneg()
408 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051) in ksz8051_ksz8795_match_phy_device()
434 /* KSZPHY_OMSO_FACTORY_TEST is set at de-assertion of the reset line in ksz8081_config_init()
436 * pull-down is missing, the factory test mode should be cleared by in ksz8081_config_init()
478 /* The MDI-X configuration is automatically changed by the PHY after in ksz8081_config_aneg()
479 * switching from autoneg off to on. So, take MDI-X configuration under in ksz8081_config_aneg()
482 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
495 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
497 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
499 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
507 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
509 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
547 int val1 = -1; in ksz9021_load_values_from_of()
548 int val2 = -2; in ksz9021_load_values_from_of()
549 int val3 = -3; in ksz9021_load_values_from_of()
550 int val4 = -4; in ksz9021_load_values_from_of()
574 if (val1 != -1) in ksz9021_load_values_from_of()
577 if (val2 != -2) in ksz9021_load_values_from_of()
580 if (val3 != -3) in ksz9021_load_values_from_of()
583 if (val4 != -4) in ksz9021_load_values_from_of()
598 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
600 of_node = dev_walker->of_node; in ksz9021_config_init()
601 dev_walker = dev_walker->parent; in ksz9021_config_init()
608 "txen-skew-ps", "txc-skew-ps", in ksz9021_config_init()
609 "rxdv-skew-ps", "rxc-skew-ps"); in ksz9021_config_init()
612 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9021_config_init()
613 "rxd2-skew-ps", "rxd3-skew-ps"); in ksz9021_config_init()
616 "txd0-skew-ps", "txd1-skew-ps", in ksz9021_config_init()
617 "txd2-skew-ps", "txd3-skew-ps"); in ksz9021_config_init()
650 /* KSZ9031 has internal RGMII_IDRX = 1.2ns and RGMII_IDTX = 0ns. To
651 * provide different RGMII options we need to configure delay offset
652 * for each pad relative to build in delay.
654 /* keep rx as "No delay adjustment" and set rx_clk to +0.60ns to get delays of
660 /* set rx to +0.30ns and rx_clk to -0.90ns to compensate the
661 * internal 1.2ns delay.
666 /* set tx to -0.42ns and tx_clk to +0.96ns to get 1.38ns delay */
670 /* set tx and tx_clk to "No delay adjustment" to keep 0ns
686 int val[4] = {-1, -2, -3, -4}; in ksz9031_of_load_skew_values()
709 if (val[i] != -(i + 1)) { in ksz9031_of_load_skew_values()
738 /* Enable energy-detect power-down mode */
752 u16 rx, tx, rx_clk, tx_clk; in ksz9031_config_rgmii_delay() local
755 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
759 rx = RX_ND; in ksz9031_config_rgmii_delay()
765 rx = RX_ID; in ksz9031_config_rgmii_delay()
771 rx = RX_ID; in ksz9031_config_rgmii_delay()
777 rx = RX_ND; in ksz9031_config_rgmii_delay()
785 FIELD_PREP(MII_KSZ9031RN_RX_CTL_M, rx) | in ksz9031_config_rgmii_delay()
791 FIELD_PREP(MII_KSZ9031RN_RXD3, rx) | in ksz9031_config_rgmii_delay()
792 FIELD_PREP(MII_KSZ9031RN_RXD2, rx) | in ksz9031_config_rgmii_delay()
793 FIELD_PREP(MII_KSZ9031RN_RXD1, rx) | in ksz9031_config_rgmii_delay()
794 FIELD_PREP(MII_KSZ9031RN_RXD0, rx)); in ksz9031_config_rgmii_delay()
814 static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; in ksz9031_config_init()
816 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9031_config_init()
817 "rxd2-skew-ps", "rxd3-skew-ps" in ksz9031_config_init()
820 "txd0-skew-ps", "txd1-skew-ps", in ksz9031_config_init()
821 "txd2-skew-ps", "txd3-skew-ps" in ksz9031_config_init()
823 static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; in ksz9031_config_init()
835 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
837 of_node = dev_walker->of_node; in ksz9031_config_init()
838 dev_walker = dev_walker->parent; in ksz9031_config_init()
866 if (update && phydev->interface != PHY_INTERFACE_MODE_RGMII) in ksz9031_config_init()
868 "*-skew-ps values should be used only with phy-mode = \"rgmii\"\n"); in ksz9031_config_init()
871 * When the device links in the 1000BASE-T slave mode only, in ksz9031_config_init()
885 if (of_property_read_bool(of_node, "micrel,force-master")) { in ksz9031_config_init()
915 int val[4] = {-(1 + KSZ9131_OFFSET), -(2 + KSZ9131_OFFSET), in ksz9131_of_load_skew_values()
916 -(3 + KSZ9131_OFFSET), -(4 + KSZ9131_OFFSET)}; in ksz9131_of_load_skew_values()
932 if (skewval < -KSZ9131_OFFSET) in ksz9131_of_load_skew_values()
933 skewval = -KSZ9131_OFFSET; in ksz9131_of_load_skew_values()
951 if (val[i] != -(i + 1 + KSZ9131_OFFSET)) { in ksz9131_of_load_skew_values()
974 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1009 char *clk_skews[2] = {"rxc-skew-psec", "txc-skew-psec"}; in ksz9131_config_init()
1011 "rxd0-skew-psec", "rxd1-skew-psec", in ksz9131_config_init()
1012 "rxd2-skew-psec", "rxd3-skew-psec" in ksz9131_config_init()
1015 "txd0-skew-psec", "txd1-skew-psec", in ksz9131_config_init()
1016 "txd2-skew-psec", "txd3-skew-psec" in ksz9131_config_init()
1018 char *control_skews[2] = {"txen-skew-psec", "rxdv-skew-psec"}; in ksz9131_config_init()
1022 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1024 of_node = dev_walker->of_node; in ksz9131_config_init()
1025 dev_walker = dev_walker->parent; in ksz9131_config_init()
1077 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1079 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1082 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1084 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1086 phydev->link = 1; in ksz8873mll_read_status()
1087 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1102 * link-up may fail after a link-up to link-down transition. in ksz9031_get_features()
1109 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1114 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1134 phydev->link = 0; in ksz9031_read_status()
1135 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1136 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1158 * counter intuitive, the "-X" in "1 = Force MDI" in the data in ksz886x_config_mdix()
1160 * 1 = Force MDI (sic!) (transmit on RX+/RX- pins) in ksz886x_config_mdix()
1161 * 0 = Normal operation (transmit on TX+/TX- pins) in ksz886x_config_mdix()
1186 /* The MDI-X configuration is automatically changed by the PHY after in ksz886x_config_aneg()
1187 * switching from autoneg off to on. So, take MDI-X configuration under in ksz886x_config_aneg()
1190 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1203 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1205 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1207 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1216 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1218 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1252 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1260 val = val & ((1 << stat.bits) - 1); in kszphy_get_stat()
1261 priv->stats[i] += val; in kszphy_get_stat()
1262 ret = priv->stats[i]; in kszphy_get_stat()
1281 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1282 if (phydev->drv->config_intr) in kszphy_suspend()
1283 phydev->drv->config_intr(phydev); in kszphy_suspend()
1295 /* After switching from power-down to normal mode, an internal global in kszphy_resume()
1307 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1308 if (phydev->drv->config_intr) in kszphy_resume()
1309 phydev->drv->config_intr(phydev); in kszphy_resume()
1317 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1318 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1323 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
1325 return -ENOMEM; in kszphy_probe()
1327 phydev->priv = priv; in kszphy_probe()
1329 priv->type = type; in kszphy_probe()
1331 if (type->led_mode_reg) { in kszphy_probe()
1332 ret = of_property_read_u32(np, "micrel,led-mode", in kszphy_probe()
1333 &priv->led_mode); in kszphy_probe()
1335 priv->led_mode = -1; in kszphy_probe()
1337 if (priv->led_mode > 3) { in kszphy_probe()
1339 priv->led_mode); in kszphy_probe()
1340 priv->led_mode = -1; in kszphy_probe()
1343 priv->led_mode = -1; in kszphy_probe()
1346 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
1352 priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel; in kszphy_probe()
1354 "micrel,rmii-reference-clock-select-25-mhz"); in kszphy_probe()
1357 priv->rmii_ref_clk_sel_val = rmii_ref_clk_sel_25_mhz; in kszphy_probe()
1359 priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz; in kszphy_probe()
1363 return -EINVAL; in kszphy_probe()
1368 phydev->port = PORT_FIBRE; in kszphy_probe()
1370 /* Support legacy board-file configuration */ in kszphy_probe()
1371 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
1372 priv->rmii_ref_clk_sel = true; in kszphy_probe()
1373 priv->rmii_ref_clk_sel_val = true; in kszphy_probe()
1381 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
1382 return -EOPNOTSUPP; in ksz886x_cable_test_start()
1386 * confuse the internal state machine - disable auto neg here. in ksz886x_cable_test_start()
1457 * We can workaround this limitation by using the MDI-X functionality. in ksz886x_cable_test_one_pair()
1464 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
1472 ret = -ENODEV; in ksz886x_cable_test_one_pair()
1494 return -EAGAIN; in ksz886x_cable_test_one_pair()
1518 while (pair_mask && retries--) { in ksz886x_cable_test_get_status()
1521 if (ret == -EAGAIN) in ksz886x_cable_test_get_status()