Skip to content

Commit 02317e6

Browse files
viviendavem330
authored andcommitted
net: dsa: mv88e6xxx: add a cascade port op
Only the 88E6185 family has bits 15:12 Cascade Port bits in the Global Control 2 register. Hence inconsistent values are actually written in this register for other families. Add a .set_cascade_port operation to isolate the 88E6185 case, and call it from the device mapping setup function. Signed-off-by: Vivien Didelot <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 79a6fd2 commit 02317e6

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1046,6 +1046,13 @@ static int mv88e6xxx_devmap_setup(struct mv88e6xxx_chip *chip)
10461046
return err;
10471047
}
10481048

1049+
if (chip->info->ops->set_cascade_port) {
1050+
port = MV88E6XXX_CASCADE_PORT_MULTIPLE;
1051+
err = chip->info->ops->set_cascade_port(chip, port);
1052+
if (err)
1053+
return err;
1054+
}
1055+
10491056
return 0;
10501057
}
10511058

@@ -2158,7 +2165,6 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
21582165

21592166
/* Disable remote management, and set the switch's DSA device number. */
21602167
err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_CTL2,
2161-
MV88E6XXX_G1_CTL2_MULTIPLE_CASCADE |
21622168
(ds->index & 0x1f));
21632169
if (err)
21642170
return err;
@@ -2643,6 +2649,7 @@ static const struct mv88e6xxx_ops mv88e6131_ops = {
26432649
.watchdog_ops = &mv88e6097_watchdog_ops,
26442650
.mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
26452651
.ppu_enable = mv88e6185_g1_ppu_enable,
2652+
.set_cascade_port = mv88e6185_g1_set_cascade_port,
26462653
.ppu_disable = mv88e6185_g1_ppu_disable,
26472654
.reset = mv88e6185_g1_reset,
26482655
.vtu_getnext = mv88e6185_g1_vtu_getnext,
@@ -2911,6 +2918,7 @@ static const struct mv88e6xxx_ops mv88e6185_ops = {
29112918
.set_egress_port = mv88e6095_g1_set_egress_port,
29122919
.watchdog_ops = &mv88e6097_watchdog_ops,
29132920
.mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
2921+
.set_cascade_port = mv88e6185_g1_set_cascade_port,
29142922
.ppu_enable = mv88e6185_g1_ppu_enable,
29152923
.ppu_disable = mv88e6185_g1_ppu_disable,
29162924
.reset = mv88e6185_g1_reset,

drivers/net/dsa/mv88e6xxx/chip.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ struct mv88e6xxx_ops {
401401
uint64_t *data);
402402
int (*set_cpu_port)(struct mv88e6xxx_chip *chip, int port);
403403
int (*set_egress_port)(struct mv88e6xxx_chip *chip, int port);
404+
405+
#define MV88E6XXX_CASCADE_PORT_NONE 0xe
406+
#define MV88E6XXX_CASCADE_PORT_MULTIPLE 0xf
407+
408+
int (*set_cascade_port)(struct mv88e6xxx_chip *chip, int port);
409+
404410
const struct mv88e6xxx_irq_ops *watchdog_ops;
405411

406412
int (*mgmt_rsvd2cpu)(struct mv88e6xxx_chip *chip);

drivers/net/dsa/mv88e6xxx/global1.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,29 @@ int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
350350

351351
/* Offset 0x1c: Global Control 2 */
352352

353+
static int mv88e6xxx_g1_ctl2_mask(struct mv88e6xxx_chip *chip, u16 mask,
354+
u16 val)
355+
{
356+
u16 reg;
357+
int err;
358+
359+
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_CTL2, &reg);
360+
if (err)
361+
return err;
362+
363+
reg &= ~mask;
364+
reg |= val & mask;
365+
366+
return mv88e6xxx_g1_write(chip, MV88E6XXX_G1_CTL2, reg);
367+
}
368+
369+
int mv88e6185_g1_set_cascade_port(struct mv88e6xxx_chip *chip, int port)
370+
{
371+
const u16 mask = MV88E6185_G1_CTL2_CASCADE_PORT_MASK;
372+
373+
return mv88e6xxx_g1_ctl2_mask(chip, mask, port << __bf_shf(mask));
374+
}
375+
353376
int mv88e6390_g1_stats_set_histogram(struct mv88e6xxx_chip *chip)
354377
{
355378
u16 val;

drivers/net/dsa/mv88e6xxx/global1.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,12 @@
201201

202202
/* Offset 0x1C: Global Control 2 */
203203
#define MV88E6XXX_G1_CTL2 0x1c
204-
#define MV88E6XXX_G1_CTL2_NO_CASCADE 0xe000
205-
#define MV88E6XXX_G1_CTL2_MULTIPLE_CASCADE 0xf000
206204
#define MV88E6XXX_G1_CTL2_HIST_RX 0x0040
207205
#define MV88E6XXX_G1_CTL2_HIST_TX 0x0080
208206
#define MV88E6XXX_G1_CTL2_HIST_RX_TX 0x00c0
207+
#define MV88E6185_G1_CTL2_CASCADE_PORT_MASK 0xf000
208+
#define MV88E6185_G1_CTL2_CASCADE_PORT_NONE 0xe000
209+
#define MV88E6185_G1_CTL2_CASCADE_PORT_MULTI 0xf000
209210

210211
/* Offset 0x1D: Stats Operation Register */
211212
#define MV88E6XXX_G1_STATS_OP 0x1d
@@ -253,6 +254,8 @@ int mv88e6095_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
253254
int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
254255
int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
255256

257+
int mv88e6185_g1_set_cascade_port(struct mv88e6xxx_chip *chip, int port);
258+
256259
int mv88e6xxx_g1_atu_set_learn2all(struct mv88e6xxx_chip *chip, bool learn2all);
257260
int mv88e6xxx_g1_atu_set_age_time(struct mv88e6xxx_chip *chip,
258261
unsigned int msecs);

0 commit comments

Comments
 (0)