linux/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
   3
   4#include <linux/kernel.h>
   5#include <linux/types.h>
   6#include <linux/netdevice.h>
   7#include <linux/etherdevice.h>
   8#include <linux/slab.h>
   9#include <linux/device.h>
  10#include <linux/skbuff.h>
  11#include <linux/if_vlan.h>
  12#include <linux/if_bridge.h>
  13#include <linux/workqueue.h>
  14#include <linux/jiffies.h>
  15#include <linux/rtnetlink.h>
  16#include <linux/netlink.h>
  17#include <net/switchdev.h>
  18#include <net/vxlan.h>
  19
  20#include "spectrum_span.h"
  21#include "spectrum_switchdev.h"
  22#include "spectrum.h"
  23#include "core.h"
  24#include "reg.h"
  25
  26struct mlxsw_sp_bridge_ops;
  27
  28struct mlxsw_sp_bridge {
  29        struct mlxsw_sp *mlxsw_sp;
  30        struct {
  31                struct delayed_work dw;
  32#define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
  33                unsigned int interval; /* ms */
  34        } fdb_notify;
  35#define MLXSW_SP_MIN_AGEING_TIME 10
  36#define MLXSW_SP_MAX_AGEING_TIME 1000000
  37#define MLXSW_SP_DEFAULT_AGEING_TIME 300
  38        u32 ageing_time;
  39        bool vlan_enabled_exists;
  40        struct list_head bridges_list;
  41        DECLARE_BITMAP(mids_bitmap, MLXSW_SP_MID_MAX);
  42        const struct mlxsw_sp_bridge_ops *bridge_8021q_ops;
  43        const struct mlxsw_sp_bridge_ops *bridge_8021d_ops;
  44        const struct mlxsw_sp_bridge_ops *bridge_8021ad_ops;
  45};
  46
  47struct mlxsw_sp_bridge_device {
  48        struct net_device *dev;
  49        struct list_head list;
  50        struct list_head ports_list;
  51        struct list_head mids_list;
  52        u8 vlan_enabled:1,
  53           multicast_enabled:1,
  54           mrouter:1;
  55        const struct mlxsw_sp_bridge_ops *ops;
  56};
  57
  58struct mlxsw_sp_bridge_port {
  59        struct net_device *dev;
  60        struct mlxsw_sp_bridge_device *bridge_device;
  61        struct list_head list;
  62        struct list_head vlans_list;
  63        unsigned int ref_count;
  64        u8 stp_state;
  65        unsigned long flags;
  66        bool mrouter;
  67        bool lagged;
  68        union {
  69                u16 lag_id;
  70                u16 system_port;
  71        };
  72};
  73
  74struct mlxsw_sp_bridge_vlan {
  75        struct list_head list;
  76        struct list_head port_vlan_list;
  77        u16 vid;
  78};
  79
  80struct mlxsw_sp_bridge_ops {
  81        int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
  82                         struct mlxsw_sp_bridge_port *bridge_port,
  83                         struct mlxsw_sp_port *mlxsw_sp_port,
  84                         struct netlink_ext_ack *extack);
  85        void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
  86                           struct mlxsw_sp_bridge_port *bridge_port,
  87                           struct mlxsw_sp_port *mlxsw_sp_port);
  88        int (*vxlan_join)(struct mlxsw_sp_bridge_device *bridge_device,
  89                          const struct net_device *vxlan_dev, u16 vid,
  90                          struct netlink_ext_ack *extack);
  91        struct mlxsw_sp_fid *
  92                (*fid_get)(struct mlxsw_sp_bridge_device *bridge_device,
  93                           u16 vid, struct netlink_ext_ack *extack);
  94        struct mlxsw_sp_fid *
  95                (*fid_lookup)(struct mlxsw_sp_bridge_device *bridge_device,
  96                              u16 vid);
  97        u16 (*fid_vid)(struct mlxsw_sp_bridge_device *bridge_device,
  98                       const struct mlxsw_sp_fid *fid);
  99};
 100
 101struct mlxsw_sp_switchdev_ops {
 102        void (*init)(struct mlxsw_sp *mlxsw_sp);
 103};
 104
 105static int
 106mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
 107                               struct mlxsw_sp_bridge_port *bridge_port,
 108                               u16 fid_index);
 109
 110static void
 111mlxsw_sp_bridge_port_mdb_flush(struct mlxsw_sp_port *mlxsw_sp_port,
 112                               struct mlxsw_sp_bridge_port *bridge_port);
 113
 114static void
 115mlxsw_sp_bridge_mdb_mc_enable_sync(struct mlxsw_sp_port *mlxsw_sp_port,
 116                                   struct mlxsw_sp_bridge_device
 117                                   *bridge_device);
 118
 119static void
 120mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port,
 121                                 struct mlxsw_sp_bridge_port *bridge_port,
 122                                 bool add);
 123
 124static struct mlxsw_sp_bridge_device *
 125mlxsw_sp_bridge_device_find(const struct mlxsw_sp_bridge *bridge,
 126                            const struct net_device *br_dev)
 127{
 128        struct mlxsw_sp_bridge_device *bridge_device;
 129
 130        list_for_each_entry(bridge_device, &bridge->bridges_list, list)
 131                if (bridge_device->dev == br_dev)
 132                        return bridge_device;
 133
 134        return NULL;
 135}
 136
 137bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
 138                                         const struct net_device *br_dev)
 139{
 140        return !!mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
 141}
 142
 143static int mlxsw_sp_bridge_device_upper_rif_destroy(struct net_device *dev,
 144                                                    struct netdev_nested_priv *priv)
 145{
 146        struct mlxsw_sp *mlxsw_sp = priv->data;
 147
 148        mlxsw_sp_rif_destroy_by_dev(mlxsw_sp, dev);
 149        return 0;
 150}
 151
 152static void mlxsw_sp_bridge_device_rifs_destroy(struct mlxsw_sp *mlxsw_sp,
 153                                                struct net_device *dev)
 154{
 155        struct netdev_nested_priv priv = {
 156                .data = (void *)mlxsw_sp,
 157        };
 158
 159        mlxsw_sp_rif_destroy_by_dev(mlxsw_sp, dev);
 160        netdev_walk_all_upper_dev_rcu(dev,
 161                                      mlxsw_sp_bridge_device_upper_rif_destroy,
 162                                      &priv);
 163}
 164
 165static int mlxsw_sp_bridge_device_vxlan_init(struct mlxsw_sp_bridge *bridge,
 166                                             struct net_device *br_dev,
 167                                             struct netlink_ext_ack *extack)
 168{
 169        struct net_device *dev, *stop_dev;
 170        struct list_head *iter;
 171        int err;
 172
 173        netdev_for_each_lower_dev(br_dev, dev, iter) {
 174                if (netif_is_vxlan(dev) && netif_running(dev)) {
 175                        err = mlxsw_sp_bridge_vxlan_join(bridge->mlxsw_sp,
 176                                                         br_dev, dev, 0,
 177                                                         extack);
 178                        if (err) {
 179                                stop_dev = dev;
 180                                goto err_vxlan_join;
 181                        }
 182                }
 183        }
 184
 185        return 0;
 186
 187err_vxlan_join:
 188        netdev_for_each_lower_dev(br_dev, dev, iter) {
 189                if (netif_is_vxlan(dev) && netif_running(dev)) {
 190                        if (stop_dev == dev)
 191                                break;
 192                        mlxsw_sp_bridge_vxlan_leave(bridge->mlxsw_sp, dev);
 193                }
 194        }
 195        return err;
 196}
 197
 198static void mlxsw_sp_bridge_device_vxlan_fini(struct mlxsw_sp_bridge *bridge,
 199                                              struct net_device *br_dev)
 200{
 201        struct net_device *dev;
 202        struct list_head *iter;
 203
 204        netdev_for_each_lower_dev(br_dev, dev, iter) {
 205                if (netif_is_vxlan(dev) && netif_running(dev))
 206                        mlxsw_sp_bridge_vxlan_leave(bridge->mlxsw_sp, dev);
 207        }
 208}
 209
 210static struct mlxsw_sp_bridge_device *
 211mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge *bridge,
 212                              struct net_device *br_dev,
 213                              struct netlink_ext_ack *extack)
 214{
 215        struct device *dev = bridge->mlxsw_sp->bus_info->dev;
 216        struct mlxsw_sp_bridge_device *bridge_device;
 217        bool vlan_enabled = br_vlan_enabled(br_dev);
 218        int err;
 219
 220        if (vlan_enabled && bridge->vlan_enabled_exists) {
 221                dev_err(dev, "Only one VLAN-aware bridge is supported\n");
 222                NL_SET_ERR_MSG_MOD(extack, "Only one VLAN-aware bridge is supported");
 223                return ERR_PTR(-EINVAL);
 224        }
 225
 226        bridge_device = kzalloc(sizeof(*bridge_device), GFP_KERNEL);
 227        if (!bridge_device)
 228                return ERR_PTR(-ENOMEM);
 229
 230        bridge_device->dev = br_dev;
 231        bridge_device->vlan_enabled = vlan_enabled;
 232        bridge_device->multicast_enabled = br_multicast_enabled(br_dev);
 233        bridge_device->mrouter = br_multicast_router(br_dev);
 234        INIT_LIST_HEAD(&bridge_device->ports_list);
 235        if (vlan_enabled) {
 236                u16 proto;
 237
 238                bridge->vlan_enabled_exists = true;
 239                br_vlan_get_proto(br_dev, &proto);
 240                if (proto == ETH_P_8021AD)
 241                        bridge_device->ops = bridge->bridge_8021ad_ops;
 242                else
 243                        bridge_device->ops = bridge->bridge_8021q_ops;
 244        } else {
 245                bridge_device->ops = bridge->bridge_8021d_ops;
 246        }
 247        INIT_LIST_HEAD(&bridge_device->mids_list);
 248        list_add(&bridge_device->list, &bridge->bridges_list);
 249
 250        /* It is possible we already have VXLAN devices enslaved to the bridge.
 251         * In which case, we need to replay their configuration as if they were
 252         * just now enslaved to the bridge.
 253         */
 254        err = mlxsw_sp_bridge_device_vxlan_init(bridge, br_dev, extack);
 255        if (err)
 256                goto err_vxlan_init;
 257
 258        return bridge_device;
 259
 260err_vxlan_init:
 261        list_del(&bridge_device->list);
 262        if (bridge_device->vlan_enabled)
 263                bridge->vlan_enabled_exists = false;
 264        kfree(bridge_device);
 265        return ERR_PTR(err);
 266}
 267
 268static void
 269mlxsw_sp_bridge_device_destroy(struct mlxsw_sp_bridge *bridge,
 270                               struct mlxsw_sp_bridge_device *bridge_device)
 271{
 272        mlxsw_sp_bridge_device_vxlan_fini(bridge, bridge_device->dev);
 273        mlxsw_sp_bridge_device_rifs_destroy(bridge->mlxsw_sp,
 274                                            bridge_device->dev);
 275        list_del(&bridge_device->list);
 276        if (bridge_device->vlan_enabled)
 277                bridge->vlan_enabled_exists = false;
 278        WARN_ON(!list_empty(&bridge_device->ports_list));
 279        WARN_ON(!list_empty(&bridge_device->mids_list));
 280        kfree(bridge_device);
 281}
 282
 283static struct mlxsw_sp_bridge_device *
 284mlxsw_sp_bridge_device_get(struct mlxsw_sp_bridge *bridge,
 285                           struct net_device *br_dev,
 286                           struct netlink_ext_ack *extack)
 287{
 288        struct mlxsw_sp_bridge_device *bridge_device;
 289
 290        bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
 291        if (bridge_device)
 292                return bridge_device;
 293
 294        return mlxsw_sp_bridge_device_create(bridge, br_dev, extack);
 295}
 296
 297static void
 298mlxsw_sp_bridge_device_put(struct mlxsw_sp_bridge *bridge,
 299                           struct mlxsw_sp_bridge_device *bridge_device)
 300{
 301        if (list_empty(&bridge_device->ports_list))
 302                mlxsw_sp_bridge_device_destroy(bridge, bridge_device);
 303}
 304
 305static struct mlxsw_sp_bridge_port *
 306__mlxsw_sp_bridge_port_find(const struct mlxsw_sp_bridge_device *bridge_device,
 307                            const struct net_device *brport_dev)
 308{
 309        struct mlxsw_sp_bridge_port *bridge_port;
 310
 311        list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
 312                if (bridge_port->dev == brport_dev)
 313                        return bridge_port;
 314        }
 315
 316        return NULL;
 317}
 318
 319struct mlxsw_sp_bridge_port *
 320mlxsw_sp_bridge_port_find(struct mlxsw_sp_bridge *bridge,
 321                          struct net_device *brport_dev)
 322{
 323        struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
 324        struct mlxsw_sp_bridge_device *bridge_device;
 325
 326        if (!br_dev)
 327                return NULL;
 328
 329        bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
 330        if (!bridge_device)
 331                return NULL;
 332
 333        return __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
 334}
 335
 336static struct mlxsw_sp_bridge_port *
 337mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device *bridge_device,
 338                            struct net_device *brport_dev,
 339                            struct netlink_ext_ack *extack)
 340{
 341        struct mlxsw_sp_bridge_port *bridge_port;
 342        struct mlxsw_sp_port *mlxsw_sp_port;
 343        int err;
 344
 345        bridge_port = kzalloc(sizeof(*bridge_port), GFP_KERNEL);
 346        if (!bridge_port)
 347                return ERR_PTR(-ENOMEM);
 348
 349        mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(brport_dev);
 350        bridge_port->lagged = mlxsw_sp_port->lagged;
 351        if (bridge_port->lagged)
 352                bridge_port->lag_id = mlxsw_sp_port->lag_id;
 353        else
 354                bridge_port->system_port = mlxsw_sp_port->local_port;
 355        bridge_port->dev = brport_dev;
 356        bridge_port->bridge_device = bridge_device;
 357        bridge_port->stp_state = BR_STATE_DISABLED;
 358        bridge_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC |
 359                             BR_MCAST_FLOOD;
 360        INIT_LIST_HEAD(&bridge_port->vlans_list);
 361        list_add(&bridge_port->list, &bridge_device->ports_list);
 362        bridge_port->ref_count = 1;
 363
 364        err = switchdev_bridge_port_offload(brport_dev, mlxsw_sp_port->dev,
 365                                            NULL, NULL, NULL, false, extack);
 366        if (err)
 367                goto err_switchdev_offload;
 368
 369        return bridge_port;
 370
 371err_switchdev_offload:
 372        list_del(&bridge_port->list);
 373        kfree(bridge_port);
 374        return ERR_PTR(err);
 375}
 376
 377static void
 378mlxsw_sp_bridge_port_destroy(struct mlxsw_sp_bridge_port *bridge_port)
 379{
 380        switchdev_bridge_port_unoffload(bridge_port->dev, NULL, NULL, NULL);
 381        list_del(&bridge_port->list);
 382        WARN_ON(!list_empty(&bridge_port->vlans_list));
 383        kfree(bridge_port);
 384}
 385
 386static struct mlxsw_sp_bridge_port *
 387mlxsw_sp_bridge_port_get(struct mlxsw_sp_bridge *bridge,
 388                         struct net_device *brport_dev,
 389                         struct netlink_ext_ack *extack)
 390{
 391        struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
 392        struct mlxsw_sp_bridge_device *bridge_device;
 393        struct mlxsw_sp_bridge_port *bridge_port;
 394        int err;
 395
 396        bridge_port = mlxsw_sp_bridge_port_find(bridge, brport_dev);
 397        if (bridge_port) {
 398                bridge_port->ref_count++;
 399                return bridge_port;
 400        }
 401
 402        bridge_device = mlxsw_sp_bridge_device_get(bridge, br_dev, extack);
 403        if (IS_ERR(bridge_device))
 404                return ERR_CAST(bridge_device);
 405
 406        bridge_port = mlxsw_sp_bridge_port_create(bridge_device, brport_dev,
 407                                                  extack);
 408        if (IS_ERR(bridge_port)) {
 409                err = PTR_ERR(bridge_port);
 410                goto err_bridge_port_create;
 411        }
 412
 413        return bridge_port;
 414
 415err_bridge_port_create:
 416        mlxsw_sp_bridge_device_put(bridge, bridge_device);
 417        return ERR_PTR(err);
 418}
 419
 420static void mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge *bridge,
 421                                     struct mlxsw_sp_bridge_port *bridge_port)
 422{
 423        struct mlxsw_sp_bridge_device *bridge_device;
 424
 425        if (--bridge_port->ref_count != 0)
 426                return;
 427        bridge_device = bridge_port->bridge_device;
 428        mlxsw_sp_bridge_port_destroy(bridge_port);
 429        mlxsw_sp_bridge_device_put(bridge, bridge_device);
 430}
 431
 432static struct mlxsw_sp_port_vlan *
 433mlxsw_sp_port_vlan_find_by_bridge(struct mlxsw_sp_port *mlxsw_sp_port,
 434                                  const struct mlxsw_sp_bridge_device *
 435                                  bridge_device,
 436                                  u16 vid)
 437{
 438        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 439
 440        list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
 441                            list) {
 442                if (!mlxsw_sp_port_vlan->bridge_port)
 443                        continue;
 444                if (mlxsw_sp_port_vlan->bridge_port->bridge_device !=
 445                    bridge_device)
 446                        continue;
 447                if (bridge_device->vlan_enabled &&
 448                    mlxsw_sp_port_vlan->vid != vid)
 449                        continue;
 450                return mlxsw_sp_port_vlan;
 451        }
 452
 453        return NULL;
 454}
 455
 456static struct mlxsw_sp_port_vlan*
 457mlxsw_sp_port_vlan_find_by_fid(struct mlxsw_sp_port *mlxsw_sp_port,
 458                               u16 fid_index)
 459{
 460        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 461
 462        list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
 463                            list) {
 464                struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
 465
 466                if (fid && mlxsw_sp_fid_index(fid) == fid_index)
 467                        return mlxsw_sp_port_vlan;
 468        }
 469
 470        return NULL;
 471}
 472
 473static struct mlxsw_sp_bridge_vlan *
 474mlxsw_sp_bridge_vlan_find(const struct mlxsw_sp_bridge_port *bridge_port,
 475                          u16 vid)
 476{
 477        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 478
 479        list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
 480                if (bridge_vlan->vid == vid)
 481                        return bridge_vlan;
 482        }
 483
 484        return NULL;
 485}
 486
 487static struct mlxsw_sp_bridge_vlan *
 488mlxsw_sp_bridge_vlan_create(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
 489{
 490        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 491
 492        bridge_vlan = kzalloc(sizeof(*bridge_vlan), GFP_KERNEL);
 493        if (!bridge_vlan)
 494                return NULL;
 495
 496        INIT_LIST_HEAD(&bridge_vlan->port_vlan_list);
 497        bridge_vlan->vid = vid;
 498        list_add(&bridge_vlan->list, &bridge_port->vlans_list);
 499
 500        return bridge_vlan;
 501}
 502
 503static void
 504mlxsw_sp_bridge_vlan_destroy(struct mlxsw_sp_bridge_vlan *bridge_vlan)
 505{
 506        list_del(&bridge_vlan->list);
 507        WARN_ON(!list_empty(&bridge_vlan->port_vlan_list));
 508        kfree(bridge_vlan);
 509}
 510
 511static struct mlxsw_sp_bridge_vlan *
 512mlxsw_sp_bridge_vlan_get(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
 513{
 514        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 515
 516        bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
 517        if (bridge_vlan)
 518                return bridge_vlan;
 519
 520        return mlxsw_sp_bridge_vlan_create(bridge_port, vid);
 521}
 522
 523static void mlxsw_sp_bridge_vlan_put(struct mlxsw_sp_bridge_vlan *bridge_vlan)
 524{
 525        if (list_empty(&bridge_vlan->port_vlan_list))
 526                mlxsw_sp_bridge_vlan_destroy(bridge_vlan);
 527}
 528
 529static int
 530mlxsw_sp_port_bridge_vlan_stp_set(struct mlxsw_sp_port *mlxsw_sp_port,
 531                                  struct mlxsw_sp_bridge_vlan *bridge_vlan,
 532                                  u8 state)
 533{
 534        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 535
 536        list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
 537                            bridge_vlan_node) {
 538                if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
 539                        continue;
 540                return mlxsw_sp_port_vid_stp_set(mlxsw_sp_port,
 541                                                 bridge_vlan->vid, state);
 542        }
 543
 544        return 0;
 545}
 546
 547static int mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
 548                                            struct net_device *orig_dev,
 549                                            u8 state)
 550{
 551        struct mlxsw_sp_bridge_port *bridge_port;
 552        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 553        int err;
 554
 555        /* It's possible we failed to enslave the port, yet this
 556         * operation is executed due to it being deferred.
 557         */
 558        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
 559                                                orig_dev);
 560        if (!bridge_port)
 561                return 0;
 562
 563        list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
 564                err = mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port,
 565                                                        bridge_vlan, state);
 566                if (err)
 567                        goto err_port_bridge_vlan_stp_set;
 568        }
 569
 570        bridge_port->stp_state = state;
 571
 572        return 0;
 573
 574err_port_bridge_vlan_stp_set:
 575        list_for_each_entry_continue_reverse(bridge_vlan,
 576                                             &bridge_port->vlans_list, list)
 577                mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port, bridge_vlan,
 578                                                  bridge_port->stp_state);
 579        return err;
 580}
 581
 582static int
 583mlxsw_sp_port_bridge_vlan_flood_set(struct mlxsw_sp_port *mlxsw_sp_port,
 584                                    struct mlxsw_sp_bridge_vlan *bridge_vlan,
 585                                    enum mlxsw_sp_flood_type packet_type,
 586                                    bool member)
 587{
 588        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 589
 590        list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
 591                            bridge_vlan_node) {
 592                if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
 593                        continue;
 594                return mlxsw_sp_fid_flood_set(mlxsw_sp_port_vlan->fid,
 595                                              packet_type,
 596                                              mlxsw_sp_port->local_port,
 597                                              member);
 598        }
 599
 600        return 0;
 601}
 602
 603static int
 604mlxsw_sp_bridge_port_flood_table_set(struct mlxsw_sp_port *mlxsw_sp_port,
 605                                     struct mlxsw_sp_bridge_port *bridge_port,
 606                                     enum mlxsw_sp_flood_type packet_type,
 607                                     bool member)
 608{
 609        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 610        int err;
 611
 612        list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
 613                err = mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port,
 614                                                          bridge_vlan,
 615                                                          packet_type,
 616                                                          member);
 617                if (err)
 618                        goto err_port_bridge_vlan_flood_set;
 619        }
 620
 621        return 0;
 622
 623err_port_bridge_vlan_flood_set:
 624        list_for_each_entry_continue_reverse(bridge_vlan,
 625                                             &bridge_port->vlans_list, list)
 626                mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port, bridge_vlan,
 627                                                    packet_type, !member);
 628        return err;
 629}
 630
 631static int
 632mlxsw_sp_port_bridge_vlan_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
 633                                       struct mlxsw_sp_bridge_vlan *bridge_vlan,
 634                                       bool set)
 635{
 636        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 637        u16 vid = bridge_vlan->vid;
 638
 639        list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
 640                            bridge_vlan_node) {
 641                if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
 642                        continue;
 643                return mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, set);
 644        }
 645
 646        return 0;
 647}
 648
 649static int
 650mlxsw_sp_bridge_port_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
 651                                  struct mlxsw_sp_bridge_port *bridge_port,
 652                                  bool set)
 653{
 654        struct mlxsw_sp_bridge_vlan *bridge_vlan;
 655        int err;
 656
 657        list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
 658                err = mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
 659                                                             bridge_vlan, set);
 660                if (err)
 661                        goto err_port_bridge_vlan_learning_set;
 662        }
 663
 664        return 0;
 665
 666err_port_bridge_vlan_learning_set:
 667        list_for_each_entry_continue_reverse(bridge_vlan,
 668                                             &bridge_port->vlans_list, list)
 669                mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
 670                                                       bridge_vlan, !set);
 671        return err;
 672}
 673
 674static int
 675mlxsw_sp_port_attr_br_pre_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
 676                                    struct switchdev_brport_flags flags)
 677{
 678        if (flags.mask & ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD))
 679                return -EINVAL;
 680
 681        return 0;
 682}
 683
 684static int mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
 685                                           struct net_device *orig_dev,
 686                                           struct switchdev_brport_flags flags)
 687{
 688        struct mlxsw_sp_bridge_port *bridge_port;
 689        int err;
 690
 691        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
 692                                                orig_dev);
 693        if (!bridge_port)
 694                return 0;
 695
 696        if (flags.mask & BR_FLOOD) {
 697                err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
 698                                                           bridge_port,
 699                                                           MLXSW_SP_FLOOD_TYPE_UC,
 700                                                           flags.val & BR_FLOOD);
 701                if (err)
 702                        return err;
 703        }
 704
 705        if (flags.mask & BR_LEARNING) {
 706                err = mlxsw_sp_bridge_port_learning_set(mlxsw_sp_port,
 707                                                        bridge_port,
 708                                                        flags.val & BR_LEARNING);
 709                if (err)
 710                        return err;
 711        }
 712
 713        if (bridge_port->bridge_device->multicast_enabled)
 714                goto out;
 715
 716        if (flags.mask & BR_MCAST_FLOOD) {
 717                err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
 718                                                           bridge_port,
 719                                                           MLXSW_SP_FLOOD_TYPE_MC,
 720                                                           flags.val & BR_MCAST_FLOOD);
 721                if (err)
 722                        return err;
 723        }
 724
 725out:
 726        memcpy(&bridge_port->flags, &flags.val, sizeof(flags.val));
 727        return 0;
 728}
 729
 730static int mlxsw_sp_ageing_set(struct mlxsw_sp *mlxsw_sp, u32 ageing_time)
 731{
 732        char sfdat_pl[MLXSW_REG_SFDAT_LEN];
 733        int err;
 734
 735        mlxsw_reg_sfdat_pack(sfdat_pl, ageing_time);
 736        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdat), sfdat_pl);
 737        if (err)
 738                return err;
 739        mlxsw_sp->bridge->ageing_time = ageing_time;
 740        return 0;
 741}
 742
 743static int mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port *mlxsw_sp_port,
 744                                            unsigned long ageing_clock_t)
 745{
 746        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 747        unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
 748        u32 ageing_time = jiffies_to_msecs(ageing_jiffies) / 1000;
 749
 750        if (ageing_time < MLXSW_SP_MIN_AGEING_TIME ||
 751            ageing_time > MLXSW_SP_MAX_AGEING_TIME)
 752                return -ERANGE;
 753
 754        return mlxsw_sp_ageing_set(mlxsw_sp, ageing_time);
 755}
 756
 757static int mlxsw_sp_port_attr_br_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port,
 758                                          struct net_device *orig_dev,
 759                                          bool vlan_enabled)
 760{
 761        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 762        struct mlxsw_sp_bridge_device *bridge_device;
 763
 764        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
 765        if (WARN_ON(!bridge_device))
 766                return -EINVAL;
 767
 768        if (bridge_device->vlan_enabled == vlan_enabled)
 769                return 0;
 770
 771        netdev_err(bridge_device->dev, "VLAN filtering can't be changed for existing bridge\n");
 772        return -EINVAL;
 773}
 774
 775static int mlxsw_sp_port_attr_br_vlan_proto_set(struct mlxsw_sp_port *mlxsw_sp_port,
 776                                                struct net_device *orig_dev,
 777                                                u16 vlan_proto)
 778{
 779        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 780        struct mlxsw_sp_bridge_device *bridge_device;
 781
 782        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
 783        if (WARN_ON(!bridge_device))
 784                return -EINVAL;
 785
 786        netdev_err(bridge_device->dev, "VLAN protocol can't be changed on existing bridge\n");
 787        return -EINVAL;
 788}
 789
 790static int mlxsw_sp_port_attr_mrouter_set(struct mlxsw_sp_port *mlxsw_sp_port,
 791                                          struct net_device *orig_dev,
 792                                          bool is_port_mrouter)
 793{
 794        struct mlxsw_sp_bridge_port *bridge_port;
 795        int err;
 796
 797        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
 798                                                orig_dev);
 799        if (!bridge_port)
 800                return 0;
 801
 802        if (!bridge_port->bridge_device->multicast_enabled)
 803                goto out;
 804
 805        err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
 806                                                   MLXSW_SP_FLOOD_TYPE_MC,
 807                                                   is_port_mrouter);
 808        if (err)
 809                return err;
 810
 811        mlxsw_sp_port_mrouter_update_mdb(mlxsw_sp_port, bridge_port,
 812                                         is_port_mrouter);
 813out:
 814        bridge_port->mrouter = is_port_mrouter;
 815        return 0;
 816}
 817
 818static bool mlxsw_sp_mc_flood(const struct mlxsw_sp_bridge_port *bridge_port)
 819{
 820        const struct mlxsw_sp_bridge_device *bridge_device;
 821
 822        bridge_device = bridge_port->bridge_device;
 823        return bridge_device->multicast_enabled ? bridge_port->mrouter :
 824                                        bridge_port->flags & BR_MCAST_FLOOD;
 825}
 826
 827static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port,
 828                                         struct net_device *orig_dev,
 829                                         bool mc_disabled)
 830{
 831        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 832        struct mlxsw_sp_bridge_device *bridge_device;
 833        struct mlxsw_sp_bridge_port *bridge_port;
 834        int err;
 835
 836        /* It's possible we failed to enslave the port, yet this
 837         * operation is executed due to it being deferred.
 838         */
 839        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
 840        if (!bridge_device)
 841                return 0;
 842
 843        if (bridge_device->multicast_enabled != !mc_disabled) {
 844                bridge_device->multicast_enabled = !mc_disabled;
 845                mlxsw_sp_bridge_mdb_mc_enable_sync(mlxsw_sp_port,
 846                                                   bridge_device);
 847        }
 848
 849        list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
 850                enum mlxsw_sp_flood_type packet_type = MLXSW_SP_FLOOD_TYPE_MC;
 851                bool member = mlxsw_sp_mc_flood(bridge_port);
 852
 853                err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
 854                                                           bridge_port,
 855                                                           packet_type, member);
 856                if (err)
 857                        return err;
 858        }
 859
 860        bridge_device->multicast_enabled = !mc_disabled;
 861
 862        return 0;
 863}
 864
 865static int mlxsw_sp_smid_router_port_set(struct mlxsw_sp *mlxsw_sp,
 866                                         u16 mid_idx, bool add)
 867{
 868        char *smid_pl;
 869        int err;
 870
 871        smid_pl = kmalloc(MLXSW_REG_SMID_LEN, GFP_KERNEL);
 872        if (!smid_pl)
 873                return -ENOMEM;
 874
 875        mlxsw_reg_smid_pack(smid_pl, mid_idx,
 876                            mlxsw_sp_router_port(mlxsw_sp), add);
 877        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(smid), smid_pl);
 878        kfree(smid_pl);
 879        return err;
 880}
 881
 882static void
 883mlxsw_sp_bridge_mrouter_update_mdb(struct mlxsw_sp *mlxsw_sp,
 884                                   struct mlxsw_sp_bridge_device *bridge_device,
 885                                   bool add)
 886{
 887        struct mlxsw_sp_mid *mid;
 888
 889        list_for_each_entry(mid, &bridge_device->mids_list, list)
 890                mlxsw_sp_smid_router_port_set(mlxsw_sp, mid->mid, add);
 891}
 892
 893static int
 894mlxsw_sp_port_attr_br_mrouter_set(struct mlxsw_sp_port *mlxsw_sp_port,
 895                                  struct net_device *orig_dev,
 896                                  bool is_mrouter)
 897{
 898        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 899        struct mlxsw_sp_bridge_device *bridge_device;
 900
 901        /* It's possible we failed to enslave the port, yet this
 902         * operation is executed due to it being deferred.
 903         */
 904        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
 905        if (!bridge_device)
 906                return 0;
 907
 908        if (bridge_device->mrouter != is_mrouter)
 909                mlxsw_sp_bridge_mrouter_update_mdb(mlxsw_sp, bridge_device,
 910                                                   is_mrouter);
 911        bridge_device->mrouter = is_mrouter;
 912        return 0;
 913}
 914
 915static int mlxsw_sp_port_attr_set(struct net_device *dev, const void *ctx,
 916                                  const struct switchdev_attr *attr,
 917                                  struct netlink_ext_ack *extack)
 918{
 919        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
 920        int err;
 921
 922        switch (attr->id) {
 923        case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
 924                err = mlxsw_sp_port_attr_stp_state_set(mlxsw_sp_port,
 925                                                       attr->orig_dev,
 926                                                       attr->u.stp_state);
 927                break;
 928        case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
 929                err = mlxsw_sp_port_attr_br_pre_flags_set(mlxsw_sp_port,
 930                                                          attr->u.brport_flags);
 931                break;
 932        case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
 933                err = mlxsw_sp_port_attr_br_flags_set(mlxsw_sp_port,
 934                                                      attr->orig_dev,
 935                                                      attr->u.brport_flags);
 936                break;
 937        case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
 938                err = mlxsw_sp_port_attr_br_ageing_set(mlxsw_sp_port,
 939                                                       attr->u.ageing_time);
 940                break;
 941        case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
 942                err = mlxsw_sp_port_attr_br_vlan_set(mlxsw_sp_port,
 943                                                     attr->orig_dev,
 944                                                     attr->u.vlan_filtering);
 945                break;
 946        case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL:
 947                err = mlxsw_sp_port_attr_br_vlan_proto_set(mlxsw_sp_port,
 948                                                           attr->orig_dev,
 949                                                           attr->u.vlan_protocol);
 950                break;
 951        case SWITCHDEV_ATTR_ID_PORT_MROUTER:
 952                err = mlxsw_sp_port_attr_mrouter_set(mlxsw_sp_port,
 953                                                     attr->orig_dev,
 954                                                     attr->u.mrouter);
 955                break;
 956        case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
 957                err = mlxsw_sp_port_mc_disabled_set(mlxsw_sp_port,
 958                                                    attr->orig_dev,
 959                                                    attr->u.mc_disabled);
 960                break;
 961        case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER:
 962                err = mlxsw_sp_port_attr_br_mrouter_set(mlxsw_sp_port,
 963                                                        attr->orig_dev,
 964                                                        attr->u.mrouter);
 965                break;
 966        default:
 967                err = -EOPNOTSUPP;
 968                break;
 969        }
 970
 971        mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
 972
 973        return err;
 974}
 975
 976static int
 977mlxsw_sp_port_vlan_fid_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
 978                            struct mlxsw_sp_bridge_port *bridge_port,
 979                            struct netlink_ext_ack *extack)
 980{
 981        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
 982        struct mlxsw_sp_bridge_device *bridge_device;
 983        u8 local_port = mlxsw_sp_port->local_port;
 984        u16 vid = mlxsw_sp_port_vlan->vid;
 985        struct mlxsw_sp_fid *fid;
 986        int err;
 987
 988        bridge_device = bridge_port->bridge_device;
 989        fid = bridge_device->ops->fid_get(bridge_device, vid, extack);
 990        if (IS_ERR(fid))
 991                return PTR_ERR(fid);
 992
 993        err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port,
 994                                     bridge_port->flags & BR_FLOOD);
 995        if (err)
 996                goto err_fid_uc_flood_set;
 997
 998        err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port,
 999                                     mlxsw_sp_mc_flood(bridge_port));
1000        if (err)
1001                goto err_fid_mc_flood_set;
1002
1003        err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port,
1004                                     true);
1005        if (err)
1006                goto err_fid_bc_flood_set;
1007
1008        err = mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port, vid);
1009        if (err)
1010                goto err_fid_port_vid_map;
1011
1012        mlxsw_sp_port_vlan->fid = fid;
1013
1014        return 0;
1015
1016err_fid_port_vid_map:
1017        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
1018err_fid_bc_flood_set:
1019        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
1020err_fid_mc_flood_set:
1021        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
1022err_fid_uc_flood_set:
1023        mlxsw_sp_fid_put(fid);
1024        return err;
1025}
1026
1027static void
1028mlxsw_sp_port_vlan_fid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
1029{
1030        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1031        struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1032        u8 local_port = mlxsw_sp_port->local_port;
1033        u16 vid = mlxsw_sp_port_vlan->vid;
1034
1035        mlxsw_sp_port_vlan->fid = NULL;
1036        mlxsw_sp_fid_port_vid_unmap(fid, mlxsw_sp_port, vid);
1037        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
1038        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
1039        mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
1040        mlxsw_sp_fid_put(fid);
1041}
1042
1043static u16
1044mlxsw_sp_port_pvid_determine(const struct mlxsw_sp_port *mlxsw_sp_port,
1045                             u16 vid, bool is_pvid)
1046{
1047        if (is_pvid)
1048                return vid;
1049        else if (mlxsw_sp_port->pvid == vid)
1050                return 0;       /* Dis-allow untagged packets */
1051        else
1052                return mlxsw_sp_port->pvid;
1053}
1054
1055static int
1056mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
1057                               struct mlxsw_sp_bridge_port *bridge_port,
1058                               struct netlink_ext_ack *extack)
1059{
1060        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1061        struct mlxsw_sp_bridge_vlan *bridge_vlan;
1062        u16 vid = mlxsw_sp_port_vlan->vid;
1063        int err;
1064
1065        /* No need to continue if only VLAN flags were changed */
1066        if (mlxsw_sp_port_vlan->bridge_port)
1067                return 0;
1068
1069        err = mlxsw_sp_port_vlan_fid_join(mlxsw_sp_port_vlan, bridge_port,
1070                                          extack);
1071        if (err)
1072                return err;
1073
1074        err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid,
1075                                             bridge_port->flags & BR_LEARNING);
1076        if (err)
1077                goto err_port_vid_learning_set;
1078
1079        err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid,
1080                                        bridge_port->stp_state);
1081        if (err)
1082                goto err_port_vid_stp_set;
1083
1084        bridge_vlan = mlxsw_sp_bridge_vlan_get(bridge_port, vid);
1085        if (!bridge_vlan) {
1086                err = -ENOMEM;
1087                goto err_bridge_vlan_get;
1088        }
1089
1090        list_add(&mlxsw_sp_port_vlan->bridge_vlan_node,
1091                 &bridge_vlan->port_vlan_list);
1092
1093        mlxsw_sp_bridge_port_get(mlxsw_sp_port->mlxsw_sp->bridge,
1094                                 bridge_port->dev, extack);
1095        mlxsw_sp_port_vlan->bridge_port = bridge_port;
1096
1097        return 0;
1098
1099err_bridge_vlan_get:
1100        mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
1101err_port_vid_stp_set:
1102        mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
1103err_port_vid_learning_set:
1104        mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
1105        return err;
1106}
1107
1108void
1109mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
1110{
1111        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1112        struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1113        struct mlxsw_sp_bridge_vlan *bridge_vlan;
1114        struct mlxsw_sp_bridge_port *bridge_port;
1115        u16 vid = mlxsw_sp_port_vlan->vid;
1116        bool last_port, last_vlan;
1117
1118        if (WARN_ON(mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021Q &&
1119                    mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021D))
1120                return;
1121
1122        bridge_port = mlxsw_sp_port_vlan->bridge_port;
1123        last_vlan = list_is_singular(&bridge_port->vlans_list);
1124        bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
1125        last_port = list_is_singular(&bridge_vlan->port_vlan_list);
1126
1127        list_del(&mlxsw_sp_port_vlan->bridge_vlan_node);
1128        mlxsw_sp_bridge_vlan_put(bridge_vlan);
1129        mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
1130        mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
1131        if (last_port)
1132                mlxsw_sp_bridge_port_fdb_flush(mlxsw_sp_port->mlxsw_sp,
1133                                               bridge_port,
1134                                               mlxsw_sp_fid_index(fid));
1135        if (last_vlan)
1136                mlxsw_sp_bridge_port_mdb_flush(mlxsw_sp_port, bridge_port);
1137
1138        mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
1139
1140        mlxsw_sp_bridge_port_put(mlxsw_sp_port->mlxsw_sp->bridge, bridge_port);
1141        mlxsw_sp_port_vlan->bridge_port = NULL;
1142}
1143
1144static int
1145mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port,
1146                              struct mlxsw_sp_bridge_port *bridge_port,
1147                              u16 vid, bool is_untagged, bool is_pvid,
1148                              struct netlink_ext_ack *extack)
1149{
1150        u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid);
1151        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1152        u16 old_pvid = mlxsw_sp_port->pvid;
1153        u16 proto;
1154        int err;
1155
1156        /* The only valid scenario in which a port-vlan already exists, is if
1157         * the VLAN flags were changed and the port-vlan is associated with the
1158         * correct bridge port
1159         */
1160        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1161        if (mlxsw_sp_port_vlan &&
1162            mlxsw_sp_port_vlan->bridge_port != bridge_port)
1163                return -EEXIST;
1164
1165        if (!mlxsw_sp_port_vlan) {
1166                mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_create(mlxsw_sp_port,
1167                                                               vid);
1168                if (IS_ERR(mlxsw_sp_port_vlan))
1169                        return PTR_ERR(mlxsw_sp_port_vlan);
1170        }
1171
1172        err = mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, true,
1173                                     is_untagged);
1174        if (err)
1175                goto err_port_vlan_set;
1176
1177        br_vlan_get_proto(bridge_port->bridge_device->dev, &proto);
1178        err = mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid, proto);
1179        if (err)
1180                goto err_port_pvid_set;
1181
1182        err = mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port,
1183                                             extack);
1184        if (err)
1185                goto err_port_vlan_bridge_join;
1186
1187        return 0;
1188
1189err_port_vlan_bridge_join:
1190        mlxsw_sp_port_pvid_set(mlxsw_sp_port, old_pvid, proto);
1191err_port_pvid_set:
1192        mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1193err_port_vlan_set:
1194        mlxsw_sp_port_vlan_destroy(mlxsw_sp_port_vlan);
1195        return err;
1196}
1197
1198static int
1199mlxsw_sp_br_ban_rif_pvid_change(struct mlxsw_sp *mlxsw_sp,
1200                                const struct net_device *br_dev,
1201                                const struct switchdev_obj_port_vlan *vlan)
1202{
1203        u16 pvid;
1204
1205        pvid = mlxsw_sp_rif_vid(mlxsw_sp, br_dev);
1206        if (!pvid)
1207                return 0;
1208
1209        if (vlan->flags & BRIDGE_VLAN_INFO_PVID) {
1210                if (vlan->vid != pvid) {
1211                        netdev_err(br_dev, "Can't change PVID, it's used by router interface\n");
1212                        return -EBUSY;
1213                }
1214        } else {
1215                if (vlan->vid == pvid) {
1216                        netdev_err(br_dev, "Can't remove PVID, it's used by router interface\n");
1217                        return -EBUSY;
1218                }
1219        }
1220
1221        return 0;
1222}
1223
1224static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
1225                                   const struct switchdev_obj_port_vlan *vlan,
1226                                   struct netlink_ext_ack *extack)
1227{
1228        bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1229        bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1230        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1231        struct net_device *orig_dev = vlan->obj.orig_dev;
1232        struct mlxsw_sp_bridge_port *bridge_port;
1233
1234        if (netif_is_bridge_master(orig_dev)) {
1235                int err = 0;
1236
1237                if ((vlan->flags & BRIDGE_VLAN_INFO_BRENTRY) &&
1238                    br_vlan_enabled(orig_dev))
1239                        err = mlxsw_sp_br_ban_rif_pvid_change(mlxsw_sp,
1240                                                              orig_dev, vlan);
1241                if (!err)
1242                        err = -EOPNOTSUPP;
1243                return err;
1244        }
1245
1246        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1247        if (WARN_ON(!bridge_port))
1248                return -EINVAL;
1249
1250        if (!bridge_port->bridge_device->vlan_enabled)
1251                return 0;
1252
1253        return mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port,
1254                                             vlan->vid, flag_untagged,
1255                                             flag_pvid, extack);
1256}
1257
1258static enum mlxsw_reg_sfdf_flush_type mlxsw_sp_fdb_flush_type(bool lagged)
1259{
1260        return lagged ? MLXSW_REG_SFDF_FLUSH_PER_LAG_AND_FID :
1261                        MLXSW_REG_SFDF_FLUSH_PER_PORT_AND_FID;
1262}
1263
1264static int
1265mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
1266                               struct mlxsw_sp_bridge_port *bridge_port,
1267                               u16 fid_index)
1268{
1269        bool lagged = bridge_port->lagged;
1270        char sfdf_pl[MLXSW_REG_SFDF_LEN];
1271        u16 system_port;
1272
1273        system_port = lagged ? bridge_port->lag_id : bridge_port->system_port;
1274        mlxsw_reg_sfdf_pack(sfdf_pl, mlxsw_sp_fdb_flush_type(lagged));
1275        mlxsw_reg_sfdf_fid_set(sfdf_pl, fid_index);
1276        mlxsw_reg_sfdf_port_fid_system_port_set(sfdf_pl, system_port);
1277
1278        return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdf), sfdf_pl);
1279}
1280
1281static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
1282{
1283        return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
1284                         MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_MLAG;
1285}
1286
1287static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
1288{
1289        return adding ? MLXSW_REG_SFD_OP_WRITE_EDIT :
1290                        MLXSW_REG_SFD_OP_WRITE_REMOVE;
1291}
1292
1293static int mlxsw_sp_port_fdb_tunnel_uc_op(struct mlxsw_sp *mlxsw_sp,
1294                                          const char *mac, u16 fid,
1295                                          enum mlxsw_sp_l3proto proto,
1296                                          const union mlxsw_sp_l3addr *addr,
1297                                          bool adding, bool dynamic)
1298{
1299        enum mlxsw_reg_sfd_uc_tunnel_protocol sfd_proto;
1300        char *sfd_pl;
1301        u8 num_rec;
1302        u32 uip;
1303        int err;
1304
1305        switch (proto) {
1306        case MLXSW_SP_L3_PROTO_IPV4:
1307                uip = be32_to_cpu(addr->addr4);
1308                sfd_proto = MLXSW_REG_SFD_UC_TUNNEL_PROTOCOL_IPV4;
1309                break;
1310        case MLXSW_SP_L3_PROTO_IPV6:
1311        default:
1312                WARN_ON(1);
1313                return -EOPNOTSUPP;
1314        }
1315
1316        sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1317        if (!sfd_pl)
1318                return -ENOMEM;
1319
1320        mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1321        mlxsw_reg_sfd_uc_tunnel_pack(sfd_pl, 0,
1322                                     mlxsw_sp_sfd_rec_policy(dynamic), mac, fid,
1323                                     MLXSW_REG_SFD_REC_ACTION_NOP, uip,
1324                                     sfd_proto);
1325        num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1326        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1327        if (err)
1328                goto out;
1329
1330        if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1331                err = -EBUSY;
1332
1333out:
1334        kfree(sfd_pl);
1335        return err;
1336}
1337
1338static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1339                                     const char *mac, u16 fid, bool adding,
1340                                     enum mlxsw_reg_sfd_rec_action action,
1341                                     enum mlxsw_reg_sfd_rec_policy policy)
1342{
1343        char *sfd_pl;
1344        u8 num_rec;
1345        int err;
1346
1347        sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1348        if (!sfd_pl)
1349                return -ENOMEM;
1350
1351        mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1352        mlxsw_reg_sfd_uc_pack(sfd_pl, 0, policy, mac, fid, action, local_port);
1353        num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1354        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1355        if (err)
1356                goto out;
1357
1358        if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1359                err = -EBUSY;
1360
1361out:
1362        kfree(sfd_pl);
1363        return err;
1364}
1365
1366static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
1367                                   const char *mac, u16 fid, bool adding,
1368                                   bool dynamic)
1369{
1370        return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, adding,
1371                                         MLXSW_REG_SFD_REC_ACTION_NOP,
1372                                         mlxsw_sp_sfd_rec_policy(dynamic));
1373}
1374
1375int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
1376                        bool adding)
1377{
1378        return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, adding,
1379                                         MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
1380                                         MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY);
1381}
1382
1383static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,
1384                                       const char *mac, u16 fid, u16 lag_vid,
1385                                       bool adding, bool dynamic)
1386{
1387        char *sfd_pl;
1388        u8 num_rec;
1389        int err;
1390
1391        sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1392        if (!sfd_pl)
1393                return -ENOMEM;
1394
1395        mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1396        mlxsw_reg_sfd_uc_lag_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1397                                  mac, fid, MLXSW_REG_SFD_REC_ACTION_NOP,
1398                                  lag_vid, lag_id);
1399        num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1400        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1401        if (err)
1402                goto out;
1403
1404        if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1405                err = -EBUSY;
1406
1407out:
1408        kfree(sfd_pl);
1409        return err;
1410}
1411
1412static int
1413mlxsw_sp_port_fdb_set(struct mlxsw_sp_port *mlxsw_sp_port,
1414                      struct switchdev_notifier_fdb_info *fdb_info, bool adding)
1415{
1416        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1417        struct net_device *orig_dev = fdb_info->info.dev;
1418        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1419        struct mlxsw_sp_bridge_device *bridge_device;
1420        struct mlxsw_sp_bridge_port *bridge_port;
1421        u16 fid_index, vid;
1422
1423        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1424        if (!bridge_port)
1425                return -EINVAL;
1426
1427        bridge_device = bridge_port->bridge_device;
1428        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1429                                                               bridge_device,
1430                                                               fdb_info->vid);
1431        if (!mlxsw_sp_port_vlan)
1432                return 0;
1433
1434        fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1435        vid = mlxsw_sp_port_vlan->vid;
1436
1437        if (!bridge_port->lagged)
1438                return mlxsw_sp_port_fdb_uc_op(mlxsw_sp,
1439                                               bridge_port->system_port,
1440                                               fdb_info->addr, fid_index,
1441                                               adding, false);
1442        else
1443                return mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp,
1444                                                   bridge_port->lag_id,
1445                                                   fdb_info->addr, fid_index,
1446                                                   vid, adding, false);
1447}
1448
1449static int mlxsw_sp_port_mdb_op(struct mlxsw_sp *mlxsw_sp, const char *addr,
1450                                u16 fid, u16 mid_idx, bool adding)
1451{
1452        char *sfd_pl;
1453        u8 num_rec;
1454        int err;
1455
1456        sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1457        if (!sfd_pl)
1458                return -ENOMEM;
1459
1460        mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1461        mlxsw_reg_sfd_mc_pack(sfd_pl, 0, addr, fid,
1462                              MLXSW_REG_SFD_REC_ACTION_NOP, mid_idx);
1463        num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1464        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1465        if (err)
1466                goto out;
1467
1468        if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1469                err = -EBUSY;
1470
1471out:
1472        kfree(sfd_pl);
1473        return err;
1474}
1475
1476static int mlxsw_sp_port_smid_full_entry(struct mlxsw_sp *mlxsw_sp, u16 mid_idx,
1477                                         long *ports_bitmap,
1478                                         bool set_router_port)
1479{
1480        char *smid_pl;
1481        int err, i;
1482
1483        smid_pl = kmalloc(MLXSW_REG_SMID_LEN, GFP_KERNEL);
1484        if (!smid_pl)
1485                return -ENOMEM;
1486
1487        mlxsw_reg_smid_pack(smid_pl, mid_idx, 0, false);
1488        for (i = 1; i < mlxsw_core_max_ports(mlxsw_sp->core); i++) {
1489                if (mlxsw_sp->ports[i])
1490                        mlxsw_reg_smid_port_mask_set(smid_pl, i, 1);
1491        }
1492
1493        mlxsw_reg_smid_port_mask_set(smid_pl,
1494                                     mlxsw_sp_router_port(mlxsw_sp), 1);
1495
1496        for_each_set_bit(i, ports_bitmap, mlxsw_core_max_ports(mlxsw_sp->core))
1497                mlxsw_reg_smid_port_set(smid_pl, i, 1);
1498
1499        mlxsw_reg_smid_port_set(smid_pl, mlxsw_sp_router_port(mlxsw_sp),
1500                                set_router_port);
1501
1502        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(smid), smid_pl);
1503        kfree(smid_pl);
1504        return err;
1505}
1506
1507static int mlxsw_sp_port_smid_set(struct mlxsw_sp_port *mlxsw_sp_port,
1508                                  u16 mid_idx, bool add)
1509{
1510        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1511        char *smid_pl;
1512        int err;
1513
1514        smid_pl = kmalloc(MLXSW_REG_SMID_LEN, GFP_KERNEL);
1515        if (!smid_pl)
1516                return -ENOMEM;
1517
1518        mlxsw_reg_smid_pack(smid_pl, mid_idx, mlxsw_sp_port->local_port, add);
1519        err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(smid), smid_pl);
1520        kfree(smid_pl);
1521        return err;
1522}
1523
1524static struct
1525mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp_bridge_device *bridge_device,
1526                                const unsigned char *addr,
1527                                u16 fid)
1528{
1529        struct mlxsw_sp_mid *mid;
1530
1531        list_for_each_entry(mid, &bridge_device->mids_list, list) {
1532                if (ether_addr_equal(mid->addr, addr) && mid->fid == fid)
1533                        return mid;
1534        }
1535        return NULL;
1536}
1537
1538static void
1539mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp,
1540                                      struct mlxsw_sp_bridge_port *bridge_port,
1541                                      unsigned long *ports_bitmap)
1542{
1543        struct mlxsw_sp_port *mlxsw_sp_port;
1544        u64 max_lag_members, i;
1545        int lag_id;
1546
1547        if (!bridge_port->lagged) {
1548                set_bit(bridge_port->system_port, ports_bitmap);
1549        } else {
1550                max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
1551                                                     MAX_LAG_MEMBERS);
1552                lag_id = bridge_port->lag_id;
1553                for (i = 0; i < max_lag_members; i++) {
1554                        mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp,
1555                                                                 lag_id, i);
1556                        if (mlxsw_sp_port)
1557                                set_bit(mlxsw_sp_port->local_port,
1558                                        ports_bitmap);
1559                }
1560        }
1561}
1562
1563static void
1564mlxsw_sp_mc_get_mrouters_bitmap(unsigned long *flood_bitmap,
1565                                struct mlxsw_sp_bridge_device *bridge_device,
1566                                struct mlxsw_sp *mlxsw_sp)
1567{
1568        struct mlxsw_sp_bridge_port *bridge_port;
1569
1570        list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
1571                if (bridge_port->mrouter) {
1572                        mlxsw_sp_bridge_port_get_ports_bitmap(mlxsw_sp,
1573                                                              bridge_port,
1574                                                              flood_bitmap);
1575                }
1576        }
1577}
1578
1579static bool
1580mlxsw_sp_mc_write_mdb_entry(struct mlxsw_sp *mlxsw_sp,
1581                            struct mlxsw_sp_mid *mid,
1582                            struct mlxsw_sp_bridge_device *bridge_device)
1583{
1584        long *flood_bitmap;
1585        int num_of_ports;
1586        u16 mid_idx;
1587        int err;
1588
1589        mid_idx = find_first_zero_bit(mlxsw_sp->bridge->mids_bitmap,
1590                                      MLXSW_SP_MID_MAX);
1591        if (mid_idx == MLXSW_SP_MID_MAX)
1592                return false;
1593
1594        num_of_ports = mlxsw_core_max_ports(mlxsw_sp->core);
1595        flood_bitmap = bitmap_alloc(num_of_ports, GFP_KERNEL);
1596        if (!flood_bitmap)
1597                return false;
1598
1599        bitmap_copy(flood_bitmap, mid->ports_in_mid, num_of_ports);
1600        mlxsw_sp_mc_get_mrouters_bitmap(flood_bitmap, bridge_device, mlxsw_sp);
1601
1602        mid->mid = mid_idx;
1603        err = mlxsw_sp_port_smid_full_entry(mlxsw_sp, mid_idx, flood_bitmap,
1604                                            bridge_device->mrouter);
1605        bitmap_free(flood_bitmap);
1606        if (err)
1607                return false;
1608
1609        err = mlxsw_sp_port_mdb_op(mlxsw_sp, mid->addr, mid->fid, mid_idx,
1610                                   true);
1611        if (err)
1612                return false;
1613
1614        set_bit(mid_idx, mlxsw_sp->bridge->mids_bitmap);
1615        mid->in_hw = true;
1616        return true;
1617}
1618
1619static int mlxsw_sp_mc_remove_mdb_entry(struct mlxsw_sp *mlxsw_sp,
1620                                        struct mlxsw_sp_mid *mid)
1621{
1622        if (!mid->in_hw)
1623                return 0;
1624
1625        clear_bit(mid->mid, mlxsw_sp->bridge->mids_bitmap);
1626        mid->in_hw = false;
1627        return mlxsw_sp_port_mdb_op(mlxsw_sp, mid->addr, mid->fid, mid->mid,
1628                                    false);
1629}
1630
1631static struct
1632mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
1633                                  struct mlxsw_sp_bridge_device *bridge_device,
1634                                  const unsigned char *addr,
1635                                  u16 fid)
1636{
1637        struct mlxsw_sp_mid *mid;
1638        size_t alloc_size;
1639
1640        mid = kzalloc(sizeof(*mid), GFP_KERNEL);
1641        if (!mid)
1642                return NULL;
1643
1644        alloc_size = sizeof(unsigned long) *
1645                     BITS_TO_LONGS(mlxsw_core_max_ports(mlxsw_sp->core));
1646
1647        mid->ports_in_mid = kzalloc(alloc_size, GFP_KERNEL);
1648        if (!mid->ports_in_mid)
1649                goto err_ports_in_mid_alloc;
1650
1651        ether_addr_copy(mid->addr, addr);
1652        mid->fid = fid;
1653        mid->in_hw = false;
1654
1655        if (!bridge_device->multicast_enabled)
1656                goto out;
1657
1658        if (!mlxsw_sp_mc_write_mdb_entry(mlxsw_sp, mid, bridge_device))
1659                goto err_write_mdb_entry;
1660
1661out:
1662        list_add_tail(&mid->list, &bridge_device->mids_list);
1663        return mid;
1664
1665err_write_mdb_entry:
1666        kfree(mid->ports_in_mid);
1667err_ports_in_mid_alloc:
1668        kfree(mid);
1669        return NULL;
1670}
1671
1672static int mlxsw_sp_port_remove_from_mid(struct mlxsw_sp_port *mlxsw_sp_port,
1673                                         struct mlxsw_sp_mid *mid)
1674{
1675        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1676        int err = 0;
1677
1678        clear_bit(mlxsw_sp_port->local_port, mid->ports_in_mid);
1679        if (bitmap_empty(mid->ports_in_mid,
1680                         mlxsw_core_max_ports(mlxsw_sp->core))) {
1681                err = mlxsw_sp_mc_remove_mdb_entry(mlxsw_sp, mid);
1682                list_del(&mid->list);
1683                kfree(mid->ports_in_mid);
1684                kfree(mid);
1685        }
1686        return err;
1687}
1688
1689static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
1690                                 const struct switchdev_obj_port_mdb *mdb)
1691{
1692        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1693        struct net_device *orig_dev = mdb->obj.orig_dev;
1694        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1695        struct net_device *dev = mlxsw_sp_port->dev;
1696        struct mlxsw_sp_bridge_device *bridge_device;
1697        struct mlxsw_sp_bridge_port *bridge_port;
1698        struct mlxsw_sp_mid *mid;
1699        u16 fid_index;
1700        int err = 0;
1701
1702        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1703        if (!bridge_port)
1704                return 0;
1705
1706        bridge_device = bridge_port->bridge_device;
1707        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1708                                                               bridge_device,
1709                                                               mdb->vid);
1710        if (!mlxsw_sp_port_vlan)
1711                return 0;
1712
1713        fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1714
1715        mid = __mlxsw_sp_mc_get(bridge_device, mdb->addr, fid_index);
1716        if (!mid) {
1717                mid = __mlxsw_sp_mc_alloc(mlxsw_sp, bridge_device, mdb->addr,
1718                                          fid_index);
1719                if (!mid) {
1720                        netdev_err(dev, "Unable to allocate MC group\n");
1721                        return -ENOMEM;
1722                }
1723        }
1724        set_bit(mlxsw_sp_port->local_port, mid->ports_in_mid);
1725
1726        if (!bridge_device->multicast_enabled)
1727                return 0;
1728
1729        if (bridge_port->mrouter)
1730                return 0;
1731
1732        err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, true);
1733        if (err) {
1734                netdev_err(dev, "Unable to set SMID\n");
1735                goto err_out;
1736        }
1737
1738        return 0;
1739
1740err_out:
1741        mlxsw_sp_port_remove_from_mid(mlxsw_sp_port, mid);
1742        return err;
1743}
1744
1745static void
1746mlxsw_sp_bridge_mdb_mc_enable_sync(struct mlxsw_sp_port *mlxsw_sp_port,
1747                                   struct mlxsw_sp_bridge_device
1748                                   *bridge_device)
1749{
1750        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1751        struct mlxsw_sp_mid *mid;
1752        bool mc_enabled;
1753
1754        mc_enabled = bridge_device->multicast_enabled;
1755
1756        list_for_each_entry(mid, &bridge_device->mids_list, list) {
1757                if (mc_enabled)
1758                        mlxsw_sp_mc_write_mdb_entry(mlxsw_sp, mid,
1759                                                    bridge_device);
1760                else
1761                        mlxsw_sp_mc_remove_mdb_entry(mlxsw_sp, mid);
1762        }
1763}
1764
1765static void
1766mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port,
1767                                 struct mlxsw_sp_bridge_port *bridge_port,
1768                                 bool add)
1769{
1770        struct mlxsw_sp_bridge_device *bridge_device;
1771        struct mlxsw_sp_mid *mid;
1772
1773        bridge_device = bridge_port->bridge_device;
1774
1775        list_for_each_entry(mid, &bridge_device->mids_list, list) {
1776                if (!test_bit(mlxsw_sp_port->local_port, mid->ports_in_mid))
1777                        mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, add);
1778        }
1779}
1780
1781static int mlxsw_sp_port_obj_add(struct net_device *dev, const void *ctx,
1782                                 const struct switchdev_obj *obj,
1783                                 struct netlink_ext_ack *extack)
1784{
1785        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1786        const struct switchdev_obj_port_vlan *vlan;
1787        int err = 0;
1788
1789        switch (obj->id) {
1790        case SWITCHDEV_OBJ_ID_PORT_VLAN:
1791                vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
1792
1793                err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, extack);
1794
1795                /* The event is emitted before the changes are actually
1796                 * applied to the bridge. Therefore schedule the respin
1797                 * call for later, so that the respin logic sees the
1798                 * updated bridge state.
1799                 */
1800                mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
1801                break;
1802        case SWITCHDEV_OBJ_ID_PORT_MDB:
1803                err = mlxsw_sp_port_mdb_add(mlxsw_sp_port,
1804                                            SWITCHDEV_OBJ_PORT_MDB(obj));
1805                break;
1806        default:
1807                err = -EOPNOTSUPP;
1808                break;
1809        }
1810
1811        return err;
1812}
1813
1814static void
1815mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port,
1816                              struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
1817{
1818        u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : mlxsw_sp_port->pvid;
1819        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1820        u16 proto;
1821
1822        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1823        if (WARN_ON(!mlxsw_sp_port_vlan))
1824                return;
1825
1826        mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
1827        br_vlan_get_proto(bridge_port->bridge_device->dev, &proto);
1828        mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid, proto);
1829        mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1830        mlxsw_sp_port_vlan_destroy(mlxsw_sp_port_vlan);
1831}
1832
1833static int mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
1834                                   const struct switchdev_obj_port_vlan *vlan)
1835{
1836        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1837        struct net_device *orig_dev = vlan->obj.orig_dev;
1838        struct mlxsw_sp_bridge_port *bridge_port;
1839
1840        if (netif_is_bridge_master(orig_dev))
1841                return -EOPNOTSUPP;
1842
1843        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1844        if (WARN_ON(!bridge_port))
1845                return -EINVAL;
1846
1847        if (!bridge_port->bridge_device->vlan_enabled)
1848                return 0;
1849
1850        mlxsw_sp_bridge_port_vlan_del(mlxsw_sp_port, bridge_port, vlan->vid);
1851
1852        return 0;
1853}
1854
1855static int
1856__mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
1857                        struct mlxsw_sp_bridge_port *bridge_port,
1858                        struct mlxsw_sp_mid *mid)
1859{
1860        struct net_device *dev = mlxsw_sp_port->dev;
1861        int err;
1862
1863        if (bridge_port->bridge_device->multicast_enabled &&
1864            !bridge_port->mrouter) {
1865                err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false);
1866                if (err)
1867                        netdev_err(dev, "Unable to remove port from SMID\n");
1868        }
1869
1870        err = mlxsw_sp_port_remove_from_mid(mlxsw_sp_port, mid);
1871        if (err)
1872                netdev_err(dev, "Unable to remove MC SFD\n");
1873
1874        return err;
1875}
1876
1877static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
1878                                 const struct switchdev_obj_port_mdb *mdb)
1879{
1880        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1881        struct net_device *orig_dev = mdb->obj.orig_dev;
1882        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1883        struct mlxsw_sp_bridge_device *bridge_device;
1884        struct net_device *dev = mlxsw_sp_port->dev;
1885        struct mlxsw_sp_bridge_port *bridge_port;
1886        struct mlxsw_sp_mid *mid;
1887        u16 fid_index;
1888
1889        bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1890        if (!bridge_port)
1891                return 0;
1892
1893        bridge_device = bridge_port->bridge_device;
1894        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1895                                                               bridge_device,
1896                                                               mdb->vid);
1897        if (!mlxsw_sp_port_vlan)
1898                return 0;
1899
1900        fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1901
1902        mid = __mlxsw_sp_mc_get(bridge_device, mdb->addr, fid_index);
1903        if (!mid) {
1904                netdev_err(dev, "Unable to remove port from MC DB\n");
1905                return -EINVAL;
1906        }
1907
1908        return __mlxsw_sp_port_mdb_del(mlxsw_sp_port, bridge_port, mid);
1909}
1910
1911static void
1912mlxsw_sp_bridge_port_mdb_flush(struct mlxsw_sp_port *mlxsw_sp_port,
1913                               struct mlxsw_sp_bridge_port *bridge_port)
1914{
1915        struct mlxsw_sp_bridge_device *bridge_device;
1916        struct mlxsw_sp_mid *mid, *tmp;
1917
1918        bridge_device = bridge_port->bridge_device;
1919
1920        list_for_each_entry_safe(mid, tmp, &bridge_device->mids_list, list) {
1921                if (test_bit(mlxsw_sp_port->local_port, mid->ports_in_mid)) {
1922                        __mlxsw_sp_port_mdb_del(mlxsw_sp_port, bridge_port,
1923                                                mid);
1924                } else if (bridge_device->multicast_enabled &&
1925                           bridge_port->mrouter) {
1926                        mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, false);
1927                }
1928        }
1929}
1930
1931static int mlxsw_sp_port_obj_del(struct net_device *dev, const void *ctx,
1932                                 const struct switchdev_obj *obj)
1933{
1934        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1935        int err = 0;
1936
1937        switch (obj->id) {
1938        case SWITCHDEV_OBJ_ID_PORT_VLAN:
1939                err = mlxsw_sp_port_vlans_del(mlxsw_sp_port,
1940                                              SWITCHDEV_OBJ_PORT_VLAN(obj));
1941                break;
1942        case SWITCHDEV_OBJ_ID_PORT_MDB:
1943                err = mlxsw_sp_port_mdb_del(mlxsw_sp_port,
1944                                            SWITCHDEV_OBJ_PORT_MDB(obj));
1945                break;
1946        default:
1947                err = -EOPNOTSUPP;
1948                break;
1949        }
1950
1951        mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
1952
1953        return err;
1954}
1955
1956static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp,
1957                                                   u16 lag_id)
1958{
1959        struct mlxsw_sp_port *mlxsw_sp_port;
1960        u64 max_lag_members;
1961        int i;
1962
1963        max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
1964                                             MAX_LAG_MEMBERS);
1965        for (i = 0; i < max_lag_members; i++) {
1966                mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp, lag_id, i);
1967                if (mlxsw_sp_port)
1968                        return mlxsw_sp_port;
1969        }
1970        return NULL;
1971}
1972
1973static int
1974mlxsw_sp_bridge_vlan_aware_port_join(struct mlxsw_sp_bridge_port *bridge_port,
1975                                     struct mlxsw_sp_port *mlxsw_sp_port,
1976                                     struct netlink_ext_ack *extack)
1977{
1978        if (is_vlan_dev(bridge_port->dev)) {
1979                NL_SET_ERR_MSG_MOD(extack, "Can not enslave a VLAN device to a VLAN-aware bridge");
1980                return -EINVAL;
1981        }
1982
1983        /* Port is no longer usable as a router interface */
1984        if (mlxsw_sp_port->default_vlan->fid)
1985                mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port->default_vlan);
1986
1987        return 0;
1988}
1989
1990static int
1991mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
1992                                struct mlxsw_sp_bridge_port *bridge_port,
1993                                struct mlxsw_sp_port *mlxsw_sp_port,
1994                                struct netlink_ext_ack *extack)
1995{
1996        return mlxsw_sp_bridge_vlan_aware_port_join(bridge_port, mlxsw_sp_port,
1997                                                    extack);
1998}
1999
2000static void
2001mlxsw_sp_bridge_vlan_aware_port_leave(struct mlxsw_sp_port *mlxsw_sp_port)
2002{
2003        /* Make sure untagged frames are allowed to ingress */
2004        mlxsw_sp_port_pvid_set(mlxsw_sp_port, MLXSW_SP_DEFAULT_VID,
2005                               ETH_P_8021Q);
2006}
2007
2008static void
2009mlxsw_sp_bridge_8021q_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2010                                 struct mlxsw_sp_bridge_port *bridge_port,
2011                                 struct mlxsw_sp_port *mlxsw_sp_port)
2012{
2013        mlxsw_sp_bridge_vlan_aware_port_leave(mlxsw_sp_port);
2014}
2015
2016static int
2017mlxsw_sp_bridge_vlan_aware_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2018                                      const struct net_device *vxlan_dev,
2019                                      u16 vid, u16 ethertype,
2020                                      struct netlink_ext_ack *extack)
2021{
2022        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2023        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2024        struct mlxsw_sp_nve_params params = {
2025                .type = MLXSW_SP_NVE_TYPE_VXLAN,
2026                .vni = vxlan->cfg.vni,
2027                .dev = vxlan_dev,
2028                .ethertype = ethertype,
2029        };
2030        struct mlxsw_sp_fid *fid;
2031        int err;
2032
2033        /* If the VLAN is 0, we need to find the VLAN that is configured as
2034         * PVID and egress untagged on the bridge port of the VxLAN device.
2035         * It is possible no such VLAN exists
2036         */
2037        if (!vid) {
2038                err = mlxsw_sp_vxlan_mapped_vid(vxlan_dev, &vid);
2039                if (err || !vid)
2040                        return err;
2041        }
2042
2043        fid = mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
2044        if (IS_ERR(fid)) {
2045                NL_SET_ERR_MSG_MOD(extack, "Failed to create 802.1Q FID");
2046                return PTR_ERR(fid);
2047        }
2048
2049        if (mlxsw_sp_fid_vni_is_set(fid)) {
2050                NL_SET_ERR_MSG_MOD(extack, "VNI is already set on FID");
2051                err = -EINVAL;
2052                goto err_vni_exists;
2053        }
2054
2055        err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
2056        if (err)
2057                goto err_nve_fid_enable;
2058
2059        return 0;
2060
2061err_nve_fid_enable:
2062err_vni_exists:
2063        mlxsw_sp_fid_put(fid);
2064        return err;
2065}
2066
2067static int
2068mlxsw_sp_bridge_8021q_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2069                                 const struct net_device *vxlan_dev, u16 vid,
2070                                 struct netlink_ext_ack *extack)
2071{
2072        return mlxsw_sp_bridge_vlan_aware_vxlan_join(bridge_device, vxlan_dev,
2073                                                     vid, ETH_P_8021Q, extack);
2074}
2075
2076static struct net_device *
2077mlxsw_sp_bridge_8021q_vxlan_dev_find(struct net_device *br_dev, u16 vid)
2078{
2079        struct net_device *dev;
2080        struct list_head *iter;
2081
2082        netdev_for_each_lower_dev(br_dev, dev, iter) {
2083                u16 pvid;
2084                int err;
2085
2086                if (!netif_is_vxlan(dev))
2087                        continue;
2088
2089                err = mlxsw_sp_vxlan_mapped_vid(dev, &pvid);
2090                if (err || pvid != vid)
2091                        continue;
2092
2093                return dev;
2094        }
2095
2096        return NULL;
2097}
2098
2099static struct mlxsw_sp_fid *
2100mlxsw_sp_bridge_8021q_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
2101                              u16 vid, struct netlink_ext_ack *extack)
2102{
2103        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2104
2105        return mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
2106}
2107
2108static struct mlxsw_sp_fid *
2109mlxsw_sp_bridge_8021q_fid_lookup(struct mlxsw_sp_bridge_device *bridge_device,
2110                                 u16 vid)
2111{
2112        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2113
2114        return mlxsw_sp_fid_8021q_lookup(mlxsw_sp, vid);
2115}
2116
2117static u16
2118mlxsw_sp_bridge_8021q_fid_vid(struct mlxsw_sp_bridge_device *bridge_device,
2119                              const struct mlxsw_sp_fid *fid)
2120{
2121        return mlxsw_sp_fid_8021q_vid(fid);
2122}
2123
2124static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021q_ops = {
2125        .port_join      = mlxsw_sp_bridge_8021q_port_join,
2126        .port_leave     = mlxsw_sp_bridge_8021q_port_leave,
2127        .vxlan_join     = mlxsw_sp_bridge_8021q_vxlan_join,
2128        .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
2129        .fid_lookup     = mlxsw_sp_bridge_8021q_fid_lookup,
2130        .fid_vid        = mlxsw_sp_bridge_8021q_fid_vid,
2131};
2132
2133static bool
2134mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
2135                           const struct net_device *br_dev)
2136{
2137        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2138
2139        list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
2140                            list) {
2141                if (mlxsw_sp_port_vlan->bridge_port &&
2142                    mlxsw_sp_port_vlan->bridge_port->bridge_device->dev ==
2143                    br_dev)
2144                        return true;
2145        }
2146
2147        return false;
2148}
2149
2150static int
2151mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2152                                struct mlxsw_sp_bridge_port *bridge_port,
2153                                struct mlxsw_sp_port *mlxsw_sp_port,
2154                                struct netlink_ext_ack *extack)
2155{
2156        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2157        struct net_device *dev = bridge_port->dev;
2158        u16 vid;
2159
2160        vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : MLXSW_SP_DEFAULT_VID;
2161        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
2162        if (WARN_ON(!mlxsw_sp_port_vlan))
2163                return -EINVAL;
2164
2165        if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
2166                NL_SET_ERR_MSG_MOD(extack, "Can not bridge VLAN uppers of the same port");
2167                return -EINVAL;
2168        }
2169
2170        /* Port is no longer usable as a router interface */
2171        if (mlxsw_sp_port_vlan->fid)
2172                mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan);
2173
2174        return mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port,
2175                                              extack);
2176}
2177
2178static void
2179mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2180                                 struct mlxsw_sp_bridge_port *bridge_port,
2181                                 struct mlxsw_sp_port *mlxsw_sp_port)
2182{
2183        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2184        struct net_device *dev = bridge_port->dev;
2185        u16 vid;
2186
2187        vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : MLXSW_SP_DEFAULT_VID;
2188        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
2189        if (!mlxsw_sp_port_vlan || !mlxsw_sp_port_vlan->bridge_port)
2190                return;
2191
2192        mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
2193}
2194
2195static int
2196mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2197                                 const struct net_device *vxlan_dev, u16 vid,
2198                                 struct netlink_ext_ack *extack)
2199{
2200        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2201        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2202        struct mlxsw_sp_nve_params params = {
2203                .type = MLXSW_SP_NVE_TYPE_VXLAN,
2204                .vni = vxlan->cfg.vni,
2205                .dev = vxlan_dev,
2206                .ethertype = ETH_P_8021Q,
2207        };
2208        struct mlxsw_sp_fid *fid;
2209        int err;
2210
2211        fid = mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
2212        if (IS_ERR(fid)) {
2213                NL_SET_ERR_MSG_MOD(extack, "Failed to create 802.1D FID");
2214                return -EINVAL;
2215        }
2216
2217        if (mlxsw_sp_fid_vni_is_set(fid)) {
2218                NL_SET_ERR_MSG_MOD(extack, "VNI is already set on FID");
2219                err = -EINVAL;
2220                goto err_vni_exists;
2221        }
2222
2223        err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
2224        if (err)
2225                goto err_nve_fid_enable;
2226
2227        return 0;
2228
2229err_nve_fid_enable:
2230err_vni_exists:
2231        mlxsw_sp_fid_put(fid);
2232        return err;
2233}
2234
2235static struct mlxsw_sp_fid *
2236mlxsw_sp_bridge_8021d_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
2237                              u16 vid, struct netlink_ext_ack *extack)
2238{
2239        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2240
2241        return mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
2242}
2243
2244static struct mlxsw_sp_fid *
2245mlxsw_sp_bridge_8021d_fid_lookup(struct mlxsw_sp_bridge_device *bridge_device,
2246                                 u16 vid)
2247{
2248        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2249
2250        /* The only valid VLAN for a VLAN-unaware bridge is 0 */
2251        if (vid)
2252                return NULL;
2253
2254        return mlxsw_sp_fid_8021d_lookup(mlxsw_sp, bridge_device->dev->ifindex);
2255}
2256
2257static u16
2258mlxsw_sp_bridge_8021d_fid_vid(struct mlxsw_sp_bridge_device *bridge_device,
2259                              const struct mlxsw_sp_fid *fid)
2260{
2261        return 0;
2262}
2263
2264static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
2265        .port_join      = mlxsw_sp_bridge_8021d_port_join,
2266        .port_leave     = mlxsw_sp_bridge_8021d_port_leave,
2267        .vxlan_join     = mlxsw_sp_bridge_8021d_vxlan_join,
2268        .fid_get        = mlxsw_sp_bridge_8021d_fid_get,
2269        .fid_lookup     = mlxsw_sp_bridge_8021d_fid_lookup,
2270        .fid_vid        = mlxsw_sp_bridge_8021d_fid_vid,
2271};
2272
2273static int
2274mlxsw_sp_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2275                                 struct mlxsw_sp_bridge_port *bridge_port,
2276                                 struct mlxsw_sp_port *mlxsw_sp_port,
2277                                 struct netlink_ext_ack *extack)
2278{
2279        int err;
2280
2281        err = mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, true, false);
2282        if (err)
2283                return err;
2284
2285        err = mlxsw_sp_bridge_vlan_aware_port_join(bridge_port, mlxsw_sp_port,
2286                                                   extack);
2287        if (err)
2288                goto err_bridge_vlan_aware_port_join;
2289
2290        return 0;
2291
2292err_bridge_vlan_aware_port_join:
2293        mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
2294        return err;
2295}
2296
2297static void
2298mlxsw_sp_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2299                                  struct mlxsw_sp_bridge_port *bridge_port,
2300                                  struct mlxsw_sp_port *mlxsw_sp_port)
2301{
2302        mlxsw_sp_bridge_vlan_aware_port_leave(mlxsw_sp_port);
2303        mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
2304}
2305
2306static int
2307mlxsw_sp_bridge_8021ad_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2308                                  const struct net_device *vxlan_dev, u16 vid,
2309                                  struct netlink_ext_ack *extack)
2310{
2311        return mlxsw_sp_bridge_vlan_aware_vxlan_join(bridge_device, vxlan_dev,
2312                                                     vid, ETH_P_8021AD, extack);
2313}
2314
2315static const struct mlxsw_sp_bridge_ops mlxsw_sp1_bridge_8021ad_ops = {
2316        .port_join      = mlxsw_sp_bridge_8021ad_port_join,
2317        .port_leave     = mlxsw_sp_bridge_8021ad_port_leave,
2318        .vxlan_join     = mlxsw_sp_bridge_8021ad_vxlan_join,
2319        .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
2320        .fid_lookup     = mlxsw_sp_bridge_8021q_fid_lookup,
2321        .fid_vid        = mlxsw_sp_bridge_8021q_fid_vid,
2322};
2323
2324static int
2325mlxsw_sp2_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2326                                  struct mlxsw_sp_bridge_port *bridge_port,
2327                                  struct mlxsw_sp_port *mlxsw_sp_port,
2328                                  struct netlink_ext_ack *extack)
2329{
2330        int err;
2331
2332        /* The EtherType of decapsulated packets is determined at the egress
2333         * port to allow 802.1d and 802.1ad bridges with VXLAN devices to
2334         * co-exist.
2335         */
2336        err = mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021AD);
2337        if (err)
2338                return err;
2339
2340        err = mlxsw_sp_bridge_8021ad_port_join(bridge_device, bridge_port,
2341                                               mlxsw_sp_port, extack);
2342        if (err)
2343                goto err_bridge_8021ad_port_join;
2344
2345        return 0;
2346
2347err_bridge_8021ad_port_join:
2348        mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021Q);
2349        return err;
2350}
2351
2352static void
2353mlxsw_sp2_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2354                                   struct mlxsw_sp_bridge_port *bridge_port,
2355                                   struct mlxsw_sp_port *mlxsw_sp_port)
2356{
2357        mlxsw_sp_bridge_8021ad_port_leave(bridge_device, bridge_port,
2358                                          mlxsw_sp_port);
2359        mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021Q);
2360}
2361
2362static const struct mlxsw_sp_bridge_ops mlxsw_sp2_bridge_8021ad_ops = {
2363        .port_join      = mlxsw_sp2_bridge_8021ad_port_join,
2364        .port_leave     = mlxsw_sp2_bridge_8021ad_port_leave,
2365        .vxlan_join     = mlxsw_sp_bridge_8021ad_vxlan_join,
2366        .fid_get        = mlxsw_sp_bridge_8021q_fid_get,
2367        .fid_lookup     = mlxsw_sp_bridge_8021q_fid_lookup,
2368        .fid_vid        = mlxsw_sp_bridge_8021q_fid_vid,
2369};
2370
2371int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
2372                              struct net_device *brport_dev,
2373                              struct net_device *br_dev,
2374                              struct netlink_ext_ack *extack)
2375{
2376        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2377        struct mlxsw_sp_bridge_device *bridge_device;
2378        struct mlxsw_sp_bridge_port *bridge_port;
2379        int err;
2380
2381        bridge_port = mlxsw_sp_bridge_port_get(mlxsw_sp->bridge, brport_dev,
2382                                               extack);
2383        if (IS_ERR(bridge_port))
2384                return PTR_ERR(bridge_port);
2385        bridge_device = bridge_port->bridge_device;
2386
2387        err = bridge_device->ops->port_join(bridge_device, bridge_port,
2388                                            mlxsw_sp_port, extack);
2389        if (err)
2390                goto err_port_join;
2391
2392        return 0;
2393
2394err_port_join:
2395        mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
2396        return err;
2397}
2398
2399void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
2400                                struct net_device *brport_dev,
2401                                struct net_device *br_dev)
2402{
2403        struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2404        struct mlxsw_sp_bridge_device *bridge_device;
2405        struct mlxsw_sp_bridge_port *bridge_port;
2406
2407        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2408        if (!bridge_device)
2409                return;
2410        bridge_port = __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
2411        if (!bridge_port)
2412                return;
2413
2414        bridge_device->ops->port_leave(bridge_device, bridge_port,
2415                                       mlxsw_sp_port);
2416        mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
2417}
2418
2419int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
2420                               const struct net_device *br_dev,
2421                               const struct net_device *vxlan_dev, u16 vid,
2422                               struct netlink_ext_ack *extack)
2423{
2424        struct mlxsw_sp_bridge_device *bridge_device;
2425
2426        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2427        if (WARN_ON(!bridge_device))
2428                return -EINVAL;
2429
2430        return bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, vid,
2431                                              extack);
2432}
2433
2434void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
2435                                 const struct net_device *vxlan_dev)
2436{
2437        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2438        struct mlxsw_sp_fid *fid;
2439
2440        /* If the VxLAN device is down, then the FID does not have a VNI */
2441        fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan->cfg.vni);
2442        if (!fid)
2443                return;
2444
2445        mlxsw_sp_nve_fid_disable(mlxsw_sp, fid);
2446        /* Drop both the reference we just took during lookup and the reference
2447         * the VXLAN device took.
2448         */
2449        mlxsw_sp_fid_put(fid);
2450        mlxsw_sp_fid_put(fid);
2451}
2452
2453static void
2454mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr *vxlan_addr,
2455                                      enum mlxsw_sp_l3proto *proto,
2456                                      union mlxsw_sp_l3addr *addr)
2457{
2458        if (vxlan_addr->sa.sa_family == AF_INET) {
2459                addr->addr4 = vxlan_addr->sin.sin_addr.s_addr;
2460                *proto = MLXSW_SP_L3_PROTO_IPV4;
2461        } else {
2462                addr->addr6 = vxlan_addr->sin6.sin6_addr;
2463                *proto = MLXSW_SP_L3_PROTO_IPV6;
2464        }
2465}
2466
2467static void
2468mlxsw_sp_switchdev_addr_vxlan_convert(enum mlxsw_sp_l3proto proto,
2469                                      const union mlxsw_sp_l3addr *addr,
2470                                      union vxlan_addr *vxlan_addr)
2471{
2472        switch (proto) {
2473        case MLXSW_SP_L3_PROTO_IPV4:
2474                vxlan_addr->sa.sa_family = AF_INET;
2475                vxlan_addr->sin.sin_addr.s_addr = addr->addr4;
2476                break;
2477        case MLXSW_SP_L3_PROTO_IPV6:
2478                vxlan_addr->sa.sa_family = AF_INET6;
2479                vxlan_addr->sin6.sin6_addr = addr->addr6;
2480                break;
2481        }
2482}
2483
2484static void mlxsw_sp_fdb_vxlan_call_notifiers(struct net_device *dev,
2485                                              const char *mac,
2486                                              enum mlxsw_sp_l3proto proto,
2487                                              union mlxsw_sp_l3addr *addr,
2488                                              __be32 vni, bool adding)
2489{
2490        struct switchdev_notifier_vxlan_fdb_info info;
2491        struct vxlan_dev *vxlan = netdev_priv(dev);
2492        enum switchdev_notifier_type type;
2493
2494        type = adding ? SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE :
2495                        SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE;
2496        mlxsw_sp_switchdev_addr_vxlan_convert(proto, addr, &info.remote_ip);
2497        info.remote_port = vxlan->cfg.dst_port;
2498        info.remote_vni = vni;
2499        info.remote_ifindex = 0;
2500        ether_addr_copy(info.eth_addr, mac);
2501        info.vni = vni;
2502        info.offloaded = adding;
2503        call_switchdev_notifiers(type, dev, &info.info, NULL);
2504}
2505
2506static void mlxsw_sp_fdb_nve_call_notifiers(struct net_device *dev,
2507                                            const char *mac,
2508                                            enum mlxsw_sp_l3proto proto,
2509                                            union mlxsw_sp_l3addr *addr,
2510                                            __be32 vni,
2511                                            bool adding)
2512{
2513        if (netif_is_vxlan(dev))
2514                mlxsw_sp_fdb_vxlan_call_notifiers(dev, mac, proto, addr, vni,
2515                                                  adding);
2516}
2517
2518static void
2519mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
2520                            const char *mac, u16 vid,
2521                            struct net_device *dev, bool offloaded)
2522{
2523        struct switchdev_notifier_fdb_info info = {};
2524
2525        info.addr = mac;
2526        info.vid = vid;
2527        info.offloaded = offloaded;
2528        call_switchdev_notifiers(type, dev, &info.info, NULL);
2529}
2530
2531static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
2532                                            char *sfn_pl, int rec_index,
2533                                            bool adding)
2534{
2535        unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
2536        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2537        struct mlxsw_sp_bridge_device *bridge_device;
2538        struct mlxsw_sp_bridge_port *bridge_port;
2539        struct mlxsw_sp_port *mlxsw_sp_port;
2540        enum switchdev_notifier_type type;
2541        char mac[ETH_ALEN];
2542        u8 local_port;
2543        u16 vid, fid;
2544        bool do_notification = true;
2545        int err;
2546
2547        mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port);
2548
2549        if (WARN_ON_ONCE(local_port >= max_ports))
2550                return;
2551        mlxsw_sp_port = mlxsw_sp->ports[local_port];
2552        if (!mlxsw_sp_port) {
2553                dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect local port in FDB notification\n");
2554                goto just_remove;
2555        }
2556
2557        if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid))
2558                goto just_remove;
2559
2560        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
2561        if (!mlxsw_sp_port_vlan) {
2562                netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
2563                goto just_remove;
2564        }
2565
2566        bridge_port = mlxsw_sp_port_vlan->bridge_port;
2567        if (!bridge_port) {
2568                netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
2569                goto just_remove;
2570        }
2571
2572        bridge_device = bridge_port->bridge_device;
2573        vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
2574
2575do_fdb_op:
2576        err = mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid,
2577                                      adding, true);
2578        if (err) {
2579                dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
2580                return;
2581        }
2582
2583        if (!do_notification)
2584                return;
2585        type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
2586        mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev, adding);
2587
2588        return;
2589
2590just_remove:
2591        adding = false;
2592        do_notification = false;
2593        goto do_fdb_op;
2594}
2595
2596static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
2597                                                char *sfn_pl, int rec_index,
2598                                                bool adding)
2599{
2600        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2601        struct mlxsw_sp_bridge_device *bridge_device;
2602        struct mlxsw_sp_bridge_port *bridge_port;
2603        struct mlxsw_sp_port *mlxsw_sp_port;
2604        enum switchdev_notifier_type type;
2605        char mac[ETH_ALEN];
2606        u16 lag_vid = 0;
2607        u16 lag_id;
2608        u16 vid, fid;
2609        bool do_notification = true;
2610        int err;
2611
2612        mlxsw_reg_sfn_mac_lag_unpack(sfn_pl, rec_index, mac, &fid, &lag_id);
2613        mlxsw_sp_port = mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id);
2614        if (!mlxsw_sp_port) {
2615                dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Cannot find port representor for LAG\n");
2616                goto just_remove;
2617        }
2618
2619        if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid))
2620                goto just_remove;
2621
2622        mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
2623        if (!mlxsw_sp_port_vlan) {
2624                netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
2625                goto just_remove;
2626        }
2627
2628        bridge_port = mlxsw_sp_port_vlan->bridge_port;
2629        if (!bridge_port) {
2630                netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
2631                goto just_remove;
2632        }
2633
2634        bridge_device = bridge_port->bridge_device;
2635        vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
2636        lag_vid = mlxsw_sp_fid_lag_vid_valid(mlxsw_sp_port_vlan->fid) ?
2637                  mlxsw_sp_port_vlan->vid : 0;
2638
2639do_fdb_op:
2640        err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
2641                                          adding, true);
2642        if (err) {
2643                dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
2644                return;
2645        }
2646
2647        if (!do_notification)
2648                return;
2649        type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
2650        mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev, adding);
2651
2652        return;
2653
2654just_remove:
2655        adding = false;
2656        do_notification = false;
2657        goto do_fdb_op;
2658}
2659
2660static int
2661__mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp *mlxsw_sp,
2662                                            const struct mlxsw_sp_fid *fid,
2663                                            bool adding,
2664                                            struct net_device **nve_dev,
2665                                            u16 *p_vid, __be32 *p_vni)
2666{
2667        struct mlxsw_sp_bridge_device *bridge_device;
2668        struct net_device *br_dev, *dev;
2669        int nve_ifindex;
2670        int err;
2671
2672        err = mlxsw_sp_fid_nve_ifindex(fid, &nve_ifindex);
2673        if (err)
2674                return err;
2675
2676        err = mlxsw_sp_fid_vni(fid, p_vni);
2677        if (err)
2678                return err;
2679
2680        dev = __dev_get_by_index(mlxsw_sp_net(mlxsw_sp), nve_ifindex);
2681        if (!dev)
2682                return -EINVAL;
2683        *nve_dev = dev;
2684
2685        if (!netif_running(dev))
2686                return -EINVAL;
2687
2688        if (adding && !br_port_flag_is_set(dev, BR_LEARNING))
2689                return -EINVAL;
2690
2691        if (adding && netif_is_vxlan(dev)) {
2692                struct vxlan_dev *vxlan = netdev_priv(dev);
2693
2694                if (!(vxlan->cfg.flags & VXLAN_F_LEARN))
2695                        return -EINVAL;
2696        }
2697
2698        br_dev = netdev_master_upper_dev_get(dev);
2699        if (!br_dev)
2700                return -EINVAL;
2701
2702        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2703        if (!bridge_device)
2704                return -EINVAL;
2705
2706        *p_vid = bridge_device->ops->fid_vid(bridge_device, fid);
2707
2708        return 0;
2709}
2710
2711static void mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp *mlxsw_sp,
2712                                                      char *sfn_pl,
2713                                                      int rec_index,
2714                                                      bool adding)
2715{
2716        enum mlxsw_reg_sfn_uc_tunnel_protocol sfn_proto;
2717        enum switchdev_notifier_type type;
2718        struct net_device *nve_dev;
2719        union mlxsw_sp_l3addr addr;
2720        struct mlxsw_sp_fid *fid;
2721        char mac[ETH_ALEN];
2722        u16 fid_index, vid;
2723        __be32 vni;
2724        u32 uip;
2725        int err;
2726
2727        mlxsw_reg_sfn_uc_tunnel_unpack(sfn_pl, rec_index, mac, &fid_index,
2728                                       &uip, &sfn_proto);
2729
2730        fid = mlxsw_sp_fid_lookup_by_index(mlxsw_sp, fid_index);
2731        if (!fid)
2732                goto err_fid_lookup;
2733
2734        err = mlxsw_sp_nve_learned_ip_resolve(mlxsw_sp, uip,
2735                                              (enum mlxsw_sp_l3proto) sfn_proto,
2736                                              &addr);
2737        if (err)
2738                goto err_ip_resolve;
2739
2740        err = __mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, fid, adding,
2741                                                          &nve_dev, &vid, &vni);
2742        if (err)
2743                goto err_fdb_process;
2744
2745        err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, mac, fid_index,
2746                                             (enum mlxsw_sp_l3proto) sfn_proto,
2747                                             &addr, adding, true);
2748        if (err)
2749                goto err_fdb_op;
2750
2751        mlxsw_sp_fdb_nve_call_notifiers(nve_dev, mac,
2752                                        (enum mlxsw_sp_l3proto) sfn_proto,
2753                                        &addr, vni, adding);
2754
2755        type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE :
2756                        SWITCHDEV_FDB_DEL_TO_BRIDGE;
2757        mlxsw_sp_fdb_call_notifiers(type, mac, vid, nve_dev, adding);
2758
2759        mlxsw_sp_fid_put(fid);
2760
2761        return;
2762
2763err_fdb_op:
2764err_fdb_process:
2765err_ip_resolve:
2766        mlxsw_sp_fid_put(fid);
2767err_fid_lookup:
2768        /* Remove an FDB entry in case we cannot process it. Otherwise the
2769         * device will keep sending the same notification over and over again.
2770         */
2771        mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, mac, fid_index,
2772                                       (enum mlxsw_sp_l3proto) sfn_proto, &addr,
2773                                       false, true);
2774}
2775
2776static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp,
2777                                            char *sfn_pl, int rec_index)
2778{
2779        switch (mlxsw_reg_sfn_rec_type_get(sfn_pl, rec_index)) {
2780        case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC:
2781                mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
2782                                                rec_index, true);
2783                break;
2784        case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC:
2785                mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
2786                                                rec_index, false);
2787                break;
2788        case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC_LAG:
2789                mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
2790                                                    rec_index, true);
2791                break;
2792        case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC_LAG:
2793                mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
2794                                                    rec_index, false);
2795                break;
2796        case MLXSW_REG_SFN_REC_TYPE_LEARNED_UNICAST_TUNNEL:
2797                mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, sfn_pl,
2798                                                          rec_index, true);
2799                break;
2800        case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_UNICAST_TUNNEL:
2801                mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, sfn_pl,
2802                                                          rec_index, false);
2803                break;
2804        }
2805}
2806
2807static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp,
2808                                              bool no_delay)
2809{
2810        struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
2811        unsigned int interval = no_delay ? 0 : bridge->fdb_notify.interval;
2812
2813        mlxsw_core_schedule_dw(&bridge->fdb_notify.dw,
2814                               msecs_to_jiffies(interval));
2815}
2816
2817#define MLXSW_SP_FDB_SFN_QUERIES_PER_SESSION 10
2818
2819static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
2820{
2821        struct mlxsw_sp_bridge *bridge;
2822        struct mlxsw_sp *mlxsw_sp;
2823        char *sfn_pl;
2824        int queries;
2825        u8 num_rec;
2826        int i;
2827        int err;
2828
2829        sfn_pl = kmalloc(MLXSW_REG_SFN_LEN, GFP_KERNEL);
2830        if (!sfn_pl)
2831                return;
2832
2833        bridge = container_of(work, struct mlxsw_sp_bridge, fdb_notify.dw.work);
2834        mlxsw_sp = bridge->mlxsw_sp;
2835
2836        rtnl_lock();
2837        queries = MLXSW_SP_FDB_SFN_QUERIES_PER_SESSION;
2838        while (queries > 0) {
2839                mlxsw_reg_sfn_pack(sfn_pl);
2840                err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(sfn), sfn_pl);
2841                if (err) {
2842                        dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to get FDB notifications\n");
2843                        goto out;
2844                }
2845                num_rec = mlxsw_reg_sfn_num_rec_get(sfn_pl);
2846                for (i = 0; i < num_rec; i++)
2847                        mlxsw_sp_fdb_notify_rec_process(mlxsw_sp, sfn_pl, i);
2848                if (num_rec != MLXSW_REG_SFN_REC_MAX_COUNT)
2849                        goto out;
2850                queries--;
2851        }
2852
2853out:
2854        rtnl_unlock();
2855        kfree(sfn_pl);
2856        mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp, !queries);
2857}
2858
2859struct mlxsw_sp_switchdev_event_work {
2860        struct work_struct work;
2861        union {
2862                struct switchdev_notifier_fdb_info fdb_info;
2863                struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info;
2864        };
2865        struct net_device *dev;
2866        unsigned long event;
2867};
2868
2869static void
2870mlxsw_sp_switchdev_bridge_vxlan_fdb_event(struct mlxsw_sp *mlxsw_sp,
2871                                          struct mlxsw_sp_switchdev_event_work *
2872                                          switchdev_work,
2873                                          struct mlxsw_sp_fid *fid, __be32 vni)
2874{
2875        struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info;
2876        struct switchdev_notifier_fdb_info *fdb_info;
2877        struct net_device *dev = switchdev_work->dev;
2878        enum mlxsw_sp_l3proto proto;
2879        union mlxsw_sp_l3addr addr;
2880        int err;
2881
2882        fdb_info = &switchdev_work->fdb_info;
2883        err = vxlan_fdb_find_uc(dev, fdb_info->addr, vni, &vxlan_fdb_info);
2884        if (err)
2885                return;
2886
2887        mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info.remote_ip,
2888                                              &proto, &addr);
2889
2890        switch (switchdev_work->event) {
2891        case SWITCHDEV_FDB_ADD_TO_DEVICE:
2892                err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp,
2893                                                     vxlan_fdb_info.eth_addr,
2894                                                     mlxsw_sp_fid_index(fid),
2895                                                     proto, &addr, true, false);
2896                if (err)
2897                        return;
2898                vxlan_fdb_info.offloaded = true;
2899                call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
2900                                         &vxlan_fdb_info.info, NULL);
2901                mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
2902                                            vxlan_fdb_info.eth_addr,
2903                                            fdb_info->vid, dev, true);
2904                break;
2905        case SWITCHDEV_FDB_DEL_TO_DEVICE:
2906                err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp,
2907                                                     vxlan_fdb_info.eth_addr,
2908                                                     mlxsw_sp_fid_index(fid),
2909                                                     proto, &addr, false,
2910                                                     false);
2911                vxlan_fdb_info.offloaded = false;
2912                call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
2913                                         &vxlan_fdb_info.info, NULL);
2914                break;
2915        }
2916}
2917
2918static void
2919mlxsw_sp_switchdev_bridge_nve_fdb_event(struct mlxsw_sp_switchdev_event_work *
2920                                        switchdev_work)
2921{
2922        struct mlxsw_sp_bridge_device *bridge_device;
2923        struct net_device *dev = switchdev_work->dev;
2924        struct net_device *br_dev;
2925        struct mlxsw_sp *mlxsw_sp;
2926        struct mlxsw_sp_fid *fid;
2927        __be32 vni;
2928        int err;
2929
2930        if (switchdev_work->event != SWITCHDEV_FDB_ADD_TO_DEVICE &&
2931            switchdev_work->event != SWITCHDEV_FDB_DEL_TO_DEVICE)
2932                return;
2933
2934        if (switchdev_work->event == SWITCHDEV_FDB_ADD_TO_DEVICE &&
2935            (!switchdev_work->fdb_info.added_by_user ||
2936             switchdev_work->fdb_info.is_local))
2937                return;
2938
2939        if (!netif_running(dev))
2940                return;
2941        br_dev = netdev_master_upper_dev_get(dev);
2942        if (!br_dev)
2943                return;
2944        if (!netif_is_bridge_master(br_dev))
2945                return;
2946        mlxsw_sp = mlxsw_sp_lower_get(br_dev);
2947        if (!mlxsw_sp)
2948                return;
2949        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2950        if (!bridge_device)
2951                return;
2952
2953        fid = bridge_device->ops->fid_lookup(bridge_device,
2954                                             switchdev_work->fdb_info.vid);
2955        if (!fid)
2956                return;
2957
2958        err = mlxsw_sp_fid_vni(fid, &vni);
2959        if (err)
2960                goto out;
2961
2962        mlxsw_sp_switchdev_bridge_vxlan_fdb_event(mlxsw_sp, switchdev_work, fid,
2963                                                  vni);
2964
2965out:
2966        mlxsw_sp_fid_put(fid);
2967}
2968
2969static void mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct *work)
2970{
2971        struct mlxsw_sp_switchdev_event_work *switchdev_work =
2972                container_of(work, struct mlxsw_sp_switchdev_event_work, work);
2973        struct net_device *dev = switchdev_work->dev;
2974        struct switchdev_notifier_fdb_info *fdb_info;
2975        struct mlxsw_sp_port *mlxsw_sp_port;
2976        int err;
2977
2978        rtnl_lock();
2979        if (netif_is_vxlan(dev)) {
2980                mlxsw_sp_switchdev_bridge_nve_fdb_event(switchdev_work);
2981                goto out;
2982        }
2983
2984        mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(dev);
2985        if (!mlxsw_sp_port)
2986                goto out;
2987
2988        switch (switchdev_work->event) {
2989        case SWITCHDEV_FDB_ADD_TO_DEVICE:
2990                fdb_info = &switchdev_work->fdb_info;
2991                if (!fdb_info->added_by_user || fdb_info->is_local)
2992                        break;
2993                err = mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, true);
2994                if (err)
2995                        break;
2996                mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
2997                                            fdb_info->addr,
2998                                            fdb_info->vid, dev, true);
2999                break;
3000        case SWITCHDEV_FDB_DEL_TO_DEVICE:
3001                fdb_info = &switchdev_work->fdb_info;
3002                mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false);
3003                break;
3004        case SWITCHDEV_FDB_ADD_TO_BRIDGE:
3005        case SWITCHDEV_FDB_DEL_TO_BRIDGE:
3006                /* These events are only used to potentially update an existing
3007                 * SPAN mirror.
3008                 */
3009                break;
3010        }
3011
3012        mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
3013
3014out:
3015        rtnl_unlock();
3016        kfree(switchdev_work->fdb_info.addr);
3017        kfree(switchdev_work);
3018        dev_put(dev);
3019}
3020
3021static void
3022mlxsw_sp_switchdev_vxlan_fdb_add(struct mlxsw_sp *mlxsw_sp,
3023                                 struct mlxsw_sp_switchdev_event_work *
3024                                 switchdev_work)
3025{
3026        struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3027        struct mlxsw_sp_bridge_device *bridge_device;
3028        struct net_device *dev = switchdev_work->dev;
3029        u8 all_zeros_mac[ETH_ALEN] = { 0 };
3030        enum mlxsw_sp_l3proto proto;
3031        union mlxsw_sp_l3addr addr;
3032        struct net_device *br_dev;
3033        struct mlxsw_sp_fid *fid;
3034        u16 vid;
3035        int err;
3036
3037        vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
3038        br_dev = netdev_master_upper_dev_get(dev);
3039
3040        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3041        if (!bridge_device)
3042                return;
3043
3044        fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan_fdb_info->vni);
3045        if (!fid)
3046                return;
3047
3048        mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info->remote_ip,
3049                                              &proto, &addr);
3050
3051        if (ether_addr_equal(vxlan_fdb_info->eth_addr, all_zeros_mac)) {
3052                err = mlxsw_sp_nve_flood_ip_add(mlxsw_sp, fid, proto, &addr);
3053                if (err) {
3054                        mlxsw_sp_fid_put(fid);
3055                        return;
3056                }
3057                vxlan_fdb_info->offloaded = true;
3058                call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3059                                         &vxlan_fdb_info->info, NULL);
3060                mlxsw_sp_fid_put(fid);
3061                return;
3062        }
3063
3064        /* The device has a single FDB table, whereas Linux has two - one
3065         * in the bridge driver and another in the VxLAN driver. We only
3066         * program an entry to the device if the MAC points to the VxLAN
3067         * device in the bridge's FDB table
3068         */
3069        vid = bridge_device->ops->fid_vid(bridge_device, fid);
3070        if (br_fdb_find_port(br_dev, vxlan_fdb_info->eth_addr, vid) != dev)
3071                goto err_br_fdb_find;
3072
3073        err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, vxlan_fdb_info->eth_addr,
3074                                             mlxsw_sp_fid_index(fid), proto,
3075                                             &addr, true, false);
3076        if (err)
3077                goto err_fdb_tunnel_uc_op;
3078        vxlan_fdb_info->offloaded = true;
3079        call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3080                                 &vxlan_fdb_info->info, NULL);
3081        mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3082                                    vxlan_fdb_info->eth_addr, vid, dev, true);
3083
3084        mlxsw_sp_fid_put(fid);
3085
3086        return;
3087
3088err_fdb_tunnel_uc_op:
3089err_br_fdb_find:
3090        mlxsw_sp_fid_put(fid);
3091}
3092
3093static void
3094mlxsw_sp_switchdev_vxlan_fdb_del(struct mlxsw_sp *mlxsw_sp,
3095                                 struct mlxsw_sp_switchdev_event_work *
3096                                 switchdev_work)
3097{
3098        struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3099        struct mlxsw_sp_bridge_device *bridge_device;
3100        struct net_device *dev = switchdev_work->dev;
3101        struct net_device *br_dev = netdev_master_upper_dev_get(dev);
3102        u8 all_zeros_mac[ETH_ALEN] = { 0 };
3103        enum mlxsw_sp_l3proto proto;
3104        union mlxsw_sp_l3addr addr;
3105        struct mlxsw_sp_fid *fid;
3106        u16 vid;
3107
3108        vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
3109
3110        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3111        if (!bridge_device)
3112                return;
3113
3114        fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan_fdb_info->vni);
3115        if (!fid)
3116                return;
3117
3118        mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info->remote_ip,
3119                                              &proto, &addr);
3120
3121        if (ether_addr_equal(vxlan_fdb_info->eth_addr, all_zeros_mac)) {
3122                mlxsw_sp_nve_flood_ip_del(mlxsw_sp, fid, proto, &addr);
3123                mlxsw_sp_fid_put(fid);
3124                return;
3125        }
3126
3127        mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, vxlan_fdb_info->eth_addr,
3128                                       mlxsw_sp_fid_index(fid), proto, &addr,
3129                                       false, false);
3130        vid = bridge_device->ops->fid_vid(bridge_device, fid);
3131        mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3132                                    vxlan_fdb_info->eth_addr, vid, dev, false);
3133
3134        mlxsw_sp_fid_put(fid);
3135}
3136
3137static void mlxsw_sp_switchdev_vxlan_fdb_event_work(struct work_struct *work)
3138{
3139        struct mlxsw_sp_switchdev_event_work *switchdev_work =
3140                container_of(work, struct mlxsw_sp_switchdev_event_work, work);
3141        struct net_device *dev = switchdev_work->dev;
3142        struct mlxsw_sp *mlxsw_sp;
3143        struct net_device *br_dev;
3144
3145        rtnl_lock();
3146
3147        if (!netif_running(dev))
3148                goto out;
3149        br_dev = netdev_master_upper_dev_get(dev);
3150        if (!br_dev)
3151                goto out;
3152        if (!netif_is_bridge_master(br_dev))
3153                goto out;
3154        mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3155        if (!mlxsw_sp)
3156                goto out;
3157
3158        switch (switchdev_work->event) {
3159        case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE:
3160                mlxsw_sp_switchdev_vxlan_fdb_add(mlxsw_sp, switchdev_work);
3161                break;
3162        case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE:
3163                mlxsw_sp_switchdev_vxlan_fdb_del(mlxsw_sp, switchdev_work);
3164                break;
3165        }
3166
3167out:
3168        rtnl_unlock();
3169        kfree(switchdev_work);
3170        dev_put(dev);
3171}
3172
3173static int
3174mlxsw_sp_switchdev_vxlan_work_prepare(struct mlxsw_sp_switchdev_event_work *
3175                                      switchdev_work,
3176                                      struct switchdev_notifier_info *info)
3177{
3178        struct vxlan_dev *vxlan = netdev_priv(switchdev_work->dev);
3179        struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3180        struct vxlan_config *cfg = &vxlan->cfg;
3181        struct netlink_ext_ack *extack;
3182
3183        extack = switchdev_notifier_info_to_extack(info);
3184        vxlan_fdb_info = container_of(info,
3185                                      struct switchdev_notifier_vxlan_fdb_info,
3186                                      info);
3187
3188        if (vxlan_fdb_info->remote_port != cfg->dst_port) {
3189                NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Non-default remote port is not supported");
3190                return -EOPNOTSUPP;
3191        }
3192        if (vxlan_fdb_info->remote_vni != cfg->vni ||
3193            vxlan_fdb_info->vni != cfg->vni) {
3194                NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Non-default VNI is not supported");
3195                return -EOPNOTSUPP;
3196        }
3197        if (vxlan_fdb_info->remote_ifindex) {
3198                NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Local interface is not supported");
3199                return -EOPNOTSUPP;
3200        }
3201        if (is_multicast_ether_addr(vxlan_fdb_info->eth_addr)) {
3202                NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Multicast MAC addresses not supported");
3203                return -EOPNOTSUPP;
3204        }
3205        if (vxlan_addr_multicast(&vxlan_fdb_info->remote_ip)) {
3206                NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Multicast destination IP is not supported");
3207                return -EOPNOTSUPP;
3208        }
3209
3210        switchdev_work->vxlan_fdb_info = *vxlan_fdb_info;
3211
3212        return 0;
3213}
3214
3215/* Called under rcu_read_lock() */
3216static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
3217                                    unsigned long event, void *ptr)
3218{
3219        struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
3220        struct mlxsw_sp_switchdev_event_work *switchdev_work;
3221        struct switchdev_notifier_fdb_info *fdb_info;
3222        struct switchdev_notifier_info *info = ptr;
3223        struct net_device *br_dev;
3224        int err;
3225
3226        if (event == SWITCHDEV_PORT_ATTR_SET) {
3227                err = switchdev_handle_port_attr_set(dev, ptr,
3228                                                     mlxsw_sp_port_dev_check,
3229                                                     mlxsw_sp_port_attr_set);
3230                return notifier_from_errno(err);
3231        }
3232
3233        /* Tunnel devices are not our uppers, so check their master instead */
3234        br_dev = netdev_master_upper_dev_get_rcu(dev);
3235        if (!br_dev)
3236                return NOTIFY_DONE;
3237        if (!netif_is_bridge_master(br_dev))
3238                return NOTIFY_DONE;
3239        if (!mlxsw_sp_port_dev_lower_find_rcu(br_dev))
3240                return NOTIFY_DONE;
3241
3242        switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
3243        if (!switchdev_work)
3244                return NOTIFY_BAD;
3245
3246        switchdev_work->dev = dev;
3247        switchdev_work->event = event;
3248
3249        switch (event) {
3250        case SWITCHDEV_FDB_ADD_TO_DEVICE:
3251        case SWITCHDEV_FDB_DEL_TO_DEVICE:
3252        case SWITCHDEV_FDB_ADD_TO_BRIDGE:
3253        case SWITCHDEV_FDB_DEL_TO_BRIDGE:
3254                fdb_info = container_of(info,
3255                                        struct switchdev_notifier_fdb_info,
3256                                        info);
3257                INIT_WORK(&switchdev_work->work,
3258                          mlxsw_sp_switchdev_bridge_fdb_event_work);
3259                memcpy(&switchdev_work->fdb_info, ptr,
3260                       sizeof(switchdev_work->fdb_info));
3261                switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
3262                if (!switchdev_work->fdb_info.addr)
3263                        goto err_addr_alloc;
3264                ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
3265                                fdb_info->addr);
3266                /* Take a reference on the device. This can be either
3267                 * upper device containig mlxsw_sp_port or just a
3268                 * mlxsw_sp_port
3269                 */
3270                dev_hold(dev);
3271                break;
3272        case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE:
3273        case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE:
3274                INIT_WORK(&switchdev_work->work,
3275                          mlxsw_sp_switchdev_vxlan_fdb_event_work);
3276                err = mlxsw_sp_switchdev_vxlan_work_prepare(switchdev_work,
3277                                                            info);
3278                if (err)
3279                        goto err_vxlan_work_prepare;
3280                dev_hold(dev);
3281                break;
3282        default:
3283                kfree(switchdev_work);
3284                return NOTIFY_DONE;
3285        }
3286
3287        mlxsw_core_schedule_work(&switchdev_work->work);
3288
3289        return NOTIFY_DONE;
3290
3291err_vxlan_work_prepare:
3292err_addr_alloc:
3293        kfree(switchdev_work);
3294        return NOTIFY_BAD;
3295}
3296
3297struct notifier_block mlxsw_sp_switchdev_notifier = {
3298        .notifier_call = mlxsw_sp_switchdev_event,
3299};
3300
3301static int
3302mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
3303                                  struct mlxsw_sp_bridge_device *bridge_device,
3304                                  const struct net_device *vxlan_dev, u16 vid,
3305                                  bool flag_untagged, bool flag_pvid,
3306                                  struct netlink_ext_ack *extack)
3307{
3308        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
3309        __be32 vni = vxlan->cfg.vni;
3310        struct mlxsw_sp_fid *fid;
3311        u16 old_vid;
3312        int err;
3313
3314        /* We cannot have the same VLAN as PVID and egress untagged on multiple
3315         * VxLAN devices. Note that we get this notification before the VLAN is
3316         * actually added to the bridge's database, so it is not possible for
3317         * the lookup function to return 'vxlan_dev'
3318         */
3319        if (flag_untagged && flag_pvid &&
3320            mlxsw_sp_bridge_8021q_vxlan_dev_find(bridge_device->dev, vid)) {
3321                NL_SET_ERR_MSG_MOD(extack, "VLAN already mapped to a different VNI");
3322                return -EINVAL;
3323        }
3324
3325        if (!netif_running(vxlan_dev))
3326                return 0;
3327
3328        /* First case: FID is not associated with this VNI, but the new VLAN
3329         * is both PVID and egress untagged. Need to enable NVE on the FID, if
3330         * it exists
3331         */
3332        fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vni);
3333        if (!fid) {
3334                if (!flag_untagged || !flag_pvid)
3335                        return 0;
3336                return bridge_device->ops->vxlan_join(bridge_device, vxlan_dev,
3337                                                      vid, extack);
3338        }
3339
3340        /* Second case: FID is associated with the VNI and the VLAN associated
3341         * with the FID is the same as the notified VLAN. This means the flags
3342         * (PVID / egress untagged) were toggled and that NVE should be
3343         * disabled on the FID
3344         */
3345        old_vid = mlxsw_sp_fid_8021q_vid(fid);
3346        if (vid == old_vid) {
3347                if (WARN_ON(flag_untagged && flag_pvid)) {
3348                        mlxsw_sp_fid_put(fid);
3349                        return -EINVAL;
3350                }
3351                mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3352                mlxsw_sp_fid_put(fid);
3353                return 0;
3354        }
3355
3356        /* Third case: A new VLAN was configured on the VxLAN device, but this
3357         * VLAN is not PVID, so there is nothing to do.
3358         */
3359        if (!flag_pvid) {
3360                mlxsw_sp_fid_put(fid);
3361                return 0;
3362        }
3363
3364        /* Fourth case: Thew new VLAN is PVID, which means the VLAN currently
3365         * mapped to the VNI should be unmapped
3366         */
3367        mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3368        mlxsw_sp_fid_put(fid);
3369
3370        /* Fifth case: The new VLAN is also egress untagged, which means the
3371         * VLAN needs to be mapped to the VNI
3372         */
3373        if (!flag_untagged)
3374                return 0;
3375
3376        err = bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, vid, extack);
3377        if (err)
3378                goto err_vxlan_join;
3379
3380        return 0;
3381
3382err_vxlan_join:
3383        bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, old_vid, NULL);
3384        return err;
3385}
3386
3387static void
3388mlxsw_sp_switchdev_vxlan_vlan_del(struct mlxsw_sp *mlxsw_sp,
3389                                  struct mlxsw_sp_bridge_device *bridge_device,
3390                                  const struct net_device *vxlan_dev, u16 vid)
3391{
3392        struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
3393        __be32 vni = vxlan->cfg.vni;
3394        struct mlxsw_sp_fid *fid;
3395
3396        if (!netif_running(vxlan_dev))
3397                return;
3398
3399        fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vni);
3400        if (!fid)
3401                return;
3402
3403        /* A different VLAN than the one mapped to the VNI is deleted */
3404        if (mlxsw_sp_fid_8021q_vid(fid) != vid)
3405                goto out;
3406
3407        mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3408
3409out:
3410        mlxsw_sp_fid_put(fid);
3411}
3412
3413static int
3414mlxsw_sp_switchdev_vxlan_vlans_add(struct net_device *vxlan_dev,
3415                                   struct switchdev_notifier_port_obj_info *
3416                                   port_obj_info)
3417{
3418        struct switchdev_obj_port_vlan *vlan =
3419                SWITCHDEV_OBJ_PORT_VLAN(port_obj_info->obj);
3420        bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
3421        bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
3422        struct mlxsw_sp_bridge_device *bridge_device;
3423        struct netlink_ext_ack *extack;
3424        struct mlxsw_sp *mlxsw_sp;
3425        struct net_device *br_dev;
3426
3427        extack = switchdev_notifier_info_to_extack(&port_obj_info->info);
3428        br_dev = netdev_master_upper_dev_get(vxlan_dev);
3429        if (!br_dev)
3430                return 0;
3431
3432        mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3433        if (!mlxsw_sp)
3434                return 0;
3435
3436        port_obj_info->handled = true;
3437
3438        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3439        if (!bridge_device)
3440                return -EINVAL;
3441
3442        if (!bridge_device->vlan_enabled)
3443                return 0;
3444
3445        return mlxsw_sp_switchdev_vxlan_vlan_add(mlxsw_sp, bridge_device,
3446                                                 vxlan_dev, vlan->vid,
3447                                                 flag_untagged,
3448                                                 flag_pvid, extack);
3449}
3450
3451static void
3452mlxsw_sp_switchdev_vxlan_vlans_del(struct net_device *vxlan_dev,
3453                                   struct switchdev_notifier_port_obj_info *
3454                                   port_obj_info)
3455{
3456        struct switchdev_obj_port_vlan *vlan =
3457                SWITCHDEV_OBJ_PORT_VLAN(port_obj_info->obj);
3458        struct mlxsw_sp_bridge_device *bridge_device;
3459        struct mlxsw_sp *mlxsw_sp;
3460        struct net_device *br_dev;
3461
3462        br_dev = netdev_master_upper_dev_get(vxlan_dev);
3463        if (!br_dev)
3464                return;
3465
3466        mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3467        if (!mlxsw_sp)
3468                return;
3469
3470        port_obj_info->handled = true;
3471
3472        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3473        if (!bridge_device)
3474                return;
3475
3476        if (!bridge_device->vlan_enabled)
3477                return;
3478
3479        mlxsw_sp_switchdev_vxlan_vlan_del(mlxsw_sp, bridge_device, vxlan_dev,
3480                                          vlan->vid);
3481}
3482
3483static int
3484mlxsw_sp_switchdev_handle_vxlan_obj_add(struct net_device *vxlan_dev,
3485                                        struct switchdev_notifier_port_obj_info *
3486                                        port_obj_info)
3487{
3488        int err = 0;
3489
3490        switch (port_obj_info->obj->id) {
3491        case SWITCHDEV_OBJ_ID_PORT_VLAN:
3492                err = mlxsw_sp_switchdev_vxlan_vlans_add(vxlan_dev,
3493                                                         port_obj_info);
3494                break;
3495        default:
3496                break;
3497        }
3498
3499        return err;
3500}
3501
3502static void
3503mlxsw_sp_switchdev_handle_vxlan_obj_del(struct net_device *vxlan_dev,
3504                                        struct switchdev_notifier_port_obj_info *
3505                                        port_obj_info)
3506{
3507        switch (port_obj_info->obj->id) {
3508        case SWITCHDEV_OBJ_ID_PORT_VLAN:
3509                mlxsw_sp_switchdev_vxlan_vlans_del(vxlan_dev, port_obj_info);
3510                break;
3511        default:
3512                break;
3513        }
3514}
3515
3516static int mlxsw_sp_switchdev_blocking_event(struct notifier_block *unused,
3517                                             unsigned long event, void *ptr)
3518{
3519        struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
3520        int err = 0;
3521
3522        switch (event) {
3523        case SWITCHDEV_PORT_OBJ_ADD:
3524                if (netif_is_vxlan(dev))
3525                        err = mlxsw_sp_switchdev_handle_vxlan_obj_add(dev, ptr);
3526                else
3527                        err = switchdev_handle_port_obj_add(dev, ptr,
3528                                                        mlxsw_sp_port_dev_check,
3529                                                        mlxsw_sp_port_obj_add);
3530                return notifier_from_errno(err);
3531        case SWITCHDEV_PORT_OBJ_DEL:
3532                if (netif_is_vxlan(dev))
3533                        mlxsw_sp_switchdev_handle_vxlan_obj_del(dev, ptr);
3534                else
3535                        err = switchdev_handle_port_obj_del(dev, ptr,
3536                                                        mlxsw_sp_port_dev_check,
3537                                                        mlxsw_sp_port_obj_del);
3538                return notifier_from_errno(err);
3539        case SWITCHDEV_PORT_ATTR_SET:
3540                err = switchdev_handle_port_attr_set(dev, ptr,
3541                                                     mlxsw_sp_port_dev_check,
3542                                                     mlxsw_sp_port_attr_set);
3543                return notifier_from_errno(err);
3544        }
3545
3546        return NOTIFY_DONE;
3547}
3548
3549static struct notifier_block mlxsw_sp_switchdev_blocking_notifier = {
3550        .notifier_call = mlxsw_sp_switchdev_blocking_event,
3551};
3552
3553u8
3554mlxsw_sp_bridge_port_stp_state(struct mlxsw_sp_bridge_port *bridge_port)
3555{
3556        return bridge_port->stp_state;
3557}
3558
3559static int mlxsw_sp_fdb_init(struct mlxsw_sp *mlxsw_sp)
3560{
3561        struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
3562        struct notifier_block *nb;
3563        int err;
3564
3565        err = mlxsw_sp_ageing_set(mlxsw_sp, MLXSW_SP_DEFAULT_AGEING_TIME);
3566        if (err) {
3567                dev_err(mlxsw_sp->bus_info->dev, "Failed to set default ageing time\n");
3568                return err;
3569        }
3570
3571        err = register_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
3572        if (err) {
3573                dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev notifier\n");
3574                return err;
3575        }
3576
3577        nb = &mlxsw_sp_switchdev_blocking_notifier;
3578        err = register_switchdev_blocking_notifier(nb);
3579        if (err) {
3580                dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev blocking notifier\n");
3581                goto err_register_switchdev_blocking_notifier;
3582        }
3583
3584        INIT_DELAYED_WORK(&bridge->fdb_notify.dw, mlxsw_sp_fdb_notify_work);
3585        bridge->fdb_notify.interval = MLXSW_SP_DEFAULT_LEARNING_INTERVAL;
3586        mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp, false);
3587        return 0;
3588
3589err_register_switchdev_blocking_notifier:
3590        unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
3591        return err;
3592}
3593
3594static void mlxsw_sp_fdb_fini(struct mlxsw_sp *mlxsw_sp)
3595{
3596        struct notifier_block *nb;
3597
3598        cancel_delayed_work_sync(&mlxsw_sp->bridge->fdb_notify.dw);
3599
3600        nb = &mlxsw_sp_switchdev_blocking_notifier;
3601        unregister_switchdev_blocking_notifier(nb);
3602
3603        unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
3604}
3605
3606static void mlxsw_sp1_switchdev_init(struct mlxsw_sp *mlxsw_sp)
3607{
3608        mlxsw_sp->bridge->bridge_8021ad_ops = &mlxsw_sp1_bridge_8021ad_ops;
3609}
3610
3611const struct mlxsw_sp_switchdev_ops mlxsw_sp1_switchdev_ops = {
3612        .init   = mlxsw_sp1_switchdev_init,
3613};
3614
3615static void mlxsw_sp2_switchdev_init(struct mlxsw_sp *mlxsw_sp)
3616{
3617        mlxsw_sp->bridge->bridge_8021ad_ops = &mlxsw_sp2_bridge_8021ad_ops;
3618}
3619
3620const struct mlxsw_sp_switchdev_ops mlxsw_sp2_switchdev_ops = {
3621        .init   = mlxsw_sp2_switchdev_init,
3622};
3623
3624int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
3625{
3626        struct mlxsw_sp_bridge *bridge;
3627
3628        bridge = kzalloc(sizeof(*mlxsw_sp->bridge), GFP_KERNEL);
3629        if (!bridge)
3630                return -ENOMEM;
3631        mlxsw_sp->bridge = bridge;
3632        bridge->mlxsw_sp = mlxsw_sp;
3633
3634        INIT_LIST_HEAD(&mlxsw_sp->bridge->bridges_list);
3635
3636        bridge->bridge_8021q_ops = &mlxsw_sp_bridge_8021q_ops;
3637        bridge->bridge_8021d_ops = &mlxsw_sp_bridge_8021d_ops;
3638
3639        mlxsw_sp->switchdev_ops->init(mlxsw_sp);
3640
3641        return mlxsw_sp_fdb_init(mlxsw_sp);
3642}
3643
3644void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
3645{
3646        mlxsw_sp_fdb_fini(mlxsw_sp);
3647        WARN_ON(!list_empty(&mlxsw_sp->bridge->bridges_list));
3648        kfree(mlxsw_sp->bridge);
3649}
3650
3651