Lines Matching +full:ps +full:- +full:speed

1 // SPDX-License-Identifier: GPL-2.0+
9 * Copyright (c) 2010-2013 Micrel, Inc.
131 * The value is calculated as following: (1/1000000)/((2^-32)/4)
137 * The value is calculated as following: (1/1000000)/((2^-32)/8)
566 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
570 if (type && type->interrupt_level_mask) in kszphy_config_intr()
571 mask = type->interrupt_level_mask; in kszphy_config_intr()
583 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
646 return -EINVAL; in kszphy_setup_led()
666 * unique (non-broadcast) address on a shared bus.
707 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
710 if (priv->rmii_ref_clk_sel) { in kszphy_config_reset()
711 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
719 if (priv->type && priv->led_mode >= 0) in kszphy_config_reset()
720 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
727 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
733 type = priv->type; in kszphy_config_init()
735 if (type && type->has_broadcast_disable) in kszphy_config_init()
738 if (type && type->has_nand_tree_disable) in kszphy_config_init()
746 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
748 return of_property_read_bool(of_node, "micrel,fiber-mode"); in ksz8041_fiber_mode()
757 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
761 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
763 phydev->supported); in ksz8041_config_init()
764 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
766 phydev->advertising); in ksz8041_config_init()
767 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
775 /* Skip auto-negotiation in fiber mode */ in ksz8041_config_aneg()
776 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
777 phydev->speed = SPEED_100; in ksz8041_config_aneg()
789 if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK)) in ksz8051_ksz8795_match_phy_device()
816 /* KSZPHY_OMSO_FACTORY_TEST is set at de-assertion of the reset line in ksz8081_config_init()
818 * pull-down is missing, the factory test mode should be cleared by in ksz8081_config_init()
860 /* The MDI-X configuration is automatically changed by the PHY after in ksz8081_config_aneg()
861 * switching from autoneg off to on. So, take MDI-X configuration under in ksz8081_config_aneg()
864 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
877 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
879 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
881 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
889 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
891 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
941 int val1 = -1; in ksz9021_load_values_from_of()
942 int val2 = -2; in ksz9021_load_values_from_of()
943 int val3 = -3; in ksz9021_load_values_from_of()
944 int val4 = -4; in ksz9021_load_values_from_of()
968 if (val1 != -1) in ksz9021_load_values_from_of()
971 if (val2 != -2) in ksz9021_load_values_from_of()
974 if (val3 != -3) in ksz9021_load_values_from_of()
977 if (val4 != -4) in ksz9021_load_values_from_of()
992 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
994 of_node = dev_walker->of_node; in ksz9021_config_init()
995 dev_walker = dev_walker->parent; in ksz9021_config_init()
1002 "txen-skew-ps", "txc-skew-ps", in ksz9021_config_init()
1003 "rxdv-skew-ps", "rxc-skew-ps"); in ksz9021_config_init()
1006 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9021_config_init()
1007 "rxd2-skew-ps", "rxd3-skew-ps"); in ksz9021_config_init()
1010 "txd0-skew-ps", "txd1-skew-ps", in ksz9021_config_init()
1011 "txd2-skew-ps", "txd3-skew-ps"); in ksz9021_config_init()
1054 /* set rx to +0.30ns and rx_clk to -0.90ns to compensate the
1060 /* set tx to -0.42ns and tx_clk to +0.96ns to get 1.38ns delay */
1075 int speed) in ksz9031_set_loopback() argument
1083 if (speed == SPEED_10 || speed == SPEED_100 || speed == SPEED_1000) in ksz9031_set_loopback()
1084 phydev->speed = speed; in ksz9031_set_loopback()
1085 else if (speed) in ksz9031_set_loopback()
1086 return -EINVAL; in ksz9031_set_loopback()
1087 phydev->duplex = DUPLEX_FULL; in ksz9031_set_loopback()
1089 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in ksz9031_set_loopback()
1103 int val[4] = {-1, -2, -3, -4}; in ksz9031_of_load_skew_values()
1126 if (val[i] != -(i + 1)) { in ksz9031_of_load_skew_values()
1155 /* Enable energy-detect power-down mode */
1172 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
1231 static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; in ksz9031_config_init()
1233 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9031_config_init()
1234 "rxd2-skew-ps", "rxd3-skew-ps" in ksz9031_config_init()
1237 "txd0-skew-ps", "txd1-skew-ps", in ksz9031_config_init()
1238 "txd2-skew-ps", "txd3-skew-ps" in ksz9031_config_init()
1240 static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; in ksz9031_config_init()
1252 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1254 of_node = dev_walker->of_node; in ksz9031_config_init()
1255 dev_walker = dev_walker->parent; in ksz9031_config_init()
1285 "*-skew-ps values should be used only with RGMII PHY modes\n"); in ksz9031_config_init()
1288 * When the device links in the 1000BASE-T slave mode only, in ksz9031_config_init()
1302 if (of_property_read_bool(of_node, "micrel,force-master")) { in ksz9031_config_init()
1332 int val[4] = {-(1 + KSZ9131_OFFSET), -(2 + KSZ9131_OFFSET), in ksz9131_of_load_skew_values()
1333 -(3 + KSZ9131_OFFSET), -(4 + KSZ9131_OFFSET)}; in ksz9131_of_load_skew_values()
1349 if (skewval < -KSZ9131_OFFSET) in ksz9131_of_load_skew_values()
1350 skewval = -KSZ9131_OFFSET; in ksz9131_of_load_skew_values()
1368 if (val[i] != -(i + 1 + KSZ9131_OFFSET)) { in ksz9131_of_load_skew_values()
1386 const struct kszphy_type *type = phydev->drv->driver_data; in ksz9131_config_rgmii_delay()
1390 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1392 rxcdll_val = type->disable_dll_rx_bit; in ksz9131_config_rgmii_delay()
1393 txcdll_val = type->disable_dll_tx_bit; in ksz9131_config_rgmii_delay()
1401 txcdll_val = type->disable_dll_tx_bit; in ksz9131_config_rgmii_delay()
1404 rxcdll_val = type->disable_dll_rx_bit; in ksz9131_config_rgmii_delay()
1412 KSZ9131RN_RXC_DLL_CTRL, type->disable_dll_mask, in ksz9131_config_rgmii_delay()
1418 KSZ9131RN_TXC_DLL_CTRL, type->disable_dll_mask, in ksz9131_config_rgmii_delay()
1424 * When LEDs are configured in Individual Mode, LED1 is ON in a no-link
1445 char *clk_skews[2] = {"rxc-skew-psec", "txc-skew-psec"}; in ksz9131_config_init()
1447 "rxd0-skew-psec", "rxd1-skew-psec", in ksz9131_config_init()
1448 "rxd2-skew-psec", "rxd3-skew-psec" in ksz9131_config_init()
1451 "txd0-skew-psec", "txd1-skew-psec", in ksz9131_config_init()
1452 "txd2-skew-psec", "txd3-skew-psec" in ksz9131_config_init()
1454 char *control_skews[2] = {"txen-skew-psec", "rxdv-skew-psec"}; in ksz9131_config_init()
1458 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9131_config_init()
1460 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1462 of_node = dev_walker->of_node; in ksz9131_config_init()
1463 dev_walker = dev_walker->parent; in ksz9131_config_init()
1517 if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) { in ksz9131_mdix_update()
1518 phydev->mdix = phydev->mdix_ctrl; in ksz9131_mdix_update()
1526 phydev->mdix = ETH_TP_MDI; in ksz9131_mdix_update()
1528 phydev->mdix = ETH_TP_MDI_X; in ksz9131_mdix_update()
1530 phydev->mdix = ETH_TP_MDI_INVALID; in ksz9131_mdix_update()
1576 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9131_config_aneg()
1597 linkmode_and(phydev->supported_eee, phydev->supported, in ksz9477_get_features()
1616 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1618 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1621 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1623 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1625 phydev->link = 1; in ksz8873mll_read_status()
1626 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1641 * link-up may fail after a link-up to link-down transition. in ksz9031_get_features()
1648 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1653 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1673 phydev->link = 0; in ksz9031_read_status()
1674 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1675 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1684 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1687 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_start()
1688 * Prior to running the cable diagnostics, Auto-negotiation should in ksz9x31_cable_test_start()
1689 * be disabled, full duplex set and the link speed set to 1000Mbps in ksz9x31_cable_test_start()
1699 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_start()
1700 * The Master-Slave configuration should be set to Slave by writing in ksz9x31_cable_test_start()
1701 * a value of 0x1000 to the Auto-Negotiation Master Slave Control in ksz9x31_cable_test_start()
1709 priv->vct_ctrl1000 = ret & (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER); in ksz9x31_cable_test_start()
1754 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_fault_length()
1756 * distance to fault = (VCT_DATA - 22) * 4 / cable propagation velocity in ksz9x31_cable_test_fault_length()
1760 dt = clamp(dt - 22, 0, 255); in ksz9x31_cable_test_fault_length()
1792 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_one_pair()
1813 return -EAGAIN; in ksz9x31_cable_test_one_pair()
1832 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1840 phydev->supported) || in ksz9x31_cable_test_get_status()
1842 phydev->supported)) in ksz9x31_cable_test_get_status()
1848 while (pair_mask && retries--) { in ksz9x31_cable_test_get_status()
1851 if (ret == -EAGAIN) in ksz9x31_cable_test_get_status()
1877 priv->vct_ctrl1000); in ksz9x31_cable_test_get_status()
1899 * counter intuitive, the "-X" in "1 = Force MDI" in the data in ksz886x_config_mdix()
1901 * 1 = Force MDI (sic!) (transmit on RX+/RX- pins) in ksz886x_config_mdix()
1902 * 0 = Normal operation (transmit on TX+/TX- pins) in ksz886x_config_mdix()
1927 if (phydev->autoneg != AUTONEG_ENABLE) { in ksz886x_config_aneg()
1949 /* The MDI-X configuration is automatically changed by the PHY after in ksz886x_config_aneg()
1950 * switching from autoneg off to on. So, take MDI-X configuration under in ksz886x_config_aneg()
1953 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1966 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1968 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1970 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1979 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1981 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1999 if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) in ksz9477_mdix_update()
2000 phydev->mdix = phydev->mdix_ctrl; in ksz9477_mdix_update()
2002 phydev->mdix = ETH_TP_MDI_INVALID; in ksz9477_mdix_update()
2016 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9477_read_mdix_ctrl()
2018 phydev->mdix_ctrl = ETH_TP_MDI; in ksz9477_read_mdix_ctrl()
2020 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz9477_read_mdix_ctrl()
2040 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9477_config_aneg()
2063 /* Transmit waveform amplitude can be improved (1000BASE-T, 100BASE-TX, 10BASE-Te) */
2092 * necessary to set the PHY to 100 Mbps speed with auto-negotiation in ksz9477_phy_errata()
2093 * disabled by writing to register 0xN100-0xN101. After writing the in ksz9477_phy_errata()
2095 * register settings, write register 0xN100-0xN101 again to enable in ksz9477_phy_errata()
2096 * and restart auto-negotiation. in ksz9477_phy_errata()
2105 err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val); in ksz9477_phy_errata()
2118 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_config_init()
2124 /* Read initial MDI-X config state. So, we do not need to poll it in ksz9477_config_init()
2150 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
2158 val = val & ((1 << stat.bits) - 1); in kszphy_get_stat()
2159 priv->stats[i] += val; in kszphy_get_stat()
2160 ret = priv->stats[i]; in kszphy_get_stat()
2183 struct kszphy_priv *priv = phydev->priv; in kszphy_update_stats()
2190 priv->phy_stats.rx_err_pkt_cnt += ret; in kszphy_update_stats()
2199 struct kszphy_priv *priv = phydev->priv; in kszphy_get_phy_stats()
2201 stats->rx_errors = priv->phy_stats.rx_err_pkt_cnt; in kszphy_get_phy_stats()
2204 /* Base register for Signal Quality Indicator (SQI) - Channel A
2233 /* The hardware SQI register provides a raw value from 0-127, where a lower
2235 * shown that only the 0-7 range is relevant for a functional link. A raw
2238 * pre-failure state.
2240 * This table provides a non-linear mapping from the useful raw hardware
2241 * values (0-7) to the standard 0-7 SQI scale, where higher is better.
2244 7, /* raw 0 -> SQI 7 */
2245 7, /* raw 1 -> SQI 7 */
2246 6, /* raw 2 -> SQI 6 */
2247 5, /* raw 3 -> SQI 5 */
2248 4, /* raw 4 -> SQI 4 */
2249 3, /* raw 5 -> SQI 3 */
2250 2, /* raw 6 -> SQI 2 */
2251 1, /* raw 7 -> SQI 1 */
2255 * kszphy_get_sqi - Read, average, and map Signal Quality Index (SQI)
2260 * pre-failure state and is mapped to SQI 0. Raw values from 0-7 are
2261 * mapped to the standard 0-7 SQI scale via a lookup table.
2272 /* Determine applicable channels based on link speed */ in kszphy_get_sqi()
2273 if (phydev->speed == SPEED_1000) in kszphy_get_sqi()
2275 else if (phydev->speed == SPEED_100) in kszphy_get_sqi()
2278 return -EOPNOTSUPP; in kszphy_get_sqi()
2283 * - The SQI register is updated every 2 µs. in kszphy_get_sqi()
2284 * - Values may fluctuate significantly, even in low-noise environments. in kszphy_get_sqi()
2285 * - For reliable estimation, average a minimum of 30–50 samples in kszphy_get_sqi()
2287 * - In noisy environments, individual readings are highly unreliable. in kszphy_get_sqi()
2315 /* Handle the pre-fail/failed state first. */ in kszphy_get_sqi()
2338 * - 1000BASE-T: per-pair SQI registers exist => expose A..D in kszphy_get_mse_capability()
2340 * - 100BASE-TX: HW provides a single MSE/SQI reading in the "channel A" in kszphy_get_mse_capability()
2341 * register, but with auto MDI-X there is no MDI-X resolution bit, in kszphy_get_mse_capability()
2343 * To avoid misleading per-channel data, advertise only LINK. in kszphy_get_mse_capability()
2348 * by scanning per-channel readouts (A..D) and picking the in kszphy_get_mse_capability()
2351 if (phydev->speed == SPEED_1000) in kszphy_get_mse_capability()
2352 cap->supported_caps = PHY_MSE_CAP_CHANNEL_A | in kszphy_get_mse_capability()
2357 else if (phydev->speed == SPEED_100) in kszphy_get_mse_capability()
2358 cap->supported_caps = PHY_MSE_CAP_LINK; in kszphy_get_mse_capability()
2360 return -EOPNOTSUPP; in kszphy_get_mse_capability()
2362 cap->max_average_mse = FIELD_MAX(KSZ9477_MMD_SQI_MASK); in kszphy_get_mse_capability()
2363 cap->refresh_rate_ps = 2000000; /* 2 us */ in kszphy_get_mse_capability()
2367 cap->num_symbols = 250; in kszphy_get_mse_capability()
2369 cap->supported_caps |= PHY_MSE_CAP_AVG; in kszphy_get_mse_capability()
2381 if (phydev->speed == SPEED_1000) in kszphy_get_mse_snapshot()
2383 else if (phydev->speed == SPEED_100) in kszphy_get_mse_snapshot()
2386 return -EOPNOTSUPP; in kszphy_get_mse_snapshot()
2393 * average MSE across the available per-channel registers. in kszphy_get_mse_snapshot()
2394 * Only defined when multiple channels exist (1000BASE-T). in kszphy_get_mse_snapshot()
2397 return -EOPNOTSUPP; in kszphy_get_mse_snapshot()
2409 snapshot->average_mse = worst_val; in kszphy_get_mse_snapshot()
2415 snapshot->average_mse = FIELD_GET(KSZ9477_MMD_SQI_MASK, ret); in kszphy_get_mse_snapshot()
2418 /* Per-channel readouts are valid only for 1000BASE-T. */ in kszphy_get_mse_snapshot()
2419 if (phydev->speed != SPEED_1000) in kszphy_get_mse_snapshot()
2420 return -EOPNOTSUPP; in kszphy_get_mse_snapshot()
2426 snapshot->average_mse = FIELD_GET(KSZ9477_MMD_SQI_MASK, ret); in kszphy_get_mse_snapshot()
2428 return -EOPNOTSUPP; in kszphy_get_mse_snapshot()
2436 struct kszphy_priv *priv = phydev->priv; in kszphy_enable_clk()
2438 if (!priv->clk_enable && priv->clk) { in kszphy_enable_clk()
2439 clk_prepare_enable(priv->clk); in kszphy_enable_clk()
2440 priv->clk_enable = true; in kszphy_enable_clk()
2446 struct kszphy_priv *priv = phydev->priv; in kszphy_disable_clk()
2448 if (priv->clk_enable && priv->clk) { in kszphy_disable_clk()
2449 clk_disable_unprepare(priv->clk); in kszphy_disable_clk()
2450 priv->clk_enable = false; in kszphy_disable_clk()
2478 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
2479 if (phydev->drv->config_intr) in kszphy_suspend()
2480 phydev->drv->config_intr(phydev); in kszphy_suspend()
2488 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
2489 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
2490 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
2493 if (type && type->led_mode_reg) { in kszphy_parse_led_mode()
2494 ret = of_property_read_u32(np, "micrel,led-mode", in kszphy_parse_led_mode()
2495 &priv->led_mode); in kszphy_parse_led_mode()
2498 priv->led_mode = -1; in kszphy_parse_led_mode()
2500 if (priv->led_mode > 3) { in kszphy_parse_led_mode()
2502 priv->led_mode); in kszphy_parse_led_mode()
2503 priv->led_mode = -1; in kszphy_parse_led_mode()
2506 priv->led_mode = -1; in kszphy_parse_led_mode()
2518 /* After switching from power-down to normal mode, an internal global in kszphy_resume()
2530 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
2531 if (phydev->drv->config_intr) in kszphy_resume()
2532 phydev->drv->config_intr(phydev); in kszphy_resume()
2569 /* After switching from power-down to normal mode, an internal global in ksz9477_resume()
2576 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_resume()
2584 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz9477_resume()
2585 if (phydev->drv->config_intr) in ksz9477_resume()
2586 phydev->drv->config_intr(phydev); in ksz9477_resume()
2609 /* Re-program the value after chip is reset. */ in ksz8061_resume()
2616 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz8061_resume()
2617 if (phydev->drv->config_intr) in ksz8061_resume()
2618 phydev->drv->config_intr(phydev); in ksz8061_resume()
2631 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
2632 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
2636 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
2638 return -ENOMEM; in kszphy_probe()
2640 phydev->priv = priv; in kszphy_probe()
2642 priv->type = type; in kszphy_probe()
2646 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
2653 priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel; in kszphy_probe()
2655 "micrel,rmii-reference-clock-select-25-mhz"); in kszphy_probe()
2658 priv->rmii_ref_clk_sel_val = rmii_ref_clk_sel_25_mhz; in kszphy_probe()
2660 priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz; in kszphy_probe()
2664 return -EINVAL; in kszphy_probe()
2667 /* unnamed clock from the generic ethernet-phy binding */ in kszphy_probe()
2668 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); in kszphy_probe()
2675 priv->clk = clk; in kszphy_probe()
2678 phydev->port = PORT_FIBRE; in kszphy_probe()
2680 /* Support legacy board-file configuration */ in kszphy_probe()
2681 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
2682 priv->rmii_ref_clk_sel = true; in kszphy_probe()
2683 priv->rmii_ref_clk_sel_val = true; in kszphy_probe()
2693 * confuse the internal state machine - disable auto neg here. in lan8814_cable_test_start()
2694 * Set the speed to 1000mbit and full duplex. in lan8814_cable_test_start()
2702 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
2703 return -EOPNOTSUPP; in ksz886x_cable_test_start()
2707 * confuse the internal state machine - disable auto neg here. in ksz886x_cable_test_start()
2708 * If autoneg is disabled, we should set the speed to 10mbit. in ksz886x_cable_test_start()
2753 * (DELTA_TIME - 22) * 0.8 for lan8814 phy. in ksz886x_cable_test_fault_length()
2758 return ((dt - 22) * 800) / 10; in ksz886x_cable_test_fault_length()
2765 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
2768 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
2802 return -EAGAIN; in lan8814_cable_test_one_pair()
2830 * We can workaround this limitation by using the MDI-X functionality. in ksz886x_cable_test_one_pair()
2837 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
2845 ret = -ENODEV; in ksz886x_cable_test_one_pair()
2867 return -EAGAIN; in ksz886x_cable_test_one_pair()
2885 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2886 unsigned long pair_mask = type->pair_mask; in ksz886x_cable_test_get_status()
2894 while (pair_mask && retries--) { in ksz886x_cable_test_get_status()
2896 if (type->cable_diag_reg == LAN8814_CABLE_DIAG) in ksz886x_cable_test_get_status()
2900 if (ret == -EAGAIN) in ksz886x_cable_test_get_status()
2920 * LAN8814_PAGE_PCS - Selects Extended Page 0.
2922 * This page contains timers used for auto-negotiation, debug registers and
2928 * LAN8814_PAGE_AFE_PMA - Selects Extended Page 1.
2930 * This page appears to control the Analog Front-End (AFE) and Physical
2937 * LAN8814_PAGE_PCS_DIGITAL - Selects Extended Page 2.
2940 * digital logic. It is used for MDI-X alignment (LAN8814_ALIGN_SWAP) and EEE
2942 * and self-test counters in the LAN8842.
2947 * LAN8814_PAGE_EEE - Selects Extended Page 3.
2954 * LAN8814_PAGE_COMMON_REGS - Selects Extended Page 4.
2956 * This page contains device-common registers that affect the entire chip.
2957 * It includes controls for chip-level resets, strap status, GPIO,
2963 * LAN8814_PAGE_PORT_REGS - Selects Extended Page 5.
2965 * This page contains port-specific registers that must be accessed
2966 * on a per-port basis. It includes controls for port LEDs, QSGMII PCS,
2967 * rate adaptation FIFOs, and the per-port 1588 TSU block.
2972 * LAN8814_PAGE_POWER_REGS - Selects Extended Page 28.
2979 * LAN8814_PAGE_SYSTEM_CTRL - Selects Extended Page 31.
3115 struct lan8814_shared_priv *shared = phy_package_get_priv(ptp_priv->phydev); in lan8814_ts_info()
3117 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in lan8814_ts_info()
3121 info->phc_index = ptp_clock_index(shared->ptp_clock); in lan8814_ts_info()
3123 info->tx_types = in lan8814_ts_info()
3128 info->rx_filters = in lan8814_ts_info()
3160 ptp_priv->hwts_tx_type = config->tx_type; in lan8814_hwtstamp_set()
3161 ptp_priv->rx_filter = config->rx_filter; in lan8814_hwtstamp_set()
3163 switch (config->rx_filter) { in lan8814_hwtstamp_set()
3165 ptp_priv->layer = 0; in lan8814_hwtstamp_set()
3166 ptp_priv->version = 0; in lan8814_hwtstamp_set()
3171 ptp_priv->layer = PTP_CLASS_L4; in lan8814_hwtstamp_set()
3172 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp_set()
3177 ptp_priv->layer = PTP_CLASS_L2; in lan8814_hwtstamp_set()
3178 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp_set()
3183 ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2; in lan8814_hwtstamp_set()
3184 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp_set()
3187 return -ERANGE; in lan8814_hwtstamp_set()
3190 if (ptp_priv->layer & PTP_CLASS_L2) { in lan8814_hwtstamp_set()
3193 } else if (ptp_priv->layer & PTP_CLASS_L4) { in lan8814_hwtstamp_set()
3197 lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3199 lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3204 lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3206 lanphy_write_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3209 if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC) { in lan8814_hwtstamp_set()
3210 lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3214 } else if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ON) { in lan8814_hwtstamp_set()
3215 lanphy_modify_page_reg(ptp_priv->phydev, LAN8814_PAGE_PORT_REGS, in lan8814_hwtstamp_set()
3221 if (config->rx_filter != HWTSTAMP_FILTER_NONE) in lan8814_hwtstamp_set()
3222 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp_set()
3224 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp_set()
3227 list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) { in lan8814_hwtstamp_set()
3228 list_del(&rx_ts->list); in lan8814_hwtstamp_set()
3231 skb_queue_purge(&ptp_priv->rx_queue); in lan8814_hwtstamp_set()
3232 skb_queue_purge(&ptp_priv->tx_queue); in lan8814_hwtstamp_set()
3234 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp_set()
3235 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp_set()
3245 switch (ptp_priv->hwts_tx_type) { in lan8814_txtstamp()
3253 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in lan8814_txtstamp()
3254 skb_queue_tail(&ptp_priv->tx_queue, skb); in lan8814_txtstamp()
3276 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in lan8814_get_sig_rx()
3293 spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_skb()
3294 list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) { in lan8814_match_rx_skb()
3296 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id))) in lan8814_match_rx_skb()
3301 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, in lan8814_match_rx_skb()
3302 rx_ts->nsec); in lan8814_match_rx_skb()
3303 list_del(&rx_ts->list); in lan8814_match_rx_skb()
3309 spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_skb()
3321 if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE || in lan8814_rxtstamp()
3325 if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0) in lan8814_rxtstamp()
3332 skb_queue_tail(&ptp_priv->rx_queue, skb); in lan8814_rxtstamp()
3382 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64()
3386 mutex_lock(&shared->shared_lock); in lan8814_ptpci_gettime64()
3388 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_gettime64()
3389 ts->tv_sec = seconds; in lan8814_ptpci_gettime64()
3390 ts->tv_nsec = nano_seconds; in lan8814_ptpci_gettime64()
3400 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64()
3402 mutex_lock(&shared->shared_lock); in lan8814_ptpci_settime64()
3403 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
3404 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_settime64()
3454 nano_seconds -= 1000000000; in lan8814_ptp_clock_step()
3459 } else if (time_step_ns < -15000000000LL) { in lan8814_ptp_clock_step()
3461 time_step_ns = -time_step_ns; in lan8814_ptp_clock_step()
3464 set_seconds -= div_u64_rem(time_step_ns, 1000000000LL, in lan8814_ptp_clock_step()
3468 set_seconds--; in lan8814_ptp_clock_step()
3471 nano_seconds -= nano_seconds_step; in lan8814_ptp_clock_step()
3484 abs_time_step_ns = (u64)(-time_step_ns); in lan8814_ptp_clock_step()
3485 seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000, in lan8814_ptp_clock_step()
3493 seconds--; in lan8814_ptp_clock_step()
3494 nano_seconds = (1000000000 - nano_seconds); in lan8814_ptp_clock_step()
3506 nano_seconds -= 1000000000; in lan8814_ptp_clock_step()
3529 seconds -= ((s32)adjustment_value); in lan8814_ptp_clock_step()
3532 set_seconds -= adjustment_value; in lan8814_ptp_clock_step()
3535 u32 adjustment_value = (u32)(-seconds); in lan8814_ptp_clock_step()
3582 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime()
3584 mutex_lock(&shared->shared_lock); in lan8814_ptpci_adjtime()
3586 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_adjtime()
3595 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine()
3601 scaled_ppm = -scaled_ppm; in lan8814_ptpci_adjfine()
3614 mutex_lock(&shared->shared_lock); in lan8814_ptpci_adjfine()
3619 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_adjfine()
3718 struct phy_device *phydev = shared->phydev; in lan8814_ptp_perout()
3724 mutex_lock(&shared->shared_lock); in lan8814_ptp_perout()
3725 event = rq->perout.index; in lan8814_ptp_perout()
3726 pin = ptp_find_pin(shared->ptp_clock, PTP_PF_PEROUT, event); in lan8814_ptp_perout()
3728 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3729 return -EBUSY; in lan8814_ptp_perout()
3735 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3739 ts_on.tv_sec = rq->perout.on.sec; in lan8814_ptp_perout()
3740 ts_on.tv_nsec = rq->perout.on.nsec; in lan8814_ptp_perout()
3743 ts_period.tv_sec = rq->perout.period.sec; in lan8814_ptp_perout()
3744 ts_period.tv_nsec = rq->perout.period.nsec; in lan8814_ptp_perout()
3750 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3751 return -EOPNOTSUPP; in lan8814_ptp_perout()
3757 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3758 return -EINVAL; in lan8814_ptp_perout()
3813 lan8814_ptp_set_target(phydev, event, rq->perout.start.sec, in lan8814_ptp_perout()
3814 rq->perout.start.nsec); in lan8814_ptp_perout()
3815 lan8814_ptp_set_reload(phydev, event, rq->perout.period.sec, in lan8814_ptp_perout()
3816 rq->perout.period.nsec); in lan8814_ptp_perout()
3818 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3890 struct phy_device *phydev = shared->phydev; in lan8814_ptp_extts()
3893 pin = ptp_find_pin(shared->ptp_clock, PTP_PF_EXTTS, in lan8814_ptp_extts()
3894 rq->extts.index); in lan8814_ptp_extts()
3895 if (pin == -1 || pin != LAN8814_PTP_EXTTS_NUM) in lan8814_ptp_extts()
3896 return -EINVAL; in lan8814_ptp_extts()
3898 mutex_lock(&shared->shared_lock); in lan8814_ptp_extts()
3900 lan8814_ptp_extts_on(phydev, pin, rq->extts.flags); in lan8814_ptp_extts()
3904 mutex_unlock(&shared->shared_lock); in lan8814_ptp_extts()
3912 switch (rq->type) { in lan8814_ptpci_enable()
3918 return -EINVAL; in lan8814_ptpci_enable()
3933 return -1; in lan8814_ptpci_verify()
3937 return -1; in lan8814_ptpci_verify()
3940 return -1; in lan8814_ptpci_verify()
3957 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in lan8814_get_sig_tx()
3970 spin_lock_irqsave(&ptp_priv->tx_queue.lock, flags); in lan8814_match_tx_skb()
3971 skb_queue_walk_safe(&ptp_priv->tx_queue, skb, skb_tmp) { in lan8814_match_tx_skb()
3978 __skb_unlink(skb, &ptp_priv->tx_queue); in lan8814_match_tx_skb()
3982 spin_unlock_irqrestore(&ptp_priv->tx_queue.lock, flags); in lan8814_match_tx_skb()
3993 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb()
4003 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts()
4026 spin_lock_irqsave(&ptp_priv->rx_queue.lock, flags); in lan8814_match_skb()
4027 skb_queue_walk_safe(&ptp_priv->rx_queue, skb, skb_tmp) { in lan8814_match_skb()
4031 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id))) in lan8814_match_skb()
4034 __skb_unlink(skb, &ptp_priv->rx_queue); in lan8814_match_skb()
4039 spin_unlock_irqrestore(&ptp_priv->rx_queue.lock, flags); in lan8814_match_skb()
4044 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec); in lan8814_match_skb()
4060 spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_ts()
4061 list_add(&rx_ts->list, &ptp_priv->rx_ts_list); in lan8814_match_rx_ts()
4062 spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_ts()
4070 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts()
4079 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
4080 &rx_ts->seq_id); in lan8814_get_rx_ts()
4093 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
4094 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8814_handle_ptp_interrupt()
4104 skb_queue_purge(&ptp_priv->tx_queue); in lan8814_handle_ptp_interrupt()
4109 skb_queue_purge(&ptp_priv->rx_queue); in lan8814_handle_ptp_interrupt()
4115 struct phy_device *phydev = shared->phydev; in lan8814_gpio_process_cap()
4132 return -1; in lan8814_gpio_process_cap()
4163 ptp_clock_event(shared->ptp_clock, &ptp_event); in lan8814_gpio_process_cap()
4173 mutex_lock(&shared->shared_lock); in lan8814_handle_gpio_interrupt()
4175 mutex_unlock(&shared->shared_lock); in lan8814_handle_gpio_interrupt()
4182 /* MDI-X setting for swap A,B transmit */ in lan8804_config_init()
4229 /* By default interrupt buffer is open-drain in which case the interrupt in lan8804_config_intr()
4231 * push-pull to be able to change interrupt polarity in lan8804_config_intr()
4236 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
4263 struct kszphy_priv *priv = phydev->priv; in lan8814_has_ptp()
4265 return priv->is_ptp_available; in lan8814_has_ptp()
4322 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
4341 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
4342 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8814_ptp_init()
4383 skb_queue_head_init(&ptp_priv->tx_queue); in lan8814_ptp_init()
4384 skb_queue_head_init(&ptp_priv->rx_queue); in lan8814_ptp_init()
4385 INIT_LIST_HEAD(&ptp_priv->rx_ts_list); in lan8814_ptp_init()
4386 spin_lock_init(&ptp_priv->rx_ts_lock); in lan8814_ptp_init()
4388 ptp_priv->phydev = phydev; in lan8814_ptp_init()
4390 ptp_priv->mii_ts.rxtstamp = lan8814_rxtstamp; in lan8814_ptp_init()
4391 ptp_priv->mii_ts.txtstamp = lan8814_txtstamp; in lan8814_ptp_init()
4392 ptp_priv->mii_ts.hwtstamp_set = lan8814_hwtstamp_set; in lan8814_ptp_init()
4393 ptp_priv->mii_ts.ts_info = lan8814_ts_info; in lan8814_ptp_init()
4395 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
4398 phydev->default_timestamp = true; in lan8814_ptp_init()
4406 shared->phydev = phydev; in __lan8814_ptp_probe_once()
4409 mutex_init(&shared->shared_lock); in __lan8814_ptp_probe_once()
4411 shared->pin_config = devm_kmalloc_array(&phydev->mdio.dev, in __lan8814_ptp_probe_once()
4413 sizeof(*shared->pin_config), in __lan8814_ptp_probe_once()
4415 if (!shared->pin_config) in __lan8814_ptp_probe_once()
4416 return -ENOMEM; in __lan8814_ptp_probe_once()
4419 struct ptp_pin_desc *ptp_pin = &shared->pin_config[i]; in __lan8814_ptp_probe_once()
4422 snprintf(ptp_pin->name, in __lan8814_ptp_probe_once()
4423 sizeof(ptp_pin->name), "%s_%02d", pin_name, i); in __lan8814_ptp_probe_once()
4424 ptp_pin->index = i; in __lan8814_ptp_probe_once()
4425 ptp_pin->func = PTP_PF_NONE; in __lan8814_ptp_probe_once()
4428 shared->ptp_clock_info.owner = THIS_MODULE; in __lan8814_ptp_probe_once()
4429 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in __lan8814_ptp_probe_once()
4430 shared->ptp_clock_info.max_adj = 31249999; in __lan8814_ptp_probe_once()
4431 shared->ptp_clock_info.n_alarm = 0; in __lan8814_ptp_probe_once()
4432 shared->ptp_clock_info.n_ext_ts = LAN8814_PTP_EXTTS_NUM; in __lan8814_ptp_probe_once()
4433 shared->ptp_clock_info.n_pins = gpios; in __lan8814_ptp_probe_once()
4434 shared->ptp_clock_info.pps = 0; in __lan8814_ptp_probe_once()
4435 shared->ptp_clock_info.supported_extts_flags = PTP_RISING_EDGE | in __lan8814_ptp_probe_once()
4438 shared->ptp_clock_info.supported_perout_flags = PTP_PEROUT_DUTY_CYCLE; in __lan8814_ptp_probe_once()
4439 shared->ptp_clock_info.pin_config = shared->pin_config; in __lan8814_ptp_probe_once()
4440 shared->ptp_clock_info.n_per_out = LAN8814_PTP_PEROUT_NUM; in __lan8814_ptp_probe_once()
4441 shared->ptp_clock_info.adjfine = lan8814_ptpci_adjfine; in __lan8814_ptp_probe_once()
4442 shared->ptp_clock_info.adjtime = lan8814_ptpci_adjtime; in __lan8814_ptp_probe_once()
4443 shared->ptp_clock_info.gettime64 = lan8814_ptpci_gettime64; in __lan8814_ptp_probe_once()
4444 shared->ptp_clock_info.settime64 = lan8814_ptpci_settime64; in __lan8814_ptp_probe_once()
4445 shared->ptp_clock_info.getcrosststamp = NULL; in __lan8814_ptp_probe_once()
4446 shared->ptp_clock_info.enable = lan8814_ptpci_enable; in __lan8814_ptp_probe_once()
4447 shared->ptp_clock_info.verify = lan8814_ptpci_verify; in __lan8814_ptp_probe_once()
4449 shared->ptp_clock = ptp_clock_register(&shared->ptp_clock_info, in __lan8814_ptp_probe_once()
4450 &phydev->mdio.dev); in __lan8814_ptp_probe_once()
4451 if (IS_ERR(shared->ptp_clock)) { in __lan8814_ptp_probe_once()
4453 shared->ptp_clock); in __lan8814_ptp_probe_once()
4454 return -EINVAL; in __lan8814_ptp_probe_once()
4458 if (!shared->ptp_clock) in __lan8814_ptp_probe_once()
4505 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
4511 if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) in lan8814_config_init()
4525 /* MDI-X setting for swap A,B transmit */ in lan8814_config_init()
4530 if (lan8814->led_mode >= 0) in lan8814_config_init()
4531 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
4545 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
4581 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
4586 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
4588 return -ENOMEM; in lan8814_probe()
4590 phydev->priv = priv; in lan8814_probe()
4592 priv->type = type; in lan8814_probe()
4596 /* Strap-in value for PHY address, below register read gives starting in lan8814_probe()
4600 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
4612 priv->is_ptp_available = err == LAN8814_REV_LAN8814 || in lan8814_probe()
4726 /* 10M/100M Ethernet Signal Tuning Errata for Shorted-Center Tap in lan8841_config_init()
4772 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8841_config_intr()
4813 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_get_tx_ts()
4847 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_flush_fifo()
4870 struct phy_device *phydev = ptp_priv->phydev; in lan8841_gpio_process_cap()
4875 pin = ptp_find_pin_unlocked(ptp_priv->ptp_clock, PTP_PF_EXTTS, 0); in lan8841_gpio_process_cap()
4876 if (pin == -1) in lan8841_gpio_process_cap()
4888 mutex_lock(&ptp_priv->ptp_lock); in lan8841_gpio_process_cap()
4906 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_gpio_process_cap()
4914 ptp_clock_event(ptp_priv->ptp_clock, &ptp_event); in lan8841_gpio_process_cap()
4919 struct kszphy_priv *priv = phydev->priv; in lan8841_handle_ptp_interrupt()
4920 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8841_handle_ptp_interrupt()
4934 skb_queue_purge(&ptp_priv->tx_queue); in lan8841_handle_ptp_interrupt()
4975 info->phc_index = ptp_priv->ptp_clock ? in lan8841_ts_info()
4976 ptp_clock_index(ptp_priv->ptp_clock) : -1; in lan8841_ts_info()
4977 if (info->phc_index == -1) in lan8841_ts_info()
4980 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in lan8841_ts_info()
4984 info->tx_types = (1 << HWTSTAMP_TX_OFF) | in lan8841_ts_info()
4988 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in lan8841_ts_info()
5003 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_processing()
5024 ptp_schedule_worker(ptp_priv->ptp_clock, 0); in lan8841_ptp_enable_processing()
5037 ptp_cancel_worker_sync(ptp_priv->ptp_clock); in lan8841_ptp_enable_processing()
5050 struct phy_device *phydev = ptp_priv->phydev; in lan8841_hwtstamp_set()
5054 ptp_priv->hwts_tx_type = config->tx_type; in lan8841_hwtstamp_set()
5055 ptp_priv->rx_filter = config->rx_filter; in lan8841_hwtstamp_set()
5057 switch (config->rx_filter) { in lan8841_hwtstamp_set()
5059 ptp_priv->layer = 0; in lan8841_hwtstamp_set()
5060 ptp_priv->version = 0; in lan8841_hwtstamp_set()
5065 ptp_priv->layer = PTP_CLASS_L4; in lan8841_hwtstamp_set()
5066 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp_set()
5071 ptp_priv->layer = PTP_CLASS_L2; in lan8841_hwtstamp_set()
5072 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp_set()
5077 ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2; in lan8841_hwtstamp_set()
5078 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp_set()
5081 return -ERANGE; in lan8841_hwtstamp_set()
5087 if (ptp_priv->layer & PTP_CLASS_L2) { in lan8841_hwtstamp_set()
5090 } else if (ptp_priv->layer & PTP_CLASS_L4) { in lan8841_hwtstamp_set()
5106 ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC ? in lan8841_hwtstamp_set()
5111 config->rx_filter != HWTSTAMP_FILTER_NONE); in lan8841_hwtstamp_set()
5113 skb_queue_purge(&ptp_priv->tx_queue); in lan8841_hwtstamp_set()
5134 if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE || in lan8841_rxtstamp()
5138 if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0) in lan8841_rxtstamp()
5141 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_rxtstamp()
5142 ts.tv_sec = ptp_priv->seconds; in lan8841_rxtstamp()
5143 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_rxtstamp()
5144 ts_header = __be32_to_cpu(header->reserved2); in lan8841_rxtstamp()
5151 ts.tv_sec -= GENMASK(1, 0) + 1; in lan8841_rxtstamp()
5155 shhwtstamps->hwtstamp = in lan8841_rxtstamp()
5158 header->reserved2 = 0; in lan8841_rxtstamp()
5175 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_target()
5203 ts->tv_sec + LAN8841_BUFFER_TIME, 0); in lan8841_ptp_update_target()
5214 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_reload()
5248 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_settime64()
5253 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_settime64()
5254 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
5255 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
5256 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff); in lan8841_ptp_settime64()
5257 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec)); in lan8841_ptp_settime64()
5258 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff); in lan8841_ptp_settime64()
5264 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_settime64()
5266 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_ptp_settime64()
5267 ptp_priv->seconds = ts->tv_sec; in lan8841_ptp_settime64()
5268 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_ptp_settime64()
5285 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_gettime64()
5289 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_gettime64()
5304 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_gettime64()
5315 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_getseconds()
5318 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_getseconds()
5329 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_getseconds()
5344 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjtime()
5357 if (delta > 10000000000LL || delta < -10000000000LL) { in lan8841_ptp_adjtime()
5361 ptp->gettime64(ptp, &ts); in lan8841_ptp_adjtime()
5366 ptp->settime64(ptp, &ts); in lan8841_ptp_adjtime()
5370 sec = div_u64_rem(delta < 0 ? -delta : delta, NSEC_PER_SEC, &nsec); in lan8841_ptp_adjtime()
5376 sec--; in lan8841_ptp_adjtime()
5377 nsec = NSEC_PER_SEC - nsec; in lan8841_ptp_adjtime()
5391 nsec -= NSEC_PER_SEC; in lan8841_ptp_adjtime()
5394 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
5411 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
5414 ptp->gettime64(ptp, &ts); in lan8841_ptp_adjtime()
5415 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
5417 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
5430 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjfine()
5438 scaled_ppm = -scaled_ppm; in lan8841_ptp_adjfine()
5445 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjfine()
5450 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjfine()
5464 return -1; in lan8841_ptp_verify()
5477 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_off()
5493 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_on()
5523 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_remove_event()
5528 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore in lan8841_ptp_remove_event()
5535 tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_MASK << (3 * (pin - 5)); in lan8841_ptp_remove_event()
5554 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_event()
5575 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore in lan8841_ptp_enable_event()
5588 tmp << (3 * (pin - 5))); in lan8841_ptp_enable_event()
5613 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout()
5620 pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_PEROUT, rq->perout.index); in lan8841_ptp_perout()
5621 if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM) in lan8841_ptp_perout()
5622 return -EINVAL; in lan8841_ptp_perout()
5632 ts_on.tv_sec = rq->perout.on.sec; in lan8841_ptp_perout()
5633 ts_on.tv_nsec = rq->perout.on.nsec; in lan8841_ptp_perout()
5636 ts_period.tv_sec = rq->perout.period.sec; in lan8841_ptp_perout()
5637 ts_period.tv_nsec = rq->perout.period.nsec; in lan8841_ptp_perout()
5643 return -EOPNOTSUPP; in lan8841_ptp_perout()
5649 return -EINVAL; in lan8841_ptp_perout()
5702 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_perout()
5703 ret = lan8841_ptp_set_target(ptp_priv, LAN8841_EVENT_A, rq->perout.start.sec, in lan8841_ptp_perout()
5704 rq->perout.start.nsec); in lan8841_ptp_perout()
5705 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_perout()
5709 ret = lan8841_ptp_set_reload(ptp_priv, LAN8841_EVENT_A, rq->perout.period.sec, in lan8841_ptp_perout()
5710 rq->perout.period.nsec); in lan8841_ptp_perout()
5734 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_on()
5764 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_off()
5799 if (rq->extts.flags & ~(PTP_ENABLE_FEATURE | in lan8841_ptp_extts()
5802 return -EOPNOTSUPP; in lan8841_ptp_extts()
5804 pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_EXTTS, rq->extts.index); in lan8841_ptp_extts()
5805 if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM) in lan8841_ptp_extts()
5806 return -EINVAL; in lan8841_ptp_extts()
5808 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_extts()
5810 ret = lan8841_ptp_extts_on(ptp_priv, pin, rq->extts.flags); in lan8841_ptp_extts()
5813 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_extts()
5821 switch (rq->type) { in lan8841_ptp_enable()
5827 return -EOPNOTSUPP; in lan8841_ptp_enable()
5840 lan8841_ptp_getseconds(&ptp_priv->ptp_clock_info, &ts); in lan8841_ptp_do_aux_work()
5842 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_ptp_do_aux_work()
5843 ptp_priv->seconds = ts.tv_sec; in lan8841_ptp_do_aux_work()
5844 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_ptp_do_aux_work()
5882 phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID; in lan8841_probe()
5888 priv = phydev->priv; in lan8841_probe()
5889 ptp_priv = &priv->ptp_priv; in lan8841_probe()
5891 ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev, in lan8841_probe()
5893 sizeof(*ptp_priv->pin_config), in lan8841_probe()
5895 if (!ptp_priv->pin_config) in lan8841_probe()
5896 return -ENOMEM; in lan8841_probe()
5899 struct ptp_pin_desc *p = &ptp_priv->pin_config[i]; in lan8841_probe()
5901 snprintf(p->name, sizeof(p->name), "pin%d", i); in lan8841_probe()
5902 p->index = i; in lan8841_probe()
5903 p->func = PTP_PF_NONE; in lan8841_probe()
5906 ptp_priv->ptp_clock_info = lan8841_ptp_clock_info; in lan8841_probe()
5907 ptp_priv->ptp_clock_info.pin_config = ptp_priv->pin_config; in lan8841_probe()
5908 ptp_priv->ptp_clock = ptp_clock_register(&ptp_priv->ptp_clock_info, in lan8841_probe()
5909 &phydev->mdio.dev); in lan8841_probe()
5910 if (IS_ERR(ptp_priv->ptp_clock)) { in lan8841_probe()
5912 ptp_priv->ptp_clock); in lan8841_probe()
5913 return -EINVAL; in lan8841_probe()
5916 if (!ptp_priv->ptp_clock) in lan8841_probe()
5920 skb_queue_head_init(&ptp_priv->tx_queue); in lan8841_probe()
5921 ptp_priv->phydev = phydev; in lan8841_probe()
5922 mutex_init(&ptp_priv->ptp_lock); in lan8841_probe()
5923 spin_lock_init(&ptp_priv->seconds_lock); in lan8841_probe()
5925 ptp_priv->mii_ts.rxtstamp = lan8841_rxtstamp; in lan8841_probe()
5926 ptp_priv->mii_ts.txtstamp = lan8814_txtstamp; in lan8841_probe()
5927 ptp_priv->mii_ts.hwtstamp_set = lan8841_hwtstamp_set; in lan8841_probe()
5928 ptp_priv->mii_ts.ts_info = lan8841_ts_info; in lan8841_probe()
5930 phydev->mii_ts = &ptp_priv->mii_ts; in lan8841_probe()
5933 phydev->default_timestamp = true; in lan8841_probe()
5955 struct kszphy_priv *priv = phydev->priv; in lan8841_suspend()
5956 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8841_suspend()
5958 if (ptp_priv->ptp_clock) in lan8841_suspend()
5959 ptp_cancel_worker_sync(ptp_priv->ptp_clock); in lan8841_suspend()
5966 if (phydev->suspended && phy_interface_is_rgmii(phydev)) in ksz9131_resume()
5993 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8842_probe()
5995 return -ENOMEM; in lan8842_probe()
5997 phydev->priv = priv; in lan8842_probe()
6023 priv->rev = ret; in lan8842_probe()
6024 if (priv->rev == LAN8842_REV_8832) in lan8842_probe()
6039 ret = devm_phy_package_join(&phydev->mdio.dev, phydev, addr, in lan8842_probe()
6170 while (num--) { in lanphy_write_reg_data()
6171 ret = lanphy_write_page_reg(phydev, data->page, data->addr, in lanphy_write_reg_data()
6172 data->val); in lanphy_write_reg_data()
6247 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8842_config_intr()
6283 /* Disable or enable in-band autoneg with PCS Host side in lan8842_config_inband()
6297 priv = phydev->priv; in lan8842_handle_ptp_interrupt()
6298 ptp_priv = &priv->ptp_priv; in lan8842_handle_ptp_interrupt()
6308 skb_queue_purge(&ptp_priv->tx_queue); in lan8842_handle_ptp_interrupt()
6313 skb_queue_purge(&ptp_priv->rx_queue); in lan8842_handle_ptp_interrupt()
6319 struct lan8842_priv *priv = phydev->priv; in lan8842_handle_interrupt()
6337 if (priv->rev == LAN8842_REV_8832) in lan8842_handle_interrupt()
6376 struct lan8842_priv *priv = phydev->priv; in lan8842_update_stats()
6382 priv->phy_stats.rx_packets = lan8842_get_stat(phydev, in lan8842_update_stats()
6385 priv->phy_stats.rx_errors = lan8842_get_stat(phydev, in lan8842_update_stats()
6388 priv->phy_stats.tx_packets = lan8842_get_stat(phydev, in lan8842_update_stats()
6391 priv->phy_stats.tx_errors = lan8842_get_stat(phydev, in lan8842_update_stats()
6430 return -EINVAL; in lan8842_set_fast_down()
6442 switch (tuna->id) { in lan8842_get_tunable()
6446 return -EOPNOTSUPP; in lan8842_get_tunable()
6453 switch (tuna->id) { in lan8842_set_tunable()
6457 return -EOPNOTSUPP; in lan8842_set_tunable()
6465 struct lan8842_priv *priv = phydev->priv; in lan8842_get_phy_stats()
6467 stats->rx_packets = priv->phy_stats.rx_packets; in lan8842_get_phy_stats()
6468 stats->rx_errors = priv->phy_stats.rx_errors; in lan8842_get_phy_stats()
6469 stats->tx_packets = priv->phy_stats.tx_packets; in lan8842_get_phy_stats()
6470 stats->tx_errors = priv->phy_stats.tx_errors; in lan8842_get_phy_stats()