Lines Matching refs:phydev

90 void phy_print_status(struct phy_device *phydev)  in phy_print_status()  argument
92 if (phydev->link) { in phy_print_status()
93 netdev_info(phydev->attached_dev, in phy_print_status()
95 phy_speed_to_str(phydev->speed), in phy_print_status()
96 DUPLEX_FULL == phydev->duplex ? "Full" : "Half", in phy_print_status()
97 phydev->pause ? "rx/tx" : "off"); in phy_print_status()
99 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
113 static int phy_clear_interrupt(struct phy_device *phydev) in phy_clear_interrupt() argument
115 if (phydev->drv->ack_interrupt) in phy_clear_interrupt()
116 return phydev->drv->ack_interrupt(phydev); in phy_clear_interrupt()
128 static int phy_config_interrupt(struct phy_device *phydev, u32 interrupts) in phy_config_interrupt() argument
130 phydev->interrupts = interrupts; in phy_config_interrupt()
131 if (phydev->drv->config_intr) in phy_config_interrupt()
132 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
146 static inline int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
148 if (phydev->drv->aneg_done) in phy_aneg_done()
149 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
151 return genphy_aneg_done(phydev); in phy_aneg_done()
290 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
292 u32 features = phydev->supported; in phy_sanitize_settings()
297 phydev->autoneg = AUTONEG_DISABLE; in phy_sanitize_settings()
299 idx = phy_find_valid(phy_find_setting(phydev->speed, phydev->duplex), in phy_sanitize_settings()
302 phydev->speed = settings[idx].speed; in phy_sanitize_settings()
303 phydev->duplex = settings[idx].duplex; in phy_sanitize_settings()
318 int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd) in phy_ethtool_sset() argument
322 if (cmd->phy_address != phydev->addr) in phy_ethtool_sset()
326 cmd->advertising &= phydev->supported; in phy_ethtool_sset()
343 phydev->autoneg = cmd->autoneg; in phy_ethtool_sset()
345 phydev->speed = speed; in phy_ethtool_sset()
347 phydev->advertising = cmd->advertising; in phy_ethtool_sset()
350 phydev->advertising |= ADVERTISED_Autoneg; in phy_ethtool_sset()
352 phydev->advertising &= ~ADVERTISED_Autoneg; in phy_ethtool_sset()
354 phydev->duplex = cmd->duplex; in phy_ethtool_sset()
356 phydev->mdix = cmd->eth_tp_mdix_ctrl; in phy_ethtool_sset()
359 phy_start_aneg(phydev); in phy_ethtool_sset()
365 int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd) in phy_ethtool_gset() argument
367 cmd->supported = phydev->supported; in phy_ethtool_gset()
369 cmd->advertising = phydev->advertising; in phy_ethtool_gset()
370 cmd->lp_advertising = phydev->lp_advertising; in phy_ethtool_gset()
372 ethtool_cmd_speed_set(cmd, phydev->speed); in phy_ethtool_gset()
373 cmd->duplex = phydev->duplex; in phy_ethtool_gset()
374 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_gset()
378 cmd->phy_address = phydev->addr; in phy_ethtool_gset()
379 cmd->transceiver = phy_is_internal(phydev) ? in phy_ethtool_gset()
381 cmd->autoneg = phydev->autoneg; in phy_ethtool_gset()
382 cmd->eth_tp_mdix_ctrl = phydev->mdix; in phy_ethtool_gset()
398 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
406 mii_data->phy_id = phydev->addr; in phy_mii_ioctl()
410 mii_data->val_out = mdiobus_read(phydev->bus, mii_data->phy_id, in phy_mii_ioctl()
415 if (mii_data->phy_id == phydev->addr) { in phy_mii_ioctl()
419 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
421 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
423 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
425 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
427 phydev->speed = SPEED_1000; in phy_mii_ioctl()
429 phydev->speed = SPEED_100; in phy_mii_ioctl()
430 else phydev->speed = SPEED_10; in phy_mii_ioctl()
433 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
435 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
439 phydev->advertising = mii_adv_to_ethtool_adv_t(val); in phy_mii_ioctl()
448 mdiobus_write(phydev->bus, mii_data->phy_id, in phy_mii_ioctl()
451 if (mii_data->phy_id == phydev->addr && in phy_mii_ioctl()
454 return phy_init_hw(phydev); in phy_mii_ioctl()
457 return phy_start_aneg(phydev); in phy_mii_ioctl()
462 if (phydev->drv->hwtstamp) in phy_mii_ioctl()
463 return phydev->drv->hwtstamp(phydev, ifr); in phy_mii_ioctl()
481 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
485 mutex_lock(&phydev->lock); in phy_start_aneg()
487 if (AUTONEG_DISABLE == phydev->autoneg) in phy_start_aneg()
488 phy_sanitize_settings(phydev); in phy_start_aneg()
491 phydev->lp_advertising = 0; in phy_start_aneg()
493 err = phydev->drv->config_aneg(phydev); in phy_start_aneg()
497 if (phydev->state != PHY_HALTED) { in phy_start_aneg()
498 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_start_aneg()
499 phydev->state = PHY_AN; in phy_start_aneg()
500 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_start_aneg()
502 phydev->state = PHY_FORCING; in phy_start_aneg()
503 phydev->link_timeout = PHY_FORCE_TIMEOUT; in phy_start_aneg()
508 mutex_unlock(&phydev->lock); in phy_start_aneg()
523 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
525 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, HZ); in phy_start_machine()
536 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
538 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
540 mutex_lock(&phydev->lock); in phy_stop_machine()
541 if (phydev->state > PHY_UP) in phy_stop_machine()
542 phydev->state = PHY_UP; in phy_stop_machine()
543 mutex_unlock(&phydev->lock); in phy_stop_machine()
555 static void phy_error(struct phy_device *phydev) in phy_error() argument
557 mutex_lock(&phydev->lock); in phy_error()
558 phydev->state = PHY_HALTED; in phy_error()
559 mutex_unlock(&phydev->lock); in phy_error()
572 struct phy_device *phydev = phy_dat; in phy_interrupt() local
574 if (PHY_HALTED == phydev->state) in phy_interrupt()
583 atomic_inc(&phydev->irq_disable); in phy_interrupt()
585 queue_work(system_power_efficient_wq, &phydev->phy_queue); in phy_interrupt()
594 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
596 int err = phy_clear_interrupt(phydev); in phy_enable_interrupts()
601 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
608 static int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
613 err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
618 err = phy_clear_interrupt(phydev); in phy_disable_interrupts()
625 phy_error(phydev); in phy_disable_interrupts()
640 int phy_start_interrupts(struct phy_device *phydev) in phy_start_interrupts() argument
642 atomic_set(&phydev->irq_disable, 0); in phy_start_interrupts()
643 if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", in phy_start_interrupts()
644 phydev) < 0) { in phy_start_interrupts()
646 phydev->bus->name, phydev->irq); in phy_start_interrupts()
647 phydev->irq = PHY_POLL; in phy_start_interrupts()
651 return phy_enable_interrupts(phydev); in phy_start_interrupts()
659 int phy_stop_interrupts(struct phy_device *phydev) in phy_stop_interrupts() argument
661 int err = phy_disable_interrupts(phydev); in phy_stop_interrupts()
664 phy_error(phydev); in phy_stop_interrupts()
666 free_irq(phydev->irq, phydev); in phy_stop_interrupts()
673 cancel_work_sync(&phydev->phy_queue); in phy_stop_interrupts()
678 while (atomic_dec_return(&phydev->irq_disable) >= 0) in phy_stop_interrupts()
679 enable_irq(phydev->irq); in phy_stop_interrupts()
691 struct phy_device *phydev = in phy_change() local
694 if (phydev->drv->did_interrupt && in phy_change()
695 !phydev->drv->did_interrupt(phydev)) in phy_change()
698 if (phy_disable_interrupts(phydev)) in phy_change()
701 mutex_lock(&phydev->lock); in phy_change()
702 if ((PHY_RUNNING == phydev->state) || (PHY_NOLINK == phydev->state)) in phy_change()
703 phydev->state = PHY_CHANGELINK; in phy_change()
704 mutex_unlock(&phydev->lock); in phy_change()
706 atomic_dec(&phydev->irq_disable); in phy_change()
707 enable_irq(phydev->irq); in phy_change()
710 if (PHY_HALTED != phydev->state && in phy_change()
711 phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED)) in phy_change()
715 cancel_delayed_work_sync(&phydev->state_queue); in phy_change()
716 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, 0); in phy_change()
720 atomic_dec(&phydev->irq_disable); in phy_change()
721 enable_irq(phydev->irq); in phy_change()
725 disable_irq(phydev->irq); in phy_change()
726 atomic_inc(&phydev->irq_disable); in phy_change()
728 phy_error(phydev); in phy_change()
735 void phy_stop(struct phy_device *phydev) in phy_stop() argument
737 mutex_lock(&phydev->lock); in phy_stop()
739 if (PHY_HALTED == phydev->state) in phy_stop()
742 if (phy_interrupt_is_valid(phydev)) { in phy_stop()
744 phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_stop()
747 phy_clear_interrupt(phydev); in phy_stop()
750 phydev->state = PHY_HALTED; in phy_stop()
753 mutex_unlock(&phydev->lock); in phy_stop()
772 void phy_start(struct phy_device *phydev) in phy_start() argument
777 mutex_lock(&phydev->lock); in phy_start()
779 switch (phydev->state) { in phy_start()
781 phydev->state = PHY_PENDING; in phy_start()
784 phydev->state = PHY_UP; in phy_start()
788 err = phy_enable_interrupts(phydev); in phy_start()
792 phydev->state = PHY_RESUMING; in phy_start()
798 mutex_unlock(&phydev->lock); in phy_start()
802 phy_resume(phydev); in phy_start()
813 struct phy_device *phydev = in phy_state_machine() local
820 mutex_lock(&phydev->lock); in phy_state_machine()
822 old_state = phydev->state; in phy_state_machine()
824 if (phydev->drv->link_change_notify) in phy_state_machine()
825 phydev->drv->link_change_notify(phydev); in phy_state_machine()
827 switch (phydev->state) { in phy_state_machine()
836 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
840 err = phy_read_status(phydev); in phy_state_machine()
845 if (!phydev->link) { in phy_state_machine()
846 phydev->state = PHY_NOLINK; in phy_state_machine()
847 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
848 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
853 err = phy_aneg_done(phydev); in phy_state_machine()
859 phydev->state = PHY_RUNNING; in phy_state_machine()
860 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
861 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
863 } else if (0 == phydev->link_timeout--) in phy_state_machine()
867 if (phy_interrupt_is_valid(phydev)) in phy_state_machine()
870 err = phy_read_status(phydev); in phy_state_machine()
874 if (phydev->link) { in phy_state_machine()
875 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_state_machine()
876 err = phy_aneg_done(phydev); in phy_state_machine()
881 phydev->state = PHY_AN; in phy_state_machine()
882 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
886 phydev->state = PHY_RUNNING; in phy_state_machine()
887 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
888 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
892 err = genphy_update_link(phydev); in phy_state_machine()
896 if (phydev->link) { in phy_state_machine()
897 phydev->state = PHY_RUNNING; in phy_state_machine()
898 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
900 if (0 == phydev->link_timeout--) in phy_state_machine()
904 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
910 if (!phy_interrupt_is_valid(phydev)) { in phy_state_machine()
911 old_link = phydev->link; in phy_state_machine()
912 err = phy_read_status(phydev); in phy_state_machine()
916 if (old_link != phydev->link) in phy_state_machine()
917 phydev->state = PHY_CHANGELINK; in phy_state_machine()
921 err = phy_read_status(phydev); in phy_state_machine()
925 if (phydev->link) { in phy_state_machine()
926 phydev->state = PHY_RUNNING; in phy_state_machine()
927 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
929 phydev->state = PHY_NOLINK; in phy_state_machine()
930 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
933 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
935 if (phy_interrupt_is_valid(phydev)) in phy_state_machine()
936 err = phy_config_interrupt(phydev, in phy_state_machine()
940 if (phydev->link) { in phy_state_machine()
941 phydev->link = 0; in phy_state_machine()
942 netif_carrier_off(phydev->attached_dev); in phy_state_machine()
943 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
948 if (AUTONEG_ENABLE == phydev->autoneg) { in phy_state_machine()
949 err = phy_aneg_done(phydev); in phy_state_machine()
957 err = phy_read_status(phydev); in phy_state_machine()
961 if (phydev->link) { in phy_state_machine()
962 phydev->state = PHY_RUNNING; in phy_state_machine()
963 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
965 phydev->state = PHY_NOLINK; in phy_state_machine()
967 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
969 phydev->state = PHY_AN; in phy_state_machine()
970 phydev->link_timeout = PHY_AN_TIMEOUT; in phy_state_machine()
973 err = phy_read_status(phydev); in phy_state_machine()
977 if (phydev->link) { in phy_state_machine()
978 phydev->state = PHY_RUNNING; in phy_state_machine()
979 netif_carrier_on(phydev->attached_dev); in phy_state_machine()
981 phydev->state = PHY_NOLINK; in phy_state_machine()
983 phydev->adjust_link(phydev->attached_dev); in phy_state_machine()
988 mutex_unlock(&phydev->lock); in phy_state_machine()
991 err = phy_start_aneg(phydev); in phy_state_machine()
993 phy_suspend(phydev); in phy_state_machine()
996 phy_error(phydev); in phy_state_machine()
998 dev_dbg(&phydev->dev, "PHY state change %s -> %s\n", in phy_state_machine()
999 phy_state_to_str(old_state), phy_state_to_str(phydev->state)); in phy_state_machine()
1001 queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_state_machine()
1005 void phy_mac_interrupt(struct phy_device *phydev, int new_link) in phy_mac_interrupt() argument
1007 cancel_work_sync(&phydev->phy_queue); in phy_mac_interrupt()
1008 phydev->link = new_link; in phy_mac_interrupt()
1009 schedule_work(&phydev->phy_queue); in phy_mac_interrupt()
1041 int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, in phy_read_mmd_indirect() argument
1044 struct phy_driver *phydrv = phydev->drv; in phy_read_mmd_indirect()
1048 struct mii_bus *bus = phydev->bus; in phy_read_mmd_indirect()
1057 value = phydrv->read_mmd_indirect(phydev, prtad, devad, addr); in phy_read_mmd_indirect()
1079 void phy_write_mmd_indirect(struct phy_device *phydev, int prtad, in phy_write_mmd_indirect() argument
1082 struct phy_driver *phydrv = phydev->drv; in phy_write_mmd_indirect()
1085 struct mii_bus *bus = phydev->bus; in phy_write_mmd_indirect()
1094 phydrv->write_mmd_indirect(phydev, prtad, devad, addr, data); in phy_write_mmd_indirect()
1109 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1116 if ((phydev->duplex == DUPLEX_FULL) && in phy_init_eee()
1117 ((phydev->interface == PHY_INTERFACE_MODE_MII) || in phy_init_eee()
1118 (phydev->interface == PHY_INTERFACE_MODE_GMII) || in phy_init_eee()
1119 phy_interface_is_rgmii(phydev) || in phy_init_eee()
1120 phy_is_internal(phydev))) { in phy_init_eee()
1126 status = phy_read_status(phydev); in phy_init_eee()
1131 eee_cap = phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_ABLE, in phy_init_eee()
1132 MDIO_MMD_PCS, phydev->addr); in phy_init_eee()
1143 eee_lp = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_LPABLE, in phy_init_eee()
1144 MDIO_MMD_AN, phydev->addr); in phy_init_eee()
1148 eee_adv = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, in phy_init_eee()
1149 MDIO_MMD_AN, phydev->addr); in phy_init_eee()
1155 if (!phy_check_valid(phydev->speed, phydev->duplex, lp & adv)) in phy_init_eee()
1162 int val = phy_read_mmd_indirect(phydev, MDIO_CTRL1, in phy_init_eee()
1164 phydev->addr); in phy_init_eee()
1169 phy_write_mmd_indirect(phydev, MDIO_CTRL1, in phy_init_eee()
1170 MDIO_MMD_PCS, phydev->addr, in phy_init_eee()
1188 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1190 return phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_WK_ERR, in phy_get_eee_err()
1191 MDIO_MMD_PCS, phydev->addr); in phy_get_eee_err()
1203 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1208 val = phy_read_mmd_indirect(phydev, MDIO_PCS_EEE_ABLE, in phy_ethtool_get_eee()
1209 MDIO_MMD_PCS, phydev->addr); in phy_ethtool_get_eee()
1215 val = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_ADV, in phy_ethtool_get_eee()
1216 MDIO_MMD_AN, phydev->addr); in phy_ethtool_get_eee()
1222 val = phy_read_mmd_indirect(phydev, MDIO_AN_EEE_LPABLE, in phy_ethtool_get_eee()
1223 MDIO_MMD_AN, phydev->addr); in phy_ethtool_get_eee()
1239 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1243 phy_write_mmd_indirect(phydev, MDIO_AN_EEE_ADV, MDIO_MMD_AN, in phy_ethtool_set_eee()
1244 phydev->addr, val); in phy_ethtool_set_eee()
1250 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1252 if (phydev->drv->set_wol) in phy_ethtool_set_wol()
1253 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1259 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1261 if (phydev->drv->get_wol) in phy_ethtool_get_wol()
1262 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()