Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb5b136c authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'dsa-rework-EEE-support'



Vivien Didelot says:

====================
net: dsa: rework EEE support

EEE implies configuring the port's PHY and MAC of both ends of the wire.

The current EEE support in DSA mixes PHY and MAC configuration, which is
bad because PHYs must be configured through a proper PHY driver. The DSA
switch operations for EEE are only meant for configuring the port's MAC,
which are integrated in the Ethernet switch device.

This patchset fixes the EEE support in qca8k driver, makes the DSA layer
call phy_init_eee for all drivers, and remove the EEE support from the
mv88e6xxx driver since the Marvell PHY driver should be enough for it.

Changes in v2:
 - make PHY device and DSA EEE ops mandatory for slave EEE operations.
 - simply return 0 in drivers which don't need to do anything to
   configure the port' MAC. Subsequent PHY calls will be enough.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 13e6be2d 08f50061
Loading
Loading
Loading
Loading
+7 −19
Original line number Diff line number Diff line
@@ -327,12 +327,8 @@ static void bcm_sf2_port_disable(struct dsa_switch *ds, int port,
static int bcm_sf2_eee_init(struct dsa_switch *ds, int port,
			    struct phy_device *phy)
{
	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
	struct ethtool_eee *p = &priv->port_sts[port].eee;
	int ret;

	p->supported = (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full);

	ret = phy_init_eee(phy, 0);
	if (ret)
		return 0;
@@ -342,7 +338,7 @@ static int bcm_sf2_eee_init(struct dsa_switch *ds, int port,
	return 1;
}

static int bcm_sf2_sw_get_eee(struct dsa_switch *ds, int port,
static int bcm_sf2_sw_get_mac_eee(struct dsa_switch *ds, int port,
				  struct ethtool_eee *e)
{
	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
@@ -356,22 +352,14 @@ static int bcm_sf2_sw_get_eee(struct dsa_switch *ds, int port,
	return 0;
}

static int bcm_sf2_sw_set_eee(struct dsa_switch *ds, int port,
			      struct phy_device *phydev,
static int bcm_sf2_sw_set_mac_eee(struct dsa_switch *ds, int port,
				  struct ethtool_eee *e)
{
	struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
	struct ethtool_eee *p = &priv->port_sts[port].eee;

	p->eee_enabled = e->eee_enabled;

	if (!p->eee_enabled) {
		bcm_sf2_eee_enable_set(ds, port, false);
	} else {
		p->eee_enabled = bcm_sf2_eee_init(ds, port, phydev);
		if (!p->eee_enabled)
			return -EOPNOTSUPP;
	}
	bcm_sf2_eee_enable_set(ds, port, e->eee_enabled);

	return 0;
}
@@ -1023,8 +1011,8 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
	.set_wol		= bcm_sf2_sw_set_wol,
	.port_enable		= bcm_sf2_port_setup,
	.port_disable		= bcm_sf2_port_disable,
	.get_eee		= bcm_sf2_sw_get_eee,
	.set_eee		= bcm_sf2_sw_set_eee,
	.get_mac_eee		= bcm_sf2_sw_get_mac_eee,
	.set_mac_eee		= bcm_sf2_sw_set_mac_eee,
	.port_bridge_join	= b53_br_join,
	.port_bridge_leave	= b53_br_leave,
	.port_stp_state_set	= b53_br_set_stp_state,
+10 −76
Original line number Diff line number Diff line
@@ -810,56 +810,18 @@ static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
	mutex_unlock(&chip->reg_lock);
}

static int mv88e6xxx_energy_detect_read(struct mv88e6xxx_chip *chip, int port,
					struct ethtool_eee *eee)
{
	int err;

	if (!chip->info->ops->phy_energy_detect_read)
		return -EOPNOTSUPP;

	/* assign eee->eee_enabled and eee->tx_lpi_enabled */
	err = chip->info->ops->phy_energy_detect_read(chip, port, eee);
	if (err)
		return err;

	/* assign eee->eee_active */
	return mv88e6xxx_port_status_eee(chip, port, eee);
}

static int mv88e6xxx_energy_detect_write(struct mv88e6xxx_chip *chip, int port,
					 struct ethtool_eee *eee)
{
	if (!chip->info->ops->phy_energy_detect_write)
		return -EOPNOTSUPP;

	return chip->info->ops->phy_energy_detect_write(chip, port, eee);
}

static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
static int mv88e6xxx_get_mac_eee(struct dsa_switch *ds, int port,
				 struct ethtool_eee *e)
{
	struct mv88e6xxx_chip *chip = ds->priv;
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_energy_detect_read(chip, port, e);
	mutex_unlock(&chip->reg_lock);

	return err;
	/* Nothing to do on the port's MAC */
	return 0;
}

static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
			     struct phy_device *phydev, struct ethtool_eee *e)
static int mv88e6xxx_set_mac_eee(struct dsa_switch *ds, int port,
				 struct ethtool_eee *e)
{
	struct mv88e6xxx_chip *chip = ds->priv;
	int err;

	mutex_lock(&chip->reg_lock);
	err = mv88e6xxx_energy_detect_write(chip, port, e);
	mutex_unlock(&chip->reg_lock);

	return err;
	/* Nothing to do on the port's MAC */
	return 0;
}

static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port)
@@ -2521,8 +2483,6 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2648,8 +2608,6 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2719,8 +2677,6 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2784,8 +2740,6 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2821,8 +2775,6 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2858,8 +2810,6 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2895,8 +2845,6 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2933,8 +2881,6 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2971,8 +2917,6 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_speed = mv88e6185_port_set_speed,
@@ -3006,8 +2950,6 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_speed = mv88e6185_port_set_speed,
@@ -3039,8 +2981,6 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3142,8 +3082,6 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -3180,8 +3118,6 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3220,8 +3156,6 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
	.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
	.phy_read = mv88e6xxx_g2_smi_phy_read,
	.phy_write = mv88e6xxx_g2_smi_phy_write,
	.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
	.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
	.port_set_link = mv88e6xxx_port_set_link,
	.port_set_duplex = mv88e6xxx_port_set_duplex,
	.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3956,8 +3890,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
	.get_sset_count		= mv88e6xxx_get_sset_count,
	.port_enable		= mv88e6xxx_port_enable,
	.port_disable		= mv88e6xxx_port_disable,
	.set_eee		= mv88e6xxx_set_eee,
	.get_eee		= mv88e6xxx_get_eee,
	.get_mac_eee		= mv88e6xxx_get_mac_eee,
	.set_mac_eee		= mv88e6xxx_set_mac_eee,
	.get_eeprom_len		= mv88e6xxx_get_eeprom_len,
	.get_eeprom		= mv88e6xxx_get_eeprom,
	.set_eeprom		= mv88e6xxx_set_eeprom,
+0 −6
Original line number Diff line number Diff line
@@ -239,12 +239,6 @@ struct mv88e6xxx_ops {
			 struct mii_bus *bus,
			 int addr, int reg, u16 val);

	/* Copper Energy Detect operations */
	int (*phy_energy_detect_read)(struct mv88e6xxx_chip *chip, int phy,
				      struct ethtool_eee *eee);
	int (*phy_energy_detect_write)(struct mv88e6xxx_chip *chip, int phy,
				       struct ethtool_eee *eee);

	/* Priority Override Table operations */
	int (*pot_clear)(struct mv88e6xxx_chip *chip);

+0 −96
Original line number Diff line number Diff line
@@ -246,99 +246,3 @@ int mv88e6xxx_phy_setup(struct mv88e6xxx_chip *chip)
{
	return mv88e6xxx_phy_ppu_enable(chip);
}

/* Page 0, Register 16: Copper Specific Control Register 1 */

int mv88e6352_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
				     struct ethtool_eee *eee)
{
	u16 val;
	int err;

	err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
	if (err)
		return err;

	val &= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_MASK;

	eee->eee_enabled = false;
	eee->tx_lpi_enabled = false;

	switch (val) {
	case MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP:
		eee->tx_lpi_enabled = true;
		/* fall through... */
	case MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV:
		eee->eee_enabled = true;
	}

	return 0;
}

int mv88e6352_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
				      struct ethtool_eee *eee)
{
	u16 val;
	int err;

	err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
	if (err)
		return err;

	val &= ~MV88E6352_PHY_CSCTL1_ENERGY_DETECT_MASK;

	if (eee->eee_enabled)
		val |= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV;
	if (eee->tx_lpi_enabled)
		val |= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP;

	return mv88e6xxx_phy_write(chip, phy, MV88E6XXX_PHY_CSCTL1, val);
}

int mv88e6390_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
				     struct ethtool_eee *eee)
{
	u16 val;
	int err;

	err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
	if (err)
		return err;

	val &= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_MASK;

	eee->eee_enabled = false;
	eee->tx_lpi_enabled = false;

	switch (val) {
	case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_AUTO:
	case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_SW:
		eee->tx_lpi_enabled = true;
		/* fall through... */
	case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_AUTO:
	case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_SW:
		eee->eee_enabled = true;
	}

	return 0;
}

int mv88e6390_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
				      struct ethtool_eee *eee)
{
	u16 val;
	int err;

	err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
	if (err)
		return err;

	val &= ~MV88E6390_PHY_CSCTL1_ENERGY_DETECT_MASK;

	if (eee->eee_enabled)
		val |= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_AUTO;
	if (eee->tx_lpi_enabled)
		val |= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_AUTO;

	return mv88e6xxx_phy_write(chip, phy, MV88E6XXX_PHY_CSCTL1, val);
}
+0 −22
Original line number Diff line number Diff line
@@ -17,19 +17,6 @@
#define MV88E6XXX_PHY_PAGE		0x16
#define MV88E6XXX_PHY_PAGE_COPPER	0x00

/* Page 0, Register 16: Copper Specific Control Register 1 */
#define MV88E6XXX_PHY_CSCTL1					16
#define MV88E6352_PHY_CSCTL1_ENERGY_DETECT_MASK			0x0300
#define MV88E6352_PHY_CSCTL1_ENERGY_DETECT_OFF_MASK		0x0100 /* 0x */
#define MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV		0x0200
#define MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP		0x0300
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_MASK			0x0380
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_OFF_MASK		0x0180 /* 0xx */
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_AUTO	0x0200
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_SW		0x0280
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_AUTO	0x0300
#define MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_SW		0x0380

/* PHY Registers accesses implementations */
int mv88e6165_phy_read(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
		       int addr, int reg, u16 *val);
@@ -53,13 +40,4 @@ void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip);
void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip);
int mv88e6xxx_phy_setup(struct mv88e6xxx_chip *chip);

int mv88e6352_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
				     struct ethtool_eee *eee);
int mv88e6352_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
				      struct ethtool_eee *eee);
int mv88e6390_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
				     struct ethtool_eee *eee);
int mv88e6390_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
				      struct ethtool_eee *eee);

#endif /*_MV88E6XXX_PHY_H */
Loading