net: dsa: mv88e6xxx: flush VTU and STU entries
[firefly-linux-kernel-4.4.55.git] / drivers / net / dsa / mv88e6xxx.h
index 8b017d65b6917f4cc31707138914547dd29e7a06..76139ea3b6c5c77b63cd6b2d7b76d358b6d4f5f8 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef __MV88E6XXX_H
 #define __MV88E6XXX_H
 
+#include <linux/if_vlan.h>
+
 #ifndef UINT64_MAX
 #define UINT64_MAX             (u64)(~((u64)0))
 #endif
 #define GLOBAL_MAC_01          0x01
 #define GLOBAL_MAC_23          0x02
 #define GLOBAL_MAC_45          0x03
+#define GLOBAL_ATU_FID         0x01    /* 6097 6165 6351 6352 */
 #define GLOBAL_CONTROL         0x04
 #define GLOBAL_CONTROL_SW_RESET                BIT(15)
 #define GLOBAL_CONTROL_PPU_ENABLE      BIT(14)
 #define GLOBAL_CONTROL_TCAM_EN         BIT(1)
 #define GLOBAL_CONTROL_EEPROM_DONE_EN  BIT(0)
 #define GLOBAL_VTU_OP          0x05
+#define GLOBAL_VTU_OP_BUSY     BIT(15)
+#define GLOBAL_VTU_OP_FLUSH_ALL                ((0x01 << 12) | GLOBAL_VTU_OP_BUSY)
 #define GLOBAL_VTU_VID         0x06
 #define GLOBAL_VTU_DATA_0_3    0x07
 #define GLOBAL_VTU_DATA_4_7    0x08
 #define GLOBAL_ATU_OP_GET_CLR_VIOLATION          ((7 << 12) | GLOBAL_ATU_OP_BUSY)
 #define GLOBAL_ATU_DATA                0x0c
 #define GLOBAL_ATU_DATA_TRUNK                  BIT(15)
+#define GLOBAL_ATU_DATA_TRUNK_ID_MASK          0x00f0
+#define GLOBAL_ATU_DATA_TRUNK_ID_SHIFT         4
 #define GLOBAL_ATU_DATA_PORT_VECTOR_MASK       0x3ff0
 #define GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT      4
 #define GLOBAL_ATU_DATA_STATE_MASK             0x0f
 #define GLOBAL2_QOS_WEIGHT     0x1c
 #define GLOBAL2_MISC           0x1d
 
+struct mv88e6xxx_atu_entry {
+       u16     fid;
+       u8      state;
+       bool    trunk;
+       u16     portv_trunkid;
+       u8      mac[ETH_ALEN];
+};
+
 struct mv88e6xxx_priv_state {
        /* When using multi-chip addressing, this mutex protects
         * access to the indirect access registers.  (In single-chip
@@ -351,9 +366,9 @@ struct mv88e6xxx_priv_state {
 
        /* hw bridging */
 
-       u32 fid_mask;
-       u8 fid[DSA_MAX_PORTS];
-       u16 bridge_mask[DSA_MAX_PORTS];
+       DECLARE_BITMAP(fid_bitmap, VLAN_N_VID); /* FIDs 1 to 4095 available */
+       u16 fid[DSA_MAX_PORTS];                 /* per (non-bridged) port FID */
+       u16 bridge_mask[DSA_MAX_PORTS];         /* br groups (indexed by FID) */
 
        unsigned long port_state_update_mask;
        u8 port_state[DSA_MAX_PORTS];
@@ -418,7 +433,7 @@ int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
 int mv88e6xxx_port_fdb_del(struct dsa_switch *ds, int port,
                           const unsigned char *addr, u16 vid);
 int mv88e6xxx_port_fdb_getnext(struct dsa_switch *ds, int port,
-                              unsigned char *addr, bool *is_static);
+                              unsigned char *addr, u16 *vid, bool *is_static);
 int mv88e6xxx_phy_page_read(struct dsa_switch *ds, int port, int page, int reg);
 int mv88e6xxx_phy_page_write(struct dsa_switch *ds, int port, int page,
                             int reg, int val);