Skip to content

Commit cb5b136

Browse files
committed
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: David S. Miller <davem@davemloft.net>
2 parents 13e6be2 + 08f5006 commit cb5b136

File tree

11 files changed

+49
-317
lines changed

11 files changed

+49
-317
lines changed

drivers/net/dsa/bcm_sf2.c

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,8 @@ static void bcm_sf2_port_disable(struct dsa_switch *ds, int port,
327327
static int bcm_sf2_eee_init(struct dsa_switch *ds, int port,
328328
struct phy_device *phy)
329329
{
330-
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
331-
struct ethtool_eee *p = &priv->port_sts[port].eee;
332330
int ret;
333331

334-
p->supported = (SUPPORTED_1000baseT_Full | SUPPORTED_100baseT_Full);
335-
336332
ret = phy_init_eee(phy, 0);
337333
if (ret)
338334
return 0;
@@ -342,8 +338,8 @@ static int bcm_sf2_eee_init(struct dsa_switch *ds, int port,
342338
return 1;
343339
}
344340

345-
static int bcm_sf2_sw_get_eee(struct dsa_switch *ds, int port,
346-
struct ethtool_eee *e)
341+
static int bcm_sf2_sw_get_mac_eee(struct dsa_switch *ds, int port,
342+
struct ethtool_eee *e)
347343
{
348344
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
349345
struct ethtool_eee *p = &priv->port_sts[port].eee;
@@ -356,22 +352,14 @@ static int bcm_sf2_sw_get_eee(struct dsa_switch *ds, int port,
356352
return 0;
357353
}
358354

359-
static int bcm_sf2_sw_set_eee(struct dsa_switch *ds, int port,
360-
struct phy_device *phydev,
361-
struct ethtool_eee *e)
355+
static int bcm_sf2_sw_set_mac_eee(struct dsa_switch *ds, int port,
356+
struct ethtool_eee *e)
362357
{
363358
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
364359
struct ethtool_eee *p = &priv->port_sts[port].eee;
365360

366361
p->eee_enabled = e->eee_enabled;
367-
368-
if (!p->eee_enabled) {
369-
bcm_sf2_eee_enable_set(ds, port, false);
370-
} else {
371-
p->eee_enabled = bcm_sf2_eee_init(ds, port, phydev);
372-
if (!p->eee_enabled)
373-
return -EOPNOTSUPP;
374-
}
362+
bcm_sf2_eee_enable_set(ds, port, e->eee_enabled);
375363

376364
return 0;
377365
}
@@ -1023,8 +1011,8 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
10231011
.set_wol = bcm_sf2_sw_set_wol,
10241012
.port_enable = bcm_sf2_port_setup,
10251013
.port_disable = bcm_sf2_port_disable,
1026-
.get_eee = bcm_sf2_sw_get_eee,
1027-
.set_eee = bcm_sf2_sw_set_eee,
1014+
.get_mac_eee = bcm_sf2_sw_get_mac_eee,
1015+
.set_mac_eee = bcm_sf2_sw_set_mac_eee,
10281016
.port_bridge_join = b53_br_join,
10291017
.port_bridge_leave = b53_br_leave,
10301018
.port_stp_state_set = b53_br_set_stp_state,

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 10 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -810,56 +810,18 @@ static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
810810
mutex_unlock(&chip->reg_lock);
811811
}
812812

813-
static int mv88e6xxx_energy_detect_read(struct mv88e6xxx_chip *chip, int port,
814-
struct ethtool_eee *eee)
813+
static int mv88e6xxx_get_mac_eee(struct dsa_switch *ds, int port,
814+
struct ethtool_eee *e)
815815
{
816-
int err;
817-
818-
if (!chip->info->ops->phy_energy_detect_read)
819-
return -EOPNOTSUPP;
820-
821-
/* assign eee->eee_enabled and eee->tx_lpi_enabled */
822-
err = chip->info->ops->phy_energy_detect_read(chip, port, eee);
823-
if (err)
824-
return err;
825-
826-
/* assign eee->eee_active */
827-
return mv88e6xxx_port_status_eee(chip, port, eee);
828-
}
829-
830-
static int mv88e6xxx_energy_detect_write(struct mv88e6xxx_chip *chip, int port,
831-
struct ethtool_eee *eee)
832-
{
833-
if (!chip->info->ops->phy_energy_detect_write)
834-
return -EOPNOTSUPP;
835-
836-
return chip->info->ops->phy_energy_detect_write(chip, port, eee);
837-
}
838-
839-
static int mv88e6xxx_get_eee(struct dsa_switch *ds, int port,
840-
struct ethtool_eee *e)
841-
{
842-
struct mv88e6xxx_chip *chip = ds->priv;
843-
int err;
844-
845-
mutex_lock(&chip->reg_lock);
846-
err = mv88e6xxx_energy_detect_read(chip, port, e);
847-
mutex_unlock(&chip->reg_lock);
848-
849-
return err;
816+
/* Nothing to do on the port's MAC */
817+
return 0;
850818
}
851819

852-
static int mv88e6xxx_set_eee(struct dsa_switch *ds, int port,
853-
struct phy_device *phydev, struct ethtool_eee *e)
820+
static int mv88e6xxx_set_mac_eee(struct dsa_switch *ds, int port,
821+
struct ethtool_eee *e)
854822
{
855-
struct mv88e6xxx_chip *chip = ds->priv;
856-
int err;
857-
858-
mutex_lock(&chip->reg_lock);
859-
err = mv88e6xxx_energy_detect_write(chip, port, e);
860-
mutex_unlock(&chip->reg_lock);
861-
862-
return err;
823+
/* Nothing to do on the port's MAC */
824+
return 0;
863825
}
864826

865827
static u16 mv88e6xxx_port_vlan(struct mv88e6xxx_chip *chip, int dev, int port)
@@ -2521,8 +2483,6 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
25212483
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
25222484
.phy_read = mv88e6xxx_g2_smi_phy_read,
25232485
.phy_write = mv88e6xxx_g2_smi_phy_write,
2524-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
2525-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
25262486
.port_set_link = mv88e6xxx_port_set_link,
25272487
.port_set_duplex = mv88e6xxx_port_set_duplex,
25282488
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2648,8 +2608,6 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
26482608
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
26492609
.phy_read = mv88e6xxx_g2_smi_phy_read,
26502610
.phy_write = mv88e6xxx_g2_smi_phy_write,
2651-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
2652-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
26532611
.port_set_link = mv88e6xxx_port_set_link,
26542612
.port_set_duplex = mv88e6xxx_port_set_duplex,
26552613
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2719,8 +2677,6 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
27192677
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
27202678
.phy_read = mv88e6xxx_g2_smi_phy_read,
27212679
.phy_write = mv88e6xxx_g2_smi_phy_write,
2722-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
2723-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
27242680
.port_set_link = mv88e6xxx_port_set_link,
27252681
.port_set_duplex = mv88e6xxx_port_set_duplex,
27262682
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2784,8 +2740,6 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
27842740
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
27852741
.phy_read = mv88e6xxx_g2_smi_phy_read,
27862742
.phy_write = mv88e6xxx_g2_smi_phy_write,
2787-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
2788-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
27892743
.port_set_link = mv88e6xxx_port_set_link,
27902744
.port_set_duplex = mv88e6xxx_port_set_duplex,
27912745
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2821,8 +2775,6 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
28212775
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
28222776
.phy_read = mv88e6xxx_g2_smi_phy_read,
28232777
.phy_write = mv88e6xxx_g2_smi_phy_write,
2824-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
2825-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
28262778
.port_set_link = mv88e6xxx_port_set_link,
28272779
.port_set_duplex = mv88e6xxx_port_set_duplex,
28282780
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2858,8 +2810,6 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
28582810
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
28592811
.phy_read = mv88e6xxx_g2_smi_phy_read,
28602812
.phy_write = mv88e6xxx_g2_smi_phy_write,
2861-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
2862-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
28632813
.port_set_link = mv88e6xxx_port_set_link,
28642814
.port_set_duplex = mv88e6xxx_port_set_duplex,
28652815
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2895,8 +2845,6 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
28952845
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
28962846
.phy_read = mv88e6xxx_g2_smi_phy_read,
28972847
.phy_write = mv88e6xxx_g2_smi_phy_write,
2898-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
2899-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
29002848
.port_set_link = mv88e6xxx_port_set_link,
29012849
.port_set_duplex = mv88e6xxx_port_set_duplex,
29022850
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -2933,8 +2881,6 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
29332881
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
29342882
.phy_read = mv88e6xxx_g2_smi_phy_read,
29352883
.phy_write = mv88e6xxx_g2_smi_phy_write,
2936-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
2937-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
29382884
.port_set_link = mv88e6xxx_port_set_link,
29392885
.port_set_duplex = mv88e6xxx_port_set_duplex,
29402886
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -2971,8 +2917,6 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
29712917
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
29722918
.phy_read = mv88e6xxx_g2_smi_phy_read,
29732919
.phy_write = mv88e6xxx_g2_smi_phy_write,
2974-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
2975-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
29762920
.port_set_link = mv88e6xxx_port_set_link,
29772921
.port_set_duplex = mv88e6xxx_port_set_duplex,
29782922
.port_set_speed = mv88e6185_port_set_speed,
@@ -3006,8 +2950,6 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
30062950
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
30072951
.phy_read = mv88e6xxx_g2_smi_phy_read,
30082952
.phy_write = mv88e6xxx_g2_smi_phy_write,
3009-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
3010-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
30112953
.port_set_link = mv88e6xxx_port_set_link,
30122954
.port_set_duplex = mv88e6xxx_port_set_duplex,
30132955
.port_set_speed = mv88e6185_port_set_speed,
@@ -3039,8 +2981,6 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
30392981
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
30402982
.phy_read = mv88e6xxx_g2_smi_phy_read,
30412983
.phy_write = mv88e6xxx_g2_smi_phy_write,
3042-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
3043-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
30442984
.port_set_link = mv88e6xxx_port_set_link,
30452985
.port_set_duplex = mv88e6xxx_port_set_duplex,
30462986
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3142,8 +3082,6 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
31423082
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
31433083
.phy_read = mv88e6xxx_g2_smi_phy_read,
31443084
.phy_write = mv88e6xxx_g2_smi_phy_write,
3145-
.phy_energy_detect_read = mv88e6352_phy_energy_detect_read,
3146-
.phy_energy_detect_write = mv88e6352_phy_energy_detect_write,
31473085
.port_set_link = mv88e6xxx_port_set_link,
31483086
.port_set_duplex = mv88e6xxx_port_set_duplex,
31493087
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
@@ -3180,8 +3118,6 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
31803118
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
31813119
.phy_read = mv88e6xxx_g2_smi_phy_read,
31823120
.phy_write = mv88e6xxx_g2_smi_phy_write,
3183-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
3184-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
31853121
.port_set_link = mv88e6xxx_port_set_link,
31863122
.port_set_duplex = mv88e6xxx_port_set_duplex,
31873123
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3220,8 +3156,6 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
32203156
.set_switch_mac = mv88e6xxx_g2_set_switch_mac,
32213157
.phy_read = mv88e6xxx_g2_smi_phy_read,
32223158
.phy_write = mv88e6xxx_g2_smi_phy_write,
3223-
.phy_energy_detect_read = mv88e6390_phy_energy_detect_read,
3224-
.phy_energy_detect_write = mv88e6390_phy_energy_detect_write,
32253159
.port_set_link = mv88e6xxx_port_set_link,
32263160
.port_set_duplex = mv88e6xxx_port_set_duplex,
32273161
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
@@ -3956,8 +3890,8 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
39563890
.get_sset_count = mv88e6xxx_get_sset_count,
39573891
.port_enable = mv88e6xxx_port_enable,
39583892
.port_disable = mv88e6xxx_port_disable,
3959-
.set_eee = mv88e6xxx_set_eee,
3960-
.get_eee = mv88e6xxx_get_eee,
3893+
.get_mac_eee = mv88e6xxx_get_mac_eee,
3894+
.set_mac_eee = mv88e6xxx_set_mac_eee,
39613895
.get_eeprom_len = mv88e6xxx_get_eeprom_len,
39623896
.get_eeprom = mv88e6xxx_get_eeprom,
39633897
.set_eeprom = mv88e6xxx_set_eeprom,

drivers/net/dsa/mv88e6xxx/chip.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,6 @@ struct mv88e6xxx_ops {
239239
struct mii_bus *bus,
240240
int addr, int reg, u16 val);
241241

242-
/* Copper Energy Detect operations */
243-
int (*phy_energy_detect_read)(struct mv88e6xxx_chip *chip, int phy,
244-
struct ethtool_eee *eee);
245-
int (*phy_energy_detect_write)(struct mv88e6xxx_chip *chip, int phy,
246-
struct ethtool_eee *eee);
247-
248242
/* Priority Override Table operations */
249243
int (*pot_clear)(struct mv88e6xxx_chip *chip);
250244

drivers/net/dsa/mv88e6xxx/phy.c

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -246,99 +246,3 @@ int mv88e6xxx_phy_setup(struct mv88e6xxx_chip *chip)
246246
{
247247
return mv88e6xxx_phy_ppu_enable(chip);
248248
}
249-
250-
/* Page 0, Register 16: Copper Specific Control Register 1 */
251-
252-
int mv88e6352_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
253-
struct ethtool_eee *eee)
254-
{
255-
u16 val;
256-
int err;
257-
258-
err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
259-
if (err)
260-
return err;
261-
262-
val &= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_MASK;
263-
264-
eee->eee_enabled = false;
265-
eee->tx_lpi_enabled = false;
266-
267-
switch (val) {
268-
case MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP:
269-
eee->tx_lpi_enabled = true;
270-
/* fall through... */
271-
case MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV:
272-
eee->eee_enabled = true;
273-
}
274-
275-
return 0;
276-
}
277-
278-
int mv88e6352_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
279-
struct ethtool_eee *eee)
280-
{
281-
u16 val;
282-
int err;
283-
284-
err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
285-
if (err)
286-
return err;
287-
288-
val &= ~MV88E6352_PHY_CSCTL1_ENERGY_DETECT_MASK;
289-
290-
if (eee->eee_enabled)
291-
val |= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV;
292-
if (eee->tx_lpi_enabled)
293-
val |= MV88E6352_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP;
294-
295-
return mv88e6xxx_phy_write(chip, phy, MV88E6XXX_PHY_CSCTL1, val);
296-
}
297-
298-
int mv88e6390_phy_energy_detect_read(struct mv88e6xxx_chip *chip, int phy,
299-
struct ethtool_eee *eee)
300-
{
301-
u16 val;
302-
int err;
303-
304-
err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
305-
if (err)
306-
return err;
307-
308-
val &= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_MASK;
309-
310-
eee->eee_enabled = false;
311-
eee->tx_lpi_enabled = false;
312-
313-
switch (val) {
314-
case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_AUTO:
315-
case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_SW:
316-
eee->tx_lpi_enabled = true;
317-
/* fall through... */
318-
case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_AUTO:
319-
case MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_SW:
320-
eee->eee_enabled = true;
321-
}
322-
323-
return 0;
324-
}
325-
326-
int mv88e6390_phy_energy_detect_write(struct mv88e6xxx_chip *chip, int phy,
327-
struct ethtool_eee *eee)
328-
{
329-
u16 val;
330-
int err;
331-
332-
err = mv88e6xxx_phy_read(chip, phy, MV88E6XXX_PHY_CSCTL1, &val);
333-
if (err)
334-
return err;
335-
336-
val &= ~MV88E6390_PHY_CSCTL1_ENERGY_DETECT_MASK;
337-
338-
if (eee->eee_enabled)
339-
val |= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_RCV_AUTO;
340-
if (eee->tx_lpi_enabled)
341-
val |= MV88E6390_PHY_CSCTL1_ENERGY_DETECT_SENSE_NLP_AUTO;
342-
343-
return mv88e6xxx_phy_write(chip, phy, MV88E6XXX_PHY_CSCTL1, val);
344-
}

0 commit comments

Comments
 (0)