const struct sja1105_regs *regs;
        int (*reset_cmd)(const void *ctx, const void *data);
        int (*setup_rgmii_delay)(const void *ctx, int port);
+       /* Prototypes from include/net/dsa.h */
+       int (*fdb_add_cmd)(struct dsa_switch *ds, int port,
+                          const unsigned char *addr, u16 vid);
+       int (*fdb_del_cmd)(struct dsa_switch *ds, int port,
+                          const unsigned char *addr, u16 vid);
        const char *name;
 };
 
                                 enum sja1105_blk_idx blk_idx,
                                 int index, void *entry, bool keep);
 
-u8 sja1105_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid);
+u8 sja1105et_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid);
+int sja1105et_fdb_add(struct dsa_switch *ds, int port,
+                     const unsigned char *addr, u16 vid);
+int sja1105et_fdb_del(struct dsa_switch *ds, int port,
+                     const unsigned char *addr, u16 vid);
+int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
+                       const unsigned char *addr, u16 vid);
+int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
+                       const unsigned char *addr, u16 vid);
 
 /* Common implementations for the static and dynamic configs */
 size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
 
  * is also received as argument in the Koopman notation that the switch
  * hardware stores it in.
  */
-u8 sja1105_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid)
+u8 sja1105et_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid)
 {
        struct sja1105_l2_lookup_params_entry *l2_lookup_params =
                priv->static_config.tables[BLK_IDX_L2_LOOKUP_PARAMS].entries;
 
        return bin * SJA1105ET_FDB_BIN_SIZE + way;
 }
 
-static int sja1105_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
-                                      const u8 *addr, u16 vid,
-                                      struct sja1105_l2_lookup_entry *match,
-                                      int *last_unused)
+static int sja1105et_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
+                                        const u8 *addr, u16 vid,
+                                        struct sja1105_l2_lookup_entry *match,
+                                        int *last_unused)
 {
        int way;
 
        return -1;
 }
 
-static int sja1105_fdb_add(struct dsa_switch *ds, int port,
-                          const unsigned char *addr, u16 vid)
+int sja1105et_fdb_add(struct dsa_switch *ds, int port,
+                     const unsigned char *addr, u16 vid)
 {
        struct sja1105_l2_lookup_entry l2_lookup = {0};
        struct sja1105_private *priv = ds->priv;
        int last_unused = -1;
        int bin, way;
 
-       bin = sja1105_fdb_hash(priv, addr, vid);
+       bin = sja1105et_fdb_hash(priv, addr, vid);
 
-       way = sja1105_is_fdb_entry_in_bin(priv, bin, addr, vid,
-                                         &l2_lookup, &last_unused);
+       way = sja1105et_is_fdb_entry_in_bin(priv, bin, addr, vid,
+                                           &l2_lookup, &last_unused);
        if (way >= 0) {
                /* We have an FDB entry. Is our port in the destination
                 * mask? If yes, we need to do nothing. If not, we need
                                            true);
 }
 
-static int sja1105_fdb_del(struct dsa_switch *ds, int port,
-                          const unsigned char *addr, u16 vid)
+int sja1105et_fdb_del(struct dsa_switch *ds, int port,
+                     const unsigned char *addr, u16 vid)
 {
        struct sja1105_l2_lookup_entry l2_lookup = {0};
        struct sja1105_private *priv = ds->priv;
        int index, bin, way;
        bool keep;
 
-       bin = sja1105_fdb_hash(priv, addr, vid);
-       way = sja1105_is_fdb_entry_in_bin(priv, bin, addr, vid,
-                                         &l2_lookup, NULL);
+       bin = sja1105et_fdb_hash(priv, addr, vid);
+       way = sja1105et_is_fdb_entry_in_bin(priv, bin, addr, vid,
+                                           &l2_lookup, NULL);
        if (way < 0)
                return 0;
        index = sja1105et_fdb_index(bin, way);
                                            index, &l2_lookup, keep);
 }
 
+int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
+                       const unsigned char *addr, u16 vid)
+{
+       return -EOPNOTSUPP;
+}
+
+int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
+                       const unsigned char *addr, u16 vid)
+{
+       return -EOPNOTSUPP;
+}
+
+static int sja1105_fdb_add(struct dsa_switch *ds, int port,
+                          const unsigned char *addr, u16 vid)
+{
+       struct sja1105_private *priv = ds->priv;
+
+       return priv->info->fdb_add_cmd(ds, port, addr, vid);
+}
+
+static int sja1105_fdb_del(struct dsa_switch *ds, int port,
+                          const unsigned char *addr, u16 vid)
+{
+       struct sja1105_private *priv = ds->priv;
+
+       return priv->info->fdb_del_cmd(ds, port, addr, vid);
+}
+
 static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
                            dsa_fdb_dump_cb_t *cb, void *data)
 {
 
        .static_ops             = sja1105e_table_ops,
        .dyn_ops                = sja1105et_dyn_ops,
        .reset_cmd              = sja1105et_reset_cmd,
+       .fdb_add_cmd            = sja1105et_fdb_add,
+       .fdb_del_cmd            = sja1105et_fdb_del,
        .regs                   = &sja1105et_regs,
        .name                   = "SJA1105E",
 };
        .static_ops             = sja1105t_table_ops,
        .dyn_ops                = sja1105et_dyn_ops,
        .reset_cmd              = sja1105et_reset_cmd,
+       .fdb_add_cmd            = sja1105et_fdb_add,
+       .fdb_del_cmd            = sja1105et_fdb_del,
        .regs                   = &sja1105et_regs,
        .name                   = "SJA1105T",
 };
        .static_ops             = sja1105p_table_ops,
        .dyn_ops                = sja1105pqrs_dyn_ops,
        .reset_cmd              = sja1105pqrs_reset_cmd,
+       .fdb_add_cmd            = sja1105pqrs_fdb_add,
+       .fdb_del_cmd            = sja1105pqrs_fdb_del,
        .regs                   = &sja1105pqrs_regs,
        .name                   = "SJA1105P",
 };
        .static_ops             = sja1105q_table_ops,
        .dyn_ops                = sja1105pqrs_dyn_ops,
        .reset_cmd              = sja1105pqrs_reset_cmd,
+       .fdb_add_cmd            = sja1105pqrs_fdb_add,
+       .fdb_del_cmd            = sja1105pqrs_fdb_del,
        .regs                   = &sja1105pqrs_regs,
        .name                   = "SJA1105Q",
 };
        .static_ops             = sja1105r_table_ops,
        .dyn_ops                = sja1105pqrs_dyn_ops,
        .reset_cmd              = sja1105pqrs_reset_cmd,
+       .fdb_add_cmd            = sja1105pqrs_fdb_add,
+       .fdb_del_cmd            = sja1105pqrs_fdb_del,
        .regs                   = &sja1105pqrs_regs,
        .name                   = "SJA1105R",
 };
        .dyn_ops                = sja1105pqrs_dyn_ops,
        .regs                   = &sja1105pqrs_regs,
        .reset_cmd              = sja1105pqrs_reset_cmd,
+       .fdb_add_cmd            = sja1105pqrs_fdb_add,
+       .fdb_del_cmd            = sja1105pqrs_fdb_del,
        .name                   = "SJA1105S",
 };