Lines Matching +full:max +full:- +full:link +full:- +full:speed
1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/pcs/pcs-xpcs.h>
14 #include "pcs-xpcs.h"
152 const struct xpcs_compat *compat = &id->compat[i]; in xpcs_find_compat()
154 for (j = 0; j < compat->num_interfaces; j++) in xpcs_find_compat()
155 if (compat->interface[j] == interface) in xpcs_find_compat()
166 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_get_an_mode()
168 return -ENODEV; in xpcs_get_an_mode()
170 return compat->an_mode; in xpcs_get_an_mode()
179 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in __xpcs_linkmode_supported()
180 if (compat->supported[i] == linkmode) in __xpcs_linkmode_supported()
191 struct mii_bus *bus = xpcs->mdiodev->bus; in xpcs_read()
192 int addr = xpcs->mdiodev->addr; in xpcs_read()
199 struct mii_bus *bus = xpcs->mdiodev->bus; in xpcs_write()
200 int addr = xpcs->mdiodev->addr; in xpcs_write()
210 return mdiodev_modify_changed(xpcs->mdiodev, reg_addr, mask, set); in xpcs_modify_changed()
245 } while (ret & MDIO_CTRL1_RESET && --retries); in xpcs_poll_reset()
247 return (ret & MDIO_CTRL1_RESET) ? -ETIMEDOUT : 0; in xpcs_poll_reset()
255 switch (compat->an_mode) { in xpcs_soft_reset()
265 return -1; in xpcs_soft_reset()
277 if ((__state)->link) \
278 dev_warn(&(__xpcs)->mdiodev->dev, ##__args); \
291 xpcs_warn(xpcs, state, "Link fault condition detected!\n"); in xpcs_read_fault_c73()
292 return -EFAULT; in xpcs_read_fault_c73()
310 return -EFAULT; in xpcs_read_fault_c73()
318 xpcs_warn(xpcs, state, "Link is not locked!\n"); in xpcs_read_fault_c73()
325 xpcs_warn(xpcs, state, "Link has errors!\n"); in xpcs_read_fault_c73()
326 return -EFAULT; in xpcs_read_fault_c73()
334 bool link = true; in xpcs_read_link_c73() local
342 link = false; in xpcs_read_link_c73()
350 link = false; in xpcs_read_link_c73()
353 return link; in xpcs_read_link_c73()
358 int max = SPEED_UNKNOWN; in xpcs_get_max_usxgmii_speed() local
361 max = SPEED_1000; in xpcs_get_max_usxgmii_speed()
363 max = SPEED_2500; in xpcs_get_max_usxgmii_speed()
365 max = SPEED_10000; in xpcs_get_max_usxgmii_speed()
367 max = SPEED_10000; in xpcs_get_max_usxgmii_speed()
369 return max; in xpcs_get_max_usxgmii_speed()
372 static void xpcs_config_usxgmii(struct dw_xpcs *xpcs, int speed) in xpcs_config_usxgmii() argument
376 switch (speed) { in xpcs_config_usxgmii()
533 phylink_clear(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
537 phylink_set(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
545 phylink_set(state->lp_advertising, 2500baseX_Full); in xpcs_read_lpa_c73()
552 phylink_set(state->lp_advertising, 1000baseKX_Full); in xpcs_read_lpa_c73()
554 phylink_set(state->lp_advertising, 10000baseKX4_Full); in xpcs_read_lpa_c73()
556 phylink_set(state->lp_advertising, 10000baseKR_Full); in xpcs_read_lpa_c73()
563 phylink_set(state->lp_advertising, Pause); in xpcs_read_lpa_c73()
565 phylink_set(state->lp_advertising, Asym_Pause); in xpcs_read_lpa_c73()
567 linkmode_and(state->lp_advertising, state->lp_advertising, in xpcs_read_lpa_c73()
568 state->advertising); in xpcs_read_lpa_c73()
575 int max_speed = xpcs_get_max_usxgmii_speed(state->lp_advertising); in xpcs_resolve_lpa_c73()
577 state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_resolve_lpa_c73()
578 state->speed = max_speed; in xpcs_resolve_lpa_c73()
579 state->duplex = DUPLEX_FULL; in xpcs_resolve_lpa_c73()
585 unsigned long *adv = state->advertising; in xpcs_get_max_xlgmii_speed()
586 int speed = SPEED_UNKNOWN; in xpcs_get_max_xlgmii_speed() local
629 if (new_speed > speed) in xpcs_get_max_xlgmii_speed()
630 speed = new_speed; in xpcs_get_max_xlgmii_speed()
633 return speed; in xpcs_get_max_xlgmii_speed()
639 state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_resolve_pma()
640 state->duplex = DUPLEX_FULL; in xpcs_resolve_pma()
642 switch (state->interface) { in xpcs_resolve_pma()
644 state->speed = SPEED_10000; in xpcs_resolve_pma()
647 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state); in xpcs_resolve_pma()
650 state->speed = SPEED_UNKNOWN; in xpcs_resolve_pma()
664 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_validate()
666 /* Populate the supported link modes for this PHY interface type. in xpcs_validate()
671 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in xpcs_validate()
672 set_bit(compat->supported[i], xpcs_supported); in xpcs_validate()
684 const struct xpcs_compat *compat = &xpcs->id->compat[i]; in xpcs_get_interfaces()
686 for (j = 0; j < compat->num_interfaces; j++) in xpcs_get_interfaces()
687 if (compat->interface[j] < PHY_INTERFACE_MODE_MAX) in xpcs_get_interfaces()
688 __set_bit(compat->interface[j], interfaces); in xpcs_get_interfaces()
735 /* For AN for C37 SGMII mode, the settings are :- in xpcs_config_aneg_c37_sgmii()
742 * speed/duplex mode change by HW after SGMII AN complete) in xpcs_config_aneg_c37_sgmii()
747 * PHY about the link state change after C28 AN is completed in xpcs_config_aneg_c37_sgmii()
748 * between PHY and Link Partner. There is also no need to in xpcs_config_aneg_c37_sgmii()
749 * trigger AN restart for MAC-side SGMII. in xpcs_config_aneg_c37_sgmii()
804 /* According to Chap 7.12, to set 1000BASE-X C37 AN, AN must in xpcs_config_aneg_c37_1000basex()
805 * be disabled first:- in xpcs_config_aneg_c37_1000basex()
807 * 2) VR_MII_AN_CTRL Bit(2:1)[PCS_MODE] = 00b (1000BASE-X C37) in xpcs_config_aneg_c37_1000basex()
887 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_do_config()
889 return -ENODEV; in xpcs_do_config()
891 switch (compat->an_mode) { in xpcs_do_config()
916 return -1; in xpcs_do_config()
919 if (compat->pma_config) { in xpcs_do_config()
920 ret = compat->pma_config(xpcs); in xpcs_do_config()
945 /* Link needs to be read first ... */ in xpcs_get_state_c73()
946 state->link = xpcs_read_link_c73(xpcs, state->an_enabled) > 0 ? 1 : 0; in xpcs_get_state_c73()
955 state->link = 0; in xpcs_get_state_c73()
957 return xpcs_do_config(xpcs, state->interface, MLO_AN_INBAND, NULL); in xpcs_get_state_c73()
960 if (state->an_enabled && xpcs_aneg_done_c73(xpcs, state, compat)) { in xpcs_get_state_c73()
961 state->an_complete = true; in xpcs_get_state_c73()
964 } else if (state->an_enabled) { in xpcs_get_state_c73()
965 state->link = 0; in xpcs_get_state_c73()
966 } else if (state->link) { in xpcs_get_state_c73()
979 state->link = false; in xpcs_get_state_c37_sgmii()
980 state->speed = SPEED_UNKNOWN; in xpcs_get_state_c37_sgmii()
981 state->duplex = DUPLEX_UNKNOWN; in xpcs_get_state_c37_sgmii()
982 state->pause = 0; in xpcs_get_state_c37_sgmii()
984 /* For C37 SGMII mode, we check DW_VR_MII_AN_INTR_STS for link in xpcs_get_state_c37_sgmii()
985 * status, speed and duplex. in xpcs_get_state_c37_sgmii()
994 state->link = true; in xpcs_get_state_c37_sgmii()
999 state->speed = SPEED_1000; in xpcs_get_state_c37_sgmii()
1001 state->speed = SPEED_100; in xpcs_get_state_c37_sgmii()
1003 state->speed = SPEED_10; in xpcs_get_state_c37_sgmii()
1006 state->duplex = DUPLEX_FULL; in xpcs_get_state_c37_sgmii()
1008 state->duplex = DUPLEX_HALF; in xpcs_get_state_c37_sgmii()
1019 if (state->an_enabled) { in xpcs_get_state_c37_1000basex()
1020 /* Reset link state */ in xpcs_get_state_c37_1000basex()
1021 state->link = false; in xpcs_get_state_c37_1000basex()
1044 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_get_state()
1048 switch (compat->an_mode) { in xpcs_get_state()
1077 int speed, int duplex) in xpcs_link_up_sgmii() argument
1084 val = mii_bmcr_encode_fixed(speed, duplex); in xpcs_link_up_sgmii()
1091 int speed, int duplex) in xpcs_link_up_1000basex() argument
1098 switch (speed) { in xpcs_link_up_1000basex()
1105 pr_err("%s: speed = %d\n", __func__, speed); in xpcs_link_up_1000basex()
1120 phy_interface_t interface, int speed, int duplex) in xpcs_link_up() argument
1125 return xpcs_config_usxgmii(xpcs, speed); in xpcs_link_up()
1127 return xpcs_link_up_sgmii(xpcs, mode, speed, duplex); in xpcs_link_up()
1129 return xpcs_link_up_1000basex(xpcs, mode, speed, duplex); in xpcs_link_up()
1162 * we found C73 AN-type device in xpcs_get_id()
1167 /* Next, search C37 PCS using Vendor-Specific MII MMD */ in xpcs_get_id()
1178 /* If Device IDs are not all zeros, we found C37 AN-type device */ in xpcs_get_id()
1284 return ERR_PTR(-ENOMEM); in xpcs_create()
1286 xpcs->mdiodev = mdiodev; in xpcs_create()
1294 if ((xpcs_id & entry->mask) != entry->id) in xpcs_create()
1297 xpcs->id = entry; in xpcs_create()
1301 ret = -ENODEV; in xpcs_create()
1305 xpcs->pcs.ops = &xpcs_phylink_ops; in xpcs_create()
1306 xpcs->pcs.poll = true; in xpcs_create()
1315 ret = -ENODEV; in xpcs_create()