linux/drivers/net/ethernet/mscc/ocelot_net.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
   2/* Microsemi Ocelot Switch driver
   3 *
   4 * This contains glue logic between the switchdev driver operations and the
   5 * mscc_ocelot_switch_lib.
   6 *
   7 * Copyright (c) 2017, 2019 Microsemi Corporation
   8 * Copyright 2020-2021 NXP Semiconductors
   9 */
  10
  11#include <linux/if_bridge.h>
  12#include <net/pkt_cls.h>
  13#include "ocelot.h"
  14#include "ocelot_vcap.h"
  15
  16static struct ocelot *devlink_port_to_ocelot(struct devlink_port *dlp)
  17{
  18        return devlink_priv(dlp->devlink);
  19}
  20
  21static int devlink_port_to_port(struct devlink_port *dlp)
  22{
  23        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
  24
  25        return dlp - ocelot->devlink_ports;
  26}
  27
  28static int ocelot_devlink_sb_pool_get(struct devlink *dl,
  29                                      unsigned int sb_index, u16 pool_index,
  30                                      struct devlink_sb_pool_info *pool_info)
  31{
  32        struct ocelot *ocelot = devlink_priv(dl);
  33
  34        return ocelot_sb_pool_get(ocelot, sb_index, pool_index, pool_info);
  35}
  36
  37static int ocelot_devlink_sb_pool_set(struct devlink *dl, unsigned int sb_index,
  38                                      u16 pool_index, u32 size,
  39                                      enum devlink_sb_threshold_type threshold_type,
  40                                      struct netlink_ext_ack *extack)
  41{
  42        struct ocelot *ocelot = devlink_priv(dl);
  43
  44        return ocelot_sb_pool_set(ocelot, sb_index, pool_index, size,
  45                                  threshold_type, extack);
  46}
  47
  48static int ocelot_devlink_sb_port_pool_get(struct devlink_port *dlp,
  49                                           unsigned int sb_index, u16 pool_index,
  50                                           u32 *p_threshold)
  51{
  52        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
  53        int port = devlink_port_to_port(dlp);
  54
  55        return ocelot_sb_port_pool_get(ocelot, port, sb_index, pool_index,
  56                                       p_threshold);
  57}
  58
  59static int ocelot_devlink_sb_port_pool_set(struct devlink_port *dlp,
  60                                           unsigned int sb_index, u16 pool_index,
  61                                           u32 threshold,
  62                                           struct netlink_ext_ack *extack)
  63{
  64        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
  65        int port = devlink_port_to_port(dlp);
  66
  67        return ocelot_sb_port_pool_set(ocelot, port, sb_index, pool_index,
  68                                       threshold, extack);
  69}
  70
  71static int
  72ocelot_devlink_sb_tc_pool_bind_get(struct devlink_port *dlp,
  73                                   unsigned int sb_index, u16 tc_index,
  74                                   enum devlink_sb_pool_type pool_type,
  75                                   u16 *p_pool_index, u32 *p_threshold)
  76{
  77        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
  78        int port = devlink_port_to_port(dlp);
  79
  80        return ocelot_sb_tc_pool_bind_get(ocelot, port, sb_index, tc_index,
  81                                          pool_type, p_pool_index,
  82                                          p_threshold);
  83}
  84
  85static int
  86ocelot_devlink_sb_tc_pool_bind_set(struct devlink_port *dlp,
  87                                   unsigned int sb_index, u16 tc_index,
  88                                   enum devlink_sb_pool_type pool_type,
  89                                   u16 pool_index, u32 threshold,
  90                                   struct netlink_ext_ack *extack)
  91{
  92        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
  93        int port = devlink_port_to_port(dlp);
  94
  95        return ocelot_sb_tc_pool_bind_set(ocelot, port, sb_index, tc_index,
  96                                          pool_type, pool_index, threshold,
  97                                          extack);
  98}
  99
 100static int ocelot_devlink_sb_occ_snapshot(struct devlink *dl,
 101                                          unsigned int sb_index)
 102{
 103        struct ocelot *ocelot = devlink_priv(dl);
 104
 105        return ocelot_sb_occ_snapshot(ocelot, sb_index);
 106}
 107
 108static int ocelot_devlink_sb_occ_max_clear(struct devlink *dl,
 109                                           unsigned int sb_index)
 110{
 111        struct ocelot *ocelot = devlink_priv(dl);
 112
 113        return ocelot_sb_occ_max_clear(ocelot, sb_index);
 114}
 115
 116static int ocelot_devlink_sb_occ_port_pool_get(struct devlink_port *dlp,
 117                                               unsigned int sb_index,
 118                                               u16 pool_index, u32 *p_cur,
 119                                               u32 *p_max)
 120{
 121        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
 122        int port = devlink_port_to_port(dlp);
 123
 124        return ocelot_sb_occ_port_pool_get(ocelot, port, sb_index, pool_index,
 125                                           p_cur, p_max);
 126}
 127
 128static int
 129ocelot_devlink_sb_occ_tc_port_bind_get(struct devlink_port *dlp,
 130                                       unsigned int sb_index, u16 tc_index,
 131                                       enum devlink_sb_pool_type pool_type,
 132                                       u32 *p_cur, u32 *p_max)
 133{
 134        struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
 135        int port = devlink_port_to_port(dlp);
 136
 137        return ocelot_sb_occ_tc_port_bind_get(ocelot, port, sb_index,
 138                                              tc_index, pool_type,
 139                                              p_cur, p_max);
 140}
 141
 142const struct devlink_ops ocelot_devlink_ops = {
 143        .sb_pool_get                    = ocelot_devlink_sb_pool_get,
 144        .sb_pool_set                    = ocelot_devlink_sb_pool_set,
 145        .sb_port_pool_get               = ocelot_devlink_sb_port_pool_get,
 146        .sb_port_pool_set               = ocelot_devlink_sb_port_pool_set,
 147        .sb_tc_pool_bind_get            = ocelot_devlink_sb_tc_pool_bind_get,
 148        .sb_tc_pool_bind_set            = ocelot_devlink_sb_tc_pool_bind_set,
 149        .sb_occ_snapshot                = ocelot_devlink_sb_occ_snapshot,
 150        .sb_occ_max_clear               = ocelot_devlink_sb_occ_max_clear,
 151        .sb_occ_port_pool_get           = ocelot_devlink_sb_occ_port_pool_get,
 152        .sb_occ_tc_port_bind_get        = ocelot_devlink_sb_occ_tc_port_bind_get,
 153};
 154
 155int ocelot_port_devlink_init(struct ocelot *ocelot, int port,
 156                             enum devlink_port_flavour flavour)
 157{
 158        struct devlink_port *dlp = &ocelot->devlink_ports[port];
 159        int id_len = sizeof(ocelot->base_mac);
 160        struct devlink *dl = ocelot->devlink;
 161        struct devlink_port_attrs attrs = {};
 162
 163        memcpy(attrs.switch_id.id, &ocelot->base_mac, id_len);
 164        attrs.switch_id.id_len = id_len;
 165        attrs.phys.port_number = port;
 166        attrs.flavour = flavour;
 167
 168        devlink_port_attrs_set(dlp, &attrs);
 169
 170        return devlink_port_register(dl, dlp, port);
 171}
 172
 173void ocelot_port_devlink_teardown(struct ocelot *ocelot, int port)
 174{
 175        struct devlink_port *dlp = &ocelot->devlink_ports[port];
 176
 177        devlink_port_unregister(dlp);
 178}
 179
 180static struct devlink_port *ocelot_get_devlink_port(struct net_device *dev)
 181{
 182        struct ocelot_port_private *priv = netdev_priv(dev);
 183        struct ocelot *ocelot = priv->port.ocelot;
 184        int port = priv->chip_port;
 185
 186        return &ocelot->devlink_ports[port];
 187}
 188
 189int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv,
 190                               struct flow_cls_offload *f,
 191                               bool ingress)
 192{
 193        struct ocelot *ocelot = priv->port.ocelot;
 194        int port = priv->chip_port;
 195
 196        if (!ingress)
 197                return -EOPNOTSUPP;
 198
 199        switch (f->command) {
 200        case FLOW_CLS_REPLACE:
 201                return ocelot_cls_flower_replace(ocelot, port, f, ingress);
 202        case FLOW_CLS_DESTROY:
 203                return ocelot_cls_flower_destroy(ocelot, port, f, ingress);
 204        case FLOW_CLS_STATS:
 205                return ocelot_cls_flower_stats(ocelot, port, f, ingress);
 206        default:
 207                return -EOPNOTSUPP;
 208        }
 209}
 210
 211static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
 212                                        struct tc_cls_matchall_offload *f,
 213                                        bool ingress)
 214{
 215        struct netlink_ext_ack *extack = f->common.extack;
 216        struct ocelot *ocelot = priv->port.ocelot;
 217        struct ocelot_policer pol = { 0 };
 218        struct flow_action_entry *action;
 219        int port = priv->chip_port;
 220        int err;
 221
 222        if (!ingress) {
 223                NL_SET_ERR_MSG_MOD(extack, "Only ingress is supported");
 224                return -EOPNOTSUPP;
 225        }
 226
 227        switch (f->command) {
 228        case TC_CLSMATCHALL_REPLACE:
 229                if (!flow_offload_has_one_action(&f->rule->action)) {
 230                        NL_SET_ERR_MSG_MOD(extack,
 231                                           "Only one action is supported");
 232                        return -EOPNOTSUPP;
 233                }
 234
 235                if (priv->tc.block_shared) {
 236                        NL_SET_ERR_MSG_MOD(extack,
 237                                           "Rate limit is not supported on shared blocks");
 238                        return -EOPNOTSUPP;
 239                }
 240
 241                action = &f->rule->action.entries[0];
 242
 243                if (action->id != FLOW_ACTION_POLICE) {
 244                        NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
 245                        return -EOPNOTSUPP;
 246                }
 247
 248                if (priv->tc.police_id && priv->tc.police_id != f->cookie) {
 249                        NL_SET_ERR_MSG_MOD(extack,
 250                                           "Only one policer per port is supported");
 251                        return -EEXIST;
 252                }
 253
 254                if (action->police.rate_pkt_ps) {
 255                        NL_SET_ERR_MSG_MOD(extack,
 256                                           "QoS offload not support packets per second");
 257                        return -EOPNOTSUPP;
 258                }
 259
 260                pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8;
 261                pol.burst = action->police.burst;
 262
 263                err = ocelot_port_policer_add(ocelot, port, &pol);
 264                if (err) {
 265                        NL_SET_ERR_MSG_MOD(extack, "Could not add policer");
 266                        return err;
 267                }
 268
 269                priv->tc.police_id = f->cookie;
 270                priv->tc.offload_cnt++;
 271                return 0;
 272        case TC_CLSMATCHALL_DESTROY:
 273                if (priv->tc.police_id != f->cookie)
 274                        return -ENOENT;
 275
 276                err = ocelot_port_policer_del(ocelot, port);
 277                if (err) {
 278                        NL_SET_ERR_MSG_MOD(extack,
 279                                           "Could not delete policer");
 280                        return err;
 281                }
 282                priv->tc.police_id = 0;
 283                priv->tc.offload_cnt--;
 284                return 0;
 285        case TC_CLSMATCHALL_STATS:
 286        default:
 287                return -EOPNOTSUPP;
 288        }
 289}
 290
 291static int ocelot_setup_tc_block_cb(enum tc_setup_type type,
 292                                    void *type_data,
 293                                    void *cb_priv, bool ingress)
 294{
 295        struct ocelot_port_private *priv = cb_priv;
 296
 297        if (!tc_cls_can_offload_and_chain0(priv->dev, type_data))
 298                return -EOPNOTSUPP;
 299
 300        switch (type) {
 301        case TC_SETUP_CLSMATCHALL:
 302                return ocelot_setup_tc_cls_matchall(priv, type_data, ingress);
 303        case TC_SETUP_CLSFLOWER:
 304                return ocelot_setup_tc_cls_flower(priv, type_data, ingress);
 305        default:
 306                return -EOPNOTSUPP;
 307        }
 308}
 309
 310static int ocelot_setup_tc_block_cb_ig(enum tc_setup_type type,
 311                                       void *type_data,
 312                                       void *cb_priv)
 313{
 314        return ocelot_setup_tc_block_cb(type, type_data,
 315                                        cb_priv, true);
 316}
 317
 318static int ocelot_setup_tc_block_cb_eg(enum tc_setup_type type,
 319                                       void *type_data,
 320                                       void *cb_priv)
 321{
 322        return ocelot_setup_tc_block_cb(type, type_data,
 323                                        cb_priv, false);
 324}
 325
 326static LIST_HEAD(ocelot_block_cb_list);
 327
 328static int ocelot_setup_tc_block(struct ocelot_port_private *priv,
 329                                 struct flow_block_offload *f)
 330{
 331        struct flow_block_cb *block_cb;
 332        flow_setup_cb_t *cb;
 333
 334        if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) {
 335                cb = ocelot_setup_tc_block_cb_ig;
 336                priv->tc.block_shared = f->block_shared;
 337        } else if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS) {
 338                cb = ocelot_setup_tc_block_cb_eg;
 339        } else {
 340                return -EOPNOTSUPP;
 341        }
 342
 343        f->driver_block_list = &ocelot_block_cb_list;
 344
 345        switch (f->command) {
 346        case FLOW_BLOCK_BIND:
 347                if (flow_block_cb_is_busy(cb, priv, &ocelot_block_cb_list))
 348                        return -EBUSY;
 349
 350                block_cb = flow_block_cb_alloc(cb, priv, priv, NULL);
 351                if (IS_ERR(block_cb))
 352                        return PTR_ERR(block_cb);
 353
 354                flow_block_cb_add(block_cb, f);
 355                list_add_tail(&block_cb->driver_list, f->driver_block_list);
 356                return 0;
 357        case FLOW_BLOCK_UNBIND:
 358                block_cb = flow_block_cb_lookup(f->block, cb, priv);
 359                if (!block_cb)
 360                        return -ENOENT;
 361
 362                flow_block_cb_remove(block_cb, f);
 363                list_del(&block_cb->driver_list);
 364                return 0;
 365        default:
 366                return -EOPNOTSUPP;
 367        }
 368}
 369
 370static int ocelot_setup_tc(struct net_device *dev, enum tc_setup_type type,
 371                           void *type_data)
 372{
 373        struct ocelot_port_private *priv = netdev_priv(dev);
 374
 375        switch (type) {
 376        case TC_SETUP_BLOCK:
 377                return ocelot_setup_tc_block(priv, type_data);
 378        default:
 379                return -EOPNOTSUPP;
 380        }
 381        return 0;
 382}
 383
 384static void ocelot_port_adjust_link(struct net_device *dev)
 385{
 386        struct ocelot_port_private *priv = netdev_priv(dev);
 387        struct ocelot *ocelot = priv->port.ocelot;
 388        int port = priv->chip_port;
 389
 390        ocelot_adjust_link(ocelot, port, dev->phydev);
 391}
 392
 393static int ocelot_vlan_vid_prepare(struct net_device *dev, u16 vid, bool pvid,
 394                                   bool untagged)
 395{
 396        struct ocelot_port_private *priv = netdev_priv(dev);
 397        struct ocelot_port *ocelot_port = &priv->port;
 398        struct ocelot *ocelot = ocelot_port->ocelot;
 399        int port = priv->chip_port;
 400
 401        return ocelot_vlan_prepare(ocelot, port, vid, pvid, untagged);
 402}
 403
 404static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid,
 405                               bool untagged)
 406{
 407        struct ocelot_port_private *priv = netdev_priv(dev);
 408        struct ocelot_port *ocelot_port = &priv->port;
 409        struct ocelot *ocelot = ocelot_port->ocelot;
 410        int port = priv->chip_port;
 411        int ret;
 412
 413        ret = ocelot_vlan_add(ocelot, port, vid, pvid, untagged);
 414        if (ret)
 415                return ret;
 416
 417        /* Add the port MAC address to with the right VLAN information */
 418        ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr, vid,
 419                          ENTRYTYPE_LOCKED);
 420
 421        return 0;
 422}
 423
 424static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid)
 425{
 426        struct ocelot_port_private *priv = netdev_priv(dev);
 427        struct ocelot *ocelot = priv->port.ocelot;
 428        int port = priv->chip_port;
 429        int ret;
 430
 431        /* 8021q removes VID 0 on module unload for all interfaces
 432         * with VLAN filtering feature. We need to keep it to receive
 433         * untagged traffic.
 434         */
 435        if (vid == 0)
 436                return 0;
 437
 438        ret = ocelot_vlan_del(ocelot, port, vid);
 439        if (ret)
 440                return ret;
 441
 442        /* Del the port MAC address to with the right VLAN information */
 443        ocelot_mact_forget(ocelot, dev->dev_addr, vid);
 444
 445        return 0;
 446}
 447
 448static int ocelot_port_open(struct net_device *dev)
 449{
 450        struct ocelot_port_private *priv = netdev_priv(dev);
 451        struct ocelot_port *ocelot_port = &priv->port;
 452        struct ocelot *ocelot = ocelot_port->ocelot;
 453        int port = priv->chip_port;
 454        int err;
 455
 456        if (priv->serdes) {
 457                err = phy_set_mode_ext(priv->serdes, PHY_MODE_ETHERNET,
 458                                       ocelot_port->phy_mode);
 459                if (err) {
 460                        netdev_err(dev, "Could not set mode of SerDes\n");
 461                        return err;
 462                }
 463        }
 464
 465        err = phy_connect_direct(dev, priv->phy, &ocelot_port_adjust_link,
 466                                 ocelot_port->phy_mode);
 467        if (err) {
 468                netdev_err(dev, "Could not attach to PHY\n");
 469                return err;
 470        }
 471
 472        dev->phydev = priv->phy;
 473
 474        phy_attached_info(priv->phy);
 475        phy_start(priv->phy);
 476
 477        ocelot_port_enable(ocelot, port, priv->phy);
 478
 479        return 0;
 480}
 481
 482static int ocelot_port_stop(struct net_device *dev)
 483{
 484        struct ocelot_port_private *priv = netdev_priv(dev);
 485        struct ocelot *ocelot = priv->port.ocelot;
 486        int port = priv->chip_port;
 487
 488        phy_disconnect(priv->phy);
 489
 490        dev->phydev = NULL;
 491
 492        ocelot_port_disable(ocelot, port);
 493
 494        return 0;
 495}
 496
 497static netdev_tx_t ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev)
 498{
 499        struct ocelot_port_private *priv = netdev_priv(dev);
 500        struct ocelot_port *ocelot_port = &priv->port;
 501        struct ocelot *ocelot = ocelot_port->ocelot;
 502        int port = priv->chip_port;
 503        u32 rew_op = 0;
 504
 505        if (!ocelot_can_inject(ocelot, 0))
 506                return NETDEV_TX_BUSY;
 507
 508        /* Check if timestamping is needed */
 509        if (ocelot->ptp && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
 510                struct sk_buff *clone = NULL;
 511
 512                if (ocelot_port_txtstamp_request(ocelot, port, skb, &clone)) {
 513                        kfree_skb(skb);
 514                        return NETDEV_TX_OK;
 515                }
 516
 517                if (clone)
 518                        OCELOT_SKB_CB(skb)->clone = clone;
 519
 520                rew_op = ocelot_ptp_rew_op(skb);
 521        }
 522
 523        ocelot_port_inject_frame(ocelot, port, 0, rew_op, skb);
 524
 525        kfree_skb(skb);
 526
 527        return NETDEV_TX_OK;
 528}
 529
 530enum ocelot_action_type {
 531        OCELOT_MACT_LEARN,
 532        OCELOT_MACT_FORGET,
 533};
 534
 535struct ocelot_mact_work_ctx {
 536        struct work_struct work;
 537        struct ocelot *ocelot;
 538        enum ocelot_action_type type;
 539        union {
 540                /* OCELOT_MACT_LEARN */
 541                struct {
 542                        unsigned char addr[ETH_ALEN];
 543                        u16 vid;
 544                        enum macaccess_entry_type entry_type;
 545                        int pgid;
 546                } learn;
 547                /* OCELOT_MACT_FORGET */
 548                struct {
 549                        unsigned char addr[ETH_ALEN];
 550                        u16 vid;
 551                } forget;
 552        };
 553};
 554
 555#define ocelot_work_to_ctx(x) \
 556        container_of((x), struct ocelot_mact_work_ctx, work)
 557
 558static void ocelot_mact_work(struct work_struct *work)
 559{
 560        struct ocelot_mact_work_ctx *w = ocelot_work_to_ctx(work);
 561        struct ocelot *ocelot = w->ocelot;
 562
 563        switch (w->type) {
 564        case OCELOT_MACT_LEARN:
 565                ocelot_mact_learn(ocelot, w->learn.pgid, w->learn.addr,
 566                                  w->learn.vid, w->learn.entry_type);
 567                break;
 568        case OCELOT_MACT_FORGET:
 569                ocelot_mact_forget(ocelot, w->forget.addr, w->forget.vid);
 570                break;
 571        default:
 572                break;
 573        }
 574
 575        kfree(w);
 576}
 577
 578static int ocelot_enqueue_mact_action(struct ocelot *ocelot,
 579                                      const struct ocelot_mact_work_ctx *ctx)
 580{
 581        struct ocelot_mact_work_ctx *w = kmemdup(ctx, sizeof(*w), GFP_ATOMIC);
 582
 583        if (!w)
 584                return -ENOMEM;
 585
 586        w->ocelot = ocelot;
 587        INIT_WORK(&w->work, ocelot_mact_work);
 588        queue_work(ocelot->owq, &w->work);
 589
 590        return 0;
 591}
 592
 593static int ocelot_mc_unsync(struct net_device *dev, const unsigned char *addr)
 594{
 595        struct ocelot_port_private *priv = netdev_priv(dev);
 596        struct ocelot_port *ocelot_port = &priv->port;
 597        struct ocelot *ocelot = ocelot_port->ocelot;
 598        struct ocelot_mact_work_ctx w;
 599
 600        ether_addr_copy(w.forget.addr, addr);
 601        w.forget.vid = ocelot_port->pvid_vlan.vid;
 602        w.type = OCELOT_MACT_FORGET;
 603
 604        return ocelot_enqueue_mact_action(ocelot, &w);
 605}
 606
 607static int ocelot_mc_sync(struct net_device *dev, const unsigned char *addr)
 608{
 609        struct ocelot_port_private *priv = netdev_priv(dev);
 610        struct ocelot_port *ocelot_port = &priv->port;
 611        struct ocelot *ocelot = ocelot_port->ocelot;
 612        struct ocelot_mact_work_ctx w;
 613
 614        ether_addr_copy(w.learn.addr, addr);
 615        w.learn.vid = ocelot_port->pvid_vlan.vid;
 616        w.learn.pgid = PGID_CPU;
 617        w.learn.entry_type = ENTRYTYPE_LOCKED;
 618        w.type = OCELOT_MACT_LEARN;
 619
 620        return ocelot_enqueue_mact_action(ocelot, &w);
 621}
 622
 623static void ocelot_set_rx_mode(struct net_device *dev)
 624{
 625        struct ocelot_port_private *priv = netdev_priv(dev);
 626        struct ocelot *ocelot = priv->port.ocelot;
 627        u32 val;
 628        int i;
 629
 630        /* This doesn't handle promiscuous mode because the bridge core is
 631         * setting IFF_PROMISC on all slave interfaces and all frames would be
 632         * forwarded to the CPU port.
 633         */
 634        val = GENMASK(ocelot->num_phys_ports - 1, 0);
 635        for_each_nonreserved_multicast_dest_pgid(ocelot, i)
 636                ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i);
 637
 638        __dev_mc_sync(dev, ocelot_mc_sync, ocelot_mc_unsync);
 639}
 640
 641static int ocelot_port_set_mac_address(struct net_device *dev, void *p)
 642{
 643        struct ocelot_port_private *priv = netdev_priv(dev);
 644        struct ocelot_port *ocelot_port = &priv->port;
 645        struct ocelot *ocelot = ocelot_port->ocelot;
 646        const struct sockaddr *addr = p;
 647
 648        /* Learn the new net device MAC address in the mac table. */
 649        ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data,
 650                          ocelot_port->pvid_vlan.vid, ENTRYTYPE_LOCKED);
 651        /* Then forget the previous one. */
 652        ocelot_mact_forget(ocelot, dev->dev_addr, ocelot_port->pvid_vlan.vid);
 653
 654        ether_addr_copy(dev->dev_addr, addr->sa_data);
 655        return 0;
 656}
 657
 658static void ocelot_get_stats64(struct net_device *dev,
 659                               struct rtnl_link_stats64 *stats)
 660{
 661        struct ocelot_port_private *priv = netdev_priv(dev);
 662        struct ocelot *ocelot = priv->port.ocelot;
 663        int port = priv->chip_port;
 664
 665        /* Configure the port to read the stats from */
 666        ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port),
 667                     SYS_STAT_CFG);
 668
 669        /* Get Rx stats */
 670        stats->rx_bytes = ocelot_read(ocelot, SYS_COUNT_RX_OCTETS);
 671        stats->rx_packets = ocelot_read(ocelot, SYS_COUNT_RX_SHORTS) +
 672                            ocelot_read(ocelot, SYS_COUNT_RX_FRAGMENTS) +
 673                            ocelot_read(ocelot, SYS_COUNT_RX_JABBERS) +
 674                            ocelot_read(ocelot, SYS_COUNT_RX_LONGS) +
 675                            ocelot_read(ocelot, SYS_COUNT_RX_64) +
 676                            ocelot_read(ocelot, SYS_COUNT_RX_65_127) +
 677                            ocelot_read(ocelot, SYS_COUNT_RX_128_255) +
 678                            ocelot_read(ocelot, SYS_COUNT_RX_256_1023) +
 679                            ocelot_read(ocelot, SYS_COUNT_RX_1024_1526) +
 680                            ocelot_read(ocelot, SYS_COUNT_RX_1527_MAX);
 681        stats->multicast = ocelot_read(ocelot, SYS_COUNT_RX_MULTICAST);
 682        stats->rx_dropped = dev->stats.rx_dropped;
 683
 684        /* Get Tx stats */
 685        stats->tx_bytes = ocelot_read(ocelot, SYS_COUNT_TX_OCTETS);
 686        stats->tx_packets = ocelot_read(ocelot, SYS_COUNT_TX_64) +
 687                            ocelot_read(ocelot, SYS_COUNT_TX_65_127) +
 688                            ocelot_read(ocelot, SYS_COUNT_TX_128_511) +
 689                            ocelot_read(ocelot, SYS_COUNT_TX_512_1023) +
 690                            ocelot_read(ocelot, SYS_COUNT_TX_1024_1526) +
 691                            ocelot_read(ocelot, SYS_COUNT_TX_1527_MAX);
 692        stats->tx_dropped = ocelot_read(ocelot, SYS_COUNT_TX_DROPS) +
 693                            ocelot_read(ocelot, SYS_COUNT_TX_AGING);
 694        stats->collisions = ocelot_read(ocelot, SYS_COUNT_TX_COLLISION);
 695}
 696
 697static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
 698                               struct net_device *dev,
 699                               const unsigned char *addr,
 700                               u16 vid, u16 flags,
 701                               struct netlink_ext_ack *extack)
 702{
 703        struct ocelot_port_private *priv = netdev_priv(dev);
 704        struct ocelot *ocelot = priv->port.ocelot;
 705        int port = priv->chip_port;
 706
 707        return ocelot_fdb_add(ocelot, port, addr, vid);
 708}
 709
 710static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
 711                               struct net_device *dev,
 712                               const unsigned char *addr, u16 vid)
 713{
 714        struct ocelot_port_private *priv = netdev_priv(dev);
 715        struct ocelot *ocelot = priv->port.ocelot;
 716        int port = priv->chip_port;
 717
 718        return ocelot_fdb_del(ocelot, port, addr, vid);
 719}
 720
 721static int ocelot_port_fdb_dump(struct sk_buff *skb,
 722                                struct netlink_callback *cb,
 723                                struct net_device *dev,
 724                                struct net_device *filter_dev, int *idx)
 725{
 726        struct ocelot_port_private *priv = netdev_priv(dev);
 727        struct ocelot *ocelot = priv->port.ocelot;
 728        struct ocelot_dump_ctx dump = {
 729                .dev = dev,
 730                .skb = skb,
 731                .cb = cb,
 732                .idx = *idx,
 733        };
 734        int port = priv->chip_port;
 735        int ret;
 736
 737        ret = ocelot_fdb_dump(ocelot, port, ocelot_port_fdb_do_dump, &dump);
 738
 739        *idx = dump.idx;
 740
 741        return ret;
 742}
 743
 744static int ocelot_vlan_rx_add_vid(struct net_device *dev, __be16 proto,
 745                                  u16 vid)
 746{
 747        return ocelot_vlan_vid_add(dev, vid, false, false);
 748}
 749
 750static int ocelot_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
 751                                   u16 vid)
 752{
 753        return ocelot_vlan_vid_del(dev, vid);
 754}
 755
 756static void ocelot_vlan_mode(struct ocelot *ocelot, int port,
 757                             netdev_features_t features)
 758{
 759        u32 val;
 760
 761        /* Filtering */
 762        val = ocelot_read(ocelot, ANA_VLANMASK);
 763        if (features & NETIF_F_HW_VLAN_CTAG_FILTER)
 764                val |= BIT(port);
 765        else
 766                val &= ~BIT(port);
 767        ocelot_write(ocelot, val, ANA_VLANMASK);
 768}
 769
 770static int ocelot_set_features(struct net_device *dev,
 771                               netdev_features_t features)
 772{
 773        netdev_features_t changed = dev->features ^ features;
 774        struct ocelot_port_private *priv = netdev_priv(dev);
 775        struct ocelot *ocelot = priv->port.ocelot;
 776        int port = priv->chip_port;
 777
 778        if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC) &&
 779            priv->tc.offload_cnt) {
 780                netdev_err(dev,
 781                           "Cannot disable HW TC offload while offloads active\n");
 782                return -EBUSY;
 783        }
 784
 785        if (changed & NETIF_F_HW_VLAN_CTAG_FILTER)
 786                ocelot_vlan_mode(ocelot, port, features);
 787
 788        return 0;
 789}
 790
 791static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 792{
 793        struct ocelot_port_private *priv = netdev_priv(dev);
 794        struct ocelot *ocelot = priv->port.ocelot;
 795        int port = priv->chip_port;
 796
 797        /* If the attached PHY device isn't capable of timestamping operations,
 798         * use our own (when possible).
 799         */
 800        if (!phy_has_hwtstamp(dev->phydev) && ocelot->ptp) {
 801                switch (cmd) {
 802                case SIOCSHWTSTAMP:
 803                        return ocelot_hwstamp_set(ocelot, port, ifr);
 804                case SIOCGHWTSTAMP:
 805                        return ocelot_hwstamp_get(ocelot, port, ifr);
 806                }
 807        }
 808
 809        return phy_mii_ioctl(dev->phydev, ifr, cmd);
 810}
 811
 812static const struct net_device_ops ocelot_port_netdev_ops = {
 813        .ndo_open                       = ocelot_port_open,
 814        .ndo_stop                       = ocelot_port_stop,
 815        .ndo_start_xmit                 = ocelot_port_xmit,
 816        .ndo_set_rx_mode                = ocelot_set_rx_mode,
 817        .ndo_set_mac_address            = ocelot_port_set_mac_address,
 818        .ndo_get_stats64                = ocelot_get_stats64,
 819        .ndo_fdb_add                    = ocelot_port_fdb_add,
 820        .ndo_fdb_del                    = ocelot_port_fdb_del,
 821        .ndo_fdb_dump                   = ocelot_port_fdb_dump,
 822        .ndo_vlan_rx_add_vid            = ocelot_vlan_rx_add_vid,
 823        .ndo_vlan_rx_kill_vid           = ocelot_vlan_rx_kill_vid,
 824        .ndo_set_features               = ocelot_set_features,
 825        .ndo_setup_tc                   = ocelot_setup_tc,
 826        .ndo_do_ioctl                   = ocelot_ioctl,
 827        .ndo_get_devlink_port           = ocelot_get_devlink_port,
 828};
 829
 830struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port)
 831{
 832        struct ocelot_port *ocelot_port = ocelot->ports[port];
 833        struct ocelot_port_private *priv;
 834
 835        if (!ocelot_port)
 836                return NULL;
 837
 838        priv = container_of(ocelot_port, struct ocelot_port_private, port);
 839
 840        return priv->dev;
 841}
 842
 843/* Checks if the net_device instance given to us originates from our driver */
 844static bool ocelot_netdevice_dev_check(const struct net_device *dev)
 845{
 846        return dev->netdev_ops == &ocelot_port_netdev_ops;
 847}
 848
 849int ocelot_netdev_to_port(struct net_device *dev)
 850{
 851        struct ocelot_port_private *priv;
 852
 853        if (!dev || !ocelot_netdevice_dev_check(dev))
 854                return -EINVAL;
 855
 856        priv = netdev_priv(dev);
 857
 858        return priv->chip_port;
 859}
 860
 861static void ocelot_port_get_strings(struct net_device *netdev, u32 sset,
 862                                    u8 *data)
 863{
 864        struct ocelot_port_private *priv = netdev_priv(netdev);
 865        struct ocelot *ocelot = priv->port.ocelot;
 866        int port = priv->chip_port;
 867
 868        ocelot_get_strings(ocelot, port, sset, data);
 869}
 870
 871static void ocelot_port_get_ethtool_stats(struct net_device *dev,
 872                                          struct ethtool_stats *stats,
 873                                          u64 *data)
 874{
 875        struct ocelot_port_private *priv = netdev_priv(dev);
 876        struct ocelot *ocelot = priv->port.ocelot;
 877        int port = priv->chip_port;
 878
 879        ocelot_get_ethtool_stats(ocelot, port, data);
 880}
 881
 882static int ocelot_port_get_sset_count(struct net_device *dev, int sset)
 883{
 884        struct ocelot_port_private *priv = netdev_priv(dev);
 885        struct ocelot *ocelot = priv->port.ocelot;
 886        int port = priv->chip_port;
 887
 888        return ocelot_get_sset_count(ocelot, port, sset);
 889}
 890
 891static int ocelot_port_get_ts_info(struct net_device *dev,
 892                                   struct ethtool_ts_info *info)
 893{
 894        struct ocelot_port_private *priv = netdev_priv(dev);
 895        struct ocelot *ocelot = priv->port.ocelot;
 896        int port = priv->chip_port;
 897
 898        if (!ocelot->ptp)
 899                return ethtool_op_get_ts_info(dev, info);
 900
 901        return ocelot_get_ts_info(ocelot, port, info);
 902}
 903
 904static const struct ethtool_ops ocelot_ethtool_ops = {
 905        .get_strings            = ocelot_port_get_strings,
 906        .get_ethtool_stats      = ocelot_port_get_ethtool_stats,
 907        .get_sset_count         = ocelot_port_get_sset_count,
 908        .get_link_ksettings     = phy_ethtool_get_link_ksettings,
 909        .set_link_ksettings     = phy_ethtool_set_link_ksettings,
 910        .get_ts_info            = ocelot_port_get_ts_info,
 911};
 912
 913static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port,
 914                                           u8 state)
 915{
 916        ocelot_bridge_stp_state_set(ocelot, port, state);
 917}
 918
 919static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port,
 920                                        unsigned long ageing_clock_t)
 921{
 922        unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
 923        u32 ageing_time = jiffies_to_msecs(ageing_jiffies);
 924
 925        ocelot_set_ageing_time(ocelot, ageing_time);
 926}
 927
 928static void ocelot_port_attr_mc_set(struct ocelot *ocelot, int port, bool mc)
 929{
 930        u32 cpu_fwd_mcast = ANA_PORT_CPU_FWD_CFG_CPU_IGMP_REDIR_ENA |
 931                            ANA_PORT_CPU_FWD_CFG_CPU_MLD_REDIR_ENA |
 932                            ANA_PORT_CPU_FWD_CFG_CPU_IPMC_CTRL_COPY_ENA;
 933        u32 val = 0;
 934
 935        if (mc)
 936                val = cpu_fwd_mcast;
 937
 938        ocelot_rmw_gix(ocelot, val, cpu_fwd_mcast,
 939                       ANA_PORT_CPU_FWD_CFG, port);
 940}
 941
 942static int ocelot_port_attr_set(struct net_device *dev, const void *ctx,
 943                                const struct switchdev_attr *attr,
 944                                struct netlink_ext_ack *extack)
 945{
 946        struct ocelot_port_private *priv = netdev_priv(dev);
 947        struct ocelot *ocelot = priv->port.ocelot;
 948        int port = priv->chip_port;
 949        int err = 0;
 950
 951        if (ctx && ctx != priv)
 952                return 0;
 953
 954        switch (attr->id) {
 955        case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
 956                ocelot_port_attr_stp_state_set(ocelot, port, attr->u.stp_state);
 957                break;
 958        case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
 959                ocelot_port_attr_ageing_set(ocelot, port, attr->u.ageing_time);
 960                break;
 961        case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
 962                ocelot_port_vlan_filtering(ocelot, port, attr->u.vlan_filtering);
 963                break;
 964        case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
 965                ocelot_port_attr_mc_set(ocelot, port, !attr->u.mc_disabled);
 966                break;
 967        case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
 968                err = ocelot_port_pre_bridge_flags(ocelot, port,
 969                                                   attr->u.brport_flags);
 970                break;
 971        case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
 972                ocelot_port_bridge_flags(ocelot, port, attr->u.brport_flags);
 973                break;
 974        default:
 975                err = -EOPNOTSUPP;
 976                break;
 977        }
 978
 979        return err;
 980}
 981
 982static int ocelot_port_obj_add_vlan(struct net_device *dev,
 983                                    const struct switchdev_obj_port_vlan *vlan)
 984{
 985        bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
 986        bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
 987        int ret;
 988
 989        ret = ocelot_vlan_vid_prepare(dev, vlan->vid, pvid, untagged);
 990        if (ret)
 991                return ret;
 992
 993        return ocelot_vlan_vid_add(dev, vlan->vid, pvid, untagged);
 994}
 995
 996static int ocelot_port_obj_add_mdb(struct net_device *dev,
 997                                   const struct switchdev_obj_port_mdb *mdb)
 998{
 999        struct ocelot_port_private *priv = netdev_priv(dev);
1000        struct ocelot_port *ocelot_port = &priv->port;
1001        struct ocelot *ocelot = ocelot_port->ocelot;
1002        int port = priv->chip_port;
1003
1004        return ocelot_port_mdb_add(ocelot, port, mdb);
1005}
1006
1007static int ocelot_port_obj_del_mdb(struct net_device *dev,
1008                                   const struct switchdev_obj_port_mdb *mdb)
1009{
1010        struct ocelot_port_private *priv = netdev_priv(dev);
1011        struct ocelot_port *ocelot_port = &priv->port;
1012        struct ocelot *ocelot = ocelot_port->ocelot;
1013        int port = priv->chip_port;
1014
1015        return ocelot_port_mdb_del(ocelot, port, mdb);
1016}
1017
1018static int ocelot_port_obj_mrp_add(struct net_device *dev,
1019                                   const struct switchdev_obj_mrp *mrp)
1020{
1021        struct ocelot_port_private *priv = netdev_priv(dev);
1022        struct ocelot_port *ocelot_port = &priv->port;
1023        struct ocelot *ocelot = ocelot_port->ocelot;
1024        int port = priv->chip_port;
1025
1026        return ocelot_mrp_add(ocelot, port, mrp);
1027}
1028
1029static int ocelot_port_obj_mrp_del(struct net_device *dev,
1030                                   const struct switchdev_obj_mrp *mrp)
1031{
1032        struct ocelot_port_private *priv = netdev_priv(dev);
1033        struct ocelot_port *ocelot_port = &priv->port;
1034        struct ocelot *ocelot = ocelot_port->ocelot;
1035        int port = priv->chip_port;
1036
1037        return ocelot_mrp_del(ocelot, port, mrp);
1038}
1039
1040static int
1041ocelot_port_obj_mrp_add_ring_role(struct net_device *dev,
1042                                  const struct switchdev_obj_ring_role_mrp *mrp)
1043{
1044        struct ocelot_port_private *priv = netdev_priv(dev);
1045        struct ocelot_port *ocelot_port = &priv->port;
1046        struct ocelot *ocelot = ocelot_port->ocelot;
1047        int port = priv->chip_port;
1048
1049        return ocelot_mrp_add_ring_role(ocelot, port, mrp);
1050}
1051
1052static int
1053ocelot_port_obj_mrp_del_ring_role(struct net_device *dev,
1054                                  const struct switchdev_obj_ring_role_mrp *mrp)
1055{
1056        struct ocelot_port_private *priv = netdev_priv(dev);
1057        struct ocelot_port *ocelot_port = &priv->port;
1058        struct ocelot *ocelot = ocelot_port->ocelot;
1059        int port = priv->chip_port;
1060
1061        return ocelot_mrp_del_ring_role(ocelot, port, mrp);
1062}
1063
1064static int ocelot_port_obj_add(struct net_device *dev, const void *ctx,
1065                               const struct switchdev_obj *obj,
1066                               struct netlink_ext_ack *extack)
1067{
1068        struct ocelot_port_private *priv = netdev_priv(dev);
1069        int ret = 0;
1070
1071        if (ctx && ctx != priv)
1072                return 0;
1073
1074        switch (obj->id) {
1075        case SWITCHDEV_OBJ_ID_PORT_VLAN:
1076                ret = ocelot_port_obj_add_vlan(dev,
1077                                               SWITCHDEV_OBJ_PORT_VLAN(obj));
1078                break;
1079        case SWITCHDEV_OBJ_ID_PORT_MDB:
1080                ret = ocelot_port_obj_add_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1081                break;
1082        case SWITCHDEV_OBJ_ID_MRP:
1083                ret = ocelot_port_obj_mrp_add(dev, SWITCHDEV_OBJ_MRP(obj));
1084                break;
1085        case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1086                ret = ocelot_port_obj_mrp_add_ring_role(dev,
1087                                                        SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1088                break;
1089        default:
1090                return -EOPNOTSUPP;
1091        }
1092
1093        return ret;
1094}
1095
1096static int ocelot_port_obj_del(struct net_device *dev, const void *ctx,
1097                               const struct switchdev_obj *obj)
1098{
1099        struct ocelot_port_private *priv = netdev_priv(dev);
1100        int ret = 0;
1101
1102        if (ctx && ctx != priv)
1103                return 0;
1104
1105        switch (obj->id) {
1106        case SWITCHDEV_OBJ_ID_PORT_VLAN:
1107                ret = ocelot_vlan_vid_del(dev,
1108                                          SWITCHDEV_OBJ_PORT_VLAN(obj)->vid);
1109                break;
1110        case SWITCHDEV_OBJ_ID_PORT_MDB:
1111                ret = ocelot_port_obj_del_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1112                break;
1113        case SWITCHDEV_OBJ_ID_MRP:
1114                ret = ocelot_port_obj_mrp_del(dev, SWITCHDEV_OBJ_MRP(obj));
1115                break;
1116        case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1117                ret = ocelot_port_obj_mrp_del_ring_role(dev,
1118                                                        SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1119                break;
1120        default:
1121                return -EOPNOTSUPP;
1122        }
1123
1124        return ret;
1125}
1126
1127static void ocelot_inherit_brport_flags(struct ocelot *ocelot, int port,
1128                                        struct net_device *brport_dev)
1129{
1130        struct switchdev_brport_flags flags = {0};
1131        int flag;
1132
1133        flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1134
1135        for_each_set_bit(flag, &flags.mask, 32)
1136                if (br_port_flag_is_set(brport_dev, BIT(flag)))
1137                        flags.val |= BIT(flag);
1138
1139        ocelot_port_bridge_flags(ocelot, port, flags);
1140}
1141
1142static void ocelot_clear_brport_flags(struct ocelot *ocelot, int port)
1143{
1144        struct switchdev_brport_flags flags;
1145
1146        flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1147        flags.val = flags.mask & ~BR_LEARNING;
1148
1149        ocelot_port_bridge_flags(ocelot, port, flags);
1150}
1151
1152static int ocelot_switchdev_sync(struct ocelot *ocelot, int port,
1153                                 struct net_device *brport_dev,
1154                                 struct net_device *bridge_dev,
1155                                 struct netlink_ext_ack *extack)
1156{
1157        struct ocelot_port *ocelot_port = ocelot->ports[port];
1158        struct ocelot_port_private *priv;
1159        clock_t ageing_time;
1160        u8 stp_state;
1161        int err;
1162
1163        priv = container_of(ocelot_port, struct ocelot_port_private, port);
1164
1165        ocelot_inherit_brport_flags(ocelot, port, brport_dev);
1166
1167        stp_state = br_port_get_stp_state(brport_dev);
1168        ocelot_bridge_stp_state_set(ocelot, port, stp_state);
1169
1170        err = ocelot_port_vlan_filtering(ocelot, port,
1171                                         br_vlan_enabled(bridge_dev));
1172        if (err)
1173                return err;
1174
1175        ageing_time = br_get_ageing_time(bridge_dev);
1176        ocelot_port_attr_ageing_set(ocelot, port, ageing_time);
1177
1178        err = br_mdb_replay(bridge_dev, brport_dev, priv, true,
1179                            &ocelot_switchdev_blocking_nb, extack);
1180        if (err && err != -EOPNOTSUPP)
1181                return err;
1182
1183        err = br_vlan_replay(bridge_dev, brport_dev, priv, true,
1184                             &ocelot_switchdev_blocking_nb, extack);
1185        if (err && err != -EOPNOTSUPP)
1186                return err;
1187
1188        return 0;
1189}
1190
1191static int ocelot_switchdev_unsync(struct ocelot *ocelot, int port)
1192{
1193        int err;
1194
1195        err = ocelot_port_vlan_filtering(ocelot, port, false);
1196        if (err)
1197                return err;
1198
1199        ocelot_clear_brport_flags(ocelot, port);
1200
1201        ocelot_bridge_stp_state_set(ocelot, port, BR_STATE_FORWARDING);
1202
1203        return 0;
1204}
1205
1206static int ocelot_netdevice_bridge_join(struct net_device *dev,
1207                                        struct net_device *brport_dev,
1208                                        struct net_device *bridge,
1209                                        struct netlink_ext_ack *extack)
1210{
1211        struct ocelot_port_private *priv = netdev_priv(dev);
1212        struct ocelot_port *ocelot_port = &priv->port;
1213        struct ocelot *ocelot = ocelot_port->ocelot;
1214        int port = priv->chip_port;
1215        int err;
1216
1217        ocelot_port_bridge_join(ocelot, port, bridge);
1218
1219        err = ocelot_switchdev_sync(ocelot, port, brport_dev, bridge, extack);
1220        if (err)
1221                goto err_switchdev_sync;
1222
1223        return 0;
1224
1225err_switchdev_sync:
1226        ocelot_port_bridge_leave(ocelot, port, bridge);
1227        return err;
1228}
1229
1230static int ocelot_netdevice_bridge_leave(struct net_device *dev,
1231                                         struct net_device *brport_dev,
1232                                         struct net_device *bridge)
1233{
1234        struct ocelot_port_private *priv = netdev_priv(dev);
1235        struct ocelot_port *ocelot_port = &priv->port;
1236        struct ocelot *ocelot = ocelot_port->ocelot;
1237        int port = priv->chip_port;
1238        int err;
1239
1240        err = ocelot_switchdev_unsync(ocelot, port);
1241        if (err)
1242                return err;
1243
1244        ocelot_port_bridge_leave(ocelot, port, bridge);
1245
1246        return 0;
1247}
1248
1249static int ocelot_netdevice_lag_join(struct net_device *dev,
1250                                     struct net_device *bond,
1251                                     struct netdev_lag_upper_info *info,
1252                                     struct netlink_ext_ack *extack)
1253{
1254        struct ocelot_port_private *priv = netdev_priv(dev);
1255        struct ocelot_port *ocelot_port = &priv->port;
1256        struct ocelot *ocelot = ocelot_port->ocelot;
1257        struct net_device *bridge_dev;
1258        int port = priv->chip_port;
1259        int err;
1260
1261        err = ocelot_port_lag_join(ocelot, port, bond, info);
1262        if (err == -EOPNOTSUPP) {
1263                NL_SET_ERR_MSG_MOD(extack, "Offloading not supported");
1264                return 0;
1265        }
1266
1267        bridge_dev = netdev_master_upper_dev_get(bond);
1268        if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1269                return 0;
1270
1271        err = ocelot_netdevice_bridge_join(dev, bond, bridge_dev, extack);
1272        if (err)
1273                goto err_bridge_join;
1274
1275        return 0;
1276
1277err_bridge_join:
1278        ocelot_port_lag_leave(ocelot, port, bond);
1279        return err;
1280}
1281
1282static int ocelot_netdevice_lag_leave(struct net_device *dev,
1283                                      struct net_device *bond)
1284{
1285        struct ocelot_port_private *priv = netdev_priv(dev);
1286        struct ocelot_port *ocelot_port = &priv->port;
1287        struct ocelot *ocelot = ocelot_port->ocelot;
1288        struct net_device *bridge_dev;
1289        int port = priv->chip_port;
1290
1291        ocelot_port_lag_leave(ocelot, port, bond);
1292
1293        bridge_dev = netdev_master_upper_dev_get(bond);
1294        if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1295                return 0;
1296
1297        return ocelot_netdevice_bridge_leave(dev, bond, bridge_dev);
1298}
1299
1300static int ocelot_netdevice_changeupper(struct net_device *dev,
1301                                        struct net_device *brport_dev,
1302                                        struct netdev_notifier_changeupper_info *info)
1303{
1304        struct netlink_ext_ack *extack;
1305        int err = 0;
1306
1307        extack = netdev_notifier_info_to_extack(&info->info);
1308
1309        if (netif_is_bridge_master(info->upper_dev)) {
1310                if (info->linking)
1311                        err = ocelot_netdevice_bridge_join(dev, brport_dev,
1312                                                           info->upper_dev,
1313                                                           extack);
1314                else
1315                        err = ocelot_netdevice_bridge_leave(dev, brport_dev,
1316                                                            info->upper_dev);
1317        }
1318        if (netif_is_lag_master(info->upper_dev)) {
1319                if (info->linking)
1320                        err = ocelot_netdevice_lag_join(dev, info->upper_dev,
1321                                                        info->upper_info, extack);
1322                else
1323                        ocelot_netdevice_lag_leave(dev, info->upper_dev);
1324        }
1325
1326        return notifier_from_errno(err);
1327}
1328
1329/* Treat CHANGEUPPER events on an offloaded LAG as individual CHANGEUPPER
1330 * events for the lower physical ports of the LAG.
1331 * If the LAG upper isn't offloaded, ignore its CHANGEUPPER events.
1332 * In case the LAG joined a bridge, notify that we are offloading it and can do
1333 * forwarding in hardware towards it.
1334 */
1335static int
1336ocelot_netdevice_lag_changeupper(struct net_device *dev,
1337                                 struct netdev_notifier_changeupper_info *info)
1338{
1339        struct net_device *lower;
1340        struct list_head *iter;
1341        int err = NOTIFY_DONE;
1342
1343        netdev_for_each_lower_dev(dev, lower, iter) {
1344                struct ocelot_port_private *priv = netdev_priv(lower);
1345                struct ocelot_port *ocelot_port = &priv->port;
1346
1347                if (ocelot_port->bond != dev)
1348                        return NOTIFY_OK;
1349
1350                err = ocelot_netdevice_changeupper(lower, dev, info);
1351                if (err)
1352                        return notifier_from_errno(err);
1353        }
1354
1355        return NOTIFY_DONE;
1356}
1357
1358static int
1359ocelot_netdevice_changelowerstate(struct net_device *dev,
1360                                  struct netdev_lag_lower_state_info *info)
1361{
1362        struct ocelot_port_private *priv = netdev_priv(dev);
1363        bool is_active = info->link_up && info->tx_enabled;
1364        struct ocelot_port *ocelot_port = &priv->port;
1365        struct ocelot *ocelot = ocelot_port->ocelot;
1366        int port = priv->chip_port;
1367
1368        if (!ocelot_port->bond)
1369                return NOTIFY_DONE;
1370
1371        if (ocelot_port->lag_tx_active == is_active)
1372                return NOTIFY_DONE;
1373
1374        ocelot_port_lag_change(ocelot, port, is_active);
1375
1376        return NOTIFY_OK;
1377}
1378
1379static int ocelot_netdevice_event(struct notifier_block *unused,
1380                                  unsigned long event, void *ptr)
1381{
1382        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1383
1384        switch (event) {
1385        case NETDEV_CHANGEUPPER: {
1386                struct netdev_notifier_changeupper_info *info = ptr;
1387
1388                if (ocelot_netdevice_dev_check(dev))
1389                        return ocelot_netdevice_changeupper(dev, dev, info);
1390
1391                if (netif_is_lag_master(dev))
1392                        return ocelot_netdevice_lag_changeupper(dev, info);
1393
1394                break;
1395        }
1396        case NETDEV_CHANGELOWERSTATE: {
1397                struct netdev_notifier_changelowerstate_info *info = ptr;
1398
1399                if (!ocelot_netdevice_dev_check(dev))
1400                        break;
1401
1402                return ocelot_netdevice_changelowerstate(dev,
1403                                                         info->lower_state_info);
1404        }
1405        default:
1406                break;
1407        }
1408
1409        return NOTIFY_DONE;
1410}
1411
1412struct notifier_block ocelot_netdevice_nb __read_mostly = {
1413        .notifier_call = ocelot_netdevice_event,
1414};
1415
1416static int ocelot_switchdev_event(struct notifier_block *unused,
1417                                  unsigned long event, void *ptr)
1418{
1419        struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1420        int err;
1421
1422        switch (event) {
1423        case SWITCHDEV_PORT_ATTR_SET:
1424                err = switchdev_handle_port_attr_set(dev, ptr,
1425                                                     ocelot_netdevice_dev_check,
1426                                                     ocelot_port_attr_set);
1427                return notifier_from_errno(err);
1428        }
1429
1430        return NOTIFY_DONE;
1431}
1432
1433struct notifier_block ocelot_switchdev_nb __read_mostly = {
1434        .notifier_call = ocelot_switchdev_event,
1435};
1436
1437static int ocelot_switchdev_blocking_event(struct notifier_block *unused,
1438                                           unsigned long event, void *ptr)
1439{
1440        struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1441        int err;
1442
1443        switch (event) {
1444                /* Blocking events. */
1445        case SWITCHDEV_PORT_OBJ_ADD:
1446                err = switchdev_handle_port_obj_add(dev, ptr,
1447                                                    ocelot_netdevice_dev_check,
1448                                                    ocelot_port_obj_add);
1449                return notifier_from_errno(err);
1450        case SWITCHDEV_PORT_OBJ_DEL:
1451                err = switchdev_handle_port_obj_del(dev, ptr,
1452                                                    ocelot_netdevice_dev_check,
1453                                                    ocelot_port_obj_del);
1454                return notifier_from_errno(err);
1455        case SWITCHDEV_PORT_ATTR_SET:
1456                err = switchdev_handle_port_attr_set(dev, ptr,
1457                                                     ocelot_netdevice_dev_check,
1458                                                     ocelot_port_attr_set);
1459                return notifier_from_errno(err);
1460        }
1461
1462        return NOTIFY_DONE;
1463}
1464
1465struct notifier_block ocelot_switchdev_blocking_nb __read_mostly = {
1466        .notifier_call = ocelot_switchdev_blocking_event,
1467};
1468
1469int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
1470                      struct phy_device *phy)
1471{
1472        struct ocelot_port_private *priv;
1473        struct ocelot_port *ocelot_port;
1474        struct net_device *dev;
1475        int err;
1476
1477        dev = alloc_etherdev(sizeof(struct ocelot_port_private));
1478        if (!dev)
1479                return -ENOMEM;
1480        SET_NETDEV_DEV(dev, ocelot->dev);
1481        priv = netdev_priv(dev);
1482        priv->dev = dev;
1483        priv->phy = phy;
1484        priv->chip_port = port;
1485        ocelot_port = &priv->port;
1486        ocelot_port->ocelot = ocelot;
1487        ocelot_port->target = target;
1488        ocelot->ports[port] = ocelot_port;
1489
1490        dev->netdev_ops = &ocelot_port_netdev_ops;
1491        dev->ethtool_ops = &ocelot_ethtool_ops;
1492
1493        dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXFCS |
1494                NETIF_F_HW_TC;
1495        dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
1496
1497        memcpy(dev->dev_addr, ocelot->base_mac, ETH_ALEN);
1498        dev->dev_addr[ETH_ALEN - 1] += port;
1499        ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr,
1500                          ocelot_port->pvid_vlan.vid, ENTRYTYPE_LOCKED);
1501
1502        ocelot_init_port(ocelot, port);
1503
1504        err = register_netdev(dev);
1505        if (err) {
1506                dev_err(ocelot->dev, "register_netdev failed\n");
1507                free_netdev(dev);
1508                ocelot->ports[port] = NULL;
1509                return err;
1510        }
1511
1512        return 0;
1513}
1514
1515void ocelot_release_port(struct ocelot_port *ocelot_port)
1516{
1517        struct ocelot_port_private *priv = container_of(ocelot_port,
1518                                                struct ocelot_port_private,
1519                                                port);
1520
1521        unregister_netdev(priv->dev);
1522        free_netdev(priv->dev);
1523}
1524