@@ -578,7 +578,8 @@ static const u8 mv88e6185_phy_interface_modes[] = {
};
static void mv88e6095_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
u8 cmode = chip->ports[port].cmode;
@@ -588,23 +589,29 @@ static void mv88e6095_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
__set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces);
} else {
if (cmode < ARRAY_SIZE(mv88e6185_phy_interface_modes) &&
- mv88e6185_phy_interface_modes[cmode])
+ mv88e6185_phy_interface_modes[cmode]) {
__set_bit(mv88e6185_phy_interface_modes[cmode],
config->supported_interfaces);
+ *default_interface =
+ mv88e6185_phy_interface_modes[cmode];
+ }
config->mac_capabilities |= MAC_1000FD;
}
}
static void mv88e6185_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
u8 cmode = chip->ports[port].cmode;
if (cmode < ARRAY_SIZE(mv88e6185_phy_interface_modes) &&
- mv88e6185_phy_interface_modes[cmode])
+ mv88e6185_phy_interface_modes[cmode]) {
__set_bit(mv88e6185_phy_interface_modes[cmode],
config->supported_interfaces);
+ *default_interface = mv88e6185_phy_interface_modes[cmode];
+ }
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
MAC_1000FD;
@@ -616,6 +623,7 @@ static const u8 mv88e6xxx_phy_interface_modes[] = {
[MV88E6XXX_PORT_STS_CMODE_GMII] = PHY_INTERFACE_MODE_GMII,
[MV88E6XXX_PORT_STS_CMODE_RMII_PHY] = PHY_INTERFACE_MODE_RMII,
[MV88E6XXX_PORT_STS_CMODE_RMII] = PHY_INTERFACE_MODE_RMII,
+ [MV88E6XXX_PORT_STS_CMODE_RGMII] = PHY_INTERFACE_MODE_RGMII,
[MV88E6XXX_PORT_STS_CMODE_100BASEX] = PHY_INTERFACE_MODE_100BASEX,
[MV88E6XXX_PORT_STS_CMODE_1000BASEX] = PHY_INTERFACE_MODE_1000BASEX,
[MV88E6XXX_PORT_STS_CMODE_SGMII] = PHY_INTERFACE_MODE_SGMII,
@@ -625,22 +633,32 @@ static const u8 mv88e6xxx_phy_interface_modes[] = {
*/
};
-static void mv88e6xxx_translate_cmode(u8 cmode, unsigned long *supported)
+static void mv88e6xxx_translate_cmode(u8 cmode, unsigned long *supported,
+ phy_interface_t *default_interface)
{
+ phy_interface_t interface;
+
if (cmode < ARRAY_SIZE(mv88e6xxx_phy_interface_modes) &&
- mv88e6xxx_phy_interface_modes[cmode])
- __set_bit(mv88e6xxx_phy_interface_modes[cmode], supported);
- else if (cmode == MV88E6XXX_PORT_STS_CMODE_RGMII)
- phy_interface_set_rgmii(supported);
+ mv88e6xxx_phy_interface_modes[cmode]) {
+ interface = mv88e6xxx_phy_interface_modes[cmode];
+ if (interface == PHY_INTERFACE_MODE_RGMII)
+ phy_interface_set_rgmii(supported);
+ else
+ __set_bit(interface, supported);
+ if (default_interface)
+ *default_interface = interface;
+ }
}
static void mv88e6250_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
/* Translate the default cmode */
- mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported,
+ default_interface);
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100;
}
@@ -676,13 +694,15 @@ static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
}
static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
int err, cmode;
/* Translate the default cmode */
- mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported,
+ default_interface);
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
MAC_1000FD;
@@ -702,19 +722,21 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
port);
else
- mv88e6xxx_translate_cmode(cmode, supported);
+ mv88e6xxx_translate_cmode(cmode, supported, NULL);
unlock:
mv88e6xxx_reg_unlock(chip);
}
}
static void mv88e6341_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
/* Translate the default cmode */
- mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported,
+ default_interface);
/* No ethtool bits for 200Mbps */
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
@@ -726,17 +748,21 @@ static void mv88e6341_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
__set_bit(PHY_INTERFACE_MODE_1000BASEX, supported);
__set_bit(PHY_INTERFACE_MODE_2500BASEX, supported);
+ *default_interface = PHY_INTERFACE_MODE_2500BASEX;
+
config->mac_capabilities |= MAC_2500FD;
}
}
static void mv88e6390_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
/* Translate the default cmode */
- mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported,
+ default_interface);
/* No ethtool bits for 200Mbps */
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
@@ -748,16 +774,19 @@ static void mv88e6390_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
__set_bit(PHY_INTERFACE_MODE_1000BASEX, supported);
__set_bit(PHY_INTERFACE_MODE_2500BASEX, supported);
+ *default_interface = PHY_INTERFACE_MODE_2500BASEX;
+
config->mac_capabilities |= MAC_2500FD;
}
}
static void mv88e6390x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
- mv88e6390_phylink_get_caps(chip, port, config);
+ mv88e6390_phylink_get_caps(chip, port, config, default_interface);
/* For the 6x90X, ports 2-7 can be in automedia mode.
* (Note that 6x90 doesn't support RXAUI nor XAUI).
@@ -783,18 +812,22 @@ static void mv88e6390x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
__set_bit(PHY_INTERFACE_MODE_XAUI, supported);
__set_bit(PHY_INTERFACE_MODE_RXAUI, supported);
+ *default_interface = PHY_INTERFACE_MODE_XAUI;
+
config->mac_capabilities |= MAC_10000FD;
}
}
static void mv88e6393x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config)
+ struct phylink_config *config,
+ phy_interface_t *default_interface)
{
unsigned long *supported = config->supported_interfaces;
bool is_6191x =
chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6191X;
- mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported,
+ default_interface);
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
MAC_1000FD;
@@ -812,6 +845,8 @@ static void mv88e6393x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
/* FIXME: USXGMII is not supported yet */
/* __set_bit(PHY_INTERFACE_MODE_USXGMII, supported); */
+ *default_interface = PHY_INTERFACE_MODE_10GBASER;
+
config->mac_capabilities |= MAC_2500FD | MAC_5000FD |
MAC_10000FD;
}
@@ -824,7 +859,8 @@ static void mv88e6xxx_get_caps(struct dsa_switch *ds, int port,
{
struct mv88e6xxx_chip *chip = ds->priv;
- chip->info->ops->phylink_get_caps(chip, port, config);
+ chip->info->ops->phylink_get_caps(chip, port, config,
+ default_interface);
/* Internal ports need GMII for PHYLIB */
if (mv88e6xxx_phy_is_internal(ds, port))
@@ -643,7 +643,8 @@ struct mv88e6xxx_ops {
/* Phylink */
void (*phylink_get_caps)(struct mv88e6xxx_chip *chip, int port,
- struct phylink_config *config);
+ struct phylink_config *config,
+ phy_interface_t *default_interface);
/* Max Frame Size */
int (*set_max_frame_size)(struct mv88e6xxx_chip *chip, int mtu);