Lines Matching refs:phydev

44 void phy_device_free(struct phy_device *phydev)  in phy_device_free()  argument
46 put_device(&phydev->dev); in phy_device_free()
115 static int phy_needs_fixup(struct phy_device *phydev, struct phy_fixup *fixup) in phy_needs_fixup() argument
117 if (strcmp(fixup->bus_id, dev_name(&phydev->dev)) != 0) in phy_needs_fixup()
122 (phydev->phy_id & fixup->phy_uid_mask)) in phy_needs_fixup()
130 static int phy_scan_fixups(struct phy_device *phydev) in phy_scan_fixups() argument
136 if (phy_needs_fixup(phydev, fixup)) { in phy_scan_fixups()
137 int err = fixup->run(phydev); in phy_scan_fixups()
143 phydev->has_fixups = true; in phy_scan_fixups()
380 int phy_device_register(struct phy_device *phydev) in phy_device_register() argument
385 if (phydev->bus->phy_map[phydev->addr]) in phy_device_register()
387 phydev->bus->phy_map[phydev->addr] = phydev; in phy_device_register()
390 err = phy_scan_fixups(phydev); in phy_device_register()
392 pr_err("PHY %d failed to initialize\n", phydev->addr); in phy_device_register()
396 err = device_add(&phydev->dev); in phy_device_register()
398 pr_err("PHY %d failed to add\n", phydev->addr); in phy_device_register()
405 phydev->bus->phy_map[phydev->addr] = NULL; in phy_device_register()
418 void phy_device_remove(struct phy_device *phydev) in phy_device_remove() argument
420 struct mii_bus *bus = phydev->bus; in phy_device_remove()
421 int addr = phydev->addr; in phy_device_remove()
423 device_del(&phydev->dev); in phy_device_remove()
456 static void phy_prepare_link(struct phy_device *phydev, in phy_prepare_link() argument
459 phydev->adjust_link = handler; in phy_prepare_link()
469 int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, in phy_connect_direct() argument
475 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_connect_direct()
479 phy_prepare_link(phydev, handler); in phy_connect_direct()
480 phy_start_machine(phydev); in phy_connect_direct()
481 if (phydev->irq > 0) in phy_connect_direct()
482 phy_start_interrupts(phydev); in phy_connect_direct()
507 struct phy_device *phydev; in phy_connect() local
519 phydev = to_phy_device(d); in phy_connect()
521 rc = phy_connect_direct(dev, phydev, handler, interface); in phy_connect()
525 return phydev; in phy_connect()
534 void phy_disconnect(struct phy_device *phydev) in phy_disconnect() argument
536 if (phydev->irq > 0) in phy_disconnect()
537 phy_stop_interrupts(phydev); in phy_disconnect()
539 phy_stop_machine(phydev); in phy_disconnect()
541 phydev->adjust_link = NULL; in phy_disconnect()
543 phy_detach(phydev); in phy_disconnect()
565 static int phy_poll_reset(struct phy_device *phydev) in phy_poll_reset() argument
573 ret = phy_read(phydev, MII_BMCR); in phy_poll_reset()
587 int phy_init_hw(struct phy_device *phydev) in phy_init_hw() argument
591 if (!phydev->drv || !phydev->drv->config_init) in phy_init_hw()
594 if (phydev->drv->soft_reset) in phy_init_hw()
595 ret = phydev->drv->soft_reset(phydev); in phy_init_hw()
597 ret = genphy_soft_reset(phydev); in phy_init_hw()
602 ret = phy_scan_fixups(phydev); in phy_init_hw()
606 return phydev->drv->config_init(phydev); in phy_init_hw()
625 int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, in phy_attach_direct() argument
628 struct mii_bus *bus = phydev->bus; in phy_attach_direct()
629 struct device *d = &phydev->dev; in phy_attach_direct()
643 if (phydev->is_c45) in phy_attach_direct()
656 if (phydev->attached_dev) { in phy_attach_direct()
662 phydev->attached_dev = dev; in phy_attach_direct()
663 dev->phydev = phydev; in phy_attach_direct()
665 phydev->dev_flags = flags; in phy_attach_direct()
667 phydev->interface = interface; in phy_attach_direct()
669 phydev->state = PHY_READY; in phy_attach_direct()
675 err = phy_init_hw(phydev); in phy_attach_direct()
677 phy_detach(phydev); in phy_attach_direct()
679 phy_resume(phydev); in phy_attach_direct()
703 struct phy_device *phydev; in phy_attach() local
715 phydev = to_phy_device(d); in phy_attach()
717 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); in phy_attach()
721 return phydev; in phy_attach()
732 void phy_detach(struct phy_device *phydev) in phy_detach() argument
737 phydev->attached_dev->phydev = NULL; in phy_detach()
738 phydev->attached_dev = NULL; in phy_detach()
739 phy_suspend(phydev); in phy_detach()
747 if (phydev->dev.driver == &genphy_driver[i].driver) { in phy_detach()
748 device_release_driver(&phydev->dev); in phy_detach()
757 bus = phydev->bus; in phy_detach()
759 put_device(&phydev->dev); in phy_detach()
764 int phy_suspend(struct phy_device *phydev) in phy_suspend() argument
766 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); in phy_suspend()
771 phy_ethtool_get_wol(phydev, &wol); in phy_suspend()
776 ret = phydrv->suspend(phydev); in phy_suspend()
781 phydev->suspended = true; in phy_suspend()
787 int phy_resume(struct phy_device *phydev) in phy_resume() argument
789 struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); in phy_resume()
793 ret = phydrv->resume(phydev); in phy_resume()
798 phydev->suspended = false; in phy_resume()
815 static int genphy_config_advert(struct phy_device *phydev) in genphy_config_advert() argument
822 phydev->advertising &= phydev->supported; in genphy_config_advert()
823 advertise = phydev->advertising; in genphy_config_advert()
826 adv = phy_read(phydev, MII_ADVERTISE); in genphy_config_advert()
836 err = phy_write(phydev, MII_ADVERTISE, adv); in genphy_config_advert()
843 bmsr = phy_read(phydev, MII_BMSR); in genphy_config_advert()
855 adv = phy_read(phydev, MII_CTRL1000); in genphy_config_advert()
862 if (phydev->supported & (SUPPORTED_1000baseT_Half | in genphy_config_advert()
870 err = phy_write(phydev, MII_CTRL1000, adv); in genphy_config_advert()
885 int genphy_setup_forced(struct phy_device *phydev) in genphy_setup_forced() argument
889 phydev->pause = 0; in genphy_setup_forced()
890 phydev->asym_pause = 0; in genphy_setup_forced()
892 if (SPEED_1000 == phydev->speed) in genphy_setup_forced()
894 else if (SPEED_100 == phydev->speed) in genphy_setup_forced()
897 if (DUPLEX_FULL == phydev->duplex) in genphy_setup_forced()
900 return phy_write(phydev, MII_BMCR, ctl); in genphy_setup_forced()
908 int genphy_restart_aneg(struct phy_device *phydev) in genphy_restart_aneg() argument
910 int ctl = phy_read(phydev, MII_BMCR); in genphy_restart_aneg()
920 return phy_write(phydev, MII_BMCR, ctl); in genphy_restart_aneg()
932 int genphy_config_aneg(struct phy_device *phydev) in genphy_config_aneg() argument
936 if (AUTONEG_ENABLE != phydev->autoneg) in genphy_config_aneg()
937 return genphy_setup_forced(phydev); in genphy_config_aneg()
939 result = genphy_config_advert(phydev); in genphy_config_aneg()
946 int ctl = phy_read(phydev, MII_BMCR); in genphy_config_aneg()
959 result = genphy_restart_aneg(phydev); in genphy_config_aneg()
973 int genphy_aneg_done(struct phy_device *phydev) in genphy_aneg_done() argument
975 int retval = phy_read(phydev, MII_BMSR); in genphy_aneg_done()
981 static int gen10g_config_aneg(struct phy_device *phydev) in gen10g_config_aneg() argument
994 int genphy_update_link(struct phy_device *phydev) in genphy_update_link() argument
999 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
1004 status = phy_read(phydev, MII_BMSR); in genphy_update_link()
1009 phydev->link = 0; in genphy_update_link()
1011 phydev->link = 1; in genphy_update_link()
1026 int genphy_read_status(struct phy_device *phydev) in genphy_read_status() argument
1036 err = genphy_update_link(phydev); in genphy_read_status()
1040 phydev->lp_advertising = 0; in genphy_read_status()
1042 if (AUTONEG_ENABLE == phydev->autoneg) { in genphy_read_status()
1043 if (phydev->supported & (SUPPORTED_1000baseT_Half in genphy_read_status()
1045 lpagb = phy_read(phydev, MII_STAT1000); in genphy_read_status()
1049 adv = phy_read(phydev, MII_CTRL1000); in genphy_read_status()
1053 phydev->lp_advertising = in genphy_read_status()
1058 lpa = phy_read(phydev, MII_LPA); in genphy_read_status()
1062 phydev->lp_advertising |= mii_lpa_to_ethtool_lpa_t(lpa); in genphy_read_status()
1064 adv = phy_read(phydev, MII_ADVERTISE); in genphy_read_status()
1070 phydev->speed = SPEED_10; in genphy_read_status()
1071 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1072 phydev->pause = 0; in genphy_read_status()
1073 phydev->asym_pause = 0; in genphy_read_status()
1076 phydev->speed = SPEED_1000; in genphy_read_status()
1079 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1081 phydev->speed = SPEED_100; in genphy_read_status()
1084 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1087 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1089 if (phydev->duplex == DUPLEX_FULL) { in genphy_read_status()
1090 phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; in genphy_read_status()
1091 phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; in genphy_read_status()
1094 int bmcr = phy_read(phydev, MII_BMCR); in genphy_read_status()
1100 phydev->duplex = DUPLEX_FULL; in genphy_read_status()
1102 phydev->duplex = DUPLEX_HALF; in genphy_read_status()
1105 phydev->speed = SPEED_1000; in genphy_read_status()
1107 phydev->speed = SPEED_100; in genphy_read_status()
1109 phydev->speed = SPEED_10; in genphy_read_status()
1111 phydev->pause = 0; in genphy_read_status()
1112 phydev->asym_pause = 0; in genphy_read_status()
1119 static int gen10g_read_status(struct phy_device *phydev) in gen10g_read_status() argument
1122 u32 mmd_mask = phydev->c45_ids.devices_in_package; in gen10g_read_status()
1124 phydev->link = 1; in gen10g_read_status()
1127 phydev->speed = SPEED_10000; in gen10g_read_status()
1128 phydev->duplex = DUPLEX_FULL; in gen10g_read_status()
1137 phy_read_mmd(phydev, devad, MDIO_STAT1); in gen10g_read_status()
1138 reg = phy_read_mmd(phydev, devad, MDIO_STAT1); in gen10g_read_status()
1140 phydev->link = 0; in gen10g_read_status()
1155 int genphy_soft_reset(struct phy_device *phydev) in genphy_soft_reset() argument
1159 ret = phy_write(phydev, MII_BMCR, BMCR_RESET); in genphy_soft_reset()
1163 return phy_poll_reset(phydev); in genphy_soft_reset()
1167 int genphy_config_init(struct phy_device *phydev) in genphy_config_init() argument
1177 val = phy_read(phydev, MII_BMSR); in genphy_config_init()
1194 val = phy_read(phydev, MII_ESTATUS); in genphy_config_init()
1204 phydev->supported &= features; in genphy_config_init()
1205 phydev->advertising &= features; in genphy_config_init()
1210 static int gen10g_soft_reset(struct phy_device *phydev) in gen10g_soft_reset() argument
1217 static int gen10g_config_init(struct phy_device *phydev) in gen10g_config_init() argument
1220 phydev->supported = SUPPORTED_10000baseT_Full; in gen10g_config_init()
1221 phydev->advertising = SUPPORTED_10000baseT_Full; in gen10g_config_init()
1226 int genphy_suspend(struct phy_device *phydev) in genphy_suspend() argument
1230 mutex_lock(&phydev->lock); in genphy_suspend()
1232 value = phy_read(phydev, MII_BMCR); in genphy_suspend()
1233 phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); in genphy_suspend()
1235 mutex_unlock(&phydev->lock); in genphy_suspend()
1241 static int gen10g_suspend(struct phy_device *phydev) in gen10g_suspend() argument
1246 int genphy_resume(struct phy_device *phydev) in genphy_resume() argument
1250 mutex_lock(&phydev->lock); in genphy_resume()
1252 value = phy_read(phydev, MII_BMCR); in genphy_resume()
1253 phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); in genphy_resume()
1255 mutex_unlock(&phydev->lock); in genphy_resume()
1261 static int gen10g_resume(struct phy_device *phydev) in gen10g_resume() argument
1266 static int __set_phy_supported(struct phy_device *phydev, u32 max_speed) in __set_phy_supported() argument
1272 phydev->supported &= PHY_DEFAULT_FEATURES; in __set_phy_supported()
1278 phydev->supported |= PHY_1000BT_FEATURES; in __set_phy_supported()
1281 phydev->supported |= PHY_100BT_FEATURES; in __set_phy_supported()
1284 phydev->supported |= PHY_10BT_FEATURES; in __set_phy_supported()
1290 int phy_set_max_speed(struct phy_device *phydev, u32 max_speed) in phy_set_max_speed() argument
1294 err = __set_phy_supported(phydev, max_speed); in phy_set_max_speed()
1298 phydev->advertising = phydev->supported; in phy_set_max_speed()
1304 static void of_set_phy_supported(struct phy_device *phydev) in of_set_phy_supported() argument
1306 struct device_node *node = phydev->dev.of_node; in of_set_phy_supported()
1316 __set_phy_supported(phydev, max_speed); in of_set_phy_supported()
1329 struct phy_device *phydev = to_phy_device(dev); in phy_probe() local
1330 struct device_driver *drv = phydev->dev.driver; in phy_probe()
1334 phydev->drv = phydrv; in phy_probe()
1340 phy_interrupt_is_valid(phydev)) in phy_probe()
1341 phydev->irq = PHY_POLL; in phy_probe()
1344 phydev->is_internal = true; in phy_probe()
1346 mutex_lock(&phydev->lock); in phy_probe()
1352 phydev->supported = phydrv->features; in phy_probe()
1353 of_set_phy_supported(phydev); in phy_probe()
1354 phydev->advertising = phydev->supported; in phy_probe()
1357 phydev->state = PHY_READY; in phy_probe()
1359 if (phydev->drv->probe) in phy_probe()
1360 err = phydev->drv->probe(phydev); in phy_probe()
1362 mutex_unlock(&phydev->lock); in phy_probe()
1369 struct phy_device *phydev = to_phy_device(dev); in phy_remove() local
1371 mutex_lock(&phydev->lock); in phy_remove()
1372 phydev->state = PHY_DOWN; in phy_remove()
1373 mutex_unlock(&phydev->lock); in phy_remove()
1375 if (phydev->drv->remove) in phy_remove()
1376 phydev->drv->remove(phydev); in phy_remove()
1377 phydev->drv = NULL; in phy_remove()