Lines Matching +full:enable +full:- +full:lpa
1 // SPDX-License-Identifier: GPL-2.0
11 #include <linux/pcs/pcs-xpcs.h>
17 #include "pcs-xpcs.h"
128 for (compat = xpcs->desc->compat; compat->supported; compat++) in xpcs_find_compat()
129 if (compat->interface == interface) in xpcs_find_compat()
137 return &xpcs->pcs; in xpcs_to_phylink_pcs()
147 return -ENODEV; in xpcs_get_an_mode()
149 return compat->an_mode; in xpcs_get_an_mode()
158 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in __xpcs_linkmode_supported()
159 if (compat->supported[i] == linkmode) in __xpcs_linkmode_supported()
170 return mdiodev_c45_read(xpcs->mdiodev, dev, reg); in xpcs_read()
175 return mdiodev_c45_write(xpcs->mdiodev, dev, reg, val); in xpcs_write()
180 return mdiodev_c45_modify(xpcs->mdiodev, dev, reg, mask, set); in xpcs_modify()
186 return mdiodev_c45_modify_changed(xpcs->mdiodev, dev, reg, mask, set); in xpcs_modify_changed()
239 switch (compat->an_mode) { in xpcs_soft_reset()
250 return -EINVAL; in xpcs_soft_reset()
262 if ((__state)->link) \
263 dev_warn(&(__xpcs)->mdiodev->dev, ##__args); \
274 return -EFAULT; in xpcs_read_fault_c73()
292 return -EFAULT; in xpcs_read_fault_c73()
308 return -EFAULT; in xpcs_read_fault_c73()
359 dev_err(&xpcs->mdiodev->dev, "%s: XPCS access returned %pe\n", in xpcs_link_up_usxgmii()
448 u16 lpa[3]; in xpcs_read_lpa_c73() local
452 phylink_clear(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
456 phylink_set(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
459 for (i = ARRAY_SIZE(lpa); --i >= 0; ) { in xpcs_read_lpa_c73()
464 lpa[i] = ret; in xpcs_read_lpa_c73()
467 mii_c73_mod_linkmode(state->lp_advertising, lpa); in xpcs_read_lpa_c73()
475 unsigned long *adv = state->advertising; in xpcs_get_max_xlgmii_speed()
529 state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_resolve_pma()
530 state->duplex = DUPLEX_FULL; in xpcs_resolve_pma()
532 switch (state->interface) { in xpcs_resolve_pma()
534 state->speed = SPEED_10000; in xpcs_resolve_pma()
537 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state); in xpcs_resolve_pma()
540 state->speed = SPEED_UNKNOWN; in xpcs_resolve_pma()
554 compat = xpcs_find_compat(xpcs, state->interface); in xpcs_validate()
556 return -EINVAL; in xpcs_validate()
562 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in xpcs_validate()
563 set_bit(compat->supported[i], xpcs_supported); in xpcs_validate()
580 switch (compat->an_mode) { in xpcs_inband_caps()
601 for (compat = xpcs->desc->compat; compat->supported; compat++) in xpcs_get_interfaces()
602 __set_bit(compat->interface, interfaces); in xpcs_get_interfaces()
610 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_switch_interface_mode()
612 } else if (xpcs->interface != interface) { in xpcs_switch_interface_mode()
614 xpcs->need_reset = true; in xpcs_switch_interface_mode()
615 xpcs->interface = interface; in xpcs_switch_interface_mode()
629 dev_err(&xpcs->mdiodev->dev, "switch interface failed: %pe\n", in xpcs_pre_config()
632 if (!xpcs->need_reset) in xpcs_pre_config()
637 dev_err(&xpcs->mdiodev->dev, "unsupported interface %s\n", in xpcs_pre_config()
644 dev_err(&xpcs->mdiodev->dev, "soft reset failed: %pe\n", in xpcs_pre_config()
647 xpcs->need_reset = false; in xpcs_pre_config()
656 /* For AN for C37 SGMII mode, the settings are :- in xpcs_config_aneg_c37_sgmii()
664 * 5) VR_MII_MMD_CTRL Bit(12) [AN_ENABLE] = 1b (Enable SGMII AN) in xpcs_config_aneg_c37_sgmii()
672 * trigger AN restart for MAC-side SGMII. in xpcs_config_aneg_c37_sgmii()
689 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_config_aneg_c37_sgmii()
710 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_config_aneg_c37_sgmii()
735 /* According to Chap 7.12, to set 1000BASE-X C37 AN, AN must in xpcs_config_aneg_c37_1000basex()
736 * be disabled first:- in xpcs_config_aneg_c37_1000basex()
738 * 2) VR_MII_AN_CTRL Bit(2:1)[PCS_MODE] = 00b (1000BASE-X C37) in xpcs_config_aneg_c37_1000basex()
757 if (!xpcs->pcs.poll) { in xpcs_config_aneg_c37_1000basex()
820 return -ENODEV; in xpcs_do_config()
822 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) { in xpcs_do_config()
824 * SGMII and 1000base-X in xpcs_do_config()
832 switch (compat->an_mode) { in xpcs_do_config()
859 return -EINVAL; in xpcs_do_config()
862 if (compat->pma_config) { in xpcs_do_config()
863 ret = compat->pma_config(xpcs); in xpcs_do_config()
890 /* The link status bit is latching-low, so it is important to in xpcs_get_state_c73()
891 * avoid unnecessary re-reads of this register to avoid missing in xpcs_get_state_c73()
892 * a link-down event. in xpcs_get_state_c73()
896 state->link = false; in xpcs_get_state_c73()
901 state->link = !!(pcs_stat1 & MDIO_STAT1_LSTATUS); in xpcs_get_state_c73()
910 state->link = 0; in xpcs_get_state_c73()
912 return xpcs_do_config(xpcs, state->interface, NULL, in xpcs_get_state_c73()
917 if (!state->link) in xpcs_get_state_c73()
921 state->advertising); in xpcs_get_state_c73()
923 /* The link status bit is latching-low, so it is important to in xpcs_get_state_c73()
924 * avoid unnecessary re-reads of this register to avoid missing in xpcs_get_state_c73()
925 * a link-down event. in xpcs_get_state_c73()
929 state->link = false; in xpcs_get_state_c73()
933 state->an_complete = xpcs_aneg_done_c73(xpcs, state, compat, in xpcs_get_state_c73()
935 if (!state->an_complete) { in xpcs_get_state_c73()
936 state->link = false; in xpcs_get_state_c73()
942 state->link = false; in xpcs_get_state_c73()
960 state->link = false; in xpcs_get_state_c37_sgmii()
961 state->speed = SPEED_UNKNOWN; in xpcs_get_state_c37_sgmii()
962 state->duplex = DUPLEX_UNKNOWN; in xpcs_get_state_c37_sgmii()
963 state->pause = 0; in xpcs_get_state_c37_sgmii()
975 state->link = true; in xpcs_get_state_c37_sgmii()
979 state->speed = SPEED_1000; in xpcs_get_state_c37_sgmii()
981 state->speed = SPEED_100; in xpcs_get_state_c37_sgmii()
983 state->speed = SPEED_10; in xpcs_get_state_c37_sgmii()
986 state->duplex = DUPLEX_FULL; in xpcs_get_state_c37_sgmii()
988 state->duplex = DUPLEX_HALF; in xpcs_get_state_c37_sgmii()
992 state->link = true; in xpcs_get_state_c37_sgmii()
1000 state->speed = SPEED_1000; in xpcs_get_state_c37_sgmii()
1002 state->speed = SPEED_100; in xpcs_get_state_c37_sgmii()
1004 state->speed = SPEED_10; in xpcs_get_state_c37_sgmii()
1011 state->duplex = DUPLEX_FULL; in xpcs_get_state_c37_sgmii()
1013 state->duplex = DUPLEX_HALF; in xpcs_get_state_c37_sgmii()
1025 int lpa, bmsr; in xpcs_get_state_c37_1000basex() local
1028 state->advertising)) { in xpcs_get_state_c37_1000basex()
1030 state->link = false; in xpcs_get_state_c37_1000basex()
1032 lpa = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_LPA); in xpcs_get_state_c37_1000basex()
1033 if (lpa < 0 || lpa & LPA_RFAULT) in xpcs_get_state_c37_1000basex()
1034 return lpa; in xpcs_get_state_c37_1000basex()
1041 if (!xpcs->pcs.poll) { in xpcs_get_state_c37_1000basex()
1051 phylink_mii_c22_pcs_decode_state(state, neg_mode, bmsr, lpa); in xpcs_get_state_c37_1000basex()
1064 state->link = 0; in xpcs_get_state_2500basex()
1068 state->link = !!(ret & BMSR_LSTATUS); in xpcs_get_state_2500basex()
1069 if (!state->link) in xpcs_get_state_2500basex()
1072 state->speed = SPEED_2500; in xpcs_get_state_2500basex()
1073 state->pause |= MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_get_state_2500basex()
1074 state->duplex = DUPLEX_FULL; in xpcs_get_state_2500basex()
1086 compat = xpcs_find_compat(xpcs, state->interface); in xpcs_get_state()
1090 switch (compat->an_mode) { in xpcs_get_state()
1092 phylink_mii_c45_pcs_get_state(xpcs->mdiodev, state); in xpcs_get_state()
1097 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1103 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1109 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1115 dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", in xpcs_get_state()
1135 dev_err(&xpcs->mdiodev->dev, in xpcs_link_up_sgmii_1000basex()
1142 dev_err(&xpcs->mdiodev->dev, in xpcs_link_up_sgmii_1000basex()
1150 dev_err(&xpcs->mdiodev->dev, "%s: xpcs_write returned %pe\n", in xpcs_link_up_sgmii_1000basex()
1183 static int xpcs_config_eee(struct dw_xpcs *xpcs, bool enable) in xpcs_config_eee() argument
1193 if (enable) in xpcs_config_eee()
1198 xpcs->eee_mult_fact); in xpcs_config_eee()
1209 enable ? DW_VR_MII_EEE_TRN_LPI : 0); in xpcs_config_eee()
1227 * xpcs_config_eee_mult_fact() - set the EEE clock multiplying factor
1236 xpcs->eee_mult_fact = mult_fact; in xpcs_config_eee_mult_fact()
1250 return -ENODEV; in xpcs_read_ids()
1260 /* If Device IDs are not all zeros or ones, then 10GBase-X/R or C73 in xpcs_read_ids()
1261 * KR/KX4 PCS found. Otherwise fallback to detecting 1000Base-X or C37 in xpcs_read_ids()
1278 /* Set the PCS ID if it hasn't been pre-initialized */ in xpcs_read_ids()
1279 if (xpcs->info.pcs == DW_XPCS_ID_NATIVE) in xpcs_read_ids()
1280 xpcs->info.pcs = id; in xpcs_read_ids()
1299 /* Set the PMA ID if it hasn't been pre-initialized */ in xpcs_read_ids()
1300 if (xpcs->info.pma == DW_XPCS_PMA_ID_NATIVE) in xpcs_read_ids()
1301 xpcs->info.pma = id; in xpcs_read_ids()
1403 if ((xpcs->info.pcs & entry->mask) == entry->id) { in xpcs_identify()
1404 xpcs->desc = entry; in xpcs_identify()
1409 return -ENODEV; in xpcs_identify()
1418 return ERR_PTR(-ENOMEM); in xpcs_create_data()
1421 xpcs->mdiodev = mdiodev; in xpcs_create_data()
1422 xpcs->pcs.ops = &xpcs_phylink_ops; in xpcs_create_data()
1423 xpcs->pcs.poll = true; in xpcs_create_data()
1430 mdio_device_put(xpcs->mdiodev); in xpcs_free_data()
1440 struct device *dev = &xpcs->mdiodev->dev; in xpcs_init_clks()
1444 xpcs->clks[i].id = ids[i]; in xpcs_init_clks()
1446 ret = clk_bulk_get_optional(dev, DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_init_clks()
1450 ret = clk_bulk_prepare_enable(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_init_clks()
1452 return dev_err_probe(dev, ret, "Failed to enable clocks\n"); in xpcs_init_clks()
1459 clk_bulk_disable_unprepare(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_clear_clks()
1461 clk_bulk_put(DW_XPCS_NUM_CLKS, xpcs->clks); in xpcs_clear_clks()
1468 info = dev_get_platdata(&xpcs->mdiodev->dev); in xpcs_init_id()
1470 xpcs->info.pcs = DW_XPCS_ID_NATIVE; in xpcs_init_id()
1471 xpcs->info.pma = DW_XPCS_PMA_ID_NATIVE; in xpcs_init_id()
1473 xpcs->info = *info; in xpcs_init_id()
1496 xpcs_get_interfaces(xpcs, xpcs->pcs.supported_interfaces); in xpcs_create()
1498 if (xpcs->info.pma == WX_TXGBE_XPCS_PMA_10G_ID) in xpcs_create()
1499 xpcs->pcs.poll = false; in xpcs_create()
1501 xpcs->need_reset = true; in xpcs_create()
1515 * xpcs_create_mdiodev() - create a DW xPCS instance with the MDIO @addr
1516 * @bus: pointer to the MDIO-bus descriptor for the device to be looked at
1517 * @addr: device MDIO-bus ID
1519 * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODEV if
1521 * to the data allocation and MDIO-bus communications.
1554 return &xpcs->pcs; in xpcs_create_pcs_mdiodev()
1559 * xpcs_create_fwnode() - Create a DW xPCS instance from @fwnode
1562 * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODEV if
1564 * bus, -EPROBE_DEFER if the respective MDIO-device instance couldn't be found,
1565 * other negative errno related to the data allocations and MDIO-bus
1574 return ERR_PTR(-ENODEV); in xpcs_create_fwnode()
1578 return ERR_PTR(-EPROBE_DEFER); in xpcs_create_fwnode()