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"
139 const struct xpcs_compat *compat = &id->compat[i]; in xpcs_find_compat()
141 for (j = 0; j < compat->num_interfaces; j++) in xpcs_find_compat()
142 if (compat->interface[j] == interface) in xpcs_find_compat()
153 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_get_an_mode()
155 return -ENODEV; in xpcs_get_an_mode()
157 return compat->an_mode; in xpcs_get_an_mode()
166 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in __xpcs_linkmode_supported()
167 if (compat->supported[i] == linkmode) in __xpcs_linkmode_supported()
179 struct mii_bus *bus = xpcs->mdiodev->bus; in xpcs_read()
180 int addr = xpcs->mdiodev->addr; in xpcs_read()
188 struct mii_bus *bus = xpcs->mdiodev->bus; in xpcs_write()
189 int addr = xpcs->mdiodev->addr; in xpcs_write()
226 } while (ret & MDIO_CTRL1_RESET && --retries); in xpcs_poll_reset()
228 return (ret & MDIO_CTRL1_RESET) ? -ETIMEDOUT : 0; in xpcs_poll_reset()
236 switch (compat->an_mode) { in xpcs_soft_reset()
245 return -1; in xpcs_soft_reset()
257 if ((__state)->link) \
258 dev_warn(&(__xpcs)->mdiodev->dev, ##__args); \
271 xpcs_warn(xpcs, state, "Link fault condition detected!\n"); in xpcs_read_fault_c73()
272 return -EFAULT; in xpcs_read_fault_c73()
290 return -EFAULT; in xpcs_read_fault_c73()
298 xpcs_warn(xpcs, state, "Link is not locked!\n"); in xpcs_read_fault_c73()
305 xpcs_warn(xpcs, state, "Link has errors!\n"); in xpcs_read_fault_c73()
306 return -EFAULT; in xpcs_read_fault_c73()
314 bool link = true; in xpcs_read_link_c73() local
322 link = false; in xpcs_read_link_c73()
330 link = false; in xpcs_read_link_c73()
333 return link; in xpcs_read_link_c73()
338 int max = SPEED_UNKNOWN; in xpcs_get_max_usxgmii_speed() local
341 max = SPEED_1000; in xpcs_get_max_usxgmii_speed()
343 max = SPEED_2500; in xpcs_get_max_usxgmii_speed()
345 max = SPEED_10000; in xpcs_get_max_usxgmii_speed()
347 max = SPEED_10000; in xpcs_get_max_usxgmii_speed()
349 return max; in xpcs_get_max_usxgmii_speed()
352 static void xpcs_config_usxgmii(struct dw_xpcs *xpcs, int speed) in xpcs_config_usxgmii() argument
356 switch (speed) { in xpcs_config_usxgmii()
513 phylink_clear(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
517 phylink_set(state->lp_advertising, Autoneg); in xpcs_read_lpa_c73()
525 phylink_set(state->lp_advertising, 2500baseX_Full); in xpcs_read_lpa_c73()
532 phylink_set(state->lp_advertising, 1000baseKX_Full); in xpcs_read_lpa_c73()
534 phylink_set(state->lp_advertising, 10000baseKX4_Full); in xpcs_read_lpa_c73()
536 phylink_set(state->lp_advertising, 10000baseKR_Full); in xpcs_read_lpa_c73()
543 phylink_set(state->lp_advertising, Pause); in xpcs_read_lpa_c73()
545 phylink_set(state->lp_advertising, Asym_Pause); in xpcs_read_lpa_c73()
547 linkmode_and(state->lp_advertising, state->lp_advertising, in xpcs_read_lpa_c73()
548 state->advertising); in xpcs_read_lpa_c73()
555 int max_speed = xpcs_get_max_usxgmii_speed(state->lp_advertising); in xpcs_resolve_lpa_c73()
557 state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_resolve_lpa_c73()
558 state->speed = max_speed; in xpcs_resolve_lpa_c73()
559 state->duplex = DUPLEX_FULL; in xpcs_resolve_lpa_c73()
565 unsigned long *adv = state->advertising; in xpcs_get_max_xlgmii_speed()
566 int speed = SPEED_UNKNOWN; in xpcs_get_max_xlgmii_speed() local
609 if (new_speed > speed) in xpcs_get_max_xlgmii_speed()
610 speed = new_speed; in xpcs_get_max_xlgmii_speed()
613 return speed; in xpcs_get_max_xlgmii_speed()
619 state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; in xpcs_resolve_pma()
620 state->duplex = DUPLEX_FULL; in xpcs_resolve_pma()
622 switch (state->interface) { in xpcs_resolve_pma()
624 state->speed = SPEED_10000; in xpcs_resolve_pma()
627 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state); in xpcs_resolve_pma()
630 state->speed = SPEED_UNKNOWN; in xpcs_resolve_pma()
646 if (state->interface == PHY_INTERFACE_MODE_NA) in xpcs_validate()
651 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_validate()
653 /* Populate the supported link modes for this in xpcs_validate()
657 for (i = 0; compat->supported[i] != __ETHTOOL_LINK_MODE_MASK_NBITS; i++) in xpcs_validate()
658 set_bit(compat->supported[i], xpcs_supported); in xpcs_validate()
661 linkmode_and(state->advertising, state->advertising, xpcs_supported); in xpcs_validate()
707 /* For AN for C37 SGMII mode, the settings are :- in xpcs_config_aneg_c37_sgmii()
714 * speed/duplex mode change by HW after SGMII AN complete) in xpcs_config_aneg_c37_sgmii()
719 * PHY about the link state change after C28 AN is completed in xpcs_config_aneg_c37_sgmii()
720 * between PHY and Link Partner. There is also no need to in xpcs_config_aneg_c37_sgmii()
721 * trigger AN restart for MAC-side SGMII. in xpcs_config_aneg_c37_sgmii()
797 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_do_config()
799 return -ENODEV; in xpcs_do_config()
801 switch (compat->an_mode) { in xpcs_do_config()
820 return -1; in xpcs_do_config()
823 if (compat->pma_config) { in xpcs_do_config()
824 ret = compat->pma_config(xpcs); in xpcs_do_config()
849 /* Link needs to be read first ... */ in xpcs_get_state_c73()
850 state->link = xpcs_read_link_c73(xpcs, state->an_enabled) > 0 ? 1 : 0; in xpcs_get_state_c73()
859 state->link = 0; in xpcs_get_state_c73()
861 return xpcs_do_config(xpcs, state->interface, MLO_AN_INBAND); in xpcs_get_state_c73()
864 if (state->an_enabled && xpcs_aneg_done_c73(xpcs, state, compat)) { in xpcs_get_state_c73()
865 state->an_complete = true; in xpcs_get_state_c73()
868 } else if (state->an_enabled) { in xpcs_get_state_c73()
869 state->link = 0; in xpcs_get_state_c73()
870 } else if (state->link) { in xpcs_get_state_c73()
883 state->link = false; in xpcs_get_state_c37_sgmii()
884 state->speed = SPEED_UNKNOWN; in xpcs_get_state_c37_sgmii()
885 state->duplex = DUPLEX_UNKNOWN; in xpcs_get_state_c37_sgmii()
886 state->pause = 0; in xpcs_get_state_c37_sgmii()
888 /* For C37 SGMII mode, we check DW_VR_MII_AN_INTR_STS for link in xpcs_get_state_c37_sgmii()
889 * status, speed and duplex. in xpcs_get_state_c37_sgmii()
898 state->link = true; in xpcs_get_state_c37_sgmii()
903 state->speed = SPEED_1000; in xpcs_get_state_c37_sgmii()
905 state->speed = SPEED_100; in xpcs_get_state_c37_sgmii()
907 state->speed = SPEED_10; in xpcs_get_state_c37_sgmii()
910 state->duplex = DUPLEX_FULL; in xpcs_get_state_c37_sgmii()
912 state->duplex = DUPLEX_HALF; in xpcs_get_state_c37_sgmii()
925 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_get_state()
929 switch (compat->an_mode) { in xpcs_get_state()
951 int speed, int duplex) in xpcs_link_up_sgmii() argument
958 switch (speed) { in xpcs_link_up_sgmii()
981 phy_interface_t interface, int speed, int duplex) in xpcs_link_up() argument
986 return xpcs_config_usxgmii(xpcs, speed); in xpcs_link_up()
988 return xpcs_link_up_sgmii(xpcs, mode, speed, duplex); in xpcs_link_up()
1009 * we found C73 AN-type device in xpcs_get_id()
1014 /* Next, search C37 PCS using Vendor-Specific MII MMD */ in xpcs_get_id()
1025 /* If Device IDs are not all zeros, we found C37 AN-type device */ in xpcs_get_id()
1123 return ERR_PTR(-ENOMEM); in xpcs_create()
1125 xpcs->mdiodev = mdiodev; in xpcs_create()
1133 if ((xpcs_id & entry->mask) != entry->id) in xpcs_create()
1136 xpcs->id = entry; in xpcs_create()
1140 ret = -ENODEV; in xpcs_create()
1144 xpcs->pcs.ops = &xpcs_phylink_ops; in xpcs_create()
1145 xpcs->pcs.poll = true; in xpcs_create()
1154 ret = -ENODEV; in xpcs_create()