Skip to content

Commit 0cf3a68

Browse files
committed
Merge branch 'mv88e6xxx-Support-more-SERDES-interfacxes'
Andrew Lunn says: ==================== net: dsa: mv88e6xxx: Support more SERDES interfacxes Currently the SERDES interfaces for ports 9 and 10 on the mv88e6390x are supported, allowing upto 10G. However, when unused, these SERDES interfaces can be used by some of the lower ports for 1000Base-X. The tricky bit here is ordering. The SERDES have to become free from ports 9 or 10 before they can be used with lower ports. Normally, this would happen only when these ports would be configured up, which is too late. So at probe time, defaulting ports 9 and 10 to 1000BaseX frees them for use with lower ports. If they are actually needed, they will be taken back when port 9 and 10 goes up. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 8d2681f + 2defda1 commit 0cf3a68

File tree

5 files changed

+54
-17
lines changed

5 files changed

+54
-17
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3234,6 +3234,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
32343234
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
32353235
.port_link_state = mv88e6352_port_link_state,
32363236
.port_get_cmode = mv88e6352_port_get_cmode,
3237+
.port_set_cmode = mv88e6390_port_set_cmode,
32373238
.stats_snapshot = mv88e6390_g1_stats_snapshot,
32383239
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
32393240
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3276,6 +3277,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
32763277
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
32773278
.port_link_state = mv88e6352_port_link_state,
32783279
.port_get_cmode = mv88e6352_port_get_cmode,
3280+
.port_set_cmode = mv88e6390x_port_set_cmode,
32793281
.stats_snapshot = mv88e6390_g1_stats_snapshot,
32803282
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
32813283
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3291,8 +3293,8 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
32913293
.vtu_getnext = mv88e6390_g1_vtu_getnext,
32923294
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
32933295
.serdes_power = mv88e6390x_serdes_power,
3294-
.serdes_irq_setup = mv88e6390_serdes_irq_setup,
3295-
.serdes_irq_free = mv88e6390_serdes_irq_free,
3296+
.serdes_irq_setup = mv88e6390x_serdes_irq_setup,
3297+
.serdes_irq_free = mv88e6390x_serdes_irq_free,
32963298
.gpio_ops = &mv88e6352_gpio_ops,
32973299
.phylink_validate = mv88e6390x_phylink_validate,
32983300
};
@@ -3318,6 +3320,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
33183320
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
33193321
.port_link_state = mv88e6352_port_link_state,
33203322
.port_get_cmode = mv88e6352_port_get_cmode,
3323+
.port_set_cmode = mv88e6390_port_set_cmode,
33213324
.stats_snapshot = mv88e6390_g1_stats_snapshot,
33223325
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
33233326
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3405,11 +3408,11 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
34053408
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
34063409
.port_set_ether_type = mv88e6351_port_set_ether_type,
34073410
.port_pause_limit = mv88e6390_port_pause_limit,
3408-
.port_set_cmode = mv88e6390x_port_set_cmode,
34093411
.port_disable_learn_limit = mv88e6xxx_port_disable_learn_limit,
34103412
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
34113413
.port_link_state = mv88e6352_port_link_state,
34123414
.port_get_cmode = mv88e6352_port_get_cmode,
3415+
.port_set_cmode = mv88e6390_port_set_cmode,
34133416
.stats_snapshot = mv88e6390_g1_stats_snapshot,
34143417
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
34153418
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3710,11 +3713,11 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
37103713
.port_set_jumbo_size = mv88e6165_port_set_jumbo_size,
37113714
.port_egress_rate_limiting = mv88e6097_port_egress_rate_limiting,
37123715
.port_pause_limit = mv88e6390_port_pause_limit,
3713-
.port_set_cmode = mv88e6390x_port_set_cmode,
37143716
.port_disable_learn_limit = mv88e6xxx_port_disable_learn_limit,
37153717
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
37163718
.port_link_state = mv88e6352_port_link_state,
37173719
.port_get_cmode = mv88e6352_port_get_cmode,
3720+
.port_set_cmode = mv88e6390_port_set_cmode,
37183721
.stats_snapshot = mv88e6390_g1_stats_snapshot,
37193722
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
37203723
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3757,11 +3760,11 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
37573760
.port_set_jumbo_size = mv88e6165_port_set_jumbo_size,
37583761
.port_egress_rate_limiting = mv88e6097_port_egress_rate_limiting,
37593762
.port_pause_limit = mv88e6390_port_pause_limit,
3760-
.port_set_cmode = mv88e6390x_port_set_cmode,
37613763
.port_disable_learn_limit = mv88e6xxx_port_disable_learn_limit,
37623764
.port_disable_pri_override = mv88e6xxx_port_disable_pri_override,
37633765
.port_link_state = mv88e6352_port_link_state,
37643766
.port_get_cmode = mv88e6352_port_get_cmode,
3767+
.port_set_cmode = mv88e6390x_port_set_cmode,
37653768
.stats_snapshot = mv88e6390_g1_stats_snapshot,
37663769
.stats_set_histogram = mv88e6390_g1_stats_set_histogram,
37673770
.stats_get_sset_count = mv88e6320_stats_get_sset_count,
@@ -3777,8 +3780,8 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
37773780
.vtu_getnext = mv88e6390_g1_vtu_getnext,
37783781
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
37793782
.serdes_power = mv88e6390x_serdes_power,
3780-
.serdes_irq_setup = mv88e6390_serdes_irq_setup,
3781-
.serdes_irq_free = mv88e6390_serdes_irq_free,
3783+
.serdes_irq_setup = mv88e6390x_serdes_irq_setup,
3784+
.serdes_irq_free = mv88e6390x_serdes_irq_free,
37823785
.gpio_ops = &mv88e6352_gpio_ops,
37833786
.avb_ops = &mv88e6390_avb_ops,
37843787
.ptp_ops = &mv88e6352_ptp_ops,

drivers/net/dsa/mv88e6xxx/port.c

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,12 +368,15 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
368368
u16 reg;
369369
int err;
370370

371-
if (mode == PHY_INTERFACE_MODE_NA)
372-
return 0;
373-
374371
if (port != 9 && port != 10)
375372
return -EOPNOTSUPP;
376373

374+
/* Default to a slow mode, so freeing up SERDES interfaces for
375+
* other ports which might use them for SFPs.
376+
*/
377+
if (mode == PHY_INTERFACE_MODE_NA)
378+
mode = PHY_INTERFACE_MODE_1000BASEX;
379+
377380
switch (mode) {
378381
case PHY_INTERFACE_MODE_1000BASEX:
379382
cmode = MV88E6XXX_PORT_STS_CMODE_1000BASE_X;
@@ -437,6 +440,21 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
437440
return 0;
438441
}
439442

443+
int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
444+
phy_interface_t mode)
445+
{
446+
switch (mode) {
447+
case PHY_INTERFACE_MODE_XGMII:
448+
case PHY_INTERFACE_MODE_XAUI:
449+
case PHY_INTERFACE_MODE_RXAUI:
450+
return -EINVAL;
451+
default:
452+
break;
453+
}
454+
455+
return mv88e6390x_port_set_cmode(chip, port, mode);
456+
}
457+
440458
int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
441459
{
442460
int err;

drivers/net/dsa/mv88e6xxx/port.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ int mv88e6097_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
310310
u8 out);
311311
int mv88e6390_port_pause_limit(struct mv88e6xxx_chip *chip, int port, u8 in,
312312
u8 out);
313+
int mv88e6390_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
314+
phy_interface_t mode);
313315
int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
314316
phy_interface_t mode);
315317
int mv88e6185_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);

drivers/net/dsa/mv88e6xxx/serdes.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -619,15 +619,11 @@ static irqreturn_t mv88e6390_serdes_thread_fn(int irq, void *dev_id)
619619
return ret;
620620
}
621621

622-
int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port)
622+
int mv88e6390x_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port)
623623
{
624624
int lane;
625625
int err;
626626

627-
/* Only support ports 9 and 10 at the moment */
628-
if (port < 9)
629-
return 0;
630-
631627
lane = mv88e6390x_serdes_get_lane(chip, port);
632628

633629
if (lane == -ENODEV)
@@ -663,11 +659,19 @@ int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port)
663659
return mv88e6390_serdes_irq_enable(chip, port, lane);
664660
}
665661

666-
void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port)
662+
int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port)
663+
{
664+
if (port < 9)
665+
return 0;
666+
667+
return mv88e6390_serdes_irq_setup(chip, port);
668+
}
669+
670+
void mv88e6390x_serdes_irq_free(struct mv88e6xxx_chip *chip, int port)
667671
{
668672
int lane = mv88e6390x_serdes_get_lane(chip, port);
669673

670-
if (port < 9)
674+
if (lane == -ENODEV)
671675
return;
672676

673677
if (lane < 0)
@@ -685,6 +689,14 @@ void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port)
685689
chip->ports[port].serdes_irq = 0;
686690
}
687691

692+
void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port)
693+
{
694+
if (port < 9)
695+
return;
696+
697+
mv88e6390x_serdes_irq_free(chip, port);
698+
}
699+
688700
int mv88e6341_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on)
689701
{
690702
u8 cmode = chip->ports[port].cmode;

drivers/net/dsa/mv88e6xxx/serdes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
7777
int mv88e6390x_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on);
7878
int mv88e6390_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port);
7979
void mv88e6390_serdes_irq_free(struct mv88e6xxx_chip *chip, int port);
80+
int mv88e6390x_serdes_irq_setup(struct mv88e6xxx_chip *chip, int port);
81+
void mv88e6390x_serdes_irq_free(struct mv88e6xxx_chip *chip, int port);
8082
int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port);
8183
int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
8284
int port, uint8_t *data);

0 commit comments

Comments
 (0)