DECLARE_BITMAP(mids_bitmap, MLXSW_SP_MID_MAX);
        const struct mlxsw_sp_bridge_ops *bridge_8021q_ops;
        const struct mlxsw_sp_bridge_ops *bridge_8021d_ops;
+       const struct mlxsw_sp_bridge_ops *bridge_8021ad_ops;
 };
 
 struct mlxsw_sp_bridge_device {
        bridge_device->mrouter = br_multicast_router(br_dev);
        INIT_LIST_HEAD(&bridge_device->ports_list);
        if (vlan_enabled) {
+               u16 proto;
+
                bridge->vlan_enabled_exists = true;
-               bridge_device->ops = bridge->bridge_8021q_ops;
+               br_vlan_get_proto(br_dev, &proto);
+               if (proto == ETH_P_8021AD)
+                       bridge_device->ops = bridge->bridge_8021ad_ops;
+               else
+                       bridge_device->ops = bridge->bridge_8021q_ops;
        } else {
                bridge_device->ops = bridge->bridge_8021d_ops;
        }
        .fid_vid        = mlxsw_sp_bridge_8021d_fid_vid,
 };
 
+static int
+mlxsw_sp_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device *bridge_device,
+                                struct mlxsw_sp_bridge_port *bridge_port,
+                                struct mlxsw_sp_port *mlxsw_sp_port,
+                                struct netlink_ext_ack *extack)
+{
+       int err;
+
+       err = mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, true, false);
+       if (err)
+               return err;
+
+       err = mlxsw_sp_bridge_vlan_aware_port_join(bridge_port, mlxsw_sp_port,
+                                                  extack);
+       if (err)
+               goto err_bridge_vlan_aware_port_join;
+
+       return 0;
+
+err_bridge_vlan_aware_port_join:
+       mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
+       return err;
+}
+
+static void
+mlxsw_sp_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
+                                 struct mlxsw_sp_bridge_port *bridge_port,
+                                 struct mlxsw_sp_port *mlxsw_sp_port)
+{
+       mlxsw_sp_bridge_vlan_aware_port_leave(mlxsw_sp_port);
+       mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
+}
+
+static int
+mlxsw_sp_bridge_8021ad_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
+                                 const struct net_device *vxlan_dev, u16 vid,
+                                 struct netlink_ext_ack *extack)
+{
+       NL_SET_ERR_MSG_MOD(extack, "VXLAN is not supported with 802.1ad");
+       return -EOPNOTSUPP;
+}
+
+static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021ad_ops = {
+       .port_join      = mlxsw_sp_bridge_8021ad_port_join,
+       .port_leave     = mlxsw_sp_bridge_8021ad_port_leave,
+       .vxlan_join     = mlxsw_sp_bridge_8021ad_vxlan_join,
+       .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
+       .fid_lookup     = mlxsw_sp_bridge_8021q_fid_lookup,
+       .fid_vid        = mlxsw_sp_bridge_8021q_fid_vid,
+};
+
 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
                              struct net_device *brport_dev,
                              struct net_device *br_dev,
 
        bridge->bridge_8021q_ops = &mlxsw_sp_bridge_8021q_ops;
        bridge->bridge_8021d_ops = &mlxsw_sp_bridge_8021d_ops;
+       bridge->bridge_8021ad_ops = &mlxsw_sp_bridge_8021ad_ops;
 
        return mlxsw_sp_fdb_init(mlxsw_sp);
 }