return 0;
}
+/* Generic auto-negotiation config */
+
+static int rtpcs_generic_sds_set_autoneg(struct rtpcs_serdes *sds, unsigned int neg_mode,
+ const unsigned long *advertising)
+{
+ u16 bmcr, adv;
+ bool changed = 0;
+ int ret;
+
+ if ((sds->hw_mode == RTPCS_SDS_MODE_1000BASEX) ||
+ (sds->hw_mode == RTPCS_SDS_MODE_2500BASEX)) {
+ adv = ADVERTISE_1000XFULL;
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
+ advertising))
+ adv |= ADVERTISE_1000XPAUSE;
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
+ advertising))
+ adv |= ADVERTISE_1000XPSE_ASYM;
+
+ ret = rtpcs_sds_modify_changed(sds, 0x2, MII_ADVERTISE,
+ 0xffff, adv);
+ if (ret < 0)
+ return ret;
+ changed = ret;
+ }
+
+ bmcr = neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED ? BMCR_ANENABLE : 0;
+
+ ret = rtpcs_sds_modify(sds, 0x2, MII_BMCR, BMCR_ANENABLE, bmcr);
+ if (ret < 0)
+ return ret;
+
+ return changed;
+}
+
+static void rtpcs_generic_sds_restart_autoneg(struct rtpcs_serdes *sds)
+{
+ rtpcs_sds_modify(sds, 0x2, MII_BMCR, BMCR_ANRESTART, BMCR_ANRESTART);
+}
+
/* Variant-specific functions */
/* RTL838X */
static int rtpcs_93xx_sds_set_autoneg(struct rtpcs_serdes *sds, unsigned int neg_mode,
const unsigned long *advertising)
{
- u16 bmcr, adv, en_val;
- bool changed = 0;
- int ret;
+ u16 en_val;
switch (sds->hw_mode) {
case RTPCS_SDS_MODE_XSGMII: /* XSG N-way state */
return rtpcs_sds_xsg_write_bits(sds, 0x0, 0x2, 9, 8, en_val);
default:
- if ((sds->hw_mode == RTPCS_SDS_MODE_1000BASEX) ||
- (sds->hw_mode == RTPCS_SDS_MODE_2500BASEX)) {
- adv = ADVERTISE_1000XFULL;
- if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
- advertising))
- adv |= ADVERTISE_1000XPAUSE;
- if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
- advertising))
- adv |= ADVERTISE_1000XPSE_ASYM;
-
- ret = rtpcs_sds_modify_changed(sds, 0x2, MII_ADVERTISE,
- 0xffff, adv);
- if (ret < 0)
- return ret;
- changed = ret;
- }
-
- bmcr = neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED ? BMCR_ANENABLE : 0;
-
- ret = rtpcs_sds_modify(sds, 0x2, MII_BMCR, BMCR_ANENABLE, bmcr);
- if (ret < 0)
- return ret;
-
- return changed;
+ return rtpcs_generic_sds_set_autoneg(sds, neg_mode, advertising);
}
}
-static void rtpcs_93xx_sds_restart_autoneg(struct rtpcs_serdes *sds)
-{
- rtpcs_sds_modify(sds, 0x2, MII_BMCR, BMCR_ANRESTART, BMCR_ANRESTART);
-}
-
static int rtpcs_93xx_init_serdes_common(struct rtpcs_ctrl *ctrl)
{
u32 model_info = 0;
static const struct rtpcs_serdes_ops rtpcs_838x_sds_ops = {
.read = rtpcs_generic_sds_op_read,
.write = rtpcs_generic_sds_op_write,
+ .set_autoneg = rtpcs_generic_sds_set_autoneg,
+ .restart_autoneg = rtpcs_generic_sds_restart_autoneg,
};
static const struct rtpcs_config rtpcs_838x_cfg = {
static const struct rtpcs_serdes_ops rtpcs_839x_sds_ops = {
.read = rtpcs_generic_sds_op_read,
.write = rtpcs_generic_sds_op_write,
+ .set_autoneg = rtpcs_generic_sds_set_autoneg,
+ .restart_autoneg = rtpcs_generic_sds_restart_autoneg,
};
static const struct rtpcs_config rtpcs_839x_cfg = {
.write = rtpcs_930x_sds_op_write,
.xsg_write = rtpcs_930x_sds_op_xsg_write,
.set_autoneg = rtpcs_93xx_sds_set_autoneg,
- .restart_autoneg = rtpcs_93xx_sds_restart_autoneg,
+ .restart_autoneg = rtpcs_generic_sds_restart_autoneg,
};
static const struct rtpcs_config rtpcs_930x_cfg = {
.write = rtpcs_generic_sds_op_write,
.xsg_write = rtpcs_931x_sds_op_xsg_write,
.set_autoneg = rtpcs_93xx_sds_set_autoneg,
- .restart_autoneg = rtpcs_93xx_sds_restart_autoneg,
+ .restart_autoneg = rtpcs_generic_sds_restart_autoneg,
};
static const struct rtpcs_config rtpcs_931x_cfg = {