Lines Matching full:phydev

63 static int mv2222_tx_enable(struct phy_device *phydev)  in mv2222_tx_enable()  argument
65 return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS, in mv2222_tx_enable()
70 static int mv2222_tx_disable(struct phy_device *phydev) in mv2222_tx_disable() argument
72 return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS, in mv2222_tx_disable()
76 static int mv2222_soft_reset(struct phy_device *phydev) in mv2222_soft_reset() argument
80 ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PORT_RST, in mv2222_soft_reset()
85 return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND2, MV_PORT_RST, in mv2222_soft_reset()
90 static int mv2222_disable_aneg(struct phy_device *phydev) in mv2222_disable_aneg() argument
92 int ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL, in mv2222_disable_aneg()
97 return mv2222_soft_reset(phydev); in mv2222_disable_aneg()
100 static int mv2222_enable_aneg(struct phy_device *phydev) in mv2222_enable_aneg() argument
102 int ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL, in mv2222_enable_aneg()
107 return mv2222_soft_reset(phydev); in mv2222_enable_aneg()
110 static int mv2222_set_sgmii_speed(struct phy_device *phydev) in mv2222_set_sgmii_speed() argument
112 struct mv2222_data *priv = phydev->priv; in mv2222_set_sgmii_speed()
114 switch (phydev->speed) { in mv2222_set_sgmii_speed()
121 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
132 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
142 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
151 static bool mv2222_is_10g_capable(struct phy_device *phydev) in mv2222_is_10g_capable() argument
153 struct mv2222_data *priv = phydev->priv; in mv2222_is_10g_capable()
169 static bool mv2222_is_1gbx_capable(struct phy_device *phydev) in mv2222_is_1gbx_capable() argument
171 struct mv2222_data *priv = phydev->priv; in mv2222_is_1gbx_capable()
177 static bool mv2222_is_sgmii_capable(struct phy_device *phydev) in mv2222_is_sgmii_capable() argument
179 struct mv2222_data *priv = phydev->priv; in mv2222_is_sgmii_capable()
195 static int mv2222_config_line(struct phy_device *phydev) in mv2222_config_line() argument
197 struct mv2222_data *priv = phydev->priv; in mv2222_config_line()
201 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
204 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
207 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
215 static int mv2222_swap_line_type(struct phy_device *phydev) in mv2222_swap_line_type() argument
217 struct mv2222_data *priv = phydev->priv; in mv2222_swap_line_type()
223 if (mv2222_is_1gbx_capable(phydev)) { in mv2222_swap_line_type()
228 if (mv2222_is_sgmii_capable(phydev)) { in mv2222_swap_line_type()
236 if (mv2222_is_10g_capable(phydev)) { in mv2222_swap_line_type()
247 ret = mv2222_config_line(phydev); in mv2222_swap_line_type()
255 static int mv2222_setup_forced(struct phy_device *phydev) in mv2222_setup_forced() argument
257 struct mv2222_data *priv = phydev->priv; in mv2222_setup_forced()
261 if (phydev->speed < SPEED_10000 && in mv2222_setup_forced()
262 phydev->speed != SPEED_UNKNOWN) { in mv2222_setup_forced()
263 ret = mv2222_swap_line_type(phydev); in mv2222_setup_forced()
270 ret = mv2222_set_sgmii_speed(phydev); in mv2222_setup_forced()
275 return mv2222_disable_aneg(phydev); in mv2222_setup_forced()
278 static int mv2222_config_aneg(struct phy_device *phydev) in mv2222_config_aneg() argument
280 struct mv2222_data *priv = phydev->priv; in mv2222_config_aneg()
287 if (phydev->autoneg == AUTONEG_DISABLE || in mv2222_config_aneg()
289 return mv2222_setup_forced(phydev); in mv2222_config_aneg()
294 ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_ADVERTISE, in mv2222_config_aneg()
301 return mv2222_enable_aneg(phydev); in mv2222_config_aneg()
304 static int mv2222_aneg_done(struct phy_device *phydev) in mv2222_aneg_done() argument
308 if (mv2222_is_10g_capable(phydev)) { in mv2222_aneg_done()
309 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1); in mv2222_aneg_done()
317 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT); in mv2222_aneg_done()
325 static int mv2222_read_status_10g(struct phy_device *phydev) in mv2222_read_status_10g() argument
330 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1); in mv2222_read_status_10g()
338 phydev->autoneg = AUTONEG_DISABLE; in mv2222_read_status_10g()
339 phydev->speed = SPEED_10000; in mv2222_read_status_10g()
340 phydev->duplex = DUPLEX_FULL; in mv2222_read_status_10g()
342 if (phydev->autoneg == AUTONEG_ENABLE) { in mv2222_read_status_10g()
348 val = mv2222_swap_line_type(phydev); in mv2222_read_status_10g()
352 return mv2222_config_aneg(phydev); in mv2222_read_status_10g()
361 static int mv2222_read_status_1g(struct phy_device *phydev) in mv2222_read_status_1g() argument
366 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT); in mv2222_read_status_1g()
370 if (phydev->autoneg == AUTONEG_ENABLE && in mv2222_read_status_1g()
377 val = mv2222_swap_line_type(phydev); in mv2222_read_status_1g()
381 return mv2222_config_aneg(phydev); in mv2222_read_status_1g()
392 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_PHY_STAT); in mv2222_read_status_1g()
398 phydev->duplex = DUPLEX_FULL; in mv2222_read_status_1g()
400 phydev->duplex = DUPLEX_HALF; in mv2222_read_status_1g()
403 phydev->speed = SPEED_1000; in mv2222_read_status_1g()
405 phydev->speed = SPEED_100; in mv2222_read_status_1g()
407 phydev->speed = SPEED_10; in mv2222_read_status_1g()
413 static bool mv2222_link_is_operational(struct phy_device *phydev) in mv2222_link_is_operational() argument
415 struct mv2222_data *priv = phydev->priv; in mv2222_link_is_operational()
418 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_RX_SIGNAL_DETECT); in mv2222_link_is_operational()
422 if (phydev->sfp_bus && !priv->sfp_link) in mv2222_link_is_operational()
428 static int mv2222_read_status(struct phy_device *phydev) in mv2222_read_status() argument
430 struct mv2222_data *priv = phydev->priv; in mv2222_read_status()
433 phydev->link = 0; in mv2222_read_status()
434 phydev->speed = SPEED_UNKNOWN; in mv2222_read_status()
435 phydev->duplex = DUPLEX_UNKNOWN; in mv2222_read_status()
437 if (!mv2222_link_is_operational(phydev)) in mv2222_read_status()
441 link = mv2222_read_status_10g(phydev); in mv2222_read_status()
443 link = mv2222_read_status_1g(phydev); in mv2222_read_status()
448 phydev->link = link; in mv2222_read_status()
453 static int mv2222_resume(struct phy_device *phydev) in mv2222_resume() argument
455 return mv2222_tx_enable(phydev); in mv2222_resume()
458 static int mv2222_suspend(struct phy_device *phydev) in mv2222_suspend() argument
460 return mv2222_tx_disable(phydev); in mv2222_suspend()
463 static int mv2222_get_features(struct phy_device *phydev) in mv2222_get_features() argument
470 static int mv2222_config_init(struct phy_device *phydev) in mv2222_config_init() argument
472 if (phydev->interface != PHY_INTERFACE_MODE_XAUI) in mv2222_config_init()
481 struct phy_device *phydev = upstream; in mv2222_sfp_insert() local
489 priv = phydev->priv; in mv2222_sfp_insert()
490 dev = &phydev->mdio.dev; in mv2222_sfp_insert()
492 sfp_parse_support(phydev->sfp_bus, id, sfp_supported, interfaces); in mv2222_sfp_insert()
493 phydev->port = sfp_parse_port(phydev->sfp_bus, id, sfp_supported); in mv2222_sfp_insert()
494 sfp_interface = sfp_select_interface(phydev->sfp_bus, sfp_supported); in mv2222_sfp_insert()
507 linkmode_and(priv->supported, phydev->supported, sfp_supported); in mv2222_sfp_insert()
509 ret = mv2222_config_line(phydev); in mv2222_sfp_insert()
513 if (mutex_trylock(&phydev->lock)) { in mv2222_sfp_insert()
514 ret = mv2222_config_aneg(phydev); in mv2222_sfp_insert()
515 mutex_unlock(&phydev->lock); in mv2222_sfp_insert()
523 struct phy_device *phydev = upstream; in mv2222_sfp_remove() local
526 priv = phydev->priv; in mv2222_sfp_remove()
530 phydev->port = PORT_NONE; in mv2222_sfp_remove()
535 struct phy_device *phydev = upstream; in mv2222_sfp_link_up() local
538 priv = phydev->priv; in mv2222_sfp_link_up()
544 struct phy_device *phydev = upstream; in mv2222_sfp_link_down() local
547 priv = phydev->priv; in mv2222_sfp_link_down()
560 static int mv2222_probe(struct phy_device *phydev) in mv2222_probe() argument
562 struct device *dev = &phydev->mdio.dev; in mv2222_probe()
586 linkmode_copy(phydev->supported, supported); in mv2222_probe()
593 phydev->priv = priv; in mv2222_probe()
595 return phy_sfp_probe(phydev, &sfp_phy_ops); in mv2222_probe()