struct netlink_ext_ack *extack);
 void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
                                 const struct net_device *vxlan_dev);
+struct mlxsw_sp_fid *mlxsw_sp_bridge_fid_get(struct mlxsw_sp *mlxsw_sp,
+                                            const struct net_device *br_dev,
+                                            u16 vid,
+                                            struct netlink_ext_ack *extack);
 extern struct notifier_block mlxsw_sp_switchdev_notifier;
 
 /* spectrum.c */
 
 mlxsw_sp_rif_vlan_fid_get(struct mlxsw_sp_rif *rif,
                          struct netlink_ext_ack *extack)
 {
+       struct net_device *br_dev = rif->dev;
        u16 vid;
        int err;
 
        if (is_vlan_dev(rif->dev)) {
                vid = vlan_dev_vlan_id(rif->dev);
+               br_dev = vlan_dev_real_dev(rif->dev);
+               if (WARN_ON(!netif_is_bridge_master(br_dev)))
+                       return ERR_PTR(-EINVAL);
        } else {
                err = br_vlan_get_pvid(rif->dev, &vid);
                if (err < 0 || !vid) {
                }
        }
 
-       return mlxsw_sp_fid_8021q_get(rif->mlxsw_sp, vid);
+       return mlxsw_sp_bridge_fid_get(rif->mlxsw_sp, br_dev, vid, extack);
 }
 
 static void mlxsw_sp_rif_vlan_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)
 mlxsw_sp_rif_fid_fid_get(struct mlxsw_sp_rif *rif,
                         struct netlink_ext_ack *extack)
 {
-       return mlxsw_sp_fid_8021d_get(rif->mlxsw_sp, rif->dev->ifindex);
+       return mlxsw_sp_bridge_fid_get(rif->mlxsw_sp, rif->dev, 0, extack);
 }
 
 static void mlxsw_sp_rif_fid_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)
 
        mlxsw_sp_fid_put(fid);
 }
 
+struct mlxsw_sp_fid *mlxsw_sp_bridge_fid_get(struct mlxsw_sp *mlxsw_sp,
+                                            const struct net_device *br_dev,
+                                            u16 vid,
+                                            struct netlink_ext_ack *extack)
+{
+       struct mlxsw_sp_bridge_device *bridge_device;
+
+       bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
+       if (WARN_ON(!bridge_device))
+               return ERR_PTR(-EINVAL);
+
+       return bridge_device->ops->fid_get(bridge_device, vid, extack);
+}
+
 static void
 mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr *vxlan_addr,
                                      enum mlxsw_sp_l3proto *proto,