net: dsa: mv88e6xxx: Support policy entries in the VTU
authorTobias Waldekranz <tobias@waldekranz.com>
Thu, 3 Feb 2022 10:16:54 +0000 (11:16 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Feb 2022 14:05:56 +0000 (14:05 +0000)
A VTU entry with policy enabled is used in combination with a port's
VTU policy setting to override normal switching behavior for frames
assigned to the entry's VID.

A typical example is to Treat all frames in a particular VLAN as
control traffic, and trap them to the CPU. In which case the relevant
user port's VTU policy would be set to TRAP.

Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.h
drivers/net/dsa/mv88e6xxx/global1.h
drivers/net/dsa/mv88e6xxx/global1_vtu.c

index 438cee8..80dc7b5 100644 (file)
@@ -179,6 +179,7 @@ struct mv88e6xxx_vtu_entry {
        u16     fid;
        u8      sid;
        bool    valid;
+       bool    policy;
        u8      member[DSA_MAX_PORTS];
        u8      state[DSA_MAX_PORTS];
 };
index 4f3dbb0..2c1607c 100644 (file)
@@ -46,6 +46,7 @@
 
 /* Offset 0x02: VTU FID Register */
 #define MV88E6352_G1_VTU_FID           0x02
+#define MV88E6352_G1_VTU_FID_VID_POLICY        0x1000
 #define MV88E6352_G1_VTU_FID_MASK      0x0fff
 
 /* Offset 0x03: VTU SID Register */
index ae12c98..b1bd927 100644 (file)
@@ -27,7 +27,7 @@ static int mv88e6xxx_g1_vtu_fid_read(struct mv88e6xxx_chip *chip,
                return err;
 
        entry->fid = val & MV88E6352_G1_VTU_FID_MASK;
-
+       entry->policy = !!(val & MV88E6352_G1_VTU_FID_VID_POLICY);
        return 0;
 }
 
@@ -36,6 +36,9 @@ static int mv88e6xxx_g1_vtu_fid_write(struct mv88e6xxx_chip *chip,
 {
        u16 val = entry->fid & MV88E6352_G1_VTU_FID_MASK;
 
+       if (entry->policy)
+               val |= MV88E6352_G1_VTU_FID_VID_POLICY;
+
        return mv88e6xxx_g1_write(chip, MV88E6352_G1_VTU_FID, val);
 }