Lines Matching refs:phydev

45 void phy_device_free(struct phy_device *phydev)  in phy_device_free()  argument
47 put_device(&phydev->mdio.dev); in phy_device_free()
53 struct phy_device *phydev; in phy_mdio_device_free() local
55 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_free()
56 phy_device_free(phydev); in phy_mdio_device_free()
66 struct phy_device *phydev; in phy_mdio_device_remove() local
68 phydev = container_of(mdiodev, struct phy_device, mdio); in phy_mdio_device_remove()
69 phy_device_remove(phydev); in phy_mdio_device_remove()
79 static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) in mdio_bus_phy_may_suspend() argument
81 struct device_driver *drv = phydev->mdio.dev.driver; in mdio_bus_phy_may_suspend()
83 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_may_suspend()
94 return !phydev->suspended; in mdio_bus_phy_may_suspend()
119 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_suspend() local
126 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_suspend()
127 phy_stop_machine(phydev); in mdio_bus_phy_suspend()
129 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_suspend()
132 return phy_suspend(phydev); in mdio_bus_phy_suspend()
137 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_resume() local
140 if (!mdio_bus_phy_may_suspend(phydev)) in mdio_bus_phy_resume()
143 ret = phy_resume(phydev); in mdio_bus_phy_resume()
148 if (phydev->attached_dev && phydev->adjust_link) in mdio_bus_phy_resume()
149 phy_start_machine(phydev); in mdio_bus_phy_resume()
156 struct phy_device *phydev = to_phy_device(dev); in mdio_bus_phy_restore() local
157 struct net_device *netdev = phydev->attached_dev; in mdio_bus_phy_restore()
163 ret = phy_init_hw(phydev); in mdio_bus_phy_restore()
168 phydev->link = 0; in mdio_bus_phy_restore()
169 phydev->state = PHY_UP; in mdio_bus_phy_restore()
171 phy_start_machine(phydev); in mdio_bus_phy_restore()
288 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
290 if (strcmp(fixup->bus_id, phydev_name(phydev)) != 0) in phy_needs_fixup()
295 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
303 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
309 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
310 int err = fixup->run(phydev); in phy_scan_fixups()
316 phydev->has_fixups = true; in phy_scan_fixups()
326 struct phy_device *phydev = to_phy_device(dev); in phy_bus_match() local
328 const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); in phy_bus_match()
335 return phydrv->match_phy_device(phydev); in phy_bus_match()
337 if (phydev->is_c45) { in phy_bus_match()
339 if (!(phydev->c45_ids.devices_in_package & (1 << i))) in phy_bus_match()
343 (phydev->c45_ids.device_ids[i] & in phy_bus_match()
350 (phydev->phy_id & phydrv->phy_id_mask); in phy_bus_match()
357 struct phy_device *phydev = to_phy_device(dev); in phy_id_show() local
359 return sprintf(buf, "0x%.8lx\n", (unsigned long)phydev->phy_id); in phy_id_show()
366 struct phy_device *phydev = to_phy_device(dev); in phy_interface_show() local
369 if (phy_is_internal(phydev)) in phy_interface_show()
372 mode = phy_modes(phydev->interface); in phy_interface_show()
382 struct phy_device *phydev = to_phy_device(dev); in phy_has_fixups_show() local
384 return sprintf(buf, "%d\n", phydev->has_fixups); in phy_has_fixups_show()
647 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
651 err = mdiobus_register_device(&phydev->mdio); in phy_device_register()
656 phy_device_reset(phydev, 0); in phy_device_register()
659 err = phy_scan_fixups(phydev); in phy_device_register()
661 pr_err("PHY %d failed to initialize\n", phydev->mdio.addr); in phy_device_register()
665 err = device_add(&phydev->mdio.dev); in phy_device_register()
667 pr_err("PHY %d failed to add\n", phydev->mdio.addr); in phy_device_register()
675 phy_device_reset(phydev, 1); in phy_device_register()
677 mdiobus_unregister_device(&phydev->mdio); in phy_device_register()
690 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
692 device_del(&phydev->mdio.dev); in phy_device_remove()
695 phy_device_reset(phydev, 1); in phy_device_remove()
697 mdiobus_unregister_device(&phydev->mdio); in phy_device_remove()
707 struct phy_device *phydev; in phy_find_first() local
711 phydev = mdiobus_get_phy(bus, addr); in phy_find_first()
712 if (phydev) in phy_find_first()
713 return phydev; in phy_find_first()
719 static void phy_link_change(struct phy_device *phydev, bool up, bool do_carrier) in phy_link_change() argument
721 struct net_device *netdev = phydev->attached_dev; in phy_link_change()
729 phydev->adjust_link(netdev); in phy_link_change()
744 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
747 phydev->adjust_link = handler; in phy_prepare_link()
757 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
763 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
767 phy_prepare_link(phydev, handler); in phy_connect_direct()
768 phy_start_machine(phydev); in phy_connect_direct()
769 if (phydev->irq > 0) in phy_connect_direct()
770 phy_start_interrupts(phydev); in phy_connect_direct()
795 struct phy_device *phydev; in phy_connect() local
807 phydev = to_phy_device(d); in phy_connect()
809 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
814 return phydev; in phy_connect()
823 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
825 if (phydev->irq > 0) in phy_disconnect()
826 phy_stop_interrupts(phydev); in phy_disconnect()
828 phy_stop_machine(phydev); in phy_disconnect()
830 phydev->adjust_link = NULL; in phy_disconnect()
832 phy_detach(phydev); in phy_disconnect()
854 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
862 ret = phy_read(phydev, MII_BMCR); in phy_poll_reset()
876 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
881 phy_device_reset(phydev, 0); in phy_init_hw()
883 if (!phydev->drv || !phydev->drv->config_init) in phy_init_hw()
886 if (phydev->drv->soft_reset) in phy_init_hw()
887 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
889 ret = genphy_soft_reset(phydev); in phy_init_hw()
894 ret = phy_scan_fixups(phydev); in phy_init_hw()
898 return phydev->drv->config_init(phydev); in phy_init_hw()
902 void phy_attached_info(struct phy_device *phydev) in phy_attached_info() argument
904 phy_attached_print(phydev, NULL); in phy_attached_info()
909 void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) in phy_attached_print() argument
911 const char *drv_name = phydev->drv ? phydev->drv->name : "unbound"; in phy_attached_print()
915 switch(phydev->irq) { in phy_attached_print()
923 snprintf(irq_num, sizeof(irq_num), "%d", phydev->irq); in phy_attached_print()
930 dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n", in phy_attached_print()
931 drv_name, phydev_name(phydev), in phy_attached_print()
936 dev_info(&phydev->mdio.dev, ATTACHED_FMT, in phy_attached_print()
937 drv_name, phydev_name(phydev), in phy_attached_print()
962 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
966 struct mii_bus *bus = phydev->mdio.bus; in phy_attach_direct()
967 struct device *d = &phydev->mdio.dev; in phy_attach_direct()
987 if (phydev->is_c45) in phy_attach_direct()
1010 if (phydev->attached_dev) { in phy_attach_direct()
1016 phydev->phy_link_change = phy_link_change; in phy_attach_direct()
1017 phydev->attached_dev = dev; in phy_attach_direct()
1018 dev->phydev = phydev; in phy_attach_direct()
1028 phydev->sysfs_links = false; in phy_attach_direct()
1030 err = sysfs_create_link(&phydev->mdio.dev.kobj, &dev->dev.kobj, in phy_attach_direct()
1034 &phydev->mdio.dev.kobj, in phy_attach_direct()
1038 kobject_name(&phydev->mdio.dev.kobj), in phy_attach_direct()
1045 phydev->sysfs_links = true; in phy_attach_direct()
1048 phydev->dev_flags = flags; in phy_attach_direct()
1050 phydev->interface = interface; in phy_attach_direct()
1052 phydev->state = PHY_READY; in phy_attach_direct()
1057 netif_carrier_off(phydev->attached_dev); in phy_attach_direct()
1063 err = phy_init_hw(phydev); in phy_attach_direct()
1067 phy_resume(phydev); in phy_attach_direct()
1068 phy_led_triggers_register(phydev); in phy_attach_direct()
1074 phy_detach(phydev); in phy_attach_direct()
1100 struct phy_device *phydev; in phy_attach() local
1112 phydev = to_phy_device(d); in phy_attach()
1114 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
1119 return phydev; in phy_attach()
1130 void phy_detach(struct phy_device *phydev) in phy_detach() argument
1132 struct net_device *dev = phydev->attached_dev; in phy_detach()
1136 if (phydev->sysfs_links) { in phy_detach()
1138 sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev"); in phy_detach()
1140 phy_suspend(phydev); in phy_detach()
1141 phydev->attached_dev->phydev = NULL; in phy_detach()
1142 phydev->attached_dev = NULL; in phy_detach()
1143 phydev->phylink = NULL; in phy_detach()
1145 phy_led_triggers_unregister(phydev); in phy_detach()
1147 module_put(phydev->mdio.dev.driver->owner); in phy_detach()
1154 if (phydev->mdio.dev.driver == &genphy_10g_driver.mdiodrv.driver || in phy_detach()
1155 phydev->mdio.dev.driver == &genphy_driver.mdiodrv.driver) in phy_detach()
1156 device_release_driver(&phydev->mdio.dev); in phy_detach()
1162 bus = phydev->mdio.bus; in phy_detach()
1164 put_device(&phydev->mdio.dev); in phy_detach()
1169 phy_device_reset(phydev, 1); in phy_detach()
1173 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
1175 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); in phy_suspend()
1176 struct net_device *netdev = phydev->attached_dev; in phy_suspend()
1181 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
1185 if (phydev->drv && phydrv->suspend) in phy_suspend()
1186 ret = phydrv->suspend(phydev); in phy_suspend()
1191 phydev->suspended = true; in phy_suspend()
1197 int __phy_resume(struct phy_device *phydev) in __phy_resume() argument
1199 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); in __phy_resume()
1202 WARN_ON(!mutex_is_locked(&phydev->lock)); in __phy_resume()
1204 if (phydev->drv && phydrv->resume) in __phy_resume()
1205 ret = phydrv->resume(phydev); in __phy_resume()
1210 phydev->suspended = false; in __phy_resume()
1216 int phy_resume(struct phy_device *phydev) in phy_resume() argument
1220 mutex_lock(&phydev->lock); in phy_resume()
1221 ret = __phy_resume(phydev); in phy_resume()
1222 mutex_unlock(&phydev->lock); in phy_resume()
1228 int phy_loopback(struct phy_device *phydev, bool enable) in phy_loopback() argument
1230 struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver); in phy_loopback()
1233 mutex_lock(&phydev->lock); in phy_loopback()
1235 if (enable && phydev->loopback_enabled) { in phy_loopback()
1240 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1245 if (phydev->drv && phydrv->set_loopback) in phy_loopback()
1246 ret = phydrv->set_loopback(phydev, enable); in phy_loopback()
1253 phydev->loopback_enabled = enable; in phy_loopback()
1256 mutex_unlock(&phydev->lock); in phy_loopback()
1270 int phy_reset_after_clk_enable(struct phy_device *phydev) in phy_reset_after_clk_enable() argument
1272 if (!phydev || !phydev->drv) in phy_reset_after_clk_enable()
1275 if (phydev->drv->flags & PHY_RST_AFTER_CLK_EN) { in phy_reset_after_clk_enable()
1276 phy_device_reset(phydev, 1); in phy_reset_after_clk_enable()
1277 phy_device_reset(phydev, 0); in phy_reset_after_clk_enable()
1296 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
1303 phydev->advertising &= phydev->supported; in genphy_config_advert()
1304 advertise = phydev->advertising; in genphy_config_advert()
1307 adv = phy_read(phydev, MII_ADVERTISE); in genphy_config_advert()
1317 err = phy_write(phydev, MII_ADVERTISE, adv); in genphy_config_advert()
1324 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
1336 adv = phy_read(phydev, MII_CTRL1000); in genphy_config_advert()
1343 if (phydev->supported & (SUPPORTED_1000baseT_Half | in genphy_config_advert()
1351 err = phy_write(phydev, MII_CTRL1000, adv); in genphy_config_advert()
1366 static int genphy_config_eee_advert(struct phy_device *phydev) in genphy_config_eee_advert() argument
1368 int broken = phydev->eee_broken_modes; in genphy_config_eee_advert()
1379 adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in genphy_config_eee_advert()
1390 phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); in genphy_config_eee_advert()
1403 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
1407 phydev->pause = 0; in genphy_setup_forced()
1408 phydev->asym_pause = 0; in genphy_setup_forced()
1410 if (SPEED_1000 == phydev->speed) in genphy_setup_forced()
1412 else if (SPEED_100 == phydev->speed) in genphy_setup_forced()
1415 if (DUPLEX_FULL == phydev->duplex) in genphy_setup_forced()
1418 return phy_modify(phydev, MII_BMCR, in genphy_setup_forced()
1427 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
1430 return phy_modify(phydev, MII_BMCR, BMCR_ISOLATE, in genphy_restart_aneg()
1443 int genphy_config_aneg(struct phy_device *phydev) in genphy_config_aneg() argument
1447 changed = genphy_config_eee_advert(phydev); in genphy_config_aneg()
1449 if (AUTONEG_ENABLE != phydev->autoneg) in genphy_config_aneg()
1450 return genphy_setup_forced(phydev); in genphy_config_aneg()
1452 err = genphy_config_advert(phydev); in genphy_config_aneg()
1462 int ctl = phy_read(phydev, MII_BMCR); in genphy_config_aneg()
1475 return genphy_restart_aneg(phydev); in genphy_config_aneg()
1489 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
1491 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
1505 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
1510 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
1515 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
1520 phydev->link = 0; in genphy_update_link()
1522 phydev->link = 1; in genphy_update_link()
1537 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
1547 err = genphy_update_link(phydev); in genphy_read_status()
1551 phydev->lp_advertising = 0; in genphy_read_status()
1553 if (AUTONEG_ENABLE == phydev->autoneg) { in genphy_read_status()
1554 if (phydev->supported & (SUPPORTED_1000baseT_Half in genphy_read_status()
1556 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_status()
1560 adv = phy_read(phydev, MII_CTRL1000); in genphy_read_status()
1566 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n"); in genphy_read_status()
1568 phydev_err(phydev, "Master/Slave resolution failed\n"); in genphy_read_status()
1572 phydev->lp_advertising = in genphy_read_status()
1577 lpa = phy_read(phydev, MII_LPA); in genphy_read_status()
1581 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa); in genphy_read_status()
1583 adv = phy_read(phydev, MII_ADVERTISE); in genphy_read_status()
1589 phydev->speed = SPEED_10; in genphy_read_status()
1590 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1591 phydev->pause = 0; in genphy_read_status()
1592 phydev->asym_pause = 0; in genphy_read_status()
1595 phydev->speed = SPEED_1000; in genphy_read_status()
1598 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1600 phydev->speed = SPEED_100; in genphy_read_status()
1603 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1606 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1608 if (phydev->duplex == DUPLEX_FULL) { in genphy_read_status()
1609 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; in genphy_read_status()
1610 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; in genphy_read_status()
1613 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status()
1619 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1621 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1624 phydev->speed = SPEED_1000; in genphy_read_status()
1626 phydev->speed = SPEED_100; in genphy_read_status()
1628 phydev->speed = SPEED_10; in genphy_read_status()
1630 phydev->pause = 0; in genphy_read_status()
1631 phydev->asym_pause = 0; in genphy_read_status()
1647 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
1651 ret = phy_write(phydev, MII_BMCR, BMCR_RESET); in genphy_soft_reset()
1655 return phy_poll_reset(phydev); in genphy_soft_reset()
1659 int genphy_config_init(struct phy_device *phydev) in genphy_config_init() argument
1669 val = phy_read(phydev, MII_BMSR); in genphy_config_init()
1686 val = phy_read(phydev, MII_ESTATUS); in genphy_config_init()
1696 phydev->supported &= features; in genphy_config_init()
1697 phydev->advertising &= features; in genphy_config_init()
1720 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
1722 return phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_suspend()
1726 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
1728 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in genphy_resume()
1732 int genphy_loopback(struct phy_device *phydev, bool enable) in genphy_loopback() argument
1734 return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, in genphy_loopback()
1739 static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) in __set_phy_supported() argument
1741 phydev->supported &= ~(PHY_1000BT_FEATURES | PHY_100BT_FEATURES | in __set_phy_supported()
1748 phydev->supported |= PHY_1000BT_FEATURES; in __set_phy_supported()
1751 phydev->supported |= PHY_100BT_FEATURES; in __set_phy_supported()
1754 phydev->supported |= PHY_10BT_FEATURES; in __set_phy_supported()
1760 int phy_set_max_speed(struct phy_device *phydev, u32 max_speed) in phy_set_max_speed() argument
1764 err = __set_phy_supported(phydev, max_speed); in phy_set_max_speed()
1768 phydev->advertising = phydev->supported; in phy_set_max_speed()
1774 static void of_set_phy_supported(struct phy_device *phydev) in of_set_phy_supported() argument
1776 struct device_node *node = phydev->mdio.dev.of_node; in of_set_phy_supported()
1786 __set_phy_supported(phydev, max_speed); in of_set_phy_supported()
1789 static void of_set_phy_eee_broken(struct phy_device *phydev) in of_set_phy_eee_broken() argument
1791 struct device_node *node = phydev->mdio.dev.of_node; in of_set_phy_eee_broken()
1813 phydev->eee_broken_modes = broken; in of_set_phy_eee_broken()
1826 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
1827 struct device_driver *drv = phydev->mdio.dev.driver; in phy_probe()
1831 phydev->drv = phydrv; in phy_probe()
1837 phy_interrupt_is_valid(phydev)) in phy_probe()
1838 phydev->irq = PHY_POLL; in phy_probe()
1841 phydev->is_internal = true; in phy_probe()
1843 mutex_lock(&phydev->lock); in phy_probe()
1849 phydev->supported = phydrv->features; in phy_probe()
1850 of_set_phy_supported(phydev); in phy_probe()
1851 phydev->advertising = phydev->supported; in phy_probe()
1856 of_set_phy_eee_broken(phydev); in phy_probe()
1870 phydev->supported &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause); in phy_probe()
1871 phydev->supported |= phydrv->features & in phy_probe()
1874 phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause; in phy_probe()
1878 phydev->state = PHY_READY; in phy_probe()
1880 if (phydev->drv->probe) { in phy_probe()
1882 phy_device_reset(phydev, 0); in phy_probe()
1884 err = phydev->drv->probe(phydev); in phy_probe()
1887 phy_device_reset(phydev, 1); in phy_probe()
1891 mutex_unlock(&phydev->lock); in phy_probe()
1898 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
1900 cancel_delayed_work_sync(&phydev->state_queue); in phy_remove()
1902 mutex_lock(&phydev->lock); in phy_remove()
1903 phydev->state = PHY_DOWN; in phy_remove()
1904 mutex_unlock(&phydev->lock); in phy_remove()
1906 if (phydev->drv && phydev->drv->remove) { in phy_remove()
1907 phydev->drv->remove(phydev); in phy_remove()
1910 phy_device_reset(phydev, 1); in phy_remove()
1912 phydev->drv = NULL; in phy_remove()