Skip to content

Commit f3a2cd3

Browse files
viviendavem330
authored andcommitted
net: dsa: mv88e6xxx: introduce .port_set_policy
Introduce a new .port_set_policy operation to configure a port's Policy Control List, based on mapping such as DA, SA, Etype and so on. Models similar to 88E6352 and 88E6390 are supported at the moment. Signed-off-by: Vivien Didelot <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d8291a9 commit f3a2cd3

File tree

4 files changed

+121
-1
lines changed

4 files changed

+121
-1
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3132,6 +3132,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
31323132
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
31333133
.port_set_speed = mv88e6352_port_set_speed,
31343134
.port_tag_remap = mv88e6095_port_tag_remap,
3135+
.port_set_policy = mv88e6352_port_set_policy,
31353136
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
31363137
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
31373138
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3218,6 +3219,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
32183219
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
32193220
.port_set_speed = mv88e6352_port_set_speed,
32203221
.port_tag_remap = mv88e6095_port_tag_remap,
3222+
.port_set_policy = mv88e6352_port_set_policy,
32213223
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
32223224
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
32233225
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3303,6 +3305,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
33033305
.port_set_speed = mv88e6390_port_set_speed,
33043306
.port_max_speed_mode = mv88e6390_port_max_speed_mode,
33053307
.port_tag_remap = mv88e6390_port_tag_remap,
3308+
.port_set_policy = mv88e6352_port_set_policy,
33063309
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
33073310
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
33083311
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3351,6 +3354,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
33513354
.port_set_speed = mv88e6390x_port_set_speed,
33523355
.port_max_speed_mode = mv88e6390x_port_max_speed_mode,
33533356
.port_tag_remap = mv88e6390_port_tag_remap,
3357+
.port_set_policy = mv88e6352_port_set_policy,
33543358
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
33553359
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
33563360
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3448,6 +3452,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
34483452
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
34493453
.port_set_speed = mv88e6352_port_set_speed,
34503454
.port_tag_remap = mv88e6095_port_tag_remap,
3455+
.port_set_policy = mv88e6352_port_set_policy,
34513456
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
34523457
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
34533458
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3539,6 +3544,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
35393544
.port_set_speed = mv88e6390_port_set_speed,
35403545
.port_max_speed_mode = mv88e6390_port_max_speed_mode,
35413546
.port_tag_remap = mv88e6390_port_tag_remap,
3547+
.port_set_policy = mv88e6352_port_set_policy,
35423548
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
35433549
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
35443550
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3809,6 +3815,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
38093815
.port_set_rgmii_delay = mv88e6352_port_set_rgmii_delay,
38103816
.port_set_speed = mv88e6352_port_set_speed,
38113817
.port_tag_remap = mv88e6095_port_tag_remap,
3818+
.port_set_policy = mv88e6352_port_set_policy,
38123819
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
38133820
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
38143821
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3863,6 +3870,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
38633870
.port_set_speed = mv88e6390_port_set_speed,
38643871
.port_max_speed_mode = mv88e6390_port_max_speed_mode,
38653872
.port_tag_remap = mv88e6390_port_tag_remap,
3873+
.port_set_policy = mv88e6352_port_set_policy,
38663874
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
38673875
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
38683876
.port_set_ether_type = mv88e6351_port_set_ether_type,
@@ -3915,6 +3923,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
39153923
.port_set_speed = mv88e6390x_port_set_speed,
39163924
.port_max_speed_mode = mv88e6390x_port_max_speed_mode,
39173925
.port_tag_remap = mv88e6390_port_tag_remap,
3926+
.port_set_policy = mv88e6352_port_set_policy,
39183927
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
39193928
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
39203929
.port_set_ether_type = mv88e6351_port_set_ether_type,

drivers/net/dsa/mv88e6xxx/chip.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,24 @@ struct mv88e6xxx_port_hwtstamp {
189189
struct hwtstamp_config tstamp_config;
190190
};
191191

192+
enum mv88e6xxx_policy_mapping {
193+
MV88E6XXX_POLICY_MAPPING_DA,
194+
MV88E6XXX_POLICY_MAPPING_SA,
195+
MV88E6XXX_POLICY_MAPPING_VTU,
196+
MV88E6XXX_POLICY_MAPPING_ETYPE,
197+
MV88E6XXX_POLICY_MAPPING_PPPOE,
198+
MV88E6XXX_POLICY_MAPPING_VBAS,
199+
MV88E6XXX_POLICY_MAPPING_OPT82,
200+
MV88E6XXX_POLICY_MAPPING_UDP,
201+
};
202+
203+
enum mv88e6xxx_policy_action {
204+
MV88E6XXX_POLICY_ACTION_NORMAL,
205+
MV88E6XXX_POLICY_ACTION_MIRROR,
206+
MV88E6XXX_POLICY_ACTION_TRAP,
207+
MV88E6XXX_POLICY_ACTION_DISCARD,
208+
};
209+
192210
struct mv88e6xxx_port {
193211
struct mv88e6xxx_chip *chip;
194212
int port;
@@ -381,6 +399,10 @@ struct mv88e6xxx_ops {
381399

382400
int (*port_tag_remap)(struct mv88e6xxx_chip *chip, int port);
383401

402+
int (*port_set_policy)(struct mv88e6xxx_chip *chip, int port,
403+
enum mv88e6xxx_policy_mapping mapping,
404+
enum mv88e6xxx_policy_action action);
405+
384406
int (*port_set_frame_mode)(struct mv88e6xxx_chip *chip, int port,
385407
enum mv88e6xxx_frame_mode mode);
386408
int (*port_set_egress_floods)(struct mv88e6xxx_chip *chip, int port,

drivers/net/dsa/mv88e6xxx/port.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,3 +1341,77 @@ int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
13411341

13421342
return 0;
13431343
}
1344+
1345+
/* Offset 0x0E: Policy Control Register */
1346+
1347+
int mv88e6352_port_set_policy(struct mv88e6xxx_chip *chip, int port,
1348+
enum mv88e6xxx_policy_mapping mapping,
1349+
enum mv88e6xxx_policy_action action)
1350+
{
1351+
u16 reg, mask, val;
1352+
int shift;
1353+
int err;
1354+
1355+
switch (mapping) {
1356+
case MV88E6XXX_POLICY_MAPPING_DA:
1357+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_DA_MASK);
1358+
mask = MV88E6XXX_PORT_POLICY_CTL_DA_MASK;
1359+
break;
1360+
case MV88E6XXX_POLICY_MAPPING_SA:
1361+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_SA_MASK);
1362+
mask = MV88E6XXX_PORT_POLICY_CTL_SA_MASK;
1363+
break;
1364+
case MV88E6XXX_POLICY_MAPPING_VTU:
1365+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VTU_MASK);
1366+
mask = MV88E6XXX_PORT_POLICY_CTL_VTU_MASK;
1367+
break;
1368+
case MV88E6XXX_POLICY_MAPPING_ETYPE:
1369+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK);
1370+
mask = MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK;
1371+
break;
1372+
case MV88E6XXX_POLICY_MAPPING_PPPOE:
1373+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK);
1374+
mask = MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK;
1375+
break;
1376+
case MV88E6XXX_POLICY_MAPPING_VBAS:
1377+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK);
1378+
mask = MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK;
1379+
break;
1380+
case MV88E6XXX_POLICY_MAPPING_OPT82:
1381+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK);
1382+
mask = MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK;
1383+
break;
1384+
case MV88E6XXX_POLICY_MAPPING_UDP:
1385+
shift = __bf_shf(MV88E6XXX_PORT_POLICY_CTL_UDP_MASK);
1386+
mask = MV88E6XXX_PORT_POLICY_CTL_UDP_MASK;
1387+
break;
1388+
default:
1389+
return -EOPNOTSUPP;
1390+
}
1391+
1392+
switch (action) {
1393+
case MV88E6XXX_POLICY_ACTION_NORMAL:
1394+
val = MV88E6XXX_PORT_POLICY_CTL_NORMAL;
1395+
break;
1396+
case MV88E6XXX_POLICY_ACTION_MIRROR:
1397+
val = MV88E6XXX_PORT_POLICY_CTL_MIRROR;
1398+
break;
1399+
case MV88E6XXX_POLICY_ACTION_TRAP:
1400+
val = MV88E6XXX_PORT_POLICY_CTL_TRAP;
1401+
break;
1402+
case MV88E6XXX_POLICY_ACTION_DISCARD:
1403+
val = MV88E6XXX_PORT_POLICY_CTL_DISCARD;
1404+
break;
1405+
default:
1406+
return -EOPNOTSUPP;
1407+
}
1408+
1409+
err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_POLICY_CTL, &reg);
1410+
if (err)
1411+
return err;
1412+
1413+
reg &= ~mask;
1414+
reg |= (val << shift) & mask;
1415+
1416+
return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_POLICY_CTL, reg);
1417+
}

drivers/net/dsa/mv88e6xxx/port.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,19 @@
222222
#define MV88E6XXX_PORT_PRI_OVERRIDE 0x0d
223223

224224
/* Offset 0x0E: Policy Control Register */
225-
#define MV88E6XXX_PORT_POLICY_CTL 0x0e
225+
#define MV88E6XXX_PORT_POLICY_CTL 0x0e
226+
#define MV88E6XXX_PORT_POLICY_CTL_DA_MASK 0xc000
227+
#define MV88E6XXX_PORT_POLICY_CTL_SA_MASK 0x3000
228+
#define MV88E6XXX_PORT_POLICY_CTL_VTU_MASK 0x0c00
229+
#define MV88E6XXX_PORT_POLICY_CTL_ETYPE_MASK 0x0300
230+
#define MV88E6XXX_PORT_POLICY_CTL_PPPOE_MASK 0x00c0
231+
#define MV88E6XXX_PORT_POLICY_CTL_VBAS_MASK 0x0030
232+
#define MV88E6XXX_PORT_POLICY_CTL_OPT82_MASK 0x000c
233+
#define MV88E6XXX_PORT_POLICY_CTL_UDP_MASK 0x0003
234+
#define MV88E6XXX_PORT_POLICY_CTL_NORMAL 0x0000
235+
#define MV88E6XXX_PORT_POLICY_CTL_MIRROR 0x0001
236+
#define MV88E6XXX_PORT_POLICY_CTL_TRAP 0x0002
237+
#define MV88E6XXX_PORT_POLICY_CTL_DISCARD 0x0003
226238

227239
/* Offset 0x0F: Port Special Ether Type */
228240
#define MV88E6XXX_PORT_ETH_TYPE 0x0f
@@ -324,6 +336,9 @@ int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
324336
bool unicast, bool multicast);
325337
int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
326338
bool unicast, bool multicast);
339+
int mv88e6352_port_set_policy(struct mv88e6xxx_chip *chip, int port,
340+
enum mv88e6xxx_policy_mapping mapping,
341+
enum mv88e6xxx_policy_action action);
327342
int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
328343
u16 etype);
329344
int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,

0 commit comments

Comments
 (0)