Lines Matching defs:xpcs

10 #include <linux/pcs/pcs-xpcs.h>
147 static int xpcs_read(struct mdio_xpcs_args *xpcs, int dev, u32 reg)
151 return mdiobus_read(xpcs->bus, xpcs->addr, reg_addr);
154 static int xpcs_write(struct mdio_xpcs_args *xpcs, int dev, u32 reg, u16 val)
158 return mdiobus_write(xpcs->bus, xpcs->addr, reg_addr, val);
161 static int xpcs_read_vendor(struct mdio_xpcs_args *xpcs, int dev, u32 reg)
163 return xpcs_read(xpcs, dev, DW_VENDOR | reg);
166 static int xpcs_write_vendor(struct mdio_xpcs_args *xpcs, int dev, int reg,
169 return xpcs_write(xpcs, dev, DW_VENDOR | reg, val);
172 static int xpcs_read_vpcs(struct mdio_xpcs_args *xpcs, int reg)
174 return xpcs_read_vendor(xpcs, MDIO_MMD_PCS, reg);
177 static int xpcs_write_vpcs(struct mdio_xpcs_args *xpcs, int reg, u16 val)
179 return xpcs_write_vendor(xpcs, MDIO_MMD_PCS, reg, val);
182 static int xpcs_poll_reset(struct mdio_xpcs_args *xpcs, int dev)
190 ret = xpcs_read(xpcs, dev, MDIO_CTRL1);
198 static int xpcs_soft_reset(struct mdio_xpcs_args *xpcs, int dev)
202 ret = xpcs_write(xpcs, dev, MDIO_CTRL1, MDIO_CTRL1_RESET);
206 return xpcs_poll_reset(xpcs, dev);
215 static int xpcs_read_fault(struct mdio_xpcs_args *xpcs,
220 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT1);
225 xpcs_warn(xpcs, state, "Link fault condition detected!\n");
229 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT2);
234 xpcs_warn(xpcs, state, "Receiver fault detected!\n");
236 xpcs_warn(xpcs, state, "Transmitter fault detected!\n");
238 ret = xpcs_read_vendor(xpcs, MDIO_MMD_PCS, DW_VR_XS_PCS_DIG_STS);
243 xpcs_warn(xpcs, state, "FIFO fault condition detected!\n");
247 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT1);
252 xpcs_warn(xpcs, state, "Link is not locked!\n");
254 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT2);
259 xpcs_warn(xpcs, state, "Link has errors!\n");
266 static int xpcs_read_link(struct mdio_xpcs_args *xpcs, bool an)
271 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT1);
279 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1);
306 static int xpcs_config_usxgmii(struct mdio_xpcs_args *xpcs, int speed)
334 ret = xpcs_read_vpcs(xpcs, MDIO_CTRL1);
338 ret = xpcs_write_vpcs(xpcs, MDIO_CTRL1, ret | DW_USXGMII_EN);
342 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1);
349 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, ret);
353 ret = xpcs_read_vpcs(xpcs, MDIO_CTRL1);
357 return xpcs_write_vpcs(xpcs, MDIO_CTRL1, ret | DW_USXGMII_RST);
360 static int xpcs_config_aneg_c73(struct mdio_xpcs_args *xpcs)
372 if (phylink_test(xpcs->supported, 2500baseX_Full))
377 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV3, adv);
383 if (phylink_test(xpcs->supported, 1000baseKX_Full))
385 if (phylink_test(xpcs->supported, 10000baseKX4_Full))
387 if (phylink_test(xpcs->supported, 10000baseKR_Full))
390 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV2, adv);
396 if (phylink_test(xpcs->supported, Pause))
398 if (phylink_test(xpcs->supported, Asym_Pause))
401 return xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV1, adv);
404 static int xpcs_config_aneg(struct mdio_xpcs_args *xpcs)
408 ret = xpcs_config_aneg_c73(xpcs);
412 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_CTRL1);
418 return xpcs_write(xpcs, MDIO_MMD_AN, MDIO_CTRL1, ret);
421 static int xpcs_aneg_done(struct mdio_xpcs_args *xpcs,
426 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1);
431 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1);
437 xpcs_config_aneg(xpcs);
447 static int xpcs_read_lpa(struct mdio_xpcs_args *xpcs,
452 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1);
464 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL3);
471 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL2);
482 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1);
496 static void xpcs_resolve_lpa(struct mdio_xpcs_args *xpcs,
506 static int xpcs_get_max_xlgmii_speed(struct mdio_xpcs_args *xpcs,
560 static void xpcs_resolve_pma(struct mdio_xpcs_args *xpcs,
571 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state);
579 static int xpcs_validate(struct mdio_xpcs_args *xpcs,
583 linkmode_and(supported, supported, xpcs->supported);
584 linkmode_and(state->advertising, state->advertising, xpcs->supported);
588 static int xpcs_config(struct mdio_xpcs_args *xpcs,
594 ret = xpcs_config_aneg(xpcs);
602 static int xpcs_get_state(struct mdio_xpcs_args *xpcs,
608 state->link = xpcs_read_link(xpcs, state->an_enabled) > 0 ? 1 : 0;
611 ret = xpcs_read_fault(xpcs, state);
613 ret = xpcs_soft_reset(xpcs, MDIO_MMD_PCS);
619 return xpcs_config(xpcs, state);
622 if (state->an_enabled && xpcs_aneg_done(xpcs, state)) {
624 xpcs_read_lpa(xpcs, state);
625 xpcs_resolve_lpa(xpcs, state);
629 xpcs_resolve_pma(xpcs, state);
635 static int xpcs_link_up(struct mdio_xpcs_args *xpcs, int speed,
639 return xpcs_config_usxgmii(xpcs, speed);
644 static u32 xpcs_get_id(struct mdio_xpcs_args *xpcs)
649 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID1);
655 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID2);
662 static bool xpcs_check_features(struct mdio_xpcs_args *xpcs,
677 set_bit(match->supported[i], xpcs->supported);
682 static int xpcs_probe(struct mdio_xpcs_args *xpcs, phy_interface_t interface)
684 u32 xpcs_id = xpcs_get_id(xpcs);
694 if (xpcs_check_features(xpcs, match, interface))
695 return xpcs_soft_reset(xpcs, MDIO_MMD_PCS);