Lines Matching refs:phydev

64 static int mv2222_tx_enable(struct phy_device *phydev)  in mv2222_tx_enable()  argument
66 return phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS, in mv2222_tx_enable()
71 static int mv2222_tx_disable(struct phy_device *phydev) in mv2222_tx_disable() argument
73 return phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_TXDIS, in mv2222_tx_disable()
77 static int mv2222_soft_reset(struct phy_device *phydev) in mv2222_soft_reset() argument
81 ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PORT_RST, in mv2222_soft_reset()
86 return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND2, MV_PORT_RST, in mv2222_soft_reset()
91 static int mv2222_disable_aneg(struct phy_device *phydev) in mv2222_disable_aneg() argument
93 int ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL, in mv2222_disable_aneg()
98 return mv2222_soft_reset(phydev); in mv2222_disable_aneg()
101 static int mv2222_enable_aneg(struct phy_device *phydev) in mv2222_enable_aneg() argument
103 int ret = phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_CTRL, in mv2222_enable_aneg()
108 return mv2222_soft_reset(phydev); in mv2222_enable_aneg()
111 static int mv2222_set_sgmii_speed(struct phy_device *phydev) in mv2222_set_sgmii_speed() argument
113 struct mv2222_data *priv = phydev->priv; in mv2222_set_sgmii_speed()
115 switch (phydev->speed) { in mv2222_set_sgmii_speed()
122 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
133 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
143 return phy_modify_mmd(phydev, MDIO_MMD_PCS, in mv2222_set_sgmii_speed()
152 static bool mv2222_is_10g_capable(struct phy_device *phydev) in mv2222_is_10g_capable() argument
154 struct mv2222_data *priv = phydev->priv; in mv2222_is_10g_capable()
170 static bool mv2222_is_1gbx_capable(struct phy_device *phydev) in mv2222_is_1gbx_capable() argument
172 struct mv2222_data *priv = phydev->priv; in mv2222_is_1gbx_capable()
178 static bool mv2222_is_sgmii_capable(struct phy_device *phydev) in mv2222_is_sgmii_capable() argument
180 struct mv2222_data *priv = phydev->priv; in mv2222_is_sgmii_capable()
196 static int mv2222_config_line(struct phy_device *phydev) in mv2222_config_line() argument
198 struct mv2222_data *priv = phydev->priv; in mv2222_config_line()
202 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
205 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
208 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_PCS_CONFIG, in mv2222_config_line()
216 static int mv2222_swap_line_type(struct phy_device *phydev) in mv2222_swap_line_type() argument
218 struct mv2222_data *priv = phydev->priv; in mv2222_swap_line_type()
224 if (mv2222_is_1gbx_capable(phydev)) { in mv2222_swap_line_type()
229 if (mv2222_is_sgmii_capable(phydev)) { in mv2222_swap_line_type()
237 if (mv2222_is_10g_capable(phydev)) { in mv2222_swap_line_type()
248 ret = mv2222_config_line(phydev); in mv2222_swap_line_type()
256 static int mv2222_setup_forced(struct phy_device *phydev) in mv2222_setup_forced() argument
258 struct mv2222_data *priv = phydev->priv; in mv2222_setup_forced()
262 if (phydev->speed < SPEED_10000 && in mv2222_setup_forced()
263 phydev->speed != SPEED_UNKNOWN) { in mv2222_setup_forced()
264 ret = mv2222_swap_line_type(phydev); in mv2222_setup_forced()
271 ret = mv2222_set_sgmii_speed(phydev); in mv2222_setup_forced()
276 return mv2222_disable_aneg(phydev); in mv2222_setup_forced()
279 static int mv2222_config_aneg(struct phy_device *phydev) in mv2222_config_aneg() argument
281 struct mv2222_data *priv = phydev->priv; in mv2222_config_aneg()
288 if (phydev->autoneg == AUTONEG_DISABLE || in mv2222_config_aneg()
290 return mv2222_setup_forced(phydev); in mv2222_config_aneg()
295 ret = phy_modify_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_ADVERTISE, in mv2222_config_aneg()
302 return mv2222_enable_aneg(phydev); in mv2222_config_aneg()
305 static int mv2222_aneg_done(struct phy_device *phydev) in mv2222_aneg_done() argument
309 if (mv2222_is_10g_capable(phydev)) { in mv2222_aneg_done()
310 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1); in mv2222_aneg_done()
318 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT); in mv2222_aneg_done()
326 static int mv2222_read_status_10g(struct phy_device *phydev) in mv2222_read_status_10g() argument
331 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1); in mv2222_read_status_10g()
339 phydev->autoneg = AUTONEG_DISABLE; in mv2222_read_status_10g()
340 phydev->speed = SPEED_10000; in mv2222_read_status_10g()
341 phydev->duplex = DUPLEX_FULL; in mv2222_read_status_10g()
343 if (phydev->autoneg == AUTONEG_ENABLE) { in mv2222_read_status_10g()
349 val = mv2222_swap_line_type(phydev); in mv2222_read_status_10g()
353 return mv2222_config_aneg(phydev); in mv2222_read_status_10g()
362 static int mv2222_read_status_1g(struct phy_device *phydev) in mv2222_read_status_1g() argument
367 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_STAT); in mv2222_read_status_1g()
371 if (phydev->autoneg == AUTONEG_ENABLE && in mv2222_read_status_1g()
378 val = mv2222_swap_line_type(phydev); in mv2222_read_status_1g()
382 return mv2222_config_aneg(phydev); in mv2222_read_status_1g()
393 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_1GBX_PHY_STAT); in mv2222_read_status_1g()
399 phydev->duplex = DUPLEX_FULL; in mv2222_read_status_1g()
401 phydev->duplex = DUPLEX_HALF; in mv2222_read_status_1g()
404 phydev->speed = SPEED_1000; in mv2222_read_status_1g()
406 phydev->speed = SPEED_100; in mv2222_read_status_1g()
408 phydev->speed = SPEED_10; in mv2222_read_status_1g()
414 static bool mv2222_link_is_operational(struct phy_device *phydev) in mv2222_link_is_operational() argument
416 struct mv2222_data *priv = phydev->priv; in mv2222_link_is_operational()
419 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_RX_SIGNAL_DETECT); in mv2222_link_is_operational()
423 if (phydev->sfp_bus && !priv->sfp_link) in mv2222_link_is_operational()
429 static int mv2222_read_status(struct phy_device *phydev) in mv2222_read_status() argument
431 struct mv2222_data *priv = phydev->priv; in mv2222_read_status()
434 phydev->link = 0; in mv2222_read_status()
435 phydev->speed = SPEED_UNKNOWN; in mv2222_read_status()
436 phydev->duplex = DUPLEX_UNKNOWN; in mv2222_read_status()
438 if (!mv2222_link_is_operational(phydev)) in mv2222_read_status()
442 link = mv2222_read_status_10g(phydev); in mv2222_read_status()
444 link = mv2222_read_status_1g(phydev); in mv2222_read_status()
449 phydev->link = link; in mv2222_read_status()
454 static int mv2222_resume(struct phy_device *phydev) in mv2222_resume() argument
456 return mv2222_tx_enable(phydev); in mv2222_resume()
459 static int mv2222_suspend(struct phy_device *phydev) in mv2222_suspend() argument
461 return mv2222_tx_disable(phydev); in mv2222_suspend()
464 static int mv2222_get_features(struct phy_device *phydev) in mv2222_get_features() argument
471 static int mv2222_config_init(struct phy_device *phydev) in mv2222_config_init() argument
473 if (phydev->interface != PHY_INTERFACE_MODE_XAUI) in mv2222_config_init()
482 struct phy_device *phydev = upstream; in mv2222_sfp_insert() local
490 priv = (struct mv2222_data *)phydev->priv; in mv2222_sfp_insert()
491 dev = &phydev->mdio.dev; in mv2222_sfp_insert()
493 sfp_parse_support(phydev->sfp_bus, id, sfp_supported, interfaces); in mv2222_sfp_insert()
494 phydev->port = sfp_parse_port(phydev->sfp_bus, id, sfp_supported); in mv2222_sfp_insert()
495 sfp_interface = sfp_select_interface(phydev->sfp_bus, sfp_supported); in mv2222_sfp_insert()
508 linkmode_and(priv->supported, phydev->supported, sfp_supported); in mv2222_sfp_insert()
510 ret = mv2222_config_line(phydev); in mv2222_sfp_insert()
514 if (mutex_trylock(&phydev->lock)) { in mv2222_sfp_insert()
515 ret = mv2222_config_aneg(phydev); in mv2222_sfp_insert()
516 mutex_unlock(&phydev->lock); in mv2222_sfp_insert()
524 struct phy_device *phydev = upstream; in mv2222_sfp_remove() local
527 priv = (struct mv2222_data *)phydev->priv; in mv2222_sfp_remove()
531 phydev->port = PORT_NONE; in mv2222_sfp_remove()
536 struct phy_device *phydev = upstream; in mv2222_sfp_link_up() local
539 priv = phydev->priv; in mv2222_sfp_link_up()
545 struct phy_device *phydev = upstream; in mv2222_sfp_link_down() local
548 priv = phydev->priv; in mv2222_sfp_link_down()
561 static int mv2222_probe(struct phy_device *phydev) in mv2222_probe() argument
563 struct device *dev = &phydev->mdio.dev; in mv2222_probe()
587 linkmode_copy(phydev->supported, supported); in mv2222_probe()
594 phydev->priv = priv; in mv2222_probe()
596 return phy_sfp_probe(phydev, &sfp_phy_ops); in mv2222_probe()