Skip to content

Commit 5c74c54

Browse files
irtimmerdavem330
authored andcommitted
net: dsa: mv88e6xxx: Split monitor port configuration
Separate the configuration of the egress and ingress monitor port. This allows the port mirror functionality to do ingress and egress port mirroring to separate ports. Signed-off-by: Iwan R Timmer <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 2282001 commit 5c74c54

File tree

4 files changed

+52
-16
lines changed

4 files changed

+52
-16
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2390,7 +2390,14 @@ static int mv88e6xxx_setup_upstream_port(struct mv88e6xxx_chip *chip, int port)
23902390

23912391
if (chip->info->ops->set_egress_port) {
23922392
err = chip->info->ops->set_egress_port(chip,
2393-
upstream_port);
2393+
MV88E6XXX_EGRESS_DIR_INGRESS,
2394+
upstream_port);
2395+
if (err)
2396+
return err;
2397+
2398+
err = chip->info->ops->set_egress_port(chip,
2399+
MV88E6XXX_EGRESS_DIR_EGRESS,
2400+
upstream_port);
23942401
if (err)
23952402
return err;
23962403
}

drivers/net/dsa/mv88e6xxx/chip.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ enum mv88e6xxx_egress_mode {
3333
MV88E6XXX_EGRESS_MODE_ETHERTYPE,
3434
};
3535

36+
enum mv88e6xxx_egress_direction {
37+
MV88E6XXX_EGRESS_DIR_INGRESS,
38+
MV88E6XXX_EGRESS_DIR_EGRESS,
39+
};
40+
3641
enum mv88e6xxx_frame_mode {
3742
MV88E6XXX_FRAME_MODE_NORMAL,
3843
MV88E6XXX_FRAME_MODE_DSA,
@@ -465,7 +470,9 @@ struct mv88e6xxx_ops {
465470
int (*stats_get_stats)(struct mv88e6xxx_chip *chip, int port,
466471
uint64_t *data);
467472
int (*set_cpu_port)(struct mv88e6xxx_chip *chip, int port);
468-
int (*set_egress_port)(struct mv88e6xxx_chip *chip, int port);
473+
int (*set_egress_port)(struct mv88e6xxx_chip *chip,
474+
enum mv88e6xxx_egress_direction direction,
475+
int port);
469476

470477
#define MV88E6XXX_CASCADE_PORT_NONE 0xe
471478
#define MV88E6XXX_CASCADE_PORT_MULTIPLE 0xf

drivers/net/dsa/mv88e6xxx/global1.c

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,9 @@ int mv88e6250_g1_ieee_pri_map(struct mv88e6xxx_chip *chip)
263263
/* Offset 0x1a: Monitor Control */
264264
/* Offset 0x1a: Monitor & MGMT Control on some devices */
265265

266-
int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
266+
int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip,
267+
enum mv88e6xxx_egress_direction direction,
268+
int port)
267269
{
268270
u16 reg;
269271
int err;
@@ -272,11 +274,20 @@ int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
272274
if (err)
273275
return err;
274276

275-
reg &= ~(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK |
276-
MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
277-
278-
reg |= port << __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK) |
279-
port << __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
277+
switch (direction) {
278+
case MV88E6XXX_EGRESS_DIR_INGRESS:
279+
reg &= MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
280+
reg |= port <<
281+
__bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK);
282+
break;
283+
case MV88E6XXX_EGRESS_DIR_EGRESS:
284+
reg &= MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
285+
reg |= port <<
286+
__bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
287+
break;
288+
default:
289+
return -EINVAL;
290+
}
280291

281292
return mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
282293
}
@@ -310,17 +321,24 @@ static int mv88e6390_g1_monitor_write(struct mv88e6xxx_chip *chip,
310321
return mv88e6xxx_g1_write(chip, MV88E6390_G1_MONITOR_MGMT_CTL, reg);
311322
}
312323

313-
int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
324+
int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip,
325+
enum mv88e6xxx_egress_direction direction,
326+
int port)
314327
{
315328
u16 ptr;
316329
int err;
317330

318-
ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
319-
err = mv88e6390_g1_monitor_write(chip, ptr, port);
320-
if (err)
321-
return err;
331+
switch (direction) {
332+
case MV88E6XXX_EGRESS_DIR_INGRESS:
333+
ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
334+
break;
335+
case MV88E6XXX_EGRESS_DIR_EGRESS:
336+
ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
337+
break;
338+
default:
339+
return -EINVAL;
340+
}
322341

323-
ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
324342
err = mv88e6390_g1_monitor_write(chip, ptr, port);
325343
if (err)
326344
return err;

drivers/net/dsa/mv88e6xxx/global1.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,12 @@ int mv88e6095_g1_stats_set_histogram(struct mv88e6xxx_chip *chip);
288288
int mv88e6390_g1_stats_set_histogram(struct mv88e6xxx_chip *chip);
289289
void mv88e6xxx_g1_stats_read(struct mv88e6xxx_chip *chip, int stat, u32 *val);
290290
int mv88e6xxx_g1_stats_clear(struct mv88e6xxx_chip *chip);
291-
int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port);
292-
int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port);
291+
int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip,
292+
enum mv88e6xxx_egress_direction direction,
293+
int port);
294+
int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip,
295+
enum mv88e6xxx_egress_direction direction,
296+
int port);
293297
int mv88e6095_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
294298
int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
295299
int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);

0 commit comments

Comments
 (0)