Lines Matching refs:phydev
278 struct phy_device *phydev; member
300 struct phy_device *phydev; member
367 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
370 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
371 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
374 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
377 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
378 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
381 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
386 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
391 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
393 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
403 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
407 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
410 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
411 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
416 err = phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
419 err = phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
423 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
429 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev) in kszphy_handle_interrupt() argument
433 irq_status = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_handle_interrupt()
435 phy_error(phydev); in kszphy_handle_interrupt()
442 phy_trigger_machine(phydev); in kszphy_handle_interrupt()
447 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
451 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
460 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
463 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
478 temp = phy_read(phydev, reg); in kszphy_setup_led()
486 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
489 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
497 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
501 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
505 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
508 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
513 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
517 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
524 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
528 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
534 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
536 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
540 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
542 phydev_err(phydev, in kszphy_config_reset()
549 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
554 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
556 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
565 kszphy_broadcast_disable(phydev); in kszphy_config_init()
568 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
570 return kszphy_config_reset(phydev); in kszphy_config_init()
573 static int ksz8041_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
575 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
580 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
585 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
586 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
590 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
592 phydev->supported); in ksz8041_config_init()
593 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
595 phydev->advertising); in ksz8041_config_init()
596 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
599 return kszphy_config_init(phydev); in ksz8041_config_init()
602 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
605 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
606 phydev->speed = SPEED_100; in ksz8041_config_aneg()
610 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
613 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
618 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051) in ksz8051_ksz8795_match_phy_device()
621 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
637 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
639 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
642 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
649 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
651 return kszphy_config_init(phydev); in ksz8081_config_init()
654 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz8081_config_mdix() argument
673 return phy_modify(phydev, MII_KSZPHY_CTRL_2, in ksz8081_config_mdix()
680 static int ksz8081_config_aneg(struct phy_device *phydev) in ksz8081_config_aneg() argument
684 ret = genphy_config_aneg(phydev); in ksz8081_config_aneg()
692 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
695 static int ksz8081_mdix_update(struct phy_device *phydev) in ksz8081_mdix_update() argument
699 ret = phy_read(phydev, MII_KSZPHY_CTRL_2); in ksz8081_mdix_update()
705 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
707 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
709 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
712 ret = phy_read(phydev, MII_KSZPHY_CTRL_1); in ksz8081_mdix_update()
717 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
719 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
724 static int ksz8081_read_status(struct phy_device *phydev) in ksz8081_read_status() argument
728 ret = ksz8081_mdix_update(phydev); in ksz8081_read_status()
732 return genphy_read_status(phydev); in ksz8081_read_status()
735 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
739 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
743 return kszphy_config_init(phydev); in ksz8061_config_init()
746 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
748 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
751 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
780 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
796 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
799 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
808 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
816 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
820 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
824 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
890 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
913 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
927 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
931 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
935 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
940 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
945 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
949 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
953 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
956 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
960 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
965 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
994 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
1000 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1008 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1016 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
1021 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
1037 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
1045 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1054 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
1055 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
1060 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1064 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1068 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1072 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1076 if (update && !phy_interface_is_rgmii(phydev)) in ksz9031_config_init()
1077 phydev_warn(phydev, in ksz9031_config_init()
1096 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
1102 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
1108 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
1111 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
1120 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
1155 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
1169 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
1179 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
1184 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1205 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1211 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1222 static int ksz9131_led_errata(struct phy_device *phydev) in ksz9131_led_errata() argument
1226 reg = phy_read_mmd(phydev, 2, 0); in ksz9131_led_errata()
1233 return phy_set_bits(phydev, 0x1e, BIT(9)); in ksz9131_led_errata()
1236 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
1252 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1261 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
1262 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
1267 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1273 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1279 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1285 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1291 ret = ksz9131_led_errata(phydev); in ksz9131_config_init()
1301 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
1306 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1308 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1311 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1313 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1316 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1318 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1320 phydev->link = 1; in ksz8873mll_read_status()
1321 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1326 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
1330 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
1343 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1348 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1353 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
1358 err = genphy_read_status(phydev); in ksz9031_read_status()
1365 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1367 phy_init_hw(phydev); in ksz9031_read_status()
1368 phydev->link = 0; in ksz9031_read_status()
1369 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1370 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1371 return genphy_config_aneg(phydev); in ksz9031_read_status()
1377 static int ksz9x31_cable_test_start(struct phy_device *phydev) in ksz9x31_cable_test_start() argument
1379 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1387 ret = phy_modify(phydev, MII_BMCR, in ksz9x31_cable_test_start()
1399 ret = phy_read(phydev, MII_CTRL1000); in ksz9x31_cable_test_start()
1408 return phy_write(phydev, MII_CTRL1000, ret); in ksz9x31_cable_test_start()
1445 static int ksz9x31_cable_test_fault_length(struct phy_device *phydev, u16 stat) in ksz9x31_cable_test_fault_length() argument
1453 if ((phydev->phy_id & MICREL_PHY_ID_MASK) == PHY_ID_KSZ9131) in ksz9x31_cable_test_fault_length()
1459 static int ksz9x31_cable_test_wait_for_completion(struct phy_device *phydev) in ksz9x31_cable_test_wait_for_completion() argument
1463 ret = phy_read_poll_timeout(phydev, KSZ9x31_LMD, val, in ksz9x31_cable_test_wait_for_completion()
1482 static int ksz9x31_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz9x31_cable_test_one_pair() argument
1493 ret = phy_write(phydev, KSZ9x31_LMD, in ksz9x31_cable_test_one_pair()
1498 ret = ksz9x31_cable_test_wait_for_completion(phydev); in ksz9x31_cable_test_one_pair()
1502 val = phy_read(phydev, KSZ9x31_LMD); in ksz9x31_cable_test_one_pair()
1509 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_one_pair()
1518 return ethnl_cable_test_fault_length(phydev, in ksz9x31_cable_test_one_pair()
1520 ksz9x31_cable_test_fault_length(phydev, val)); in ksz9x31_cable_test_one_pair()
1523 static int ksz9x31_cable_test_get_status(struct phy_device *phydev, in ksz9x31_cable_test_get_status() argument
1526 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1536 ret = ksz9x31_cable_test_one_pair(phydev, pair); in ksz9x31_cable_test_get_status()
1553 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_get_status()
1561 rv = phy_modify(phydev, MII_CTRL1000, in ksz9x31_cable_test_get_status()
1570 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1575 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz886x_config_mdix() argument
1599 return phy_modify(phydev, MII_BMCR, in ksz886x_config_mdix()
1605 static int ksz886x_config_aneg(struct phy_device *phydev) in ksz886x_config_aneg() argument
1609 ret = genphy_config_aneg(phydev); in ksz886x_config_aneg()
1617 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1620 static int ksz886x_mdix_update(struct phy_device *phydev) in ksz886x_mdix_update() argument
1624 ret = phy_read(phydev, MII_BMCR); in ksz886x_mdix_update()
1630 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1632 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1634 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1637 ret = phy_read(phydev, MII_KSZPHY_CTRL); in ksz886x_mdix_update()
1643 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1645 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1650 static int ksz886x_read_status(struct phy_device *phydev) in ksz886x_read_status() argument
1654 ret = ksz886x_mdix_update(phydev); in ksz886x_read_status()
1658 return genphy_read_status(phydev); in ksz886x_read_status()
1661 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
1666 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
1676 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
1679 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1683 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
1695 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
1701 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
1704 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
1707 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
1708 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1709 if (phydev->drv->config_intr) in kszphy_suspend()
1710 phydev->drv->config_intr(phydev); in kszphy_suspend()
1713 return genphy_suspend(phydev); in kszphy_suspend()
1716 static void kszphy_parse_led_mode(struct phy_device *phydev) in kszphy_parse_led_mode() argument
1718 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
1719 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
1720 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
1731 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_parse_led_mode()
1740 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
1744 genphy_resume(phydev); in kszphy_resume()
1752 ret = kszphy_config_reset(phydev); in kszphy_resume()
1757 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
1758 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1759 if (phydev->drv->config_intr) in kszphy_resume()
1760 phydev->drv->config_intr(phydev); in kszphy_resume()
1766 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
1768 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1769 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1773 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
1777 phydev->priv = priv; in kszphy_probe()
1781 kszphy_parse_led_mode(phydev); in kszphy_probe()
1783 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
1799 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
1805 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
1806 phydev->port = PORT_FIBRE; in kszphy_probe()
1809 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
1817 static int lan8814_cable_test_start(struct phy_device *phydev) in lan8814_cable_test_start() argument
1824 return phy_modify(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100, in lan8814_cable_test_start()
1828 static int ksz886x_cable_test_start(struct phy_device *phydev) in ksz886x_cable_test_start() argument
1830 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
1838 return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100); in ksz886x_cable_test_start()
1874 static __always_inline int ksz886x_cable_test_fault_length(struct phy_device *phydev, in ksz886x_cable_test_fault_length() argument
1885 if ((phydev->phy_id & MICREL_PHY_ID_MASK) == PHY_ID_LAN8814) in ksz886x_cable_test_fault_length()
1891 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev) in ksz886x_cable_test_wait_for_completion() argument
1893 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
1896 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
1903 static int lan8814_cable_test_one_pair(struct phy_device *phydev, int pair) in lan8814_cable_test_one_pair() argument
1917 ret = phy_write(phydev, LAN8814_CABLE_DIAG, val); in lan8814_cable_test_one_pair()
1921 ret = ksz886x_cable_test_wait_for_completion(phydev); in lan8814_cable_test_one_pair()
1925 val = phy_read(phydev, LAN8814_CABLE_DIAG); in lan8814_cable_test_one_pair()
1932 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in lan8814_cable_test_one_pair()
1942 fault_length = ksz886x_cable_test_fault_length(phydev, val, in lan8814_cable_test_one_pair()
1945 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in lan8814_cable_test_one_pair()
1948 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz886x_cable_test_one_pair() argument
1965 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
1967 ret = ksz8081_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
1970 ret = ksz886x_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
1982 ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST); in ksz886x_cable_test_one_pair()
1986 ret = ksz886x_cable_test_wait_for_completion(phydev); in ksz886x_cable_test_one_pair()
1990 val = phy_read(phydev, KSZ8081_LMD); in ksz886x_cable_test_one_pair()
1997 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
2005 fault_length = ksz886x_cable_test_fault_length(phydev, val, KSZ8081_LMD_DELTA_TIME_MASK); in ksz886x_cable_test_one_pair()
2007 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in ksz886x_cable_test_one_pair()
2010 static int ksz886x_cable_test_get_status(struct phy_device *phydev, in ksz886x_cable_test_get_status() argument
2013 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2024 ret = lan8814_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2026 ret = ksz886x_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2064 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr) in lanphy_read_page_reg() argument
2068 phy_lock_mdio_bus(phydev); in lanphy_read_page_reg()
2069 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_read_page_reg()
2070 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_read_page_reg()
2071 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_read_page_reg()
2073 data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA); in lanphy_read_page_reg()
2074 phy_unlock_mdio_bus(phydev); in lanphy_read_page_reg()
2079 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr, in lanphy_write_page_reg() argument
2082 phy_lock_mdio_bus(phydev); in lanphy_write_page_reg()
2083 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_write_page_reg()
2084 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_write_page_reg()
2085 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_write_page_reg()
2088 val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val); in lanphy_write_page_reg()
2090 phydev_err(phydev, "Error: phy_write has returned error %d\n", in lanphy_write_page_reg()
2092 phy_unlock_mdio_bus(phydev); in lanphy_write_page_reg()
2096 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable) in lan8814_config_ts_intr() argument
2106 return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val); in lan8814_config_ts_intr()
2109 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev, in lan8814_ptp_rx_ts_get() argument
2112 *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); in lan8814_ptp_rx_ts_get()
2114 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO); in lan8814_ptp_rx_ts_get()
2116 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI); in lan8814_ptp_rx_ts_get()
2118 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO); in lan8814_ptp_rx_ts_get()
2120 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2); in lan8814_ptp_rx_ts_get()
2123 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev, in lan8814_ptp_tx_ts_get() argument
2126 *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); in lan8814_ptp_tx_ts_get()
2128 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO); in lan8814_ptp_tx_ts_get()
2130 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI); in lan8814_ptp_tx_ts_get()
2132 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO); in lan8814_ptp_tx_ts_get()
2134 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2); in lan8814_ptp_tx_ts_get()
2140 struct phy_device *phydev = ptp_priv->phydev; in lan8814_ts_info() local
2141 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ts_info()
2164 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress) in lan8814_flush_fifo() argument
2169 lanphy_read_page_reg(phydev, 5, in lan8814_flush_fifo()
2173 lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_flush_fifo()
2180 struct phy_device *phydev = ptp_priv->phydev; in lan8814_hwtstamp() local
2181 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_hwtstamp()
2227 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); in lan8814_hwtstamp()
2228 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); in lan8814_hwtstamp()
2232 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2233 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2236 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2240 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp()
2242 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp()
2251 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL, in lan8814_hwtstamp()
2254 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL, in lan8814_hwtstamp()
2266 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp()
2267 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp()
2364 static void lan8814_ptp_clock_set(struct phy_device *phydev, in lan8814_ptp_clock_set() argument
2374 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, sec_low); in lan8814_ptp_clock_set()
2375 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, sec_high); in lan8814_ptp_clock_set()
2376 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, nsec_low); in lan8814_ptp_clock_set()
2377 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, nsec_high); in lan8814_ptp_clock_set()
2379 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_); in lan8814_ptp_clock_set()
2382 static void lan8814_ptp_clock_get(struct phy_device *phydev, in lan8814_ptp_clock_get() argument
2385 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_); in lan8814_ptp_clock_get()
2387 *seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID); in lan8814_ptp_clock_get()
2389 lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO); in lan8814_ptp_clock_get()
2391 *nano_seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI); in lan8814_ptp_clock_get()
2393 lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO); in lan8814_ptp_clock_get()
2401 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64() local
2406 lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds); in lan8814_ptpci_gettime64()
2419 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64() local
2422 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
2428 static void lan8814_ptp_clock_step(struct phy_device *phydev, in lan8814_ptp_clock_step() argument
2440 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2448 lan8814_ptp_clock_set(phydev, unsigned_seconds, nano_seconds); in lan8814_ptp_clock_step()
2454 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2463 lan8814_ptp_clock_set(phydev, unsigned_seconds, in lan8814_ptp_clock_step()
2511 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2513 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2527 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2529 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2533 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
2543 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2545 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2548 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
2557 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime() local
2560 lan8814_ptp_clock_step(phydev, delta); in lan8814_ptpci_adjtime()
2570 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine() local
2590 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi); in lan8814_ptpci_adjfine()
2591 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo); in lan8814_ptpci_adjfine()
2610 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb() local
2619 lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id); in lan8814_dequeue_tx_skb()
2643 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts() local
2652 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_tx_ts()
2691 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts() local
2701 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
2718 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_rx_ts()
2722 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev) in lan8814_handle_ptp_interrupt() argument
2724 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
2728 status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_handle_ptp_interrupt()
2736 lan8814_flush_fifo(phydev, true); in lan8814_handle_ptp_interrupt()
2741 lan8814_flush_fifo(phydev, false); in lan8814_handle_ptp_interrupt()
2746 static int lan8804_config_init(struct phy_device *phydev) in lan8804_config_init() argument
2751 val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP); in lan8804_config_init()
2754 lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val); in lan8804_config_init()
2759 lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e); in lan8804_config_init()
2760 lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY); in lan8804_config_init()
2765 static irqreturn_t lan8804_handle_interrupt(struct phy_device *phydev) in lan8804_handle_interrupt() argument
2769 status = phy_read(phydev, LAN8814_INTS); in lan8804_handle_interrupt()
2771 phy_error(phydev); in lan8804_handle_interrupt()
2776 phy_trigger_machine(phydev); in lan8804_handle_interrupt()
2786 static int lan8804_config_intr(struct phy_device *phydev) in lan8804_config_intr() argument
2795 phy_write(phydev, LAN8804_CONTROL, LAN8804_CONTROL_INTR_POLARITY); in lan8804_config_intr()
2801 phy_write(phydev, LAN8804_OUTPUT_CONTROL, in lan8804_config_intr()
2804 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
2805 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
2809 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8804_config_intr()
2813 err = phy_write(phydev, LAN8814_INTC, 0); in lan8804_config_intr()
2817 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
2825 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) in lan8814_handle_interrupt() argument
2830 irq_status = phy_read(phydev, LAN8814_INTS); in lan8814_handle_interrupt()
2832 phy_error(phydev); in lan8814_handle_interrupt()
2837 phy_trigger_machine(phydev); in lan8814_handle_interrupt()
2842 tsu_irq_status = lanphy_read_page_reg(phydev, 4, in lan8814_handle_interrupt()
2850 lan8814_handle_ptp_interrupt(phydev); in lan8814_handle_interrupt()
2860 static int lan8814_ack_interrupt(struct phy_device *phydev) in lan8814_ack_interrupt() argument
2865 rc = phy_read(phydev, LAN8814_INTS); in lan8814_ack_interrupt()
2870 static int lan8814_config_intr(struct phy_device *phydev) in lan8814_config_intr() argument
2874 lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG, in lan8814_config_intr()
2879 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
2880 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
2884 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8814_config_intr()
2886 err = phy_write(phydev, LAN8814_INTC, 0); in lan8814_config_intr()
2890 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
2896 static void lan8814_ptp_init(struct phy_device *phydev) in lan8814_ptp_init() argument
2898 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
2906 lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_); in lan8814_ptp_init()
2908 temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD); in lan8814_ptp_init()
2910 lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp); in lan8814_ptp_init()
2912 temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD); in lan8814_ptp_init()
2914 lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp); in lan8814_ptp_init()
2916 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0); in lan8814_ptp_init()
2917 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0); in lan8814_ptp_init()
2920 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
2921 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
2922 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
2923 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
2930 ptp_priv->phydev = phydev; in lan8814_ptp_init()
2937 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
2940 static int lan8814_ptp_probe_once(struct phy_device *phydev) in lan8814_ptp_probe_once() argument
2942 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ptp_probe_once()
2952 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in lan8814_ptp_probe_once()
2966 &phydev->mdio.dev); in lan8814_ptp_probe_once()
2968 phydev_err(phydev, "ptp_clock_register failed %lu\n", in lan8814_ptp_probe_once()
2973 phydev_dbg(phydev, "successfully registered ptp clock\n"); in lan8814_ptp_probe_once()
2975 shared->phydev = phydev; in lan8814_ptp_probe_once()
2980 lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_); in lan8814_ptp_probe_once()
2981 lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE, in lan8814_ptp_probe_once()
2987 static void lan8814_setup_led(struct phy_device *phydev, int val) in lan8814_setup_led() argument
2991 temp = lanphy_read_page_reg(phydev, 5, LAN8814_LED_CTRL_1); in lan8814_setup_led()
2998 lanphy_write_page_reg(phydev, 5, LAN8814_LED_CTRL_1, temp); in lan8814_setup_led()
3001 static int lan8814_config_init(struct phy_device *phydev) in lan8814_config_init() argument
3003 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
3007 val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET); in lan8814_config_init()
3009 lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val); in lan8814_config_init()
3012 val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG); in lan8814_config_init()
3014 lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val); in lan8814_config_init()
3017 val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP); in lan8814_config_init()
3020 lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val); in lan8814_config_init()
3023 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
3033 static int lan8814_release_coma_mode(struct phy_device *phydev) in lan8814_release_coma_mode() argument
3037 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
3049 static int lan8814_probe(struct phy_device *phydev) in lan8814_probe() argument
3051 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
3056 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
3060 phydev->priv = priv; in lan8814_probe()
3064 kszphy_parse_led_mode(phydev); in lan8814_probe()
3069 addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F; in lan8814_probe()
3070 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
3073 if (phy_package_init_once(phydev)) { in lan8814_probe()
3074 err = lan8814_release_coma_mode(phydev); in lan8814_probe()
3078 err = lan8814_ptp_probe_once(phydev); in lan8814_probe()
3083 lan8814_ptp_init(phydev); in lan8814_probe()