Lines Matching refs:xpcs
137 int (*pma_config)(struct dw_xpcs *xpcs);
162 int xpcs_get_an_mode(struct dw_xpcs *xpcs, phy_interface_t interface) in xpcs_get_an_mode() argument
166 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_get_an_mode()
189 int xpcs_read(struct dw_xpcs *xpcs, int dev, u32 reg) in xpcs_read() argument
191 return mdiodev_c45_read(xpcs->mdiodev, dev, reg); in xpcs_read()
194 int xpcs_write(struct dw_xpcs *xpcs, int dev, u32 reg, u16 val) in xpcs_write() argument
196 return mdiodev_c45_write(xpcs->mdiodev, dev, reg, val); in xpcs_write()
199 static int xpcs_modify_changed(struct dw_xpcs *xpcs, int dev, u32 reg, in xpcs_modify_changed() argument
202 return mdiodev_c45_modify_changed(xpcs->mdiodev, dev, reg, mask, set); in xpcs_modify_changed()
205 static int xpcs_read_vendor(struct dw_xpcs *xpcs, int dev, u32 reg) in xpcs_read_vendor() argument
207 return xpcs_read(xpcs, dev, DW_VENDOR | reg); in xpcs_read_vendor()
210 static int xpcs_write_vendor(struct dw_xpcs *xpcs, int dev, int reg, in xpcs_write_vendor() argument
213 return xpcs_write(xpcs, dev, DW_VENDOR | reg, val); in xpcs_write_vendor()
216 static int xpcs_read_vpcs(struct dw_xpcs *xpcs, int reg) in xpcs_read_vpcs() argument
218 return xpcs_read_vendor(xpcs, MDIO_MMD_PCS, reg); in xpcs_read_vpcs()
221 static int xpcs_write_vpcs(struct dw_xpcs *xpcs, int reg, u16 val) in xpcs_write_vpcs() argument
223 return xpcs_write_vendor(xpcs, MDIO_MMD_PCS, reg, val); in xpcs_write_vpcs()
226 static int xpcs_poll_reset(struct dw_xpcs *xpcs, int dev) in xpcs_poll_reset() argument
234 ret = xpcs_read(xpcs, dev, MDIO_CTRL1); in xpcs_poll_reset()
242 static int xpcs_soft_reset(struct dw_xpcs *xpcs, in xpcs_soft_reset() argument
260 ret = xpcs_write(xpcs, dev, MDIO_CTRL1, MDIO_CTRL1_RESET); in xpcs_soft_reset()
264 return xpcs_poll_reset(xpcs, dev); in xpcs_soft_reset()
273 static int xpcs_read_fault_c73(struct dw_xpcs *xpcs, in xpcs_read_fault_c73() argument
278 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT1); in xpcs_read_fault_c73()
283 xpcs_warn(xpcs, state, "Link fault condition detected!\n"); in xpcs_read_fault_c73()
287 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT2); in xpcs_read_fault_c73()
292 xpcs_warn(xpcs, state, "Receiver fault detected!\n"); in xpcs_read_fault_c73()
294 xpcs_warn(xpcs, state, "Transmitter fault detected!\n"); in xpcs_read_fault_c73()
296 ret = xpcs_read_vendor(xpcs, MDIO_MMD_PCS, DW_VR_XS_PCS_DIG_STS); in xpcs_read_fault_c73()
301 xpcs_warn(xpcs, state, "FIFO fault condition detected!\n"); in xpcs_read_fault_c73()
305 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT1); in xpcs_read_fault_c73()
310 xpcs_warn(xpcs, state, "Link is not locked!\n"); in xpcs_read_fault_c73()
312 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_PCS_10GBRT_STAT2); in xpcs_read_fault_c73()
317 xpcs_warn(xpcs, state, "Link has errors!\n"); in xpcs_read_fault_c73()
324 static int xpcs_read_link_c73(struct dw_xpcs *xpcs, bool an) in xpcs_read_link_c73() argument
329 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MDIO_STAT1); in xpcs_read_link_c73()
337 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1); in xpcs_read_link_c73()
364 static void xpcs_config_usxgmii(struct dw_xpcs *xpcs, int speed) in xpcs_config_usxgmii() argument
392 ret = xpcs_read_vpcs(xpcs, MDIO_CTRL1); in xpcs_config_usxgmii()
396 ret = xpcs_write_vpcs(xpcs, MDIO_CTRL1, ret | DW_USXGMII_EN); in xpcs_config_usxgmii()
400 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1); in xpcs_config_usxgmii()
407 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, ret); in xpcs_config_usxgmii()
411 ret = xpcs_read_vpcs(xpcs, MDIO_CTRL1); in xpcs_config_usxgmii()
415 ret = xpcs_write_vpcs(xpcs, MDIO_CTRL1, ret | DW_USXGMII_RST); in xpcs_config_usxgmii()
425 static int _xpcs_config_aneg_c73(struct dw_xpcs *xpcs, in _xpcs_config_aneg_c73() argument
443 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV3, adv); in _xpcs_config_aneg_c73()
456 ret = xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV2, adv); in _xpcs_config_aneg_c73()
467 return xpcs_write(xpcs, MDIO_MMD_AN, DW_SR_AN_ADV1, adv); in _xpcs_config_aneg_c73()
470 static int xpcs_config_aneg_c73(struct dw_xpcs *xpcs, in xpcs_config_aneg_c73() argument
475 ret = _xpcs_config_aneg_c73(xpcs, compat); in xpcs_config_aneg_c73()
479 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_CTRL1); in xpcs_config_aneg_c73()
485 return xpcs_write(xpcs, MDIO_MMD_AN, MDIO_CTRL1, ret); in xpcs_config_aneg_c73()
488 static int xpcs_aneg_done_c73(struct dw_xpcs *xpcs, in xpcs_aneg_done_c73() argument
494 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1); in xpcs_aneg_done_c73()
499 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1); in xpcs_aneg_done_c73()
505 xpcs_config_aneg_c73(xpcs, compat); in xpcs_aneg_done_c73()
515 static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs, in xpcs_read_lpa_c73() argument
520 ret = xpcs_read(xpcs, MDIO_MMD_AN, MDIO_STAT1); in xpcs_read_lpa_c73()
532 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL3); in xpcs_read_lpa_c73()
539 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL2); in xpcs_read_lpa_c73()
550 ret = xpcs_read(xpcs, MDIO_MMD_AN, DW_SR_AN_LP_ABL1); in xpcs_read_lpa_c73()
564 static void xpcs_resolve_lpa_c73(struct dw_xpcs *xpcs, in xpcs_resolve_lpa_c73() argument
574 static int xpcs_get_max_xlgmii_speed(struct dw_xpcs *xpcs, in xpcs_get_max_xlgmii_speed() argument
628 static void xpcs_resolve_pma(struct dw_xpcs *xpcs, in xpcs_resolve_pma() argument
639 state->speed = xpcs_get_max_xlgmii_speed(xpcs, state); in xpcs_resolve_pma()
652 struct dw_xpcs *xpcs; in xpcs_validate() local
655 xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_validate()
656 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_validate()
671 void xpcs_get_interfaces(struct dw_xpcs *xpcs, unsigned long *interfaces) in xpcs_get_interfaces() argument
676 const struct xpcs_compat *compat = &xpcs->id->compat[i]; in xpcs_get_interfaces()
685 int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns, int enable) in xpcs_config_eee() argument
689 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0); in xpcs_config_eee()
706 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0, ret); in xpcs_config_eee()
710 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL1); in xpcs_config_eee()
719 return xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL1, ret); in xpcs_config_eee()
723 static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs, unsigned int mode) in xpcs_config_aneg_c37_sgmii() argument
743 mdio_ctrl = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL); in xpcs_config_aneg_c37_sgmii()
748 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL, in xpcs_config_aneg_c37_sgmii()
754 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL); in xpcs_config_aneg_c37_sgmii()
765 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL, ret); in xpcs_config_aneg_c37_sgmii()
769 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1); in xpcs_config_aneg_c37_sgmii()
778 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, ret); in xpcs_config_aneg_c37_sgmii()
783 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL, in xpcs_config_aneg_c37_sgmii()
789 static int xpcs_config_aneg_c37_1000basex(struct dw_xpcs *xpcs, unsigned int mode, in xpcs_config_aneg_c37_1000basex() argument
801 mdio_ctrl = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL); in xpcs_config_aneg_c37_1000basex()
806 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL, in xpcs_config_aneg_c37_1000basex()
812 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL); in xpcs_config_aneg_c37_1000basex()
817 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL, ret); in xpcs_config_aneg_c37_1000basex()
827 ret = xpcs_modify_changed(xpcs, MDIO_MMD_VEND2, in xpcs_config_aneg_c37_1000basex()
836 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, 0); in xpcs_config_aneg_c37_1000basex()
842 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL, in xpcs_config_aneg_c37_1000basex()
851 static int xpcs_config_2500basex(struct dw_xpcs *xpcs) in xpcs_config_2500basex() argument
855 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1); in xpcs_config_2500basex()
860 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, ret); in xpcs_config_2500basex()
864 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL); in xpcs_config_2500basex()
870 return xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL, ret); in xpcs_config_2500basex()
873 int xpcs_do_config(struct dw_xpcs *xpcs, phy_interface_t interface, in xpcs_do_config() argument
879 compat = xpcs_find_compat(xpcs->id, interface); in xpcs_do_config()
886 ret = xpcs_config_aneg_c73(xpcs, compat); in xpcs_do_config()
892 ret = xpcs_config_aneg_c37_sgmii(xpcs, mode); in xpcs_do_config()
897 ret = xpcs_config_aneg_c37_1000basex(xpcs, mode, in xpcs_do_config()
903 ret = xpcs_config_2500basex(xpcs); in xpcs_do_config()
912 ret = compat->pma_config(xpcs); in xpcs_do_config()
926 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_config() local
928 return xpcs_do_config(xpcs, interface, mode, advertising); in xpcs_config()
931 static int xpcs_get_state_c73(struct dw_xpcs *xpcs, in xpcs_get_state_c73() argument
938 state->link = xpcs_read_link_c73(xpcs, state->an_enabled) > 0 ? 1 : 0; in xpcs_get_state_c73()
941 ret = xpcs_read_fault_c73(xpcs, state); in xpcs_get_state_c73()
943 ret = xpcs_soft_reset(xpcs, compat); in xpcs_get_state_c73()
949 return xpcs_do_config(xpcs, state->interface, MLO_AN_INBAND, NULL); in xpcs_get_state_c73()
952 if (state->an_enabled && xpcs_aneg_done_c73(xpcs, state, compat)) { in xpcs_get_state_c73()
954 xpcs_read_lpa_c73(xpcs, state); in xpcs_get_state_c73()
955 xpcs_resolve_lpa_c73(xpcs, state); in xpcs_get_state_c73()
959 xpcs_resolve_pma(xpcs, state); in xpcs_get_state_c73()
965 static int xpcs_get_state_c37_sgmii(struct dw_xpcs *xpcs, in xpcs_get_state_c37_sgmii() argument
979 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS); in xpcs_get_state_c37_sgmii()
1006 static int xpcs_get_state_c37_1000basex(struct dw_xpcs *xpcs, in xpcs_get_state_c37_1000basex() argument
1015 lpa = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_LPA); in xpcs_get_state_c37_1000basex()
1019 bmsr = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_BMSR); in xpcs_get_state_c37_1000basex()
1032 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_get_state() local
1036 compat = xpcs_find_compat(xpcs->id, state->interface); in xpcs_get_state()
1042 ret = xpcs_get_state_c73(xpcs, state, compat); in xpcs_get_state()
1050 ret = xpcs_get_state_c37_sgmii(xpcs, state); in xpcs_get_state()
1057 ret = xpcs_get_state_c37_1000basex(xpcs, state); in xpcs_get_state()
1068 static void xpcs_link_up_sgmii(struct dw_xpcs *xpcs, unsigned int mode, in xpcs_link_up_sgmii() argument
1077 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, val); in xpcs_link_up_sgmii()
1082 static void xpcs_link_up_1000basex(struct dw_xpcs *xpcs, unsigned int mode, in xpcs_link_up_1000basex() argument
1106 ret = xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, val); in xpcs_link_up_1000basex()
1114 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_link_up() local
1117 return xpcs_config_usxgmii(xpcs, speed); in xpcs_link_up()
1119 return xpcs_link_up_sgmii(xpcs, mode, speed, duplex); in xpcs_link_up()
1121 return xpcs_link_up_1000basex(xpcs, mode, speed, duplex); in xpcs_link_up()
1127 struct dw_xpcs *xpcs = phylink_pcs_to_xpcs(pcs); in xpcs_an_restart() local
1130 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1); in xpcs_an_restart()
1133 xpcs_write(xpcs, MDIO_MMD_VEND2, MDIO_CTRL1, ret); in xpcs_an_restart()
1137 static u32 xpcs_get_id(struct dw_xpcs *xpcs) in xpcs_get_id() argument
1143 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID1); in xpcs_get_id()
1149 ret = xpcs_read(xpcs, MDIO_MMD_PCS, MII_PHYSID2); in xpcs_get_id()
1160 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_PHYSID1); in xpcs_get_id()
1166 ret = xpcs_read(xpcs, MDIO_MMD_VEND2, MII_PHYSID2); in xpcs_get_id()
1270 struct dw_xpcs *xpcs; in xpcs_create() local
1274 xpcs = kzalloc(sizeof(*xpcs), GFP_KERNEL); in xpcs_create()
1275 if (!xpcs) in xpcs_create()
1278 xpcs->mdiodev = mdiodev; in xpcs_create()
1280 xpcs_id = xpcs_get_id(xpcs); in xpcs_create()
1289 xpcs->id = entry; in xpcs_create()
1297 xpcs->pcs.ops = &xpcs_phylink_ops; in xpcs_create()
1298 xpcs->pcs.poll = true; in xpcs_create()
1300 ret = xpcs_soft_reset(xpcs, compat); in xpcs_create()
1304 return xpcs; in xpcs_create()
1310 kfree(xpcs); in xpcs_create()
1316 void xpcs_destroy(struct dw_xpcs *xpcs) in xpcs_destroy() argument
1318 kfree(xpcs); in xpcs_destroy()